📄 app.c
字号:
/******************************************************************
* SEAL 2.0 *
* Copyright (c) 1999-2002 SEAL Developers. All Rights Reserved. *
* *
* Web site: http://sealsystem.sourceforge.net/ *
* E-mail (current maintainer): orudge@users.sourceforge.net *
******************************************************************/
/*
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include <seal.h>
#include <app.h>
#include <dialogs.h>
#include <skin.h>
#include <screen.h>
#define image_close IMG_WCLOSE
#define image_min IMG_WMIN
#define image_max IMG_WMAX
#define image_dclose IMG_DWCLOSE
#define image_dmin IMG_DWMIN
#define image_dmax IMG_DWMAX
#define image_abt IMG_ABOUT
#define image_dabt IMG_DABOUT
#define image_sysmenu IMG_APP16
#define image_sysmenu32 IMG_APP32
#define msg_icons(x) GETBMPID(4+x)
#define Pikachu 100000
// BITMAP *title_active_bgnd; /* active title background */
// BITMAP *title_pasive_bgnd; /* pasive title background */
t_appinfo appinfo; /* for transfers */
p_skin apppastitle = NULL;
p_skin appacttitle = NULL;
p_skin appbody = NULL;
p_appwin (*appwin_init) ( p_appwin o, t_rect r, l_text caption, l_int flags, hdlx_t id,
void (*trans_ev)( p_object o, t_event *e )) = &_appwin_init;
p_appwin (*window_init) ( p_appwin o, t_rect r, l_text caption, l_int flags );
p_appwin (*message_init_ex) ( p_object owner, p_appwin o, t_rect r, l_text caption, l_int flags,
l_char iflags,
l_dword bflags, void (*trans_ev)( p_object o, t_event *e ),
l_text in_text, va_list argp ) = &_message_init_ex;
p_window (*frame_init) ( p_window o, t_rect r ) = &_frame_init;
/* appwin functions */
p_menuitem standard_system_menu_items(p_appwin o, p_menuitem next)
{
p_menuitem r;
if ((WINDOW(o)->flags & WF_MAXIMIZE) || (WINDOW(o)->flags & WF_MINIMIZE)) {
l_bool min = (WINDOW(o)->flags & WF_MINIMIZE);
l_bool max = (WINDOW(o)->flags & WF_MAXIMIZE);
r = new_menu_item_ex(TXT_MINIMIZE, 0, 0, MSG_MINIMIZE, min, "Minimize window", 0, 0, ( get_depth(screen) < 16 ) ? NULL : IMG_WMIN, 0, 0,
new_menu_item_ex(TXT_MAXIMIZE, 0, 0, MSG_MAXIMIZE, max, "Maximize window", 0, 0, ( get_depth(screen) < 16 ) ? NULL : IMG_WMAX, 0, 0,
new_menu_item_ex(TXT_CLOSE, "Alt+F4", 0, MSG_CLOSE, TRUE, "Close window", 0, 0, ( get_depth(screen) < 16 ) ? NULL : IMG_WCLOSE, 0, 0,
next)));
} else r = new_menu_item_ex(TXT_CLOSE, "Alt+F4", 0, MSG_CLOSE, TRUE, "Close window", 0, 0, ( get_depth(screen) < 16 ) ? NULL : IMG_WCLOSE, 0, 0, next);
return r;
};
void appwin_setup ( p_object o )
{
p_icobutton b;
t_rect r;
t_rect s;
l_int cx = (APPWIN(o)->pastitle?APPWIN(o)->pastitle->d.a.x+8:10);
view_setup(o);
r = VIEW(o)->get_local_extent(VIEW(o));
s = VIEW(o)->size_limits(VIEW(o));
if ( get_depth(screen) < 16 ) {
p_button b;
r = rect_assign(r.b.x-19, r.a.y+cx-8, r.b.x-3, r.a.y+cx+8);
b = button_init(_malloc(sizeof(t_button)), r, "5", MSG_CLOSE, BF_PUSH+BF_NORMAL);
if ( b ) { /* make close button */
/* ignore size limits of window */
OBJECT(b)->set_options(OBJECT(b), VW_OF_IGNORELIM, true);
/* can't be selected */
OBJECT(b)->set_options(OBJECT(b), OB_OF_SELECTABLE, false);
/* fot is symbol TTF font in size 10,10 */
VIEW(b)->font = get_font_in_size("Symbols", 10, 10);
/* move button, when window is growing, but still fixed size */
VIEW(b)->align |= TX_ALIGN_RIGHT+TX_ALIGN_FIXEDX;
};
/* insert close button to window */
o->insert(o, OBJECT(b));
if ( WINDOW(o)->flags & WF_MAXIMIZE ) {
/* maximize button */
r = rect_move(r, -18, 0);
b = button_init(_malloc(sizeof(t_button)), r, "0", MSG_MAXIMIZE, BF_PUSH+BF_NORMAL);
if ( b ) {
/* ignore size limits of window */
OBJECT(b)->set_options(OBJECT(b), VW_OF_IGNORELIM, true);
/* can't be selected */
OBJECT(b)->set_options(OBJECT(b), OB_OF_SELECTABLE, false);
/* fot is symbol TTF font in size 10,10 */
VIEW(b)->font = get_font_in_size("Symbols", 10, 10);
/* move button, when window is growing, but still fixed size */
VIEW(b)->align |= TX_ALIGN_RIGHT+TX_ALIGN_FIXEDX;
};
/* insert maximize button to window */
o->insert(o, OBJECT(b));
};
if ( WINDOW(o)->flags & WF_MINIMIZE ) {
/* minimize button */
r = rect_move(r, -18, 0);
b = button_init(_malloc(sizeof(t_button)), r, "1", MSG_MINIMIZE, BF_PUSH+BF_NORMAL);
if ( b ) {
/* ignore size limits of window */
OBJECT(b)->set_options(OBJECT(b), VW_OF_IGNORELIM, true);
/* can't be selected */
OBJECT(b)->set_options(OBJECT(b), OB_OF_SELECTABLE, false);
/* fot is symbol TTF font in size 10,10 */
VIEW(b)->font = get_font_in_size("Symbols", 10, 10);
/* move button, when window is growing, but still fixed size */
VIEW(b)->align |= TX_ALIGN_RIGHT+TX_ALIGN_FIXEDX;
};
/* insert minimize button to window */
o->insert(o, OBJECT(b));
};
} else {
r = rect_assign(r.b.x-19, r.a.y+cx-8, r.b.x-3, r.a.y+cx+8);
b = icobutton_init(sf_malloc(sizeof(t_icobutton)), r, image_close, TXT_CLOSE, MSG_CLOSE, ((!image_dclose)?BF_UNDERSEL:BF_NOSEL)+BF_PUSH+BF_NORMAL);
if ( b ) { /* make close button */
/* ignore size limits of window */
OBJECT(b)->set_options(OBJECT(b), VW_OF_IGNORELIM, true);
/* can't be selected */
OBJECT(b)->set_options(OBJECT(b), OB_OF_SELECTABLE, false);
/* fot is symbol TTF font in size 10,10 */
//VIEW(b)->font = get_font_in_size("Symbols", 10, 10);
/* move button, when window is growing, but still fixed size */
VIEW(b)->align |= TX_ALIGN_RIGHT+TX_ALIGN_FIXEDX;
VIEW(b)->transparent = true;
b->dwnicon = image_dclose;
};
/* insert close button to window */
o->insert(o, OBJECT(b));
if ( WINDOW(o)->flags & WF_MAXIMIZE ) {
/* maximize button */
r = rect_move(r, -18, 0);
b = icobutton_init(sf_malloc(sizeof(t_icobutton)), r, image_max, TXT_MAXIMIZE, MSG_MAXIMIZE, ((!image_dmax)?BF_UNDERSEL:BF_NOSEL)+BF_PUSH+BF_NORMAL);
if ( b ) {
/* ignore size limits of window */
OBJECT(b)->set_options(OBJECT(b), VW_OF_IGNORELIM, true);
/* can't be selected */
OBJECT(b)->set_options(OBJECT(b), OB_OF_SELECTABLE, false);
/* fot is symbol TTF font in size 10,10 */
//VIEW(b)->font = get_font_in_size("Symbols", 10, 10);
/* move button, when window is growing, but still fixed size */
VIEW(b)->align |= TX_ALIGN_RIGHT+TX_ALIGN_FIXEDX;
VIEW(b)->transparent = true;
b->dwnicon = image_dmax;
};
/* insert maximize button to window */
o->insert(o, OBJECT(b));
};
if ( WINDOW(o)->flags & WF_MINIMIZE ) {
/* minimize button */
r = rect_move(r, -18, 0);
b = icobutton_init(sf_malloc(sizeof(t_icobutton)), r, image_min, TXT_MINIMIZE, MSG_MINIMIZE, ((!image_dmin)?BF_UNDERSEL:BF_NOSEL)+BF_PUSH+BF_NORMAL);
if ( b ) {
/* ignore size limits of window */
OBJECT(b)->set_options(OBJECT(b), VW_OF_IGNORELIM, true);
/* can't be selected */
OBJECT(b)->set_options(OBJECT(b), OB_OF_SELECTABLE, false);
/* fot is symbol TTF font in size 10,10 */
//VIEW(b)->font = get_font_in_size("Symbols", 10, 10);
/* move button, when window is growing, but still fixed size */
VIEW(b)->align |= TX_ALIGN_RIGHT+TX_ALIGN_FIXEDX;
VIEW(b)->transparent = true;
b->dwnicon = image_dmin;
};
/* insert minimize button to window */
o->insert(o, OBJECT(b));
};
if ( WINDOW(o)->flags & WF_ABOUT ) {
/* maximize button */
r = rect_move(r, -18, 0);
b = icobutton_init(sf_malloc(sizeof(t_icobutton)), r, image_abt, TXT_ABOUT, MSG_ABOUT, ((!image_dabt)?BF_UNDERSEL:BF_NOSEL)+BF_PUSH+BF_NORMAL);
if ( b ) {
/* ignore size limits of window */
OBJECT(b)->set_options(OBJECT(b), VW_OF_IGNORELIM, true);
/* can't be selected */
OBJECT(b)->set_options(OBJECT(b), OB_OF_SELECTABLE, false);
/* fot is symbol TTF font in size 10,10 */
//VIEW(b)->font = get_font_in_size("Symbols", 10, 10);
/* move button, when window is growing, but still fixed size */
VIEW(b)->align |= TX_ALIGN_RIGHT+TX_ALIGN_FIXEDX;
VIEW(b)->transparent = true;
b->dwnicon = image_dabt;
};
/* insert maximize button to window */
o->insert(o, OBJECT(b));
};
}; // >= 16 graphics end
if ( WINDOW(o)->flags & WF_SYSMENU ) {
/* system menu button */
r = VIEW(o)->get_local_extent(VIEW(o));
r = rect_assign(r.a.x+3, r.a.y+cx-8, r.a.x+21, r.a.y+cx+8);
b = icobutton_init(sf_malloc(sizeof(t_icobutton)), r, APPWIN(o)->icon16, "System menu", MSG_SYSMENU, BF_PUSH+BF_NORMAL);
if ( b ) {
/* ignore size limits of window */
OBJECT(b)->set_options(OBJECT(b), VW_OF_IGNORELIM, true);
/* can't be selected */
OBJECT(b)->set_options(OBJECT(b), OB_OF_SELECTABLE, false);
/* fot is symbol TTF font in size 10,10 */
//VIEW(b)->font = get_font_in_size("Symbols", 10, 10);
/* move button, when window is growing, but still fixed size */
// VIEW(b)->align |= TX_ALIGN_RIGHT+TX_ALIGN_FIXEDX;
VIEW(b)->transparent = true;
};
/* insert system menu button to window */
o->insert(o, OBJECT(b));
};
};
t_rect appwin_size_limits ( p_view o ) {
t_rect r = o->get_local_extent(o);
r.a.x += 2;
r.a.y += APPWIN(o)->pastitle ? get_skin_height(APPWIN(o)->pastitle,16)+1 : 19;
r.b.x -= 2;
r.b.y -= 2;
return r;
};
void appwin_set_state ( p_object o, l_dword st, l_bool set ) {
if ( APPWIN(o)->pastitle ) {
view_set_state(o, st, set);
if ( st & OB_SF_SELECTED ) {
TEST_SUB_VIEWS(o, WINDOW(o)->draw_title(WINDOW(o)));
view_draw_on_rect(VIEW(o),rect_assign(0, 0, rect_sizex(VIEW(o)->bounds),get_skin_height(APPWIN(o)->pastitle,16)+1));
};
} else
win_set_state(o,st,set);
};
void appwin_draw ( p_view o ) {
if ( APPWIN(o)->body ) {
t_rect r = o->get_local_extent(o);
t_point p;
BITMAP *out;
r.a.y += get_skin_height(APPWIN(o)->pastitle,16);
out = o->begin_paint(o, &p, r);
if ( out )
draw_skin(out,APPWIN(o)->body,rect_move(r,p.x,p.y),NULL);
o->end_of_paint(o, r);
WINDOW(o)->draw_title(WINDOW(o));
} else win_draw(o);
};
void appwin_draw_title ( p_window o ) {
t_rect r = APPWIN(o)->pastitle?rect_assign(0,0,rect_sizex(VIEW(o)->bounds),get_skin_height(APPWIN(o)->pastitle,16)):rect_assign ( 2, 2, rect_sizex(VIEW(o)->bounds)-3, 18 );
t_rect safe = r;
t_rect t;
t_point p;
BITMAP *out = VIEW(o)->begin_paint(VIEW(o), &p, safe);
if ( out ) {
if ( APPWIN(o)->pastitle && APPWIN(o)->acttitle ) {
p_skin skin = ( OBJECT(o)->state & OB_SF_SELECTED ) ? APPWIN(o)->acttitle : APPWIN(o)->pastitle;
r = rect_move(r,p.x,p.y);
draw_skin(out,skin,r,&r);
textout_draw_rect(out, VIEW(o)->font, o->caption, -1, r.a.x+((o->flags & WF_SYSMENU)?25:4), r.a.y,
r.b.x, r.b.y, TX_ALIGN_CENTERY, get_skin_fcolor(skin), TX_NOCOLOR, 0);
} else {
l_color fcolor = color_window_pass_title_text;
l_color bcolor1 = color_window_pass_title_face;
l_color bcolor2 = color_window_pass_title_face_gardient;
if ( OBJECT(o)->state & OB_SF_SELECTED ) {
fcolor = color_window_act_title_text;
bcolor1 = color_window_act_title_face;
bcolor2 = color_window_act_title_face_gardient;
};
fade_rect(out, r.a.x+p.x, r.a.y+p.y, r.b.x+p.x, r.b.y+p.y, bcolor1, bcolor2, FR_HOR);
textout_draw_rect(out, VIEW(o)->font, o->caption, -1, r.a.x+p.x+((o->flags & WF_SYSMENU)?25:4), r.a.y+p.y,
r.b.x+p.x, r.b.y+p.y, TX_ALIGN_CENTERY, fcolor, TX_NOCOLOR, 0);
};
};
VIEW(o)->end_of_paint(VIEW(o), safe);
};
void appwin_translate_event ( p_object o, t_event *event )
{
RETVIEW(o, event);
if ( APPWIN(o)->app_trans_ev ) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -