]> Pileus Git - ~andy/gtk/commitdiff
re-sync with gtk-wimp cvs
authorDom Lachowicz <doml@src.gnome.org>
Thu, 28 Jul 2005 12:24:25 +0000 (12:24 +0000)
committerDom Lachowicz <doml@src.gnome.org>
Thu, 28 Jul 2005 12:24:25 +0000 (12:24 +0000)
ChangeLog
ChangeLog.pre-2-10
ChangeLog.pre-2-8
modules/engines/ms-windows/Theme/gtk-2.0/gtkrc
modules/engines/ms-windows/msw_style.c
modules/engines/ms-windows/xp_theme.c
modules/engines/ms-windows/xp_theme.h
modules/engines/ms-windows/xp_theme_defs.h

index 5d9eb7e4b4aca99c9bcb6acc9af2fc13eba58cfe..ad780637dbf28673a1567fecdaeafe730724f7d4 100644 (file)
--- 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
index 5d9eb7e4b4aca99c9bcb6acc9af2fc13eba58cfe..ad780637dbf28673a1567fecdaeafe730724f7d4 100644 (file)
@@ -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
index 5d9eb7e4b4aca99c9bcb6acc9af2fc13eba58cfe..ad780637dbf28673a1567fecdaeafe730724f7d4 100644 (file)
@@ -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
index 74a4ebdee20b316550569e68f340c9f1d2ca003f..89e376372fa7a5067f37bf01edcb9e46b660b34b 100755 (executable)
@@ -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" 
   {
   }
index 070ea80f7dcb771b787a7e1903d23690918f21ca..ffb485339e1bc5ae4ba1e49d49ef860035e7df55 100755 (executable)
@@ -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,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))
-    {
-      /* 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;
index 2400786f910509e9e0c5a35e19dfab37213950ba..0d1c74402435547ceaabf62babbe9ccaa934e02a 100755 (executable)
 #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);
 
index 53c95cf8c50bc3ec9fef7a0c19aadadecff569a5..4627590e87f65c6653feeb94c5de003f3d4d2039 100755 (executable)
@@ -43,6 +43,7 @@ typedef enum
   XP_THEME_CLASS_MENU,\r
   XP_THEME_CLASS_WINDOW,\r
   XP_THEME_CLASS_STATUS,\r
+  XP_THEME_CLASS_TRACKBAR,\r
   XP_THEME_CLASS__SIZEOF\r
 } XpThemeClass;\r
 \r
@@ -89,6 +90,16 @@ typedef enum
   XP_THEME_ELEMENT_MENU_SEPARATOR,\r
   XP_THEME_ELEMENT_STATUS_GRIPPER,\r
   XP_THEME_ELEMENT_STATUS_PANE,\r
+  XP_THEME_ELEMENT_LINE_H,\r
+  XP_THEME_ELEMENT_LINE_V,\r
+  XP_THEME_ELEMENT_TOOLBAR_SEPARATOR_H,\r
+  XP_THEME_ELEMENT_TOOLBAR_SEPARATOR_V,\r
+  XP_THEME_ELEMENT_SCALE_TROUGH_H,\r
+  XP_THEME_ELEMENT_SCALE_TROUGH_V,\r
+  XP_THEME_ELEMENT_SCALE_SLIDER_H,\r
+  XP_THEME_ELEMENT_SCALE_SLIDER_V,\r
+  XP_THEME_ELEMENT_SCALE_TICS_H,\r
+  XP_THEME_ELEMENT_SCALE_TICS_V,\r
   XP_THEME_ELEMENT__SIZEOF\r
 } XpThemeElement;\r
 \r
@@ -108,8 +119,10 @@ gboolean xp_theme_draw (GdkWindow *win, XpThemeElement element,
                         int height, GtkStateType state_type,\r
                         GdkRectangle *area);\r
 gboolean xp_theme_is_drawable (XpThemeElement element);\r
-gboolean xp_theme_get_system_font (XpThemeClass klazz, XpThemeFont fontId, LOGFONT *lf);\r
-gboolean xp_theme_get_system_color (XpThemeClass klazz, int colorId, DWORD * pColor);\r
-gboolean xp_theme_get_system_metric (XpThemeClass klazz, int metricId, int * pVal);\r
+gboolean xp_theme_get_system_font (XpThemeClass klazz, XpThemeFont fontId, OUT LOGFONT *lf);\r
+gboolean xp_theme_get_system_color (XpThemeClass klazz, int colorId, OUT DWORD * pColor);\r
+gboolean xp_theme_get_system_metric (XpThemeClass klazz, int metricId, OUT int * pVal);\r
+\r
+gboolean xp_theme_is_active (void);\r
 \r
 #endif /* XP_THEME_H */\r
index f0f2d87e9a9efe6b86f59fe113c4d77be619f757..14376331e2b44cd8b1f1df2a8b92e8441e75261b 100644 (file)
@@ -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 */