]> Pileus Git - ~andy/gtk/commitdiff
Move the code that sets the window style and extended window style, and
authorTor Lillqvist <tml@iki.fi>
Sat, 21 Dec 2002 23:32:20 +0000 (23:32 +0000)
committerTor Lillqvist <tml@src.gnome.org>
Sat, 21 Dec 2002 23:32:20 +0000 (23:32 +0000)
2002-12-21  Tor Lillqvist  <tml@iki.fi>

* gdk/win32/gdkwindow-win32.c (gdk_window_new): Move the code that
sets the window style and extended window style, and adjusts the
width and height to take the window decorations into account
earlier. The adjusted width and height used to be ignored. Remove
the local x, y, width and height variables, no need to further
confuse the code by having local copies. (Partial fix, I hope, for
#101588)

(gdk_window_move): When moving top-level windows, take title bar
and border width into account, offsetting the coordinates before
calling SetWindowPos().

(gdk_window_set_decorations, gdk_window_set_functions):
Reimplement, taking into account the peculiar semantics of
GDK_DECOR_ALL and GDK_FUNC_ALL. (#79036)

(gdk_window_get_decorations): Implement. (#98981)

(gdk_window_set_type_hint): When setting
GDK_WINDOW_TYPE_HINT_MENU, call gdk_window_set_decorations().
(#79036)

* gdk/gdk.def: Add gdk_window_get_decorations. (#98981)

ChangeLog
ChangeLog.pre-2-10
ChangeLog.pre-2-2
ChangeLog.pre-2-4
ChangeLog.pre-2-6
ChangeLog.pre-2-8
gdk/gdk.def
gdk/win32/gdkwindow-win32.c

index 827fd3542fba4d59abb4edf73b3870404e9122ee..4d81341c854e61069871d775c897d0c3092588b7 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,29 @@
+2002-12-21  Tor Lillqvist  <tml@iki.fi>
+
+       * gdk/win32/gdkwindow-win32.c (gdk_window_new): Move the code that
+       sets the window style and extended window style, and adjusts the
+       width and height to take the window decorations into account
+       earlier. The adjusted width and height used to be ignored. Remove
+       the local x, y, width and height variables, no need to further
+       confuse the code by having local copies. (Partial fix, I hope, for
+       #101588)
+
+       (gdk_window_move): When moving top-level windows, take title bar
+       and border width into account, offsetting the coordinates before
+       calling SetWindowPos().
+
+       (gdk_window_set_decorations, gdk_window_set_functions):
+       Reimplement, taking into account the peculiar semantics of
+       GDK_DECOR_ALL and GDK_FUNC_ALL. (#79036)
+
+       (gdk_window_get_decorations): Implement. (#98981)
+       
+       (gdk_window_set_type_hint): When setting
+       GDK_WINDOW_TYPE_HINT_MENU, call gdk_window_set_decorations().
+       (#79036)
+
+       * gdk/gdk.def: Add gdk_window_get_decorations. (#98981)
+
 2002-12-21  Matthias Clasen  <maclas@gmx.de>
 
        * gtk/gtktextview.c (gtk_text_view_set_background): New static
index 827fd3542fba4d59abb4edf73b3870404e9122ee..4d81341c854e61069871d775c897d0c3092588b7 100644 (file)
@@ -1,3 +1,29 @@
+2002-12-21  Tor Lillqvist  <tml@iki.fi>
+
+       * gdk/win32/gdkwindow-win32.c (gdk_window_new): Move the code that
+       sets the window style and extended window style, and adjusts the
+       width and height to take the window decorations into account
+       earlier. The adjusted width and height used to be ignored. Remove
+       the local x, y, width and height variables, no need to further
+       confuse the code by having local copies. (Partial fix, I hope, for
+       #101588)
+
+       (gdk_window_move): When moving top-level windows, take title bar
+       and border width into account, offsetting the coordinates before
+       calling SetWindowPos().
+
+       (gdk_window_set_decorations, gdk_window_set_functions):
+       Reimplement, taking into account the peculiar semantics of
+       GDK_DECOR_ALL and GDK_FUNC_ALL. (#79036)
+
+       (gdk_window_get_decorations): Implement. (#98981)
+       
+       (gdk_window_set_type_hint): When setting
+       GDK_WINDOW_TYPE_HINT_MENU, call gdk_window_set_decorations().
+       (#79036)
+
+       * gdk/gdk.def: Add gdk_window_get_decorations. (#98981)
+
 2002-12-21  Matthias Clasen  <maclas@gmx.de>
 
        * gtk/gtktextview.c (gtk_text_view_set_background): New static
index 827fd3542fba4d59abb4edf73b3870404e9122ee..4d81341c854e61069871d775c897d0c3092588b7 100644 (file)
@@ -1,3 +1,29 @@
+2002-12-21  Tor Lillqvist  <tml@iki.fi>
+
+       * gdk/win32/gdkwindow-win32.c (gdk_window_new): Move the code that
+       sets the window style and extended window style, and adjusts the
+       width and height to take the window decorations into account
+       earlier. The adjusted width and height used to be ignored. Remove
+       the local x, y, width and height variables, no need to further
+       confuse the code by having local copies. (Partial fix, I hope, for
+       #101588)
+
+       (gdk_window_move): When moving top-level windows, take title bar
+       and border width into account, offsetting the coordinates before
+       calling SetWindowPos().
+
+       (gdk_window_set_decorations, gdk_window_set_functions):
+       Reimplement, taking into account the peculiar semantics of
+       GDK_DECOR_ALL and GDK_FUNC_ALL. (#79036)
+
+       (gdk_window_get_decorations): Implement. (#98981)
+       
+       (gdk_window_set_type_hint): When setting
+       GDK_WINDOW_TYPE_HINT_MENU, call gdk_window_set_decorations().
+       (#79036)
+
+       * gdk/gdk.def: Add gdk_window_get_decorations. (#98981)
+
 2002-12-21  Matthias Clasen  <maclas@gmx.de>
 
        * gtk/gtktextview.c (gtk_text_view_set_background): New static
index 827fd3542fba4d59abb4edf73b3870404e9122ee..4d81341c854e61069871d775c897d0c3092588b7 100644 (file)
@@ -1,3 +1,29 @@
+2002-12-21  Tor Lillqvist  <tml@iki.fi>
+
+       * gdk/win32/gdkwindow-win32.c (gdk_window_new): Move the code that
+       sets the window style and extended window style, and adjusts the
+       width and height to take the window decorations into account
+       earlier. The adjusted width and height used to be ignored. Remove
+       the local x, y, width and height variables, no need to further
+       confuse the code by having local copies. (Partial fix, I hope, for
+       #101588)
+
+       (gdk_window_move): When moving top-level windows, take title bar
+       and border width into account, offsetting the coordinates before
+       calling SetWindowPos().
+
+       (gdk_window_set_decorations, gdk_window_set_functions):
+       Reimplement, taking into account the peculiar semantics of
+       GDK_DECOR_ALL and GDK_FUNC_ALL. (#79036)
+
+       (gdk_window_get_decorations): Implement. (#98981)
+       
+       (gdk_window_set_type_hint): When setting
+       GDK_WINDOW_TYPE_HINT_MENU, call gdk_window_set_decorations().
+       (#79036)
+
+       * gdk/gdk.def: Add gdk_window_get_decorations. (#98981)
+
 2002-12-21  Matthias Clasen  <maclas@gmx.de>
 
        * gtk/gtktextview.c (gtk_text_view_set_background): New static
index 827fd3542fba4d59abb4edf73b3870404e9122ee..4d81341c854e61069871d775c897d0c3092588b7 100644 (file)
@@ -1,3 +1,29 @@
+2002-12-21  Tor Lillqvist  <tml@iki.fi>
+
+       * gdk/win32/gdkwindow-win32.c (gdk_window_new): Move the code that
+       sets the window style and extended window style, and adjusts the
+       width and height to take the window decorations into account
+       earlier. The adjusted width and height used to be ignored. Remove
+       the local x, y, width and height variables, no need to further
+       confuse the code by having local copies. (Partial fix, I hope, for
+       #101588)
+
+       (gdk_window_move): When moving top-level windows, take title bar
+       and border width into account, offsetting the coordinates before
+       calling SetWindowPos().
+
+       (gdk_window_set_decorations, gdk_window_set_functions):
+       Reimplement, taking into account the peculiar semantics of
+       GDK_DECOR_ALL and GDK_FUNC_ALL. (#79036)
+
+       (gdk_window_get_decorations): Implement. (#98981)
+       
+       (gdk_window_set_type_hint): When setting
+       GDK_WINDOW_TYPE_HINT_MENU, call gdk_window_set_decorations().
+       (#79036)
+
+       * gdk/gdk.def: Add gdk_window_get_decorations. (#98981)
+
 2002-12-21  Matthias Clasen  <maclas@gmx.de>
 
        * gtk/gtktextview.c (gtk_text_view_set_background): New static
index 827fd3542fba4d59abb4edf73b3870404e9122ee..4d81341c854e61069871d775c897d0c3092588b7 100644 (file)
@@ -1,3 +1,29 @@
+2002-12-21  Tor Lillqvist  <tml@iki.fi>
+
+       * gdk/win32/gdkwindow-win32.c (gdk_window_new): Move the code that
+       sets the window style and extended window style, and adjusts the
+       width and height to take the window decorations into account
+       earlier. The adjusted width and height used to be ignored. Remove
+       the local x, y, width and height variables, no need to further
+       confuse the code by having local copies. (Partial fix, I hope, for
+       #101588)
+
+       (gdk_window_move): When moving top-level windows, take title bar
+       and border width into account, offsetting the coordinates before
+       calling SetWindowPos().
+
+       (gdk_window_set_decorations, gdk_window_set_functions):
+       Reimplement, taking into account the peculiar semantics of
+       GDK_DECOR_ALL and GDK_FUNC_ALL. (#79036)
+
+       (gdk_window_get_decorations): Implement. (#98981)
+       
+       (gdk_window_set_type_hint): When setting
+       GDK_WINDOW_TYPE_HINT_MENU, call gdk_window_set_decorations().
+       (#79036)
+
+       * gdk/gdk.def: Add gdk_window_get_decorations. (#98981)
+
 2002-12-21  Matthias Clasen  <maclas@gmx.de>
 
        * gtk/gtktextview.c (gtk_text_view_set_background): New static
index dc4aeccb8c6063aad6691f13371cf6f8fd415b02..db807b515d91cce12aa7c3da88aa443bdd5f7043 100644 (file)
@@ -439,6 +439,7 @@ EXPORTS
        gdk_window_freeze_updates
        gdk_window_fullscreen
        gdk_window_get_children
+       gdk_window_get_decorations
        gdk_window_get_deskrelative_origin
        gdk_window_get_events
        gdk_window_get_frame_extents
index 30728f93c275f8cd300eb16976559152a77f5979..ba803baa5661c94f4d200bc4264eee280c241c2d 100644 (file)
@@ -414,16 +414,14 @@ gdk_window_new (GdkWindow     *parent,
 {
   HANDLE hparent;
   ATOM klass = 0;
-  DWORD dwStyle, dwExStyle;
+  DWORD dwStyle = 0, dwExStyle;
   RECT rect;
   GdkWindow *window;
   GdkWindowObject *private;
   GdkWindowImplWin32 *impl;
   GdkDrawableImplWin32 *draw_impl;
   GdkVisual *visual;
-  int width, height;
-  int x, y;
-  char *title;
+  const gchar *title;
   char *mbtitle;
 
   g_return_val_if_fail (attributes != NULL, NULL);
@@ -461,46 +459,26 @@ gdk_window_new (GdkWindow     *parent,
   private->parent = (GdkWindowObject *)parent;
 
   if (attributes_mask & GDK_WA_X)
-    x = attributes->x;
+    private->x = attributes->x;
   else
-    x = CW_USEDEFAULT;
+    private->x = 0;
   
   if (attributes_mask & GDK_WA_Y)
-    y = attributes->y;
+    private->y = attributes->y;
   else if (attributes_mask & GDK_WA_X)
-    y = 100;                   /* ??? We must put it somewhere... */
+    private->y = 100;          /* ??? We must put it somewhere... */
   else
-    y = 0;                     /* x is CW_USEDEFAULT, y doesn't matter then */
+    private->y = 0;
   
-  private->x = x;
-  private->y = y;
-  impl->width = (attributes->width > 1) ? (attributes->width) : (1);
-  impl->height = (attributes->height > 1) ? (attributes->height) : (1);
-  impl->extension_events_selected = FALSE;
-  private->window_type = attributes->window_type;
-
-  _gdk_window_init_position (GDK_WINDOW (private));
-  if (impl->position_info.big)
-    private->guffaw_gravity = TRUE;
-
   if (attributes_mask & GDK_WA_VISUAL)
     visual = attributes->visual;
   else
     visual = gdk_visual_get_system ();
 
-  if (attributes_mask & GDK_WA_TITLE)
-    title = attributes->title;
-  else
-    title = get_default_title ();
-  if (!title || !*title)
-    title = "GDK client window";
-
-  private->event_mask = GDK_STRUCTURE_MASK | attributes->event_mask;
-      
-  if (private->parent && private->parent->guffaw_gravity)
-    {
-      /* XXX ??? */
-    }
+  impl->width = (attributes->width > 1) ? (attributes->width) : (1);
+  impl->height = (attributes->height > 1) ? (attributes->height) : (1);
+  impl->extension_events_selected = FALSE;
+  private->window_type = attributes->window_type;
 
   if (attributes->wclass == GDK_INPUT_OUTPUT)
     {
@@ -529,9 +507,6 @@ gdk_window_new (GdkWindow     *parent,
       GDK_NOTE (MISC, g_print ("...GDK_INPUT_ONLY, system colormap\n"));
     }
 
-  if (private->parent)
-    private->parent->children = g_list_prepend (private->parent->children, window);
-
   switch (private->window_type)
     {
     case GDK_WINDOW_TOPLEVEL:
@@ -561,55 +536,66 @@ gdk_window_new (GdkWindow     *parent,
     case GDK_WINDOW_ROOT:
       g_error ("cannot make windows of type GDK_WINDOW_ROOT");
       break;
-    }
 
-  klass = RegisterGdkClass (private->window_type);
+    default:
+      g_assert_not_reached ();
+    }
 
   if (private->window_type != GDK_WINDOW_CHILD)
     {
-      if (x == CW_USEDEFAULT)
-       {
-         rect.left = 100;
-         rect.top = 100;
-       }
-      else
-       {
-         rect.left = x;
-         rect.top = y;
-       }
-
+      rect.left = private->x;
+      rect.top = private->y;
       rect.right = rect.left + impl->width;
       rect.bottom = rect.top + impl->height;
 
       SafeAdjustWindowRectEx (&rect, dwStyle, FALSE, dwExStyle);
 
-      if (x != CW_USEDEFAULT)
-       {
-         x = rect.left;
-         y = rect.top;
-       }
-      width = rect.right - rect.left;
-      height = rect.bottom - rect.top;
+      private->x = rect.left;
+      private->y = rect.top;
+      impl->width = rect.right - rect.left;
+      impl->height = rect.bottom - rect.top;
     }
+
+  _gdk_window_init_position (GDK_WINDOW (private));
+
+  if (impl->position_info.big)
+    private->guffaw_gravity = TRUE;
+
+  if (attributes_mask & GDK_WA_TITLE)
+    title = attributes->title;
   else
+    title = get_default_title ();
+  if (!title || !*title)
+    title = "GDK client window";
+
+  private->event_mask = GDK_STRUCTURE_MASK | attributes->event_mask;
+      
+  if (private->parent && private->parent->guffaw_gravity)
     {
-      width = impl->width;
-      height = impl->height;
+      /* XXX ??? */
     }
 
+  if (private->parent)
+    private->parent->children = g_list_prepend (private->parent->children, window);
+
+  klass = RegisterGdkClass (private->window_type);
+
   mbtitle = g_locale_from_utf8 (title, -1, NULL, NULL, NULL);
   
 #ifdef WITHOUT_WM_CREATE
-  draw_impl->handle = CreateWindowEx (dwExStyle,
-                                     MAKEINTRESOURCE(klass),
-                                     mbtitle,
-                                     dwStyle,
-                                     impl->position_info.x, impl->position_info.y, 
-                                     impl->position_info.width, impl->position_info.height,
-                                     hparent,
-                                     NULL,
-                                     _gdk_app_hmodule,
-                                     NULL);
+  draw_impl->handle =
+    CreateWindowEx (dwExStyle,
+                   MAKEINTRESOURCE(klass),
+                   mbtitle,
+                   dwStyle,
+                   ((attributes_mask & GDK_WA_X) ?
+                    impl->position_info.x : CW_USEDEFAULT),
+                   impl->position_info.y, 
+                   impl->position_info.width, impl->position_info.height,
+                   hparent,
+                   NULL,
+                   _gdk_app_hmodule,
+                   NULL);
 #else
   {
   HWND hwndNew =
@@ -617,7 +603,9 @@ gdk_window_new (GdkWindow     *parent,
                    MAKEINTRESOURCE(klass),
                    mbtitle,
                    dwStyle,
-                   impl->position_info.x, impl->position_info.y, 
+                   ((attributes_mask & GDK_WA_X) ?
+                    impl->position_info.x : CW_USEDEFAULT),
+                   impl->position_info.y, 
                    impl->position_info.width, impl->position_info.height,
                    hparent,
                    NULL,
@@ -652,7 +640,10 @@ gdk_window_new (GdkWindow     *parent,
   GDK_NOTE (MISC,
            g_print ("... \"%s\" %dx%d@+%d+%d %p = %p\n",
                     mbtitle,
-                    width, height, (x == CW_USEDEFAULT ? -9999 : x), y, 
+                    impl->position_info.width, impl->position_info.height,
+                    ((attributes_mask & GDK_WA_X) ?
+                     impl->position_info.x : CW_USEDEFAULT),
+                    impl->position_info.y, 
                     hparent,
                     GDK_WINDOW_HWND (window)));
 
@@ -962,6 +953,8 @@ gdk_window_move (GdkWindow *window,
 {
   GdkWindowObject *private = (GdkWindowObject *)window;
   GdkWindowImplWin32 *impl;
+  RECT rect;
+  LONG style, extended_style;
 
   g_return_if_fail (window != NULL);
   g_return_if_fail (GDK_IS_WINDOW (window));
@@ -975,8 +968,16 @@ gdk_window_move (GdkWindow *window,
                                       impl->width, impl->height);
       else
        {
+         /* SetWindowPos uses non-client coordinates, we have client
+          * coordinates. Thus offset them.
+          */
+         style = GetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE);
+         extended_style = GetWindowLong (GDK_WINDOW_HWND (window), GWL_EXSTYLE);
+         GetClientRect (GDK_WINDOW_HWND (window), &rect);
+         AdjustWindowRectEx (&rect, style, FALSE, extended_style);
+
          if (!SetWindowPos (GDK_WINDOW_HWND (window), NULL,
-                            x, y, impl->width, impl->height,
+                            x + rect.left, y + rect.top, 0, 0,
                             SWP_NOACTIVATE | SWP_NOSIZE | SWP_NOZORDER))
            WIN32_API_FAILED ("SetWindowPos");
        }
@@ -2153,7 +2154,8 @@ void
 gdk_window_set_decorations (GdkWindow      *window,
                            GdkWMDecoration decorations)
 {
-  LONG style;
+  LONG style, bits;
+  const LONG settable_bits = WS_BORDER|WS_THICKFRAME|WS_CAPTION|WS_SYSMENU|WS_MINIMIZEBOX|WS_MAXIMIZEBOX;
 
   g_return_if_fail (window != NULL);
   g_return_if_fail (GDK_IS_WINDOW (window));
@@ -2170,23 +2172,25 @@ gdk_window_set_decorations (GdkWindow      *window,
 
   style = GetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE);
 
-  style &= (WS_OVERLAPPED|WS_POPUP|WS_CHILD|WS_MINIMIZE|WS_VISIBLE|WS_DISABLED
-           |WS_CLIPSIBLINGS|WS_CLIPCHILDREN|WS_MAXIMIZE);
+  bits = 0;
 
-  if (decorations & GDK_DECOR_ALL)
-    style |= (WS_CAPTION|WS_SYSMENU|WS_THICKFRAME|WS_MINIMIZEBOX|WS_MAXIMIZEBOX);
   if (decorations & GDK_DECOR_BORDER)
-    style |= (WS_BORDER);
+    bits |= WS_BORDER;
   if (decorations & GDK_DECOR_RESIZEH)
-    style |= (WS_THICKFRAME);
+    bits |= WS_THICKFRAME;
   if (decorations & GDK_DECOR_TITLE)
-    style |= (WS_CAPTION);
+    bits |= WS_CAPTION;
   if (decorations & GDK_DECOR_MENU)
-    style |= (WS_SYSMENU);
+    bits |= WS_SYSMENU;
   if (decorations & GDK_DECOR_MINIMIZE)
-    style |= (WS_MINIMIZEBOX);
+    bits |= WS_MINIMIZEBOX;
   if (decorations & GDK_DECOR_MAXIMIZE)
-    style |= (WS_MAXIMIZEBOX);
+    bits |= WS_MAXIMIZEBOX;
+
+  if (decorations & GDK_DECOR_ALL)
+    style |= settable_bits, style &= ~bits;
+  else
+    style &= ~settable_bits, style |= bits;
   
   SetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE, style);
   SetWindowPos (GDK_WINDOW_HWND (window), NULL, 0, 0, 0, 0,
@@ -2194,11 +2198,36 @@ gdk_window_set_decorations (GdkWindow      *window,
                SWP_NOREPOSITION | SWP_NOSIZE | SWP_NOZORDER);
 }
 
+gboolean
+gdk_window_get_decorations(GdkWindow       *window,
+                          GdkWMDecoration *decorations)
+{
+  LONG style = GetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE);
+
+  *decorations = 0;
+
+  if (style & WS_BORDER)
+    *decorations |= GDK_DECOR_BORDER;
+  if (style & WS_THICKFRAME)
+    *decorations |= GDK_DECOR_RESIZEH;
+  if (style & WS_CAPTION)
+    *decorations |= GDK_DECOR_TITLE;
+  if (style & WS_SYSMENU)
+    *decorations |= GDK_DECOR_MENU;
+  if (style & WS_MINIMIZEBOX)
+    *decorations |= GDK_DECOR_MINIMIZE;
+  if (style & WS_MAXIMIZEBOX)
+    *decorations |= GDK_DECOR_MAXIMIZE;
+
+  return *decorations != 0;
+}
+
 void
 gdk_window_set_functions (GdkWindow    *window,
                          GdkWMFunction functions)
 {
-  LONG style;
+  LONG style, bits;
+  const LONG settable_bits = (WS_THICKFRAME|WS_MINIMIZEBOX|WS_MAXIMIZEBOX|WS_SYSMENU);
 
   g_return_if_fail (window != NULL);
   g_return_if_fail (GDK_IS_WINDOW (window));
@@ -2214,20 +2243,23 @@ gdk_window_set_functions (GdkWindow    *window,
 
   style = GetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE);
 
-  style &= (WS_OVERLAPPED|WS_POPUP|WS_CHILD|WS_MINIMIZE|WS_VISIBLE|WS_DISABLED
-           |WS_CLIPSIBLINGS|WS_CLIPCHILDREN|WS_MAXIMIZE|WS_CAPTION|WS_BORDER
-           |WS_SYSMENU);
+  bits = 0;
 
-  if (functions & GDK_FUNC_ALL)
-    style |= (WS_THICKFRAME|WS_MINIMIZEBOX|WS_MAXIMIZEBOX);
   if (functions & GDK_FUNC_RESIZE)
-    style |= (WS_THICKFRAME);
+    bits |= WS_THICKFRAME;
   if (functions & GDK_FUNC_MOVE)
-    style |= (WS_THICKFRAME);
+    bits |= (WS_THICKFRAME|WS_SYSMENU);
   if (functions & GDK_FUNC_MINIMIZE)
-    style |= (WS_MINIMIZEBOX);
+    bits |= WS_MINIMIZEBOX;
   if (functions & GDK_FUNC_MAXIMIZE)
-    style |= (WS_MAXIMIZEBOX);
+    bits |= WS_MAXIMIZEBOX;
+  if (functions & GDK_FUNC_CLOSE)
+    bits |= WS_SYSMENU;
+  
+  if (functions & GDK_FUNC_ALL)
+    style |= settable_bits, style &= ~bits;
+  else
+    style &= ~settable_bits, style |= bits;
   
   SetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE, style);
   SetWindowPos (GDK_WINDOW_HWND (window), NULL, 0, 0, 0, 0,
@@ -2552,6 +2584,11 @@ gdk_window_set_type_hint (GdkWindow        *window,
     case GDK_WINDOW_TYPE_HINT_DIALOG:
       break;
     case GDK_WINDOW_TYPE_HINT_MENU:
+      gdk_window_set_decorations (window,
+                                 GDK_DECOR_ALL |
+                                 GDK_DECOR_RESIZEH |
+                                 GDK_DECOR_MINIMIZE |
+                                 GDK_DECOR_MAXIMIZE);
       break;
     case GDK_WINDOW_TYPE_HINT_TOOLBAR:
       break;