]> Pileus Git - ~andy/gtk/commitdiff
Win32 drop shadow goodness
authorCody Russell <bratsche@src.gnome.org>
Wed, 25 Apr 2007 23:44:54 +0000 (23:44 +0000)
committerCody Russell <bratsche@src.gnome.org>
Wed, 25 Apr 2007 23:44:54 +0000 (23:44 +0000)
svn path=/trunk/; revision=17643

ChangeLog
docs/reference/gdk/tmpl/windows.sgml
gdk/directfb/gdkwindow-directfb.c
gdk/gdkwindow.h
gdk/linux-fb/gdkwindow-fb.c
gdk/quartz/gdkwindow-quartz.c
gdk/win32/gdkwindow-win32.c
gdk/x11/gdkwindow-x11.c
gtk/gtkhandlebox.c
gtk/gtkwindow.c

index 9c0cecea7aca10be22564fdfa79fcf27d2e17a4b..fe1e77967d36b9ace0b56c2b2dcd7d9996e7b492 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,16 @@
+2007-04-25  Cody Russell  <bratsche@gnome.org>
+
+       * gdk/gdkwindow.h:
+       * gtk/gtkwidget.c:
+       * gtk/gtkhandlebox.c:
+       * gdk/directfb/gdkwindow-directfb.c:
+       * gdk/linux-fb/gdkwindow-fb.c:
+       * gdk/quartz/gdkwindow-quartz.c:
+       * gdk/win32/gdkwindow-win32.c:
+       * gdk/x11/gdkwindow-x11.c:
+       Added window type hint and implement drop shadows on Win32
+       for menus, tooltips, etc. (#148535, Tim Evans, Dom Lachowicz)
+
 2007-04-25  Jakub Steiner <jimmac@ximian.com>
 
        * gtk/stock-icons/16/gtk-close.{png,svg}: added 16x16 version of
index 3d79c6c5fcd611ae7c3b66fa3cbcc3eb90b73bdb..2f87774e0d4c3ab7c8f862f9eb90e84679db32c6 100644 (file)
@@ -237,6 +237,7 @@ Attributes to use for a newly-created window.
 @wmclass_name: don't use (see gtk_window_set_wmclass())
 @wmclass_class: don't use (see gtk_window_set_wmclass())
 @override_redirect: %TRUE to bypass the window manager
+@type_hint: a hint of the function of the window
 
 <!-- ##### ENUM GdkWindowAttributesType ##### -->
 <para>
@@ -256,6 +257,7 @@ corresponding flag in #GdkWindowAttributesType.
 @GDK_WA_VISUAL: Honor the visual field
 @GDK_WA_WMCLASS: Honor the wmclass_class and wmclass_name fields
 @GDK_WA_NOREDIR: Honor the override_redirect field
+@GDK_WA_TYPE_HINT: Honor the type_hint field
 
 <!-- ##### FUNCTION gdk_window_new ##### -->
 <para>
index 9c40031642eacc8508e73c82d7d5aeb8da276214..0c5cdf43e4673c0a83f53b357ae642d729c88f25 100644 (file)
@@ -559,6 +559,9 @@ gdk_directfb_window_new (GdkWindow              *parent,
       gdk_directfb_event_windows_add (window);
     }
 
+  if (attributes_mask & GDK_WA_TYPE_HINT)
+    gdk_window_set_type_hint (window, attributes->type_hint);
+
   return window;
 }
 
index be1fc2b1e3c60ffc80ffe4cb7ad75009d78b3a23..325c4b3d88ea45d2ba74f083cc42d61c01227310 100644 (file)
@@ -85,14 +85,15 @@ typedef enum
  */
 typedef enum
 {
-  GDK_WA_TITLE   = 1 << 1,
-  GDK_WA_X       = 1 << 2,
-  GDK_WA_Y       = 1 << 3,
-  GDK_WA_CURSOR          = 1 << 4,
-  GDK_WA_COLORMAP = 1 << 5,
-  GDK_WA_VISUAL          = 1 << 6,
-  GDK_WA_WMCLASS  = 1 << 7,
-  GDK_WA_NOREDIR  = 1 << 8
+  GDK_WA_TITLE    = 1 << 1,
+  GDK_WA_X        = 1 << 2,
+  GDK_WA_Y        = 1 << 3,
+  GDK_WA_CURSOR           = 1 << 4,
+  GDK_WA_COLORMAP  = 1 << 5,
+  GDK_WA_VISUAL           = 1 << 6,
+  GDK_WA_WMCLASS   = 1 << 7,
+  GDK_WA_NOREDIR   = 1 << 8,
+  GDK_WA_TYPE_HINT = 1 << 9
 } GdkWindowAttributesType;
 
 /* Size restriction enumeration.
@@ -213,6 +214,7 @@ struct _GdkWindowAttr
   gchar *wmclass_name;
   gchar *wmclass_class;
   gboolean override_redirect;
+  GdkWindowTypeHint type_hint;
 };
 
 struct _GdkGeometry
index bd0f5494df396570e1fb39ac8a0f26b938edd4da..fa0e025722fd237381270f0938ea7f2eb0c5bbd4 100644 (file)
@@ -268,6 +268,9 @@ gdk_window_new (GdkWindow     *parent,
   if (parent_private)
     parent_private->children = g_list_prepend (parent_private->children, window);
   
+  if (attributes_mask & GDK_WA_TYPE_HINT)
+    gdk_window_set_type_hint (window, attributes->type_hint);
+
   return window;
 }
 
index 93b2f218e87e9dca6eb8160b3a8bb8df18226b04..600306418028bec8e90eaf00f8991afa64582540 100644 (file)
@@ -708,6 +708,9 @@ gdk_window_new (GdkWindow     *parent,
 
   GDK_QUARTZ_RELEASE_POOL;
 
+  if (attributes_mask & GDK_WA_TYPE_HINT)
+    gdk_window_set_type_hint (window, attributes->type_hint);
+
   return window;
 }
 
index 3a52f5824b96335f367702f6098c6a6176b59a29..9d029619ab37496013cac71b600505af74cf21d5 100644 (file)
@@ -311,12 +311,13 @@ get_default_title (void)
  *   get its own class
  */
 static ATOM
-RegisterGdkClass (GdkWindowType wtype)
+RegisterGdkClass (GdkWindowType wtype, GdkWindowTypeHint wtype_hint)
 {
-  static ATOM klassTOPLEVEL = 0;
-  static ATOM klassDIALOG   = 0;
-  static ATOM klassCHILD    = 0;
-  static ATOM klassTEMP     = 0;
+  static ATOM klassTOPLEVEL   = 0;
+  static ATOM klassDIALOG     = 0;
+  static ATOM klassCHILD      = 0;
+  static ATOM klassTEMP       = 0;
+  static ATOM klassTEMPSHADOW = 0;
   static HICON hAppIcon = NULL;
   static HICON hAppIconSm = NULL;
   static WNDCLASSEXW wcl; 
@@ -412,14 +413,35 @@ RegisterGdkClass (GdkWindowType wtype)
       break;
       
     case GDK_WINDOW_TEMP:
-      if (0 == klassTEMP)
-       {
-         wcl.lpszClassName = L"gdkWindowTemp";
-         wcl.style |= CS_SAVEBITS;
-         ONCE_PER_CLASS ();
-         klassTEMP = RegisterClassExW (&wcl);
-       }
-      klass = klassTEMP;
+      if ((wtype_hint == GDK_WINDOW_TYPE_HINT_MENU) ||
+          (wtype_hint == GDK_WINDOW_TYPE_HINT_DROPDOWN_MENU) ||
+          (wtype_hint == GDK_WINDOW_TYPE_HINT_POPUP_MENU) ||
+          (wtype_hint == GDK_WINDOW_TYPE_HINT_TOOLTIP))
+        {
+          if (klassTEMPSHADOW == 0)
+            {
+              wcl.lpszClassName = "gdkWindowTempShadow";
+              wcl.style |= CS_SAVEBITS;
+              if (_winver >= 0x0501) /* Windows XP (5.1) or above */
+                wcl.style |= 0x00020000; /* CS_DROPSHADOW */
+              ONCE_PER_CLASS ();
+              klassTEMPSHADOW = RegisterClassEx (&wcl);
+            }
+
+          klass = klassTEMPSHADOW;
+        }
+       else
+        {
+          if (klassTEMP == 0)
+            {
+              wcl.lpszClassName = "gdkWindowTemp";
+              wcl.style |= CS_SAVEBITS;
+              ONCE_PER_CLASS ();
+              klassTEMP = RegisterClassEx (&wcl);
+            }
+
+          klass = klassTEMP;
+        }
       break;
       
     default:
@@ -638,10 +660,15 @@ gdk_window_new_internal (GdkWindow     *parent,
 
   private->event_mask = GDK_STRUCTURE_MASK | attributes->event_mask;
       
+  if (attributes_mask & GDK_WA_TYPE_HINT)
+    impl->type_hint = attributes->type_hint;
+  else
+    impl->type_hint = GDK_WINDOW_TYPE_HINT_NORMAL;
+
   if (private->parent)
     private->parent->children = g_list_prepend (private->parent->children, window);
 
-  klass = RegisterGdkClass (private->window_type);
+  klass = RegisterGdkClass (private->window_type, impl->type_hint);
 
   wtitle = g_utf8_to_utf16 (title, -1, NULL, NULL, NULL);
   
index 533387fc6f0b66313c30f3ec45da6d1cba981cf1..fe5a0976f38a72ee2f9aac2965915a89285f8454 100644 (file)
@@ -929,6 +929,9 @@ gdk_window_new (GdkWindow     *parent,
       break;
     }
 
+  if (attributes_mask & GDK_WA_TYPE_HINT)
+    gdk_window_set_type_hint (window, attributes->type_hint);
+
   return window;
 }
 
index 6814fcfd2b13ec49af1317e2a839d1157deea80c..064f3354eeff8a0fd47955eaf17bc518783f854b 100644 (file)
@@ -441,7 +441,8 @@ gtk_handle_box_realize (GtkWidget *widget)
                           GDK_LEAVE_NOTIFY_MASK |
                           GDK_FOCUS_CHANGE_MASK |
                           GDK_STRUCTURE_MASK);
-  attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP;
+  attributes.type_hint = GDK_WINDOW_TYPE_HINT_TOOLBAR;
+  attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP | GDK_WA_TYPE_HINT;
   hb->float_window = gdk_window_new (gtk_widget_get_root_window (widget),
                                     &attributes, attributes_mask);
   gdk_window_set_user_data (hb->float_window, widget);
index b780c61c72c08a6f1cb05a151394c9b66060e17f..0b47429f1bd6b5aa481902ad3ac68ff8b56d92ab 100644 (file)
@@ -4441,8 +4441,9 @@ gtk_window_realize (GtkWidget *widget)
                            GDK_LEAVE_NOTIFY_MASK |
                            GDK_FOCUS_CHANGE_MASK |
                            GDK_STRUCTURE_MASK);
+  attributes.type_hint = priv->type_hint;
 
-  attributes_mask |= GDK_WA_VISUAL | GDK_WA_COLORMAP;
+  attributes_mask |= GDK_WA_VISUAL | GDK_WA_COLORMAP | GDK_WA_TYPE_HINT;
   attributes_mask |= (window->title ? GDK_WA_TITLE : 0);
   attributes_mask |= (window->wmclass_name ? GDK_WA_WMCLASS : 0);
   
@@ -4474,8 +4475,6 @@ gtk_window_realize (GtkWidget *widget)
   if (!priv->deletable)
     gdk_window_set_functions (widget->window, GDK_FUNC_ALL | GDK_FUNC_CLOSE);
 
-  gdk_window_set_type_hint (widget->window, priv->type_hint);
   if (gtk_window_get_skip_pager_hint (window))
     gdk_window_set_skip_pager_hint (widget->window, TRUE);