]> Pileus Git - ~andy/gtk/blobdiff - gdk/win32/gdkwindow-win32.c
Fix gdkenumtypes.h hack
[~andy/gtk] / gdk / win32 / gdkwindow-win32.c
index 4ec814c7036592e9e02d3bd9bd77e87aeea66b33..182126355370eab4d7893ed36fdb2fb919a5df14 100644 (file)
@@ -1,6 +1,6 @@
 /* GDK - The GIMP Drawing Kit
  * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
- * Copyright (C) 1998-1999 Tor Lillqvist
+ * Copyright (C) 1998-2002 Tor Lillqvist
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
 #include "gdkevents.h"
 #include "gdkpixmap.h"
 #include "gdkwindow.h"
+#include "gdkdisplay.h"
 #include "gdkprivate-win32.h"
 #include "gdkinput-win32.h"
 
-static gboolean gdk_window_gravity_works (void);
-static void     gdk_window_set_static_win_gravity (GdkWindow *window, 
-                                                  gboolean   on);
-
 static GdkColormap* gdk_window_impl_win32_get_colormap (GdkDrawable *drawable);
 static void         gdk_window_impl_win32_set_colormap (GdkDrawable *drawable,
                                                        GdkColormap *cmap);
 static void         gdk_window_impl_win32_get_size     (GdkDrawable *drawable,
                                                        gint *width,
                                                        gint *height);
-static GdkRegion*  gdk_window_impl_win32_get_visible_region (GdkDrawable *drawable);
+static GdkRegion*   gdk_window_impl_win32_get_visible_region (GdkDrawable *drawable);
 static void gdk_window_impl_win32_init       (GdkWindowImplWin32      *window);
 static void gdk_window_impl_win32_class_init (GdkWindowImplWin32Class *klass);
 static void gdk_window_impl_win32_finalize   (GObject                 *object);
@@ -91,13 +88,9 @@ gdk_window_impl_win32_init (GdkWindowImplWin32 *impl)
   impl->width = 1;
   impl->height = 1;
 
-  impl->event_mask = 0;
   impl->hcursor = NULL;
   impl->hint_flags = 0;
   impl->extension_events_selected = FALSE;
-  impl->input_locale = GetKeyboardLayout (0);
-  TranslateCharsetInfo ((DWORD FAR *) GetACP (), &impl->charset_info,
-                       TCI_SRCCODEPAGE);
 }
 
 static void
@@ -154,12 +147,10 @@ static GdkColormap*
 gdk_window_impl_win32_get_colormap (GdkDrawable *drawable)
 {
   GdkDrawableImplWin32 *drawable_impl;
-  GdkWindowImplWin32 *window_impl;
   
   g_return_val_if_fail (GDK_IS_WINDOW_IMPL_WIN32 (drawable), NULL);
 
   drawable_impl = GDK_DRAWABLE_IMPL_WIN32 (drawable);
-  window_impl = GDK_WINDOW_IMPL_WIN32 (drawable);
 
   if (!((GdkWindowObject *) drawable_impl->wrapper)->input_only && 
       drawable_impl->colormap == NULL)
@@ -243,15 +234,32 @@ _gdk_windowing_window_init (void)
   impl = GDK_WINDOW_IMPL_WIN32 (private->impl);
   draw_impl = GDK_DRAWABLE_IMPL_WIN32 (private->impl);
   
-  draw_impl->handle = gdk_root_window;
+  draw_impl->handle = _gdk_root_window;
   draw_impl->wrapper = GDK_DRAWABLE (private);
+  draw_impl->colormap = gdk_colormap_get_system ();
+  gdk_colormap_ref (draw_impl->colormap);
   
   private->window_type = GDK_WINDOW_ROOT;
   private->depth = gdk_visual_get_system ()->depth;
   impl->width = width;
   impl->height = height;
 
-  gdk_win32_handle_table_insert (&gdk_root_window, _gdk_parent_root);
+  _gdk_window_init_position (GDK_WINDOW (private));
+
+  gdk_win32_handle_table_insert (&_gdk_root_window, _gdk_parent_root);
+}
+
+static const gchar *
+get_default_title (void)
+{
+  const char *title;
+#if 0 /* So that we can build with GLib 2.0... */
+  title = g_get_application_name ();
+  if (!title)
+#endif
+    title = g_get_prgname ();
+
+  return title;
 }
 
 /* The Win API function AdjustWindowRect may return negative values
@@ -299,27 +307,27 @@ RegisterGdkClass (GdkWindowType wtype)
   static WNDCLASSEX wcl; 
   ATOM klass = 0;
 
-  wcl.cbSize = sizeof(WNDCLASSEX);     
+  wcl.cbSize = sizeof (WNDCLASSEX);
   wcl.style = 0; /* DON'T set CS_<H,V>REDRAW. It causes total redraw
                   * on WM_SIZE and WM_MOVE. Flicker, Performance!
                   */
   wcl.lpfnWndProc = _gdk_win32_window_procedure;
   wcl.cbClsExtra = 0;
   wcl.cbWndExtra = 0;
-  wcl.hInstance = gdk_app_hmodule;
+  wcl.hInstance = _gdk_app_hmodule;
   wcl.hIcon = 0;
   /* initialize once! */
   if (0 == hAppIcon)
     {
-      gchar sLoc [_MAX_PATH+1];
+      gchar sLoc [MAX_PATH+1];
 
-      if (0 != GetModuleFileName (gdk_app_hmodule, sLoc, _MAX_PATH))
+      if (0 != GetModuleFileName (_gdk_app_hmodule, sLoc, MAX_PATH))
        {
-         hAppIcon = ExtractIcon (gdk_app_hmodule, sLoc, 0);
+         hAppIcon = ExtractIcon (_gdk_app_hmodule, sLoc, 0);
          if (0 == hAppIcon)
            {
-             if (0 != GetModuleFileName (gdk_dll_hinstance, sLoc, _MAX_PATH))
-               hAppIcon = ExtractIcon (gdk_dll_hinstance, sLoc, 0);
+             if (0 != GetModuleFileName (_gdk_dll_hinstance, sLoc, MAX_PATH))
+               hAppIcon = ExtractIcon (_gdk_dll_hinstance, sLoc, 0);
            }
        }
       if (0 == hAppIcon) 
@@ -338,22 +346,22 @@ RegisterGdkClass (GdkWindowType wtype)
 #define ONCE_PER_CLASS() \
   wcl.hIcon = CopyIcon (hAppIcon); \
   wcl.hIconSm = CopyIcon (hAppIcon); \
-  wcl.hbrBackground = NULL; /* CreateSolidBrush (RGB (0,0,0)); */ \
+  wcl.hbrBackground = NULL; \
   wcl.hCursor = LoadCursor (NULL, IDC_ARROW); 
   
   switch (wtype)
-  {
-  case GDK_WINDOW_TOPLEVEL:
-    if (0 == klassTOPLEVEL)
-      {
-       wcl.lpszClassName = "gdkWindowToplevel";
-       
-       ONCE_PER_CLASS();
-       klassTOPLEVEL = RegisterClassEx (&wcl);
-      }
-    klass = klassTOPLEVEL;
-    break;
-
+    {
+    case GDK_WINDOW_TOPLEVEL:
+      if (0 == klassTOPLEVEL)
+       {
+         wcl.lpszClassName = "gdkWindowToplevel";
+         
+         ONCE_PER_CLASS();
+         klassTOPLEVEL = RegisterClassEx (&wcl);
+       }
+      klass = klassTOPLEVEL;
+      break;
+      
     case GDK_WINDOW_CHILD:
       if (0 == klassCHILD)
        {
@@ -365,34 +373,34 @@ RegisterGdkClass (GdkWindowType wtype)
        }
       klass = klassCHILD;
       break;
-
-  case GDK_WINDOW_DIALOG:
-    if (0 == klassDIALOG)
-      {
-       wcl.lpszClassName = "gdkWindowDialog";
-        wcl.style |= CS_SAVEBITS;
-       ONCE_PER_CLASS();
-       klassDIALOG = RegisterClassEx (&wcl);
-      }
-    klass = klassDIALOG;
-    break;
-
-  case GDK_WINDOW_TEMP:
-    if (0 == klassTEMP)
-      {
-       wcl.lpszClassName = "gdkWindowTemp";
-        wcl.style |= CS_SAVEBITS;
-       ONCE_PER_CLASS();
-       klassTEMP = RegisterClassEx (&wcl);
-      }
-    klass = klassTEMP;
-    break;
-
-  default:
-    g_assert_not_reached ();
-    break;
-  }
-
+      
+    case GDK_WINDOW_DIALOG:
+      if (0 == klassDIALOG)
+       {
+         wcl.lpszClassName = "gdkWindowDialog";
+         wcl.style |= CS_SAVEBITS;
+         ONCE_PER_CLASS();
+         klassDIALOG = RegisterClassEx (&wcl);
+       }
+      klass = klassDIALOG;
+      break;
+      
+    case GDK_WINDOW_TEMP:
+      if (0 == klassTEMP)
+       {
+         wcl.lpszClassName = "gdkWindowTemp";
+         wcl.style |= CS_SAVEBITS;
+         ONCE_PER_CLASS();
+         klassTEMP = RegisterClassEx (&wcl);
+       }
+      klass = klassTEMP;
+      break;
+      
+    default:
+      g_assert_not_reached ();
+      break;
+    }
+  
   if (klass == 0)
     {
       WIN32_API_FAILED ("RegisterClassEx");
@@ -406,19 +414,15 @@ gdk_window_new (GdkWindow     *parent,
                GdkWindowAttr *attributes,
                gint           attributes_mask)
 {
+  HANDLE hparent;
+  ATOM klass = 0;
+  DWORD dwStyle, dwExStyle;
+  RECT rect;
   GdkWindow *window;
   GdkWindowObject *private;
   GdkWindowImplWin32 *impl;
   GdkDrawableImplWin32 *draw_impl;
-
   GdkVisual *visual;
-
-  HANDLE hparent;
-  ATOM klass = 0;
-  DWORD dwStyle, dwExStyle;
-  RECT rect;
-  Visual *xvisual;
-
   int width, height;
   int x, y;
   char *title;
@@ -485,16 +489,15 @@ gdk_window_new (GdkWindow     *parent,
     visual = attributes->visual;
   else
     visual = gdk_visual_get_system ();
-  xvisual = ((GdkVisualPrivate*) visual)->xvisual;
 
   if (attributes_mask & GDK_WA_TITLE)
     title = attributes->title;
   else
-    title = g_get_prgname ();
+    title = get_default_title ();
   if (!title || !*title)
     title = "GDK client window";
 
-  impl->event_mask = GDK_STRUCTURE_MASK | attributes->event_mask;
+  private->event_mask = GDK_STRUCTURE_MASK | attributes->event_mask;
       
   if (private->parent && private->parent->guffaw_gravity)
     {
@@ -515,19 +518,7 @@ gdk_window_new (GdkWindow     *parent,
         }
       else
        {
-         if ((((GdkVisualPrivate*)gdk_visual_get_system ())->xvisual) == xvisual)
-            {
-              draw_impl->colormap = gdk_colormap_get_system ();
-              gdk_colormap_ref (draw_impl->colormap);
-             GDK_NOTE (MISC, g_print ("...using system colormap %p\n",
-                                      draw_impl->colormap));
-            }
-         else
-            {
-              draw_impl->colormap = gdk_colormap_new (visual, FALSE);
-             GDK_NOTE (MISC, g_print ("...using new colormap %p\n",
-                                      draw_impl->colormap));
-            }
+         draw_impl->colormap = gdk_colormap_get_system ();
        }
     }
   else
@@ -547,7 +538,7 @@ gdk_window_new (GdkWindow     *parent,
     {
     case GDK_WINDOW_TOPLEVEL:
       dwStyle = WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN;
-      hparent = gdk_root_window;
+      hparent = _gdk_root_window;
       break;
 
     case GDK_WINDOW_CHILD:
@@ -559,7 +550,7 @@ gdk_window_new (GdkWindow     *parent,
 #if 0
       dwExStyle |= WS_EX_TOPMOST; /* //HB: want this? */
 #endif
-      hparent = gdk_root_window;
+      hparent = _gdk_root_window;
       break;
 
     case GDK_WINDOW_TEMP:
@@ -619,7 +610,7 @@ gdk_window_new (GdkWindow     *parent,
                                      impl->position_info.width, impl->position_info.height,
                                      hparent,
                                      NULL,
-                                     gdk_app_hmodule,
+                                     _gdk_app_hmodule,
                                      NULL);
 #else
   {
@@ -632,13 +623,13 @@ gdk_window_new (GdkWindow     *parent,
                    impl->position_info.width, impl->position_info.height,
                    hparent,
                    NULL,
-                   gdk_app_hmodule,
+                   _gdk_app_hmodule,
                    window);
   if (GDK_WINDOW_HWND (window) != hwndNew)
     {
-      g_warning("gdk_window_new: gdk_event_translate::WM_CREATE (%#x, %#x) HWND mismatch.",
-               (guint) GDK_WINDOW_HWND (window),
-               (guint) hwndNew);
+      g_warning("gdk_window_new: gdk_event_translate::WM_CREATE (%p, %p) HWND mismatch.",
+               GDK_WINDOW_HWND (window),
+               hwndNew);
 
       /* HB: IHMO due to a race condition the handle was increased by
        * one, which causes much trouble. Because I can't find the 
@@ -661,14 +652,11 @@ gdk_window_new (GdkWindow     *parent,
 #endif
 
   GDK_NOTE (MISC,
-           g_print ("... \"%s\" %dx%d@+%d+%d %#x = %#x\n"
-                    "... locale %#x codepage %d\n",
+           g_print ("... \"%s\" %dx%d@+%d+%d %p = %p\n",
                     mbtitle,
                     width, height, (x == CW_USEDEFAULT ? -9999 : x), y, 
-                    (guint) hparent,
-                    (guint) GDK_WINDOW_HWND (window),
-                    (guint) impl->input_locale,
-                    (guint) impl->charset_info.ciACP));
+                    hparent,
+                    GDK_WINDOW_HWND (window)));
 
   g_free (mbtitle);
 
@@ -692,7 +680,8 @@ gdk_window_new (GdkWindow     *parent,
 }
 
 GdkWindow *
-gdk_window_foreign_new (GdkNativeWindow anid)
+gdk_window_foreign_new_for_display (GdkDisplay      *display,
+                                    GdkNativeWindow  anid)
 {
   GdkWindow *window;
   GdkWindowObject *private;
@@ -703,6 +692,8 @@ gdk_window_foreign_new (GdkNativeWindow anid)
   RECT rect;
   POINT point;
 
+  g_return_val_if_fail (display == gdk_display_get_default (), NULL);
+
   window = g_object_new (GDK_TYPE_WINDOW, NULL);
   private = (GdkWindowObject *)window;
   impl = GDK_WINDOW_IMPL_WIN32 (private->impl);
@@ -721,7 +712,7 @@ gdk_window_foreign_new (GdkNativeWindow anid)
   point.x = rect.left;
   point.y = rect.right;
   ClientToScreen ((HWND) anid, &point);
-  if (parent != gdk_root_window)
+  if (parent != _gdk_root_window)
     ScreenToClient (parent, &point);
   private->x = point.x;
   private->y = point.y;
@@ -729,12 +720,15 @@ gdk_window_foreign_new (GdkNativeWindow anid)
   impl->height = rect.bottom - rect.top;
   private->window_type = GDK_WINDOW_FOREIGN;
   private->destroyed = FALSE;
+  private->event_mask = GDK_ALL_EVENTS_MASK; /* XXX */
   if (IsWindowVisible ((HWND) anid))
     private->state &= (~GDK_WINDOW_STATE_WITHDRAWN);
   else
     private->state |= GDK_WINDOW_STATE_WITHDRAWN;
   private->depth = gdk_visual_get_system ()->depth;
 
+  _gdk_window_init_position (GDK_WINDOW (private));
+
   gdk_drawable_ref (window);
   gdk_win32_handle_table_insert (&GDK_WINDOW_HWND (window), window);
 
@@ -756,11 +750,11 @@ _gdk_windowing_window_destroy (GdkWindow *window,
 
   g_return_if_fail (GDK_IS_WINDOW (window));
   
-  GDK_NOTE (MISC, g_print ("_gdk_windowing_window_destroy %#x\n",
-                          (guint) GDK_WINDOW_HWND (window)));
+  GDK_NOTE (MISC, g_print ("_gdk_windowing_window_destroy %p\n",
+                          GDK_WINDOW_HWND (window)));
 
   if (private->extension_events != 0)
-    gdk_input_window_destroy (window);
+    _gdk_input_window_destroy (window);
 
   if (private->window_type == GDK_WINDOW_FOREIGN)
     {
@@ -797,15 +791,15 @@ gdk_window_destroy_notify (GdkWindow *window)
   g_return_if_fail (GDK_IS_WINDOW (window));
 
   GDK_NOTE (EVENTS,
-           g_print ("gdk_window_destroy_notify: %#x  %s\n",
-                    (guint) GDK_WINDOW_HWND (window),
+           g_print ("gdk_window_destroy_notify: %p  %s\n",
+                    GDK_WINDOW_HWND (window),
                     (GDK_WINDOW_DESTROYED (window) ? "(destroyed)" : "")));
 
   if (!GDK_WINDOW_DESTROYED (window))
     {
       if (GDK_WINDOW_TYPE(window) != GDK_WINDOW_FOREIGN)
-       g_warning ("window %#x unexpectedly destroyed",
-                  (guint) GDK_WINDOW_HWND (window));
+       g_warning ("window %p unexpectedly destroyed",
+                  GDK_WINDOW_HWND (window));
 
       _gdk_window_destroy (window, TRUE);
     }
@@ -824,8 +818,8 @@ show_window_internal (GdkWindow *window,
 
   if (!private->destroyed)
     {
-      GDK_NOTE (MISC, g_print ("gdk_window_show: %#x\n",
-                              (guint) GDK_WINDOW_HWND (window)));
+      GDK_NOTE (MISC, g_print ("gdk_window_show: %p\n",
+                              GDK_WINDOW_HWND (window)));
 
       private->state &= (~GDK_WINDOW_STATE_WITHDRAWN);
       if (GDK_WINDOW_TYPE (window) == GDK_WINDOW_TEMP)
@@ -897,8 +891,8 @@ gdk_window_hide (GdkWindow *window)
   private = (GdkWindowObject*) window;
   if (!private->destroyed)
     {
-      GDK_NOTE (MISC, g_print ("gdk_window_hide: %#x\n",
-                              (guint) GDK_WINDOW_HWND (window)));
+      GDK_NOTE (MISC, g_print ("gdk_window_hide: %p\n",
+                              GDK_WINDOW_HWND (window)));
 
       private->state |= GDK_WINDOW_STATE_WITHDRAWN;
 
@@ -929,8 +923,8 @@ gdk_window_withdraw (GdkWindow *window)
   private = (GdkWindowObject*) window;
   if (!private->destroyed)
     {
-      GDK_NOTE (MISC, g_print ("gdk_window_withdraw: %#x\n",
-                              (guint) GDK_WINDOW_HWND (window)));
+      GDK_NOTE (MISC, g_print ("gdk_window_withdraw: %p\n",
+                              GDK_WINDOW_HWND (window)));
 
       gdk_window_hide (window);        /* ??? */
     }
@@ -1047,8 +1041,8 @@ gdk_window_move_resize (GdkWindow *window,
       DWORD dwStyle;
       DWORD dwExStyle;
 
-      GDK_NOTE (MISC, g_print ("gdk_window_move_resize: %#x %dx%d@+%d+%d\n",
-                              (guint) GDK_WINDOW_HWND (window),
+      GDK_NOTE (MISC, g_print ("gdk_window_move_resize: %p %dx%d@+%d+%d\n",
+                              GDK_WINDOW_HWND (window),
                               width, height, x, y));
       
       if (GDK_WINDOW_TYPE (private) == GDK_WINDOW_CHILD)
@@ -1065,8 +1059,8 @@ gdk_window_move_resize (GdkWindow *window,
          if (!AdjustWindowRectEx (&rect, dwStyle, FALSE, dwExStyle))
            WIN32_API_FAILED ("AdjustWindowRectEx");
 
-         GDK_NOTE (MISC, g_print ("...SetWindowPos(%#x,%ldx%ld@+%ld+%ld)\n",
-                                  (guint) GDK_WINDOW_HWND (window),
+         GDK_NOTE (MISC, g_print ("...SetWindowPos(%p,%ldx%ld@+%ld+%ld)\n",
+                                  GDK_WINDOW_HWND (window),
                                   rect.right - rect.left, rect.bottom - rect.top,
                                   rect.left, rect.top));
          if (!SetWindowPos (GDK_WINDOW_HWND (window), NULL,
@@ -1104,9 +1098,9 @@ gdk_window_reparent (GdkWindow *window,
 
   if (!GDK_WINDOW_DESTROYED (window) && !GDK_WINDOW_DESTROYED (new_parent))
     {
-      GDK_NOTE (MISC, g_print ("gdk_window_reparent: %#x %#x\n",
-                              (guint) GDK_WINDOW_HWND (window),
-                              (guint) GDK_WINDOW_HWND (new_parent)));
+      GDK_NOTE (MISC, g_print ("gdk_window_reparent: %p %p\n",
+                              GDK_WINDOW_HWND (window),
+                              GDK_WINDOW_HWND (new_parent)));
       if (!SetParent (GDK_WINDOW_HWND (window),
                      GDK_WINDOW_HWND (new_parent)))
        WIN32_API_FAILED ("SetParent");
@@ -1128,11 +1122,13 @@ gdk_window_reparent (GdkWindow *window,
     old_parent_private->children =
       g_list_remove (old_parent_private->children, window);
 
+#if 0
   if ((old_parent_private &&
        (!old_parent_private->guffaw_gravity != !parent_private->guffaw_gravity)) ||
       (!old_parent_private && parent_private->guffaw_gravity))
     gdk_window_set_static_win_gravity (window, parent_private->guffaw_gravity);
-  
+#endif
+
   parent_private->children = g_list_prepend (parent_private->children, window);
   _gdk_window_init_position (GDK_WINDOW (window_private));
 }
@@ -1160,8 +1156,8 @@ _gdk_windowing_window_clear_area (GdkWindow *window,
       if (height == 0)
        height = impl->height - y;
       GDK_NOTE (MISC, g_print ("_gdk_windowing_window_clear_area: "
-                              "%#x %dx%d@+%d+%d\n",
-                              (guint) GDK_WINDOW_HWND (window),
+                              "%p %dx%d@+%d+%d\n",
+                              GDK_WINDOW_HWND (window),
                               width, height, x, y));
       hdc = GetDC (GDK_WINDOW_HWND (window));
       IntersectClipRect (hdc, x, y, x + width + 1, y + height + 1);
@@ -1186,8 +1182,8 @@ _gdk_windowing_window_clear_area_e (GdkWindow *window,
       RECT rect;
 
       GDK_NOTE (MISC, g_print ("_gdk_windowing_window_clear_area_e: "
-                              "%#x %dx%d@+%d+%d\n",
-                              (guint) GDK_WINDOW_HWND (window),
+                              "%p %dx%d@+%d+%d\n",
+                              GDK_WINDOW_HWND (window),
                               width, height, x, y));
 
       rect.left = x;
@@ -1208,8 +1204,8 @@ gdk_window_raise (GdkWindow *window)
   
   if (!GDK_WINDOW_DESTROYED (window))
     {
-      GDK_NOTE (MISC, g_print ("gdk_window_raise: %#x\n",
-                              (guint) GDK_WINDOW_HWND (window)));
+      GDK_NOTE (MISC, g_print ("gdk_window_raise: %p\n",
+                              GDK_WINDOW_HWND (window)));
 
       if (!BringWindowToTop (GDK_WINDOW_HWND (window)))
        WIN32_API_FAILED ("BringWindowToTop");
@@ -1224,8 +1220,8 @@ gdk_window_lower (GdkWindow *window)
   
   if (!GDK_WINDOW_DESTROYED (window))
     {
-      GDK_NOTE (MISC, g_print ("gdk_window_lower: %#x\n",
-                              (guint) GDK_WINDOW_HWND (window)));
+      GDK_NOTE (MISC, g_print ("gdk_window_lower: %p\n",
+                              GDK_WINDOW_HWND (window)));
 
       if (!SetWindowPos (GDK_WINDOW_HWND (window), HWND_BOTTOM, 0, 0, 0, 0,
                         SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE))
@@ -1258,8 +1254,8 @@ gdk_window_set_hints (GdkWindow *window,
   
   impl = GDK_WINDOW_IMPL_WIN32 (GDK_WINDOW_OBJECT (window)->impl);
 
-  GDK_NOTE (MISC, g_print ("gdk_window_set_hints: %#x %dx%d..%dx%d @+%d+%d\n",
-                          (guint) GDK_WINDOW_HWND (window),
+  GDK_NOTE (MISC, g_print ("gdk_window_set_hints: %p %dx%d..%dx%d @+%d+%d\n",
+                          GDK_WINDOW_HWND (window),
                           min_width, min_height, max_width, max_height,
                           x, y));
 
@@ -1479,8 +1475,8 @@ gdk_window_set_title (GdkWindow   *window,
   if (!title[0])
     title = ".";
   
-  GDK_NOTE (MISC, g_print ("gdk_window_set_title: %#x %s\n",
-                          (guint) GDK_WINDOW_HWND (window), title));
+  GDK_NOTE (MISC, g_print ("gdk_window_set_title: %p %s\n",
+                          GDK_WINDOW_HWND (window), title));
   
   if (!GDK_WINDOW_DESTROYED (window))
     {
@@ -1502,8 +1498,8 @@ gdk_window_set_role (GdkWindow   *window,
   g_return_if_fail (window != NULL);
   g_return_if_fail (GDK_IS_WINDOW (window));
   
-  GDK_NOTE (MISC, g_print ("gdk_window_set_role: %#x %s\n",
-                          (guint) GDK_WINDOW_HWND (window),
+  GDK_NOTE (MISC, g_print ("gdk_window_set_role: %p %s\n",
+                          GDK_WINDOW_HWND (window),
                           (role ? role : "NULL")));
   /* XXX */
 }
@@ -1518,9 +1514,9 @@ gdk_window_set_transient_for (GdkWindow *window,
   g_return_if_fail (window != NULL);
   g_return_if_fail (GDK_IS_WINDOW (window));
   
-  GDK_NOTE (MISC, g_print ("gdk_window_set_transient_for: %#x %#x\n",
-                          (guint) GDK_WINDOW_HWND (window),
-                          (guint) GDK_WINDOW_HWND (parent)));
+  GDK_NOTE (MISC, g_print ("gdk_window_set_transient_for: %p %p\n",
+                          GDK_WINDOW_HWND (window),
+                          GDK_WINDOW_HWND (parent)));
 
   if (GDK_WINDOW_DESTROYED (window) || GDK_WINDOW_DESTROYED (parent))
     return;
@@ -1542,7 +1538,7 @@ gdk_window_set_transient_for (GdkWindow *window,
   if (!SetParent (window_id, parent_id))
        WIN32_API_FAILED ("SetParent");
 #else /* make the modal window topmost instead */
-  if (!SetWindowPos (window_id, HWND_TOPMOST, 0, 0, 0, 0,
+  if (!SetWindowPos (window_id, HWND_NOTOPMOST, 0, 0, 0, 0,
                      SWP_NOMOVE | SWP_NOSIZE))
     WIN32_API_FAILED ("SetWindowPos");
 #endif
@@ -1561,9 +1557,9 @@ gdk_window_set_background (GdkWindow *window,
   g_return_if_fail (window != NULL);
   g_return_if_fail (GDK_IS_WINDOW (window));
   
-  GDK_NOTE (MISC, g_print ("gdk_window_set_background: %#x %s\n",
-                          (guint) GDK_WINDOW_HWND (window), 
-                          gdk_win32_color_to_string (color)));
+  GDK_NOTE (MISC, g_print ("gdk_window_set_background: %p %s\n",
+                          GDK_WINDOW_HWND (window), 
+                          _gdk_win32_color_to_string (color)));
 
   private->bg_color = *color;
 
@@ -1586,6 +1582,7 @@ gdk_window_set_back_pixmap (GdkWindow *window,
   g_return_if_fail (window != NULL);
   g_return_if_fail (GDK_IS_WINDOW (window));
   g_return_if_fail (pixmap == NULL || !parent_relative);
+  g_return_if_fail (pixmap == NULL || gdk_drawable_get_depth (window) == gdk_drawable_get_depth (pixmap));
   
   if (private->bg_pixmap &&
       private->bg_pixmap != GDK_PARENT_RELATIVE_BG &&
@@ -1617,6 +1614,7 @@ gdk_window_set_cursor (GdkWindow *window,
 {
   GdkWindowImplWin32 *impl;
   GdkCursorPrivate *cursor_private;
+  GdkWindowObject *parent_window;
   HCURSOR hcursor;
   HCURSOR hprevcursor;
   
@@ -1634,9 +1632,9 @@ gdk_window_set_cursor (GdkWindow *window,
   else
     hcursor = cursor_private->hcursor;
   
-  GDK_NOTE (MISC, g_print ("gdk_window_set_cursor: %#x %#x\n",
-                          (guint) GDK_WINDOW_HWND (window),
-                          (guint) hcursor));
+  GDK_NOTE (MISC, g_print ("gdk_window_set_cursor: %p %p\n",
+                          GDK_WINDOW_HWND (window),
+                          hcursor));
 
   /* First get the old cursor, if any (we wait to free the old one
    * since it may be the current cursor set in the Win32 API right
@@ -1656,13 +1654,14 @@ gdk_window_set_cursor (GdkWindow *window,
        */
       if ((impl->hcursor = CopyCursor (hcursor)) == NULL)
        WIN32_API_FAILED ("CopyCursor");
-      GDK_NOTE (MISC, g_print ("...CopyCursor (%#x) = %#x\n",
-                              (guint) hcursor, (guint) impl->hcursor));
+      GDK_NOTE (MISC, g_print ("...CopyCursor (%p) = %p\n",
+                              hcursor, impl->hcursor));
     }
 
-   /* Set new cursor in all cases if we're over our window */
+  /* If the pointer is over our window, set new cursor if given */
   if (gdk_window_get_pointer(window, NULL, NULL, NULL) == window)
-    SetCursor (impl->hcursor);
+    if (impl->hcursor != NULL)
+      SetCursor (impl->hcursor);
 
   /* Destroy the previous cursor: Need to make sure it's no longer in
    * use before we destroy it, in case we're not over our window but
@@ -1671,10 +1670,28 @@ gdk_window_set_cursor (GdkWindow *window,
   if (hprevcursor != NULL)
     {
       if (GetCursor() == hprevcursor)
-       SetCursor (NULL);
+       {
+         /* Look for a suitable cursor to use instead */
+         hcursor = NULL;
+          parent_window = GDK_WINDOW_OBJECT (window)->parent;
+          while (hcursor == NULL)
+           {
+             if (parent_window)
+               {
+                 impl = GDK_WINDOW_IMPL_WIN32 (parent_window->impl);
+                 hcursor = impl->hcursor;
+                 parent_window = parent_window->parent;
+               }
+             else
+               {
+                 hcursor = LoadCursor (NULL, IDC_ARROW);
+               }
+           }
+          SetCursor (hcursor);
+        }
 
-      GDK_NOTE (MISC, g_print ("...DestroyCursor (%#x)\n",
-                              (guint) hprevcursor));
+      GDK_NOTE (MISC, g_print ("...DestroyCursor (%p)\n",
+                              hprevcursor));
       
       if (!DestroyCursor (hprevcursor))
        WIN32_API_FAILED ("DestroyCursor");
@@ -1701,6 +1718,26 @@ gdk_window_get_geometry (GdkWindow *window,
       if (!GetClientRect (GDK_WINDOW_HWND (window), &rect))
        WIN32_API_FAILED ("GetClientRect");
 
+      if (window != _gdk_parent_root)
+       {
+         POINT pt;
+         GdkWindow *parent = gdk_window_get_parent (window);
+
+         pt.x = rect.left;
+         pt.y = rect.top;
+         ClientToScreen (GDK_WINDOW_HWND (window), &pt);
+         ScreenToClient (GDK_WINDOW_HWND (parent), &pt);
+         rect.left = pt.x;
+         rect.top = pt.y;
+
+         pt.x = rect.right;
+         pt.y = rect.bottom;
+         ClientToScreen (GDK_WINDOW_HWND (window), &pt);
+         ScreenToClient (GDK_WINDOW_HWND (parent), &pt);
+         rect.right = pt.x;
+         rect.bottom = pt.y;
+       }
+
       if (x)
        *x = rect.left;
       if (y)
@@ -1744,8 +1781,8 @@ gdk_window_get_origin (GdkWindow *window,
   if (y)
     *y = ty;
 
-  GDK_NOTE (MISC, g_print ("gdk_window_get_origin: %#x: +%d+%d\n",
-                          (guint) GDK_WINDOW_HWND (window),
+  GDK_NOTE (MISC, g_print ("gdk_window_get_origin: %p: +%d+%d\n",
+                          GDK_WINDOW_HWND (window),
                           tx, ty));
   return return_val;
 }
@@ -1763,38 +1800,17 @@ gdk_window_get_root_origin (GdkWindow *window,
                            gint      *x,
                            gint      *y)
 {
-  GdkWindowObject *rover;
-  POINT pt;
+  GdkRectangle rect;
 
-  g_return_if_fail (window != NULL);
   g_return_if_fail (GDK_IS_WINDOW (window));
 
-  rover = (GdkWindowObject*) window;
-  if (x)
-    *x = 0;
-  if (y)
-    *y = 0;
+  gdk_window_get_frame_extents (window, &rect);
 
-  if (GDK_WINDOW_DESTROYED (window))
-    return;
-      
-  while (rover->parent && ((GdkWindowObject*) rover->parent)->parent)
-    rover = (GdkWindowObject *) rover->parent;
-  if (rover->destroyed)
-    return;
-
-  pt.x = 0;
-  pt.y = 0;
-  ClientToScreen (GDK_WINDOW_HWND (rover), &pt);
   if (x)
-    *x = pt.x;
-  if (y)
-    *y = pt.y;
+    *x = rect.x;
 
-  GDK_NOTE (MISC, g_print ("gdk_window_get_root_origin: %#x: (%#x) +%ld+%ld\n",
-                          (guint) GDK_WINDOW_HWND (window),
-                          (guint) GDK_WINDOW_HWND (rover),
-                          pt.x, pt.y));
+  if (y)
+    *y = rect.y;
 }
 
 void
@@ -1822,6 +1838,7 @@ gdk_window_get_frame_extents (GdkWindow    *window,
     private = (GdkWindowObject*) private->parent;
 
   hwnd = GDK_WINDOW_HWND (window);
+
   /* find the frame window */
   while (HWND_DESKTOP != GetParent (hwnd))
     {
@@ -1833,13 +1850,14 @@ gdk_window_get_frame_extents (GdkWindow    *window,
     WIN32_API_FAILED ("GetWindowRect");
 
   rect->x = r.left;
-  rect->y = r.right;
+  rect->y = r.top;
   rect->width = r.right - r.left;
   rect->height = r.bottom - r.top;
 }
 
 GdkWindow*
-_gdk_windowing_window_get_pointer (GdkWindow       *window,
+_gdk_windowing_window_get_pointer (GdkDisplay      *display,
+                                  GdkWindow       *window,
                                   gint            *x,
                                   gint            *y,
                                   GdkModifierType *mask)
@@ -1847,21 +1865,17 @@ _gdk_windowing_window_get_pointer (GdkWindow       *window,
   GdkWindow *return_val;
   POINT screen_point, point;
   HWND hwnd, hwndc;
+  BYTE kbd[256];
 
   g_return_val_if_fail (window == NULL || GDK_IS_WINDOW (window), NULL);
   
-  if (!window)
-    window = _gdk_parent_root;
-
   return_val = NULL;
   GetCursorPos (&screen_point);
   point = screen_point;
   ScreenToClient (GDK_WINDOW_HWND (window), &point);
 
-  if (x)
-    *x = point.x;
-  if (y)
-    *y = point.y;
+  *x = point.x;
+  *y = point.y;
 
   hwnd = WindowFromPoint (point);
   if (hwnd != NULL)
@@ -1881,40 +1895,49 @@ _gdk_windowing_window_get_pointer (GdkWindow       *window,
            hwnd = hwndc;
        }
       
-      return_val = gdk_window_lookup (hwnd);
+      return_val = gdk_window_lookup ((GdkNativeWindow) hwnd);
     }
   else
     return_val = NULL;
       
-  if (mask)
-    {
-      BYTE kbd[256];
-
-      GetKeyboardState (kbd);
-      *mask = 0;
-      if (kbd[VK_SHIFT] & 0x80)
-       *mask |= GDK_SHIFT_MASK;
-      if (kbd[VK_CAPITAL] & 0x80)
-       *mask |= GDK_LOCK_MASK;
-      if (kbd[VK_CONTROL] & 0x80)
-       *mask |= GDK_CONTROL_MASK;
-      if (kbd[VK_MENU] & 0x80)
-       *mask |= GDK_MOD1_MASK;
-      if (kbd[VK_LBUTTON] & 0x80)
-       *mask |= GDK_BUTTON1_MASK;
-      if (kbd[VK_MBUTTON] & 0x80)
-       *mask |= GDK_BUTTON2_MASK;
-      if (kbd[VK_RBUTTON] & 0x80)
-       *mask |= GDK_BUTTON3_MASK;
-    }
+  GetKeyboardState (kbd);
+  *mask = 0;
+  if (kbd[VK_SHIFT] & 0x80)
+    *mask |= GDK_SHIFT_MASK;
+  if (kbd[VK_CAPITAL] & 0x80)
+    *mask |= GDK_LOCK_MASK;
+  if (kbd[VK_CONTROL] & 0x80)
+    *mask |= GDK_CONTROL_MASK;
+  if (kbd[VK_MENU] & 0x80)
+    *mask |= GDK_MOD1_MASK;
+  if (kbd[VK_LBUTTON] & 0x80)
+    *mask |= GDK_BUTTON1_MASK;
+  if (kbd[VK_MBUTTON] & 0x80)
+    *mask |= GDK_BUTTON2_MASK;
+  if (kbd[VK_RBUTTON] & 0x80)
+    *mask |= GDK_BUTTON3_MASK;
   
   return return_val;
 }
 
+void
+_gdk_windowing_get_pointer (GdkDisplay       *display,
+                           GdkScreen       **screen,
+                           gint             *x,
+                           gint             *y,
+                           GdkModifierType  *mask)
+{
+  GdkScreen *default_screen = gdk_display_get_default_screen (display);
+  GdkWindow *root_window = gdk_screen_get_root_window (default_screen);
+  
+  *screen = default_screen;
+  _gdk_windowing_window_get_pointer (display, root_window, x, y, mask);
+}
+
 GdkWindow*
-_gdk_windowing_window_at_pointer (GdkScreen *screen,
-                                 gint      *win_x,
-                                 gint      *win_y)
+_gdk_windowing_window_at_pointer (GdkDisplay *display,
+                                 gint       *win_x,
+                                 gint       *win_y)
 {
   GdkWindow *window;
   POINT point, pointc;
@@ -1928,10 +1951,8 @@ _gdk_windowing_window_at_pointer (GdkScreen *screen,
   if (hwnd == NULL)
     {
       window = _gdk_parent_root;
-      if (win_x)
-       *win_x = pointc.x;
-      if (win_y)
-       *win_y = pointc.y;
+      *win_x = pointc.x;
+      *win_y = pointc.y;
       return window;
     }
       
@@ -1948,15 +1969,13 @@ _gdk_windowing_window_at_pointer (GdkScreen *screen,
   if (window && (win_x || win_y))
     {
       GetClientRect (hwnd, &rect);
-      if (win_x)
-       *win_x = point.x - rect.left;
-      if (win_y)
-       *win_y = point.y - rect.top;
+      *win_x = point.x - rect.left;
+      *win_y = point.y - rect.top;
     }
 
-  GDK_NOTE (MISC, g_print ("gdk_window_at_pointer: +%ld+%ld %#x%s\n",
+  GDK_NOTE (MISC, g_print ("gdk_window_at_pointer: +%ld+%ld %p%s\n",
                           point.x, point.y,
-                          (guint) hwnd,
+                          hwnd,
                           (window == NULL ? " NULL" : "")));
 
   return window;
@@ -1971,7 +1990,7 @@ gdk_window_get_events (GdkWindow *window)
   if (GDK_WINDOW_DESTROYED (window))
     return 0;
 
-  return GDK_WINDOW_IMPL_WIN32 (GDK_WINDOW_OBJECT (window)->impl)->event_mask;
+  return GDK_WINDOW_OBJECT (window)->event_mask;
 }
 
 void          
@@ -1984,7 +2003,11 @@ gdk_window_set_events (GdkWindow   *window,
   if (GDK_WINDOW_DESTROYED (window))
     return;
 
-  GDK_WINDOW_IMPL_WIN32 (GDK_WINDOW_OBJECT (window)->impl)->event_mask = event_mask;
+  /* gdk_window_new() always sets the GDK_STRUCTURE_MASK, so better
+   * set it here, too. Not that I know or remember why it is
+   * necessary, will have to test some day.
+   */
+  GDK_WINDOW_OBJECT (window)->event_mask = GDK_STRUCTURE_MASK | event_mask;
 }
 
 void
@@ -1997,8 +2020,8 @@ gdk_window_shape_combine_mask (GdkWindow *window,
 
   if (!mask)
     {
-      GDK_NOTE (MISC, g_print ("gdk_window_shape_combine_mask: %#x none\n",
-                              (guint) GDK_WINDOW_HWND (window)));
+      GDK_NOTE (MISC, g_print ("gdk_window_shape_combine_mask: %p none\n",
+                              GDK_WINDOW_HWND (window)));
       SetWindowRgn (GDK_WINDOW_HWND (window), NULL, TRUE);
     }
   else
@@ -2009,11 +2032,11 @@ gdk_window_shape_combine_mask (GdkWindow *window,
       RECT rect;
 
       /* Convert mask bitmap to region */
-      hrgn = BitmapToRegion (GDK_WINDOW_HWND (mask));
+      hrgn = _gdk_win32_bitmap_to_hrgn (mask);
 
-      GDK_NOTE (MISC, g_print ("gdk_window_shape_combine_mask: %#x %#x\n",
-                              (guint) GDK_WINDOW_HWND (window),
-                              (guint) GDK_WINDOW_HWND (mask)));
+      GDK_NOTE (MISC, g_print ("gdk_window_shape_combine_mask: %p %p\n",
+                              GDK_WINDOW_HWND (window),
+                              GDK_WINDOW_HWND (mask)));
 
       /* SetWindowRgn wants window (not client) coordinates */ 
       dwStyle = GetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE);
@@ -2027,9 +2050,9 @@ gdk_window_shape_combine_mask (GdkWindow *window,
       /* If this is a top-level window, add the title bar to the region */
       if (GDK_WINDOW_TYPE (window) == GDK_WINDOW_TOPLEVEL)
        {
-         CombineRgn (hrgn, hrgn,
-                     CreateRectRgn (0, 0, rect.right - rect.left, -rect.top),
-                     RGN_OR);
+         HRGN tmp = CreateRectRgn (0, 0, rect.right - rect.left, -rect.top);
+         CombineRgn (hrgn, hrgn, tmp, RGN_OR);
+         DeleteObject (tmp);
        }
       
       SetWindowRgn (GDK_WINDOW_HWND (window), hrgn, TRUE);
@@ -2113,19 +2136,26 @@ void
 gdk_window_set_decorations (GdkWindow      *window,
                            GdkWMDecoration decorations)
 {
-  LONG style, exstyle;
+  LONG style;
 
   g_return_if_fail (window != NULL);
   g_return_if_fail (GDK_IS_WINDOW (window));
   
+  GDK_NOTE (MISC, g_print ("gdk_window_set_decorations: %p %s%s%s%s%s%s%s\n",
+                          GDK_WINDOW_HWND (window),
+                          (decorations & GDK_DECOR_ALL ? "ALL " : ""),
+                          (decorations & GDK_DECOR_BORDER ? "BORDER " : ""),
+                          (decorations & GDK_DECOR_RESIZEH ? "RESIZEH " : ""),
+                          (decorations & GDK_DECOR_TITLE ? "TITLE " : ""),
+                          (decorations & GDK_DECOR_MENU ? "MENU " : ""),
+                          (decorations & GDK_DECOR_MINIMIZE ? "MINIMIZE " : ""),
+                          (decorations & GDK_DECOR_MAXIMIZE ? "MAXIMIZE " : "")));
+
   style = GetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE);
-  exstyle = GetWindowLong (GDK_WINDOW_HWND (window), GWL_EXSTYLE);
 
   style &= (WS_OVERLAPPED|WS_POPUP|WS_CHILD|WS_MINIMIZE|WS_VISIBLE|WS_DISABLED
            |WS_CLIPSIBLINGS|WS_CLIPCHILDREN|WS_MAXIMIZE);
 
-  exstyle &= (WS_EX_TOPMOST|WS_EX_TRANSPARENT);
-
   if (decorations & GDK_DECOR_ALL)
     style |= (WS_CAPTION|WS_SYSMENU|WS_THICKFRAME|WS_MINIMIZEBOX|WS_MAXIMIZEBOX);
   if (decorations & GDK_DECOR_BORDER)
@@ -2142,26 +2172,35 @@ gdk_window_set_decorations (GdkWindow      *window,
     style |= (WS_MAXIMIZEBOX);
   
   SetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE, style);
+  SetWindowPos (GDK_WINDOW_HWND (window), NULL, 0, 0, 0, 0,
+               SWP_FRAMECHANGED | SWP_NOACTIVATE | SWP_NOMOVE |
+               SWP_NOREPOSITION | SWP_NOSIZE | SWP_NOZORDER);
 }
 
 void
 gdk_window_set_functions (GdkWindow    *window,
                          GdkWMFunction functions)
 {
-  LONG style, exstyle;
+  LONG style;
 
   g_return_if_fail (window != NULL);
   g_return_if_fail (GDK_IS_WINDOW (window));
   
+  GDK_NOTE (MISC, g_print ("gdk_window_set_functions: %p %s%s%s%s%s%s\n",
+                          GDK_WINDOW_HWND (window),
+                          (functions & GDK_FUNC_ALL ? "ALL " : ""),
+                          (functions & GDK_FUNC_RESIZE ? "RESIZE " : ""),
+                          (functions & GDK_FUNC_MOVE ? "MOVE " : ""),
+                          (functions & GDK_FUNC_MINIMIZE ? "MINIMIZE " : ""),
+                          (functions & GDK_FUNC_MAXIMIZE ? "MAXIMIZE " : ""),
+                          (functions & GDK_FUNC_CLOSE ? "CLOSE " : "")));
+
   style = GetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE);
-  exstyle = GetWindowLong (GDK_WINDOW_HWND (window), GWL_EXSTYLE);
 
   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);
 
-  exstyle &= (WS_EX_TOPMOST|WS_EX_TRANSPARENT);
-
   if (functions & GDK_FUNC_ALL)
     style |= (WS_THICKFRAME|WS_MINIMIZEBOX|WS_MAXIMIZEBOX);
   if (functions & GDK_FUNC_RESIZE)
@@ -2174,19 +2213,15 @@ gdk_window_set_functions (GdkWindow    *window,
     style |= (WS_MAXIMIZEBOX);
   
   SetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE, style);
+  SetWindowPos (GDK_WINDOW_HWND (window), NULL, 0, 0, 0, 0,
+               SWP_FRAMECHANGED | SWP_NOACTIVATE | SWP_NOMOVE |
+               SWP_NOREPOSITION | SWP_NOSIZE | SWP_NOZORDER);
 }
 
-/* 
- * propagate the shapes from all child windows of a GDK window to the parent 
- * window. Shamelessly ripped from Enlightenment's code
- * 
- * - Raster
- */
-
 static void
-QueryTree (HWND hwnd,
+QueryTree (HWND   hwnd,
           HWND **children,
-          gint *nchildren)
+          gint  *nchildren)
 {
   guint i, n;
   HWND child;
@@ -2248,6 +2283,7 @@ gdk_propagate_shapes (HANDLE   win,
             }
          }
        SetWindowRgn (win, region, TRUE);
+       g_free (list);
      }
    else
      DeleteObject (region);
@@ -2277,92 +2313,11 @@ gdk_window_merge_child_shapes (GdkWindow *window)
   gdk_propagate_shapes (GDK_WINDOW_HWND (window), TRUE);
 }
 
-/* Support for windows that can be guffaw-scrolled
- * (See http://www.gtk.org/~otaylor/whitepapers/guffaw-scrolling.txt)
- */
-
-static gboolean
-gdk_window_gravity_works (void)
-{
-  enum { UNKNOWN, NO, YES };
-  static gint gravity_works = UNKNOWN;
-  
-  if (gravity_works == UNKNOWN)
-    {
-      GdkWindowAttr attr;
-      GdkWindow *parent;
-      GdkWindow *child;
-      gint y;
-      
-      attr.window_type = GDK_WINDOW_TEMP;
-      attr.wclass = GDK_INPUT_OUTPUT;
-      attr.x = 0;
-      attr.y = 0;
-      attr.width = 100;
-      attr.height = 100;
-      attr.event_mask = 0;
-      
-      parent = gdk_window_new (NULL, &attr, GDK_WA_X | GDK_WA_Y);
-      
-      attr.window_type = GDK_WINDOW_CHILD;
-      child = gdk_window_new (parent, &attr, GDK_WA_X | GDK_WA_Y);
-      
-      gdk_window_set_static_win_gravity (child, TRUE);
-      
-      gdk_window_resize (parent, 100, 110);
-      gdk_window_move (parent, 0, -10);
-      gdk_window_move_resize (parent, 0, 0, 100, 100);
-      
-      gdk_window_resize (parent, 100, 110);
-      gdk_window_move (parent, 0, -10);
-      gdk_window_move_resize (parent, 0, 0, 100, 100);
-      
-      gdk_window_get_geometry (child, NULL, &y, NULL, NULL, NULL);
-      
-      gdk_window_destroy (parent);
-      gdk_window_destroy (child);
-      
-      gravity_works = ((y == -20) ? YES : NO);
-    }
-  
-  return (gravity_works == YES);
-}
-
-static void
-gdk_window_set_static_bit_gravity (GdkWindow *window, gboolean on)
-{
-  g_return_if_fail (window != NULL);
-
-  GDK_NOTE (MISC, g_print ("gdk_window_set_static_bit_gravity: Not implemented\n"));
-}
-
-static void
-gdk_window_set_static_win_gravity (GdkWindow *window, gboolean on)
-{
-  g_return_if_fail (window != NULL);
-
-  GDK_NOTE (MISC,
-           g_print ("gdk_window_set_static_win_gravity: Not implemented\n"));
-}
-
-/*************************************************************
- * gdk_window_set_static_gravities:
- *     Set the bit gravity of the given window to static,
- *     and flag it so all children get static subwindow
- *     gravity.
- *   arguments:
- *     window: window for which to set static gravity
- *     use_static: Whether to turn static gravity on or off.
- *   results:
- *     Does the XServer support static gravity?
- *************************************************************/
-
 gboolean 
 gdk_window_set_static_gravities (GdkWindow *window,
                                 gboolean   use_static)
 {
   GdkWindowObject *private = (GdkWindowObject *)window;
-  GList *tmp_list;
   
   g_return_val_if_fail (window != NULL, FALSE);
   g_return_val_if_fail (GDK_IS_WINDOW (window), FALSE);
@@ -2370,24 +2325,11 @@ gdk_window_set_static_gravities (GdkWindow *window,
   if (!use_static == !private->guffaw_gravity)
     return TRUE;
   
-  if (use_static && !gdk_window_gravity_works ())
+  if (use_static)
     return FALSE;
   
   private->guffaw_gravity = use_static;
   
-  if (!GDK_WINDOW_DESTROYED (window))
-    {
-      gdk_window_set_static_bit_gravity (window, use_static);
-      
-      tmp_list = private->children;
-      while (tmp_list)
-       {
-         gdk_window_set_static_win_gravity (window, use_static);
-         
-         tmp_list = tmp_list->next;
-       }
-    }
-  
   return TRUE;
 }
 
@@ -2451,7 +2393,7 @@ gdk_window_stick (GdkWindow *window)
       /* "stick" means stick to all desktops _and_ do not scroll with the
        * viewport. i.e. glue to the monitor glass in all cases.
        */
-      g_warning ("gdk_window_stick (%#x) ???", (guint) GDK_WINDOW_HWND (window));
+      g_warning ("gdk_window_stick (%p) ???", GDK_WINDOW_HWND (window));
     }
   else
     {
@@ -2472,7 +2414,7 @@ gdk_window_unstick (GdkWindow *window)
 
   if (GDK_WINDOW_IS_MAPPED (window))
     {
-      g_warning ("gdk_window_unstick (%#x) ???", (guint) GDK_WINDOW_HWND (window));
+      g_warning ("gdk_window_unstick (%p) ???", GDK_WINDOW_HWND (window));
     }
   else
     {
@@ -2515,6 +2457,20 @@ gdk_window_unmaximize (GdkWindow *window)
                                 0);
 }
 
+void
+gdk_window_fullscreen (GdkWindow *window)
+{
+  g_return_if_fail (GDK_IS_WINDOW (window));
+
+  g_warning ("gdk_window_fullscreen() not implemented.\n");
+}
+
+void
+gdk_window_unfullscreen (GdkWindow *window)
+{
+  g_return_if_fail (GDK_IS_WINDOW (window));
+}
+
 void
 gdk_window_focus (GdkWindow *window,
                   guint32    timestamp)
@@ -2524,7 +2480,10 @@ gdk_window_focus (GdkWindow *window,
   if (GDK_WINDOW_DESTROYED (window))
     return;
   
+  GDK_NOTE (MISC, g_print ("gdk_window_focus: %p\n", GDK_WINDOW_HWND (window)));
+
   ShowWindow (GDK_WINDOW_HWND (window), SW_SHOWNORMAL);
+  SetFocus (GDK_WINDOW_HWND (window));
 }
 
 void
@@ -2545,16 +2504,28 @@ gdk_window_set_modal_hint (GdkWindow *window,
 
   if (GDK_WINDOW_IS_MAPPED (window))
     if (!SetWindowPos (GDK_WINDOW_HWND (window), HWND_TOPMOST,
-                           0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE))
+                      0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE))
       WIN32_API_FAILED ("SetWindowPos");
 }
 
+void
+gdk_window_set_skip_taskbar_hint (GdkWindow *window,
+                                 gboolean   skips_taskbar)
+{
+  g_return_if_fail (GDK_IS_WINDOW (window));
+}
+
+void
+gdk_window_set_skip_pager_hint (GdkWindow *window,
+                               gboolean   skips_pager)
+{
+  g_return_if_fail (GDK_IS_WINDOW (window));
+}
+
 void
 gdk_window_set_type_hint (GdkWindow        *window,
                          GdkWindowTypeHint hint)
 {
-  GdkAtom atom;
-  
   g_return_if_fail (window != NULL);
   g_return_if_fail (GDK_IS_WINDOW (window));
   
@@ -2564,27 +2535,22 @@ gdk_window_set_type_hint (GdkWindow        *window,
   switch (hint)
     {
     case GDK_WINDOW_TYPE_HINT_DIALOG:
-      atom = gdk_atom_intern ("_NET_WM_WINDOW_TYPE_DIALOG", FALSE);
       break;
     case GDK_WINDOW_TYPE_HINT_MENU:
-      atom = gdk_atom_intern ("_NET_WM_WINDOW_TYPE_MENU", FALSE);
       break;
     case GDK_WINDOW_TYPE_HINT_TOOLBAR:
-      atom = gdk_atom_intern ("_NET_WM_WINDOW_TYPE_TOOLBAR", FALSE);
       break;
     default:
       g_warning ("Unknown hint %d passed to gdk_window_set_type_hint", hint);
       /* Fall thru */
     case GDK_WINDOW_TYPE_HINT_NORMAL:
-      atom = gdk_atom_intern ("_NET_WM_WINDOW_TYPE_NORMAL", FALSE);
       break;
     }
   /*
    * XXX ???
    */
-  GDK_NOTE (MISC,
-            g_print ("gdk_window_set_type_hint (%#x)\n",
-                     (guint) GDK_WINDOW_HWND (window)));
+  GDK_NOTE (MISC, g_print ("gdk_window_set_type_hint: %p\n",
+                          GDK_WINDOW_HWND (window)));
 }
 
 void
@@ -2631,3 +2597,11 @@ gdk_window_begin_move_drag (GdkWindow *window,
 
   /* XXX: isn't all this default on win32 ... */  
 }
+
+GdkWindow *
+gdk_window_lookup_for_display (GdkDisplay *display, GdkNativeWindow anid)
+{
+  g_return_val_if_fail (display == gdk_display_get_default(), NULL);
+
+  return gdk_window_lookup (anid);
+}