diff options
-rw-r--r-- | gdk/quartz/GdkQuartzView.c | 8 | ||||
-rw-r--r-- | gdk/quartz/GdkQuartzWindow.c | 40 | ||||
-rw-r--r-- | gdk/quartz/Makefile.am | 2 | ||||
-rw-r--r-- | gdk/quartz/gdkdevice-core.c | 10 | ||||
-rw-r--r-- | gdk/quartz/gdkdrawable-quartz.c | 232 | ||||
-rw-r--r-- | gdk/quartz/gdkdrawable-quartz.h | 71 | ||||
-rw-r--r-- | gdk/quartz/gdkevents-quartz.c | 58 | ||||
-rw-r--r-- | gdk/quartz/gdkgeometry-quartz.c | 3 | ||||
-rw-r--r-- | gdk/quartz/gdkinput.c | 14 | ||||
-rw-r--r-- | gdk/quartz/gdkprivate-quartz.h | 6 | ||||
-rw-r--r-- | gdk/quartz/gdkwindow-quartz.c | 742 | ||||
-rw-r--r-- | 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 8c6132b2ab..cf34e8302a 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 eb3cce8947..6fd0c9b75e 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 b0a967d1e8..f7ffd5a326 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 57dc3de728..25f9a1e479 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/gdkdrawable-quartz.c b/gdk/quartz/gdkdrawable-quartz.c deleted file mode 100644 index 632f0cd009..0000000000 --- a/gdk/quartz/gdkdrawable-quartz.c +++ /dev/null @@ -1,232 +0,0 @@ -/* gdkdrawable-quartz.c - * - * Copyright (C) 2005-2007 Imendio AB - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#include "config.h" -#include <sys/time.h> -#include <cairo-quartz.h> -#include "gdkprivate-quartz.h" - -static gpointer parent_class; - -static cairo_user_data_key_t gdk_quartz_cairo_key; - -typedef struct { - GdkDrawable *drawable; - CGContextRef cg_context; -} GdkQuartzCairoSurfaceData; - -static void -gdk_quartz_cairo_surface_destroy (void *data) -{ - GdkQuartzCairoSurfaceData *surface_data = data; - GdkDrawableImplQuartz *impl = GDK_DRAWABLE_IMPL_QUARTZ (surface_data->drawable); - - impl->cairo_surface = NULL; - - gdk_quartz_drawable_release_context (surface_data->drawable, - surface_data->cg_context); - - g_free (surface_data); -} - -static cairo_surface_t * -gdk_quartz_create_cairo_surface (GdkDrawable *drawable, - int width, - int height) -{ - CGContextRef cg_context; - GdkQuartzCairoSurfaceData *surface_data; - cairo_surface_t *surface; - - cg_context = gdk_quartz_drawable_get_context (drawable, TRUE); - - if (!cg_context) - return NULL; - - surface_data = g_new (GdkQuartzCairoSurfaceData, 1); - surface_data->drawable = drawable; - 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 (GdkDrawable *drawable) -{ - GdkDrawableImplQuartz *impl = GDK_DRAWABLE_IMPL_QUARTZ (drawable); - - if (GDK_IS_WINDOW_IMPL_QUARTZ (drawable) && - GDK_WINDOW_DESTROYED (impl->wrapper)) - return NULL; - - if (!impl->cairo_surface) - { - impl->cairo_surface = - gdk_quartz_create_cairo_surface (drawable, - 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 -gdk_drawable_impl_quartz_finalize (GObject *object) -{ - G_OBJECT_CLASS (parent_class)->finalize (object); -} - -static void -gdk_drawable_impl_quartz_class_init (GdkDrawableImplQuartzClass *klass) -{ - GObjectClass *object_class = G_OBJECT_CLASS (klass); - GdkDrawableClass *drawable_class = GDK_DRAWABLE_CLASS (klass); - - parent_class = g_type_class_peek_parent (klass); - - object_class->finalize = gdk_drawable_impl_quartz_finalize; - - drawable_class->ref_cairo_surface = gdk_quartz_ref_cairo_surface; - drawable_class->create_cairo_surface = gdk_quartz_create_cairo_surface; -} - -GType -gdk_drawable_impl_quartz_get_type (void) -{ - static GType object_type = 0; - - if (!object_type) - { - const GTypeInfo object_info = - { - sizeof (GdkDrawableImplQuartzClass), - (GBaseInitFunc) NULL, - (GBaseFinalizeFunc) NULL, - (GClassInitFunc) gdk_drawable_impl_quartz_class_init, - NULL, /* class_finalize */ - NULL, /* class_data */ - sizeof (GdkDrawableImplQuartz), - 0, /* n_preallocs */ - (GInstanceInitFunc) NULL, - }; - - object_type = g_type_register_static (GDK_TYPE_DRAWABLE, - "GdkDrawableImplQuartz", - &object_info, 0); - } - - return object_type; -} - -CGContextRef -gdk_quartz_drawable_get_context (GdkDrawable *drawable, - gboolean antialias) -{ - if (!GDK_DRAWABLE_IMPL_QUARTZ_GET_CLASS (drawable)->get_context) - { - g_warning ("%s doesn't implement GdkDrawableImplQuartzClass::get_context()", - G_OBJECT_TYPE_NAME (drawable)); - return NULL; - } - - return GDK_DRAWABLE_IMPL_QUARTZ_GET_CLASS (drawable)->get_context (drawable, antialias); -} - -void -gdk_quartz_drawable_release_context (GdkDrawable *drawable, - CGContextRef cg_context) -{ - if (!GDK_DRAWABLE_IMPL_QUARTZ_GET_CLASS (drawable)->release_context) - { - g_warning ("%s doesn't implement GdkDrawableImplQuartzClass::release_context()", - G_OBJECT_TYPE_NAME (drawable)); - return; - } - - GDK_DRAWABLE_IMPL_QUARTZ_GET_CLASS (drawable)->release_context (drawable, cg_context); -} - -/* 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_drawable_flush (GdkDrawable *drawable) -{ - 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 (drawable) - { - ms = intervals[0] + intervals[1] + intervals[2] + intervals[3]; - - /* ~25Hz on average. */ - if (ms > 4*40) - { - if (GDK_IS_WINDOW_IMPL_QUARTZ (drawable)) - { - GdkWindowImplQuartz *window_impl = GDK_WINDOW_IMPL_QUARTZ (drawable); - - [window_impl->toplevel flushWindow]; - } - - prev_tv = tv; - } - } - else - prev_tv = tv; -} - -void -_gdk_quartz_drawable_finish (GdkDrawable *drawable) -{ - GdkDrawableImplQuartz *impl = GDK_DRAWABLE_IMPL_QUARTZ (drawable); - - 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; - } -} diff --git a/gdk/quartz/gdkdrawable-quartz.h b/gdk/quartz/gdkdrawable-quartz.h deleted file mode 100644 index 24d17d83ea..0000000000 --- a/gdk/quartz/gdkdrawable-quartz.h +++ /dev/null @@ -1,71 +0,0 @@ -/* gdkdrawable-quartz.h - * - * Copyright (C) 2005 Imendio AB - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#ifndef __GDK_DRAWABLE_QUARTZ_H__ -#define __GDK_DRAWABLE_QUARTZ_H__ - -#include <gdk/gdkdrawable.h> - -#include <AppKit/AppKit.h> - -G_BEGIN_DECLS - -/* Drawable implementation for Quartz - */ - -typedef struct _GdkDrawableImplQuartz GdkDrawableImplQuartz; -typedef struct _GdkDrawableImplQuartzClass GdkDrawableImplQuartzClass; - -#define GDK_TYPE_DRAWABLE_IMPL_QUARTZ (gdk_drawable_impl_quartz_get_type ()) -#define GDK_DRAWABLE_IMPL_QUARTZ(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), GDK_TYPE_DRAWABLE_IMPL_QUARTZ, GdkDrawableImplQuartz)) -#define GDK_DRAWABLE_IMPL_QUARTZ_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GDK_TYPE_DRAWABLE_IMPL_QUARTZ, GdkDrawableImplQuartzClass)) -#define GDK_IS_DRAWABLE_IMPL_QUARTZ(object) (G_TYPE_CHECK_INSTANCE_TYPE ((object), GDK_TYPE_DRAWABLE_IMPL_QUARTZ)) -#define GDK_IS_DRAWABLE_IMPL_QUARTZ_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GDK_TYPE_DRAWABLE_IMPL_QUARTZ)) -#define GDK_DRAWABLE_IMPL_QUARTZ_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GDK_TYPE_DRAWABLE_IMPL_QUARTZ, GdkDrawableImplQuartzClass)) - -struct _GdkDrawableImplQuartz -{ - GdkDrawable parent_instance; - - GdkDrawable *wrapper; - - cairo_surface_t *cairo_surface; -}; - -struct _GdkDrawableImplQuartzClass -{ - GdkDrawableClass parent_class; - - /* vtable */ - CGContextRef (*get_context) (GdkDrawable* drawable, - gboolean antialias); - void (*release_context) (GdkDrawable *drawable, - CGContextRef cg_context); -}; - -GType gdk_drawable_impl_quartz_get_type (void); -CGContextRef gdk_quartz_drawable_get_context (GdkDrawable *drawable, - gboolean antialias); -void gdk_quartz_drawable_release_context (GdkDrawable *drawable, - CGContextRef context); - -G_END_DECLS - -#endif /* __GDK_DRAWABLE_QUARTZ_H__ */ diff --git a/gdk/quartz/gdkevents-quartz.c b/gdk/quartz/gdkevents-quartz.c index 44f10cbbf4..9cbfdda8e6 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 bd602e33df..8434151405 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 31d1bd2c18..3677d8a4c3 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 ca9eae30b1..9a70054746 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 a27163ca4b..c912e26b4d 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 b591eebc81..f55bbb33e9 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 */ |