]> Pileus Git - ~andy/gtk/blobdiff - gdk/win32/gdkwindow-win32.c
Large changes to the Win32 backend, partially made necessary by the
[~andy/gtk] / gdk / win32 / gdkwindow-win32.c
index d76694dbaa685fec5267e5de5b4200047bf5c3af..d4c279658cf8ae61239c5150d44e5ca53aa9a514 100644 (file)
 #include "gdkevents.h"
 #include "gdkpixmap.h"
 #include "gdkwindow.h"
+#include "gdkinternals.h"
 #include "gdkprivate.h"
+#include "gdkprivate-win32.h"
 #include "gdkinputprivate.h"
-#include "gdkx.h"
+#include "gdkwin32.h"
+
+static gboolean gdk_window_gravity_works (void);
+static void     gdk_window_set_static_win_gravity (GdkWindow *window, 
+                                                  gboolean   on);
 
 /* The Win API function AdjustWindowRect may return negative values
  * resulting in obscured title bars. This helper function is coreccting it.
@@ -47,7 +53,10 @@ SafeAdjustWindowRectEx (RECT* lpRect,
                        DWORD dwExStyle)
 {
   if (!AdjustWindowRectEx(lpRect, dwStyle, bMenu, dwExStyle))
-    return FALSE;
+    {
+      WIN32_API_FAILED ("AdjustWindowRectEx");
+      return FALSE;
+    }
   if (lpRect->left < 0)
     {
       lpRect->right -= lpRect->left;
@@ -61,73 +70,83 @@ SafeAdjustWindowRectEx (RECT* lpRect,
   return TRUE;
 }
 
-/* Forward declarations */
-static gboolean gdk_window_gravity_works (void);
-static void     gdk_window_set_static_win_gravity (GdkWindow *window, 
-                                                  gboolean   on);
+GdkDrawableClass _gdk_windowing_window_class;
 
-/* 
- * The following fucntion by The Rasterman <raster@redhat.com>
- * This function returns the X Window ID in which the x y location is in 
- * (x and y being relative to the root window), excluding any windows listed
- * in the GList excludes (this is a list of X Window ID's - gpointer being
- * the Window ID).
- * 
- * This is primarily designed for internal gdk use - for DND for example
- * when using a shaped icon window as the drag object - you exclude the
- * X Window ID of the "icon" (perhaps more if excludes may be needed) and
- * You can get back an X Window ID as to what X Window ID is infact under
- * those X,Y co-ordinates.
- */
-HWND
-gdk_window_xid_at_coords (gint     x,
-                         gint     y,
-                         GList   *excludes,
-                         gboolean excl_child)
+static void
+gdk_win32_window_destroy (GdkDrawable *drawable)
 {
-  POINT pt;
-  gboolean warned = FALSE;
+  if (!GDK_DRAWABLE_DESTROYED (drawable))
+    {
+      if (GDK_DRAWABLE_TYPE (drawable) == GDK_WINDOW_FOREIGN)
+       gdk_xid_table_remove (GDK_DRAWABLE_XID (drawable));
+      else
+       g_warning ("losing last reference to undestroyed window\n");
+    }
 
-  pt.x = x;
-  pt.y = y;
-  /* This is probably not correct, just a quick hack */
+  if (GDK_WINDOW_WIN32DATA (drawable)->bg_type == GDK_WIN32_BG_PIXMAP
+      && GDK_WINDOW_WIN32DATA (drawable)->bg_pixmap != NULL)
+    gdk_drawable_unref (GDK_WINDOW_WIN32DATA (drawable)->bg_pixmap);
 
-  if (!warned)
+  g_free (GDK_DRAWABLE_WIN32DATA (drawable));
+}
+
+static GdkWindow *
+gdk_win32_window_alloc (void)
+{
+  GdkWindow *window;
+  GdkWindowPrivate *private;
+  
+  static gboolean initialized = FALSE;
+
+  if (!initialized)
     {
-      g_warning ("gdk_window_xid_at_coords probably not implemented correctly");
-      warned = TRUE;
+      initialized = TRUE;
+      
+      _gdk_windowing_window_class = _gdk_win32_drawable_class;
+      _gdk_win32_drawable_class.destroy = gdk_win32_window_destroy;
     }
 
-  /* XXX */
-  return WindowFromPoint (pt);
+  window = _gdk_window_alloc ();
+  private = (GdkWindowPrivate *) window;
+
+  private->drawable.klass = &_gdk_windowing_window_class;
+  private->drawable.klass_data = g_new (GdkWindowWin32Data, 1);
+
+  GDK_WINDOW_WIN32DATA (window)->event_mask = 0;
+  GDK_WINDOW_WIN32DATA (window)->bg_type = GDK_WIN32_BG_NORMAL;
+  GDK_WINDOW_WIN32DATA (window)->xcursor = NULL;
+  GDK_WINDOW_WIN32DATA (window)->hint_flags = 0;
+  GDK_WINDOW_WIN32DATA (window)->extension_events_selected = FALSE;
+  
+  GDK_WINDOW_WIN32DATA (window)->input_locale = GetKeyboardLayout (0);
+  TranslateCharsetInfo ((DWORD FAR *) GetACP (),
+                       &GDK_WINDOW_WIN32DATA (window)->charset_info,
+                       TCI_SRCCODEPAGE);
+
+  return window;
 }
 
 void
 gdk_window_init (void)
 {
-  unsigned int width;
-  unsigned int height;
-#if 0
-  width = GetSystemMetrics (SM_CXSCREEN);
-  height = GetSystemMetrics (SM_CYSCREEN);
-#else
-  { RECT r; /* //HB: don't obscure tray window (task bar) */
-    SystemParametersInfo(SPI_GETWORKAREA, 0, &r, 0);
-    width  = r.right - r.left;
-    height = r.bottom - r.top;
-  }
-#endif
+  GdkWindowPrivate *private;
+  RECT r;
+  guint width;
+  guint height;
 
-  gdk_root_parent.drawable.xwindow = gdk_root_window;
-  gdk_root_parent.drawable.window_type = GDK_WINDOW_ROOT;
-  gdk_root_parent.drawable.drawable.user_data = NULL;
-  gdk_root_parent.drawable.width = width;
-  gdk_root_parent.drawable.height = height;
-  gdk_root_parent.drawable.ref_count = 1;
-  gdk_root_parent.drawable.colormap = NULL;
-  gdk_root_parent.children = NULL;
+  SystemParametersInfo(SPI_GETWORKAREA, 0, &r, 0);
+  width  = r.right - r.left;
+  height = r.bottom - r.top;
 
-  gdk_xid_table_insert (&gdk_root_window, &gdk_root_parent);
+  gdk_parent_root = gdk_win32_window_alloc ();
+  private = (GdkWindowPrivate *) gdk_parent_root;
+  
+  GDK_DRAWABLE_WIN32DATA (gdk_parent_root)->xid = gdk_root_window;
+  private->drawable.window_type = GDK_WINDOW_ROOT;
+  private->drawable.width = width;
+  private->drawable.height = height;
+
+  gdk_xid_table_insert (&gdk_root_window, gdk_parent_root);
 }
 
 /* RegisterGdkClass
@@ -138,7 +157,7 @@ gdk_window_init (void)
  *   get its own class
  */
 ATOM
-RegisterGdkClass(GdkWindowType wtype)
+RegisterGdkClass (GdkDrawableType wtype)
 {
   static ATOM klassTOPLEVEL = 0;
   static ATOM klassDIALOG   = 0;
@@ -240,9 +259,13 @@ RegisterGdkClass(GdkWindowType wtype)
       break;
   }
 
+  if (klass == 0)
+    {
+      WIN32_API_FAILED ("RegisterClassEx");
+      g_error ("That is a fatal error");
+    }
   return klass;
-} /* RegisterGdkClass */
-
+}
 
 GdkWindow*
 gdk_window_new (GdkWindow     *parent,
@@ -261,42 +284,34 @@ gdk_window_new (GdkWindow     *parent,
   int width, height;
   int x, y;
   char *title;
+  gint titlelen;
+  wchar_t *wctitle;
+  gint wlen;
+  char *mbtitle;
 
   g_return_val_if_fail (attributes != NULL, NULL);
 
   if (!parent)
-    parent = (GdkWindow*) &gdk_root_parent;
+    parent = gdk_parent_root;
 
   parent_private = (GdkWindowPrivate*) parent;
   if (GDK_DRAWABLE_DESTROYED (parent))
     return NULL;
 
-  xparent = parent_private->drawable.xwindow;
+  xparent = GDK_DRAWABLE_XID (parent);
 
-  private = g_new (GdkWindowPrivate, 1);
-  window = (GdkWindow*) private;
+  window = gdk_win32_window_alloc ();
+  private = (GdkWindowPrivate *)window;
 
   private->parent = parent;
 
-  private->drawable.destroyed = FALSE;
-  private->mapped = FALSE;
-  private->guffaw_gravity = FALSE;
-  private->resize_count = 0;
-  private->drawable.ref_count = 1;
-
   private->x = (attributes_mask & GDK_WA_X) ? attributes->x : 0;
   private->y = (attributes_mask & GDK_WA_Y) ? attributes->y : 0;
 
   private->drawable.width = (attributes->width > 1) ? (attributes->width) : (1);
   private->drawable.height = (attributes->height > 1) ? (attributes->height) : (1);
   private->drawable.window_type = attributes->window_type;
-  private->extension_events = 0;
-  private->extension_events_selected = FALSE;
-
-  private->filters = NULL;
-  private->children = NULL;
-
-  window->user_data = NULL;
+  GDK_WINDOW_WIN32DATA (window)->extension_events_selected = FALSE;
 
   if (attributes_mask & GDK_WA_VISUAL)
     visual = attributes->visual;
@@ -308,11 +323,10 @@ gdk_window_new (GdkWindow     *parent,
     title = attributes->title;
   else
     title = g_get_prgname ();
+  if (!title)
+    title = "GDK client window";
 
-  private->event_mask = GDK_STRUCTURE_MASK | attributes->event_mask;
-  private->bg_type = GDK_WIN32_BG_NORMAL;
-  private->hint_flags = 0;
-  private->xcursor = NULL;
+  GDK_WINDOW_WIN32DATA (window)->event_mask = GDK_STRUCTURE_MASK | attributes->event_mask;
       
   if (parent_private && parent_private->guffaw_gravity)
     {
@@ -331,8 +345,8 @@ gdk_window_new (GdkWindow     *parent,
     {
       dwExStyle = WS_EX_TRANSPARENT;
       private->drawable.colormap = NULL;
-      private->bg_type = GDK_WIN32_BG_TRANSPARENT;
-      private->bg_pixmap = NULL;
+      GDK_WINDOW_WIN32DATA (window)->bg_type = GDK_WIN32_BG_TRANSPARENT;
+      GDK_WINDOW_WIN32DATA (window)->bg_pixmap = NULL;
     }
 
   if (attributes_mask & GDK_WA_X)
@@ -361,7 +375,9 @@ gdk_window_new (GdkWindow     *parent,
       break;
     case GDK_WINDOW_DIALOG:
       dwStyle = WS_OVERLAPPED | WS_MINIMIZEBOX | WS_SYSMENU | WS_CAPTION | WS_THICKFRAME | WS_CLIPCHILDREN;
+#if 0
       dwExStyle |= WS_EX_TOPMOST; /* //HB: want this? */
+#endif
       xparent = gdk_root_window;
       break;
     case GDK_WINDOW_TEMP:
@@ -377,8 +393,6 @@ gdk_window_new (GdkWindow     *parent,
     }
 
   klass = RegisterGdkClass (private->drawable.window_type);
-  if (!klass)
-    g_error ("RegisterClassEx failed");
 
   if (private->drawable.window_type != GDK_WINDOW_CHILD)
     {
@@ -396,8 +410,7 @@ gdk_window_new (GdkWindow     *parent,
       rect.right = rect.left + private->drawable.width;
       rect.bottom = rect.top + private->drawable.height;
 
-      if (!SafeAdjustWindowRectEx (&rect, dwStyle, FALSE, dwExStyle))
-       g_warning ("gdk_window_new: AdjustWindowRectEx failed");
+      SafeAdjustWindowRectEx (&rect, dwStyle, FALSE, dwExStyle);
 
       if (x != CW_USEDEFAULT)
        {
@@ -413,10 +426,18 @@ gdk_window_new (GdkWindow     *parent,
       height = private->drawable.height;
     }
 
-  private->drawable.xwindow =
+  titlelen = strlen (title);
+  wctitle = g_new (wchar_t, titlelen + 1);
+  mbtitle = g_new (char, 3*titlelen + 1);
+  wlen = gdk_nmbstowchar_ts (wctitle, title, titlelen, titlelen);
+  wctitle[wlen] = 0;
+  WideCharToMultiByte (GetACP (), 0, wctitle, -1,
+                      mbtitle, 3*titlelen, NULL, NULL);
+  
+  GDK_DRAWABLE_WIN32DATA (window)->xid =
     CreateWindowEx (dwExStyle,
                    MAKEINTRESOURCE(klass),
-                   title,
+                   mbtitle,
                    dwStyle,
                    x, y, 
                    width, height,
@@ -424,22 +445,35 @@ gdk_window_new (GdkWindow     *parent,
                    NULL,
                    gdk_ProgInstance,
                    NULL);
+
   GDK_NOTE (MISC,
-           g_print ("gdk_window_create: %s %s %#x %#x %dx%d@+%d+%d %#x = %#x\n",
+           g_print ("gdk_window_new: %s %s %dx%d@+%d+%d %#x = %#x\n"
+                    "...locale %#x codepage %d\n",
                     (private->drawable.window_type == GDK_WINDOW_TOPLEVEL ? "TOPLEVEL" :
                      (private->drawable.window_type == GDK_WINDOW_CHILD ? "CHILD" :
                       (private->drawable.window_type == GDK_WINDOW_DIALOG ? "DIALOG" :
                        (private->drawable.window_type == GDK_WINDOW_TEMP ? "TEMP" :
                         "???")))),
-                    title,
-                    dwStyle,
-                    private->event_mask,
+                    mbtitle,
                     width, height, (x == CW_USEDEFAULT ? -9999 : x), y, 
                     xparent,
-                    private->drawable.xwindow));
+                    GDK_DRAWABLE_XID (window),
+                    GDK_WINDOW_WIN32DATA (window)->input_locale,
+                    GDK_WINDOW_WIN32DATA (window)->charset_info.ciACP));
+
+  g_free (mbtitle);
+  g_free (wctitle);
 
-  gdk_window_ref (window);
-  gdk_xid_table_insert (&private->drawable.xwindow, window);
+  if (GDK_DRAWABLE_XID (window) == NULL)
+    {
+      WIN32_API_FAILED ("CreateWindowEx");
+      g_free (GDK_DRAWABLE_WIN32DATA (window));
+      g_free (private);
+      return NULL;
+    }
+
+  gdk_drawable_ref (window);
+  gdk_xid_table_insert (&GDK_DRAWABLE_XID (window), window);
 
   if (private->drawable.colormap)
     gdk_colormap_ref (private->drawable.colormap);
@@ -461,8 +495,8 @@ gdk_window_foreign_new (guint32 anid)
   RECT rect;
   POINT point;
 
-  private = g_new (GdkWindowPrivate, 1);
-  window = (GdkWindow*) private;
+  window = gdk_win32_window_alloc ();
+  private = (GdkWindowPrivate *)window;
 
   parent = GetParent ((HWND) anid);
   private->parent = gdk_xid_table_lookup (parent);
@@ -472,42 +506,32 @@ gdk_window_foreign_new (guint32 anid)
   if (parent_private)
     parent_private->children = g_list_prepend (parent_private->children, window);
 
-  private->drawable.xwindow = (HWND) anid;
+  GDK_DRAWABLE_WIN32DATA (window)->xid = (HWND) anid;
   GetClientRect ((HWND) anid, &rect);
   point.x = rect.left;
   point.y = rect.right;
   ClientToScreen ((HWND) anid, &point);
-  if (parent != HWND_DESKTOP)
+  if (parent != GetDesktopWindow ())
     ScreenToClient (parent, &point);
   private->x = point.x;
   private->y = point.y;
   private->drawable.width = rect.right - rect.left;
   private->drawable.height = rect.bottom - rect.top;
-  private->resize_count = 0;
-  private->drawable.ref_count = 1;
   private->drawable.window_type = GDK_WINDOW_FOREIGN;
   private->drawable.destroyed = FALSE;
-  private->mapped = IsWindowVisible (private->drawable.xwindow);
-  private->guffaw_gravity = FALSE;
-  private->extension_events = 0;
-  private->extension_events_selected = FALSE;
+  private->mapped = IsWindowVisible (GDK_DRAWABLE_XID (window));
 
   private->drawable.colormap = NULL;
 
-  private->filters = NULL;
-  private->children = NULL;
-
-  window->user_data = NULL;
-
-  gdk_window_ref (window);
-  gdk_xid_table_insert (&private->drawable.xwindow, window);
+  gdk_drawable_ref (window);
+  gdk_xid_table_insert (&GDK_DRAWABLE_XID (window), window);
 
   return window;
 }
 
 /* Call this function when you want a window and all its children to
- * disappear.  When xdestroy is true, a request to destroy the XWindow
- * is sent out.  When it is false, it is assumed that the XWindow has
+ * disappear.  When xdestroy is true, a request to destroy the window
+ * is sent out.  When it is false, it is assumed that the window has
  * been or will be destroyed by destroying some ancestor of this
  * window.
  */
@@ -524,12 +548,12 @@ gdk_window_internal_destroy (GdkWindow *window,
 
   g_return_if_fail (window != NULL);
 
-  private = (GdkWindowPrivate*) window;
+  private = (GdkWindowPrivate *) window;
 
   GDK_NOTE (MISC, g_print ("gdk_window_internal_destroy %#x\n",
-                          private->drawable.xwindow));
+                          GDK_DRAWABLE_XID (window)));
 
-  switch (private->drawable.window_type)
+  switch (GDK_DRAWABLE_TYPE (window))
     {
     case GDK_WINDOW_TOPLEVEL:
     case GDK_WINDOW_CHILD:
@@ -597,11 +621,11 @@ gdk_window_internal_destroy (GdkWindow *window,
                   * OTOH, I don't think foreign windows are much
                   * used, so the question is maybe academic.
                   */
-                 PostMessage (private->drawable.xwindow, WM_QUIT, 0, 0);
+                 PostMessage (GDK_DRAWABLE_XID (window), WM_QUIT, 0, 0);
                }
            }
          else if (xdestroy)
-           DestroyWindow (private->drawable.xwindow);
+           DestroyWindow (GDK_DRAWABLE_XID (window));
 
          if (private->drawable.colormap)
            gdk_colormap_unref (private->drawable.colormap);
@@ -616,7 +640,7 @@ gdk_window_internal_destroy (GdkWindow *window,
       break;
 
     case GDK_DRAWABLE_PIXMAP:
-      g_error ("called gdk_window_destroy on a pixmap (use gdk_pixmap_unref)");
+      g_error ("called gdk_window_destroy on a pixmap (use gdk_drawable_unref)");
       break;
     }
 }
@@ -628,107 +652,63 @@ void
 gdk_window_destroy (GdkWindow *window)
 {
   gdk_window_internal_destroy (window, TRUE, TRUE);
-  gdk_window_unref (window);
+  gdk_drawable_unref (window);
 }
 
-/* This function is called when the XWindow is really gone.  */
+/* This function is called when the window really gone.  */
 
 void
 gdk_window_destroy_notify (GdkWindow *window)
 {
   g_return_if_fail (window != NULL);
 
-  GDK_NOTE (EVENTS, g_print ("gdk_window_destroy_notify: %#x  %d\n",
-                            GDK_DRAWABLE_XID (window), GDK_DRAWABLE_DESTROYED (window)));
+  GDK_NOTE (EVENTS,
+           g_print ("gdk_window_destroy_notify: %#x  %s\n",
+                    GDK_DRAWABLE_XID (window),
+                    (GDK_DRAWABLE_DESTROYED (window) ? "yes" : "no")));
 
   if (!GDK_DRAWABLE_DESTROYED (window))
     {
       if (GDK_DRAWABLE_TYPE(window) != GDK_WINDOW_FOREIGN)
-       g_warning ("GdkWindow %#lx unexpectedly destroyed", GDK_DRAWABLE_XID (window));
+       g_warning ("window %#x unexpectedly destroyed",
+                  GDK_DRAWABLE_XID (window));
 
       gdk_window_internal_destroy (window, FALSE, FALSE);
     }
   
   gdk_xid_table_remove (GDK_DRAWABLE_XID (window));
-  gdk_window_unref (window);
-}
-
-GdkWindow*
-gdk_window_ref (GdkWindow *window)
-{
-  GdkWindowPrivate *private = (GdkWindowPrivate *)window;
-  g_return_val_if_fail (window != NULL, NULL);
-  
-  private->drawable.ref_count += 1;
-
-  GDK_NOTE (MISC, g_print ("gdk_window_ref %#x %d\n",
-                          GDK_DRAWABLE_XID (window),
-                          private->drawable.ref_count));
-
-  return window;
-}
-
-void
-gdk_window_unref (GdkWindow *window)
-{
-  GdkWindowPrivate *private = (GdkWindowPrivate *)window;
-  g_return_if_fail (window != NULL);
-
-  private->drawable.ref_count -= 1;
-
-  GDK_NOTE (MISC, g_print ("gdk_window_unref %#x %d%s\n",
-                          private->drawable.xwindow,
-                          private->drawable.ref_count,
-                          (private->drawable.ref_count == 0 ? " freeing" : "")));
-
-  if (private->drawable.ref_count == 0)
-    {
-      if (private->bg_type == GDK_WIN32_BG_PIXMAP
-         && private->bg_pixmap != NULL)
-       gdk_pixmap_unref (private->bg_pixmap);
-
-      if (!private->drawable.destroyed)
-       {
-         if (private->drawable.window_type == GDK_WINDOW_FOREIGN)
-           gdk_xid_table_remove (private->drawable.xwindow);
-         else
-           g_warning ("losing last reference to undestroyed window");
-       }
-      g_dataset_destroy (window);
-      g_free (window);
-    }
+  gdk_drawable_unref (window);
 }
 
 void
 gdk_window_show (GdkWindow *window)
 {
-  GdkWindowPrivate *private;
-
   g_return_if_fail (window != NULL);
 
-  private = (GdkWindowPrivate*) window;
-  if (!private->drawable.destroyed)
+  if (!GDK_DRAWABLE_DESTROYED (window))
     {
       GDK_NOTE (MISC, g_print ("gdk_window_show: %#x\n",
-                              private->drawable.xwindow));
+                              GDK_DRAWABLE_XID (window)));
 
-      private->mapped = TRUE;
-      if (private->drawable.window_type == GDK_WINDOW_TEMP)
+      ((GdkWindowPrivate *) window)->mapped = TRUE;
+      if (GDK_DRAWABLE_TYPE (window) == GDK_WINDOW_TEMP)
        {
-         ShowWindow (private->drawable.xwindow, SW_SHOWNOACTIVATE);
-         SetWindowPos (private->drawable.xwindow, HWND_TOPMOST, 0, 0, 0, 0,
+         ShowWindow (GDK_DRAWABLE_XID (window), SW_SHOWNOACTIVATE);
+         SetWindowPos (GDK_DRAWABLE_XID (window), HWND_TOPMOST, 0, 0, 0, 0,
                        SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE);
 #if 0
-         ShowWindow (private->drawable.xwindow, SW_HIDE); /* Don't put on toolbar */
+         /* Don't put on toolbar */
+         ShowWindow (GDK_DRAWABLE_XID (window), SW_HIDE);
 #endif
        }
       else
        {
-         ShowWindow (private->drawable.xwindow, SW_SHOWNORMAL);
-         ShowWindow (private->drawable.xwindow, SW_RESTORE);
-         SetForegroundWindow (private->drawable.xwindow);
+         ShowWindow (GDK_DRAWABLE_XID (window), SW_SHOWNORMAL);
+         ShowWindow (GDK_DRAWABLE_XID (window), SW_RESTORE);
+         SetForegroundWindow (GDK_DRAWABLE_XID (window));
+         BringWindowToTop (GDK_DRAWABLE_XID (window));
 #if 0
-         ShowOwnedPopups (private->drawable.xwindow, TRUE);
+         ShowOwnedPopups (GDK_DRAWABLE_XID (window), TRUE);
 #endif
        }
     }
@@ -737,25 +717,22 @@ gdk_window_show (GdkWindow *window)
 void
 gdk_window_hide (GdkWindow *window)
 {
-  GdkWindowPrivate *private;
-
   g_return_if_fail (window != NULL);
 
-  private = (GdkWindowPrivate*) window;
-  if (!private->drawable.destroyed)
+  if (!GDK_DRAWABLE_DESTROYED (window))
     {
       GDK_NOTE (MISC, g_print ("gdk_window_hide: %#x\n",
-                              private->drawable.xwindow));
+                              GDK_DRAWABLE_XID (window)));
 
-      private->mapped = FALSE;
-      if (private->drawable.window_type == GDK_WINDOW_TOPLEVEL)
-       ShowOwnedPopups (private->drawable.xwindow, FALSE);
+      ((GdkWindowPrivate *) window)->mapped = FALSE;
+      if (GDK_DRAWABLE_TYPE (window) == GDK_WINDOW_TOPLEVEL)
+       ShowOwnedPopups (GDK_DRAWABLE_XID (window), FALSE);
 #if 1
-      ShowWindow (private->drawable.xwindow, SW_HIDE);
+      ShowWindow (GDK_DRAWABLE_XID (window), SW_HIDE);
 #elif 0
-      ShowWindow (private->drawable.xwindow, SW_MINIMIZE);
+      ShowWindow (GDK_DRAWABLE_XID (window), SW_MINIMIZE);
 #else
-      CloseWindow (private->drawable.xwindow);
+      CloseWindow (GDK_DRAWABLE_XID (window));
 #endif
     }
 }
@@ -763,15 +740,12 @@ gdk_window_hide (GdkWindow *window)
 void
 gdk_window_withdraw (GdkWindow *window)
 {
-  GdkWindowPrivate *private;
-
   g_return_if_fail (window != NULL);
 
-  private = (GdkWindowPrivate*) window;
-  if (!private->drawable.destroyed)
+  if (!GDK_DRAWABLE_DESTROYED (window))
     {
       GDK_NOTE (MISC, g_print ("gdk_window_withdraw: %#x\n",
-                              private->drawable.xwindow));
+                              GDK_DRAWABLE_XID (window)));
 
       gdk_window_hide (window);        /* XXX */
     }
@@ -786,17 +760,17 @@ gdk_window_move (GdkWindow *window,
 
   g_return_if_fail (window != NULL);
 
-  private = (GdkWindowPrivate*) window;
-  if (!private->drawable.destroyed)
+  if (!GDK_DRAWABLE_DESTROYED (window))
     {
       RECT rect;
 
       GDK_NOTE (MISC, g_print ("gdk_window_move: %#x +%d+%d\n",
-                              private->drawable.xwindow, x, y));
+                              GDK_DRAWABLE_XID (window), x, y));
 
-      GetClientRect (private->drawable.xwindow, &rect);
+      private = (GdkWindowPrivate *) window;
+      GetClientRect (GDK_DRAWABLE_XID (window), &rect);
 
-      if (private->drawable.window_type != GDK_WINDOW_CHILD)
+      if (GDK_DRAWABLE_TYPE (window) != GDK_WINDOW_CHILD)
        {
          POINT ptTL, ptBR;
          DWORD dwStyle;
@@ -804,20 +778,19 @@ gdk_window_move (GdkWindow *window,
 
          ptTL.x = 0;
          ptTL.y = 0; 
-         ClientToScreen (private->drawable.xwindow, &ptTL);
+         ClientToScreen (GDK_DRAWABLE_XID (window), &ptTL);
          rect.left = x;
          rect.top = y;
 
          ptBR.x = rect.right;
          ptBR.y = rect.bottom;
-         ClientToScreen (private->drawable.xwindow, &ptBR);
+         ClientToScreen (GDK_DRAWABLE_XID (window), &ptBR);
          rect.right = x + ptBR.x - ptTL.x;
          rect.bottom = y + ptBR.y - ptTL.y;
 
-         dwStyle = GetWindowLong (private->drawable.xwindow, GWL_STYLE);
-         dwExStyle = GetWindowLong (private->drawable.xwindow, GWL_EXSTYLE);
-         if (!SafeAdjustWindowRectEx (&rect, dwStyle, FALSE, dwExStyle))
-           g_warning ("gdk_window_move: AdjustWindowRectEx failed");
+         dwStyle = GetWindowLong (GDK_DRAWABLE_XID (window), GWL_STYLE);
+         dwExStyle = GetWindowLong (GDK_DRAWABLE_XID (window), GWL_EXSTYLE);
+         SafeAdjustWindowRectEx (&rect, dwStyle, FALSE, dwExStyle);
 
          x = rect.left;
          y = rect.top;
@@ -828,13 +801,13 @@ gdk_window_move (GdkWindow *window,
          private->y = y;
        }
       GDK_NOTE (MISC, g_print ("...MoveWindow(%#x,%dx%d@+%d+%d)\n",
-                              private->drawable.xwindow,
+                              GDK_DRAWABLE_XID (window),
                               rect.right - rect.left, rect.bottom - rect.top,
                               x, y));
-      if (!MoveWindow (private->drawable.xwindow,
+      if (!MoveWindow (GDK_DRAWABLE_XID (window),
                       x, y, rect.right - rect.left, rect.bottom - rect.top,
                       TRUE))
-       g_warning ("gdk_window_move: MoveWindow failed");
+       WIN32_API_FAILED ("MoveWindow");
     }
 }
 
@@ -862,7 +835,7 @@ gdk_window_resize (GdkWindow *window,
       int x, y;
 
       GDK_NOTE (MISC, g_print ("gdk_window_resize: %#x %dx%d\n",
-                              private->drawable.xwindow, width, height));
+                              GDK_DRAWABLE_XID (window), width, height));
       
       if (private->drawable.window_type != GDK_WINDOW_CHILD)
        {
@@ -873,16 +846,16 @@ gdk_window_resize (GdkWindow *window,
 
          pt.x = 0;
          pt.y = 0; 
-         ClientToScreen (private->drawable.xwindow, &pt);
+         ClientToScreen (GDK_DRAWABLE_XID (window), &pt);
          rect.left = pt.x;
          rect.top = pt.y;
          rect.right = pt.x + width;
          rect.bottom = pt.y + height;
 
-         dwStyle = GetWindowLong (private->drawable.xwindow, GWL_STYLE);
-         dwExStyle = GetWindowLong (private->drawable.xwindow, GWL_EXSTYLE);
+         dwStyle = GetWindowLong (GDK_DRAWABLE_XID (window), GWL_STYLE);
+         dwExStyle = GetWindowLong (GDK_DRAWABLE_XID (window), GWL_EXSTYLE);
          if (!AdjustWindowRectEx (&rect, dwStyle, FALSE, dwExStyle))
-           g_warning ("gdk_window_resize: AdjustWindowRectEx failed");
+           WIN32_API_FAILED ("AdjustWindowRectEx");
 
          x = rect.left;
          y = rect.top;
@@ -899,12 +872,13 @@ gdk_window_resize (GdkWindow *window,
 
       private->resize_count += 1;
 
-      GDK_NOTE (MISC, g_print ("...MoveWindow(%#x,%dx%d@+%d+%d)\n",
-                              private->drawable.xwindow, width, height, x, y));
-      if (!MoveWindow (private->drawable.xwindow,
+      GDK_NOTE (MISC,
+               g_print ("...MoveWindow(%#x,%dx%d@+%d+%d)\n",
+                        GDK_DRAWABLE_XID (window), width, height, x, y));
+      if (!MoveWindow (GDK_DRAWABLE_XID (window),
                       x, y, width, height,
                       TRUE))
-       g_warning ("gdk_window_resize: MoveWindow failed");
+       WIN32_API_FAILED ("MoveWindow");
     }
 }
 
@@ -924,25 +898,25 @@ gdk_window_move_resize (GdkWindow *window,
   if ((gint16) height < 1)
     height = 1;
 
-  private = (GdkWindowPrivate*) window;
-  if (!private->drawable.destroyed)
+  if (!GDK_DRAWABLE_DESTROYED (window))
     {
       RECT rect;
       DWORD dwStyle;
       DWORD dwExStyle;
 
       GDK_NOTE (MISC, g_print ("gdk_window_move_resize: %#x %dx%d@+%d+%d\n",
-                              private->drawable.xwindow, width, height, x, y));
+                              GDK_DRAWABLE_XID (window), width, height, x, y));
       
+      private = (GdkWindowPrivate*) window;
       rect.left = x;
       rect.top = y;
       rect.right = x + width;
       rect.bottom = y + height;
 
-      dwStyle = GetWindowLong (private->drawable.xwindow, GWL_STYLE);
-      dwExStyle = GetWindowLong (private->drawable.xwindow, GWL_EXSTYLE);
+      dwStyle = GetWindowLong (GDK_DRAWABLE_XID (window), GWL_STYLE);
+      dwExStyle = GetWindowLong (GDK_DRAWABLE_XID (window), GWL_EXSTYLE);
       if (!AdjustWindowRectEx (&rect, dwStyle, FALSE, dwExStyle))
-       g_warning ("gdk_window_move_resize: AdjustWindowRectEx failed");
+       WIN32_API_FAILED ("AdjustWindowRectEx");
 
       if (private->drawable.window_type == GDK_WINDOW_CHILD)
        {
@@ -952,14 +926,14 @@ gdk_window_move_resize (GdkWindow *window,
          private->drawable.height = height;
        }
       GDK_NOTE (MISC, g_print ("...MoveWindow(%#x,%dx%d@+%d+%d)\n",
-                              private->drawable.xwindow,
+                              GDK_DRAWABLE_XID (window),
                               rect.right - rect.left, rect.bottom - rect.top,
                               rect.left, rect.top));
-      if (!MoveWindow (private->drawable.xwindow,
+      if (!MoveWindow (GDK_DRAWABLE_XID (window),
                       rect.left, rect.top,
                       rect.right - rect.left, rect.bottom - rect.top,
                       TRUE))
-       g_warning ("gdk_window_move_resize: MoveWindow failed");
+       WIN32_API_FAILED ("MoveWindow");
 
       if (private->guffaw_gravity)
        {
@@ -991,31 +965,35 @@ gdk_window_reparent (GdkWindow *window,
   g_return_if_fail (window != NULL);
 
   if (!new_parent)
-    new_parent = (GdkWindow*) &gdk_root_parent;
+    new_parent = gdk_parent_root;
 
   window_private = (GdkWindowPrivate*) window;
-  old_parent_private = (GdkWindowPrivate*)window_private->parent;
+  old_parent_private = (GdkWindowPrivate *) window_private->parent;
   parent_private = (GdkWindowPrivate*) new_parent;
 
-  if (!window_private->drawable.destroyed && !parent_private->drawable.destroyed)
+  if (!GDK_DRAWABLE_DESTROYED (window)
+      && !GDK_DRAWABLE_DESTROYED (new_parent))
     {
       GDK_NOTE (MISC, g_print ("gdk_window_reparent: %#x %#x\n",
-                              window_private->drawable.xwindow,
-                              parent_private->drawable.xwindow));
-      if (!SetParent (window_private->drawable.xwindow, parent_private->drawable.xwindow))
-       g_warning ("gdk_window_reparent: SetParent failed");
+                              GDK_DRAWABLE_XID (window),
+                              GDK_DRAWABLE_XID (new_parent)));
+      if (!SetParent (GDK_DRAWABLE_XID (window),
+                     GDK_DRAWABLE_XID (new_parent)))
+       WIN32_API_FAILED ("SetParent");
 
-      if (!MoveWindow (window_private->drawable.xwindow,
+      if (!MoveWindow (GDK_DRAWABLE_XID (window),
                       x, y,
-                      window_private->drawable.width, window_private->drawable.height,
+                      window_private->drawable.width,
+                      window_private->drawable.height,
                       TRUE))
-       g_warning ("gdk_window_reparent: MoveWindow failed");
+       WIN32_API_FAILED ("MoveWindow");
     }
   
   window_private->parent = new_parent;
 
   if (old_parent_private)
-    old_parent_private->children = g_list_remove (old_parent_private->children, window);
+    old_parent_private->children =
+      g_list_remove (old_parent_private->children, window);
 
   if ((old_parent_private &&
        (!old_parent_private->guffaw_gravity != !parent_private->guffaw_gravity)) ||
@@ -1032,16 +1010,16 @@ gdk_window_clear (GdkWindow *window)
   g_return_if_fail (GDK_IS_WINDOW (window));
 
   if (!GDK_DRAWABLE_DESTROYED (window))
-    gdk_window_clear_area (window, 0, 0, -1, -1);
+    gdk_window_clear_area (window, 0, 0, 0, 0);
 }
 
 
 void
-gdk_window_clear_area (GdkWindow *window,
-                      gint       x,
-                      gint       y,
-                      gint       width,
-                      gint       height)
+_gdk_windowing_window_clear_area (GdkWindow *window,
+                                 gint       x,
+                                 gint       y,
+                                 gint       width,
+                                 gint       height)
 {
   g_return_if_fail (window != NULL);
   g_return_if_fail (GDK_IS_WINDOW (window));
@@ -1050,25 +1028,26 @@ gdk_window_clear_area (GdkWindow *window,
     {
       HDC hdc;
 
-      if (width == -1)
-       width = G_MAXSHORT/2;           /* Yeah, right */
-      if (height == -1)
-       height = G_MAXSHORT/2;
-      GDK_NOTE (MISC, g_print ("gdk_window_clear_area: %#x %dx%d@+%d+%d\n",
+      if (width == 0)
+       width = ((GdkDrawablePrivate *) window)->width - x;
+      if (height == 0)
+       height = ((GdkDrawablePrivate *) window)->height - y;
+      GDK_NOTE (MISC, g_print ("_gdk_windowing_window_clear_area: "
+                              "%#x %dx%d@+%d+%d\n",
                               GDK_DRAWABLE_XID (window), width, height, x, y));
       hdc = GetDC (GDK_DRAWABLE_XID (window));
-      IntersectClipRect (hdc, x, y, x + width, y + height);
+      IntersectClipRect (hdc, x, y, x + width + 1, y + height + 1);
       SendMessage (GDK_DRAWABLE_XID (window), WM_ERASEBKGND, (WPARAM) hdc, 0);
       ReleaseDC (GDK_DRAWABLE_XID (window), hdc);
     }
 }
 
 void
-gdk_window_clear_area_e (GdkWindow *window,
-                        gint       x,
-                        gint       y,
-                        gint       width,
-                        gint       height)
+_gdk_windowing_window_clear_area_e (GdkWindow *window,
+                                   gint       x,
+                                   gint       y,
+                                   gint       width,
+                                   gint       height)
 {
   g_return_if_fail (window != NULL);
   g_return_if_fail (GDK_IS_WINDOW (window));
@@ -1077,15 +1056,16 @@ gdk_window_clear_area_e (GdkWindow *window,
     {
       RECT rect;
 
-      GDK_NOTE (MISC, g_print ("gdk_window_clear_area_e: %#x %dx%d@+%d+%d\n",
+      GDK_NOTE (MISC, g_print ("_gdk_windowing_window_clear_area_e: "
+                              "%#x %dx%d@+%d+%d\n",
                               GDK_DRAWABLE_XID (window), width, height, x, y));
 
       rect.left = x;
-      rect.right = x + width;
+      rect.right = x + width + 1;
       rect.top = y;
-      rect.bottom = y + height;
+      rect.bottom = y + height + 1;
       if (!InvalidateRect (GDK_DRAWABLE_XID (window), &rect, TRUE))
-       g_warning ("gdk_window_clear_area_e: InvalidateRect failed");
+       WIN32_GDI_FAILED ("InvalidateRect");
       UpdateWindow (GDK_DRAWABLE_XID (window));
     }
 }
@@ -1102,7 +1082,7 @@ gdk_window_raise (GdkWindow *window)
                               GDK_DRAWABLE_XID (window)));
 
       if (!BringWindowToTop (GDK_DRAWABLE_XID (window)))
-       g_warning ("gdk_window_raise: BringWindowToTop failed");
+       WIN32_API_FAILED ("BringWindowToTop");
     }
 }
 
@@ -1119,19 +1099,10 @@ gdk_window_lower (GdkWindow *window)
 
       if (!SetWindowPos (GDK_DRAWABLE_XID (window), HWND_BOTTOM, 0, 0, 0, 0,
                         SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE))
-       g_warning ("gdk_window_lower: SetWindowPos failed");
+       WIN32_API_FAILED ("SetWindowPos");
     }
 }
 
-void
-gdk_window_set_user_data (GdkWindow *window,
-                         gpointer   user_data)
-{
-  g_return_if_fail (window != NULL);
-  
-  window->user_data = user_data;
-}
-
 void
 gdk_window_set_hints (GdkWindow *window,
                      gint       x,
@@ -1142,7 +1113,6 @@ gdk_window_set_hints (GdkWindow *window,
                      gint       max_height,
                      gint       flags)
 {
-  GdkWindowPrivate *private;
   WINDOWPLACEMENT size_hints;
   RECT rect;
   DWORD dwStyle;
@@ -1155,21 +1125,19 @@ gdk_window_set_hints (GdkWindow *window,
   if (GDK_DRAWABLE_DESTROYED (window))
     return;
   
-  private = (GdkWindowPrivate*) window;
-
   GDK_NOTE (MISC, g_print ("gdk_window_set_hints: %#x %dx%d..%dx%d @+%d+%d\n",
-                          private->drawable.xwindow,
+                          GDK_DRAWABLE_XID (window),
                           min_width, min_height, max_width, max_height,
                           x, y));
 
-  private->hint_flags = flags;
+  GDK_WINDOW_WIN32DATA (window)->hint_flags = flags;
   size_hints.length = sizeof (size_hints);
 
   if (flags)
     {
       if (flags & GDK_HINT_POS)
-       if (!GetWindowPlacement (private->drawable.xwindow, &size_hints))
-         g_warning ("gdk_window_set_hints: GetWindowPlacement failed");
+       if (!GetWindowPlacement (GDK_DRAWABLE_XID (window), &size_hints))
+         WIN32_API_FAILED ("GetWindowPlacement");
        else
          {
            GDK_NOTE (MISC, g_print ("...rcNormalPosition:"
@@ -1185,8 +1153,8 @@ gdk_window_set_hints (GdkWindow *window,
            rect.top = y;
            rect.right = rect.left + 200;       /* dummy */
            rect.bottom = rect.top + 200;
-           dwStyle = GetWindowLong (private->drawable.xwindow, GWL_STYLE);
-           dwExStyle = GetWindowLong (private->drawable.xwindow, GWL_EXSTYLE);
+           dwStyle = GetWindowLong (GDK_DRAWABLE_XID (window), GWL_STYLE);
+           dwExStyle = GetWindowLong (GDK_DRAWABLE_XID (window), GWL_EXSTYLE);
            AdjustWindowRectEx (&rect, dwStyle, FALSE, dwExStyle);
            size_hints.flags = 0;
            size_hints.showCmd = SW_SHOWNA;
@@ -1205,10 +1173,10 @@ gdk_window_set_hints (GdkWindow *window,
                                     size_hints.rcNormalPosition.top,
                                     size_hints.rcNormalPosition.right,
                                     size_hints.rcNormalPosition.bottom));
-           if (!SetWindowPlacement (private->drawable.xwindow, &size_hints))
-             g_warning ("gdk_window_set_hints: SetWindowPlacement failed");
-           private->hint_x = rect.left;
-           private->hint_y = rect.top;
+           if (!SetWindowPlacement (GDK_DRAWABLE_XID (window), &size_hints))
+             WIN32_API_FAILED ("SetWindowPlacement");
+           GDK_WINDOW_WIN32DATA (window)->hint_x = rect.left;
+           GDK_WINDOW_WIN32DATA (window)->hint_y = rect.top;
          }
 
       if (flags & GDK_HINT_MIN_SIZE)
@@ -1217,14 +1185,16 @@ gdk_window_set_hints (GdkWindow *window,
          rect.top = 0;
          rect.right = min_width;
          rect.bottom = min_height;
-         dwStyle = GetWindowLong (private->drawable.xwindow, GWL_STYLE);
-         dwExStyle = GetWindowLong (private->drawable.xwindow, GWL_EXSTYLE);
+         dwStyle = GetWindowLong (GDK_DRAWABLE_XID (window), GWL_STYLE);
+         dwExStyle = GetWindowLong (GDK_DRAWABLE_XID (window), GWL_EXSTYLE);
          AdjustWindowRectEx (&rect, dwStyle, FALSE, dwExStyle);
-         private->hint_min_width = rect.right - rect.left;
-         private->hint_min_height = rect.bottom - rect.top;
+         GDK_WINDOW_WIN32DATA (window)->hint_min_width =
+           rect.right - rect.left;
+         GDK_WINDOW_WIN32DATA (window)->hint_min_height =
+           rect.bottom - rect.top;
 
          /* Also chek if he current size of the window is in bounds. */
-         GetClientRect (private->drawable.xwindow, &rect);
+         GetClientRect (GDK_DRAWABLE_XID (window), &rect);
          if (rect.right < min_width && rect.bottom < min_height)
            gdk_window_resize (window, min_width, min_height);
          else if (rect.right < min_width)
@@ -1232,19 +1202,22 @@ gdk_window_set_hints (GdkWindow *window,
          else if (rect.bottom < min_height)
            gdk_window_resize (window, rect.right, min_height);
        }
+
       if (flags & GDK_HINT_MAX_SIZE)
        {
          rect.left = 0;
          rect.top = 0;
          rect.right = max_width;
          rect.bottom = max_height;
-         dwStyle = GetWindowLong (private->drawable.xwindow, GWL_STYLE);
-         dwExStyle = GetWindowLong (private->drawable.xwindow, GWL_EXSTYLE);
+         dwStyle = GetWindowLong (GDK_DRAWABLE_XID (window), GWL_STYLE);
+         dwExStyle = GetWindowLong (GDK_DRAWABLE_XID (window), GWL_EXSTYLE);
          AdjustWindowRectEx (&rect, dwStyle, FALSE, dwExStyle);
-         private->hint_max_width = rect.right - rect.left;
-         private->hint_max_height = rect.bottom - rect.top;
+         GDK_WINDOW_WIN32DATA (window)->hint_max_width =
+           rect.right - rect.left;
+         GDK_WINDOW_WIN32DATA (window)->hint_max_height =
+           rect.bottom - rect.top;
          /* Again, check if the window is too large currently. */
-         GetClientRect (private->drawable.xwindow, &rect);
+         GetClientRect (GDK_DRAWABLE_XID (window), &rect);
          if (rect.right > max_width && rect.bottom > max_height)
            gdk_window_resize (window, max_width, max_height);
          else if (rect.right > max_width)
@@ -1260,7 +1233,6 @@ gdk_window_set_geometry_hints (GdkWindow      *window,
                               GdkGeometry    *geometry,
                               GdkWindowHints  geom_mask)
 {
-  GdkWindowPrivate *private;
   WINDOWPLACEMENT size_hints;
   RECT rect;
   DWORD dwStyle;
@@ -1273,11 +1245,9 @@ gdk_window_set_geometry_hints (GdkWindow      *window,
   if (GDK_DRAWABLE_DESTROYED (window))
     return;
 
-  private = (GdkWindowPrivate*) window;
-  
   size_hints.length = sizeof (size_hints);
 
-  private->hint_flags = geom_mask;
+  GDK_WINDOW_WIN32DATA (window)->hint_flags = geom_mask;
 
   if (geom_mask & GDK_HINT_POS)
     ; /* XXX */
@@ -1288,14 +1258,14 @@ gdk_window_set_geometry_hints (GdkWindow      *window,
       rect.top = 0;
       rect.right = geometry->min_width;
       rect.bottom = geometry->min_height;
-      dwStyle = GetWindowLong (private->drawable.xwindow, GWL_STYLE);
-      dwExStyle = GetWindowLong (private->drawable.xwindow, GWL_EXSTYLE);
+      dwStyle = GetWindowLong (GDK_DRAWABLE_XID (window), GWL_STYLE);
+      dwExStyle = GetWindowLong (GDK_DRAWABLE_XID (window), GWL_EXSTYLE);
       AdjustWindowRectEx (&rect, dwStyle, FALSE, dwExStyle);
-      private->hint_min_width = rect.right - rect.left;
-      private->hint_min_height = rect.bottom - rect.top;
+      GDK_WINDOW_WIN32DATA (window)->hint_min_width = rect.right - rect.left;
+      GDK_WINDOW_WIN32DATA (window)->hint_min_height = rect.bottom - rect.top;
 
       /* Also check if he current size of the window is in bounds */
-      GetClientRect (private->drawable.xwindow, &rect);
+      GetClientRect (GDK_DRAWABLE_XID (window), &rect);
       if (rect.right < geometry->min_width
          && rect.bottom < geometry->min_height)
        gdk_window_resize (window, geometry->min_width, geometry->min_height);
@@ -1311,14 +1281,14 @@ gdk_window_set_geometry_hints (GdkWindow      *window,
       rect.top = 0;
       rect.right = geometry->max_width;
       rect.bottom = geometry->max_height;
-      dwStyle = GetWindowLong (private->drawable.xwindow, GWL_STYLE);
-      dwExStyle = GetWindowLong (private->drawable.xwindow, GWL_EXSTYLE);
+      dwStyle = GetWindowLong (GDK_DRAWABLE_XID (window), GWL_STYLE);
+      dwExStyle = GetWindowLong (GDK_DRAWABLE_XID (window), GWL_EXSTYLE);
       AdjustWindowRectEx (&rect, dwStyle, FALSE, dwExStyle);
-      private->hint_max_width = rect.right - rect.left;
-      private->hint_max_height = rect.bottom - rect.top;
+      GDK_WINDOW_WIN32DATA (window)->hint_max_width = rect.right - rect.left;
+      GDK_WINDOW_WIN32DATA (window)->hint_max_height = rect.bottom - rect.top;
 
       /* Again, check if the window is too large currently. */
-      GetClientRect (private->drawable.xwindow, &rect);
+      GetClientRect (GDK_DRAWABLE_XID (window), &rect);
       if (rect.right > geometry->max_width
          && rect.bottom > geometry->max_height)
        gdk_window_resize (window, geometry->max_width, geometry->max_height);
@@ -1332,8 +1302,8 @@ gdk_window_set_geometry_hints (GdkWindow      *window,
   if (geom_mask & GDK_HINT_BASE_SIZE
       && geometry->base_width > 0
       && geometry->base_height > 0)
-    if (!GetWindowPlacement (private->drawable.xwindow, &size_hints))
-      g_warning ("gdk_window_set_hints: GetWindowPlacement failed");
+    if (!GetWindowPlacement (GDK_DRAWABLE_XID (window), &size_hints))
+      WIN32_API_FAILED ("GetWindowPlacement");
     else
       {
        GDK_NOTE (MISC, g_print ("gdk_window_set_geometry_hints:"
@@ -1351,8 +1321,8 @@ gdk_window_set_geometry_hints (GdkWindow      *window,
                                 size_hints.rcNormalPosition.top,
                                 size_hints.rcNormalPosition.right,
                                 size_hints.rcNormalPosition.bottom));
-       if (!SetWindowPlacement (private->drawable.xwindow, &size_hints))
-         g_warning ("gdk_window_set_hints: SetWindowPlacement failed");
+       if (!SetWindowPlacement (GDK_DRAWABLE_XID (window), &size_hints))
+         WIN32_API_FAILED ("SetWindowPlacement");
       }
   
   if (geom_mask & GDK_HINT_RESIZE_INC)
@@ -1370,15 +1340,36 @@ void
 gdk_window_set_title (GdkWindow   *window,
                      const gchar *title)
 {
+  gint titlelen;
+  wchar_t *wcstr;
+  gint wlen;
+  char *mbstr;
+
   g_return_if_fail (window != NULL);
   g_return_if_fail (GDK_IS_WINDOW (window));
+  g_return_if_fail (title != NULL);
+  g_return_if_fail (strlen (title) > 0);
   
   GDK_NOTE (MISC, g_print ("gdk_window_set_title: %#x %s\n",
                           GDK_DRAWABLE_XID (window), title));
   if (!GDK_DRAWABLE_DESTROYED (window))
     {
-      if (!SetWindowText (GDK_DRAWABLE_XID (window), title))
-       g_warning ("gdk_window_set_title: SetWindowText failed");
+      /* As the title is in UTF-8 we must translate it
+       * to the system codepage.
+       */
+      titlelen = strlen (title);
+      wcstr = g_new (wchar_t, titlelen + 1);
+      mbstr = g_new (char, 3*titlelen + 1);
+      wlen = gdk_nmbstowchar_ts (wcstr, title, titlelen, titlelen);
+      wcstr[wlen] = 0;
+      WideCharToMultiByte (GetACP (), 0, wcstr, -1,
+                          mbstr, 3*titlelen, NULL, NULL);
+
+      if (!SetWindowText (GDK_DRAWABLE_XID (window), mbstr))
+       WIN32_API_FAILED ("SetWindowText");
+
+      g_free (mbstr);
+      g_free (wcstr);
     }
 }
 
@@ -1411,29 +1402,26 @@ void
 gdk_window_set_background (GdkWindow *window,
                           GdkColor  *color)
 {
-  GdkWindowPrivate *private;
-  
   g_return_if_fail (window != NULL);
   g_return_if_fail (GDK_IS_WINDOW (window));
   
-  private = (GdkWindowPrivate*) window;
   if (!GDK_DRAWABLE_DESTROYED (window))
     {
       GDK_NOTE (MISC, g_print ("gdk_window_set_background: %#x %s\n",
-                              private->drawable.xwindow
+                              GDK_DRAWABLE_XID (window)
                               gdk_color_to_string (color)));
 
-      if (private->bg_type == GDK_WIN32_BG_PIXMAP)
+      if (GDK_WINDOW_WIN32DATA (window)->bg_type == GDK_WIN32_BG_PIXMAP)
        {
-         if (private->bg_pixmap != NULL)
+         if (GDK_WINDOW_WIN32DATA (window)->bg_pixmap != NULL)
            {
-             gdk_pixmap_unref (private->bg_pixmap);
-             private->bg_pixmap = NULL;
+             gdk_drawable_unref (GDK_WINDOW_WIN32DATA (window)->bg_pixmap);
+             GDK_WINDOW_WIN32DATA (window)->bg_pixmap = NULL;
            }
-         private->bg_type = GDK_WIN32_BG_NORMAL;
+         GDK_WINDOW_WIN32DATA (window)->bg_type = GDK_WIN32_BG_NORMAL;
        }
-      private->bg_type = GDK_WIN32_BG_PIXEL;
-      private->bg_pixel = *color;
+      GDK_WINDOW_WIN32DATA (window)->bg_type = GDK_WIN32_BG_PIXEL;
+      GDK_WINDOW_WIN32DATA (window)->bg_pixel = color->pixel;
     }
 }
 
@@ -1442,27 +1430,24 @@ gdk_window_set_back_pixmap (GdkWindow *window,
                            GdkPixmap *pixmap,
                            gint       parent_relative)
 {
-  GdkWindowPrivate *private;
-
   g_return_if_fail (window != NULL);
   g_return_if_fail (GDK_IS_WINDOW (window));
   
-  private = (GdkWindowPrivate*) window;
-
   if (!GDK_DRAWABLE_DESTROYED (window))
     {
-      if (private->bg_type == GDK_WIN32_BG_PIXMAP)
+      if (GDK_WINDOW_WIN32DATA (window)->bg_type == GDK_WIN32_BG_PIXMAP)
        {
-         if (private->bg_pixmap != NULL)
+         if (GDK_WINDOW_WIN32DATA (window)->bg_pixmap != NULL)
            {
-             gdk_pixmap_unref (private->bg_pixmap);
-             private->bg_pixmap = NULL;
+             gdk_drawable_unref (GDK_WINDOW_WIN32DATA (window)->bg_pixmap);
+             GDK_WINDOW_WIN32DATA (window)->bg_pixmap = NULL;
            }
-         private->bg_type = GDK_WIN32_BG_NORMAL;
+         GDK_WINDOW_WIN32DATA (window)->bg_type = GDK_WIN32_BG_NORMAL;
        }
       if (parent_relative)
        {
-         private->bg_type = GDK_WIN32_BG_PARENT_RELATIVE;
+         GDK_WINDOW_WIN32DATA (window)->bg_type =
+           GDK_WIN32_BG_PARENT_RELATIVE;
        }
       else if (!pixmap)
        {
@@ -1470,12 +1455,12 @@ gdk_window_set_back_pixmap (GdkWindow *window,
        }
       else
        {
-         /* We must cache the pixmap in the WindowPrivate and
+         /* We must cache the pixmap in the GdkWindowWin32Data and
           * paint it each time we get WM_ERASEBKGND
           */
-         private->bg_type = GDK_WIN32_BG_PIXMAP;
-         private->bg_pixmap = pixmap;
-         gdk_pixmap_ref (pixmap);
+         GDK_WINDOW_WIN32DATA (window)->bg_type = GDK_WIN32_BG_PIXMAP;
+         GDK_WINDOW_WIN32DATA (window)->bg_pixmap = pixmap;
+         gdk_drawable_ref (pixmap);
        }
     }
 }
@@ -1484,14 +1469,13 @@ void
 gdk_window_set_cursor (GdkWindow *window,
                       GdkCursor *cursor)
 {
-  GdkWindowPrivate *window_private;
   GdkCursorPrivate *cursor_private;
   HCURSOR xcursor;
+  POINT pt;
   
   g_return_if_fail (window != NULL);
   g_return_if_fail (GDK_IS_WINDOW (window));
   
-  window_private = (GdkWindowPrivate*) window;
   cursor_private = (GdkCursorPrivate*) cursor;
   
   if (!GDK_DRAWABLE_DESTROYED (window))
@@ -1502,18 +1486,13 @@ gdk_window_set_cursor (GdkWindow *window,
        xcursor = cursor_private->xcursor;
 
       GDK_NOTE (MISC, g_print ("gdk_window_set_cursor: %#x %#x\n",
-                              window_private->drawable.xwindow, xcursor));
-      window_private->xcursor = xcursor;
-    }
-}
+                              GDK_DRAWABLE_XID (window), xcursor));
+      GDK_WINDOW_WIN32DATA (window)->xcursor = xcursor;
 
-void
-gdk_window_get_user_data (GdkWindow *window,
-                         gpointer  *data)
-{
-  g_return_if_fail (window != NULL);
-  
-  *data = window->user_data;
+      GetCursorPos (&pt);
+      if (ChildWindowFromPoint (GDK_DRAWABLE_XID (window), pt) == GDK_DRAWABLE_XID (window))
+       SetCursor (xcursor);
+    }
 }
 
 void
@@ -1527,14 +1506,14 @@ gdk_window_get_geometry (GdkWindow *window,
   g_return_if_fail (window == NULL || GDK_IS_WINDOW (window));
   
   if (!window)
-    window = (GdkWindow*) &gdk_root_parent;
+    window = gdk_parent_root;
   
   if (!GDK_DRAWABLE_DESTROYED (window))
     {
       RECT rect;
 
       if (!GetClientRect (GDK_DRAWABLE_XID (window), &rect))
-       g_warning ("gdk_window_get_geometry: GetClientRect failed");
+       WIN32_API_FAILED ("GetClientRect");
 
       if (x)
        *x = rect.left;
@@ -1549,24 +1528,6 @@ gdk_window_get_geometry (GdkWindow *window,
     }
 }
 
-void
-gdk_window_get_position (GdkWindow *window,
-                        gint      *x,
-                        gint      *y)
-{
-  GdkWindowPrivate *window_private;
-  
-  g_return_if_fail (window != NULL);
-  g_return_if_fail (GDK_IS_WINDOW (window));
-  
-  window_private = (GdkWindowPrivate*) window;
-  
-  if (x)
-    *x = window_private->x;
-  if (y)
-    *y = window_private->y;
-}
-
 gint
 gdk_window_get_origin (GdkWindow *window,
                       gint      *x,
@@ -1615,13 +1576,13 @@ gdk_window_get_root_origin (GdkWindow *window,
                            gint      *x,
                            gint      *y)
 {
-  GdkWindowPrivate *private;
+  GdkWindowPrivate *rover;
   POINT pt;
 
   g_return_if_fail (window != NULL);
   g_return_if_fail (GDK_IS_WINDOW (window));
 
-  private = (GdkWindowPrivate*) window;
+  rover = (GdkWindowPrivate*) window;
   if (x)
     *x = 0;
   if (y)
@@ -1629,14 +1590,14 @@ gdk_window_get_root_origin (GdkWindow *window,
   if (GDK_DRAWABLE_DESTROYED (window))
     return;
       
-  while (private->parent && ((GdkWindowPrivate*) private->parent)->parent)
-    private = (GdkWindowPrivate*) private->parent;
-  if (private->drawable.destroyed)
+  while (rover->parent && ((GdkWindowPrivate*) rover->parent)->parent)
+    rover = (GdkWindowPrivate *) rover->parent;
+  if (rover->drawable.destroyed)
     return;
 
   pt.x = 0;
   pt.y = 0;
-  ClientToScreen (private->drawable.xwindow, &pt);
+  ClientToScreen (GDK_DRAWABLE_XID (rover), &pt);
   if (x)
     *x = pt.x;
   if (y)
@@ -1644,7 +1605,7 @@ gdk_window_get_root_origin (GdkWindow *window,
 
   GDK_NOTE (MISC, g_print ("gdk_window_get_root_origin: %#x: (%#x) +%d+%d\n",
                           GDK_DRAWABLE_XID (window),
-                          private->drawable.xwindow, pt.x, pt.y));
+                          GDK_DRAWABLE_XID (rover), pt.x, pt.y));
 }
 
 GdkWindow*
@@ -1660,7 +1621,7 @@ gdk_window_get_pointer (GdkWindow       *window,
   g_return_val_if_fail (window == NULL || GDK_IS_WINDOW (window), NULL);
   
   if (!window)
-    window = (GdkWindow*) &gdk_root_parent;
+    window = gdk_parent_root;
 
   return_val = NULL;
   GetCursorPos (&pointc);
@@ -1724,7 +1685,7 @@ gdk_window_at_pointer (gint *win_x,
 
   if (hwnd == NULL)
     {
-      window = (GdkWindow *) &gdk_root_parent;
+      window = gdk_parent_root;
       if (win_x)
        *win_x = pointc.x;
       if (win_y)
@@ -1758,27 +1719,6 @@ gdk_window_at_pointer (gint *win_x,
   return window;
 }
 
-GdkWindow*
-gdk_window_get_parent (GdkWindow *window)
-{
-  g_return_val_if_fail (window != NULL, NULL);
-  g_return_val_if_fail (GDK_IS_WINDOW (window), NULL);
-
-  return ((GdkWindowPrivate*) window)->parent;
-}
-
-GdkWindow*
-gdk_window_get_toplevel (GdkWindow *window)
-{
-  g_return_val_if_fail (window != NULL, NULL);
-  g_return_val_if_fail (GDK_IS_WINDOW (window), NULL);
-
-  while (GDK_DRAWABLE_TYPE (window) == GDK_WINDOW_CHILD)
-    window = ((GdkWindowPrivate*) window)->parent;
-
-  return window;
-}
-
 GList*
 gdk_window_get_children (GdkWindow *window)
 {
@@ -1801,32 +1741,26 @@ gdk_window_get_children (GdkWindow *window)
 GdkEventMask  
 gdk_window_get_events (GdkWindow *window)
 {
-  GdkWindowPrivate *private;
-
   g_return_val_if_fail (window != NULL, 0);
   g_return_val_if_fail (GDK_IS_WINDOW (window), 0);
 
-  private = (GdkWindowPrivate*) window;
   if (GDK_DRAWABLE_DESTROYED (window))
     return 0;
 
-  return private->event_mask;
+  return GDK_WINDOW_WIN32DATA (window)->event_mask;
 }
 
 void          
 gdk_window_set_events (GdkWindow   *window,
                       GdkEventMask event_mask)
 {
-  GdkWindowPrivate *private;
-
   g_return_if_fail (window != NULL);
   g_return_if_fail (GDK_IS_WINDOW (window));
 
-  private = (GdkWindowPrivate*) window;
   if (GDK_DRAWABLE_DESTROYED (window))
     return;
 
-  private->event_mask = event_mask;
+  GDK_WINDOW_WIN32DATA (window)->event_mask = event_mask;
 }
 
 void
@@ -1851,19 +1785,17 @@ gdk_window_shape_combine_mask (GdkWindow *window,
     }
   else
     {
-      GdkDrawablePrivate *pixmap_private;
       HRGN hrgn;
       DWORD dwStyle;
       DWORD dwExStyle;
       RECT rect;
 
       /* Convert mask bitmap to region */
-      pixmap_private = (GdkDrawablePrivate*) mask;
-      hrgn = BitmapToRegion (pixmap_private->xwindow);
+      hrgn = BitmapToRegion (GDK_DRAWABLE_XID (mask));
 
       GDK_NOTE (MISC, g_print ("gdk_window_shape_combine_mask: %#x %#x\n",
                               GDK_DRAWABLE_XID (window),
-                              pixmap_private->xwindow));
+                              GDK_DRAWABLE_XID (mask)));
 
       /* SetWindowRgn wants window (not client) coordinates */ 
       dwStyle = GetWindowLong (GDK_DRAWABLE_XID (window), GWL_STYLE);
@@ -1886,84 +1818,6 @@ gdk_window_shape_combine_mask (GdkWindow *window,
     }
 }
 
-void          
-gdk_window_add_filter (GdkWindow     *window,
-                      GdkFilterFunc  function,
-                      gpointer       data)
-{
-  GdkWindowPrivate *private;
-  GList *tmp_list;
-  GdkEventFilter *filter;
-  
-  g_return_if_fail (window != NULL);
-  g_return_if_fail (GDK_IS_WINDOW (window));
-
-  private = (GdkWindowPrivate*) window;
-  if (private && GDK_DRAWABLE_DESTROYED (window))
-    return;
-  
-  if (private)
-    tmp_list = private->filters;
-  else
-    tmp_list = gdk_default_filters;
-  
-  while (tmp_list)
-    {
-      filter = (GdkEventFilter *)tmp_list->data;
-      if ((filter->function == function) && (filter->data == data))
-       return;
-      tmp_list = tmp_list->next;
-    }
-  
-  filter = g_new (GdkEventFilter, 1);
-  filter->function = function;
-  filter->data = data;
-  
-  if (private)
-    private->filters = g_list_append (private->filters, filter);
-  else
-    gdk_default_filters = g_list_append (gdk_default_filters, filter);
-}
-
-void
-gdk_window_remove_filter (GdkWindow     *window,
-                         GdkFilterFunc  function,
-                         gpointer       data)
-{
-  GdkWindowPrivate *private;
-  GList *tmp_list, *node;
-  GdkEventFilter *filter;
-  
-  g_return_if_fail (window != NULL);
-  g_return_if_fail (GDK_IS_WINDOW (window));
-
-  private = (GdkWindowPrivate*) window;
-  
-  if (private)
-    tmp_list = private->filters;
-  else
-    tmp_list = gdk_default_filters;
-  
-  while (tmp_list)
-    {
-      filter = (GdkEventFilter *)tmp_list->data;
-      node = tmp_list;
-      tmp_list = tmp_list->next;
-      
-      if ((filter->function == function) && (filter->data == data))
-       {
-         if (private)
-           private->filters = g_list_remove_link (private->filters, node);
-         else
-           gdk_default_filters = g_list_remove_link (gdk_default_filters, node);
-         g_list_free_1 (node);
-         g_free (filter);
-         
-         return;
-       }
-    }
-}
-
 void
 gdk_window_set_override_redirect (GdkWindow *window,
                                  gboolean   override_redirect)
@@ -1986,12 +1840,15 @@ gdk_window_set_icon (GdkWindow *window,
   if (GDK_DRAWABLE_DESTROYED (window))
     return;
   
-  g_warning ("gdk_window_set_icon not implemented");
+  /* Nothing to do, really. As we share window classes between windows
+   * we can't have window-specific icons, sorry. Don't print any warning
+   * either.
+   */
 }
 
 void
-gdk_window_set_icon_name (GdkWindow *window, 
-                         gchar     *name)
+gdk_window_set_icon_name (GdkWindow   *window, 
+                         const gchar *name)
 {
   g_return_if_fail (window != NULL);
   g_return_if_fail (GDK_IS_WINDOW (window));
@@ -2000,7 +1857,7 @@ gdk_window_set_icon_name (GdkWindow *window,
     return;
   
   if (!SetWindowText (GDK_DRAWABLE_XID (window), name))
-    g_warning ("gdk_window_set_icon_name: SetWindowText failed");
+    WIN32_API_FAILED ("SetWindowText");
 }
 
 void          
@@ -2085,22 +1942,6 @@ gdk_window_set_functions (GdkWindow    *window,
   SetWindowLong (GDK_DRAWABLE_XID (window), GWL_STYLE, style);
 }
 
-GList *
-gdk_window_get_toplevels (void)
-{
-  GList *new_list = NULL;
-  GList *tmp_list;
-
-  tmp_list = gdk_root_parent.children;
-  while (tmp_list)
-    {
-      new_list = g_list_prepend (new_list, tmp_list->data);
-      tmp_list = tmp_list->next;
-    }
-
-  return new_list;
-}
-
 /* 
  * propagate the shapes from all child windows of a GDK window to the parent 
  * window. Shamelessly ripped from Enlightenment's code
@@ -2165,7 +2006,7 @@ gdk_propagate_shapes (HANDLE   win,
        for (i = 0; i < num; i++)
         {
           GetWindowPlacement (list[i], &placement);
-          if (placement.showCmd = SW_SHOWNORMAL)
+          if (placement.showCmd == SW_SHOWNORMAL)
             {
               childRegion = CreateRectRgnIndirect (&emptyRect);
               GetWindowRgn (list[i], childRegion);
@@ -2203,59 +2044,6 @@ gdk_window_merge_child_shapes (GdkWindow *window)
   gdk_propagate_shapes (GDK_DRAWABLE_XID (window), TRUE);
 }
 
-/*************************************************************
- * gdk_window_is_visible:
- *     Check if the given window is mapped.
- *   arguments:
- *     window: 
- *   results:
- *     is the window mapped
- *************************************************************/
-
-gboolean 
-gdk_window_is_visible (GdkWindow *window)
-{
-  GdkWindowPrivate *private = (GdkWindowPrivate *)window;
-
-  g_return_val_if_fail (window != NULL, FALSE);
-  g_return_val_if_fail (GDK_IS_WINDOW (window), FALSE);
-
-  return private->mapped;
-}
-
-/*************************************************************
- * gdk_window_is_viewable:
- *     Check if the window and all ancestors of the window
- *     are mapped. (This is not necessarily "viewable" in
- *     the X sense, since we only check as far as we have
- *     GDK window parents, not to the root window)
- *   arguments:
- *     window:
- *   results:
- *     is the window viewable
- *************************************************************/
-
-gboolean 
-gdk_window_is_viewable (GdkWindow *window)
-{
-  GdkWindowPrivate *private = (GdkWindowPrivate *)window;
-
-  g_return_val_if_fail (window != NULL, FALSE);
-  g_return_val_if_fail (GDK_IS_WINDOW (window), FALSE);
-
-  while (private && 
-        (private != &gdk_root_parent) &&
-        (private->drawable.window_type != GDK_WINDOW_FOREIGN))
-    {
-      if (!private->mapped)
-       return FALSE;
-
-      private = (GdkWindowPrivate *)private->parent;
-    }
-
-  return TRUE;
-}
-
 /* Support for windows that can be guffaw-scrolled
  * (See http://www.gtk.org/~otaylor/whitepapers/guffaw-scrolling.txt)
  */