summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDom Lachowicz <doml@src.gnome.org>2005-07-28 12:24:25 +0000
committerDom Lachowicz <doml@src.gnome.org>2005-07-28 12:24:25 +0000
commit3d14f381b74b13342e69afcc7f504d873ec00e95 (patch)
tree55f5c266db8aa7bcaae4f28ec50890f0b7ecc517
parent48d7e1ca92f49d9c08529a920c24397e06491b63 (diff)
downloadgtk+-3d14f381b74b13342e69afcc7f504d873ec00e95.tar.gz
re-sync with gtk-wimp cvs
-rw-r--r--ChangeLog10
-rw-r--r--ChangeLog.pre-2-1010
-rw-r--r--ChangeLog.pre-2-810
-rwxr-xr-xmodules/engines/ms-windows/Theme/gtk-2.0/gtkrc5
-rwxr-xr-xmodules/engines/ms-windows/msw_style.c375
-rwxr-xr-xmodules/engines/ms-windows/xp_theme.c139
-rwxr-xr-xmodules/engines/ms-windows/xp_theme.h19
-rw-r--r--modules/engines/ms-windows/xp_theme_defs.h8
8 files changed, 370 insertions, 206 deletions
diff --git a/ChangeLog b/ChangeLog
index 5d9eb7e4b4..ad780637db 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+2005-07-28 Dom Lachowicz <cinamod@hotmail.com>
+
+ * 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 <tml@novell.com>
* 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 <cinamod@hotmail.com>
+
+ * 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 <tml@novell.com>
* 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 <cinamod@hotmail.com>
+
+ * 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 <tml@novell.com>
* 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
+ }
+ else if (detail &&
+ (!strcmp(detail, "handlebox"))) /* grip */
{
- 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;
- }
- }
}
+ 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;
+ }
+
+ }
+ }
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;
-
-#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
+ 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 (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,11 +1869,46 @@ 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,
GtkStateType state_type,
@@ -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))
- {
- /* 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);
- }
-}
+ if (!GTK_IS_PANED(widget)) {
+ gint xthick, ythick;
+ GdkGC *light_gc, *dark_gc, *shadow_gc;
+ GdkRectangle dest;
-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)
+ 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)
{
- 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; j<h; j++)
- {
- row = pixels + j * rs;
- for (i=0; i<w; i++)
- {
- row[i*4 + 3] = (guchar)(row[i*4 + 3] * 0.6);
- }
- }
- return insensitive;
+ gdk_draw_line(window, light_gc, dest.x, dest.y, dest.x, dest.height);
+ gdk_draw_line(window, dark_gc, dest.x + (dest.width / 2), dest.y, dest.x + (dest.width / 2), dest.height);
+ gdk_draw_line(window, shadow_gc, dest.x + dest.width, dest.y, dest.x + dest.width, dest.height);
}
else
{
- return parent_class->render_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 */