From 733c8fc8e79af89ac33bc5579a8add345ceb01f6 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Fri, 17 Dec 2010 11:38:02 -0500 Subject: [PATCH] Derive GdkDisplayManager for quartz --- gdk/quartz/Makefile.am | 1 + gdk/quartz/gdkdisplay-quartz.c | 25 +++-- gdk/quartz/gdkdisplaymanager-quartz.c | 132 ++++++++++++++++++++++++++ gdk/quartz/gdkevents-quartz.c | 2 +- gdk/quartz/gdkinput.c | 27 +----- gdk/quartz/gdkinputprivate.h | 3 +- gdk/quartz/gdkprivate-quartz.h | 6 +- 7 files changed, 155 insertions(+), 41 deletions(-) create mode 100644 gdk/quartz/gdkdisplaymanager-quartz.c diff --git a/gdk/quartz/Makefile.am b/gdk/quartz/Makefile.am index a1d5664bf3..7774dbc159 100644 --- a/gdk/quartz/Makefile.am +++ b/gdk/quartz/Makefile.am @@ -25,6 +25,7 @@ libgdk_quartz_la_SOURCES = \ gdkdevice-core.c \ gdkdevicemanager-core.c \ gdkdisplay-quartz.c \ + gdkdisplaymanager-quartz.c \ gdkdnd-quartz.c \ gdkevents-quartz.c \ gdkeventloop-quartz.c \ diff --git a/gdk/quartz/gdkdisplay-quartz.c b/gdk/quartz/gdkdisplay-quartz.c index 2883136fe8..162569c343 100644 --- a/gdk/quartz/gdkdisplay-quartz.c +++ b/gdk/quartz/gdkdisplay-quartz.c @@ -37,12 +37,6 @@ gdk_quartz_display_get_default_group (GdkDisplay *display) return NULL; } -void -_gdk_windowing_set_default_display (GdkDisplay *display) -{ - g_assert (display == NULL || _gdk_display == display); -} - GdkDeviceManager * _gdk_device_manager_new (GdkDisplay *display) { @@ -52,7 +46,7 @@ _gdk_device_manager_new (GdkDisplay *display) } GdkDisplay * -gdk_display_open (const gchar *display_name) +_gdk_quartz_display_open (const gchar *display_name) { if (_gdk_display != NULL) return NULL; @@ -60,7 +54,7 @@ gdk_display_open (const gchar *display_name) /* Initialize application */ [NSApplication sharedApplication]; - _gdk_display = g_object_new (GDK_TYPE_DISPLAY, NULL); + _gdk_display = g_object_new (_gdk_quartz_display_get_type (), NULL); _gdk_display->device_manager = _gdk_device_manager_new (_gdk_display); _gdk_screen = _gdk_screen_quartz_new (); @@ -69,9 +63,9 @@ gdk_display_open (const gchar *display_name) _gdk_windowing_window_init (); - _gdk_events_init (); + _gdk_quartz_events_init (); - _gdk_input_init (); + _gdk_quartz_input_init (); #if 0 /* FIXME: Remove the #if 0 when we have these functions */ @@ -199,6 +193,17 @@ G_DEFINE_TYPE (GdkDisplayQuartz, _gdk_display_quartz, GDK_TYPE_DISPLAY) static void _gdk_display_quartz_init (GdkDisplayQuartz *display) { + gdk_x11_display_manager_add_display (gdk_display_nmanager_get (), + GDK_DISPLAY_OBJECT (display)); +} + +static void +_gdk_display_quartz_dispose (GObject *object) +{ + _gdk_quartz_display_manager_remove_display (gdk_display_manager_get (), + GDK_DISPLAY_OBJECT (object)); + + G_OBJECT_CLASS (_gdk_display_quartz_parent_class)->dispose (object); } static void diff --git a/gdk/quartz/gdkdisplaymanager-quartz.c b/gdk/quartz/gdkdisplaymanager-quartz.c new file mode 100644 index 0000000000..2df3c7c8ed --- /dev/null +++ b/gdk/quartz/gdkdisplaymanager-quartz.c @@ -0,0 +1,132 @@ +/* GDK - The GIMP Drawing Kit + * gdkdisplaymanager-quartz.c + * + * Copyright 2010 Red Hat, Inc. + * + * Author: Matthias clasen + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library 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 "gdkdisplay-quartz.h" +#include "gdkprivate-quartz.h" + +#include "gdkdisplaymanagerprivate.h" +#include "gdkinternals.h" + +#define GDK_TYPE_DISPLAY_MANAGER_QUARTZ (gdk_display_manager_quartz_get_type ()) +#define GDK_DISPLAY_MANAGER_QUARTZ(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), GDK_TYPE_DISPLAY_MANAGER_QUARTZ, GdkDisplayManagerQuartz)) + +typedef struct _GdkDisplayManagerQuartz GdkDisplayManagerQuartz; +typedef struct _GdkDisplayManagerClass GdkDisplayManagerQuartzClass; + +struct _GdkDisplayManagerQuartz +{ + GdkDisplayManager parent; + + GdkDisplay *default_display; + GSList *displays; +}; + +G_DEFINE_TYPE (GdkDisplayManagerQuartz, gdk_display_manager_quartz, GDK_TYPE_DISPLAY_MANAGER) + +static GdkDisplay * +gdk_display_manager_quartz_open_display (GdkDisplayManager *manager, + const gchar *name) +{ + return _gdk_quartz_display_open (name); +} + +static GSList * +gdk_display_manager_quartz_list_displays (GdkDisplayManager *manager) +{ + GdkDisplayManagerQuartz *manager_quartz = GDK_DISPLAY_MANAGER_QUARTZ (manager); + + return g_slist_copy (manager_quartz->displays); +} + +static GdkDisplay * +gdk_display_manager_quartz_get_default_display (GdkDisplayManager *manager) +{ + return GDK_DISPLAY_MANAGER_QUARTZ (manager)->default_display; +} + +static void +gdk_display_manager_quartz_set_default_display (GdkDisplayManager *manager, + GdkDisplay *display) +{ + GdkDisplayManagerQuartz *manager_quartz = GDK_DISPLAY_MANAGER_QUARTZ (manager); + + manager_quartz->default_display = display; +} + +static void +gdk_display_manager_quartz_init (GdkDisplayManagerQuartz *manager) +{ + _gdk_quartz_windowing_init (); +} + +static void +gdk_display_manager_quartz_finalize (GObject *object) +{ + g_error ("A GdkDisplayManagerQuartz object was finalized. This should not happen"); + G_OBJECT_CLASS (gdk_display_manager_quartz_parent_class)->finalize (object); +} + +static void +gdk_display_manager_quartz_class_init (GdkDisplayManagerQuartzClass *class) +{ + GObjectClass *object_class = G_OBJECT_CLASS (class); + GdkDisplayManagerClass *manager_class = GDK_DISPLAY_MANAGER_CLASS (class); + + object_class->finalize = gdk_display_manager_quartz_finalize; + + manager_class->open_display = gdk_display_manager_quartz_open_display; + manager_class->list_displays = gdk_display_manager_quartz_list_displays; + manager_class->set_default_display = gdk_display_manager_quartz_set_default_display; + manager_class->get_default_display = gdk_display_manager_quartz_get_default_display; +} + +void +_gdk_quartz_display_manager_add_display (GdkDisplayManager *manager, + GdkDisplay *display) +{ + GdkDisplayManagerQuartz *manager_quartz = GDK_DISPLAY_MANAGER_QUARTZ (manager); + + if (manager_quartz->displays == NULL) + gdk_display_manager_set_default_display (manager, display); + + manager_quartz->displays = g_slist_prepend (manager_quartz->displays, display); +} + +void +_gdk_quartz_display_manager_remove_display (GdkDisplayManager *manager, + GdkDisplay *display) +{ + GdkDisplayManagerQuartz *manager_quartz = GDK_DISPLAY_MANAGER_QUARTZ (manager); + + manager_quartz->displays = g_slist_remove (manager_quartz->displays, display); + + if (manager_quartz->default_display == display) + { + if (manager_quartz->displays) + gdk_display_manager_set_default_display (manager, manager_quartz->displays->data); + else + gdk_display_manager_set_default_display (manager, NULL); + } +} diff --git a/gdk/quartz/gdkevents-quartz.c b/gdk/quartz/gdkevents-quartz.c index 83f6b7ad33..75ead8b9a3 100644 --- a/gdk/quartz/gdkevents-quartz.c +++ b/gdk/quartz/gdkevents-quartz.c @@ -60,7 +60,7 @@ gdk_quartz_event_get_nsevent (GdkEvent *event) } void -_gdk_events_init (void) +_gdk_quartz_events_init (void) { _gdk_quartz_event_loop_init (); diff --git a/gdk/quartz/gdkinput.c b/gdk/quartz/gdkinput.c index fc7d73fda7..8d96076d91 100644 --- a/gdk/quartz/gdkinput.c +++ b/gdk/quartz/gdkinput.c @@ -204,7 +204,7 @@ _gdk_quartz_device_check_extension_events (GdkDevice *device) } void -_gdk_input_init (void) +_gdk_quartz_input_init (void) { GdkDeviceManager *device_manager; GList *list, *l; @@ -252,28 +252,3 @@ _gdk_input_init (void) _gdk_input_ignore_core = FALSE; } - -void -_gdk_input_exit (void) -{ - GList *tmp_list; - GdkDevicePrivate *gdkdev; - - for (tmp_list = _gdk_input_devices; tmp_list; tmp_list = tmp_list->next) - { - gdkdev = (GdkDevicePrivate *)(tmp_list->data); - if (gdkdev != (GdkDevicePrivate *)_gdk_core_pointer) - { - gdk_device_set_mode ((GdkDevice *)gdkdev, GDK_MODE_DISABLED); - g_object_unref(gdkdev); - } - } - - g_list_free (_gdk_input_devices); - - for (tmp_list = _gdk_input_windows; tmp_list; tmp_list = tmp_list->next) - { - g_free (tmp_list->data); - } - g_list_free (_gdk_input_windows); -} diff --git a/gdk/quartz/gdkinputprivate.h b/gdk/quartz/gdkinputprivate.h index 7ba4293a8e..a72aa10760 100644 --- a/gdk/quartz/gdkinputprivate.h +++ b/gdk/quartz/gdkinputprivate.h @@ -133,8 +133,7 @@ extern gint _gdk_input_ignore_core; GdkInputWindow * _gdk_input_window_find (GdkWindow *window); void _gdk_input_window_destroy (GdkWindow *window); -void _gdk_input_init (void); -void _gdk_input_exit (void); +void _gdk_quartz_input_init (void); gint _gdk_input_enable_window (GdkWindow *window, GdkDevicePrivate *gdkdev); gint _gdk_input_disable_window (GdkWindow *window, diff --git a/gdk/quartz/gdkprivate-quartz.h b/gdk/quartz/gdkprivate-quartz.h index 890e10c13a..bebf02cc3e 100644 --- a/gdk/quartz/gdkprivate-quartz.h +++ b/gdk/quartz/gdkprivate-quartz.h @@ -67,9 +67,9 @@ extern GdkDragContext *_gdk_quartz_drag_source_context; /* Initialization */ void _gdk_windowing_update_window_sizes (GdkScreen *screen); void _gdk_windowing_window_init (void); -void _gdk_events_init (void); +void _gdk_quartz_events_init (void); void _gdk_quartz_visual_init (GdkScreen *screen); -void _gdk_input_init (void); +void _gdk_quartz_input_init (void); void _gdk_quartz_event_loop_init (void); /* GC */ @@ -153,6 +153,8 @@ void _gdk_quartz_display_sync (GdkDisplay *display); void _gdk_quartz_display_flush (GdkDisplay *display); GList * _gdk_quartz_display_list_devices (GdkDisplay *dpy); +GdkDisplay * _gdk_quartz_display_open (const gchar *name); + GdkNativeWinodw _gdk_quartz_display_get_drag_get_protocol (GdkDisplay *display, GdkNativeWindow *xid, GdkDragProtocol *protocol,