From: Rémi Bernon rbernon@codeweavers.com
--- dlls/uxtheme/stylemap.c | 253 ++++++++++++++++++++++++---------------- 1 file changed, 151 insertions(+), 102 deletions(-)
diff --git a/dlls/uxtheme/stylemap.c b/dlls/uxtheme/stylemap.c index dd54507b5a5..740f45d36d2 100644 --- a/dlls/uxtheme/stylemap.c +++ b/dlls/uxtheme/stylemap.c @@ -43,16 +43,18 @@ struct enum_desc WCHAR enum_name[18]; };
-typedef struct _MSSTYLES_CLASS_MAP { - WORD dwPartID; - WORD dwStateID; - WCHAR szName[31]; -} MSSTYLES_CLASS_MAP, *PMSSTYLES_CLASS_MAP; +struct part_desc +{ + WORD part_id; + WORD state_id; + WCHAR part_name[31]; +};
-typedef struct _MSSTYLES_CLASS_NAME { - const MSSTYLES_CLASS_MAP *lpMap; - WCHAR pszClass[12]; -} MSSTYLES_CLASS_NAME, *PMSSTYLES_CLASS_NAME; +struct class_desc +{ + const struct part_desc *parts; + WCHAR class_name[12]; +};
/*********************************************************************** * Map property names to IDs & primitive types @@ -339,7 +341,8 @@ static const struct enum_desc enum_descs[] = * Defined as PartID,StateID,TextName * If StateID == 0 then its a part being defined */ -static const MSSTYLES_CLASS_MAP classButton[] = { +static const struct part_desc button_desc[] = +{ {BP_PUSHBUTTON, 0, L"PUSHBUTTON"}, {BP_PUSHBUTTON, PBS_NORMAL, L"NORMAL"}, {BP_PUSHBUTTON, PBS_HOT, L"HOT"}, @@ -433,7 +436,8 @@ static const MSSTYLES_CLASS_MAP classButton[] = { {0, 0, L""} };
-static const MSSTYLES_CLASS_MAP classClock[] = { +static const struct part_desc clock_desc[] = +{ {CLP_TIME, 0, L"TIME"}, {CLP_TIME, CLS_NORMAL, L"NORMAL"}, {CLP_TIME, CLS_HOT, L"HOT"}, @@ -441,7 +445,8 @@ static const MSSTYLES_CLASS_MAP classClock[] = { {0, 0, L""} };
-static const MSSTYLES_CLASS_MAP classCombobox[] = { +static const struct part_desc combobox_desc[] = +{ {CP_DROPDOWNBUTTON, 0, L"DROPDOWNBUTTON"}, {CP_DROPDOWNBUTTON, CBXS_NORMAL, L"NORMAL"}, {CP_DROPDOWNBUTTON, CBXS_HOT, L"HOT"}, @@ -484,7 +489,8 @@ static const MSSTYLES_CLASS_MAP classCombobox[] = { {0, 0, L""} };
-static const MSSTYLES_CLASS_MAP classEdit[] = { +static const struct part_desc edit_desc[] = +{ {EP_EDITTEXT, 0, L"EDITTEXT"}, {EP_EDITTEXT, ETS_NORMAL, L"NORMAL"}, {EP_EDITTEXT, ETS_HOT, L"HOT"}, @@ -531,7 +537,8 @@ static const MSSTYLES_CLASS_MAP classEdit[] = { {0, 0, L""} };
-static const MSSTYLES_CLASS_MAP classExplorerbar[] = { +static const struct part_desc explorerbar_desc[] = +{ {EBP_HEADERBACKGROUND, 0, L"HEADERBACKGROUND"}, {EBP_HEADERCLOSE, 0, L"HEADERCLOSE"}, {EBP_HEADERCLOSE, EBHC_NORMAL, L"NORMAL"}, @@ -571,7 +578,8 @@ static const MSSTYLES_CLASS_MAP classExplorerbar[] = { {0, 0, L""} };
-static const MSSTYLES_CLASS_MAP classHeader[] = { +static const struct part_desc header_desc[] = +{ {HP_HEADERITEM, 0, L"HEADERITEM"}, {HP_HEADERITEM, HIS_NORMAL, L"NORMAL"}, {HP_HEADERITEM, HIS_HOT, L"HOT"}, @@ -610,7 +618,8 @@ static const MSSTYLES_CLASS_MAP classHeader[] = { {0, 0, L""} };
-static const MSSTYLES_CLASS_MAP classListview[] = { +static const struct part_desc listview_desc[] = +{ {LVP_LISTITEM, 0, L"LISTITEM"}, {LVP_LISTITEM, LISS_NORMAL, L"NORMAL"}, {LVP_LISTITEM, LISS_HOT, L"HOT"}, @@ -668,7 +677,8 @@ static const MSSTYLES_CLASS_MAP classListview[] = { {0, 0, L""} };
-static const MSSTYLES_CLASS_MAP classMenu[] = { +static const struct part_desc menu_desc[] = +{ {MENU_MENUITEM_TMSCHEMA, 0, L"MENUITEM"}, {MENU_MENUDROPDOWN_TMSCHEMA, 0, L"MENUDROPDOWN"}, {MENU_MENUBARITEM_TMSCHEMA, 0, L"MENUBARITEM"}, @@ -721,7 +731,8 @@ static const MSSTYLES_CLASS_MAP classMenu[] = { {0, 0, L""} };
-static const MSSTYLES_CLASS_MAP classMenuband[] = { +static const struct part_desc menuband_desc[] = +{ {MDP_NEWAPPBUTTON, 0, L"NEWAPPBUTTON"}, {MDP_NEWAPPBUTTON, MDS_NORMAL, L"NORMAL"}, {MDP_NEWAPPBUTTON, MDS_HOT, L"HOT"}, @@ -733,7 +744,8 @@ static const MSSTYLES_CLASS_MAP classMenuband[] = { {0, 0, L""} };
-static const MSSTYLES_CLASS_MAP classNavigation[] = { +static const struct part_desc navigation_desc[] = +{ {NAV_BACKBUTTON, 0, L"BACKBUTTON"}, {NAV_BACKBUTTON, NAV_BB_NORMAL, L"NORMAL"}, {NAV_BACKBUTTON, NAV_BB_HOT, L"HOT"}, @@ -752,7 +764,8 @@ static const MSSTYLES_CLASS_MAP classNavigation[] = { {0, 0, L""} };
-static const MSSTYLES_CLASS_MAP classPage[] = { +static const struct part_desc page_desc[] = +{ {PGRP_UP, 0, L"UP"}, {PGRP_UP, UPS_NORMAL, L"NORMAL"}, {PGRP_UP, UPS_HOT, L"HOT"}, @@ -776,7 +789,8 @@ static const MSSTYLES_CLASS_MAP classPage[] = { {0, 0, L""} };
-static const MSSTYLES_CLASS_MAP classProgress[] = { +static const struct part_desc progress_desc[] = +{ {PP_BAR, 0, L"BAR"}, {PP_BARVERT, 0, L"BARVERT"}, {PP_CHUNK, 0, L"CHUNK"}, @@ -804,7 +818,8 @@ static const MSSTYLES_CLASS_MAP classProgress[] = { {0, 0, L""} };
-static const MSSTYLES_CLASS_MAP classRebar[] = { +static const struct part_desc rebar_desc[] = +{ {RP_GRIPPER, 0, L"GRIPPER"}, {RP_GRIPPERVERT, 0, L"GRIPPERVERT"}, {RP_BAND, 0, L"BAND"}, @@ -828,7 +843,8 @@ static const MSSTYLES_CLASS_MAP classRebar[] = { {0, 0, L""} };
-static const MSSTYLES_CLASS_MAP classScrollbar[] = { +static const struct part_desc scrollbar_desc[] = +{ {SBP_ARROWBTN, 0, L"ARROWBTN"}, {SBP_ARROWBTN, ABS_UPNORMAL, L"UPNORMAL"}, {SBP_ARROWBTN, ABS_UPHOT, L"UPHOT"}, @@ -911,7 +927,8 @@ static const MSSTYLES_CLASS_MAP classScrollbar[] = { {0, 0, L""} };
-static const MSSTYLES_CLASS_MAP classSpin[] = { +static const struct part_desc spin_desc[] = +{ {SPNP_UP, 0, L"UP"}, {SPNP_UP, UPS_NORMAL, L"NORMAL"}, {SPNP_UP, UPS_HOT, L"HOT"}, @@ -935,7 +952,8 @@ static const MSSTYLES_CLASS_MAP classSpin[] = { {0, 0, L""} };
-static const MSSTYLES_CLASS_MAP classStartpanel[] = { +static const struct part_desc startpanel_desc[] = +{ {SPP_USERPANE, 0, L"USERPANE"}, {SPP_MOREPROGRAMS, 0, L"MOREPROGRAMS"}, {SPP_MOREPROGRAMSARROW, 0, L"MOREPROGRAMSARROW"}, @@ -985,14 +1003,16 @@ static const MSSTYLES_CLASS_MAP classStartpanel[] = { {0, 0, L""} };
-static const MSSTYLES_CLASS_MAP classStatus[] = { +static const struct part_desc status_desc[] = +{ {SP_PANE, 0, L"PANE"}, {SP_GRIPPERPANE, 0, L"GRIPPERPANE"}, {SP_GRIPPER, 0, L"GRIPPER"}, {0, 0, L""} };
-static const MSSTYLES_CLASS_MAP classTab[] = { +static const struct part_desc tab_desc[] = +{ {TABP_TABITEM, 0, L"TABITEM"}, {TABP_TABITEM, TIS_NORMAL, L"NORMAL"}, {TABP_TABITEM, TIS_HOT, L"HOT"}, @@ -1047,14 +1067,16 @@ static const MSSTYLES_CLASS_MAP classTab[] = { {0, 0, L""} };
-static const MSSTYLES_CLASS_MAP classTaskband[] = { +static const struct part_desc taskband_desc[] = +{ {TDP_GROUPCOUNT, 0, L"GROUPCOUNT"}, {TDP_FLASHBUTTON, 0, L"FLASHBUTTON"}, {TDP_FLASHBUTTONGROUPMENU, 0, L"FLASHBUTTONGROUPMENU"}, {0, 0, L""} };
-static const MSSTYLES_CLASS_MAP classTaskbar[] = { +static const struct part_desc taskbar_desc[] = +{ {TBP_BACKGROUNDBOTTOM, 0, L"BACKGROUNDBOTTOM"}, {TBP_BACKGROUNDRIGHT, 0, L"BACKGROUNDRIGHT"}, {TBP_BACKGROUNDTOP, 0, L"BACKGROUNDTOP"}, @@ -1066,7 +1088,8 @@ static const MSSTYLES_CLASS_MAP classTaskbar[] = { {0, 0, L""} };
-static const MSSTYLES_CLASS_MAP classTaskdialog[] = { +static const struct part_desc taskdialog_desc[] = +{ {TDLG_PRIMARYPANEL, 0, L"PRIMARYPANEL"}, {TDLG_MAININSTRUCTIONPANE, 0, L"MAININSTRUCTIONPANE"}, {TDLG_MAINICON, 0, L"MAINICON"}, @@ -1100,7 +1123,8 @@ static const MSSTYLES_CLASS_MAP classTaskdialog[] = { {0, 0, L""} };
-static const MSSTYLES_CLASS_MAP classToolbar[] = { +static const struct part_desc toolbar_desc[] = +{ {TP_BUTTON, 0, L"BUTTON"}, {TP_BUTTON, TS_NORMAL, L"NORMAL"}, {TP_BUTTON, TS_HOT, L"HOT"}, @@ -1167,7 +1191,8 @@ static const MSSTYLES_CLASS_MAP classToolbar[] = { {0, 0, L""} };
-static const MSSTYLES_CLASS_MAP classTooltip[] = { +static const struct part_desc tooltip_desc[] = +{ {TTP_STANDARD, 0, L"STANDARD"}, {TTP_STANDARD, TTSS_NORMAL, L"NORMAL"}, {TTP_STANDARD, TTSS_LINK, L"LINK"}, @@ -1198,7 +1223,8 @@ static const MSSTYLES_CLASS_MAP classTooltip[] = { {0, 0, L""} };
-static const MSSTYLES_CLASS_MAP classTrackbar[] = { +static const struct part_desc trackbar_desc[] = +{ {TKP_TRACK, 0, L"TRACK"}, {TKP_TRACK, TRS_NORMAL, L"NORMAL"}, {TKP_TRACKVERT, 0, L"TRACKVERT"}, @@ -1246,13 +1272,15 @@ static const MSSTYLES_CLASS_MAP classTrackbar[] = { {0, 0, L""} };
-static const MSSTYLES_CLASS_MAP classTraynotify[] = { +static const struct part_desc traynotify_desc[] = +{ {TNP_BACKGROUND, 0, L"BACKGROUND"}, {TNP_ANIMBACKGROUND, 0, L"ANIMBACKGROUND"}, {0, 0, L""} };
-static const MSSTYLES_CLASS_MAP classTreeview[] = { +static const struct part_desc treeview_desc[] = +{ {TVP_TREEITEM, 0, L"TREEITEM"}, {TVP_TREEITEM, TREIS_NORMAL, L"NORMAL"}, {TVP_TREEITEM, TREIS_HOT, L"HOT"}, @@ -1270,7 +1298,8 @@ static const MSSTYLES_CLASS_MAP classTreeview[] = { {0, 0, L""} };
-static const MSSTYLES_CLASS_MAP classWindow[] = { +static const struct part_desc window_desc[] = +{ {WP_CAPTION, 0, L"CAPTION"}, {WP_CAPTION, CS_ACTIVE, L"ACTIVE"}, {WP_CAPTION, CS_INACTIVE, L"INACTIVE"}, @@ -1410,82 +1439,102 @@ static const MSSTYLES_CLASS_MAP classWindow[] = { };
/* Map class names to part/state maps */ -static const MSSTYLES_CLASS_NAME mapClass[] = { - {classButton, L"BUTTON"}, - {classClock, L"CLOCK"}, - {classCombobox, L"COMBOBOX"}, - {classEdit, L"EDIT"}, - {classExplorerbar, L"EXPLORERBAR"}, - {classHeader, L"HEADER"}, - {classListview, L"LISTVIEW"}, - {classMenu, L"MENU"}, - {classMenuband, L"MENUBAND"}, - {classNavigation, L"NAVIGATION"}, - {classPage, L"PAGE"}, - {classProgress, L"PROGRESS"}, - {classRebar, L"REBAR"}, - {classScrollbar, L"SCROLLBAR"}, - {classSpin, L"SPIN"}, - {classStartpanel, L"STARTPANEL"}, - {classStatus, L"STATUS"}, - {classTab, L"TAB"}, - {classTaskband, L"TASKBAND"}, - {classTaskbar, L"TASKBAR"}, - {classTaskdialog, L"TASKDIALOG"}, - {classToolbar, L"TOOLBAR"}, - {classTooltip, L"TOOLTIP"}, - {classTrackbar, L"TRACKBAR"}, - {classTraynotify, L"TRAYNOTIFY"}, - {classTreeview, L"TREEVIEW"}, - {classWindow, L"WINDOW"} +static const struct class_desc class_descs[] = +{ + {button_desc, L"BUTTON"}, + {clock_desc, L"CLOCK"}, + {combobox_desc, L"COMBOBOX"}, + {edit_desc, L"EDIT"}, + {explorerbar_desc, L"EXPLORERBAR"}, + {header_desc, L"HEADER"}, + {listview_desc, L"LISTVIEW"}, + {menu_desc, L"MENU"}, + {menuband_desc, L"MENUBAND"}, + {navigation_desc, L"NAVIGATION"}, + {page_desc, L"PAGE"}, + {progress_desc, L"PROGRESS"}, + {rebar_desc, L"REBAR"}, + {scrollbar_desc, L"SCROLLBAR"}, + {spin_desc, L"SPIN"}, + {startpanel_desc, L"STARTPANEL"}, + {status_desc, L"STATUS"}, + {tab_desc, L"TAB"}, + {taskband_desc, L"TASKBAND"}, + {taskbar_desc, L"TASKBAR"}, + {taskdialog_desc, L"TASKDIALOG"}, + {toolbar_desc, L"TOOLBAR"}, + {tooltip_desc, L"TOOLTIP"}, + {trackbar_desc, L"TRACKBAR"}, + {traynotify_desc, L"TRAYNOTIFY"}, + {treeview_desc, L"TREEVIEW"}, + {window_desc, L"WINDOW"}, + {0}, };
-BOOL MSSTYLES_LookupPartState(LPCWSTR pszClass, LPCWSTR pszPart, LPCWSTR pszState, int *iPartId, int *iStateId) +static BOOL lookup_class_part(const struct class_desc *desc, const WCHAR *part_name, const WCHAR *state_name, int *part_id, int *state_id) { - unsigned int i; - const MSSTYLES_CLASS_MAP *map; + const struct part_desc *item = desc->parts;
- *iPartId = 0; - *iStateId = 0; - for(i=0; i<ARRAY_SIZE(mapClass); i++) { - if(!lstrcmpiW(mapClass[i].pszClass, pszClass)) { - map = mapClass[i].lpMap; - if(pszPart) { - do { - if(map->dwStateID == 0 && !lstrcmpiW(map->szName, pszPart)) { - *iPartId = map->dwPartID; - break; - } - } while(*((++map)->szName)); + if (part_name) + { + do + { + if (item->state_id == 0 && !lstrcmpiW(item->part_name, part_name)) + { + *part_id = item->part_id; + break; } - if(pszState) { - if(pszPart && *iPartId == 0) { + item++; + } while (*item->part_name); + } + + if (state_name) + { + if (part_name && *part_id == 0) return FALSE; + + do + { + if (part_name) + { + if (item->part_id == *part_id && !lstrcmpiW(item->part_name, state_name)) + { + *state_id = item->state_id; break; } - do { - if(pszPart) { - if(map->dwPartID == *iPartId && !lstrcmpiW(map->szName, pszState)) { - *iStateId = map->dwStateID; - break; - } - } - else { - if(!lstrcmpiW(map->szName, pszState)) { - *iStateId = map->dwStateID; - break; - } - } - } while(*((++map)->szName)); } - break; - } - } - if(pszPart && *iPartId == 0) { - return FALSE; + else + { + if (!lstrcmpiW(item->part_name, state_name)) + { + *state_id = item->state_id; + break; + } + } + item++; + } while (*item->part_name); } - if(pszState && *iStateId == 0) { - return FALSE; + + if (part_name && *part_id == 0) return FALSE; + if (state_name && *state_id == 0) return FALSE; + return TRUE; +} + +BOOL MSSTYLES_LookupPartState(const WCHAR *class_name, const WCHAR *part_name, const WCHAR *state_name, int *part_id, int *state_id) +{ + const struct class_desc *item = class_descs; + + *part_id = 0; + *state_id = 0; + + while (*item->class_name) + { + if (!lstrcmpiW(item->class_name, class_name)) + return lookup_class_part(item, part_name, state_name, part_id, state_id); + item++; } + + if (part_name && *part_id == 0) return FALSE; + if (state_name && *state_id == 0) return FALSE; return TRUE; }