Win32 drop shadow goodness

svn path=/branches/gtk-2-10/; revision=17644
This commit is contained in:
Cody Russell
2007-04-25 23:45:09 +00:00
parent 5ee1e016b1
commit f9507b4e08
10 changed files with 80 additions and 24 deletions

View File

@@ -1,3 +1,18 @@
2007-04-25 Cody Russell <bratsche@gnome.org>
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 <mclasen@redhat.com>
Merged from trunk:

View 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>

View File

@@ -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;
}

View 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

View 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;
}

View File

@@ -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;
}

View File

@@ -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);

View File

@@ -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;
}

View 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);

View File

@@ -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);