From 3d14f381b74b13342e69afcc7f504d873ec00e95 Mon Sep 17 00:00:00 2001 From: Dom Lachowicz Date: Thu, 28 Jul 2005 12:24:25 +0000 Subject: [PATCH] re-sync with gtk-wimp cvs --- ChangeLog | 10 + ChangeLog.pre-2-10 | 10 + ChangeLog.pre-2-8 | 10 + .../engines/ms-windows/Theme/gtk-2.0/gtkrc | 5 - modules/engines/ms-windows/msw_style.c | 377 ++++++++++-------- modules/engines/ms-windows/xp_theme.c | 139 +++++-- modules/engines/ms-windows/xp_theme.h | 19 +- modules/engines/ms-windows/xp_theme_defs.h | 8 +- 8 files changed, 371 insertions(+), 207 deletions(-) diff --git a/ChangeLog b/ChangeLog index 5d9eb7e4b4..ad780637db 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +2005-07-28 Dom Lachowicz + + * modules/engines/ms-windows/*: Re-sync with gtk-wimp CVS. Notable + changes include: menu/toolbars have a gradient applied to them; better + handling of menu/toolbar shadows, tracking theme settings; + sliders/scales now use XP theming; status bar grippies drawn properly; + convincing toolbar grippies are drawn for the Win2k theme; notebook + tabs now have that orange stripe across their top; a host of scrollbar + bugs are fixed + 2005-07-27 Tor Lillqvist * gdk/win32/gdkmain-win32.c (_gdk_win32_psstyle_to_string): Handle diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10 index 5d9eb7e4b4..ad780637db 100644 --- a/ChangeLog.pre-2-10 +++ b/ChangeLog.pre-2-10 @@ -1,3 +1,13 @@ +2005-07-28 Dom Lachowicz + + * modules/engines/ms-windows/*: Re-sync with gtk-wimp CVS. Notable + changes include: menu/toolbars have a gradient applied to them; better + handling of menu/toolbar shadows, tracking theme settings; + sliders/scales now use XP theming; status bar grippies drawn properly; + convincing toolbar grippies are drawn for the Win2k theme; notebook + tabs now have that orange stripe across their top; a host of scrollbar + bugs are fixed + 2005-07-27 Tor Lillqvist * gdk/win32/gdkmain-win32.c (_gdk_win32_psstyle_to_string): Handle diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8 index 5d9eb7e4b4..ad780637db 100644 --- a/ChangeLog.pre-2-8 +++ b/ChangeLog.pre-2-8 @@ -1,3 +1,13 @@ +2005-07-28 Dom Lachowicz + + * modules/engines/ms-windows/*: Re-sync with gtk-wimp CVS. Notable + changes include: menu/toolbars have a gradient applied to them; better + handling of menu/toolbar shadows, tracking theme settings; + sliders/scales now use XP theming; status bar grippies drawn properly; + convincing toolbar grippies are drawn for the Win2k theme; notebook + tabs now have that orange stripe across their top; a host of scrollbar + bugs are fixed + 2005-07-27 Tor Lillqvist * gdk/win32/gdkmain-win32.c (_gdk_win32_psstyle_to_string): Handle diff --git a/modules/engines/ms-windows/Theme/gtk-2.0/gtkrc b/modules/engines/ms-windows/Theme/gtk-2.0/gtkrc index 74a4ebdee2..89e376372f 100755 --- a/modules/engines/ms-windows/Theme/gtk-2.0/gtkrc +++ b/modules/engines/ms-windows/Theme/gtk-2.0/gtkrc @@ -30,11 +30,6 @@ style "msw-default" GtkTreeView::allow-rules = 0 GtkTreeView::expander-size = 12 - # etched-in is closer to how Win32's explorer.exe does things, but it makes apps with - # multiple toolbars or a menubar and a toolbar look like garbage - GtkToolbar::shadow-type = out - GtkHandleBox::shadow-type = out - engine "wimp" { } diff --git a/modules/engines/ms-windows/msw_style.c b/modules/engines/ms-windows/msw_style.c index 070ea80f7d..ffb485339e 100755 --- a/modules/engines/ms-windows/msw_style.c +++ b/modules/engines/ms-windows/msw_style.c @@ -24,6 +24,7 @@ * Useful resources: * * http://lxr.mozilla.org/mozilla/source/gfx/src/windows/nsNativeThemeWin.cpp + * http://lxr.mozilla.org/seamonkey/source/widget/src/windows/nsLookAndFeel.cpp * http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/commctls/userex/functions/drawthemebackground.asp */ @@ -66,48 +67,48 @@ typedef enum { #define PART_SIZE 13 -static const char check_aa_bits[] = { +static const guint8 check_aa_bits[] = { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; -static const char check_base_bits[] = { +static const guint8 check_base_bits[] = { 0x00,0x00,0x00,0x00,0xfc,0x07,0xfc,0x07,0xfc,0x07,0xfc,0x07,0xfc,0x07,0xfc, 0x07,0xfc,0x07,0xfc,0x07,0xfc,0x07,0x00,0x00,0x00,0x00}; -static const char check_black_bits[] = { +static const guint8 check_black_bits[] = { 0x00,0x00,0xfe,0x0f,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02, 0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x00,0x00}; -static const char check_dark_bits[] = { +static const guint8 check_dark_bits[] = { 0xff,0x1f,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01, 0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00}; -static const char check_light_bits[] = { +static const guint8 check_light_bits[] = { 0x00,0x00,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00, 0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0xfe,0x1f}; -static const char check_mid_bits[] = { +static const guint8 check_mid_bits[] = { 0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00, 0x08,0x00,0x08,0x00,0x08,0x00,0x08,0xfc,0x0f,0x00,0x00}; -static const char check_text_bits[] = { +static const guint8 check_text_bits[] = { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x03,0x88,0x03,0xd8,0x01,0xf8, 0x00,0x70,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; -static const char radio_base_bits[] = { +static const guint8 radio_base_bits[] = { 0x00,0x00,0x00,0x00,0xf0,0x01,0xf8,0x03,0xfc,0x07,0xfc,0x07,0xfc,0x07,0xfc, 0x07,0xfc,0x07,0xf8,0x03,0xf0,0x01,0x00,0x00,0x00,0x00}; -static const char radio_black_bits[] = { +static const guint8 radio_black_bits[] = { 0x00,0x00,0xf0,0x01,0x0c,0x02,0x04,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02, 0x00,0x02,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; -static const char radio_dark_bits[] = { +static const guint8 radio_dark_bits[] = { 0xf0,0x01,0x0c,0x06,0x02,0x00,0x02,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01, 0x00,0x01,0x00,0x02,0x00,0x02,0x00,0x00,0x00,0x00,0x00}; -static const char radio_light_bits[] = { +static const guint8 radio_light_bits[] = { 0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x08,0x00,0x10,0x00,0x10,0x00,0x10,0x00, 0x10,0x00,0x10,0x00,0x08,0x00,0x08,0x0c,0x06,0xf0,0x01}; -static const char radio_mid_bits[] = { +static const guint8 radio_mid_bits[] = { 0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x04,0x00,0x08,0x00,0x08,0x00,0x08,0x00, 0x08,0x00,0x08,0x00,0x04,0x0c,0x06,0xf0,0x01,0x00,0x00}; -static const char radio_text_bits[] = { +static const guint8 radio_text_bits[] = { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0xf0,0x01,0xf0,0x01,0xf0, 0x01,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; static struct { - const char *bits; + const guint8 *bits; GdkBitmap *bmap; } parts[] = { { check_aa_bits, NULL }, @@ -129,7 +130,7 @@ static gboolean get_system_font(XpThemeClass klazz, XpThemeFont type, LOGFONT *out_lf) { #if 0 - /* TODO: this crashes. need to figure out why and how to fix it */ + /* TODO: this causes crashes later because the font name is in UCS2, and the pango fns don't deal with that gracefully */ if (xp_theme_get_system_font(klazz, type, out_lf)) return TRUE; else @@ -256,8 +257,7 @@ get_family_name (LOGFONT *lfp, HDC pango_win32_hdc) gchar *string = NULL; gchar *name; - gint i, l; - gsize nbytes; + size_t i, l, nbytes; /* If lfFaceName is ASCII, assume it is the common (English) name * for the font. Is this valid? Do some TrueType fonts have @@ -275,7 +275,7 @@ get_family_name (LOGFONT *lfp, HDC pango_win32_hdc) if ((hfont = CreateFontIndirect (lfp)) == NULL) goto fail0; - if ((oldhfont = SelectObject (pango_win32_hdc, hfont)) == NULL) + if ((oldhfont = (HFONT)SelectObject (pango_win32_hdc, hfont)) == NULL) goto fail1; if (!pango_win32_get_name_header (pango_win32_hdc, &header)) @@ -553,9 +553,6 @@ get_system_metric(XpThemeClass klazz, int id) static void setup_msw_rc_style(void) { - /* TODO: Owen says: - "If your setup_system_styles() function called gtk_rc_parse_string(), then you are just piling a new set of strings on top each time the theme changes .. the old ones won't be removed" */ - char buf[1024], font_buf[256], *font_ptr; GdkColor menu_color; @@ -571,6 +568,8 @@ setup_msw_rc_style(void) GdkColor base_prelight; GdkColor text_prelight; + gboolean xp_theme = xp_theme_is_active(); + /* Prelight */ sys_color_to_gtk_color(XP_THEME_CLASS_TEXT, COLOR_HIGHLIGHTTEXT, &fg_prelight); sys_color_to_gtk_color(XP_THEME_CLASS_TEXT, COLOR_HIGHLIGHT, &bg_prelight); @@ -633,11 +632,22 @@ setup_msw_rc_style(void) "style \"msw-menu-bar\" = \"msw-menu\"\n" "{\n" "bg[NORMAL] = { %d, %d, %d }\n" - "GtkMenuBar::shadow-type = out\n" + "GtkMenuBar::shadow-type = %s\n" "}widget_class \"*MenuBar*\" style \"msw-menu-bar\"\n", btn_face.red, btn_face.green, - btn_face.blue); + btn_face.blue, + (xp_theme ? "etched-in" : "out")); + gtk_rc_parse_string(buf); + + g_snprintf(buf, sizeof (buf), + "style \"msw-toolbar\" = \"msw-default\"\n" + "{\n" + "GtkHandleBox::shadow-type = %s\n" + "GtkToolbar::shadow-type = %s\n" + "}widget_class \"*HandleBox*\" style \"msw-toolbar\"\n", + (xp_theme ? "none" : "out"), + (xp_theme ? "none" : "out")); gtk_rc_parse_string(buf); /* enable tooltip fonts */ @@ -715,9 +725,12 @@ setup_msw_rc_style(void) "GtkRange::stepper-size = %d\n" "GtkRange::stepper-spacing = 0\n" "GtkRange::trough_border = 0\n" - "}widget_class \"*VScrollbar*\" style \"msw-vscrollbar\"\n", + "GtkScale::slider-length = %d\n" + "}widget_class \"*VScrollbar*\" style \"msw-vscrollbar\"\n" + "widget_class \"*VScale*\" style \"msw-vscrollbar\"\n", GetSystemMetrics(SM_CYVTHUMB), - get_system_metric(XP_THEME_CLASS_SCROLLBAR, SM_CXVSCROLL)); + get_system_metric(XP_THEME_CLASS_SCROLLBAR, SM_CXVSCROLL), + 11); gtk_rc_parse_string(buf); g_snprintf(buf, sizeof (buf), @@ -726,9 +739,12 @@ setup_msw_rc_style(void) "GtkRange::stepper-size = %d\n" "GtkRange::stepper-spacing = 0\n" "GtkRange::trough_border = 0\n" - "}widget_class \"*HScrollbar*\" style \"msw-hscrollbar\"\n", + "GtkScale::slider-length = %d\n" + "}widget_class \"*HScrollbar*\" style \"msw-hscrollbar\"\n" + "widget_class \"*HScale*\" style \"msw-hscrollbar\"\n", GetSystemMetrics(SM_CXHTHUMB), - get_system_metric(XP_THEME_CLASS_SCROLLBAR, SM_CYHSCROLL)); + get_system_metric(XP_THEME_CLASS_SCROLLBAR, SM_CYHSCROLL), + 11); gtk_rc_parse_string(buf); /* radio/check button sizes */ @@ -1405,13 +1421,13 @@ draw_box (GtkStyle *style, return; } } - else if (detail && !strcmp (detail, "slider")) { if (GTK_IS_SCROLLBAR(widget)) { GtkScrollbar * scrollbar = GTK_SCROLLBAR(widget); gboolean is_v = GTK_IS_VSCROLLBAR(widget); + if (xp_theme_draw(window, is_v ? XP_THEME_ELEMENT_SCROLLBAR_V @@ -1479,8 +1495,7 @@ draw_box (GtkStyle *style, { gboolean is_vertical = GTK_IS_VSCROLLBAR(widget); - if (GTK_IS_RANGE(widget) - && xp_theme_draw(window, + if (xp_theme_draw(window, is_vertical ? XP_THEME_ELEMENT_TROUGH_V : XP_THEME_ELEMENT_TROUGH_H, @@ -1526,14 +1541,23 @@ draw_box (GtkStyle *style, { gboolean is_vertical = GTK_IS_VSCALE(widget); - parent_class->draw_box (style, window, state_type, GTK_SHADOW_NONE, area, + if(!xp_theme_is_active ()) { + parent_class->draw_box (style, window, state_type, GTK_SHADOW_NONE, area, widget, detail, x, y, width, height); + } - if(is_vertical) - parent_class->draw_box(style, window, state_type, GTK_SHADOW_ETCHED_IN, area, NULL, NULL, (2 * x + width)/2, y, 1, height); - else - parent_class->draw_box(style, window, state_type, GTK_SHADOW_ETCHED_IN, area, NULL, NULL, x, (2 * y + height)/2, width, 1); + if(is_vertical) { + if(xp_theme_draw(window, XP_THEME_ELEMENT_SCALE_TROUGH_V, style, (2 * x + width)/2, y, 2, height, state_type, area)) + return; + parent_class->draw_box(style, window, state_type, GTK_SHADOW_ETCHED_IN, area, NULL, NULL, (2 * x + width)/2, y, 1, height); + } + else { + if(xp_theme_draw(window, XP_THEME_ELEMENT_SCALE_TROUGH_H, style, x, (2 * y + height)/2, width, 2, state_type, area)) + return; + + parent_class->draw_box(style, window, state_type, GTK_SHADOW_ETCHED_IN, area, NULL, NULL, x, (2 * y + height)/2, width, 1); + } return; } } @@ -1546,64 +1570,70 @@ draw_box (GtkStyle *style, } } else if (detail && (strcmp (detail, "vscrollbar") == 0 || strcmp (detail, "hscrollbar") == 0)) - { - GtkScrollbar * scrollbar = GTK_SCROLLBAR(widget); - if (shadow_type == GTK_SHADOW_IN) - shadow_type = GTK_SHADOW_ETCHED_IN; - if (scrollbar->range.adjustment->page_size >= (scrollbar->range.adjustment->upper-scrollbar->range.adjustment->lower)) - shadow_type = GTK_SHADOW_OUT; - } - else if (detail && strcmp (detail, "handlebox_bin") == 0) - { + { + GtkScrollbar * scrollbar = GTK_SCROLLBAR(widget); + if (shadow_type == GTK_SHADOW_IN) + shadow_type = GTK_SHADOW_ETCHED_IN; + if (scrollbar->range.adjustment->page_size >= (scrollbar->range.adjustment->upper-scrollbar->range.adjustment->lower)) + shadow_type = GTK_SHADOW_OUT; + } + else if (detail && (strcmp (detail, "handlebox_bin") == 0 || strcmp (detail, "toolbar") == 0 || + strcmp (detail, "menubar") == 0)) + { if (xp_theme_draw(window, XP_THEME_ELEMENT_REBAR, style, x, y, width, height, state_type, area)) { return; } + } + else if (detail && + (!strcmp(detail, "handlebox"))) /* grip */ + { } else - { - const gchar * name = gtk_widget_get_name (widget); - - if (name && !strcmp (name, "gtk-tooltips")) { - if (xp_theme_draw (window, XP_THEME_ELEMENT_TOOLTIP, style, x, y, width, height, state_type, area)) - { - return; - } - else { - HBRUSH brush; - gint xoff, yoff; - GdkDrawable *drawable; - RECT rect; - HDC hdc; - - if (!GDK_IS_WINDOW(window)) - { - xoff = 0; - yoff = 0; - drawable = window; - } - else - { - gdk_window_get_internal_paint_info(window, &drawable, &xoff, &yoff); - } - - rect.left = x - xoff; - rect.top = y - yoff; - rect.right = rect.left + width; - rect.bottom = rect.top + height; - - hdc = gdk_win32_hdc_get(window, style->dark_gc[state_type], 0); - brush = GetSysColorBrush(COLOR_3DDKSHADOW); - if (brush) - FrameRect(hdc, &rect, brush); - InflateRect(&rect, -1, -1); - FillRect(hdc, &rect, (HBRUSH) (COLOR_INFOBK+1)); - - return; - } - } - } + { + const gchar * name = gtk_widget_get_name (widget); + + if (name && !strcmp (name, "gtk-tooltips")) { + if (xp_theme_draw (window, XP_THEME_ELEMENT_TOOLTIP, style, x, y, width, height, state_type, area)) + { + return; + } + else { + HBRUSH brush; + gint xoff, yoff; + GdkDrawable *drawable; + RECT rect; + HDC hdc; + + if (!GDK_IS_WINDOW(window)) + { + xoff = 0; + yoff = 0; + drawable = window; + } + else + { + gdk_window_get_internal_paint_info(window, &drawable, &xoff, &yoff); + } + + rect.left = x - xoff; + rect.top = y - yoff; + rect.right = rect.left + width; + rect.bottom = rect.top + height; + + hdc = gdk_win32_hdc_get(window, style->dark_gc[state_type], 0); + brush = GetSysColorBrush(COLOR_3DDKSHADOW); + if (brush) + FrameRect(hdc, &rect, brush); + InflateRect(&rect, -1, -1); + FillRect(hdc, &rect, (HBRUSH) (COLOR_INFOBK+1)); + + return; + } + + } + } parent_class->draw_box (style, window, state_type, shadow_type, area, widget, detail, x, y, width, height); @@ -1698,26 +1728,28 @@ draw_extension(GtkStyle *style, { GtkNotebook *notebook = GTK_NOTEBOOK(widget); GtkPositionType pos_type = gtk_notebook_get_tab_pos(notebook); + gint x2, y2, w2, h2; - if (pos_type == GTK_POS_TOP && state_type == GTK_STATE_NORMAL) - height += XP_EDGE_SIZE; + x2 = x; y2 = y; w2 = width; h2 = height; + if (pos_type == GTK_POS_TOP && state_type == GTK_STATE_NORMAL) { + /*h2 += XP_EDGE_SIZE;*/ + } + else if (pos_type == GTK_POS_BOTTOM && state_type == GTK_STATE_NORMAL) { + /*h2 += XP_EDGE_SIZE;*/ + } + else if (pos_type == GTK_POS_LEFT && state_type == GTK_STATE_NORMAL) { + x2 += 1; + w2 -= XP_EDGE_SIZE; + } + else if (pos_type == GTK_POS_RIGHT && state_type == GTK_STATE_NORMAL) { + w2 -= (XP_EDGE_SIZE + 1); + } -#if 0 - /* FIXME: pos != TOP to be implemented */ - else if (pos_type == GTK_POS_BOTTOM) - y -= XP_EDGE_SIZE; - else if (pos_type == GTK_POS_RIGHT) - width += XP_EDGE_SIZE; - else if (pos_type == GTK_POS_LEFT) - height -= XP_EDGE_SIZE; -#endif - - if (pos_type == GTK_POS_TOP - && xp_theme_draw + if (xp_theme_draw (window, gtk_notebook_get_current_page(notebook)==0 ? XP_THEME_ELEMENT_TAB_ITEM_LEFT_EDGE : XP_THEME_ELEMENT_TAB_ITEM, - style, x, y, width, height, state_type, area)) + style, x2, y2, w2, h2, state_type, area)) { return; } @@ -1805,14 +1837,23 @@ draw_hline (GtkStyle *style, gint x2, gint y) { - +#if 0 if (detail && !strcmp(detail, "menuitem")) { if (xp_theme_draw(window, XP_THEME_ELEMENT_MENU_SEPARATOR, style, x1, y, x2, style->ythickness, state_type, area)) { return; } + } else if (detail && !strcmp(detail, "toolbar")) { + if (xp_theme_draw(window, XP_THEME_ELEMENT_TOOLBAR_SEPARATOR_H, style, + x1, y, x2, style->ythickness, state_type, area)) { + return; + } } + if(xp_theme_draw(window, XP_THEME_ELEMENT_LINE_H, style, x1, y, x2, style->ythickness, state_type, area)) + return; +#endif + parent_class->draw_hline (style, window, state_type, area, widget, detail, x1, x2, y); } @@ -1828,10 +1869,45 @@ draw_vline (GtkStyle *style, gint y2, gint x) { +#if 0 + if (detail && !strcmp(detail, "toolbar")) { + if (xp_theme_draw(window, XP_THEME_ELEMENT_TOOLBAR_SEPARATOR_V, style, + x, y1, style->xthickness, y2, state_type, area)) { + return; + } + } + + if(xp_theme_draw(window, XP_THEME_ELEMENT_LINE_V, style, x, y1, style->xthickness, y2, state_type, area)) + return; +#endif + parent_class->draw_vline (style, window, state_type, area, widget, detail, y1, y2, x); } +static void +draw_slider (GtkStyle *style, + GdkWindow *window, + GtkStateType state_type, + GtkShadowType shadow_type, + GdkRectangle *area, + GtkWidget *widget, + const gchar *detail, + gint x, + gint y, + gint width, + gint height, + GtkOrientation orientation) +{ + if(GTK_IS_SCALE(widget) && + xp_theme_draw(window, ((orientation == GTK_ORIENTATION_VERTICAL) ? XP_THEME_ELEMENT_SCALE_SLIDER_V : XP_THEME_ELEMENT_SCALE_SLIDER_H), style, x, y, width, height, state_type, area)) { + return; + } + + parent_class->draw_slider (style, window, state_type, shadow_type, area, widget, + detail, x, y, width, height, orientation); +} + static void draw_resize_grip (GtkStyle *style, GdkWindow *window, @@ -1846,12 +1922,9 @@ draw_resize_grip (GtkStyle *style, gint height) { if (detail && !strcmp(detail, "statusbar")) { -#if 0 - /* DAL: TODO: find out why this regressed */ if (xp_theme_draw(window, XP_THEME_ELEMENT_STATUS_GRIPPER, style, x, y, width, height, state_type, area)) return; -#endif } parent_class->draw_resize_grip (style, window, state_type, area, @@ -1888,63 +1961,51 @@ draw_handle (GtkStyle *style, { return; } + } - /* grippers are just flat boxes when they're not a toolbar */ - parent_class->draw_box (style, window, state_type, shadow_type, - area, widget, detail, x, y, width, height); - } - else if (!GTK_IS_PANED (widget)) + if (!GTK_IS_PANED(widget)) { + gint xthick, ythick; + GdkGC *light_gc, *dark_gc, *shadow_gc; + GdkRectangle dest; + + sanitize_size (window, &width, &height); + + gtk_paint_box(style, window, state_type, shadow_type, area, widget, + detail, x, y, width, height); + + light_gc = style->light_gc[state_type]; + dark_gc = style->dark_gc[state_type]; + shadow_gc = style->mid_gc[state_type]; + + xthick = style->xthickness; + ythick = style->ythickness; + + dest.x = x + xthick; + dest.y = y + ythick; + dest.width = width - (xthick * 2); + dest.height = height - (ythick * 2); + + gdk_gc_set_clip_rectangle(light_gc, &dest); + gdk_gc_set_clip_rectangle(dark_gc, &dest); + gdk_gc_set_clip_rectangle(shadow_gc, &dest); + + if (dest.width < dest.height) { - /* TODO: Draw handle boxes as double lines: || */ - parent_class->draw_handle (style, window, state_type, shadow_type, - area, widget, detail, x, y, width, height, - orientation); - } -} - -static GdkPixbuf * -render_icon (GtkStyle *style, - const GtkIconSource *source, - GtkTextDirection direction, - GtkStateType state, - GtkIconSize size, - GtkWidget *widget, - const gchar *detail) -{ - if (gtk_icon_source_get_state_wildcarded (source) && state == GTK_STATE_INSENSITIVE) - { - GdkPixbuf *normal, *insensitive; - int i, j, w, h, rs; - guchar *pixels, *row; - - normal = parent_class->render_icon (style, source, direction, - GTK_STATE_NORMAL, size, - widget, detail); - /* copy and add alpha channel at the same time */ - insensitive = gdk_pixbuf_add_alpha (normal, FALSE, 0, 0, 0); - g_object_unref (normal); - /* remove all colour */ - gdk_pixbuf_saturate_and_pixelate (insensitive, insensitive, 0.0, FALSE); - /* make partially transparent */ - w = gdk_pixbuf_get_width (insensitive); - h = gdk_pixbuf_get_height (insensitive); - rs = gdk_pixbuf_get_rowstride (insensitive); - pixels = gdk_pixbuf_get_pixels (insensitive); - for (j=0; jrender_icon (style, source, direction, - state, size, - widget, detail); + + gdk_draw_line(window, light_gc, dest.x, dest.y, dest.x + dest.width, dest.y); + gdk_draw_line(window, dark_gc, dest.x, dest.y + (dest.height / 2), dest.x + dest.width, dest.y + (dest.height / 2)); + gdk_draw_line(window, shadow_gc, dest.x, dest.y + dest.height, dest.x + dest.width, dest.y + dest.height); + } + + gdk_gc_set_clip_rectangle(shadow_gc, NULL); + gdk_gc_set_clip_rectangle(light_gc, NULL); + gdk_gc_set_clip_rectangle(dark_gc, NULL); } } @@ -1979,7 +2040,7 @@ msw_style_class_init (MswStyleClass *klass) style_class->draw_vline = draw_vline; style_class->draw_handle = draw_handle; style_class->draw_resize_grip = draw_resize_grip; - style_class->render_icon = render_icon; + style_class->draw_slider = draw_slider; } GType msw_type_style = 0; diff --git a/modules/engines/ms-windows/xp_theme.c b/modules/engines/ms-windows/xp_theme.c index 2400786f91..0d1c744024 100755 --- a/modules/engines/ms-windows/xp_theme.c +++ b/modules/engines/ms-windows/xp_theme.c @@ -51,6 +51,35 @@ #define TMT_MSGBOXFONT 805 #endif +#define GP_LINEHORZ 2 +#define GP_LINEVERT 3 +#define TP_SEPARATOR 5 +#define TP_SEPARATORVERT 6 + +/* GLOBALS LINEHORZ states */ +#define LHS_FLAT 1 +#define LHS_RAISED 2 +#define LHS_SUNKEN 3 + +/* GLOBAL LINEVERT states */ +#define LVS_FLAT 1 +#define LVS_RAISED 2 +#define LVS_SUNKEN 3 + +/* TRACKBAR parts */ +#define TKP_TRACK 1 +#define TKP_TRACKVERT 2 +#define TKP_THUMB 3 +#define TKP_THUMBBOTTOM 4 +#define TKP_THUMBTOP 5 +#define TKP_THUMBVERT 6 +#define TKP_THUMBLEFT 7 +#define TKP_THUMBRIGHT 8 +#define TKP_TICS 9 +#define TKP_TICSVERT 10 + +#define TRS_NORMAL 1 + static const LPCWSTR class_descriptors[] = { L"Scrollbar", /* XP_THEME_CLASS_SCROLLBAR */ @@ -68,7 +97,8 @@ static const LPCWSTR class_descriptors[] = L"Globals", /* XP_THEME_CLASS_GLOBALS */ L"Menu", /* XP_THEME_CLASS_MENU */ L"Window", /* XP_THEME_CLASS_WINDOW */ - L"Status" /* XP_THEME_CLASS_STATUS */ + L"Status", /* XP_THEME_CLASS_STATUS */ + L"Trackbar" /* XP_THEME_CLASS_TRACKBAR */ }; static const short element_part_map[]= @@ -105,7 +135,7 @@ static const short element_part_map[]= PP_BAR, PP_BARVERT, TTP_STANDARD, - RP_BAND, + 0 /*RP_BAND*/, RP_GRIPPER, RP_GRIPPERVERT, RP_CHEVRON, @@ -113,7 +143,17 @@ static const short element_part_map[]= MP_MENUITEM, MP_SEPARATOR, SP_GRIPPER, - SP_PANE + SP_PANE, + GP_LINEHORZ, + GP_LINEVERT, + TP_SEPARATOR, + TP_SEPARATORVERT, + TKP_TRACK, + TKP_TRACKVERT, + TKP_THUMB, + TKP_THUMBVERT, + TKP_TICS, + TKP_TICSVERT }; static HINSTANCE uxtheme_dll = NULL; @@ -172,9 +212,8 @@ xp_theme_init (void) memset(open_themes, 0, sizeof(open_themes)); uxtheme_dll = LoadLibrary("uxtheme.dll"); - if (!uxtheme_dll) { + if (!uxtheme_dll) return; - } is_app_themed_func = (IsAppThemedFunc) GetProcAddress(uxtheme_dll, "IsAppThemed"); @@ -251,12 +290,23 @@ xp_theme_get_handle_by_element (XpThemeElement element) klazz = XP_THEME_CLASS_REBAR; break; + case XP_THEME_ELEMENT_SCALE_TROUGH_H: + case XP_THEME_ELEMENT_SCALE_TROUGH_V: + case XP_THEME_ELEMENT_SCALE_SLIDER_H: + case XP_THEME_ELEMENT_SCALE_SLIDER_V: + case XP_THEME_ELEMENT_SCALE_TICS_H: + case XP_THEME_ELEMENT_SCALE_TICS_V: + klazz = XP_THEME_CLASS_TRACKBAR; + break; + case XP_THEME_ELEMENT_STATUS_GRIPPER: case XP_THEME_ELEMENT_STATUS_PANE: klazz = XP_THEME_CLASS_STATUS; break; case XP_THEME_ELEMENT_TOOLBAR_BUTTON: + case XP_THEME_ELEMENT_TOOLBAR_SEPARATOR_H: + case XP_THEME_ELEMENT_TOOLBAR_SEPARATOR_V: klazz = XP_THEME_CLASS_TOOLBAR; break; @@ -323,6 +373,11 @@ xp_theme_get_handle_by_element (XpThemeElement element) klazz = XP_THEME_CLASS_TREEVIEW; break; + case XP_THEME_ELEMENT_LINE_H: + case XP_THEME_ELEMENT_LINE_V: + klazz = XP_THEME_CLASS_GLOBALS; + break; + default: break; } @@ -351,7 +406,7 @@ xp_theme_map_gtk_state (XpThemeElement element, GtkStateType state) case XP_THEME_ELEMENT_REBAR_GRIPPER_H: case XP_THEME_ELEMENT_REBAR_GRIPPER_V: - ret = CHEVS_NORMAL; + ret = 0; break; case XP_THEME_ELEMENT_STATUS_GRIPPER: @@ -374,6 +429,11 @@ xp_theme_map_gtk_state (XpThemeElement element, GtkStateType state) } break; + case XP_THEME_ELEMENT_TOOLBAR_SEPARATOR_H: + case XP_THEME_ELEMENT_TOOLBAR_SEPARATOR_V: + ret = TS_NORMAL; + break; + case XP_THEME_ELEMENT_TOOLBAR_BUTTON: switch (state) { @@ -430,10 +490,13 @@ xp_theme_map_gtk_state (XpThemeElement element, GtkStateType state) } break; - case XP_THEME_ELEMENT_SCROLLBAR_H: - case XP_THEME_ELEMENT_SCROLLBAR_V: case XP_THEME_ELEMENT_TROUGH_H: case XP_THEME_ELEMENT_TROUGH_V: + ret = SCRBS_NORMAL; + break; + + case XP_THEME_ELEMENT_SCROLLBAR_H: + case XP_THEME_ELEMENT_SCROLLBAR_V: switch(state) { case GTK_STATE_SELECTED: @@ -635,6 +698,27 @@ xp_theme_map_gtk_state (XpThemeElement element, GtkStateType state) } break; + case XP_THEME_ELEMENT_LINE_H: + switch(state) { + /* LHS_FLAT, LHS_RAISED, LHS_SUNKEN */ + ret = LHS_RAISED; + break; + } + break; + + case XP_THEME_ELEMENT_LINE_V: + switch(state) { + /* LVS_FLAT, LVS_RAISED, LVS_SUNKEN */ + ret = LVS_RAISED; + break; + } + break; + + case XP_THEME_ELEMENT_SCALE_TROUGH_H: + case XP_THEME_ELEMENT_SCALE_TROUGH_V: + ret = TRS_NORMAL; + break; + default: switch(state) { @@ -713,34 +797,13 @@ xp_theme_draw (GdkWindow *win, XpThemeElement element, GtkStyle *style, part_state = xp_theme_map_gtk_state(element, state_type); -#ifdef GNATS_HACK - if (element == XP_THEME_ELEMENT_REBAR_GRIPPER_V - || element == XP_THEME_ELEMENT_REBAR_GRIPPER_H) - { - /* Hack alert: when XP draws a gripper, it does not seem to fill - up the whole rectangle. It only fills the gripper line - itself. Therefore we manually fill up the background here - ourselves. I still have to look into this a bit further, as - tests with GNAT Programming System show some awkward - interference between this FillRect and the subsequent - DrawThemeBackground(). */ - FillRect (dc, &rect, (HBRUSH) (COLOR_3DFACE+1)); - } -#endif - - if (is_theme_partially_transparent_func && draw_theme_parent_background_func && - is_theme_partially_transparent_func(theme, element_part_map[element], part_state)) - { - draw_theme_parent_background_func(GDK_WINDOW_HWND(win), dc, pClip); - } - draw_theme_background_func(theme, dc, element_part_map[element], part_state, &rect, pClip); gdk_win32_hdc_release(drawable, style->dark_gc[state_type], 0); return TRUE; } -static gboolean +gboolean xp_theme_is_active (void) { gboolean active = FALSE; @@ -768,13 +831,13 @@ xp_theme_is_drawable (XpThemeElement element) } gboolean -xp_theme_get_system_font (XpThemeClass klazz, XpThemeFont fontId, LOGFONT *lf) +xp_theme_get_system_font (XpThemeClass klazz, XpThemeFont fontId, OUT LOGFONT *lf) { - int themeFont; - - if (get_theme_sys_font_func != NULL) + if (xp_theme_is_active () && get_theme_sys_font_func != NULL) { HTHEME theme = xp_theme_get_handle_by_class(klazz); + int themeFont; + if (!theme) return FALSE; @@ -797,9 +860,9 @@ xp_theme_get_system_font (XpThemeClass klazz, XpThemeFont fontId, LOGFONT *lf) } gboolean -xp_theme_get_system_color (XpThemeClass klazz, int colorId, DWORD * pColor) +xp_theme_get_system_color (XpThemeClass klazz, int colorId, OUT DWORD * pColor) { - if (get_theme_sys_color_func != NULL) + if (xp_theme_is_active () && get_theme_sys_color_func != NULL) { HTHEME theme = xp_theme_get_handle_by_class(klazz); @@ -811,9 +874,9 @@ xp_theme_get_system_color (XpThemeClass klazz, int colorId, DWORD * pColor) } gboolean -xp_theme_get_system_metric (XpThemeClass klazz, int metricId, int * pVal) +xp_theme_get_system_metric (XpThemeClass klazz, int metricId, OUT int * pVal) { - if (get_theme_sys_metric_func != NULL) + if (xp_theme_is_active () && get_theme_sys_metric_func != NULL) { HTHEME theme = xp_theme_get_handle_by_class(klazz); diff --git a/modules/engines/ms-windows/xp_theme.h b/modules/engines/ms-windows/xp_theme.h index 53c95cf8c5..4627590e87 100755 --- a/modules/engines/ms-windows/xp_theme.h +++ b/modules/engines/ms-windows/xp_theme.h @@ -43,6 +43,7 @@ typedef enum XP_THEME_CLASS_MENU, XP_THEME_CLASS_WINDOW, XP_THEME_CLASS_STATUS, + XP_THEME_CLASS_TRACKBAR, XP_THEME_CLASS__SIZEOF } XpThemeClass; @@ -89,6 +90,16 @@ typedef enum XP_THEME_ELEMENT_MENU_SEPARATOR, XP_THEME_ELEMENT_STATUS_GRIPPER, XP_THEME_ELEMENT_STATUS_PANE, + XP_THEME_ELEMENT_LINE_H, + XP_THEME_ELEMENT_LINE_V, + XP_THEME_ELEMENT_TOOLBAR_SEPARATOR_H, + XP_THEME_ELEMENT_TOOLBAR_SEPARATOR_V, + XP_THEME_ELEMENT_SCALE_TROUGH_H, + XP_THEME_ELEMENT_SCALE_TROUGH_V, + XP_THEME_ELEMENT_SCALE_SLIDER_H, + XP_THEME_ELEMENT_SCALE_SLIDER_V, + XP_THEME_ELEMENT_SCALE_TICS_H, + XP_THEME_ELEMENT_SCALE_TICS_V, XP_THEME_ELEMENT__SIZEOF } XpThemeElement; @@ -108,8 +119,10 @@ gboolean xp_theme_draw (GdkWindow *win, XpThemeElement element, int height, GtkStateType state_type, GdkRectangle *area); gboolean xp_theme_is_drawable (XpThemeElement element); -gboolean xp_theme_get_system_font (XpThemeClass klazz, XpThemeFont fontId, LOGFONT *lf); -gboolean xp_theme_get_system_color (XpThemeClass klazz, int colorId, DWORD * pColor); -gboolean xp_theme_get_system_metric (XpThemeClass klazz, int metricId, int * pVal); +gboolean xp_theme_get_system_font (XpThemeClass klazz, XpThemeFont fontId, OUT LOGFONT *lf); +gboolean xp_theme_get_system_color (XpThemeClass klazz, int colorId, OUT DWORD * pColor); +gboolean xp_theme_get_system_metric (XpThemeClass klazz, int metricId, OUT int * pVal); + +gboolean xp_theme_is_active (void); #endif /* XP_THEME_H */ diff --git a/modules/engines/ms-windows/xp_theme_defs.h b/modules/engines/ms-windows/xp_theme_defs.h index f0f2d87e9a..14376331e2 100644 --- a/modules/engines/ms-windows/xp_theme_defs.h +++ b/modules/engines/ms-windows/xp_theme_defs.h @@ -48,8 +48,10 @@ typedef HANDLE HTHEME; #define SBP_ARROWBTN 1 #define SBP_THUMBBTNHORZ 2 #define SBP_THUMBBTNVERT 3 -#define SBP_LOWERTRACKHORZ 5 +#define SBP_LOWERTRACKHORZ 4 +#define SBP_UPPERTRACKHORZ 5 #define SBP_LOWERTRACKVERT 6 +#define SBP_UPPERTRACKVERT 7 #define SBP_GRIPPERHORZ 8 #define SBP_GRIPPERVERT 9 @@ -151,7 +153,7 @@ typedef HANDLE HTHEME; #define MS_SELECTED 2 #define MS_DEMOTED 3 -#define SP_PANE 1 -#define SP_GRIPPER 2 +#define SP_PANE 2 +#define SP_GRIPPER 3 #endif /* XP_THEME_DFNS_H */