[gtk+] Port Quartz backend to latest rendering-cleanup changes



commit fd6e57687de49ac2c8e51923a3ccc471e5cc97b5
Author: Kristian Rietveld <kris gtk org>
Date:   Mon Dec 6 14:13:40 2010 +0100

    Port Quartz backend to latest rendering-cleanup changes

 gdk/quartz/GdkQuartzView.c      |    8 +-
 gdk/quartz/GdkQuartzWindow.c    |   40 +--
 gdk/quartz/Makefile.am          |    2 -
 gdk/quartz/gdkdevice-core.c     |   10 +-
 gdk/quartz/gdkdrawable-quartz.c |  232 ------------
 gdk/quartz/gdkdrawable-quartz.h |   71 ----
 gdk/quartz/gdkevents-quartz.c   |   58 +---
 gdk/quartz/gdkgeometry-quartz.c |    3 +-
 gdk/quartz/gdkinput.c           |   14 +-
 gdk/quartz/gdkprivate-quartz.h  |    6 +-
 gdk/quartz/gdkwindow-quartz.c   |  742 +++++++++++++++++++++------------------
 gdk/quartz/gdkwindow-quartz.h   |   19 +-
 12 files changed, 467 insertions(+), 738 deletions(-)
---
diff --git a/gdk/quartz/GdkQuartzView.c b/gdk/quartz/GdkQuartzView.c
index 8c6132b..cf34e83 100644
--- a/gdk/quartz/GdkQuartzView.c
+++ b/gdk/quartz/GdkQuartzView.c
@@ -68,8 +68,7 @@
 -(void)drawRect:(NSRect)rect 
 {
   GdkRectangle gdk_rect;
-  GdkWindowObject *private = GDK_WINDOW_OBJECT (gdk_window);
-  GdkWindowImplQuartz *impl = GDK_WINDOW_IMPL_QUARTZ (private->impl);
+  GdkWindowImplQuartz *impl = GDK_WINDOW_IMPL_QUARTZ (gdk_window->impl);
   const NSRect *drawn_rects;
   NSInteger count;
   int i;
@@ -78,7 +77,7 @@
   if (GDK_WINDOW_DESTROYED (gdk_window))
     return;
 
-  if (!(private->event_mask & GDK_EXPOSURE_MASK))
+  if (!(gdk_window->event_mask & GDK_EXPOSURE_MASK))
     return;
 
   if (NSEqualRects (rect, NSZeroRect))
@@ -127,8 +126,7 @@
  */
 -(void)updateTrackingRect
 {
-  GdkWindowObject *private = GDK_WINDOW_OBJECT (gdk_window);
-  GdkWindowImplQuartz *impl = GDK_WINDOW_IMPL_QUARTZ (private->impl);
+  GdkWindowImplQuartz *impl = GDK_WINDOW_IMPL_QUARTZ (gdk_window->impl);
   NSRect rect;
 
   if (!impl->toplevel)
diff --git a/gdk/quartz/GdkQuartzWindow.c b/gdk/quartz/GdkQuartzWindow.c
index eb3cce8..6fd0c9b 100644
--- a/gdk/quartz/GdkQuartzWindow.c
+++ b/gdk/quartz/GdkQuartzWindow.c
@@ -140,7 +140,6 @@
 -(void)windowDidMove:(NSNotification *)aNotification
 {
   GdkWindow *window = [[self contentView] gdkWindow];
-  GdkWindowObject *private = (GdkWindowObject *)window;
   GdkEvent *event;
 
   _gdk_quartz_window_update_position (window);
@@ -148,10 +147,10 @@
   /* Synthesize a configure event */
   event = gdk_event_new (GDK_CONFIGURE);
   event->configure.window = g_object_ref (window);
-  event->configure.x = private->x;
-  event->configure.y = private->y;
-  event->configure.width = private->width;
-  event->configure.height = private->height;
+  event->configure.x = window->x;
+  event->configure.y = window->y;
+  event->configure.width = window->width;
+  event->configure.height = window->height;
 
   _gdk_event_queue_append (gdk_display_get_default (), event);
 }
@@ -160,23 +159,22 @@
 {
   NSRect content_rect = [self contentRectForFrameRect:[self frame]];
   GdkWindow *window = [[self contentView] gdkWindow];
-  GdkWindowObject *private = (GdkWindowObject *)window;
   GdkEvent *event;
 
-  private->width = content_rect.size.width;
-  private->height = content_rect.size.height;
+  window->width = content_rect.size.width;
+  window->height = content_rect.size.height;
 
-  [[self contentView] setFrame:NSMakeRect (0, 0, private->width, private->height)];
+  [[self contentView] setFrame:NSMakeRect (0, 0, window->width, window->height)];
 
   _gdk_window_update_size (window);
 
   /* Synthesize a configure event */
   event = gdk_event_new (GDK_CONFIGURE);
   event->configure.window = g_object_ref (window);
-  event->configure.x = private->x;
-  event->configure.y = private->y;
-  event->configure.width = private->width;
-  event->configure.height = private->height;
+  event->configure.x = window->x;
+  event->configure.y = window->y;
+  event->configure.width = window->width;
+  event->configure.height = window->height;
 
   _gdk_event_queue_append (gdk_display_get_default (), event);
 }
@@ -199,8 +197,7 @@
 -(BOOL)canBecomeMainWindow
 {
   GdkWindow *window = [[self contentView] gdkWindow];
-  GdkWindowObject *private = (GdkWindowObject *)window;
-  GdkWindowImplQuartz *impl = GDK_WINDOW_IMPL_QUARTZ (private->impl);
+  GdkWindowImplQuartz *impl = GDK_WINDOW_IMPL_QUARTZ (window->impl);
 
   switch (impl->type_hint)
     {
@@ -229,16 +226,15 @@
 -(BOOL)canBecomeKeyWindow
 {
   GdkWindow *window = [[self contentView] gdkWindow];
-  GdkWindowObject *private = (GdkWindowObject *)window;
-  GdkWindowImplQuartz *impl = GDK_WINDOW_IMPL_QUARTZ (private->impl);
+  GdkWindowImplQuartz *impl = GDK_WINDOW_IMPL_QUARTZ (window->impl);
 
-  if (!private->accept_focus)
+  if (!window->accept_focus)
     return NO;
 
   /* Popup windows should not be able to get focused in the window
    * manager sense, it's only handled through grabs.
    */
-  if (private->window_type == GDK_WINDOW_TEMP)
+  if (window->window_type == GDK_WINDOW_TEMP)
     return NO;
 
   switch (impl->type_hint)
@@ -268,8 +264,7 @@
 - (void)showAndMakeKey:(BOOL)makeKey
 {
   GdkWindow *window = [[self contentView] gdkWindow];
-  GdkWindowObject *private = (GdkWindowObject *)window;
-  GdkWindowImplQuartz *impl = GDK_WINDOW_IMPL_QUARTZ (private->impl);
+  GdkWindowImplQuartz *impl = GDK_WINDOW_IMPL_QUARTZ (window->impl);
 
   inShowOrHide = YES;
 
@@ -284,8 +279,7 @@
 - (void)hide
 {
   GdkWindow *window = [[self contentView] gdkWindow];
-  GdkWindowObject *private = (GdkWindowObject *)window;
-  GdkWindowImplQuartz *impl = GDK_WINDOW_IMPL_QUARTZ (private->impl);
+  GdkWindowImplQuartz *impl = GDK_WINDOW_IMPL_QUARTZ (window->impl);
 
   inShowOrHide = YES;
   [impl->toplevel orderOut:nil];
diff --git a/gdk/quartz/Makefile.am b/gdk/quartz/Makefile.am
index b0a967d..f7ffd5a 100644
--- a/gdk/quartz/Makefile.am
+++ b/gdk/quartz/Makefile.am
@@ -27,8 +27,6 @@ libgdk_quartz_la_SOURCES =    	\
 	gdkdevicemanager-core.c	\
 	gdkdisplay-quartz.c	\
 	gdkdnd-quartz.c		\
-	gdkdrawable-quartz.c	\
-	gdkdrawable-quartz.h	\
 	gdkevents-quartz.c	\
 	gdkeventloop-quartz.c	\
 	gdkgeometry-quartz.c	\
diff --git a/gdk/quartz/gdkdevice-core.c b/gdk/quartz/gdkdevice-core.c
index 57dc3de..25f9a1e 100644
--- a/gdk/quartz/gdkdevice-core.c
+++ b/gdk/quartz/gdkdevice-core.c
@@ -188,8 +188,7 @@ gdk_device_core_query_state_helper (GdkWindow       *window,
                                     gint            *y,
                                     GdkModifierType *mask)
 {
-  GdkWindowObject *toplevel;
-  GdkWindowObject *private;
+  GdkWindow *toplevel;
   NSPoint point;
   gint x_tmp, y_tmp;
   GdkWindow *found_window;
@@ -204,7 +203,7 @@ gdk_device_core_query_state_helper (GdkWindow       *window,
       return NULL;
     }
 
-  toplevel = GDK_WINDOW_OBJECT (gdk_window_get_effective_toplevel (window));
+  toplevel = gdk_window_get_effective_toplevel (window);
 
   *mask = _gdk_quartz_events_get_current_event_mask ();
 
@@ -220,15 +219,14 @@ gdk_device_core_query_state_helper (GdkWindow       *window,
       NSWindow *nswindow;
 
       impl = GDK_WINDOW_IMPL_QUARTZ (toplevel->impl);
-      private = GDK_WINDOW_OBJECT (toplevel);
       nswindow = impl->toplevel;
 
       point = [nswindow mouseLocationOutsideOfEventStream];
 
       x_tmp = point.x;
-      y_tmp = private->height - point.y;
+      y_tmp = toplevel->height - point.y;
 
-      window = (GdkWindow *)toplevel;
+      window = toplevel;
     }
 
   found_window = _gdk_quartz_window_find_child (window, x_tmp, y_tmp,
diff --git a/gdk/quartz/gdkevents-quartz.c b/gdk/quartz/gdkevents-quartz.c
index 44f10cb..9cbfdda 100644
--- a/gdk/quartz/gdkevents-quartz.c
+++ b/gdk/quartz/gdkevents-quartz.c
@@ -374,7 +374,6 @@ generate_motion_event (GdkWindow *window)
   NSPoint screen_point;
   NSWindow *nswindow;
   GdkQuartzView *view;
-  GdkWindowObject *private;
   GdkEvent *event;
   gint x, y, x_root, y_root;
   GdkDisplay *display;
@@ -383,8 +382,7 @@ generate_motion_event (GdkWindow *window)
   event->any.window = NULL;
   event->any.send_event = TRUE;
 
-  private = (GdkWindowObject *)window;
-  nswindow = ((GdkWindowImplQuartz *)private->impl)->toplevel;
+  nswindow = ((GdkWindowImplQuartz *)window->impl)->toplevel;
   view = (GdkQuartzView *)[nswindow contentView];
 
   display = gdk_window_get_display (window);
@@ -396,7 +394,7 @@ generate_motion_event (GdkWindow *window)
   point = [nswindow convertScreenToBase:screen_point];
 
   x = point.x;
-  y = private->height - point.y;
+  y = window->height - point.y;
 
   event->any.type = GDK_MOTION_NOTIFY;
   event->motion.window = window;
@@ -464,7 +462,6 @@ _gdk_quartz_events_send_enter_notify_event (GdkWindow *window)
   NSPoint point;
   NSPoint screen_point;
   NSWindow *nswindow;
-  GdkWindowObject *private;
   GdkEvent *event;
   gint x, y, x_root, y_root;
 
@@ -472,8 +469,7 @@ _gdk_quartz_events_send_enter_notify_event (GdkWindow *window)
   event->any.window = NULL;
   event->any.send_event = FALSE;
 
-  private = (GdkWindowObject *)window;
-  nswindow = ((GdkWindowImplQuartz *)private->impl)->toplevel;
+  nswindow = ((GdkWindowImplQuartz *)window->impl)->toplevel;
 
   screen_point = [NSEvent mouseLocation];
 
@@ -482,7 +478,7 @@ _gdk_quartz_events_send_enter_notify_event (GdkWindow *window)
   point = [nswindow convertScreenToBase:screen_point];
 
   x = point.x;
-  y = private->height - point.y;
+  y = window->height - point.y;
 
   event->crossing.window = window;
   event->crossing.subwindow = NULL;
@@ -503,13 +499,12 @@ _gdk_quartz_events_send_enter_notify_event (GdkWindow *window)
 void
 _gdk_quartz_events_send_map_event (GdkWindow *window)
 {
-  GdkWindowObject *private = (GdkWindowObject *)window;
-  GdkWindowImplQuartz *impl = GDK_WINDOW_IMPL_QUARTZ (private->impl);
+  GdkWindowImplQuartz *impl = GDK_WINDOW_IMPL_QUARTZ (window->impl);
 
   if (!impl->toplevel)
     return;
 
-  if (private->event_mask & GDK_STRUCTURE_MASK)
+  if (window->event_mask & GDK_STRUCTURE_MASK)
     {
       GdkEvent event;
 
@@ -533,17 +528,15 @@ find_toplevel_under_pointer (GdkDisplay *display,
   toplevel = info->toplevel_under_pointer;
   if (toplevel && WINDOW_IS_TOPLEVEL (toplevel))
     {
-      GdkWindowObject *private;
       NSWindow *nswindow;
       NSPoint point;
 
-      private = (GdkWindowObject *)toplevel;
-      nswindow = ((GdkWindowImplQuartz *)private->impl)->toplevel;
+      nswindow = ((GdkWindowImplQuartz *)toplevel->impl)->toplevel;
 
       point = [nswindow convertScreenToBase:screen_point];
 
       *x = point.x;
-      *y = private->height - point.y;
+      *y = toplevel->height - point.y;
     }
 
   return toplevel;
@@ -599,13 +592,11 @@ find_toplevel_for_mouse_event (NSEvent    *nsevent,
   GdkQuartzView *view;
   GdkDisplay *display;
   GdkDeviceGrabInfo *grab;
-  GdkWindowObject *private;
 
   view = (GdkQuartzView *)[[nsevent window] contentView];
   toplevel = [view gdkWindow];
 
   display = gdk_window_get_display (toplevel);
-  private = GDK_WINDOW_OBJECT (toplevel);
 
   event_type = [nsevent type];
   point = [nsevent locationInWindow];
@@ -657,18 +648,16 @@ find_toplevel_for_mouse_event (NSEvent    *nsevent,
         {
           /* Finally check the grab window. */
           GdkWindow *grab_toplevel;
-          GdkWindowObject *grab_private;
           NSWindow *grab_nswindow;
 
           grab_toplevel = gdk_window_get_effective_toplevel (grab->window);
-          grab_private = (GdkWindowObject *)grab_toplevel;
 
-          grab_nswindow = ((GdkWindowImplQuartz *)grab_private->impl)->toplevel;
+          grab_nswindow = ((GdkWindowImplQuartz *)grab_toplevel->impl)->toplevel;
           point = [grab_nswindow convertScreenToBase:screen_point];
 
           /* Note: x_root and y_root are already right. */
           *x = point.x;
-          *y = grab_private->height - point.y;
+          *y = grab_toplevel->height - point.y;
 
           return grab_toplevel;
         }
@@ -699,13 +688,11 @@ find_toplevel_for_mouse_event (NSEvent    *nsevent,
       if (toplevel_under_pointer
           && WINDOW_IS_TOPLEVEL (toplevel_under_pointer))
         {
-          GdkWindowObject *toplevel_private;
           GdkWindowImplQuartz *toplevel_impl;
 
           toplevel = toplevel_under_pointer;
 
-          toplevel_private = (GdkWindowObject *)toplevel;
-          toplevel_impl = (GdkWindowImplQuartz *)toplevel_private->impl;
+          toplevel_impl = (GdkWindowImplQuartz *)toplevel->impl;
 
           if ([toplevel_impl->toplevel showsResizeIndicator])
             {
@@ -756,17 +743,15 @@ find_window_for_ns_event (NSEvent *nsevent,
   NSPoint screen_point;
   NSEventType event_type;
   GdkWindow *toplevel;
-  GdkWindowObject *private;
 
   view = (GdkQuartzView *)[[nsevent window] contentView];
   toplevel = [view gdkWindow];
-  private = GDK_WINDOW_OBJECT (toplevel);
 
   point = [nsevent locationInWindow];
   screen_point = [[nsevent window] convertBaseToScreen:point];
 
   *x = point.x;
-  *y = private->height - point.y;
+  *y = toplevel->height - point.y;
 
   _gdk_quartz_window_nspoint_to_gdk_xy (screen_point, x_root, y_root);
 
@@ -934,11 +919,8 @@ fill_scroll_event (GdkWindow          *window,
                    gint                y_root,
                    GdkScrollDirection  direction)
 {
-  GdkWindowObject *private;
   NSPoint point;
 
-  private = GDK_WINDOW_OBJECT (window);
-
   point = [nsevent locationInWindow];
 
   event->any.type = GDK_SCROLL;
@@ -1083,17 +1065,13 @@ synthesize_crossing_event (GdkWindow *window,
                            gint       x_root,
                            gint       y_root)
 {
-  GdkWindowObject *private;
-
-  private = GDK_WINDOW_OBJECT (window);
-
   switch ([nsevent type])
     {
     case NSMouseEntered:
       /* Enter events are considered always to be from the root window as we
        * can't know for sure from what window we enter.
        */
-      if (!(private->event_mask & GDK_ENTER_NOTIFY_MASK))
+      if (!(window->event_mask & GDK_ENTER_NOTIFY_MASK))
         return FALSE;
 
       fill_crossing_event (window, event, nsevent,
@@ -1109,7 +1087,7 @@ synthesize_crossing_event (GdkWindow *window,
        * since there is no way to reliably get information about what new
        * window is entered when exiting one.
        */
-      if (!(private->event_mask & GDK_LEAVE_NOTIFY_MASK))
+      if (!(window->event_mask & GDK_LEAVE_NOTIFY_MASK))
         return FALSE;
 
       fill_crossing_event (window, event, nsevent,
@@ -1220,14 +1198,13 @@ gdk_event_translate (GdkEvent *event,
   /* Apply any window filters. */
   if (GDK_IS_WINDOW (window))
     {
-      GdkWindowObject *filter_private = (GdkWindowObject *) window;
       GdkFilterReturn result;
 
-      if (filter_private->filters)
+      if (window->filters)
 	{
 	  g_object_ref (window);
 
-	  result = gdk_event_apply_filters (nsevent, event, &filter_private->filters);
+	  result = gdk_event_apply_filters (nsevent, event, &window->filters);
 
 	  g_object_unref (window);
 
@@ -1248,8 +1225,7 @@ gdk_event_translate (GdkEvent *event,
        event_type == NSOtherMouseDown ||
        event_type == NSLeftMouseDown))
     {
-      GdkWindowObject *private = (GdkWindowObject *)window;
-      GdkWindowImplQuartz *impl = GDK_WINDOW_IMPL_QUARTZ (private->impl);
+      GdkWindowImplQuartz *impl = GDK_WINDOW_IMPL_QUARTZ (window->impl);
 
       if (![NSApp isActive])
         {
diff --git a/gdk/quartz/gdkgeometry-quartz.c b/gdk/quartz/gdkgeometry-quartz.c
index bd602e3..8434151 100644
--- a/gdk/quartz/gdkgeometry-quartz.c
+++ b/gdk/quartz/gdkgeometry-quartz.c
@@ -29,8 +29,7 @@ _gdk_quartz_window_translate (GdkWindow      *window,
                               gint            dy)
 {
   cairo_region_t *invalidate, *scrolled;
-  GdkWindowObject *private = (GdkWindowObject *)window;
-  GdkWindowImplQuartz *impl = (GdkWindowImplQuartz *)private->impl;
+  GdkWindowImplQuartz *impl = (GdkWindowImplQuartz *)window->impl;
   GdkRectangle extents;
 
   cairo_region_get_extents (area, &extents);
diff --git a/gdk/quartz/gdkinput.c b/gdk/quartz/gdkinput.c
index 31d1bd2..3677d8a 100644
--- a/gdk/quartz/gdkinput.c
+++ b/gdk/quartz/gdkinput.c
@@ -65,7 +65,7 @@ _gdk_input_select_device_events (GdkWindow *impl_window,
                                  GdkDevice *device)
 {
   guint event_mask;
-  GdkWindowObject *w;
+  GdkWindow *w;
   GdkInputWindow *iw;
   GdkInputMode mode;
   gboolean has_cursor;
@@ -73,7 +73,7 @@ _gdk_input_select_device_events (GdkWindow *impl_window,
   GList *l;
 
   event_mask = 0;
-  iw = ((GdkWindowObject *)impl_window)->input_window;
+  iw = impl_window->input_window;
 
   g_object_get (device,
                 "type", &type,
@@ -140,16 +140,14 @@ gdk_input_set_extension_events (GdkWindow        *window,
                                 gint              mask,
                                 GdkExtensionMode  mode)
 {
-  GdkWindowObject *window_private;
-  GdkWindowObject *impl_window;
   GList *tmp_list;
   GdkInputWindow *iw;
+  GdkWindow *impl_window;
 
   g_return_if_fail (window != NULL);
   g_return_if_fail (GDK_WINDOW_IS_QUARTZ (window));
 
-  window_private = (GdkWindowObject*) window;
-  impl_window = (GdkWindowObject *)_gdk_window_get_impl_window (window);
+  impl_window = (GdkWindow *)_gdk_window_get_impl_window (window);
 
   if (mode == GDK_EXTENSION_EVENTS_NONE)
     mask = 0;
@@ -166,7 +164,7 @@ gdk_input_set_extension_events (GdkWindow        *window,
       iw->grabbed = FALSE;
 
       _gdk_input_windows = g_list_append (_gdk_input_windows, iw);
-      window_private->extension_events = mask;
+      window->extension_events = mask;
 
       /* Add enter window events to the event mask */
       /* FIXME, this is not needed for XINPUT_NONE */
@@ -183,7 +181,7 @@ gdk_input_set_extension_events (GdkWindow        *window,
           g_free (iw);
         }
 
-      window_private->extension_events = 0;
+      window->extension_events = 0;
     }
 
   for (tmp_list = _gdk_input_devices; tmp_list; tmp_list = tmp_list->next)
diff --git a/gdk/quartz/gdkprivate-quartz.h b/gdk/quartz/gdkprivate-quartz.h
index ca9eae3..9a70054 100644
--- a/gdk/quartz/gdkprivate-quartz.h
+++ b/gdk/quartz/gdkprivate-quartz.h
@@ -62,7 +62,7 @@ extern GdkWindow *_gdk_root;
 
 extern GdkDragContext *_gdk_quartz_drag_source_context;
 
-#define GDK_WINDOW_IS_QUARTZ(win)        (GDK_IS_WINDOW_IMPL_QUARTZ (((GdkWindowObject *)win)->impl))
+#define GDK_WINDOW_IS_QUARTZ(win)        (GDK_IS_WINDOW_IMPL_QUARTZ (((GdkWindow *)win)->impl))
 
 /* Initialization */
 void _gdk_windowing_update_window_sizes     (GdkScreen *screen);
@@ -130,10 +130,6 @@ void       _gdk_quartz_event_loop_release_event (NSEvent *event);
 GdkEventType _gdk_quartz_keys_event_type  (NSEvent   *event);
 gboolean     _gdk_quartz_keys_is_modifier (guint      keycode);
 
-/* Drawable */
-void        _gdk_quartz_drawable_finish (GdkDrawable *drawable);
-void        _gdk_quartz_drawable_flush  (GdkDrawable *drawable);
-
 /* Geometry */
 void        _gdk_quartz_window_scroll      (GdkWindow       *window,
                                             gint             dx,
diff --git a/gdk/quartz/gdkwindow-quartz.c b/gdk/quartz/gdkwindow-quartz.c
index a27163c..c912e26 100644
--- a/gdk/quartz/gdkwindow-quartz.c
+++ b/gdk/quartz/gdkwindow-quartz.c
@@ -29,6 +29,9 @@
 #include "gdkscreen-quartz.h"
 #include "gdkinputprivate.h"
 
+#include <sys/time.h>
+#include <cairo-quartz.h>
+
 static gpointer parent_class;
 static gpointer root_window_parent_class;
 
@@ -37,6 +40,8 @@ static gboolean  in_process_all_updates = FALSE;
 
 static GSList *main_window_stack;
 
+void _gdk_quartz_window_flush (GdkWindowImplQuartz *window_impl);
+
 #define FULLSCREEN_DATA "fullscreen-data"
 
 typedef struct
@@ -57,39 +62,31 @@ static FullscreenSavedGeometry *get_fullscreen_geometry (GdkWindow *window);
    GDK_WINDOW_TYPE (window) != GDK_WINDOW_FOREIGN && \
    GDK_WINDOW_TYPE (window) != GDK_WINDOW_OFFSCREEN)
 
-static void gdk_window_impl_iface_init (GdkWindowImplIface *iface);
-
 NSView *
 gdk_quartz_window_get_nsview (GdkWindow *window)
 {
-  GdkWindowObject *private = (GdkWindowObject *)window;
-
   if (GDK_WINDOW_DESTROYED (window))
     return NULL;
 
-  return ((GdkWindowImplQuartz *)private->impl)->view;
+  return ((GdkWindowImplQuartz *)window->impl)->view;
 }
 
 NSWindow *
 gdk_quartz_window_get_nswindow (GdkWindow *window)
 {
-  GdkWindowObject *private = (GdkWindowObject *)window;
-
   if (GDK_WINDOW_DESTROYED (window))
     return NULL;
 
-  return ((GdkWindowImplQuartz *)private->impl)->toplevel;
+  return ((GdkWindowImplQuartz *)window->impl)->toplevel;
 }
 
 static CGContextRef
-gdk_window_impl_quartz_get_context (GdkDrawable *drawable,
-				    gboolean     antialias)
+gdk_window_impl_quartz_get_context (GdkWindowImplQuartz *window_impl,
+				    gboolean             antialias)
 {
-  GdkDrawableImplQuartz *drawable_impl = GDK_DRAWABLE_IMPL_QUARTZ (drawable);
-  GdkWindowImplQuartz *window_impl = GDK_WINDOW_IMPL_QUARTZ (drawable);
   CGContextRef cg_context;
 
-  if (GDK_WINDOW_DESTROYED (drawable_impl->wrapper))
+  if (GDK_WINDOW_DESTROYED (window_impl->wrapper))
     return NULL;
 
   /* Lock focus when not called as part of a drawRect call. This
@@ -143,18 +140,16 @@ gdk_window_impl_quartz_get_context (GdkDrawable *drawable,
 }
 
 static void
-gdk_window_impl_quartz_release_context (GdkDrawable  *drawable,
-                                        CGContextRef  cg_context)
+gdk_window_impl_quartz_release_context (GdkWindowImplQuartz *window_impl,
+                                        CGContextRef         cg_context)
 {
-  GdkWindowImplQuartz *window_impl = GDK_WINDOW_IMPL_QUARTZ (drawable);
-
   CGContextRestoreGState (cg_context);
   CGContextSetAllowsAntialiasing (cg_context, TRUE);
 
-  /* See comment in gdk_quartz_drawable_get_context(). */
+  /* See comment in gdk_quartz_window_get_context(). */
   if (window_impl->in_paint_rect_count == 0)
     {
-      _gdk_quartz_drawable_flush (drawable);
+      _gdk_quartz_window_flush (window_impl);
       [window_impl->view unlockFocus];
     }
 }
@@ -210,7 +205,7 @@ gdk_window_impl_quartz_finalize (GObject *object)
 {
   GdkWindowImplQuartz *impl = GDK_WINDOW_IMPL_QUARTZ (object);
 
-  check_grab_destroy (GDK_DRAWABLE_IMPL_QUARTZ (object)->wrapper);
+  check_grab_destroy (GDK_WINDOW_IMPL_QUARTZ (object)->wrapper);
 
   if (impl->paint_clip_region)
     cairo_region_destroy (impl->paint_clip_region);
@@ -221,18 +216,114 @@ gdk_window_impl_quartz_finalize (GObject *object)
   G_OBJECT_CLASS (parent_class)->finalize (object);
 }
 
+/* Help preventing "beam sync penalty" where CG makes all graphics code
+ * block until the next vsync if we try to flush (including call display on
+ * a view) too often. We do this by limiting the manual flushing done
+ * outside of expose calls to less than some frequency when measured over
+ * the last 4 flushes. This is a bit arbitray, but seems to make it possible
+ * for some quick manual flushes (such as gtkruler or gimp's marching ants)
+ * without hitting the max flush frequency.
+ *
+ * If drawable NULL, no flushing is done, only registering that a flush was
+ * done externally.
+ */
+void
+_gdk_quartz_window_flush (GdkWindowImplQuartz *window_impl)
+{
+  static struct timeval prev_tv;
+  static gint intervals[4];
+  static gint index;
+  struct timeval tv;
+  gint ms;
+
+  gettimeofday (&tv, NULL);
+  ms = (tv.tv_sec - prev_tv.tv_sec) * 1000 + (tv.tv_usec - prev_tv.tv_usec) / 1000;
+  intervals[index++ % 4] = ms;
+
+  if (window_impl)
+    {
+      ms = intervals[0] + intervals[1] + intervals[2] + intervals[3];
+
+      /* ~25Hz on average. */
+      if (ms > 4*40)
+        {
+          if (window_impl)
+            [window_impl->toplevel flushWindow];
+
+          prev_tv = tv;
+        }
+    }
+  else
+    prev_tv = tv;
+}
+
+static cairo_user_data_key_t gdk_quartz_cairo_key;
+
+typedef struct {
+  GdkWindowImplQuartz  *window_impl;
+  CGContextRef  cg_context;
+} GdkQuartzCairoSurfaceData;
+
 static void
-gdk_window_impl_quartz_class_init (GdkWindowImplQuartzClass *klass)
+gdk_quartz_cairo_surface_destroy (void *data)
 {
-  GObjectClass *object_class = G_OBJECT_CLASS (klass);
-  GdkDrawableImplQuartzClass *drawable_quartz_class = GDK_DRAWABLE_IMPL_QUARTZ_CLASS (klass);
+  GdkQuartzCairoSurfaceData *surface_data = data;
 
-  parent_class = g_type_class_peek_parent (klass);
+  surface_data->window_impl->cairo_surface = NULL;
 
-  object_class->finalize = gdk_window_impl_quartz_finalize;
+  gdk_quartz_window_release_context (surface_data->window_impl,
+                                     surface_data->cg_context);
 
-  drawable_quartz_class->get_context = gdk_window_impl_quartz_get_context;
-  drawable_quartz_class->release_context = gdk_window_impl_quartz_release_context;
+  g_free (surface_data);
+}
+
+static cairo_surface_t *
+gdk_quartz_create_cairo_surface (GdkWindowImplQuartz *impl,
+				 int                  width,
+				 int                  height)
+{
+  CGContextRef cg_context;
+  GdkQuartzCairoSurfaceData *surface_data;
+  cairo_surface_t *surface;
+
+  cg_context = gdk_quartz_window_get_context (impl, TRUE);
+
+  if (!cg_context)
+    return NULL;
+
+  surface_data = g_new (GdkQuartzCairoSurfaceData, 1);
+  surface_data->window_impl = impl;
+  surface_data->cg_context = cg_context;
+
+  surface = cairo_quartz_surface_create_for_cg_context (cg_context,
+                                                        width, height);
+
+  cairo_surface_set_user_data (surface, &gdk_quartz_cairo_key,
+                               surface_data,
+                               gdk_quartz_cairo_surface_destroy);
+
+  return surface;
+}
+
+static cairo_surface_t *
+gdk_quartz_ref_cairo_surface (GdkWindow *window)
+{
+  GdkWindowImplQuartz *impl = GDK_WINDOW_IMPL_QUARTZ (window->impl);
+
+  if (GDK_WINDOW_DESTROYED (window))
+    return NULL;
+
+  if (!impl->cairo_surface)
+    {
+      impl->cairo_surface = 
+          gdk_quartz_create_cairo_surface (impl,
+                                           gdk_window_get_width (impl->wrapper),
+                                           gdk_window_get_height (impl->wrapper));
+    }
+  else
+    cairo_surface_reference (impl->cairo_surface);
+
+  return impl->cairo_surface;
 }
 
 static void
@@ -247,16 +338,15 @@ gdk_window_impl_quartz_begin_paint_region (GdkPaintable    *paintable,
 					   const cairo_region_t *region)
 {
   GdkWindowImplQuartz *impl = GDK_WINDOW_IMPL_QUARTZ (paintable);
-  GdkWindowObject *private = (GdkWindowObject*) window;
   cairo_region_t *clipped_and_offset_region;
   cairo_t *cr;
 
   clipped_and_offset_region = cairo_region_copy (region);
 
   cairo_region_intersect (clipped_and_offset_region,
-                        private->clip_region_with_children);
+                        window->clip_region_with_children);
   cairo_region_translate (clipped_and_offset_region,
-                     private->abs_x, private->abs_y);
+                     window->abs_x, window->abs_y);
 
   if (impl->begin_paint_count == 0)
     impl->paint_clip_region = cairo_region_reference (clipped_and_offset_region);
@@ -270,19 +360,19 @@ gdk_window_impl_quartz_begin_paint_region (GdkPaintable    *paintable,
 
   cr = gdk_cairo_create (window);
 
-  cairo_translate (cr, -private->abs_x, -private->abs_y);
+  cairo_translate (cr, -window->abs_x, -window->abs_y);
 
   gdk_cairo_region (cr, clipped_and_offset_region);
   cairo_clip (cr);
 
-  while (private->background == NULL && private->parent)
+  while (window->background == NULL && window->parent)
     {
-      cairo_translate (cr, -private->x, private->y);
-      private = private->parent;
+      cairo_translate (cr, -window->x, window->y);
+      window = window->parent;
     }
   
-  if (private->background)
-    cairo_set_source (cr, private->background);
+  if (window->background)
+    cairo_set_source (cr, window->background);
   else
     cairo_set_source_rgba (cr, 0, 0, 0, 0);
 
@@ -313,12 +403,10 @@ void
 _gdk_quartz_window_set_needs_display_in_region (GdkWindow    *window,
                                                 cairo_region_t    *region)
 {
-  GdkWindowObject *private;
   GdkWindowImplQuartz *impl;
   int i, n_rects;
 
-  private = GDK_WINDOW_OBJECT (window);
-  impl = GDK_WINDOW_IMPL_QUARTZ (private->impl);
+  impl = GDK_WINDOW_IMPL_QUARTZ (window->impl);
 
   if (!impl->needs_display_region)
     impl->needs_display_region = cairo_region_create ();
@@ -349,12 +437,10 @@ _gdk_windowing_window_process_updates_recurse (GdkWindow *window,
       toplevel = gdk_window_get_effective_toplevel (window);
       if (toplevel && WINDOW_IS_TOPLEVEL (toplevel))
         {
-          GdkWindowObject *toplevel_private;
           GdkWindowImplQuartz *toplevel_impl;
           NSWindow *nswindow;
 
-          toplevel_private = (GdkWindowObject *)toplevel;
-          toplevel_impl = (GdkWindowImplQuartz *)toplevel_private->impl;
+          toplevel_impl = (GdkWindowImplQuartz *)toplevel->impl;
           nswindow = toplevel_impl->toplevel;
 
           /* In theory, we could skip the flush disabling, since we only
@@ -402,7 +488,7 @@ _gdk_windowing_after_process_all_updates (void)
 
       [[nswindow contentView] displayIfNeeded];
 
-      _gdk_quartz_drawable_flush (NULL);
+      _gdk_quartz_window_flush (NULL);
 
       [nswindow enableFlushWindow];
       [nswindow flushWindow];
@@ -425,54 +511,6 @@ gdk_window_impl_quartz_paintable_init (GdkPaintableIface *iface)
   iface->end_paint = gdk_window_impl_quartz_end_paint;
 }
 
-GType
-_gdk_window_impl_quartz_get_type (void)
-{
-  static GType object_type = 0;
-
-  if (!object_type)
-    {
-      const GTypeInfo object_info =
-	{
-	  sizeof (GdkWindowImplQuartzClass),
-	  (GBaseInitFunc) NULL,
-	  (GBaseFinalizeFunc) NULL,
-	  (GClassInitFunc) gdk_window_impl_quartz_class_init,
-	  NULL,           /* class_finalize */
-	  NULL,           /* class_data */
-	  sizeof (GdkWindowImplQuartz),
-	  0,              /* n_preallocs */
-	  (GInstanceInitFunc) gdk_window_impl_quartz_init,
-	};
-
-      const GInterfaceInfo paintable_info = 
-	{
-	  (GInterfaceInitFunc) gdk_window_impl_quartz_paintable_init,
-	  NULL,
-	  NULL
-	};
-
-      const GInterfaceInfo window_impl_info = 
-	{
-	  (GInterfaceInitFunc) gdk_window_impl_iface_init,
-	  NULL,
-	  NULL
-	};
-
-      object_type = g_type_register_static (GDK_TYPE_DRAWABLE_IMPL_QUARTZ,
-                                            "GdkWindowImplQuartz",
-                                            &object_info, 0);
-      g_type_add_interface_static (object_type,
-				   GDK_TYPE_PAINTABLE,
-				   &paintable_info);
-      g_type_add_interface_static (object_type,
-				   GDK_TYPE_WINDOW_IMPL,
-				   &window_impl_info);
-    }
-
-  return object_type;
-}
-
 static const gchar *
 get_default_title (void)
 {
@@ -493,15 +531,12 @@ get_ancestor_coordinates_from_child (GdkWindow *child_window,
 				     gint      *ancestor_x, 
 				     gint      *ancestor_y)
 {
-  GdkWindowObject *child_private = GDK_WINDOW_OBJECT (child_window);
-  GdkWindowObject *ancestor_private = GDK_WINDOW_OBJECT (ancestor_window);
-
-  while (child_private != ancestor_private)
+  while (child_window != ancestor_window)
     {
-      child_x += child_private->x;
-      child_y += child_private->y;
+      child_x += child_window->x;
+      child_y += child_window->y;
 
-      child_private = child_private->parent;
+      child_window = child_window->parent;
     }
 
   *ancestor_x = child_x;
@@ -511,7 +546,6 @@ get_ancestor_coordinates_from_child (GdkWindow *child_window,
 void
 _gdk_quartz_window_debug_highlight (GdkWindow *window, gint number)
 {
-  GdkWindowObject *private = GDK_WINDOW_OBJECT (window);
   gint x, y;
   gint gx, gy;
   GdkWindow *toplevel;
@@ -542,10 +576,10 @@ _gdk_quartz_window_debug_highlight (GdkWindow *window, gint number)
   x += tx;
   y += ty;
 
-  _gdk_quartz_window_gdk_xy_to_xy (x, y + private->height,
+  _gdk_quartz_window_gdk_xy_to_xy (x, y + window->height,
                                    &gx, &gy);
 
-  rect = NSMakeRect (gx, gy, private->width, private->height);
+  rect = NSMakeRect (gx, gy, window->width, window->height);
 
   if (debug_window[number] && NSEqualRects (rect, old_rect[number]))
     return;
@@ -659,22 +693,22 @@ find_child_window_helper (GdkWindow *window,
   GdkWindowImplQuartz *impl;
   GList *l;
 
-  impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (window)->impl);
+  impl = GDK_WINDOW_IMPL_QUARTZ (window->impl);
 
   if (window == _gdk_root)
     update_toplevel_order ();
 
   for (l = impl->sorted_children; l; l = l->next)
     {
-      GdkWindowObject *child_private = l->data;
-      GdkWindowImplQuartz *child_impl = GDK_WINDOW_IMPL_QUARTZ (child_private->impl);
+      GdkWindow *child = l->data;
+      GdkWindowImplQuartz *child_impl = GDK_WINDOW_IMPL_QUARTZ (child->impl);
       int temp_x, temp_y;
 
-      if (!GDK_WINDOW_IS_MAPPED (child_private))
+      if (!GDK_WINDOW_IS_MAPPED (child))
 	continue;
 
-      temp_x = x_offset + child_private->x;
-      temp_y = y_offset + child_private->y;
+      temp_x = x_offset + child->x;
+      temp_y = y_offset + child->y;
 
       /* Special-case the root window. We have to include the title
        * bar in the checks, otherwise the window below the title bar
@@ -698,7 +732,7 @@ find_child_window_helper (GdkWindow *window,
 
           if (titlebar_height > 0 &&
               x >= temp_x && y >= temp_y - titlebar_height &&
-              x < temp_x + child_private->width && y < temp_y)
+              x < temp_x + child->width && y < temp_y)
             {
               /* The root means "unknown" i.e. a window not managed by
                * GDK.
@@ -709,7 +743,7 @@ find_child_window_helper (GdkWindow *window,
 
       if ((!get_toplevel || (get_toplevel && window == _gdk_root)) &&
           x >= temp_x && y >= temp_y &&
-	  x < temp_x + child_private->width && y < temp_y + child_private->height)
+	  x < temp_x + child->width && y < temp_y + child->height)
 	{
 	  /* Look for child windows. */
 	  return find_child_window_helper (l->data,
@@ -732,9 +766,7 @@ _gdk_quartz_window_find_child (GdkWindow *window,
 			       gint       y,
                                gboolean   get_toplevel)
 {
-  GdkWindowObject *private = GDK_WINDOW_OBJECT (window);
-
-  if (x >= 0 && y >= 0 && x < private->width && y < private->height)
+  if (x >= 0 && y >= 0 && x < window->width && y < window->height)
     return find_child_window_helper (window, x, y, 0, 0, get_toplevel);
 
   return NULL;
@@ -746,7 +778,7 @@ _gdk_quartz_window_did_become_main (GdkWindow *window)
 {
   main_window_stack = g_slist_remove (main_window_stack, window);
 
-  if (GDK_WINDOW_OBJECT (window)->window_type != GDK_WINDOW_TEMP)
+  if (window->window_type != GDK_WINDOW_TEMP)
     main_window_stack = g_slist_prepend (main_window_stack, window);
 
   clear_toplevel_order ();
@@ -774,8 +806,7 @@ _gdk_quartz_window_did_resign_main (GdkWindow *window)
       GDK_WINDOW_IS_MAPPED (new_window) &&
       WINDOW_IS_TOPLEVEL (new_window))
     {
-      GdkWindowObject *private = (GdkWindowObject *) new_window;
-      GdkWindowImplQuartz *impl = GDK_WINDOW_IMPL_QUARTZ (private->impl);
+      GdkWindowImplQuartz *impl = GDK_WINDOW_IMPL_QUARTZ (new_window->impl);
 
       [impl->toplevel makeKeyAndOrderFront:impl->toplevel];
     }
@@ -819,35 +850,30 @@ _gdk_window_impl_new (GdkWindow     *window,
 		      GdkWindowAttr *attributes,
 		      gint           attributes_mask)
 {
-  GdkWindowObject *private;
   GdkWindowImplQuartz *impl;
-  GdkDrawableImplQuartz *draw_impl;
   GdkWindowImplQuartz *parent_impl;
 
   GDK_QUARTZ_ALLOC_POOL;
 
-  private = (GdkWindowObject *)window;
-
   impl = g_object_new (GDK_TYPE_WINDOW_IMPL_QUARTZ, NULL);
-  private->impl = (GdkDrawable *)impl;
-  draw_impl = GDK_DRAWABLE_IMPL_QUARTZ (impl);
-  draw_impl->wrapper = GDK_DRAWABLE (window);
+  window->impl = GDK_WINDOW_IMPL (impl);
+  impl->wrapper = window;
 
-  parent_impl = GDK_WINDOW_IMPL_QUARTZ (private->parent->impl);
+  parent_impl = GDK_WINDOW_IMPL_QUARTZ (window->parent->impl);
 
-  switch (private->window_type)
+  switch (window->window_type)
     {
     case GDK_WINDOW_TOPLEVEL:
     case GDK_WINDOW_TEMP:
-      if (GDK_WINDOW_TYPE (private->parent) != GDK_WINDOW_ROOT)
+      if (GDK_WINDOW_TYPE (window->parent) != GDK_WINDOW_ROOT)
 	{
 	  /* The common code warns for this case */
-          parent_impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (_gdk_root)->impl);
+          parent_impl = GDK_WINDOW_IMPL_QUARTZ (_gdk_root->impl);
 	}
     }
 
   /* Maintain the z-ordered list of children. */
-  if (private->parent != (GdkWindowObject *)_gdk_root)
+  if (window->parent != _gdk_root)
     parent_impl->sorted_children = g_list_prepend (parent_impl->sorted_children, window);
   else
     clear_toplevel_order ();
@@ -875,16 +901,16 @@ _gdk_window_impl_new (GdkWindow     *window,
          * to find the screen the window will be on and correct the
          * content_rect coordinates to be relative to that screen.
          */
-        _gdk_quartz_window_gdk_xy_to_xy (private->x, private->y, &nx, &ny);
+        _gdk_quartz_window_gdk_xy_to_xy (window->x, window->y, &nx, &ny);
 
         screen = get_nsscreen_for_point (nx, ny);
         screen_rect = [screen frame];
         nx -= screen_rect.origin.x;
         ny -= screen_rect.origin.y;
 
-        content_rect = NSMakeRect (nx, ny - private->height,
-                                   private->width,
-                                   private->height);
+        content_rect = NSMakeRect (nx, ny - window->height,
+                                   window->width,
+                                   window->height);
 
         if (attributes->window_type == GDK_WINDOW_TEMP ||
             attributes->type_hint == GDK_WINDOW_TYPE_HINT_SPLASHSCREEN)
@@ -930,14 +956,14 @@ _gdk_window_impl_new (GdkWindow     *window,
 
     case GDK_WINDOW_CHILD:
       {
-	GdkWindowImplQuartz *parent_impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (private->parent)->impl);
+	GdkWindowImplQuartz *parent_impl = GDK_WINDOW_IMPL_QUARTZ (window->parent->impl);
 
-	if (!private->input_only)
+	if (!window->input_only)
 	  {
-	    NSRect frame_rect = NSMakeRect (private->x + private->parent->abs_x,
-                                            private->y + private->parent->abs_y,
-                                            private->width,
-                                            private->height);
+	    NSRect frame_rect = NSMakeRect (window->x + window->parent->abs_x,
+                                            window->y + window->parent->abs_y,
+                                            window->width,
+                                            window->height);
 	
 	    impl->view = [[GdkQuartzView alloc] initWithFrame:frame_rect];
 	    
@@ -966,8 +992,7 @@ _gdk_quartz_window_update_position (GdkWindow *window)
 {
   NSRect frame_rect;
   NSRect content_rect;
-  GdkWindowObject *private = (GdkWindowObject *)window;
-  GdkWindowImplQuartz *impl = GDK_WINDOW_IMPL_QUARTZ (private->impl);
+  GdkWindowImplQuartz *impl = GDK_WINDOW_IMPL_QUARTZ (window->impl);
 
   GDK_QUARTZ_ALLOC_POOL;
 
@@ -976,7 +1001,7 @@ _gdk_quartz_window_update_position (GdkWindow *window)
 
   _gdk_quartz_window_xy_to_gdk_xy (content_rect.origin.x,
                                    content_rect.origin.y + content_rect.size.height,
-                                   &private->x, &private->y);
+                                   &window->x, &window->y);
 
 
   GDK_QUARTZ_RELEASE_POOL;
@@ -986,7 +1011,6 @@ void
 _gdk_windowing_update_window_sizes (GdkScreen *screen)
 {
   GList *windows, *list;
-  GdkWindowObject *private = (GdkWindowObject *)_gdk_root;
 
   /* The size of the root window is so that it can contain all
    * monitors attached to this machine.  The monitors are laid out
@@ -995,12 +1019,12 @@ _gdk_windowing_update_window_sizes (GdkScreen *screen)
    *
    * This data is updated when the monitor configuration is changed.
    */
-  private->x = 0;
-  private->y = 0;
-  private->abs_x = 0;
-  private->abs_y = 0;
-  private->width = gdk_screen_get_width (screen);
-  private->height = gdk_screen_get_height (screen);
+  _gdk_root->x = 0;
+  _gdk_root->y = 0;
+  _gdk_root->abs_x = 0;
+  _gdk_root->abs_y = 0;
+  _gdk_root->width = gdk_screen_get_width (screen);
+  _gdk_root->height = gdk_screen_get_height (screen);
 
   windows = gdk_screen_get_toplevel_windows (screen);
 
@@ -1013,31 +1037,26 @@ _gdk_windowing_update_window_sizes (GdkScreen *screen)
 void
 _gdk_windowing_window_init (void)
 {
-  GdkWindowObject *private;
   GdkWindowImplQuartz *impl;
-  GdkDrawableImplQuartz *drawable_impl;
 
   g_assert (_gdk_root == NULL);
 
   _gdk_root = g_object_new (GDK_TYPE_WINDOW, NULL);
 
-  private = (GdkWindowObject *)_gdk_root;
-  private->impl = g_object_new (_gdk_root_window_impl_quartz_get_type (), NULL);
-  private->impl_window = private;
-  private->visual = gdk_screen_get_system_visual (_gdk_screen);
+  _gdk_root->impl = g_object_new (_gdk_root_window_impl_quartz_get_type (), NULL);
+  _gdk_root->impl_window = _gdk_root;
+  _gdk_root->visual = gdk_screen_get_system_visual (_gdk_screen);
 
-  impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (_gdk_root)->impl);
+  impl = GDK_WINDOW_IMPL_QUARTZ (_gdk_root->impl);
 
   _gdk_windowing_update_window_sizes (_gdk_screen);
 
-  private->state = 0; /* We don't want GDK_WINDOW_STATE_WITHDRAWN here */
-  private->window_type = GDK_WINDOW_ROOT;
-  private->depth = 24;
-  private->viewable = TRUE;
+  _gdk_root->state = 0; /* We don't want GDK_WINDOW_STATE_WITHDRAWN here */
+  _gdk_root->window_type = GDK_WINDOW_ROOT;
+  _gdk_root->depth = 24;
+  _gdk_root->viewable = TRUE;
 
-  drawable_impl = GDK_DRAWABLE_IMPL_QUARTZ (private->impl);
-  
-  drawable_impl->wrapper = GDK_DRAWABLE (private);
+  impl->wrapper = _gdk_root;
 }
 
 static void
@@ -1045,19 +1064,17 @@ _gdk_quartz_window_destroy (GdkWindow *window,
                             gboolean   recursing,
                             gboolean   foreign_destroy)
 {
-  GdkWindowObject *private;
   GdkWindowImplQuartz *impl;
-  GdkWindowObject *parent;
+  GdkWindow *parent;
 
-  private = GDK_WINDOW_OBJECT (window);
-  impl = GDK_WINDOW_IMPL_QUARTZ (private->impl);
+  impl = GDK_WINDOW_IMPL_QUARTZ (window->impl);
 
   main_window_stack = g_slist_remove (main_window_stack, window);
 
   g_list_free (impl->sorted_children);
   impl->sorted_children = NULL;
 
-  parent = private->parent;
+  parent = window->parent;
   if (parent)
     {
       GdkWindowImplQuartz *parent_impl = GDK_WINDOW_IMPL_QUARTZ (parent->impl);
@@ -1065,7 +1082,13 @@ _gdk_quartz_window_destroy (GdkWindow *window,
       parent_impl->sorted_children = g_list_remove (parent_impl->sorted_children, window);
     }
 
-  _gdk_quartz_drawable_finish (GDK_DRAWABLE (impl));
+  if (impl->cairo_surface)
+    {
+      cairo_surface_finish (impl->cairo_surface);
+      cairo_surface_set_user_data (impl->cairo_surface, &gdk_quartz_cairo_key,
+				   NULL, NULL);
+      impl->cairo_surface = NULL;
+    }
 
   if (!recursing && !foreign_destroy)
     {
@@ -1104,14 +1127,13 @@ _gdk_windowing_window_destroy_foreign (GdkWindow *window)
 static void
 gdk_window_quartz_show (GdkWindow *window, gboolean already_mapped)
 {
-  GdkWindowObject *private = (GdkWindowObject *)window;
-  GdkWindowImplQuartz *impl = GDK_WINDOW_IMPL_QUARTZ (private->impl);
+  GdkWindowImplQuartz *impl = GDK_WINDOW_IMPL_QUARTZ (window->impl);
   gboolean focus_on_map;
 
   GDK_QUARTZ_ALLOC_POOL;
 
   if (!GDK_WINDOW_IS_MAPPED (window))
-    focus_on_map = private->focus_on_map;
+    focus_on_map = window->focus_on_map;
   else
     focus_on_map = TRUE;
 
@@ -1119,8 +1141,8 @@ gdk_window_quartz_show (GdkWindow *window, gboolean already_mapped)
     {
       gboolean make_key;
 
-      make_key = (private->accept_focus && focus_on_map &&
-                  private->window_type != GDK_WINDOW_TEMP);
+      make_key = (window->accept_focus && focus_on_map &&
+                  window->window_type != GDK_WINDOW_TEMP);
 
       [(GdkQuartzWindow*)impl->toplevel showAndMakeKey:make_key];
       clear_toplevel_order ();
@@ -1136,10 +1158,10 @@ gdk_window_quartz_show (GdkWindow *window, gboolean already_mapped)
 
   gdk_synthesize_window_state (window, GDK_WINDOW_STATE_WITHDRAWN, 0);
 
-  if (private->state & GDK_WINDOW_STATE_MAXIMIZED)
+  if (window->state & GDK_WINDOW_STATE_MAXIMIZED)
     gdk_window_maximize (window);
 
-  if (private->state & GDK_WINDOW_STATE_ICONIFIED)
+  if (window->state & GDK_WINDOW_STATE_ICONIFIED)
     gdk_window_iconify (window);
 
   if (impl->transient_for && !GDK_WINDOW_DESTROYED (impl->transient_for))
@@ -1158,7 +1180,7 @@ _gdk_quartz_window_detach_from_parent (GdkWindow *window)
 
   g_return_if_fail (GDK_IS_WINDOW (window));
 
-  impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (window)->impl);
+  impl = GDK_WINDOW_IMPL_QUARTZ (window->impl);
   
   g_return_if_fail (impl->toplevel != NULL);
 
@@ -1166,7 +1188,7 @@ _gdk_quartz_window_detach_from_parent (GdkWindow *window)
     {
       GdkWindowImplQuartz *parent_impl;
 
-      parent_impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (impl->transient_for)->impl);
+      parent_impl = GDK_WINDOW_IMPL_QUARTZ (impl->transient_for->impl);
       [parent_impl->toplevel removeChildWindow:impl->toplevel];
       clear_toplevel_order ();
     }
@@ -1180,7 +1202,7 @@ _gdk_quartz_window_attach_to_parent (GdkWindow *window)
 
   g_return_if_fail (GDK_IS_WINDOW (window));
 
-  impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (window)->impl);
+  impl = GDK_WINDOW_IMPL_QUARTZ (window->impl);
   
   g_return_if_fail (impl->toplevel != NULL);
 
@@ -1188,7 +1210,7 @@ _gdk_quartz_window_attach_to_parent (GdkWindow *window)
     {
       GdkWindowImplQuartz *parent_impl;
 
-      parent_impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (impl->transient_for)->impl);
+      parent_impl = GDK_WINDOW_IMPL_QUARTZ (impl->transient_for->impl);
       [parent_impl->toplevel addChildWindow:impl->toplevel ordered:NSWindowAbove];
       clear_toplevel_order ();
     }
@@ -1197,7 +1219,6 @@ _gdk_quartz_window_attach_to_parent (GdkWindow *window)
 void
 gdk_window_quartz_hide (GdkWindow *window)
 {
-  GdkWindowObject *private = (GdkWindowObject *)window;
   GdkWindowImplQuartz *impl;
 
   /* Make sure we're not stuck in fullscreen mode. */
@@ -1208,7 +1229,7 @@ gdk_window_quartz_hide (GdkWindow *window)
 
   _gdk_window_clear_update_area (window);
 
-  impl = GDK_WINDOW_IMPL_QUARTZ (private->impl);
+  impl = GDK_WINDOW_IMPL_QUARTZ (window->impl);
 
   if (WINDOW_IS_TOPLEVEL (window)) 
     {
@@ -1241,7 +1262,6 @@ move_resize_window_internal (GdkWindow *window,
 			     gint       width,
 			     gint       height)
 {
-  GdkWindowObject *private = (GdkWindowObject *)window;
   GdkWindowImplQuartz *impl;
   GdkRectangle old_visible;
   GdkRectangle new_visible;
@@ -1253,12 +1273,12 @@ move_resize_window_internal (GdkWindow *window,
   if (GDK_WINDOW_DESTROYED (window))
     return;
 
-  impl = GDK_WINDOW_IMPL_QUARTZ (private->impl);
+  impl = GDK_WINDOW_IMPL_QUARTZ (window->impl);
 
-  if ((x == -1 || (x == private->x)) &&
-      (y == -1 || (y == private->y)) &&
-      (width == -1 || (width == private->width)) &&
-      (height == -1 || (height == private->height)))
+  if ((x == -1 || (x == window->x)) &&
+      (y == -1 || (y == window->y)) &&
+      (width == -1 || (width == window->width)) &&
+      (height == -1 || (height == window->height)))
     {
       return;
     }
@@ -1268,17 +1288,17 @@ move_resize_window_internal (GdkWindow *window,
       /* The previously visible area of this window in a coordinate
        * system rooted at the origin of this window.
        */
-      old_visible.x = -private->x;
-      old_visible.y = -private->y;
+      old_visible.x = -window->x;
+      old_visible.y = -window->y;
 
-      old_visible.width = private->width;
-      old_visible.height = private->height;
+      old_visible.width = window->width;
+      old_visible.height = window->height;
     }
 
   if (x != -1)
     {
-      delta.width = x - private->x;
-      private->x = x;
+      delta.width = x - window->x;
+      window->x = x;
     }
   else
     {
@@ -1287,8 +1307,8 @@ move_resize_window_internal (GdkWindow *window,
 
   if (y != -1)
     {
-      delta.height = y - private->y;
-      private->y = y;
+      delta.height = y - window->y;
+      window->y = y;
     }
   else
     {
@@ -1296,10 +1316,10 @@ move_resize_window_internal (GdkWindow *window,
     }
 
   if (width != -1)
-    private->width = width;
+    window->width = width;
 
   if (height != -1)
-    private->height = height;
+    window->height = height;
 
   GDK_QUARTZ_ALLOC_POOL;
 
@@ -1309,27 +1329,27 @@ move_resize_window_internal (GdkWindow *window,
       NSRect frame_rect;
       gint gx, gy;
 
-      _gdk_quartz_window_gdk_xy_to_xy (private->x, private->y + private->height,
+      _gdk_quartz_window_gdk_xy_to_xy (window->x, window->y + window->height,
                                        &gx, &gy);
 
-      content_rect = NSMakeRect (gx, gy, private->width, private->height);
+      content_rect = NSMakeRect (gx, gy, window->width, window->height);
 
       frame_rect = [impl->toplevel frameRectForContentRect:content_rect];
       [impl->toplevel setFrame:frame_rect display:YES];
     }
   else 
     {
-      if (!private->input_only)
+      if (!window->input_only)
         {
           NSRect nsrect;
 
-          nsrect = NSMakeRect (private->x, private->y, private->width, private->height);
+          nsrect = NSMakeRect (window->x, window->y, window->width, window->height);
 
           /* The newly visible area of this window in a coordinate
            * system rooted at the origin of this window.
            */
-          new_visible.x = -private->x;
-          new_visible.y = -private->y;
+          new_visible.x = -window->x;
+          new_visible.y = -window->y;
           new_visible.width = old_visible.width;   /* parent has not changed size */
           new_visible.height = old_visible.height; /* parent has not changed size */
 
@@ -1381,7 +1401,7 @@ window_quartz_move (GdkWindow *window,
 {
   g_return_if_fail (GDK_IS_WINDOW (window));
 
-  if (((GdkWindowObject *)window)->state & GDK_WINDOW_STATE_FULLSCREEN)
+  if (window->state & GDK_WINDOW_STATE_FULLSCREEN)
     return;
 
   move_resize_window_internal (window, x, y, -1, -1);
@@ -1394,7 +1414,7 @@ window_quartz_resize (GdkWindow *window,
 {
   g_return_if_fail (GDK_IS_WINDOW (window));
 
-  if (((GdkWindowObject *)window)->state & GDK_WINDOW_STATE_FULLSCREEN)
+  if (window->state & GDK_WINDOW_STATE_FULLSCREEN)
     return;
 
   if (width < 1)
@@ -1448,7 +1468,7 @@ gdk_window_quartz_reparent (GdkWindow *window,
                             gint       x,
                             gint       y)
 {
-  GdkWindowObject *private, *old_parent_private, *new_parent_private;
+  GdkWindow *old_parent;
   GdkWindowImplQuartz *impl, *old_parent_impl, *new_parent_impl;
   NSView *view, *new_parent_view;
 
@@ -1459,16 +1479,14 @@ gdk_window_quartz_reparent (GdkWindow *window,
       return FALSE;
     }
 
-  private = GDK_WINDOW_OBJECT (window);
-  impl = GDK_WINDOW_IMPL_QUARTZ (private->impl);
+  impl = GDK_WINDOW_IMPL_QUARTZ (window->impl);
   view = impl->view;
 
-  new_parent_private = GDK_WINDOW_OBJECT (new_parent);
-  new_parent_impl = GDK_WINDOW_IMPL_QUARTZ (new_parent_private->impl);
+  new_parent_impl = GDK_WINDOW_IMPL_QUARTZ (new_parent->impl);
   new_parent_view = new_parent_impl->view;
 
-  old_parent_private = GDK_WINDOW_OBJECT (private->parent);
-  old_parent_impl = GDK_WINDOW_IMPL_QUARTZ (old_parent_private->impl);
+  old_parent = window->parent;
+  old_parent_impl = GDK_WINDOW_IMPL_QUARTZ (old_parent->impl);
 
   [view retain];
 
@@ -1477,9 +1495,9 @@ gdk_window_quartz_reparent (GdkWindow *window,
 
   [view release];
 
-  private->parent = new_parent_private;
+  window->parent = new_parent;
 
-  if (old_parent_private)
+  if (old_parent)
     {
       old_parent_impl->sorted_children = g_list_remove (old_parent_impl->sorted_children, window);
     }
@@ -1496,14 +1514,12 @@ gdk_window_quartz_reparent (GdkWindow *window,
 static void
 update_toplevel_order (void)
 {
-  GdkWindowObject *root;
   GdkWindowImplQuartz *root_impl;
   NSEnumerator *enumerator;
   id nswindow;
   GList *toplevels = NULL;
 
-  root = GDK_WINDOW_OBJECT (_gdk_root);
-  root_impl = GDK_WINDOW_IMPL_QUARTZ (root->impl);
+  root_impl = GDK_WINDOW_IMPL_QUARTZ (_gdk_root->impl);
 
   if (root_impl->sorted_children)
     return;
@@ -1530,11 +1546,9 @@ update_toplevel_order (void)
 static void
 clear_toplevel_order (void)
 {
-  GdkWindowObject *root;
   GdkWindowImplQuartz *root_impl;
 
-  root = GDK_WINDOW_OBJECT (_gdk_root);
-  root_impl = GDK_WINDOW_IMPL_QUARTZ (root->impl);
+  root_impl = GDK_WINDOW_IMPL_QUARTZ (_gdk_root->impl);
 
   g_list_free (root_impl->sorted_children);
   root_impl->sorted_children = NULL;
@@ -1550,14 +1564,14 @@ gdk_window_quartz_raise (GdkWindow *window)
     {
       GdkWindowImplQuartz *impl;
 
-      impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (window)->impl);
+      impl = GDK_WINDOW_IMPL_QUARTZ (window->impl);
       [impl->toplevel orderFront:impl->toplevel];
 
       clear_toplevel_order ();
     }
   else
     {
-      GdkWindowObject *parent = GDK_WINDOW_OBJECT (window)->parent;
+      GdkWindow *parent = window->parent;
 
       if (parent)
         {
@@ -1581,14 +1595,14 @@ gdk_window_quartz_lower (GdkWindow *window)
     {
       GdkWindowImplQuartz *impl;
 
-      impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (window)->impl);
+      impl = GDK_WINDOW_IMPL_QUARTZ (window->impl);
       [impl->toplevel orderBack:impl->toplevel];
 
       clear_toplevel_order ();
     }
   else
     {
-      GdkWindowObject *parent = GDK_WINDOW_OBJECT (window)->parent;
+      GdkWindow *parent = window->parent;
 
       if (parent)
         {
@@ -1648,14 +1662,12 @@ gdk_window_quartz_get_geometry (GdkWindow *window,
                                 gint      *height)
 {
   GdkWindowImplQuartz *impl;
-  GdkWindowObject *private;
   NSRect ns_rect;
 
   if (GDK_WINDOW_DESTROYED (window))
     return;
 
-  impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (window)->impl);
-  private = GDK_WINDOW_OBJECT (window);
+  impl = GDK_WINDOW_IMPL_QUARTZ (window->impl);
   if (window == _gdk_root)
     {
       if (x) 
@@ -1664,9 +1676,9 @@ gdk_window_quartz_get_geometry (GdkWindow *window,
         *y = 0;
 
       if (width) 
-        *width = private->width;
+        *width = window->width;
       if (height)
-        *height = private->height;
+        *height = window->height;
     }
   else if (WINDOW_IS_TOPLEVEL (window))
     {
@@ -1721,7 +1733,6 @@ gdk_window_quartz_get_root_coords (GdkWindow *window,
                                    gint      *root_x,
                                    gint      *root_y)
 {
-  GdkWindowObject *private;
   int tmp_x = 0, tmp_y = 0;
   GdkWindow *toplevel;
   NSRect content_rect;
@@ -1747,10 +1758,8 @@ gdk_window_quartz_get_root_coords (GdkWindow *window,
       return 1;
     }
   
-  private = GDK_WINDOW_OBJECT (window);
-
   toplevel = gdk_window_get_toplevel (window);
-  impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (toplevel)->impl);
+  impl = GDK_WINDOW_IMPL_QUARTZ (toplevel->impl);
 
   content_rect = [impl->toplevel contentRectForFrameRect:[impl->toplevel frame]];
 
@@ -1761,15 +1770,15 @@ gdk_window_quartz_get_root_coords (GdkWindow *window,
   tmp_x += x;
   tmp_y += y;
 
-  while (private != GDK_WINDOW_OBJECT (toplevel))
+  while (window != toplevel)
     {
-      if (_gdk_window_has_impl ((GdkWindow *)private))
+      if (_gdk_window_has_impl ((GdkWindow *)window))
         {
-          tmp_x += private->x;
-          tmp_y += private->y;
+          tmp_x += window->x;
+          tmp_y += window->y;
         }
 
-      private = private->parent;
+      window = window->parent;
     }
 
   if (root_x)
@@ -1807,10 +1816,9 @@ gdk_window_quartz_get_device_state_helper (GdkWindow       *window,
                                            gint            *y,
                                            GdkModifierType *mask)
 {
-  GdkWindowObject *toplevel;
-  GdkWindowObject *private;
   NSPoint point;
   gint x_tmp, y_tmp;
+  GdkWindow *toplevel;
   GdkWindow *found_window;
 
   g_return_val_if_fail (window == NULL || GDK_IS_WINDOW (window), NULL);
@@ -1823,7 +1831,7 @@ gdk_window_quartz_get_device_state_helper (GdkWindow       *window,
       return NULL;
     }
   
-  toplevel = GDK_WINDOW_OBJECT (gdk_window_get_toplevel (window));
+  toplevel = gdk_window_get_toplevel (window);
 
   *mask = _gdk_quartz_events_get_current_event_mask ();
 
@@ -1839,13 +1847,12 @@ gdk_window_quartz_get_device_state_helper (GdkWindow       *window,
       NSWindow *nswindow;
 
       impl = GDK_WINDOW_IMPL_QUARTZ (toplevel->impl);
-      private = GDK_WINDOW_OBJECT (toplevel);
       nswindow = impl->toplevel;
 
       point = [nswindow mouseLocationOutsideOfEventStream];
 
       x_tmp = point.x;
-      y_tmp = private->height - point.y;
+      y_tmp = toplevel->height - point.y;
 
       window = (GdkWindow *)toplevel;
     }
@@ -1917,18 +1924,15 @@ _gdk_windowing_window_at_pointer (GdkDisplay      *display,
                                                             &tmp_mask);
   if (found_window)
     {
-      GdkWindowObject *private;
-
       /* The coordinates returned above are relative the root, we want
        * coordinates relative the window here. 
        */
-      private = GDK_WINDOW_OBJECT (found_window);
-      while (private != GDK_WINDOW_OBJECT (_gdk_root))
+      while (found_window != _gdk_root)
 	{
-	  x -= private->x;
-	  y -= private->y;
+	  x -= found_window->x;
+	  y -= found_window->y;
 	  
-	  private = private->parent;
+	  found_window = found_window->parent;
 	}
 
       *win_x = x;
@@ -1946,21 +1950,19 @@ _gdk_windowing_window_at_pointer (GdkDisplay      *display,
 
   if (get_toplevel)
     {
-      GdkWindowObject *w = (GdkWindowObject *)found_window;
       /* Requested toplevel, find it. */
       /* TODO: This can be implemented more efficient by never
 	 recursing into children in the first place */
-      if (w)
+      if (found_window)
 	{
 	  /* Convert to toplevel */
-	  while (w->parent != NULL &&
-		 w->parent->window_type != GDK_WINDOW_ROOT)
+	  while (found_window->parent != NULL &&
+		 found_window->parent->window_type != GDK_WINDOW_ROOT)
 	    {
-	      *win_x += w->x;
-	      *win_y += w->y;
-	      w = w->parent;
+	      *win_x += found_window->x;
+	      *win_y += found_window->y;
+	      found_window = found_window->parent;
 	    }
-	  found_window = (GdkWindow *)w;
 	}
     }
 
@@ -1988,7 +1990,7 @@ gdk_window_quartz_get_events (GdkWindow *window)
   if (GDK_WINDOW_DESTROYED (window))
     return 0;
   else
-    return GDK_WINDOW_OBJECT (window)->event_mask;
+    return window->event_mask;
 }
 
 static void
@@ -2022,7 +2024,7 @@ gdk_window_set_geometry_hints (GdkWindow         *window,
       !WINDOW_IS_TOPLEVEL (window))
     return;
   
-  impl = GDK_WINDOW_IMPL_QUARTZ (((GdkWindowObject *) window)->impl);
+  impl = GDK_WINDOW_IMPL_QUARTZ (window->impl);
   if (!impl->toplevel)
     return;
 
@@ -2099,7 +2101,7 @@ gdk_window_set_title (GdkWindow   *window,
       !WINDOW_IS_TOPLEVEL (window))
     return;
 
-  impl = GDK_WINDOW_IMPL_QUARTZ (((GdkWindowObject *)window)->impl);
+  impl = GDK_WINDOW_IMPL_QUARTZ (window->impl);
 
   if (impl->toplevel)
     {
@@ -2131,7 +2133,7 @@ gdk_window_set_transient_for (GdkWindow *window,
       !WINDOW_IS_TOPLEVEL (window))
     return;
 
-  window_impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (window)->impl);
+  window_impl = GDK_WINDOW_IMPL_QUARTZ (window->impl);
   if (!window_impl->toplevel)
     return;
 
@@ -2145,7 +2147,7 @@ gdk_window_set_transient_for (GdkWindow *window,
       window_impl->transient_for = NULL;
     }
 
-  parent_impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (parent)->impl);
+  parent_impl = GDK_WINDOW_IMPL_QUARTZ (parent->impl);
   if (parent_impl->toplevel)
     {
       /* We save the parent because it needs to be unset/reset when
@@ -2165,7 +2167,7 @@ gdk_window_set_transient_for (GdkWindow *window,
            * be shown unconditionally here. If it is not shown, the
            * window will be added in show() instead.
            */
-          if (!(GDK_WINDOW_OBJECT (window)->state & GDK_WINDOW_STATE_WITHDRAWN))
+          if (!(window->state & GDK_WINDOW_STATE_WITHDRAWN))
             _gdk_quartz_window_attach_to_parent (window);
         }
     }
@@ -2202,11 +2204,7 @@ void
 gdk_window_set_accept_focus (GdkWindow *window,
 			     gboolean accept_focus)
 {
-  GdkWindowObject *private;
-
-  private = (GdkWindowObject *)window;  
-
-  private->accept_focus = accept_focus != FALSE;
+  window->accept_focus = accept_focus != FALSE;
 }
 
 static gboolean 
@@ -2225,11 +2223,7 @@ void
 gdk_window_set_focus_on_map (GdkWindow *window,
 			     gboolean focus_on_map)
 {
-  GdkWindowObject *private;
-
-  private = (GdkWindowObject *)window;  
-  
-  private->focus_on_map = focus_on_map != FALSE;
+  window->focus_on_map = focus_on_map != FALSE;
 }
 
 void          
@@ -2243,17 +2237,15 @@ void
 gdk_window_focus (GdkWindow *window,
                   guint32    timestamp)
 {
-  GdkWindowObject *private;
   GdkWindowImplQuartz *impl;
 	
-  private = (GdkWindowObject*) window;
-  impl = GDK_WINDOW_IMPL_QUARTZ (private->impl);
+  impl = GDK_WINDOW_IMPL_QUARTZ (window->impl);
 
   if (GDK_WINDOW_DESTROYED (window) ||
       !WINDOW_IS_TOPLEVEL (window))
     return;
 
-  if (private->accept_focus && private->window_type != GDK_WINDOW_TEMP)
+  if (window->accept_focus && window->window_type != GDK_WINDOW_TEMP)
     {
       GDK_QUARTZ_ALLOC_POOL;
       [impl->toplevel makeKeyAndOrderFront:impl->toplevel];
@@ -2339,7 +2331,7 @@ gdk_window_set_type_hint (GdkWindow        *window,
       !WINDOW_IS_TOPLEVEL (window))
     return;
 
-  impl = GDK_WINDOW_IMPL_QUARTZ (((GdkWindowObject *) window)->impl);
+  impl = GDK_WINDOW_IMPL_QUARTZ (window->impl);
 
   impl->type_hint = hint;
 
@@ -2358,7 +2350,7 @@ gdk_window_get_type_hint (GdkWindow *window)
       !WINDOW_IS_TOPLEVEL (window))
     return GDK_WINDOW_TYPE_HINT_NORMAL;
   
-  return GDK_WINDOW_IMPL_QUARTZ (((GdkWindowObject *) window)->impl)->type_hint;
+  return GDK_WINDOW_IMPL_QUARTZ (window->impl)->type_hint;
 }
 
 void
@@ -2402,7 +2394,6 @@ gdk_window_begin_resize_drag (GdkWindow     *window,
                               gint           root_y,
                               guint32        timestamp)
 {
-  GdkWindowObject *private;
   GdkWindowImplQuartz *impl;
 
   g_return_if_fail (GDK_IS_WINDOW (window));
@@ -2416,8 +2407,7 @@ gdk_window_begin_resize_drag (GdkWindow     *window,
   if (GDK_WINDOW_DESTROYED (window))
     return;
 
-  private = GDK_WINDOW_OBJECT (window);
-  impl = GDK_WINDOW_IMPL_QUARTZ (private->impl);
+  impl = GDK_WINDOW_IMPL_QUARTZ (window->impl);
 
   if (!impl->toplevel)
     {
@@ -2435,15 +2425,13 @@ gdk_window_begin_move_drag (GdkWindow *window,
                             gint       root_y,
                             guint32    timestamp)
 {
-  GdkWindowObject *private;
   GdkWindowImplQuartz *impl;
 
   if (GDK_WINDOW_DESTROYED (window) ||
       !WINDOW_IS_TOPLEVEL (window))
     return;
 
-  private = GDK_WINDOW_OBJECT (window);
-  impl = GDK_WINDOW_IMPL_QUARTZ (private->impl);
+  impl = GDK_WINDOW_IMPL_QUARTZ (window->impl);
 
   if (!impl->toplevel)
     {
@@ -2465,14 +2453,12 @@ void
 gdk_window_get_frame_extents (GdkWindow    *window,
                               GdkRectangle *rect)
 {
-  GdkWindowObject *private;
   GdkWindow *toplevel;
   GdkWindowImplQuartz *impl;
   NSRect ns_rect;
 
   g_return_if_fail (rect != NULL);
 
-  private = GDK_WINDOW_OBJECT (window);
 
   rect->x = 0;
   rect->y = 0;
@@ -2480,7 +2466,7 @@ gdk_window_get_frame_extents (GdkWindow    *window,
   rect->height = 1;
   
   toplevel = gdk_window_get_effective_toplevel (window);
-  impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (toplevel)->impl);
+  impl = GDK_WINDOW_IMPL_QUARTZ (toplevel->impl);
 
   ns_rect = [impl->toplevel frame];
 
@@ -2504,7 +2490,7 @@ gdk_window_set_decorations (GdkWindow       *window,
       !WINDOW_IS_TOPLEVEL (window))
     return;
 
-  impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (window)->impl);
+  impl = GDK_WINDOW_IMPL_QUARTZ (window->impl);
 
   if (decorations == 0 || GDK_WINDOW_TYPE (window) == GDK_WINDOW_TEMP ||
       impl->type_hint == GDK_WINDOW_TYPE_HINT_SPLASHSCREEN )
@@ -2580,7 +2566,7 @@ gdk_window_get_decorations (GdkWindow       *window,
       !WINDOW_IS_TOPLEVEL (window))
     return FALSE;
 
-  impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (window)->impl);
+  impl = GDK_WINDOW_IMPL_QUARTZ (window->impl);
 
   if (decorations)
     {
@@ -2640,7 +2626,7 @@ gdk_window_maximize (GdkWindow *window)
       !WINDOW_IS_TOPLEVEL (window))
     return;
 
-  impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (window)->impl);
+  impl = GDK_WINDOW_IMPL_QUARTZ (window->impl);
 
   if (GDK_WINDOW_IS_MAPPED (window))
     {
@@ -2668,7 +2654,7 @@ gdk_window_unmaximize (GdkWindow *window)
       !WINDOW_IS_TOPLEVEL (window))
     return;
 
-  impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (window)->impl);
+  impl = GDK_WINDOW_IMPL_QUARTZ (window->impl);
 
   if (GDK_WINDOW_IS_MAPPED (window))
     {
@@ -2696,7 +2682,7 @@ gdk_window_iconify (GdkWindow *window)
       !WINDOW_IS_TOPLEVEL (window))
     return;
 
-  impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (window)->impl);
+  impl = GDK_WINDOW_IMPL_QUARTZ (window->impl);
 
   if (GDK_WINDOW_IS_MAPPED (window))
     {
@@ -2724,7 +2710,7 @@ gdk_window_deiconify (GdkWindow *window)
       !WINDOW_IS_TOPLEVEL (window))
     return;
 
-  impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (window)->impl);
+  impl = GDK_WINDOW_IMPL_QUARTZ (window->impl);
 
   if (GDK_WINDOW_IS_MAPPED (window))
     {
@@ -2753,7 +2739,6 @@ void
 gdk_window_fullscreen (GdkWindow *window)
 {
   FullscreenSavedGeometry *geometry;
-  GdkWindowObject *private = (GdkWindowObject *) window;
   NSRect frame;
 
   if (GDK_WINDOW_DESTROYED (window) ||
@@ -2765,10 +2750,10 @@ gdk_window_fullscreen (GdkWindow *window)
     {
       geometry = g_new (FullscreenSavedGeometry, 1);
 
-      geometry->x = private->x;
-      geometry->y = private->y;
-      geometry->width = private->width;
-      geometry->height = private->height;
+      geometry->x = window->x;
+      geometry->y = window->y;
+      geometry->width = window->width;
+      geometry->height = window->height;
 
       if (!gdk_window_get_decorations (window, &geometry->decor))
         geometry->decor = GDK_DECOR_ALL;
@@ -2821,8 +2806,7 @@ gdk_window_unfullscreen (GdkWindow *window)
 void
 gdk_window_set_keep_above (GdkWindow *window, gboolean setting)
 {
-  GdkWindowObject *private = (GdkWindowObject *) window;
-  GdkWindowImplQuartz *impl = GDK_WINDOW_IMPL_QUARTZ (private->impl);
+  GdkWindowImplQuartz *impl = GDK_WINDOW_IMPL_QUARTZ (window->impl);
   gint level;
 
   g_return_if_fail (GDK_IS_WINDOW (window));
@@ -2840,8 +2824,7 @@ gdk_window_set_keep_above (GdkWindow *window, gboolean setting)
 void
 gdk_window_set_keep_below (GdkWindow *window, gboolean setting)
 {
-  GdkWindowObject *private = (GdkWindowObject *) window;
-  GdkWindowImplQuartz *impl = GDK_WINDOW_IMPL_QUARTZ (private->impl);
+  GdkWindowImplQuartz *impl = GDK_WINDOW_IMPL_QUARTZ (window->impl);
   gint level;
 
   g_return_if_fail (GDK_IS_WINDOW (window));
@@ -2919,8 +2902,7 @@ void
 gdk_window_set_opacity (GdkWindow *window,
 			gdouble    opacity)
 {
-  GdkWindowObject *private = (GdkWindowObject *) window;
-  GdkWindowImplQuartz *impl = GDK_WINDOW_IMPL_QUARTZ (private->impl);
+  GdkWindowImplQuartz *impl = GDK_WINDOW_IMPL_QUARTZ (window->impl);
 
   g_return_if_fail (GDK_IS_WINDOW (window));
   g_return_if_fail (WINDOW_IS_TOPLEVEL (window));
@@ -2956,45 +2938,125 @@ gdk_quartz_window_get_input_shape (GdkWindow *window)
   return NULL;
 }
 
+
 static void
-gdk_window_impl_iface_init (GdkWindowImplIface *iface)
-{
-  iface->show = gdk_window_quartz_show;
-  iface->hide = gdk_window_quartz_hide;
-  iface->withdraw = gdk_window_quartz_withdraw;
-  iface->set_events = gdk_window_quartz_set_events;
-  iface->get_events = gdk_window_quartz_get_events;
-  iface->raise = gdk_window_quartz_raise;
-  iface->lower = gdk_window_quartz_lower;
-  iface->restack_toplevel = gdk_window_quartz_restack_toplevel;
-  iface->move_resize = gdk_window_quartz_move_resize;
-  iface->set_background = gdk_window_quartz_set_background;
-  iface->reparent = gdk_window_quartz_reparent;
-  iface->set_device_cursor = gdk_window_quartz_set_device_cursor;
-  iface->get_geometry = gdk_window_quartz_get_geometry;
-  iface->get_root_coords = gdk_window_quartz_get_root_coords;
-  iface->get_device_state = gdk_window_quartz_get_device_state;
-  iface->shape_combine_region = gdk_window_quartz_shape_combine_region;
-  iface->input_shape_combine_region = gdk_window_quartz_input_shape_combine_region;
-  iface->set_static_gravities = gdk_window_quartz_set_static_gravities;
-  iface->queue_antiexpose = _gdk_quartz_window_queue_antiexpose;
-  iface->translate = _gdk_quartz_window_translate;
-  iface->destroy = _gdk_quartz_window_destroy;
-  iface->resize_cairo_surface = gdk_window_quartz_resize_cairo_surface;
-  iface->get_shape = gdk_quartz_window_get_shape;
-  iface->get_input_shape = gdk_quartz_window_get_input_shape;
+gdk_window_impl_quartz_class_init (GdkWindowImplQuartzClass *klass)
+{
+  GObjectClass *object_class = G_OBJECT_CLASS (klass);
+  GdkWindowImplClass *impl_class = GDK_WINDOW_IMPL_CLASS (klass);
+  GdkWindowImplQuartzClass *impl_quartz_class = GDK_WINDOW_IMPL_QUARTZ_CLASS (klass);
+
+  parent_class = g_type_class_peek_parent (klass);
+
+  object_class->finalize = gdk_window_impl_quartz_finalize;
+
+  impl_class->ref_cairo_surface = gdk_quartz_ref_cairo_surface;
+  impl_class->show = gdk_window_quartz_show;
+  impl_class->hide = gdk_window_quartz_hide;
+  impl_class->withdraw = gdk_window_quartz_withdraw;
+  impl_class->set_events = gdk_window_quartz_set_events;
+  impl_class->get_events = gdk_window_quartz_get_events;
+  impl_class->raise = gdk_window_quartz_raise;
+  impl_class->lower = gdk_window_quartz_lower;
+  impl_class->restack_toplevel = gdk_window_quartz_restack_toplevel;
+  impl_class->move_resize = gdk_window_quartz_move_resize;
+  impl_class->set_background = gdk_window_quartz_set_background;
+  impl_class->reparent = gdk_window_quartz_reparent;
+  impl_class->set_device_cursor = gdk_window_quartz_set_device_cursor;
+  impl_class->get_geometry = gdk_window_quartz_get_geometry;
+  impl_class->get_root_coords = gdk_window_quartz_get_root_coords;
+  impl_class->get_device_state = gdk_window_quartz_get_device_state;
+  impl_class->shape_combine_region = gdk_window_quartz_shape_combine_region;
+  impl_class->input_shape_combine_region = gdk_window_quartz_input_shape_combine_region;
+  impl_class->set_static_gravities = gdk_window_quartz_set_static_gravities;
+  impl_class->queue_antiexpose = _gdk_quartz_window_queue_antiexpose;
+  impl_class->translate = _gdk_quartz_window_translate;
+  impl_class->destroy = _gdk_quartz_window_destroy;
+  impl_class->resize_cairo_surface = gdk_window_quartz_resize_cairo_surface;
+  impl_class->get_shape = gdk_quartz_window_get_shape;
+  impl_class->get_input_shape = gdk_quartz_window_get_input_shape;
+
+  impl_quartz_class->get_context = gdk_window_impl_quartz_get_context;
+  impl_quartz_class->release_context = gdk_window_impl_quartz_release_context;
 }
 
+GType
+_gdk_window_impl_quartz_get_type (void)
+{
+  static GType object_type = 0;
+
+  if (!object_type)
+    {
+      const GTypeInfo object_info =
+	{
+	  sizeof (GdkWindowImplQuartzClass),
+	  (GBaseInitFunc) NULL,
+	  (GBaseFinalizeFunc) NULL,
+	  (GClassInitFunc) gdk_window_impl_quartz_class_init,
+	  NULL,           /* class_finalize */
+	  NULL,           /* class_data */
+	  sizeof (GdkWindowImplQuartz),
+	  0,              /* n_preallocs */
+	  (GInstanceInitFunc) gdk_window_impl_quartz_init,
+	};
+
+      const GInterfaceInfo paintable_info = 
+	{
+	  (GInterfaceInitFunc) gdk_window_impl_quartz_paintable_init,
+	  NULL,
+	  NULL
+	};
+
+      object_type = g_type_register_static (GDK_TYPE_WINDOW_IMPL,
+                                            "GdkWindowImplQuartz",
+                                            &object_info, 0);
+      g_type_add_interface_static (object_type,
+				   GDK_TYPE_PAINTABLE,
+				   &paintable_info);
+    }
+
+  return object_type;
+}
+
+CGContextRef
+gdk_quartz_window_get_context (GdkWindowImplQuartz  *window,
+                               gboolean             antialias)
+{
+  if (!GDK_WINDOW_IMPL_QUARTZ_GET_CLASS (window)->get_context)
+    {
+      g_warning ("%s doesn't implement GdkWindowImplQuartzClass::get_context()",
+                 G_OBJECT_TYPE_NAME (window));
+      return NULL;
+    }
+
+  return GDK_WINDOW_IMPL_QUARTZ_GET_CLASS (window)->get_context (window, antialias);
+}
+
+void
+gdk_quartz_window_release_context (GdkWindowImplQuartz  *window,
+                                   CGContextRef          cg_context)
+{
+  if (!GDK_WINDOW_IMPL_QUARTZ_GET_CLASS (window)->release_context)
+    {
+      g_warning ("%s doesn't implement GdkWindowImplQuartzClass::release_context()",
+                 G_OBJECT_TYPE_NAME (window));
+      return;
+    }
+
+  GDK_WINDOW_IMPL_QUARTZ_GET_CLASS (window)->release_context (window, cg_context);
+}
+
+
 
 static CGContextRef
-gdk_root_window_impl_quartz_get_context (GdkDrawable *drawable,
-                                         gboolean     antialias)
+gdk_root_window_impl_quartz_get_context (GdkWindowImplQuartz *window,
+                                         gboolean             antialias)
 {
-  GdkDrawableImplQuartz *drawable_impl = GDK_DRAWABLE_IMPL_QUARTZ (drawable);
   CGColorSpaceRef colorspace;
   CGContextRef cg_context;
+  GdkWindowImplQuartz *window_impl = GDK_WINDOW_IMPL_QUARTZ (window);
 
-  if (GDK_WINDOW_DESTROYED (drawable_impl->wrapper))
+  if (GDK_WINDOW_DESTROYED (window_impl->wrapper))
     return NULL;
 
   /* We do not have the notion of a root window on OS X.  We fake this
@@ -3010,8 +3072,8 @@ gdk_root_window_impl_quartz_get_context (GdkDrawable *drawable,
 }
 
 static void
-gdk_root_window_impl_quartz_release_context (GdkDrawable  *drawable,
-                                             CGContextRef  cg_context)
+gdk_root_window_impl_quartz_release_context (GdkWindowImplQuartz *window,
+                                             CGContextRef         cg_context)
 {
   CGContextRelease (cg_context);
 }
@@ -3019,12 +3081,12 @@ gdk_root_window_impl_quartz_release_context (GdkDrawable  *drawable,
 static void
 gdk_root_window_impl_quartz_class_init (GdkRootWindowImplQuartzClass *klass)
 {
-  GdkDrawableImplQuartzClass *drawable_quartz_class = GDK_DRAWABLE_IMPL_QUARTZ_CLASS (klass);
+  GdkWindowImplQuartzClass *window_quartz_class = GDK_WINDOW_IMPL_QUARTZ_CLASS (klass);
 
   root_window_parent_class = g_type_class_peek_parent (klass);
 
-  drawable_quartz_class->get_context = gdk_root_window_impl_quartz_get_context;
-  drawable_quartz_class->release_context = gdk_root_window_impl_quartz_release_context;
+  window_quartz_class->get_context = gdk_root_window_impl_quartz_get_context;
+  window_quartz_class->release_context = gdk_root_window_impl_quartz_release_context;
 }
 
 static void
diff --git a/gdk/quartz/gdkwindow-quartz.h b/gdk/quartz/gdkwindow-quartz.h
index b591eeb..f55bbb3 100644
--- a/gdk/quartz/gdkwindow-quartz.h
+++ b/gdk/quartz/gdkwindow-quartz.h
@@ -21,9 +21,9 @@
 #ifndef __GDK_WINDOW_QUARTZ_H__
 #define __GDK_WINDOW_QUARTZ_H__
 
-#include <gdk/quartz/gdkdrawable-quartz.h>
 #import <gdk/quartz/GdkQuartzView.h>
 #import <gdk/quartz/GdkQuartzWindow.h>
+#include "gdk/gdkwindowimpl.h"
 
 G_BEGIN_DECLS
 
@@ -42,7 +42,9 @@ typedef struct _GdkWindowImplQuartzClass GdkWindowImplQuartzClass;
 
 struct _GdkWindowImplQuartz
 {
-  GdkDrawableImplQuartz parent_instance;
+  GdkWindowImpl parent_instance;
+
+  GdkWindow *wrapper;
 
   NSWindow *toplevel;
   NSTrackingRectTag tracking_rect;
@@ -60,15 +62,26 @@ struct _GdkWindowImplQuartz
   GList *sorted_children;
 
   cairo_region_t *needs_display_region;
+
+  cairo_surface_t *cairo_surface;
 };
  
 struct _GdkWindowImplQuartzClass 
 {
-  GdkDrawableImplQuartzClass parent_class;
+  GdkWindowImplClass parent_class;
+
+  CGContextRef  (* get_context)     (GdkWindowImplQuartz *window,
+                                     gboolean             antialias);
+  void          (* release_context) (GdkWindowImplQuartz *window,
+                                     CGContextRef         cg_context);
 };
 
 GType _gdk_window_impl_quartz_get_type (void);
 
+CGContextRef gdk_quartz_window_get_context     (GdkWindowImplQuartz *window,
+                                                gboolean             antialias);
+void         gdk_quartz_window_release_context (GdkWindowImplQuartz *window,
+                                                CGContextRef         context);
 
 /* Root window implementation for Quartz
  */



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]