1 /* Wimp "Windows Impersonator" Engine
3 * Copyright (C) 2003 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.
28 #include <gdk/gdkwin32.h>
32 static LPCWSTR class_descriptors[] =
49 static const short element_part_map[]=
95 static HINSTANCE uxtheme_dll = NULL;
96 static HTHEME open_themes[XP_THEME_CLASS__SIZEOF];
98 typedef HRESULT (FAR PASCAL *GetThemeSysFontFunc)
99 (HTHEME hTheme, int iFontID, FAR LOGFONT *plf);
100 typedef HTHEME (FAR PASCAL *OpenThemeDataFunc)
101 (HWND hwnd, LPCWSTR pszClassList);
102 typedef HRESULT (FAR PASCAL *CloseThemeDataFunc)(HTHEME theme);
103 typedef HRESULT (FAR PASCAL *DrawThemeBackgroundFunc)
104 (HTHEME hTheme, HDC hdc, int iPartId, int iStateId,
105 const RECT *pRect, const RECT *pClipRect);
106 typedef HRESULT (FAR PASCAL *EnableThemeDialogTextureFunc)(HWND hwnd, DWORD dwFlags);
108 static GetThemeSysFontFunc get_theme_sys_font_func = NULL;
109 static OpenThemeDataFunc open_theme_data_func = NULL;
110 static CloseThemeDataFunc close_theme_data_func = NULL;
111 static DrawThemeBackgroundFunc draw_theme_background_func = NULL;
112 static EnableThemeDialogTextureFunc enable_theme_dialog_texture_func = NULL;
120 uxtheme_dll = LoadLibrary("uxtheme.dll");
121 memset(open_themes, 0, sizeof(open_themes));
123 open_theme_data_func = (OpenThemeDataFunc) GetProcAddress(uxtheme_dll, "OpenThemeData");
124 close_theme_data_func = (CloseThemeDataFunc) GetProcAddress(uxtheme_dll, "CloseThemeData");
125 draw_theme_background_func = (DrawThemeBackgroundFunc) GetProcAddress(uxtheme_dll, "DrawThemeBackground");
126 enable_theme_dialog_texture_func = (EnableThemeDialogTextureFunc) GetProcAddress(uxtheme_dll, "EnableThemeDialogTexture");
127 get_theme_sys_font_func = (GetThemeSysFontFunc) GetProcAddress(uxtheme_dll, "GetThemeSysFont");
138 for (i=0; i<XP_THEME_CLASS__SIZEOF; i++)
142 close_theme_data_func(open_themes[i]);
143 open_themes[i] = NULL;
147 FreeLibrary(uxtheme_dll);
150 open_theme_data_func = NULL;
151 close_theme_data_func = NULL;
152 draw_theme_background_func = NULL;
153 enable_theme_dialog_texture_func = NULL;
154 get_theme_sys_font_func = NULL;
158 xp_theme_get_handle_by_class(XpThemeClass klazz)
160 if (!open_themes[klazz] && open_theme_data_func)
162 open_themes[klazz] = open_theme_data_func(NULL, class_descriptors[klazz]);
164 return open_themes[klazz];
168 xp_theme_get_handle_by_element(XpThemeElement element)
171 XpThemeClass klazz = XP_THEME_CLASS__SIZEOF;
175 case XP_THEME_ELEMENT_TOOLTIP:
176 klazz = XP_THEME_CLASS_TOOLTIP;
179 case XP_THEME_ELEMENT_REBAR:
180 case XP_THEME_ELEMENT_GRIPPER_H:
181 case XP_THEME_ELEMENT_GRIPPER_V:
182 case XP_THEME_ELEMENT_CHEVRON:
183 klazz = XP_THEME_CLASS_REBAR;
186 case XP_THEME_ELEMENT_TOOLBAR:
187 klazz = XP_THEME_CLASS_TOOLBAR;
190 case XP_THEME_ELEMENT_HLINE:
191 case XP_THEME_ELEMENT_VLINE:
192 klazz = XP_THEME_CLASS_GLOBALS;
195 case XP_THEME_ELEMENT_PRESSED_CHECKBOX:
196 case XP_THEME_ELEMENT_CHECKBOX:
197 case XP_THEME_ELEMENT_BUTTON:
198 case XP_THEME_ELEMENT_DEFAULT_BUTTON:
199 case XP_THEME_ELEMENT_RADIO_BUTTON:
200 klazz = XP_THEME_CLASS_BUTTON;
203 case XP_THEME_ELEMENT_LIST_HEADER:
204 klazz = XP_THEME_CLASS_HEADER;
207 case XP_THEME_ELEMENT_COMBOBUTTON:
208 klazz = XP_THEME_CLASS_COMBOBOX;
211 case XP_THEME_ELEMENT_BODY:
212 case XP_THEME_ELEMENT_TAB_ITEM:
213 case XP_THEME_ELEMENT_TAB_ITEM_LEFT_EDGE:
214 case XP_THEME_ELEMENT_TAB_PANE:
215 klazz = XP_THEME_CLASS_TAB;
218 case XP_THEME_ELEMENT_SCROLLBAR_V:
219 case XP_THEME_ELEMENT_SCROLLBAR_H:
220 case XP_THEME_ELEMENT_ARROW_UP:
221 case XP_THEME_ELEMENT_ARROW_DOWN:
222 case XP_THEME_ELEMENT_ARROW_LEFT:
223 case XP_THEME_ELEMENT_ARROW_RIGHT:
224 case XP_THEME_ELEMENT_GRIP_V:
225 case XP_THEME_ELEMENT_GRIP_H:
226 case XP_THEME_ELEMENT_TROUGH_V:
227 case XP_THEME_ELEMENT_TROUGH_H:
228 klazz = XP_THEME_CLASS_SCROLLBAR;
231 case XP_THEME_ELEMENT_EDIT_TEXT:
232 klazz = XP_THEME_CLASS_EDIT;
235 case XP_THEME_ELEMENT_SPIN_BUTTON_UP:
236 case XP_THEME_ELEMENT_SPIN_BUTTON_DOWN:
237 klazz = XP_THEME_CLASS_SPIN;
240 case XP_THEME_ELEMENT_PROGRESS_BAR_H:
241 case XP_THEME_ELEMENT_PROGRESS_BAR_V:
242 case XP_THEME_ELEMENT_PROGRESS_TROUGH_H:
243 case XP_THEME_ELEMENT_PROGRESS_TROUGH_V:
244 klazz = XP_THEME_CLASS_PROGRESS;
247 case XP_THEME_ELEMENT_TREEVIEW_EXPANDER_OPENED:
248 case XP_THEME_ELEMENT_TREEVIEW_EXPANDER_CLOSED:
249 klazz = XP_THEME_CLASS_TREEVIEW;
253 if (klazz != XP_THEME_CLASS__SIZEOF)
255 ret = xp_theme_get_handle_by_class (klazz);
261 xp_theme_map_gtk_state(XpThemeElement element, GtkStateType state)
267 case XP_THEME_ELEMENT_TOOLTIP:
271 case XP_THEME_ELEMENT_REBAR:
272 case XP_THEME_ELEMENT_GRIPPER_H:
273 case XP_THEME_ELEMENT_GRIPPER_V:
277 case XP_THEME_ELEMENT_CHEVRON:
280 case GTK_STATE_PRELIGHT:
283 case GTK_STATE_SELECTED:
284 case GTK_STATE_ACTIVE:
292 case XP_THEME_ELEMENT_TOOLBAR:
296 case XP_THEME_ELEMENT_TAB_PANE:
300 case XP_THEME_ELEMENT_TAB_ITEM_LEFT_EDGE:
301 case XP_THEME_ELEMENT_TAB_ITEM:
304 case GTK_STATE_PRELIGHT:
307 case GTK_STATE_INSENSITIVE:
310 case GTK_STATE_SELECTED:
311 case GTK_STATE_ACTIVE:
319 case XP_THEME_ELEMENT_EDIT_TEXT:
322 case GTK_STATE_PRELIGHT:
325 case GTK_STATE_INSENSITIVE:
328 case GTK_STATE_SELECTED:
329 case GTK_STATE_ACTIVE:
335 case XP_THEME_ELEMENT_SCROLLBAR_H:
336 case XP_THEME_ELEMENT_SCROLLBAR_V:
337 case XP_THEME_ELEMENT_TROUGH_H:
338 case XP_THEME_ELEMENT_TROUGH_V:
341 case GTK_STATE_SELECTED:
342 case GTK_STATE_ACTIVE:
345 case GTK_STATE_PRELIGHT:
348 case GTK_STATE_INSENSITIVE:
349 ret = SCRBS_DISABLED;
356 case XP_THEME_ELEMENT_ARROW_DOWN:
359 case GTK_STATE_ACTIVE:
360 ret = ABS_DOWNPRESSED;
362 case GTK_STATE_PRELIGHT:
365 case GTK_STATE_INSENSITIVE:
366 ret = ABS_DOWNDISABLED;
369 ret = ABS_DOWNNORMAL;
373 case XP_THEME_ELEMENT_ARROW_UP:
376 case GTK_STATE_ACTIVE:
379 case GTK_STATE_PRELIGHT:
382 case GTK_STATE_INSENSITIVE:
383 ret = ABS_UPDISABLED;
390 case XP_THEME_ELEMENT_ARROW_LEFT:
393 case GTK_STATE_ACTIVE:
394 ret = ABS_LEFTPRESSED;
396 case GTK_STATE_PRELIGHT:
399 case GTK_STATE_INSENSITIVE:
400 ret = ABS_LEFTDISABLED;
403 ret = ABS_LEFTNORMAL;
407 case XP_THEME_ELEMENT_ARROW_RIGHT:
410 case GTK_STATE_ACTIVE:
411 ret = ABS_RIGHTPRESSED;
413 case GTK_STATE_PRELIGHT:
416 case GTK_STATE_INSENSITIVE:
417 ret = ABS_RIGHTDISABLED;
420 ret = ABS_RIGHTNORMAL;
424 case XP_THEME_ELEMENT_CHECKBOX:
425 case XP_THEME_ELEMENT_RADIO_BUTTON:
428 case GTK_STATE_SELECTED:
429 ret = CBS_UNCHECKEDPRESSED;
431 case GTK_STATE_PRELIGHT:
432 ret = CBS_UNCHECKEDHOT;
434 case GTK_STATE_INSENSITIVE:
435 ret = CBS_UNCHECKEDDISABLED;
438 ret = CBS_UNCHECKEDNORMAL;
442 case XP_THEME_ELEMENT_PRESSED_CHECKBOX:
445 case GTK_STATE_SELECTED:
446 ret = CBS_CHECKEDPRESSED;
448 case GTK_STATE_PRELIGHT:
449 ret = CBS_CHECKEDHOT;
451 case GTK_STATE_INSENSITIVE:
452 ret = CBS_CHECKEDDISABLED;
455 ret = CBS_CHECKEDNORMAL;
459 XP_THEME_ELEMENT_DEFAULT_BUTTON:
462 case GTK_STATE_ACTIVE:
465 case GTK_STATE_PRELIGHT:
468 case GTK_STATE_INSENSITIVE:
476 case XP_THEME_ELEMENT_SPIN_BUTTON_DOWN:
479 case GTK_STATE_ACTIVE:
482 case GTK_STATE_PRELIGHT:
485 case GTK_STATE_INSENSITIVE:
493 case XP_THEME_ELEMENT_SPIN_BUTTON_UP:
496 case GTK_STATE_ACTIVE:
499 case GTK_STATE_PRELIGHT:
502 case GTK_STATE_INSENSITIVE:
510 case XP_THEME_ELEMENT_TREEVIEW_EXPANDER_OPENED:
514 case XP_THEME_ELEMENT_TREEVIEW_EXPANDER_CLOSED:
518 case XP_THEME_ELEMENT_PROGRESS_BAR_H:
519 case XP_THEME_ELEMENT_PROGRESS_BAR_V:
520 case XP_THEME_ELEMENT_PROGRESS_TROUGH_H:
521 case XP_THEME_ELEMENT_PROGRESS_TROUGH_V:
525 #if UXTHEME_HAS_LINES
527 case XP_THEME_ELEMENT_HLINE:
529 case GTK_STATE_ACTIVE:
532 case GTK_STATE_INSENSITIVE:
540 case XP_THEME_ELEMENT_VLINE:
542 case GTK_STATE_ACTIVE:
545 case GTK_STATE_INSENSITIVE:
558 case GTK_STATE_ACTIVE:
561 case GTK_STATE_PRELIGHT:
564 case GTK_STATE_INSENSITIVE:
575 xp_theme_draw(GdkWindow *win, XpThemeElement element, GtkStyle *style,
576 int x, int y, int width, int height, GtkStateType state_type,
580 RECT rect, clip, *pClip;
581 int xoff, yoff, state;
583 GdkDrawable *drawable;
589 theme = xp_theme_get_handle_by_element(element);
593 /* FIXME: Recheck its function */
594 enable_theme_dialog_texture_func(GDK_WINDOW_HWND(win), ETDT_ENABLETAB);
596 if (!GDK_IS_WINDOW(win))
604 gdk_window_get_internal_paint_info(win, &drawable, &xoff, &yoff);
606 rect.left = x - xoff;
608 rect.right = rect.left + width;
609 rect.bottom = rect.top + height;
614 clip.left = area->x - xoff;
615 clip.top = area->y - yoff;
616 clip.right = clip.left + area->width;
617 clip.bottom = clip.top + area->height;
627 gdk_gc_set_clip_rectangle (style->dark_gc[state_type], NULL);
628 dc = gdk_win32_hdc_get(drawable, style->dark_gc[state_type], 0);
632 part_state = xp_theme_map_gtk_state(element, state_type);
633 draw_theme_background_func(theme, dc, element_part_map[element], part_state, &rect, pClip);
634 gdk_win32_hdc_release(drawable, style->dark_gc[state_type], 0);
640 xp_theme_is_drawable(XpThemeElement element)
644 return (xp_theme_get_handle_by_element(element) != NULL);
650 xp_theme_get_system_font(int fontId, LOGFONT *lf)
652 if (get_theme_sys_font_func != NULL)
654 return ((*get_theme_sys_font_func)(NULL, fontId, lf) == S_OK);