From 1ce88e9584abe2b0233777364e14892ae9b5054c Mon Sep 17 00:00:00 2001 From: Juergen Schmied <juergen.schmied@debitel.net> Date: Sun, 7 Nov 1999 21:08:57 +0000 Subject: [PATCH] - Bugfix: Styles were evaluated as expressions. The NOT in combination with style flags was not overwriting the default styles like WS_VISIBLE. Solved by introducing own rules for parsing styles. --- tools/wrc/CHANGES | 8 ++ tools/wrc/dumpres.c | 38 +++++-- tools/wrc/genres.c | 20 ++-- tools/wrc/newstruc.c | 10 +- tools/wrc/newstruc.h | 3 +- tools/wrc/parser.y | 234 ++++++++++++++++++++++++++++--------------- tools/wrc/wrc.h | 4 +- tools/wrc/wrctypes.h | 22 ++-- 8 files changed, 231 insertions(+), 108 deletions(-) diff --git a/tools/wrc/CHANGES b/tools/wrc/CHANGES index 8ec4804f534..846f06a716c 100644 --- a/tools/wrc/CHANGES +++ b/tools/wrc/CHANGES @@ -1,3 +1,11 @@ +--------------------------------------------------------------------------- +Version 1.0.16 (6-Nov-1999) + +Juergen.Schmied@debitel.net +- Bugfix: Styles were evaluated as expressions. The NOT in combination + with style flags was not overwriting the default styles like WS_VISIBLE. + Solved by introducing own rules for parsing styles. + --------------------------------------------------------------------------- Version 1.0.15 (13-Aug-1999) diff --git a/tools/wrc/dumpres.c b/tools/wrc/dumpres.c index 83075295132..70b7a3773e2 100644 --- a/tools/wrc/dumpres.c +++ b/tools/wrc/dumpres.c @@ -7,6 +7,7 @@ #include "config.h" +#include <assert.h> #include <stdio.h> #include <ctype.h> @@ -497,9 +498,17 @@ void dump_control(control_t *ctrl) printf("\tId: %d\n", ctrl->id); printf("\tx, y, w, h: %d, %d, %d, %d\n", ctrl->x, ctrl->y, ctrl->width, ctrl->height); if(ctrl->gotstyle) - printf("\tStyle: %08lx\n", ctrl->style); + { + assert(ctrl->style != NULL); + assert(ctrl->style->and_mask == 0); + printf("\tStyle: %08lx\n", ctrl->style->or_mask); + } if(ctrl->gotexstyle) - printf("\tExStyle: %08lx\n", ctrl->exstyle); + { + assert(ctrl->exstyle != NULL); + assert(ctrl->exstyle->and_mask == 0); + printf("\tExStyle: %08lx\n", ctrl->exstyle->or_mask); + } if(ctrl->gothelpid) printf("\tHelpid: %ld\n", ctrl->helpid); if(ctrl->extra) @@ -529,9 +538,18 @@ void dump_dialog(dialog_t *dlg) dump_lvc(&(dlg->lvc)); printf("x, y, w, h: %d, %d, %d, %d\n", dlg->x, dlg->y, dlg->width, dlg->height); if(dlg->gotstyle) - printf("Style: %08lx\n", dlg->style); + { + assert(dlg->style != NULL); + assert(dlg->style->and_mask == 0); + printf("Style: %08lx\n", dlg->style->or_mask); + + } if(dlg->gotexstyle) - printf("ExStyle: %08lx\n", dlg->exstyle); + { + assert(dlg->exstyle != NULL); + assert(dlg->exstyle->and_mask == 0); + printf("ExStyle: %08lx\n", dlg->exstyle->or_mask); + } printf("Menu: %s\n", get_nameid_str(dlg->menu)); printf("Class: %s\n", get_nameid_str(dlg->dlgclass)); printf("Title: "); print_string(dlg->title); printf("\n"); @@ -570,9 +588,17 @@ void dump_dialogex(dialogex_t *dlgex) dump_lvc(&(dlgex->lvc)); printf("x, y, w, h: %d, %d, %d, %d\n", dlgex->x, dlgex->y, dlgex->width, dlgex->height); if(dlgex->gotstyle) - printf("Style: %08lx\n", dlgex->style); + { + assert(dlgex->style != NULL); + assert(dlgex->style->and_mask == 0); + printf("Style: %08lx\n", dlgex->style->or_mask); + } if(dlgex->gotexstyle) - printf("ExStyle: %08lx\n", dlgex->exstyle); + { + assert(dlgex->exstyle != NULL); + assert(dlgex->exstyle->and_mask == 0); + printf("ExStyle: %08lx\n", dlgex->exstyle->or_mask); + } if(dlgex->gothelpid) printf("Helpid: %ld\n", dlgex->helpid); printf("Menu: %s\n", get_nameid_str(dlgex->menu)); diff --git a/tools/wrc/genres.c b/tools/wrc/genres.c index 097a031ef2c..80ca457a621 100644 --- a/tools/wrc/genres.c +++ b/tools/wrc/genres.c @@ -415,8 +415,8 @@ res_t *dialog2res(name_id_t *name, dialog_t *dlg) { restag = put_res_header(res, WRC_RT_DIALOG, NULL, name, dlg->memopt, &(dlg->lvc)); - put_dword(res, dlg->style); - put_dword(res, dlg->gotexstyle ? dlg->exstyle : 0); + put_dword(res, dlg->style->or_mask); + put_dword(res, dlg->gotexstyle ? dlg->exstyle->or_mask : 0); tag_nctrl = res->size; put_word(res, 0); /* Number of controls */ put_word(res, dlg->x); @@ -445,8 +445,8 @@ res_t *dialog2res(name_id_t *name, dialog_t *dlg) while(ctrl) { /* FIXME: what is default control style? */ - put_dword(res, ctrl->gotstyle ? ctrl->style : WS_CHILD); - put_dword(res, ctrl->gotexstyle ? ctrl->exstyle : 0); + put_dword(res, ctrl->gotstyle ? ctrl->style->or_mask: WS_CHILD); + put_dword(res, ctrl->gotexstyle ? ctrl->exstyle->or_mask : 0); put_word(res, ctrl->x); put_word(res, ctrl->y); put_word(res, ctrl->width); @@ -481,7 +481,7 @@ res_t *dialog2res(name_id_t *name, dialog_t *dlg) { restag = put_res_header(res, WRC_RT_DIALOG, NULL, name, dlg->memopt, NULL); - put_dword(res, dlg->gotstyle ? dlg->style : WS_POPUPWINDOW); + put_dword(res, dlg->gotstyle ? dlg->style->or_mask : WS_POPUPWINDOW); tag_nctrl = res->size; put_byte(res, 0); /* Number of controls */ put_word(res, dlg->x); @@ -513,7 +513,7 @@ res_t *dialog2res(name_id_t *name, dialog_t *dlg) put_word(res, ctrl->width); put_word(res, ctrl->height); put_word(res, ctrl->id); - put_dword(res, ctrl->gotstyle ? ctrl->style : WS_CHILD); + put_dword(res, ctrl->gotstyle ? ctrl->style->or_mask: WS_CHILD); if(ctrl->ctlclass) { if(ctrl->ctlclass->type == name_ord @@ -583,8 +583,8 @@ res_t *dialogex2res(name_id_t *name, dialogex_t *dlgex) put_word(res, 1); /* Signature */ put_word(res, 0xffff); /* DlgVer */ put_dword(res, dlgex->gothelpid ? dlgex->helpid : 0); - put_dword(res, dlgex->gotexstyle ? dlgex->exstyle : 0); - put_dword(res, dlgex->gotstyle ? dlgex->style : WS_POPUPWINDOW); + put_dword(res, dlgex->gotexstyle ? dlgex->exstyle->or_mask : 0); + put_dword(res, dlgex->gotstyle ? dlgex->style->or_mask : WS_POPUPWINDOW); tag_nctrl = res->size; put_word(res, 0); /* Number of controls */ put_word(res, dlgex->x); @@ -619,9 +619,9 @@ res_t *dialogex2res(name_id_t *name, dialogex_t *dlgex) while(ctrl) { put_dword(res, ctrl->gothelpid ? ctrl->helpid : 0); - put_dword(res, ctrl->gotexstyle ? ctrl->exstyle : 0); + put_dword(res, ctrl->gotexstyle ? ctrl->exstyle->or_mask : 0); /* FIXME: what is default control style? */ - put_dword(res, ctrl->gotstyle ? ctrl->style : WS_CHILD | WS_VISIBLE); + put_dword(res, ctrl->gotstyle ? ctrl->style->or_mask : WS_CHILD | WS_VISIBLE); put_word(res, ctrl->x); put_word(res, ctrl->y); put_word(res, ctrl->width); diff --git a/tools/wrc/newstruc.c b/tools/wrc/newstruc.c index a86bcc9a579..a6c1ce27f42 100644 --- a/tools/wrc/newstruc.c +++ b/tools/wrc/newstruc.c @@ -279,10 +279,18 @@ dlginit_t *new_dlginit(raw_data_t *rd, int *memopt) return di; } -style_pair_t *new_style_pair(int style, int exstyle) +style_pair_t *new_style_pair(style_t *style, style_t *exstyle) { style_pair_t *sp = (style_pair_t *)xmalloc(sizeof(style_pair_t)); sp->style = style; sp->exstyle = exstyle; return sp; } + +style_t *new_style(DWORD or_mask, DWORD and_mask) +{ + style_t *st = (style_t *)xmalloc(sizeof(style_t)); + st->or_mask = or_mask; + st->and_mask = and_mask; + return st; +} diff --git a/tools/wrc/newstruc.h b/tools/wrc/newstruc.h index 85056dcb7f2..354c4e4fa91 100644 --- a/tools/wrc/newstruc.h +++ b/tools/wrc/newstruc.h @@ -64,7 +64,8 @@ void copy_raw_data(raw_data_t *dst, raw_data_t *src, int offs, int len); int *new_int(int i); stringtable_t *new_stringtable(lvc_t *lvc); toolbar_t *new_toolbar(int button_width, int button_Height, toolbar_item_t *items, int nitems); -style_pair_t *new_style_pair(int style, int exstyle); +style_pair_t *new_style_pair(style_t *style, style_t *exstyle); +style_t *new_style(DWORD or_mask, DWORD and_mask); #endif diff --git a/tools/wrc/parser.y b/tools/wrc/parser.y index e80ec08102d..539df2bfdc4 100644 --- a/tools/wrc/parser.y +++ b/tools/wrc/parser.y @@ -2,7 +2,10 @@ /* * Copyright Martin von Loewis, 1994 * Copyright 1998 Bertho A. Stultiens (BS) + * 1999 Juergen Schmied (JS) * + * 6-Nov-1999 JS - see CHANGES + * * 29-Dec-1998 AdH - Grammar and function extensions. * grammar: TOOLBAR resources, Named ICONs in * DIALOGS @@ -109,7 +112,6 @@ #pragma warn -sig #endif -DWORD andmask; /* Used to parse 'NOT NUMBER' expressions */ int indialog = 0; /* Signal flex that we're parsing a dialog */ int want_rscname = 0; /* Set when a resource's name is required */ stringtable_t *tagstt; /* Stringtable tag. @@ -157,10 +159,10 @@ dialogex_t *dialogex_menu(name_id_t *m, dialogex_t *dlg); dialogex_t *dialogex_class(name_id_t *n, dialogex_t *dlg); dialogex_t *dialogex_font(font_id_t *f, dialogex_t *dlg); dialogex_t *dialogex_caption(string_t *s, dialogex_t *dlg); -dialogex_t *dialogex_exstyle(int st, dialogex_t *dlg); -dialogex_t *dialogex_style(int st, dialogex_t *dlg); +dialogex_t *dialogex_exstyle(style_t *st, dialogex_t *dlg); +dialogex_t *dialogex_style(style_t *st, dialogex_t *dlg); name_id_t *convert_ctlclass(name_id_t *cls); -control_t *ins_ctrl(int type, int style, control_t *ctrl, control_t *prev); +control_t *ins_ctrl(int type, int special_style, control_t *ctrl, control_t *prev); dialog_t *dialog_version(version_t *v, dialog_t *dlg); dialog_t *dialog_characteristics(characts_t *c, dialog_t *dlg); dialog_t *dialog_language(language_t *l, dialog_t *dlg); @@ -168,8 +170,8 @@ dialog_t *dialog_menu(name_id_t *m, dialog_t *dlg); dialog_t *dialog_class(name_id_t *n, dialog_t *dlg); dialog_t *dialog_font(font_id_t *f, dialog_t *dlg); dialog_t *dialog_caption(string_t *s, dialog_t *dlg); -dialog_t *dialog_exstyle(int st, dialog_t *dlg); -dialog_t *dialog_style(int st, dialog_t *dlg); +dialog_t *dialog_exstyle(style_t * st, dialog_t *dlg); +dialog_t *dialog_style(style_t * st, dialog_t *dlg); resource_t *build_stt_resources(stringtable_t *stthead); stringtable_t *find_stringtable(lvc_t *lvc); toolbar_item_t *ins_tlbr_button(toolbar_item_t *prev, toolbar_item_t *idrec); @@ -217,6 +219,7 @@ toolbar_item_t *get_tlbr_buttons_head(toolbar_item_t *p, int *nitems); toolbar_item_t *tlbarItems; dlginit_t *dginit; style_pair_t *styles; + style_t *style; } %token tIF tIFDEF tIFNDEF tELSE tELIF tENDIF tDEFINED tNL @@ -263,7 +266,7 @@ toolbar_item_t *get_tlbr_buttons_head(toolbar_item_t *p, int *nitems); %type <curg> cursor %type <dlg> dialog dlg_attributes %type <ctl> ctrls gen_ctrl lab_ctrl ctrl_desc iconinfo -%type <iptr> optional_style helpid +%type <iptr> helpid %type <dlgex> dialogex dlgex_attribs %type <ctl> exctrls gen_exctrl lab_exctrl exctrl_desc %type <rdt> rcdata @@ -288,7 +291,7 @@ toolbar_item_t *get_tlbr_buttons_head(toolbar_item_t *p, int *nitems); %type <lan> opt_language %type <chars> opt_characts %type <ver> opt_version -%type <num> expr xpr dummy +%type <num> expr xpr %type <iptr> e_expr %type <iptr> pp_expr pp_constant %type <tlbar> toolbar @@ -296,6 +299,8 @@ toolbar_item_t *get_tlbr_buttons_head(toolbar_item_t *p, int *nitems); %type <dginit> dlginit %type <styles> optional_style_pair %type <num> any_num +%type <style> optional_style +%type <style> style %% @@ -673,13 +678,17 @@ dialog : DIALOG loadmemopts expr ',' expr ',' expr ',' expr dlg_attributes $$ = $10; if(!$$->gotstyle) { - $$->style = WS_POPUP; + $$->style->or_mask = WS_POPUP; $$->gotstyle = TRUE; } if($$->title) - $$->style |= WS_CAPTION; + $$->style->or_mask |= WS_CAPTION; if($$->font) - $$->style |= DS_SETFONT; + $$->style->or_mask |= DS_SETFONT; + + $$->style->or_mask &= ~($$->style->and_mask); + $$->style->and_mask = 0; + indialog = FALSE; if(!$$->lvc.language) $$->lvc.language = dup_language(currentlanguage); @@ -688,8 +697,8 @@ dialog : DIALOG loadmemopts expr ',' expr ',' expr ',' expr dlg_attributes dlg_attributes : /* Empty */ { $$=new_dialog(); } - | dlg_attributes STYLE expr { $$=dialog_style($3,$1); } - | dlg_attributes EXSTYLE expr { $$=dialog_exstyle($3,$1); } + | dlg_attributes STYLE style { $$=dialog_style($3,$1); } + | dlg_attributes EXSTYLE style { $$=dialog_exstyle($3,$1); } | dlg_attributes CAPTION tSTRING { $$=dialog_caption($3,$1); } | dlg_attributes opt_font { $$=dialog_font($2,$1); } | dlg_attributes CLASS nameid_s { $$=dialog_class($3,$1); } @@ -741,9 +750,8 @@ lab_ctrl $$->height = $11; if($12) { - $$->style = *($12); + $$->style = $12; $$->gotstyle = TRUE; - free($12); } } ; @@ -758,9 +766,8 @@ ctrl_desc $$->height = $9; if($10) { - $$->style = *($10); + $$->style = $10; $$->gotstyle = TRUE; - free($10); } } ; @@ -773,14 +780,14 @@ iconinfo: /* Empty */ $$->width = $2; $$->height = $4; } - | ',' expr ',' expr ',' expr { + | ',' expr ',' expr ',' style { $$ = new_control(); $$->width = $2; $$->height = $4; $$->style = $6; $$->gotstyle = TRUE; } - | ',' expr ',' expr ',' expr ',' expr { + | ',' expr ',' expr ',' style ',' style { $$ = new_control(); $$->width = $2; $$->height = $4; @@ -791,7 +798,7 @@ iconinfo: /* Empty */ } ; -gen_ctrl: nameid_s ',' expr ',' ctlclass ',' expr ',' expr ',' expr ',' expr ',' expr ',' expr { +gen_ctrl: nameid_s ',' expr ',' ctlclass ',' style ',' expr ',' expr ',' expr ',' expr ',' style { $$=new_control(); $$->title = $1; $$->id = $3; @@ -805,7 +812,7 @@ gen_ctrl: nameid_s ',' expr ',' ctlclass ',' expr ',' expr ',' expr ',' expr ',' $$->exstyle = $17; $$->gotexstyle = TRUE; } - | nameid_s ',' expr ',' ctlclass ',' expr ',' expr ',' expr ',' expr ',' expr { + | nameid_s ',' expr ',' ctlclass ',' style ',' expr ',' expr ',' expr ',' expr { $$=new_control(); $$->title = $1; $$->id = $3; @@ -823,17 +830,25 @@ opt_font : FONT expr ',' tSTRING { $$ = new_font_id($2, $4, 0, 0); } ; +/* ------------------------------ style flags ------------------------------ */ optional_style /* Abbused once to get optional ExStyle */ : /* Empty */ { $$ = NULL; } - | ',' expr { $$ = new_int($2); } + | ',' style { $$ = $2; } ; optional_style_pair - : /* Enpty */ { $$ = NULL; } - | ',' expr { $$ = new_style_pair($2, 0); } - | ',' expr ',' expr { $$ = new_style_pair($2, $4); } + : /* Empty */ { $$ = NULL; } + | ',' style { $$ = new_style_pair($2, 0); } + | ',' style ',' style { $$ = new_style_pair($2, $4); } ; +style + : style '|' style { $$ = new_style($1->or_mask | $3->or_mask, $1->and_mask | $3->and_mask); free($1); free($3);} + | '(' style ')' { $$ = $2; } + | any_num { $$ = new_style($1, 0); } + | NOT any_num { $$ = new_style(0, $2); } + ; + ctlclass : expr { $$ = new_name_id(); @@ -871,15 +886,21 @@ dialogex: DIALOGEX loadmemopts expr ',' expr ',' expr ',' expr helpid dlgex_attr } $11->controls = get_control_head($13); $$ = $11; + + assert($$->style != NULL); if(!$$->gotstyle) { - $$->style = WS_POPUP; + $$->style->or_mask = WS_POPUP; $$->gotstyle = TRUE; } if($$->title) - $$->style |= WS_CAPTION; + $$->style->or_mask |= WS_CAPTION; if($$->font) - $$->style |= DS_SETFONT; + $$->style->or_mask |= DS_SETFONT; + + $$->style->or_mask &= ~($$->style->and_mask); + $$->style->and_mask = 0; + indialog = FALSE; if(!$$->lvc.language) $$->lvc.language = dup_language(currentlanguage); @@ -888,8 +909,8 @@ dialogex: DIALOGEX loadmemopts expr ',' expr ',' expr ',' expr helpid dlgex_attr dlgex_attribs : /* Empty */ { $$=new_dialogex(); } - | dlgex_attribs STYLE expr { $$=dialogex_style($3,$1); } - | dlgex_attribs EXSTYLE expr { $$=dialogex_exstyle($3,$1); } + | dlgex_attribs STYLE style { $$=dialogex_style($3,$1); } + | dlgex_attribs EXSTYLE style { $$=dialogex_exstyle($3,$1); } | dlgex_attribs CAPTION tSTRING { $$=dialogex_caption($3,$1); } | dlgex_attribs opt_font { $$=dialogex_font($2,$1); } | dlgex_attribs opt_exfont { $$=dialogex_font($2,$1); } @@ -930,8 +951,8 @@ exctrls : /* Empty */ { $$ = NULL; } ; gen_exctrl - : nameid_s ',' expr ',' ctlclass ',' expr ',' expr ',' expr ',' expr ',' - expr ',' e_expr helpid opt_data { + : nameid_s ',' expr ',' ctlclass ',' style ',' expr ',' expr ',' expr ',' + expr ',' style helpid opt_data { $$=new_control(); $$->title = $1; $$->id = $3; @@ -944,9 +965,8 @@ gen_exctrl $$->height = $15; if($17) { - $$->exstyle = *($17); + $$->exstyle = $17; $$->gotexstyle = TRUE; - free($17); } if($18) { @@ -956,7 +976,7 @@ gen_exctrl } $$->extra = $19; } - | nameid_s ',' expr ',' ctlclass ',' expr ',' expr ',' expr ',' expr ',' expr opt_data { + | nameid_s ',' expr ',' ctlclass ',' style ',' expr ',' expr ',' expr ',' expr opt_data { $$=new_control(); $$->title = $1; $$->id = $3; @@ -1601,10 +1621,7 @@ raw_elements e_expr : /* Empty */ { $$ = 0; } | expr { $$ = new_int($1); } ; -expr : dummy xpr { $$ = ($2) & andmask; } - ; - -dummy : /* Empty */ { $$ = 0; andmask = -1; } +expr : xpr { $$ = ($1) } ; xpr : xpr '+' xpr { $$ = ($1) + ($3); } @@ -1618,7 +1635,7 @@ xpr : xpr '+' xpr { $$ = ($1) + ($3); } /* | '+' xpr { $$ = $2; } */ | '(' xpr ')' { $$ = $2; } | any_num { $$ = $1; want_rscname = 0; } - | NOT any_num { $$ = 0; andmask &= ~($2); } + | NOT any_num { $$ = ~($2); } ; any_num : NUMBER { $$ = $1; } @@ -1627,31 +1644,51 @@ any_num : NUMBER { $$ = $1; } %% /* Dialog specific functions */ -dialog_t *dialog_style(int st, dialog_t *dlg) +dialog_t *dialog_style(style_t * st, dialog_t *dlg) { - DWORD s = 0; assert(dlg != NULL); + if(dlg->style == NULL) + { + dlg->style = new_style(0,0); + } + if(dlg->gotstyle) { yywarning("Style already defined, or-ing together"); - s = dlg->style; } - dlg->style = st | s; + else + { + dlg->style->or_mask = 0; + dlg->style->and_mask = 0; + } + dlg->style->or_mask |= st->or_mask; + dlg->style->and_mask |= st->and_mask; dlg->gotstyle = TRUE; + free(st); return dlg; } -dialog_t *dialog_exstyle(int st, dialog_t *dlg) +dialog_t *dialog_exstyle(style_t *st, dialog_t *dlg) { - DWORD s = 0; assert(dlg != NULL); + if(dlg->exstyle == NULL) + { + dlg->exstyle = new_style(0,0); + } + if(dlg->gotexstyle) { yywarning("ExStyle already defined, or-ing together"); - s = dlg->style; } - dlg->exstyle = st | s; + else + { + dlg->exstyle->or_mask = 0; + dlg->exstyle->and_mask = 0; + } + dlg->exstyle->or_mask |= st->or_mask; + dlg->exstyle->and_mask |= st->and_mask; dlg->gotexstyle = TRUE; + free(st); return dlg; } @@ -1719,12 +1756,17 @@ dialog_t *dialog_version(version_t *v, dialog_t *dlg) } /* Controls specific functions */ -control_t *ins_ctrl(int type, int style, control_t *ctrl, control_t *prev) +control_t *ins_ctrl(int type, int special_style, control_t *ctrl, control_t *prev) { + /* Hm... this seems to be jammed in at all time... */ + int defaultstyle = WS_CHILD | WS_VISIBLE; + assert(ctrl != NULL); ctrl->prev = prev; + if(prev) prev->next = ctrl; + if(type != -1) { ctrl->ctlclass = new_name_id(); @@ -1732,28 +1774,24 @@ control_t *ins_ctrl(int type, int style, control_t *ctrl, control_t *prev) ctrl->ctlclass->name.i_name = type; } - /* Hm... this seems to be jammed in at all time... */ - ctrl->style |= WS_CHILD | WS_VISIBLE; switch(type) { case CT_BUTTON: - ctrl->style |= style; - if(style != BS_GROUPBOX && style != BS_RADIOBUTTON) - ctrl->style |= WS_TABSTOP; + if(special_style != BS_GROUPBOX && special_style != BS_RADIOBUTTON) + defaultstyle |= WS_TABSTOP; break; case CT_EDIT: - ctrl->style |= WS_TABSTOP | WS_BORDER; + defaultstyle |= WS_TABSTOP | WS_BORDER; break; case CT_LISTBOX: - ctrl->style |= LBS_NOTIFY | WS_BORDER; + defaultstyle |= LBS_NOTIFY | WS_BORDER; break; case CT_COMBOBOX: - ctrl->style |= CBS_SIMPLE; + defaultstyle |= CBS_SIMPLE; break; case CT_STATIC: - ctrl->style |= style; - if(style == SS_CENTER || style == SS_LEFT || style == SS_RIGHT) - ctrl->style |= WS_GROUP; + if(special_style == SS_CENTER || special_style == SS_LEFT || special_style == SS_RIGHT) + defaultstyle |= WS_GROUP; break; } @@ -1762,19 +1800,19 @@ control_t *ins_ctrl(int type, int style, control_t *ctrl, control_t *prev) switch(type) { case CT_EDIT: - ctrl->style |= ES_LEFT; + defaultstyle |= ES_LEFT; break; case CT_LISTBOX: - ctrl->style |= LBS_NOTIFY; + defaultstyle |= LBS_NOTIFY; break; case CT_COMBOBOX: - ctrl->style |= CBS_SIMPLE | WS_TABSTOP; + defaultstyle |= CBS_SIMPLE | WS_TABSTOP; break; case CT_SCROLLBAR: - ctrl->style |= SBS_HORZ; + defaultstyle |= SBS_HORZ; break; case CT_BUTTON: - switch(style) + switch(special_style) { case BS_CHECKBOX: case BS_DEFPUSHBUTTON: @@ -1785,27 +1823,27 @@ control_t *ins_ctrl(int type, int style, control_t *ctrl, control_t *prev) case BS_AUTO3STATE: case BS_3STATE: case BS_AUTOCHECKBOX: - ctrl->style |= WS_TABSTOP; + defaultstyle |= WS_TABSTOP; break; default: - yywarning("Unknown default button control-style 0x%08x", style); + yywarning("Unknown default button control-style 0x%08x", special_style); case BS_RADIOBUTTON: break; } break; case CT_STATIC: - switch(style) + switch(special_style) { case SS_LEFT: case SS_RIGHT: case SS_CENTER: - ctrl->style |= WS_GROUP; + defaultstyle |= WS_GROUP; break; case SS_ICON: /* Special case */ break; default: - yywarning("Unknown default static control-style 0x%08x", style); + yywarning("Unknown default static control-style 0x%08x", special_style); break; } break; @@ -1818,11 +1856,27 @@ control_t *ins_ctrl(int type, int style, control_t *ctrl, control_t *prev) } /* The SS_ICON flag is always forced in for icon controls */ - if(type == CT_STATIC && style == SS_ICON) - ctrl->style |= SS_ICON; + if(type == CT_STATIC && special_style == SS_ICON) + defaultstyle |= SS_ICON; + if (!ctrl->gotstyle) + ctrl->style = new_style(0,0); + + /* combine all styles */ + ctrl->style->or_mask = ctrl->style->or_mask | defaultstyle | special_style; ctrl->gotstyle = TRUE; byebye: + /* combine with NOT mask */ + if (ctrl->gotstyle) + { + ctrl->style->or_mask &= ~(ctrl->style->and_mask); + ctrl->style->and_mask = 0; + } + if (ctrl->gotexstyle) + { + ctrl->exstyle->or_mask &= ~(ctrl->exstyle->and_mask); + ctrl->exstyle->and_mask = 0; + } return ctrl; } @@ -1864,31 +1918,51 @@ name_id_t *convert_ctlclass(name_id_t *cls) } /* DialogEx specific functions */ -dialogex_t *dialogex_style(int st, dialogex_t *dlg) +dialogex_t *dialogex_style(style_t * st, dialogex_t *dlg) { - DWORD s = 0; assert(dlg != NULL); + if(dlg->style == NULL) + { + dlg->style = new_style(0,0); + } + if(dlg->gotstyle) { yywarning("Style already defined, or-ing together"); - s = dlg->style; } - dlg->style = st | s; + else + { + dlg->style->or_mask = 0; + dlg->style->and_mask = 0; + } + dlg->style->or_mask |= st->or_mask; + dlg->style->and_mask |= st->and_mask; dlg->gotstyle = TRUE; + free(st); return dlg; } -dialogex_t *dialogex_exstyle(int st, dialogex_t *dlg) +dialogex_t *dialogex_exstyle(style_t * st, dialogex_t *dlg) { - DWORD s = 0; assert(dlg != NULL); + if(dlg->exstyle == NULL) + { + dlg->exstyle = new_style(0,0); + } + if(dlg->gotexstyle) { yywarning("ExStyle already defined, or-ing together"); - s = dlg->exstyle; } - dlg->exstyle = st | s; + else + { + dlg->exstyle->or_mask = 0; + dlg->exstyle->and_mask = 0; + } + dlg->exstyle->or_mask |= st->or_mask; + dlg->exstyle->and_mask |= st->and_mask; dlg->gotexstyle = TRUE; + free(st); return dlg; } diff --git a/tools/wrc/wrc.h b/tools/wrc/wrc.h index 2577e6a170e..47117888bac 100644 --- a/tools/wrc/wrc.h +++ b/tools/wrc/wrc.h @@ -12,8 +12,8 @@ #include "wrctypes.h" #endif -#define WRC_VERSION "1.0.15" -#define WRC_RELEASEDATE "(13-Aug-1999)" +#define WRC_VERSION "1.0.16" +#define WRC_RELEASEDATE "(6-Nov-1999)" #define WRC_FULLVERSION WRC_VERSION " " WRC_RELEASEDATE /* Only used in heavy debugging sessions */ diff --git a/tools/wrc/wrctypes.h b/tools/wrc/wrctypes.h index 979de0e3942..73c8d032227 100644 --- a/tools/wrc/wrctypes.h +++ b/tools/wrc/wrctypes.h @@ -111,6 +111,12 @@ typedef struct font_id { int italic; } font_id_t; +/* control styles */ +typedef struct style { + DWORD or_mask; + DWORD and_mask; +} style_t; + /* resource types */ /* These are in the same order (and ordinal) as the RT_xxx * defines. This is _required_. @@ -171,8 +177,8 @@ typedef struct control { int y; int width; /* Size */ int height; - DWORD style; /* Style */ - DWORD exstyle; + style_t *style; /* Style */ + style_t *exstyle; DWORD helpid; /* EX: */ int gotstyle; /* Used to determine whether the default */ int gotexstyle; /* styles must be set */ @@ -186,8 +192,8 @@ typedef struct dialog { int y; int width; /* Size */ int height; - DWORD style; /* Style */ - DWORD exstyle; + style_t *style; /* Style */ + style_t *exstyle; int gotstyle; /* Used to determine whether the default */ int gotexstyle; /* styles must be set */ name_id_t *menu; @@ -205,8 +211,8 @@ typedef struct dialogex { int y; int width; /* Size */ int height; - DWORD style; /* Style */ - DWORD exstyle; + style_t *style; /* Style */ + style_t *exstyle; DWORD helpid; /* EX: */ int gotstyle; /* Used to determine whether the default */ int gotexstyle; /* styles must be set */ @@ -529,8 +535,8 @@ typedef struct res_count { } res_count_t; typedef struct style_pair { - int style; - int exstyle; + style_t *style; + style_t *exstyle; } style_pair_t; #endif -- GitLab