diff --git a/modules/engines/ms-windows/ChangeLog.old b/modules/engines/ms-windows/ChangeLog.old index 68c759c647..fb42edb47f 100755 --- a/modules/engines/ms-windows/ChangeLog.old +++ b/modules/engines/ms-windows/ChangeLog.old @@ -1,3 +1,13 @@ +2003-10-07 Raymond Penners + + * src/wimp_style.c: Tabs not located on top of the notebook are + now (again) no longer rendered using XP theming. + + * src/xp_theme.c: Added a more lightweight method to cope with + theme changes. Added a crude theme switch detection scheme in the + case that GTK+ does not implement gdk_window_add_filter properly + (GTK+ 2.2.0?). + 2003-10-07 Dom Lachowicz * Added new mingw based build system, tidied up other missing bits @@ -5,9 +15,12 @@ 2003-10-07 Raymond Penners * src/wimp_style.c: Tabs not located on top of the notebook are - now (again) no longer rendered using XP theming. + now (again) no longer rendered using XP theming. - * src/xp_theme.c: We now properly use IsThemeActive(). + * src/xp_theme.c: We now properly use IsThemeActive(). Added a + more lightweight method to cope with theme changes. Added a crude + theme switch detection scheme in the case that GTK+ does not + implement gdk_window_add_filter properly (GTK+ 2.2.0?). * src/xp_theme_defs.h: Renamed from xp_theme_dfns.h diff --git a/modules/engines/ms-windows/wimp_style.c b/modules/engines/ms-windows/wimp_style.c index d3e3c6038b..8595a27895 100755 --- a/modules/engines/ms-windows/wimp_style.c +++ b/modules/engines/ms-windows/wimp_style.c @@ -1113,6 +1113,7 @@ draw_box (GtkStyle *style, else { gboolean is_default = !strcmp (detail, "buttondefault"); + g_warning("BUTT"); if (xp_theme_draw(window, is_default ? XP_THEME_ELEMENT_DEFAULT_BUTTON : XP_THEME_ELEMENT_BUTTON, style, x, y, width, height, state_type, area)) diff --git a/modules/engines/ms-windows/wimp_theme_main.c b/modules/engines/ms-windows/wimp_theme_main.c index 64ef40201c..4d77a87011 100755 --- a/modules/engines/ms-windows/wimp_theme_main.c +++ b/modules/engines/ms-windows/wimp_theme_main.c @@ -49,7 +49,7 @@ global_filter_func (void *xevent, /* catch theme changes */ case WM_THEMECHANGED: case WM_SYSCOLORCHANGE: - xp_theme_exit(); + xp_theme_reset (); wimp_style_init (); /* force all gtkwidgets to redraw */ diff --git a/modules/engines/ms-windows/xp_theme.c b/modules/engines/ms-windows/xp_theme.c index 7b8cbeba90..68ced71717 100755 --- a/modules/engines/ms-windows/xp_theme.c +++ b/modules/engines/ms-windows/xp_theme.c @@ -118,8 +118,25 @@ static DrawThemeBackgroundFunc draw_theme_background_func = NULL; static EnableThemeDialogTextureFunc enable_theme_dialog_texture_func = NULL; static IsThemeActiveFunc is_theme_active_func = NULL; +static gboolean was_theming_active = FALSE; + +static void +xp_theme_close_open_handles (void) +{ + int i; + + for (i=0; i < XP_THEME_CLASS__SIZEOF; i++) + { + if (open_themes[i]) + { + close_theme_data_func (open_themes[i]); + open_themes[i] = NULL; + } + } +} + void -xp_theme_init(void) +xp_theme_init (void) { if (uxtheme_dll) return; @@ -133,25 +150,30 @@ xp_theme_init(void) draw_theme_background_func = (DrawThemeBackgroundFunc) GetProcAddress(uxtheme_dll, "DrawThemeBackground"); enable_theme_dialog_texture_func = (EnableThemeDialogTextureFunc) GetProcAddress(uxtheme_dll, "EnableThemeDialogTexture"); get_theme_sys_font_func = (GetThemeSysFontFunc) GetProcAddress(uxtheme_dll, "GetThemeSysFont"); + + if (is_theme_active_func) + { + was_theming_active = (*is_theme_active_func) (); + } +} + + +void +xp_theme_reset (void) +{ + xp_theme_close_open_handles (); + was_theming_active = (*is_theme_active_func) (); } void -xp_theme_exit(void) +xp_theme_exit (void) { - int i; if (! uxtheme_dll) return; - for (i=0; i < XP_THEME_CLASS__SIZEOF; i++) - { - if (open_themes[i]) - { - close_theme_data_func(open_themes[i]); - open_themes[i] = NULL; - } - } + xp_theme_close_open_handles (); - FreeLibrary(uxtheme_dll); + FreeLibrary (uxtheme_dll); uxtheme_dll = NULL; is_theme_active_func = NULL; @@ -163,7 +185,7 @@ xp_theme_exit(void) } static HTHEME -xp_theme_get_handle_by_class(XpThemeClass klazz) +xp_theme_get_handle_by_class (XpThemeClass klazz) { if (!open_themes[klazz] && open_theme_data_func) { @@ -173,7 +195,7 @@ xp_theme_get_handle_by_class(XpThemeClass klazz) } static HTHEME -xp_theme_get_handle_by_element(XpThemeElement element) +xp_theme_get_handle_by_element (XpThemeElement element) { HTHEME ret = NULL; XpThemeClass klazz = XP_THEME_CLASS__SIZEOF; @@ -266,7 +288,7 @@ xp_theme_get_handle_by_element(XpThemeElement element) } static int -xp_theme_map_gtk_state(XpThemeElement element, GtkStateType state) +xp_theme_map_gtk_state (XpThemeElement element, GtkStateType state) { int ret; @@ -580,9 +602,9 @@ xp_theme_map_gtk_state(XpThemeElement element, GtkStateType state) } gboolean -xp_theme_draw(GdkWindow *win, XpThemeElement element, GtkStyle *style, - int x, int y, int width, int height, GtkStateType state_type, - GdkRectangle *area) +xp_theme_draw (GdkWindow *win, XpThemeElement element, GtkStyle *style, + int x, int y, int width, int height, + GtkStateType state_type, GdkRectangle *area) { HTHEME theme; RECT rect, clip, *pClip; @@ -643,17 +665,32 @@ xp_theme_draw(GdkWindow *win, XpThemeElement element, GtkStyle *style, } gboolean -xp_theme_is_drawable(XpThemeElement element) +xp_theme_is_drawable (XpThemeElement element) { - if (is_theme_active_func && (*is_theme_active_func)()) + gboolean ret = FALSE; + + if (is_theme_active_func) { - return (xp_theme_get_handle_by_element(element) != NULL); + gboolean active = (*is_theme_active_func) (); + // A bit of a hack, but it at least detects theme + // switches between XP and classic looks on systems + // using older GTK+ version (2.2.0-?) that do not + // support theme switch detection (gdk_window_add_filter). + if (active != was_theming_active) + { + xp_theme_reset (); + } + + if (active) + { + ret = (xp_theme_get_handle_by_element (element) != NULL); + } } - return FALSE; + return ret; } gboolean -xp_theme_get_system_font(int fontId, LOGFONT *lf) +xp_theme_get_system_font (int fontId, LOGFONT *lf) { if (get_theme_sys_font_func != NULL) { diff --git a/modules/engines/ms-windows/xp_theme.h b/modules/engines/ms-windows/xp_theme.h index e877e075d9..554f179c55 100755 --- a/modules/engines/ms-windows/xp_theme.h +++ b/modules/engines/ms-windows/xp_theme.h @@ -85,12 +85,14 @@ typedef enum XP_THEME_ELEMENT__SIZEOF } XpThemeElement; -void xp_theme_init(void); -void xp_theme_exit(void); -gboolean xp_theme_draw(GdkWindow *win, XpThemeElement element, GtkStyle *style, - int x, int y, int width, int height, GtkStateType state_type, - GdkRectangle *area); -gboolean xp_theme_is_drawable(XpThemeElement element); -gboolean xp_theme_get_system_font(int fontId, LOGFONT *lf); +void xp_theme_init (void); +void xp_theme_reset (void); +void xp_theme_exit (void); +gboolean xp_theme_draw (GdkWindow *win, XpThemeElement element, + GtkStyle *style, int x, int y, int width, + int height, GtkStateType state_type, + GdkRectangle *area); +gboolean xp_theme_is_drawable (XpThemeElement element); +gboolean xp_theme_get_system_font (int fontId, LOGFONT *lf); #endif /* XP_THEME_H */