From f9507b4e0831bf2b2fdc22c6b0085fe6ea81afb1 Mon Sep 17 00:00:00 2001 From: Cody Russell Date: Wed, 25 Apr 2007 23:45:09 +0000 Subject: [PATCH] Win32 drop shadow goodness svn path=/branches/gtk-2-10/; revision=17644 --- ChangeLog | 15 +++++++++ docs/reference/gdk/tmpl/windows.sgml | 2 ++ gdk/directfb/gdkwindow-directfb.c | 3 ++ gdk/gdkwindow.h | 18 +++++----- gdk/linux-fb/gdkwindow-fb.c | 3 ++ gdk/quartz/gdkwindow-quartz.c | 3 ++ gdk/win32/gdkwindow-win32.c | 49 +++++++++++++++++++++------- gdk/x11/gdkwindow-x11.c | 3 ++ gtk/gtkhandlebox.c | 3 +- gtk/gtkwindow.c | 5 ++- 10 files changed, 80 insertions(+), 24 deletions(-) diff --git a/ChangeLog b/ChangeLog index 974402b58a..0f605d265c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,18 @@ +2007-04-25 Cody Russell + + Merged from trunk: + + * 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 Matthias Clasen Merged from trunk: diff --git a/docs/reference/gdk/tmpl/windows.sgml b/docs/reference/gdk/tmpl/windows.sgml index 05647b6160..c41202bebc 100644 --- a/docs/reference/gdk/tmpl/windows.sgml +++ b/docs/reference/gdk/tmpl/windows.sgml @@ -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 @@ -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 diff --git a/gdk/directfb/gdkwindow-directfb.c b/gdk/directfb/gdkwindow-directfb.c index edbc3901a2..27eb59e286 100644 --- a/gdk/directfb/gdkwindow-directfb.c +++ b/gdk/directfb/gdkwindow-directfb.c @@ -561,6 +561,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; } diff --git a/gdk/gdkwindow.h b/gdk/gdkwindow.h index b0962bcfde..6974b37596 100644 --- a/gdk/gdkwindow.h +++ b/gdk/gdkwindow.h @@ -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 diff --git a/gdk/linux-fb/gdkwindow-fb.c b/gdk/linux-fb/gdkwindow-fb.c index bd0f5494df..fa0e025722 100644 --- a/gdk/linux-fb/gdkwindow-fb.c +++ b/gdk/linux-fb/gdkwindow-fb.c @@ -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; } diff --git a/gdk/quartz/gdkwindow-quartz.c b/gdk/quartz/gdkwindow-quartz.c index b3428f7152..f9f1120a45 100644 --- a/gdk/quartz/gdkwindow-quartz.c +++ b/gdk/quartz/gdkwindow-quartz.c @@ -691,6 +691,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; } diff --git a/gdk/win32/gdkwindow-win32.c b/gdk/win32/gdkwindow-win32.c index 6e31f7ad25..1e8dbaf0bc 100644 --- a/gdk/win32/gdkwindow-win32.c +++ b/gdk/win32/gdkwindow-win32.c @@ -361,12 +361,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 WNDCLASSEX wcl; @@ -462,14 +463,33 @@ RegisterGdkClass (GdkWindowType wtype) break; case GDK_WINDOW_TEMP: - if (0 == 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)) { - wcl.lpszClassName = "gdkWindowTemp"; - wcl.style |= CS_SAVEBITS; - ONCE_PER_CLASS (); - klassTEMP = RegisterClassEx (&wcl); + 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 (0 == klassTEMP) + { + wcl.lpszClassName = "gdkWindowTemp"; + wcl.style |= CS_SAVEBITS; + ONCE_PER_CLASS (); + klassTEMP = RegisterClassEx (&wcl); + } + klass = klassTEMP; } - klass = klassTEMP; break; default: @@ -684,10 +704,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); mbtitle = g_locale_from_utf8 (title, -1, NULL, NULL, NULL); diff --git a/gdk/x11/gdkwindow-x11.c b/gdk/x11/gdkwindow-x11.c index 1654090df9..8464fb30b3 100644 --- a/gdk/x11/gdkwindow-x11.c +++ b/gdk/x11/gdkwindow-x11.c @@ -919,6 +919,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; } diff --git a/gtk/gtkhandlebox.c b/gtk/gtkhandlebox.c index 43a7edd79b..b9d9b80d08 100644 --- a/gtk/gtkhandlebox.c +++ b/gtk/gtkhandlebox.c @@ -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); diff --git a/gtk/gtkwindow.c b/gtk/gtkwindow.c index e98b89af85..b48f3fcd53 100644 --- a/gtk/gtkwindow.c +++ b/gtk/gtkwindow.c @@ -4324,8 +4324,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); @@ -4357,8 +4358,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);