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, see <http://www.gnu.org/licenses/>.
19 #define _WIN32_WINNT 0x0501
32 #ifdef BUILDING_STANDALONE
33 #include "gdk/gdkwin32.h"
35 #include "gdk/win32/gdkwin32.h"
38 #include <cairo-win32.h>
41 #include "xp_theme_defs.h"
43 #ifndef TMT_CAPTIONFONT
45 /* These aren't in mingw's "w32api" headers, nor in the Platform SDK
48 #define TMT_CAPTIONFONT 801
49 #define TMT_MENUFONT 803
50 #define TMT_STATUSFONT 804
51 #define TMT_MSGBOXFONT 805
56 #define TP_SEPARATOR 5
57 #define TP_SEPARATORVERT 6
59 /* GLOBALS LINEHORZ states */
64 /* GLOBAL LINEVERT states */
71 #define TKP_TRACKVERT 2
73 #define TKP_THUMBBOTTOM 4
74 #define TKP_THUMBTOP 5
75 #define TKP_THUMBVERT 6
76 #define TKP_THUMBLEFT 7
77 #define TKP_THUMBRIGHT 8
79 #define TKP_TICSVERT 10
86 #define MBI_DISABLED 4
87 #define MBI_DISABLEDHOT 5
88 #define MBI_DISABLEDPUSHED 6
90 #define MENU_POPUPGUTTER 13
91 #define MENU_POPUPITEM 14
92 #define MENU_POPUPSEPARATOR 15
94 static const LPCWSTR class_descriptors[] = {
95 L"Scrollbar", /* XP_THEME_CLASS_SCROLLBAR */
96 L"Button", /* XP_THEME_CLASS_BUTTON */
97 L"Header", /* XP_THEME_CLASS_HEADER */
98 L"ComboBox", /* XP_THEME_CLASS_COMBOBOX */
99 L"Tab", /* XP_THEME_CLASS_TAB */
100 L"Edit", /* XP_THEME_CLASS_EDIT */
101 L"TreeView", /* XP_THEME_CLASS_TREEVIEW */
102 L"Spin", /* XP_THEME_CLASS_SPIN */
103 L"Progress", /* XP_THEME_CLASS_PROGRESS */
104 L"Tooltip", /* XP_THEME_CLASS_TOOLTIP */
105 L"Rebar", /* XP_THEME_CLASS_REBAR */
106 L"Toolbar", /* XP_THEME_CLASS_TOOLBAR */
107 L"Globals", /* XP_THEME_CLASS_GLOBALS */
108 L"Menu", /* XP_THEME_CLASS_MENU */
109 L"Window", /* XP_THEME_CLASS_WINDOW */
110 L"Status", /* XP_THEME_CLASS_STATUS */
111 L"Trackbar" /* XP_THEME_CLASS_TRACKBAR */
114 static const short element_part_map[XP_THEME_ELEMENT__SIZEOF] = {
123 TABP_TABITEMLEFTEDGE,
124 TABP_TABITEMRIGHTEDGE,
154 MENU_POPUPITEM, /*MP_MENUITEM,*/
155 MENU_POPUPSEPARATOR, /*MP_SEPARATOR,*/
170 #define UXTHEME_DLL "uxtheme.dll"
172 static HINSTANCE uxtheme_dll = NULL;
173 static HTHEME open_themes[XP_THEME_CLASS__SIZEOF];
174 static gboolean use_xp_theme = FALSE;
176 typedef HRESULT (FAR PASCAL *GetThemeSysFontFunc) (HTHEME hTheme, int iFontID, OUT LOGFONTW *plf);
177 typedef int (FAR PASCAL *GetThemeSysSizeFunc) (HTHEME hTheme, int iSizeId);
178 typedef COLORREF (FAR PASCAL *GetThemeSysColorFunc) (HTHEME hTheme,
180 typedef HTHEME (FAR PASCAL *OpenThemeDataFunc) (HWND hwnd,
181 LPCWSTR pszClassList);
182 typedef HRESULT (FAR PASCAL *CloseThemeDataFunc) (HTHEME theme);
183 typedef HRESULT (FAR PASCAL *DrawThemeBackgroundFunc) (HTHEME hTheme, HDC hdc, int iPartId, int iStateId,
184 const RECT *pRect, const RECT *pClipRect);
185 typedef HRESULT (FAR PASCAL *EnableThemeDialogTextureFunc) (HWND hwnd,
187 typedef BOOL (FAR PASCAL *IsThemeActiveFunc) (VOID);
188 typedef BOOL (FAR PASCAL *IsAppThemedFunc) (VOID);
189 typedef BOOL (FAR PASCAL *IsThemeBackgroundPartiallyTransparentFunc) (HTHEME hTheme,
192 typedef HRESULT (FAR PASCAL *DrawThemeParentBackgroundFunc) (HWND hwnd,
195 typedef HRESULT (FAR PASCAL *GetThemePartSizeFunc) (HTHEME hTheme,
203 static GetThemeSysFontFunc get_theme_sys_font_func = NULL;
204 static GetThemeSysColorFunc get_theme_sys_color_func = NULL;
205 static GetThemeSysSizeFunc get_theme_sys_metric_func = NULL;
206 static OpenThemeDataFunc open_theme_data_func = NULL;
207 static CloseThemeDataFunc close_theme_data_func = NULL;
208 static DrawThemeBackgroundFunc draw_theme_background_func = NULL;
209 static EnableThemeDialogTextureFunc enable_theme_dialog_texture_func = NULL;
210 static IsThemeActiveFunc is_theme_active_func = NULL;
211 static IsAppThemedFunc is_app_themed_func = NULL;
212 static IsThemeBackgroundPartiallyTransparentFunc is_theme_partially_transparent_func = NULL;
213 static DrawThemeParentBackgroundFunc draw_theme_parent_background_func = NULL;
214 static GetThemePartSizeFunc get_theme_part_size_func = NULL;
217 xp_theme_close_open_handles (void)
221 for (i = 0; i < XP_THEME_CLASS__SIZEOF; i++)
225 close_theme_data_func (open_themes[i]);
226 open_themes[i] = NULL;
241 memset (open_themes, 0, sizeof (open_themes));
243 n = GetSystemDirectory (&dummy, 0);
248 buf = g_malloc (n + 1 + strlen (UXTHEME_DLL));
249 k = GetSystemDirectory (buf, n);
257 if (!G_IS_DIR_SEPARATOR (buf[strlen (buf) -1]))
258 strcat (buf, G_DIR_SEPARATOR_S);
259 strcat (buf, UXTHEME_DLL);
261 uxtheme_dll = LoadLibrary (buf);
267 is_app_themed_func = (IsAppThemedFunc) GetProcAddress (uxtheme_dll, "IsAppThemed");
269 if (is_app_themed_func)
271 is_theme_active_func = (IsThemeActiveFunc) GetProcAddress (uxtheme_dll, "IsThemeActive");
272 open_theme_data_func = (OpenThemeDataFunc) GetProcAddress (uxtheme_dll, "OpenThemeData");
273 close_theme_data_func = (CloseThemeDataFunc) GetProcAddress (uxtheme_dll, "CloseThemeData");
274 draw_theme_background_func = (DrawThemeBackgroundFunc) GetProcAddress (uxtheme_dll, "DrawThemeBackground");
275 enable_theme_dialog_texture_func = (EnableThemeDialogTextureFunc) GetProcAddress (uxtheme_dll, "EnableThemeDialogTexture");
276 get_theme_sys_font_func = (GetThemeSysFontFunc) GetProcAddress (uxtheme_dll, "GetThemeSysFont");
277 get_theme_sys_color_func = (GetThemeSysColorFunc) GetProcAddress (uxtheme_dll, "GetThemeSysColor");
278 get_theme_sys_metric_func = (GetThemeSysSizeFunc) GetProcAddress (uxtheme_dll, "GetThemeSysSize");
279 is_theme_partially_transparent_func = (IsThemeBackgroundPartiallyTransparentFunc) GetProcAddress (uxtheme_dll, "IsThemeBackgroundPartiallyTransparent");
280 draw_theme_parent_background_func = (DrawThemeParentBackgroundFunc) GetProcAddress (uxtheme_dll, "DrawThemeParentBackground");
281 get_theme_part_size_func = (GetThemePartSizeFunc) GetProcAddress (uxtheme_dll, "GetThemePartSize");
284 if (is_app_themed_func && is_theme_active_func)
286 use_xp_theme = (is_app_themed_func () && is_theme_active_func ());
290 use_xp_theme = FALSE;
295 xp_theme_reset (void)
297 xp_theme_close_open_handles ();
299 if (is_app_themed_func && is_theme_active_func)
301 use_xp_theme = (is_app_themed_func () && is_theme_active_func ());
305 use_xp_theme = FALSE;
315 xp_theme_close_open_handles ();
317 FreeLibrary (uxtheme_dll);
319 use_xp_theme = FALSE;
321 is_app_themed_func = NULL;
322 is_theme_active_func = NULL;
323 open_theme_data_func = NULL;
324 close_theme_data_func = NULL;
325 draw_theme_background_func = NULL;
326 enable_theme_dialog_texture_func = NULL;
327 get_theme_sys_font_func = NULL;
328 get_theme_sys_color_func = NULL;
329 get_theme_sys_metric_func = NULL;
330 is_theme_partially_transparent_func = NULL;
331 draw_theme_parent_background_func = NULL;
332 get_theme_part_size_func = NULL;
336 xp_theme_get_handle_by_class (XpThemeClass klazz)
338 if (!open_themes[klazz] && open_theme_data_func)
340 open_themes[klazz] = open_theme_data_func (NULL, class_descriptors[klazz]);
343 return open_themes[klazz];
347 xp_theme_get_handle_by_element (XpThemeElement element)
350 XpThemeClass klazz = XP_THEME_CLASS__SIZEOF;
354 case XP_THEME_ELEMENT_TOOLTIP:
355 klazz = XP_THEME_CLASS_TOOLTIP;
358 case XP_THEME_ELEMENT_REBAR:
359 case XP_THEME_ELEMENT_REBAR_GRIPPER_H:
360 case XP_THEME_ELEMENT_REBAR_GRIPPER_V:
361 case XP_THEME_ELEMENT_REBAR_CHEVRON:
362 klazz = XP_THEME_CLASS_REBAR;
365 case XP_THEME_ELEMENT_SCALE_TROUGH_H:
366 case XP_THEME_ELEMENT_SCALE_TROUGH_V:
367 case XP_THEME_ELEMENT_SCALE_SLIDER_H:
368 case XP_THEME_ELEMENT_SCALE_SLIDER_V:
369 case XP_THEME_ELEMENT_SCALE_TICS_H:
370 case XP_THEME_ELEMENT_SCALE_TICS_V:
371 klazz = XP_THEME_CLASS_TRACKBAR;
374 case XP_THEME_ELEMENT_STATUS_GRIPPER:
375 case XP_THEME_ELEMENT_STATUS_PANE:
376 klazz = XP_THEME_CLASS_STATUS;
379 case XP_THEME_ELEMENT_TOOLBAR_BUTTON:
380 case XP_THEME_ELEMENT_TOOLBAR_SEPARATOR_H:
381 case XP_THEME_ELEMENT_TOOLBAR_SEPARATOR_V:
382 klazz = XP_THEME_CLASS_TOOLBAR;
385 case XP_THEME_ELEMENT_MENU_ITEM:
386 case XP_THEME_ELEMENT_MENU_SEPARATOR:
387 klazz = XP_THEME_CLASS_MENU;
390 case XP_THEME_ELEMENT_PRESSED_CHECKBOX:
391 case XP_THEME_ELEMENT_INCONSISTENT_CHECKBOX:
392 case XP_THEME_ELEMENT_CHECKBOX:
393 case XP_THEME_ELEMENT_BUTTON:
394 case XP_THEME_ELEMENT_DEFAULT_BUTTON:
395 case XP_THEME_ELEMENT_PRESSED_RADIO_BUTTON:
396 case XP_THEME_ELEMENT_RADIO_BUTTON:
397 klazz = XP_THEME_CLASS_BUTTON;
400 case XP_THEME_ELEMENT_LIST_HEADER:
401 klazz = XP_THEME_CLASS_HEADER;
404 case XP_THEME_ELEMENT_COMBOBUTTON:
405 klazz = XP_THEME_CLASS_COMBOBOX;
408 case XP_THEME_ELEMENT_BODY:
409 case XP_THEME_ELEMENT_TAB_ITEM:
410 case XP_THEME_ELEMENT_TAB_ITEM_LEFT_EDGE:
411 case XP_THEME_ELEMENT_TAB_ITEM_RIGHT_EDGE:
412 case XP_THEME_ELEMENT_TAB_PANE:
413 klazz = XP_THEME_CLASS_TAB;
416 case XP_THEME_ELEMENT_SCROLLBAR_V:
417 case XP_THEME_ELEMENT_SCROLLBAR_H:
418 case XP_THEME_ELEMENT_ARROW_UP:
419 case XP_THEME_ELEMENT_ARROW_DOWN:
420 case XP_THEME_ELEMENT_ARROW_LEFT:
421 case XP_THEME_ELEMENT_ARROW_RIGHT:
422 case XP_THEME_ELEMENT_SCROLLBAR_GRIPPER_V:
423 case XP_THEME_ELEMENT_SCROLLBAR_GRIPPER_H:
424 case XP_THEME_ELEMENT_TROUGH_V:
425 case XP_THEME_ELEMENT_TROUGH_H:
426 klazz = XP_THEME_CLASS_SCROLLBAR;
429 case XP_THEME_ELEMENT_EDIT_TEXT:
430 klazz = XP_THEME_CLASS_EDIT;
433 case XP_THEME_ELEMENT_SPIN_BUTTON_UP:
434 case XP_THEME_ELEMENT_SPIN_BUTTON_DOWN:
435 klazz = XP_THEME_CLASS_SPIN;
438 case XP_THEME_ELEMENT_PROGRESS_BAR_H:
439 case XP_THEME_ELEMENT_PROGRESS_BAR_V:
440 case XP_THEME_ELEMENT_PROGRESS_TROUGH_H:
441 case XP_THEME_ELEMENT_PROGRESS_TROUGH_V:
442 klazz = XP_THEME_CLASS_PROGRESS;
445 case XP_THEME_ELEMENT_TREEVIEW_EXPANDER_OPENED:
446 case XP_THEME_ELEMENT_TREEVIEW_EXPANDER_CLOSED:
447 klazz = XP_THEME_CLASS_TREEVIEW;
450 case XP_THEME_ELEMENT_LINE_H:
451 case XP_THEME_ELEMENT_LINE_V:
452 klazz = XP_THEME_CLASS_GLOBALS;
459 if (klazz != XP_THEME_CLASS__SIZEOF)
461 ret = xp_theme_get_handle_by_class (klazz);
468 xp_theme_map_gtk_state (XpThemeElement element, GtkStateType state)
474 case XP_THEME_ELEMENT_TOOLTIP:
478 case XP_THEME_ELEMENT_REBAR:
482 case XP_THEME_ELEMENT_REBAR_GRIPPER_H:
483 case XP_THEME_ELEMENT_REBAR_GRIPPER_V:
487 case XP_THEME_ELEMENT_STATUS_GRIPPER:
488 case XP_THEME_ELEMENT_STATUS_PANE:
492 case XP_THEME_ELEMENT_REBAR_CHEVRON:
495 case GTK_STATE_PRELIGHT:
499 case GTK_STATE_SELECTED:
500 case GTK_STATE_ACTIVE:
509 case XP_THEME_ELEMENT_TOOLBAR_SEPARATOR_H:
510 case XP_THEME_ELEMENT_TOOLBAR_SEPARATOR_V:
514 case XP_THEME_ELEMENT_TOOLBAR_BUTTON:
517 case GTK_STATE_ACTIVE:
521 case GTK_STATE_PRELIGHT:
525 case GTK_STATE_INSENSITIVE:
534 case XP_THEME_ELEMENT_TAB_PANE:
538 case XP_THEME_ELEMENT_TAB_ITEM_LEFT_EDGE:
539 case XP_THEME_ELEMENT_TAB_ITEM_RIGHT_EDGE:
540 case XP_THEME_ELEMENT_TAB_ITEM:
543 case GTK_STATE_PRELIGHT:
547 case GTK_STATE_INSENSITIVE:
551 case GTK_STATE_SELECTED:
552 case GTK_STATE_ACTIVE:
561 case XP_THEME_ELEMENT_EDIT_TEXT:
564 case GTK_STATE_PRELIGHT:
568 case GTK_STATE_INSENSITIVE:
572 case GTK_STATE_SELECTED:
573 case GTK_STATE_ACTIVE:
579 case XP_THEME_ELEMENT_TROUGH_H:
580 case XP_THEME_ELEMENT_TROUGH_V:
584 case XP_THEME_ELEMENT_SCROLLBAR_H:
585 case XP_THEME_ELEMENT_SCROLLBAR_V:
588 case GTK_STATE_SELECTED:
589 case GTK_STATE_ACTIVE:
593 case GTK_STATE_PRELIGHT:
597 case GTK_STATE_INSENSITIVE:
598 ret = SCRBS_DISABLED;
606 case XP_THEME_ELEMENT_ARROW_DOWN:
609 case GTK_STATE_ACTIVE:
610 ret = ABS_DOWNPRESSED;
613 case GTK_STATE_PRELIGHT:
617 case GTK_STATE_INSENSITIVE:
618 ret = ABS_DOWNDISABLED;
622 ret = ABS_DOWNNORMAL;
626 case XP_THEME_ELEMENT_ARROW_UP:
629 case GTK_STATE_ACTIVE:
633 case GTK_STATE_PRELIGHT:
637 case GTK_STATE_INSENSITIVE:
638 ret = ABS_UPDISABLED;
646 case XP_THEME_ELEMENT_ARROW_LEFT:
649 case GTK_STATE_ACTIVE:
650 ret = ABS_LEFTPRESSED;
653 case GTK_STATE_PRELIGHT:
657 case GTK_STATE_INSENSITIVE:
658 ret = ABS_LEFTDISABLED;
662 ret = ABS_LEFTNORMAL;
666 case XP_THEME_ELEMENT_ARROW_RIGHT:
669 case GTK_STATE_ACTIVE:
670 ret = ABS_RIGHTPRESSED;
673 case GTK_STATE_PRELIGHT:
677 case GTK_STATE_INSENSITIVE:
678 ret = ABS_RIGHTDISABLED;
682 ret = ABS_RIGHTNORMAL;
686 case XP_THEME_ELEMENT_CHECKBOX:
687 case XP_THEME_ELEMENT_RADIO_BUTTON:
690 case GTK_STATE_SELECTED:
691 ret = CBS_UNCHECKEDPRESSED;
694 case GTK_STATE_PRELIGHT:
695 ret = CBS_UNCHECKEDHOT;
698 case GTK_STATE_INSENSITIVE:
699 ret = CBS_UNCHECKEDDISABLED;
703 ret = CBS_UNCHECKEDNORMAL;
707 case XP_THEME_ELEMENT_INCONSISTENT_CHECKBOX:
710 case GTK_STATE_SELECTED:
711 ret = CBS_MIXEDPRESSED;
714 case GTK_STATE_PRELIGHT:
718 case GTK_STATE_INSENSITIVE:
719 ret = CBS_MIXEDDISABLED;
723 ret = CBS_MIXEDNORMAL;
727 case XP_THEME_ELEMENT_PRESSED_CHECKBOX:
728 case XP_THEME_ELEMENT_PRESSED_RADIO_BUTTON:
731 case GTK_STATE_SELECTED:
732 ret = CBS_CHECKEDPRESSED;
735 case GTK_STATE_PRELIGHT:
736 ret = CBS_CHECKEDHOT;
739 case GTK_STATE_INSENSITIVE:
740 ret = CBS_CHECKEDDISABLED;
744 ret = CBS_CHECKEDNORMAL;
748 case XP_THEME_ELEMENT_DEFAULT_BUTTON:
751 case GTK_STATE_ACTIVE:
755 case GTK_STATE_PRELIGHT:
759 case GTK_STATE_INSENSITIVE:
768 case XP_THEME_ELEMENT_SPIN_BUTTON_DOWN:
771 case GTK_STATE_ACTIVE:
775 case GTK_STATE_PRELIGHT:
779 case GTK_STATE_INSENSITIVE:
788 case XP_THEME_ELEMENT_SPIN_BUTTON_UP:
791 case GTK_STATE_ACTIVE:
795 case GTK_STATE_PRELIGHT:
799 case GTK_STATE_INSENSITIVE:
808 case XP_THEME_ELEMENT_TREEVIEW_EXPANDER_OPENED:
812 case XP_THEME_ELEMENT_TREEVIEW_EXPANDER_CLOSED:
816 case XP_THEME_ELEMENT_PROGRESS_BAR_H:
817 case XP_THEME_ELEMENT_PROGRESS_BAR_V:
818 case XP_THEME_ELEMENT_PROGRESS_TROUGH_H:
819 case XP_THEME_ELEMENT_PROGRESS_TROUGH_V:
823 case XP_THEME_ELEMENT_MENU_SEPARATOR:
827 case XP_THEME_ELEMENT_MENU_ITEM:
830 case GTK_STATE_SELECTED:
834 case GTK_STATE_PRELIGHT:
838 case GTK_STATE_INSENSITIVE:
847 case XP_THEME_ELEMENT_LINE_H:
850 /* LHS_FLAT, LHS_RAISED, LHS_SUNKEN */
856 case XP_THEME_ELEMENT_LINE_V:
859 /* LVS_FLAT, LVS_RAISED, LVS_SUNKEN */
865 case XP_THEME_ELEMENT_SCALE_TROUGH_H:
866 case XP_THEME_ELEMENT_SCALE_TROUGH_V:
873 case GTK_STATE_ACTIVE:
877 case GTK_STATE_PRELIGHT:
881 case GTK_STATE_INSENSITIVE:
894 get_window_dc (GtkStyle *style,
896 GtkStateType state_type,
897 XpDCInfo *dc_info_out,
898 gint x, gint y, gint width, gint height,
902 HBITMAP hBitmap, hOldBitmap;
903 cairo_surface_t *sourceCS, *tempCS;
905 double x_off = 0, y_off = 0;
907 dc_info_out->hdc = NULL;
910 hTempDC = CreateCompatibleDC(hDC);
911 hBitmap = CreateCompatibleBitmap(hDC, x + width, y + height);
912 hOldBitmap = (HBITMAP)SelectObject(hTempDC, hBitmap);
913 ReleaseDC(NULL, hDC);
915 tempCS = cairo_win32_surface_create (hTempDC);
919 sourceCS = cairo_get_target (cr);
920 tempCR = cairo_create (tempCS);
922 /* FIXME: I am missing something here - why is it needed to have device
923 * for cairo_set_source_surface() ? */
924 cairo_surface_get_device_offset (sourceCS, &x_off, &y_off);
925 cairo_set_source_surface (tempCR, sourceCS, x_off, y_off);
926 cairo_set_operator (tempCR, CAIRO_OPERATOR_OVER);
927 /* FIXME: Something is not quit right here - seems the CR or SURFACE do
928 * not always have the correct data. Hovering on a GtkToolbar from
929 * left to right draws the previous button over the next for ex. */
930 cairo_rectangle (tempCR, x, y, width, height);
933 cairo_destroy (tempCR);
935 cairo_surface_flush (tempCS);
936 cairo_surface_destroy (tempCS);
940 rect_out->right = rect_out->left + width;
941 rect_out->bottom = rect_out->top + height;
943 dc_info_out->hdc = hTempDC;
944 dc_info_out->hBitmap = hBitmap;
945 dc_info_out->hOldBitmap = hOldBitmap;
946 dc_info_out->cr = cr;
949 dc_info_out->width = width;
950 dc_info_out->height = height;
956 release_window_dc (XpDCInfo *dc_info)
958 cairo_surface_t *tempCS, *target;
963 tempCS = cairo_win32_surface_create (dc_info->hdc);
964 target = cairo_get_target (dc_info->cr);
966 cairo_save (dc_info->cr);
968 cairo_set_source_surface (dc_info->cr, tempCS, 0, 0);
969 cairo_set_operator (dc_info->cr, CAIRO_OPERATOR_OVER);
970 cairo_rectangle (dc_info->cr, dc_info->x, dc_info->y, dc_info->width, dc_info->height);
971 cairo_fill (dc_info->cr);
973 cairo_restore (dc_info->cr);
975 cairo_surface_destroy (tempCS);
977 SelectObject(dc_info->hdc, dc_info->hOldBitmap);
978 DeleteDC(dc_info->hdc);
979 DeleteObject(dc_info->hBitmap);
985 xp_theme_draw (cairo_t *cr, XpThemeElement element, GtkStyle *style,
986 int x, int y, int width, int height,
987 GtkStateType state_type)
995 if (!xp_theme_is_drawable (element))
998 theme = xp_theme_get_handle_by_element (element);
1002 /* FIXME: Recheck its function */
1003 // if (GDK_IS_WINDOW (win) && gdk_win32_window_is_win32 (win))
1004 // enable_theme_dialog_texture_func (GDK_WINDOW_HWND (win), ETDT_ENABLETAB);
1006 dc = get_window_dc (style, cr, state_type, &dc_info,
1007 x, y, width, height,
1012 part_state = xp_theme_map_gtk_state (element, state_type);
1014 /* Support transparency */
1015 // if (is_theme_partially_transparent_func (theme, element_part_map[element], part_state))
1016 // draw_theme_parent_background_func (GDK_WINDOW_HWND (win), dc, pClip);
1018 /* FIXME: Should we get and handle clipping (check it on the CR?) ? */
1019 draw_theme_background_func (theme, dc, element_part_map[element],
1020 part_state, &rect, NULL);
1022 release_window_dc (&dc_info);
1028 xp_theme_is_active (void)
1030 return use_xp_theme;
1034 xp_theme_is_drawable (XpThemeElement element)
1036 if (xp_theme_is_active ())
1037 return (xp_theme_get_handle_by_element (element) != NULL);
1043 xp_theme_get_element_dimensions (XpThemeElement element,
1044 GtkStateType state_type,
1051 if (!xp_theme_is_active ())
1054 theme = xp_theme_get_handle_by_element (element);
1058 part_state = xp_theme_map_gtk_state (element, state_type);
1060 get_theme_part_size_func (theme,
1062 element_part_map[element],
1071 if (element == XP_THEME_ELEMENT_MENU_ITEM ||
1072 element == XP_THEME_ELEMENT_MENU_SEPARATOR)
1076 get_theme_part_size_func (theme,
1084 *cx += gutter_size.cx * 2;
1085 *cy += gutter_size.cy * 2;
1092 xp_theme_get_system_font (XpThemeClass klazz, XpThemeFont fontId,
1095 if (xp_theme_is_active () && get_theme_sys_font_func != NULL)
1097 HTHEME theme = xp_theme_get_handle_by_class (klazz);
1105 case XP_THEME_FONT_CAPTION:
1106 themeFont = TMT_CAPTIONFONT;
1109 case XP_THEME_FONT_MENU:
1110 themeFont = TMT_MENUFONT;
1113 case XP_THEME_FONT_STATUS:
1114 themeFont = TMT_STATUSFONT;
1117 case XP_THEME_FONT_MESSAGE:
1119 themeFont = TMT_MSGBOXFONT;
1123 /* if theme is NULL, it will just return the GetSystemFont()
1125 return ((*get_theme_sys_font_func) (theme, themeFont, lf) == S_OK);
1132 xp_theme_get_system_color (XpThemeClass klazz, int colorId,
1135 if (xp_theme_is_active () && get_theme_sys_color_func != NULL)
1137 HTHEME theme = xp_theme_get_handle_by_class (klazz);
1139 /* if theme is NULL, it will just return the GetSystemColor()
1141 *pColor = (*get_theme_sys_color_func) (theme, colorId);
1149 xp_theme_get_system_metric (XpThemeClass klazz, int metricId, OUT int *pVal)
1151 if (xp_theme_is_active () && get_theme_sys_metric_func != NULL)
1153 HTHEME theme = xp_theme_get_handle_by_class (klazz);
1155 /* if theme is NULL, it will just return the GetSystemMetrics()
1157 *pVal = (*get_theme_sys_metric_func) (theme, metricId);