1 /* MS-Windows Engine (aka GTK-Wimp)
3 * Copyright (C) 2003, 2004 Raymond Penners <raymond@dotsphinx.com>
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Library General Public
7 * License as published by the Free Software Foundation; either
8 * version 2 of the License, or (at your option) any later version.
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Library General Public License for more details.
15 * You should have received a copy of the GNU Library General Public
16 * License along with this library; if not, write to the
17 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18 * Boston, MA 02111-1307, USA.
21 #define _WIN32_WINNT 0x0501
34 #ifdef BUILDING_STANDALONE
35 #include "gdk/gdkwin32.h"
37 #include "gdk/win32/gdkwin32.h"
40 #include <cairo-win32.h>
43 #include "xp_theme_defs.h"
45 #ifndef TMT_CAPTIONFONT
47 /* These aren't in mingw's "w32api" headers, nor in the Platform SDK
50 #define TMT_CAPTIONFONT 801
51 #define TMT_MENUFONT 803
52 #define TMT_STATUSFONT 804
53 #define TMT_MSGBOXFONT 805
58 #define TP_SEPARATOR 5
59 #define TP_SEPARATORVERT 6
61 /* GLOBALS LINEHORZ states */
66 /* GLOBAL LINEVERT states */
73 #define TKP_TRACKVERT 2
75 #define TKP_THUMBBOTTOM 4
76 #define TKP_THUMBTOP 5
77 #define TKP_THUMBVERT 6
78 #define TKP_THUMBLEFT 7
79 #define TKP_THUMBRIGHT 8
81 #define TKP_TICSVERT 10
88 #define MBI_DISABLED 4
89 #define MBI_DISABLEDHOT 5
90 #define MBI_DISABLEDPUSHED 6
92 #define MENU_POPUPGUTTER 13
93 #define MENU_POPUPITEM 14
94 #define MENU_POPUPSEPARATOR 15
96 static const LPCWSTR class_descriptors[] = {
97 L"Scrollbar", /* XP_THEME_CLASS_SCROLLBAR */
98 L"Button", /* XP_THEME_CLASS_BUTTON */
99 L"Header", /* XP_THEME_CLASS_HEADER */
100 L"ComboBox", /* XP_THEME_CLASS_COMBOBOX */
101 L"Tab", /* XP_THEME_CLASS_TAB */
102 L"Edit", /* XP_THEME_CLASS_EDIT */
103 L"TreeView", /* XP_THEME_CLASS_TREEVIEW */
104 L"Spin", /* XP_THEME_CLASS_SPIN */
105 L"Progress", /* XP_THEME_CLASS_PROGRESS */
106 L"Tooltip", /* XP_THEME_CLASS_TOOLTIP */
107 L"Rebar", /* XP_THEME_CLASS_REBAR */
108 L"Toolbar", /* XP_THEME_CLASS_TOOLBAR */
109 L"Globals", /* XP_THEME_CLASS_GLOBALS */
110 L"Menu", /* XP_THEME_CLASS_MENU */
111 L"Window", /* XP_THEME_CLASS_WINDOW */
112 L"Status", /* XP_THEME_CLASS_STATUS */
113 L"Trackbar" /* XP_THEME_CLASS_TRACKBAR */
116 static const short element_part_map[XP_THEME_ELEMENT__SIZEOF] = {
125 TABP_TABITEMLEFTEDGE,
126 TABP_TABITEMRIGHTEDGE,
156 MENU_POPUPITEM, /*MP_MENUITEM,*/
157 MENU_POPUPSEPARATOR, /*MP_SEPARATOR,*/
172 #define UXTHEME_DLL "uxtheme.dll"
174 static HINSTANCE uxtheme_dll = NULL;
175 static HTHEME open_themes[XP_THEME_CLASS__SIZEOF];
176 static gboolean use_xp_theme = FALSE;
178 typedef HRESULT (FAR PASCAL *GetThemeSysFontFunc) (HTHEME hTheme, int iFontID, OUT LOGFONTW *plf);
179 typedef int (FAR PASCAL *GetThemeSysSizeFunc) (HTHEME hTheme, int iSizeId);
180 typedef COLORREF (FAR PASCAL *GetThemeSysColorFunc) (HTHEME hTheme,
182 typedef HTHEME (FAR PASCAL *OpenThemeDataFunc) (HWND hwnd,
183 LPCWSTR pszClassList);
184 typedef HRESULT (FAR PASCAL *CloseThemeDataFunc) (HTHEME theme);
185 typedef HRESULT (FAR PASCAL *DrawThemeBackgroundFunc) (HTHEME hTheme, HDC hdc, int iPartId, int iStateId,
186 const RECT *pRect, const RECT *pClipRect);
187 typedef HRESULT (FAR PASCAL *EnableThemeDialogTextureFunc) (HWND hwnd,
189 typedef BOOL (FAR PASCAL *IsThemeActiveFunc) (VOID);
190 typedef BOOL (FAR PASCAL *IsAppThemedFunc) (VOID);
191 typedef BOOL (FAR PASCAL *IsThemeBackgroundPartiallyTransparentFunc) (HTHEME hTheme,
194 typedef HRESULT (FAR PASCAL *DrawThemeParentBackgroundFunc) (HWND hwnd,
197 typedef HRESULT (FAR PASCAL *GetThemePartSizeFunc) (HTHEME hTheme,
205 static GetThemeSysFontFunc get_theme_sys_font_func = NULL;
206 static GetThemeSysColorFunc get_theme_sys_color_func = NULL;
207 static GetThemeSysSizeFunc get_theme_sys_metric_func = NULL;
208 static OpenThemeDataFunc open_theme_data_func = NULL;
209 static CloseThemeDataFunc close_theme_data_func = NULL;
210 static DrawThemeBackgroundFunc draw_theme_background_func = NULL;
211 static EnableThemeDialogTextureFunc enable_theme_dialog_texture_func = NULL;
212 static IsThemeActiveFunc is_theme_active_func = NULL;
213 static IsAppThemedFunc is_app_themed_func = NULL;
214 static IsThemeBackgroundPartiallyTransparentFunc is_theme_partially_transparent_func = NULL;
215 static DrawThemeParentBackgroundFunc draw_theme_parent_background_func = NULL;
216 static GetThemePartSizeFunc get_theme_part_size_func = NULL;
219 xp_theme_close_open_handles (void)
223 for (i = 0; i < XP_THEME_CLASS__SIZEOF; i++)
227 close_theme_data_func (open_themes[i]);
228 open_themes[i] = NULL;
243 memset (open_themes, 0, sizeof (open_themes));
245 n = GetSystemDirectory (&dummy, 0);
250 buf = g_malloc (n + 1 + strlen (UXTHEME_DLL));
251 k = GetSystemDirectory (buf, n);
259 if (!G_IS_DIR_SEPARATOR (buf[strlen (buf) -1]))
260 strcat (buf, G_DIR_SEPARATOR_S);
261 strcat (buf, UXTHEME_DLL);
263 uxtheme_dll = LoadLibrary (buf);
269 is_app_themed_func = (IsAppThemedFunc) GetProcAddress (uxtheme_dll, "IsAppThemed");
271 if (is_app_themed_func)
273 is_theme_active_func = (IsThemeActiveFunc) GetProcAddress (uxtheme_dll, "IsThemeActive");
274 open_theme_data_func = (OpenThemeDataFunc) GetProcAddress (uxtheme_dll, "OpenThemeData");
275 close_theme_data_func = (CloseThemeDataFunc) GetProcAddress (uxtheme_dll, "CloseThemeData");
276 draw_theme_background_func = (DrawThemeBackgroundFunc) GetProcAddress (uxtheme_dll, "DrawThemeBackground");
277 enable_theme_dialog_texture_func = (EnableThemeDialogTextureFunc) GetProcAddress (uxtheme_dll, "EnableThemeDialogTexture");
278 get_theme_sys_font_func = (GetThemeSysFontFunc) GetProcAddress (uxtheme_dll, "GetThemeSysFont");
279 get_theme_sys_color_func = (GetThemeSysColorFunc) GetProcAddress (uxtheme_dll, "GetThemeSysColor");
280 get_theme_sys_metric_func = (GetThemeSysSizeFunc) GetProcAddress (uxtheme_dll, "GetThemeSysSize");
281 is_theme_partially_transparent_func = (IsThemeBackgroundPartiallyTransparentFunc) GetProcAddress (uxtheme_dll, "IsThemeBackgroundPartiallyTransparent");
282 draw_theme_parent_background_func = (DrawThemeParentBackgroundFunc) GetProcAddress (uxtheme_dll, "DrawThemeParentBackground");
283 get_theme_part_size_func = (GetThemePartSizeFunc) GetProcAddress (uxtheme_dll, "GetThemePartSize");
286 if (is_app_themed_func && is_theme_active_func)
288 use_xp_theme = (is_app_themed_func () && is_theme_active_func ());
292 use_xp_theme = FALSE;
297 xp_theme_reset (void)
299 xp_theme_close_open_handles ();
301 if (is_app_themed_func && is_theme_active_func)
303 use_xp_theme = (is_app_themed_func () && is_theme_active_func ());
307 use_xp_theme = FALSE;
317 xp_theme_close_open_handles ();
319 FreeLibrary (uxtheme_dll);
321 use_xp_theme = FALSE;
323 is_app_themed_func = NULL;
324 is_theme_active_func = NULL;
325 open_theme_data_func = NULL;
326 close_theme_data_func = NULL;
327 draw_theme_background_func = NULL;
328 enable_theme_dialog_texture_func = NULL;
329 get_theme_sys_font_func = NULL;
330 get_theme_sys_color_func = NULL;
331 get_theme_sys_metric_func = NULL;
332 is_theme_partially_transparent_func = NULL;
333 draw_theme_parent_background_func = NULL;
334 get_theme_part_size_func = NULL;
338 xp_theme_get_handle_by_class (XpThemeClass klazz)
340 if (!open_themes[klazz] && open_theme_data_func)
342 open_themes[klazz] = open_theme_data_func (NULL, class_descriptors[klazz]);
345 return open_themes[klazz];
349 xp_theme_get_handle_by_element (XpThemeElement element)
352 XpThemeClass klazz = XP_THEME_CLASS__SIZEOF;
356 case XP_THEME_ELEMENT_TOOLTIP:
357 klazz = XP_THEME_CLASS_TOOLTIP;
360 case XP_THEME_ELEMENT_REBAR:
361 case XP_THEME_ELEMENT_REBAR_GRIPPER_H:
362 case XP_THEME_ELEMENT_REBAR_GRIPPER_V:
363 case XP_THEME_ELEMENT_REBAR_CHEVRON:
364 klazz = XP_THEME_CLASS_REBAR;
367 case XP_THEME_ELEMENT_SCALE_TROUGH_H:
368 case XP_THEME_ELEMENT_SCALE_TROUGH_V:
369 case XP_THEME_ELEMENT_SCALE_SLIDER_H:
370 case XP_THEME_ELEMENT_SCALE_SLIDER_V:
371 case XP_THEME_ELEMENT_SCALE_TICS_H:
372 case XP_THEME_ELEMENT_SCALE_TICS_V:
373 klazz = XP_THEME_CLASS_TRACKBAR;
376 case XP_THEME_ELEMENT_STATUS_GRIPPER:
377 case XP_THEME_ELEMENT_STATUS_PANE:
378 klazz = XP_THEME_CLASS_STATUS;
381 case XP_THEME_ELEMENT_TOOLBAR_BUTTON:
382 case XP_THEME_ELEMENT_TOOLBAR_SEPARATOR_H:
383 case XP_THEME_ELEMENT_TOOLBAR_SEPARATOR_V:
384 klazz = XP_THEME_CLASS_TOOLBAR;
387 case XP_THEME_ELEMENT_MENU_ITEM:
388 case XP_THEME_ELEMENT_MENU_SEPARATOR:
389 klazz = XP_THEME_CLASS_MENU;
392 case XP_THEME_ELEMENT_PRESSED_CHECKBOX:
393 case XP_THEME_ELEMENT_INCONSISTENT_CHECKBOX:
394 case XP_THEME_ELEMENT_CHECKBOX:
395 case XP_THEME_ELEMENT_BUTTON:
396 case XP_THEME_ELEMENT_DEFAULT_BUTTON:
397 case XP_THEME_ELEMENT_PRESSED_RADIO_BUTTON:
398 case XP_THEME_ELEMENT_RADIO_BUTTON:
399 klazz = XP_THEME_CLASS_BUTTON;
402 case XP_THEME_ELEMENT_LIST_HEADER:
403 klazz = XP_THEME_CLASS_HEADER;
406 case XP_THEME_ELEMENT_COMBOBUTTON:
407 klazz = XP_THEME_CLASS_COMBOBOX;
410 case XP_THEME_ELEMENT_BODY:
411 case XP_THEME_ELEMENT_TAB_ITEM:
412 case XP_THEME_ELEMENT_TAB_ITEM_LEFT_EDGE:
413 case XP_THEME_ELEMENT_TAB_ITEM_RIGHT_EDGE:
414 case XP_THEME_ELEMENT_TAB_PANE:
415 klazz = XP_THEME_CLASS_TAB;
418 case XP_THEME_ELEMENT_SCROLLBAR_V:
419 case XP_THEME_ELEMENT_SCROLLBAR_H:
420 case XP_THEME_ELEMENT_ARROW_UP:
421 case XP_THEME_ELEMENT_ARROW_DOWN:
422 case XP_THEME_ELEMENT_ARROW_LEFT:
423 case XP_THEME_ELEMENT_ARROW_RIGHT:
424 case XP_THEME_ELEMENT_SCROLLBAR_GRIPPER_V:
425 case XP_THEME_ELEMENT_SCROLLBAR_GRIPPER_H:
426 case XP_THEME_ELEMENT_TROUGH_V:
427 case XP_THEME_ELEMENT_TROUGH_H:
428 klazz = XP_THEME_CLASS_SCROLLBAR;
431 case XP_THEME_ELEMENT_EDIT_TEXT:
432 klazz = XP_THEME_CLASS_EDIT;
435 case XP_THEME_ELEMENT_SPIN_BUTTON_UP:
436 case XP_THEME_ELEMENT_SPIN_BUTTON_DOWN:
437 klazz = XP_THEME_CLASS_SPIN;
440 case XP_THEME_ELEMENT_PROGRESS_BAR_H:
441 case XP_THEME_ELEMENT_PROGRESS_BAR_V:
442 case XP_THEME_ELEMENT_PROGRESS_TROUGH_H:
443 case XP_THEME_ELEMENT_PROGRESS_TROUGH_V:
444 klazz = XP_THEME_CLASS_PROGRESS;
447 case XP_THEME_ELEMENT_TREEVIEW_EXPANDER_OPENED:
448 case XP_THEME_ELEMENT_TREEVIEW_EXPANDER_CLOSED:
449 klazz = XP_THEME_CLASS_TREEVIEW;
452 case XP_THEME_ELEMENT_LINE_H:
453 case XP_THEME_ELEMENT_LINE_V:
454 klazz = XP_THEME_CLASS_GLOBALS;
461 if (klazz != XP_THEME_CLASS__SIZEOF)
463 ret = xp_theme_get_handle_by_class (klazz);
470 xp_theme_map_gtk_state (XpThemeElement element, GtkStateType state)
476 case XP_THEME_ELEMENT_TOOLTIP:
480 case XP_THEME_ELEMENT_REBAR:
484 case XP_THEME_ELEMENT_REBAR_GRIPPER_H:
485 case XP_THEME_ELEMENT_REBAR_GRIPPER_V:
489 case XP_THEME_ELEMENT_STATUS_GRIPPER:
490 case XP_THEME_ELEMENT_STATUS_PANE:
494 case XP_THEME_ELEMENT_REBAR_CHEVRON:
497 case GTK_STATE_PRELIGHT:
501 case GTK_STATE_SELECTED:
502 case GTK_STATE_ACTIVE:
511 case XP_THEME_ELEMENT_TOOLBAR_SEPARATOR_H:
512 case XP_THEME_ELEMENT_TOOLBAR_SEPARATOR_V:
516 case XP_THEME_ELEMENT_TOOLBAR_BUTTON:
519 case GTK_STATE_ACTIVE:
523 case GTK_STATE_PRELIGHT:
527 case GTK_STATE_INSENSITIVE:
536 case XP_THEME_ELEMENT_TAB_PANE:
540 case XP_THEME_ELEMENT_TAB_ITEM_LEFT_EDGE:
541 case XP_THEME_ELEMENT_TAB_ITEM_RIGHT_EDGE:
542 case XP_THEME_ELEMENT_TAB_ITEM:
545 case GTK_STATE_PRELIGHT:
549 case GTK_STATE_INSENSITIVE:
553 case GTK_STATE_SELECTED:
554 case GTK_STATE_ACTIVE:
563 case XP_THEME_ELEMENT_EDIT_TEXT:
566 case GTK_STATE_PRELIGHT:
570 case GTK_STATE_INSENSITIVE:
574 case GTK_STATE_SELECTED:
575 case GTK_STATE_ACTIVE:
581 case XP_THEME_ELEMENT_TROUGH_H:
582 case XP_THEME_ELEMENT_TROUGH_V:
586 case XP_THEME_ELEMENT_SCROLLBAR_H:
587 case XP_THEME_ELEMENT_SCROLLBAR_V:
590 case GTK_STATE_SELECTED:
591 case GTK_STATE_ACTIVE:
595 case GTK_STATE_PRELIGHT:
599 case GTK_STATE_INSENSITIVE:
600 ret = SCRBS_DISABLED;
608 case XP_THEME_ELEMENT_ARROW_DOWN:
611 case GTK_STATE_ACTIVE:
612 ret = ABS_DOWNPRESSED;
615 case GTK_STATE_PRELIGHT:
619 case GTK_STATE_INSENSITIVE:
620 ret = ABS_DOWNDISABLED;
624 ret = ABS_DOWNNORMAL;
628 case XP_THEME_ELEMENT_ARROW_UP:
631 case GTK_STATE_ACTIVE:
635 case GTK_STATE_PRELIGHT:
639 case GTK_STATE_INSENSITIVE:
640 ret = ABS_UPDISABLED;
648 case XP_THEME_ELEMENT_ARROW_LEFT:
651 case GTK_STATE_ACTIVE:
652 ret = ABS_LEFTPRESSED;
655 case GTK_STATE_PRELIGHT:
659 case GTK_STATE_INSENSITIVE:
660 ret = ABS_LEFTDISABLED;
664 ret = ABS_LEFTNORMAL;
668 case XP_THEME_ELEMENT_ARROW_RIGHT:
671 case GTK_STATE_ACTIVE:
672 ret = ABS_RIGHTPRESSED;
675 case GTK_STATE_PRELIGHT:
679 case GTK_STATE_INSENSITIVE:
680 ret = ABS_RIGHTDISABLED;
684 ret = ABS_RIGHTNORMAL;
688 case XP_THEME_ELEMENT_CHECKBOX:
689 case XP_THEME_ELEMENT_RADIO_BUTTON:
692 case GTK_STATE_SELECTED:
693 ret = CBS_UNCHECKEDPRESSED;
696 case GTK_STATE_PRELIGHT:
697 ret = CBS_UNCHECKEDHOT;
700 case GTK_STATE_INSENSITIVE:
701 ret = CBS_UNCHECKEDDISABLED;
705 ret = CBS_UNCHECKEDNORMAL;
709 case XP_THEME_ELEMENT_INCONSISTENT_CHECKBOX:
712 case GTK_STATE_SELECTED:
713 ret = CBS_MIXEDPRESSED;
716 case GTK_STATE_PRELIGHT:
720 case GTK_STATE_INSENSITIVE:
721 ret = CBS_MIXEDDISABLED;
725 ret = CBS_MIXEDNORMAL;
729 case XP_THEME_ELEMENT_PRESSED_CHECKBOX:
730 case XP_THEME_ELEMENT_PRESSED_RADIO_BUTTON:
733 case GTK_STATE_SELECTED:
734 ret = CBS_CHECKEDPRESSED;
737 case GTK_STATE_PRELIGHT:
738 ret = CBS_CHECKEDHOT;
741 case GTK_STATE_INSENSITIVE:
742 ret = CBS_CHECKEDDISABLED;
746 ret = CBS_CHECKEDNORMAL;
750 case XP_THEME_ELEMENT_DEFAULT_BUTTON:
753 case GTK_STATE_ACTIVE:
757 case GTK_STATE_PRELIGHT:
761 case GTK_STATE_INSENSITIVE:
770 case XP_THEME_ELEMENT_SPIN_BUTTON_DOWN:
773 case GTK_STATE_ACTIVE:
777 case GTK_STATE_PRELIGHT:
781 case GTK_STATE_INSENSITIVE:
790 case XP_THEME_ELEMENT_SPIN_BUTTON_UP:
793 case GTK_STATE_ACTIVE:
797 case GTK_STATE_PRELIGHT:
801 case GTK_STATE_INSENSITIVE:
810 case XP_THEME_ELEMENT_TREEVIEW_EXPANDER_OPENED:
814 case XP_THEME_ELEMENT_TREEVIEW_EXPANDER_CLOSED:
818 case XP_THEME_ELEMENT_PROGRESS_BAR_H:
819 case XP_THEME_ELEMENT_PROGRESS_BAR_V:
820 case XP_THEME_ELEMENT_PROGRESS_TROUGH_H:
821 case XP_THEME_ELEMENT_PROGRESS_TROUGH_V:
825 case XP_THEME_ELEMENT_MENU_SEPARATOR:
829 case XP_THEME_ELEMENT_MENU_ITEM:
832 case GTK_STATE_SELECTED:
836 case GTK_STATE_PRELIGHT:
840 case GTK_STATE_INSENSITIVE:
849 case XP_THEME_ELEMENT_LINE_H:
852 /* LHS_FLAT, LHS_RAISED, LHS_SUNKEN */
858 case XP_THEME_ELEMENT_LINE_V:
861 /* LVS_FLAT, LVS_RAISED, LVS_SUNKEN */
867 case XP_THEME_ELEMENT_SCALE_TROUGH_H:
868 case XP_THEME_ELEMENT_SCALE_TROUGH_V:
875 case GTK_STATE_ACTIVE:
879 case GTK_STATE_PRELIGHT:
883 case GTK_STATE_INSENSITIVE:
896 get_window_dc (GtkStyle *style,
898 GtkStateType state_type,
899 XpDCInfo *dc_info_out,
900 gint x, gint y, gint width, gint height,
904 cairo_surface_t *surface;
906 gint x_offset = 0, y_offset = 0;
909 dc_info_out->cr = NULL;
910 dc_info_out->dc = NULL;
912 cr = gdk_cairo_create (window);
916 surface = cairo_get_target (cr);
917 cairo_surface_get_device_offset (surface, &x_off, &y_off);
918 cairo_surface_flush (surface);
920 dc = cairo_win32_surface_get_dc (surface);
927 rect_out->left = x - x_offset;
928 rect_out->top = y - y_offset;
929 rect_out->right = rect_out->left + width;
930 rect_out->bottom = rect_out->top + height;
932 dc_info_out->cr = cr;
933 dc_info_out->dc = dc;
934 dc_info_out->x_offset = x_offset;
935 dc_info_out->y_offset = y_offset;
941 release_window_dc (XpDCInfo *dc_info)
943 if (!dc_info->cr || !dc_info->dc)
946 ReleaseDC (NULL, dc_info->dc);
947 cairo_destroy (dc_info->cr);
954 xp_theme_draw (GdkWindow *win, XpThemeElement element, GtkStyle *style,
955 int x, int y, int width, int height,
956 GtkStateType state_type, GdkRectangle *area)
959 RECT rect, clip, *pClip;
964 if (!xp_theme_is_drawable (element))
967 theme = xp_theme_get_handle_by_element (element);
971 /* FIXME: Recheck its function */
972 if (GDK_IS_WINDOW (win) && gdk_win32_window_is_win32 (win))
973 enable_theme_dialog_texture_func (GDK_WINDOW_HWND (win), ETDT_ENABLETAB);
975 dc = get_window_dc (style, win, state_type, &dc_info,
983 clip.left = area->x - dc_info.x_offset;
984 clip.top = area->y - dc_info.y_offset;
985 clip.right = clip.left + area->width;
986 clip.bottom = clip.top + area->height;
995 part_state = xp_theme_map_gtk_state (element, state_type);
997 /* Support transparency */
998 if (is_theme_partially_transparent_func (theme, element_part_map[element], part_state))
999 draw_theme_parent_background_func (GDK_WINDOW_HWND (win), dc, pClip);
1001 draw_theme_background_func (theme, dc, element_part_map[element],
1002 part_state, &rect, pClip);
1004 release_window_dc (&dc_info);
1010 xp_theme_is_active (void)
1012 return use_xp_theme;
1016 xp_theme_is_drawable (XpThemeElement element)
1018 if (xp_theme_is_active ())
1019 return (xp_theme_get_handle_by_element (element) != NULL);
1025 xp_theme_get_element_dimensions (XpThemeElement element,
1026 GtkStateType state_type,
1033 if (!xp_theme_is_active ())
1036 theme = xp_theme_get_handle_by_element (element);
1040 part_state = xp_theme_map_gtk_state (element, state_type);
1042 get_theme_part_size_func (theme,
1044 element_part_map[element],
1053 if (element == XP_THEME_ELEMENT_MENU_ITEM ||
1054 element == XP_THEME_ELEMENT_MENU_SEPARATOR)
1058 get_theme_part_size_func (theme,
1066 *cx += gutter_size.cx * 2;
1067 *cy += gutter_size.cy * 2;
1074 xp_theme_get_system_font (XpThemeClass klazz, XpThemeFont fontId,
1077 if (xp_theme_is_active () && get_theme_sys_font_func != NULL)
1079 HTHEME theme = xp_theme_get_handle_by_class (klazz);
1087 case XP_THEME_FONT_CAPTION:
1088 themeFont = TMT_CAPTIONFONT;
1091 case XP_THEME_FONT_MENU:
1092 themeFont = TMT_MENUFONT;
1095 case XP_THEME_FONT_STATUS:
1096 themeFont = TMT_STATUSFONT;
1099 case XP_THEME_FONT_MESSAGE:
1101 themeFont = TMT_MSGBOXFONT;
1105 /* if theme is NULL, it will just return the GetSystemFont()
1107 return ((*get_theme_sys_font_func) (theme, themeFont, lf) == S_OK);
1114 xp_theme_get_system_color (XpThemeClass klazz, int colorId,
1117 if (xp_theme_is_active () && get_theme_sys_color_func != NULL)
1119 HTHEME theme = xp_theme_get_handle_by_class (klazz);
1121 /* if theme is NULL, it will just return the GetSystemColor()
1123 *pColor = (*get_theme_sys_color_func) (theme, colorId);
1131 xp_theme_get_system_metric (XpThemeClass klazz, int metricId, OUT int *pVal)
1133 if (xp_theme_is_active () && get_theme_sys_metric_func != NULL)
1135 HTHEME theme = xp_theme_get_handle_by_class (klazz);
1137 /* if theme is NULL, it will just return the GetSystemMetrics()
1139 *pVal = (*get_theme_sys_metric_func) (theme, metricId);