From 7ef508ff4a40c11c8ef58e8f74ba7ad0e93888a3 Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Wed, 10 Apr 2013 23:11:52 +0200 Subject: [PATCH] displaymanager: Handle list of displays in base class This moves the add/remove_display() functions from the subclasses to GdkDisplay and GdkDisplayManager. It also gets rid of the list_displays vfunc. --- gdk/broadway/gdkdisplay-broadway.c | 5 --- gdk/broadway/gdkdisplaymanager-broadway.c | 40 ----------------------- gdk/broadway/gdkprivate-broadway.h | 4 --- gdk/gdkdisplay.c | 5 +++ gdk/gdkdisplaymanager.c | 28 +++++++++++++++- gdk/gdkdisplaymanagerprivate.h | 8 ++++- gdk/quartz/gdkdisplay-quartz.c | 5 --- gdk/quartz/gdkdisplaymanager-quartz.c | 40 ----------------------- gdk/quartz/gdkprivate-quartz.h | 6 ---- gdk/wayland/gdkdisplaymanager-wayland.c | 7 ---- gdk/win32/gdkdisplaymanager-win32.c | 7 ---- gdk/x11/gdkdisplay-x11.c | 5 --- gdk/x11/gdkdisplaymanager-x11.c | 35 -------------------- gdk/x11/gdkprivate-x11.h | 5 --- 14 files changed, 39 insertions(+), 161 deletions(-) diff --git a/gdk/broadway/gdkdisplay-broadway.c b/gdk/broadway/gdkdisplay-broadway.c index ed24fe0c34..7534a9fa07 100644 --- a/gdk/broadway/gdkdisplay-broadway.c +++ b/gdk/broadway/gdkdisplay-broadway.c @@ -55,8 +55,6 @@ G_DEFINE_TYPE (GdkBroadwayDisplay, gdk_broadway_display, GDK_TYPE_DISPLAY) static void gdk_broadway_display_init (GdkBroadwayDisplay *display) { - _gdk_broadway_display_manager_add_display (gdk_display_manager_get (), - GDK_DISPLAY_OBJECT (display)); display->id_ht = g_hash_table_new (NULL, NULL); } @@ -239,9 +237,6 @@ gdk_broadway_display_dispose (GObject *object) { GdkBroadwayDisplay *broadway_display = GDK_BROADWAY_DISPLAY (object); - _gdk_broadway_display_manager_remove_display (gdk_display_manager_get (), - GDK_DISPLAY_OBJECT (object)); - g_list_foreach (broadway_display->input_devices, (GFunc) g_object_run_dispose, NULL); _gdk_screen_close (broadway_display->screens[0]); diff --git a/gdk/broadway/gdkdisplaymanager-broadway.c b/gdk/broadway/gdkdisplaymanager-broadway.c index 461a099e02..468d4fc6d6 100644 --- a/gdk/broadway/gdkdisplaymanager-broadway.c +++ b/gdk/broadway/gdkdisplaymanager-broadway.c @@ -34,8 +34,6 @@ struct _GdkBroadwayDisplayManager { GdkDisplayManager parent; - GSList *displays; - gboolean init_failed; }; @@ -90,14 +88,6 @@ gdk_broadway_display_manager_open_display (GdkDisplayManager *manager, return _gdk_broadway_display_open (name); } -static GSList * -gdk_broadway_display_manager_list_displays (GdkDisplayManager *manager) -{ - GdkBroadwayDisplayManager *manager_broadway = GDK_BROADWAY_DISPLAY_MANAGER (manager); - - return g_slist_copy (manager_broadway->displays); -} - #include "../gdkkeynames.c" static gchar * @@ -137,38 +127,8 @@ gdk_broadway_display_manager_class_init (GdkBroadwayDisplayManagerClass *class) object_class->finalize = gdk_broadway_display_manager_finalize; manager_class->open_display = gdk_broadway_display_manager_open_display; - manager_class->list_displays = gdk_broadway_display_manager_list_displays; manager_class->atom_intern = _gdk_broadway_display_manager_atom_intern; manager_class->get_atom_name = _gdk_broadway_display_manager_get_atom_name; manager_class->lookup_keyval = gdk_broadway_display_manager_lookup_keyval; manager_class->get_keyval_name = gdk_broadway_display_manager_get_keyval_name; } - -void -_gdk_broadway_display_manager_add_display (GdkDisplayManager *manager, - GdkDisplay *display) -{ - GdkBroadwayDisplayManager *manager_broadway = GDK_BROADWAY_DISPLAY_MANAGER (manager); - - if (manager_broadway->displays == NULL) - gdk_display_manager_set_default_display (manager, display); - - manager_broadway->displays = g_slist_prepend (manager_broadway->displays, display); -} - -void -_gdk_broadway_display_manager_remove_display (GdkDisplayManager *manager, - GdkDisplay *display) -{ - GdkBroadwayDisplayManager *manager_broadway = GDK_BROADWAY_DISPLAY_MANAGER (manager); - - manager_broadway->displays = g_slist_remove (manager_broadway->displays, display); - - if (gdk_display_manager_get_default_display (manager) == display) - { - if (manager_broadway->displays) - gdk_display_manager_set_default_display (manager, manager_broadway->displays->data); - else - gdk_display_manager_set_default_display (manager, NULL); - } -} diff --git a/gdk/broadway/gdkprivate-broadway.h b/gdk/broadway/gdkprivate-broadway.h index e611ca8c39..b631e04178 100644 --- a/gdk/broadway/gdkprivate-broadway.h +++ b/gdk/broadway/gdkprivate-broadway.h @@ -44,10 +44,6 @@ void _gdk_broadway_windowing_init (void); gchar * _gdk_broadway_display_manager_get_atom_name (GdkDisplayManager *manager, GdkAtom atom); -void _gdk_broadway_display_manager_add_display (GdkDisplayManager *manager, - GdkDisplay *display); -void _gdk_broadway_display_manager_remove_display (GdkDisplayManager *manager, - GdkDisplay *display); GdkAtom _gdk_broadway_display_manager_atom_intern_static_string (GdkDisplayManager *manager, const gchar *atom_name); GdkAtom _gdk_broadway_display_manager_atom_intern (GdkDisplayManager *manager, diff --git a/gdk/gdkdisplay.c b/gdk/gdkdisplay.c index 32d9d3a72e..dbddfe88ad 100644 --- a/gdk/gdkdisplay.c +++ b/gdk/gdkdisplay.c @@ -25,6 +25,7 @@ #include "gdkdisplayprivate.h" #include "gdkdeviceprivate.h" +#include "gdkdisplaymanagerprivate.h" #include "gdkevents.h" #include "gdkwindowimpl.h" #include "gdkinternals.h" @@ -206,6 +207,8 @@ gdk_display_init (GdkDisplay *display) g_signal_connect (display, "opened", G_CALLBACK (gdk_display_opened), NULL); + + _gdk_display_manager_add_display (gdk_display_manager_get (), display); } static void @@ -216,6 +219,8 @@ gdk_display_dispose (GObject *object) device_manager = gdk_display_get_device_manager (GDK_DISPLAY (object)); + _gdk_display_manager_remove_display (gdk_display_manager_get (), display); + g_list_free_full (display->queued_events, (GDestroyNotify) gdk_event_free); display->queued_events = NULL; display->queued_tail = NULL; diff --git a/gdk/gdkdisplaymanager.c b/gdk/gdkdisplaymanager.c index de045828e7..0442ae0580 100644 --- a/gdk/gdkdisplaymanager.c +++ b/gdk/gdkdisplaymanager.c @@ -502,7 +502,7 @@ gdk_display_manager_set_default_display (GdkDisplayManager *manager, GSList * gdk_display_manager_list_displays (GdkDisplayManager *manager) { - return GDK_DISPLAY_MANAGER_GET_CLASS (manager)->list_displays (manager); + return g_slist_copy (manager->displays); } /** @@ -589,3 +589,29 @@ gdk_atom_name (GdkAtom atom) return GDK_DISPLAY_MANAGER_GET_CLASS (manager)->get_atom_name (manager, atom); } + +void +_gdk_display_manager_add_display (GdkDisplayManager *manager, + GdkDisplay *display) +{ + if (manager->displays == NULL) + gdk_display_manager_set_default_display (manager, display); + + manager->displays = g_slist_prepend (manager->displays, display); +} + +/* NB: This function can be called multiple times per display. */ +void +_gdk_display_manager_remove_display (GdkDisplayManager *manager, + GdkDisplay *display) +{ + manager->displays = g_slist_remove (manager->displays, display); + + if (manager->default_display == display) + { + if (manager->displays) + gdk_display_manager_set_default_display (manager, manager->displays->data); + else + gdk_display_manager_set_default_display (manager, NULL); + } +} diff --git a/gdk/gdkdisplaymanagerprivate.h b/gdk/gdkdisplaymanagerprivate.h index 6123f816a8..4794b7e731 100644 --- a/gdk/gdkdisplaymanagerprivate.h +++ b/gdk/gdkdisplaymanagerprivate.h @@ -33,13 +33,14 @@ struct _GdkDisplayManager GObject parent_instance; GdkDisplay *default_display; + + GSList *displays; }; struct _GdkDisplayManagerClass { GObjectClass parent_class; - GSList * (*list_displays) (GdkDisplayManager *manager); GdkDisplay * (*open_display) (GdkDisplayManager *manager, const gchar *name); @@ -66,6 +67,11 @@ struct _GdkDisplayManagerClass GdkDisplayManager * _gdk_display_manager_get_nocreate (void); +void _gdk_display_manager_add_display (GdkDisplayManager *manager, + GdkDisplay *display); +void _gdk_display_manager_remove_display (GdkDisplayManager *manager, + GdkDisplay *display); + G_END_DECLS #endif diff --git a/gdk/quartz/gdkdisplay-quartz.c b/gdk/quartz/gdkdisplay-quartz.c index f78479f039..1921e67681 100644 --- a/gdk/quartz/gdkdisplay-quartz.c +++ b/gdk/quartz/gdkdisplay-quartz.c @@ -265,8 +265,6 @@ G_DEFINE_TYPE (GdkQuartzDisplay, gdk_quartz_display, GDK_TYPE_DISPLAY) static void gdk_quartz_display_init (GdkQuartzDisplay *display) { - _gdk_quartz_display_manager_add_display (gdk_display_manager_get (), - GDK_DISPLAY_OBJECT (display)); } static void @@ -274,9 +272,6 @@ gdk_quartz_display_dispose (GObject *object) { GdkQuartzDisplay *display_quartz = GDK_QUARTZ_DISPLAY (object); - _gdk_quartz_display_manager_remove_display (gdk_display_manager_get (), - GDK_DISPLAY_OBJECT (object)); - g_list_foreach (display_quartz->input_devices, (GFunc) g_object_run_dispose, NULL); diff --git a/gdk/quartz/gdkdisplaymanager-quartz.c b/gdk/quartz/gdkdisplaymanager-quartz.c index e9fa2fff27..bccaf247f6 100644 --- a/gdk/quartz/gdkdisplaymanager-quartz.c +++ b/gdk/quartz/gdkdisplaymanager-quartz.c @@ -35,8 +35,6 @@ struct _GdkQuartzDisplayManager { GdkDisplayManager parent; - - GSList *displays; }; @@ -49,14 +47,6 @@ gdk_quartz_display_manager_open_display (GdkDisplayManager *manager, return _gdk_quartz_display_open (name); } -static GSList * -gdk_quartz_display_manager_list_displays (GdkDisplayManager *manager) -{ - GdkQuartzDisplayManager *manager_quartz = GDK_QUARTZ_DISPLAY_MANAGER (manager); - - return g_slist_copy (manager_quartz->displays); -} - #include "../gdkkeynames.c" static gchar * @@ -106,38 +96,8 @@ gdk_quartz_display_manager_class_init (GdkQuartzDisplayManagerClass *class) object_class->finalize = gdk_quartz_display_manager_finalize; manager_class->open_display = gdk_quartz_display_manager_open_display; - manager_class->list_displays = gdk_quartz_display_manager_list_displays; manager_class->atom_intern = _gdk_quartz_display_manager_atom_intern; manager_class->get_atom_name = _gdk_quartz_display_manager_get_atom_name; manager_class->lookup_keyval = gdk_quartz_display_manager_lookup_keyval; manager_class->get_keyval_name = gdk_quartz_display_manager_get_keyval_name; } - -void -_gdk_quartz_display_manager_add_display (GdkDisplayManager *manager, - GdkDisplay *display) -{ - GdkQuartzDisplayManager *manager_quartz = GDK_QUARTZ_DISPLAY_MANAGER (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) -{ - GdkQuartzDisplayManager *manager_quartz = GDK_QUARTZ_DISPLAY_MANAGER (manager); - - manager_quartz->displays = g_slist_remove (manager_quartz->displays, display); - - if (gdk_display_manager_get_default_display (manager) == 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/gdkprivate-quartz.h b/gdk/quartz/gdkprivate-quartz.h index dcac5028ba..eed09b9a75 100644 --- a/gdk/quartz/gdkprivate-quartz.h +++ b/gdk/quartz/gdkprivate-quartz.h @@ -155,12 +155,6 @@ gchar * _gdk_quartz_display_utf8_to_string_target (GdkDisplay *disp const gchar *str); -/* Display manager */ -void _gdk_quartz_display_manager_add_display (GdkDisplayManager *manager, - GdkDisplay *display); -void _gdk_quartz_display_manager_remove_display (GdkDisplayManager *manager, - GdkDisplay *display); - /* Display manager methods - events */ GdkAtom _gdk_quartz_display_manager_atom_intern (GdkDisplayManager *manager, const gchar *atom_name, diff --git a/gdk/wayland/gdkdisplaymanager-wayland.c b/gdk/wayland/gdkdisplaymanager-wayland.c index 43a9960582..17160fbdb0 100644 --- a/gdk/wayland/gdkdisplaymanager-wayland.c +++ b/gdk/wayland/gdkdisplaymanager-wayland.c @@ -100,12 +100,6 @@ gdk_wayland_display_manager_open_display (GdkDisplayManager *manager, return _gdk_wayland_display_open (name); } -static GSList * -gdk_wayland_display_manager_list_displays (GdkDisplayManager *manager) -{ - return g_slist_copy (GDK_WAYLAND_DISPLAY_MANAGER (manager)->displays); -} - static GdkAtom gdk_wayland_display_manager_atom_intern (GdkDisplayManager *manager_in, const gchar *atom_name, @@ -197,7 +191,6 @@ gdk_wayland_display_manager_class_init (GdkWaylandDisplayManagerClass *class) object_class->finalize = gdk_wayland_display_manager_finalize; manager_class->open_display = gdk_wayland_display_manager_open_display; - manager_class->list_displays = gdk_wayland_display_manager_list_displays; manager_class->atom_intern = gdk_wayland_display_manager_atom_intern; manager_class->get_atom_name = gdk_wayland_display_manager_get_atom_name; manager_class->lookup_keyval = gdk_wayland_display_manager_lookup_keyval; diff --git a/gdk/win32/gdkdisplaymanager-win32.c b/gdk/win32/gdkdisplaymanager-win32.c index 1d8c8ee8bd..a968f8e7b4 100644 --- a/gdk/win32/gdkdisplaymanager-win32.c +++ b/gdk/win32/gdkdisplaymanager-win32.c @@ -45,12 +45,6 @@ gdk_win32_display_manager_open_display (GdkDisplayManager *manager, return _gdk_win32_display_open (name); } -static GSList * -gdk_win32_display_manager_list_displays (GdkDisplayManager *manager) -{ - return g_slist_append (NULL, gdk_display_get_default ()); -} - #include "../gdkkeynames.c" static gchar * @@ -96,7 +90,6 @@ gdk_win32_display_manager_class_init (GdkWin32DisplayManagerClass *class) object_class->finalize = gdk_win32_display_manager_finalize; manager_class->open_display = gdk_win32_display_manager_open_display; - manager_class->list_displays = gdk_win32_display_manager_list_displays; manager_class->atom_intern = _gdk_win32_display_manager_atom_intern; manager_class->get_atom_name = _gdk_win32_display_manager_get_atom_name; manager_class->lookup_keyval = gdk_win32_display_manager_lookup_keyval; diff --git a/gdk/x11/gdkdisplay-x11.c b/gdk/x11/gdkdisplay-x11.c index fc4c979300..9ca1bd7ab2 100644 --- a/gdk/x11/gdkdisplay-x11.c +++ b/gdk/x11/gdkdisplay-x11.c @@ -176,8 +176,6 @@ G_DEFINE_TYPE_WITH_CODE (GdkX11Display, gdk_x11_display, GDK_TYPE_DISPLAY, static void gdk_x11_display_init (GdkX11Display *display) { - _gdk_x11_display_manager_add_display (gdk_display_manager_get (), - GDK_DISPLAY (display)); } static void @@ -1836,11 +1834,8 @@ gdk_x11_display_ungrab (GdkDisplay *display) static void gdk_x11_display_dispose (GObject *object) { - GdkDisplay *display = GDK_DISPLAY (object); GdkX11Display *display_x11 = GDK_X11_DISPLAY (object); - _gdk_x11_display_manager_remove_display (gdk_display_manager_get (), display); - g_list_foreach (display_x11->input_devices, (GFunc) g_object_run_dispose, NULL); _gdk_screen_close (display_x11->screen); diff --git a/gdk/x11/gdkdisplaymanager-x11.c b/gdk/x11/gdkdisplaymanager-x11.c index 61c04dfcea..afe5e9491c 100644 --- a/gdk/x11/gdkdisplaymanager-x11.c +++ b/gdk/x11/gdkdisplaymanager-x11.c @@ -32,8 +32,6 @@ struct _GdkX11DisplayManager { GdkDisplayManager parent; - GSList *displays; - gboolean init_failed; }; @@ -92,12 +90,6 @@ gdk_x11_display_manager_open_display (GdkDisplayManager *manager, return display; } -static GSList * -gdk_x11_display_manager_list_displays (GdkDisplayManager *manager) -{ - return g_slist_copy (GDK_X11_DISPLAY_MANAGER (manager)->displays); -} - static void gdk_x11_display_manager_init (GdkX11DisplayManager *manager) { @@ -121,36 +113,9 @@ gdk_x11_display_manager_class_init (GdkX11DisplayManagerClass *class) object_class->finalize = gdk_x11_display_manager_finalize; manager_class->open_display = gdk_x11_display_manager_open_display; - manager_class->list_displays = gdk_x11_display_manager_list_displays; manager_class->atom_intern = _gdk_x11_display_manager_atom_intern; manager_class->get_atom_name = _gdk_x11_display_manager_get_atom_name; manager_class->lookup_keyval = _gdk_x11_display_manager_lookup_keyval; manager_class->get_keyval_name = _gdk_x11_display_manager_get_keyval_name; manager_class->keyval_convert_case = _gdk_x11_display_manager_keyval_convert_case; } - -void -_gdk_x11_display_manager_add_display (GdkDisplayManager *manager, - GdkDisplay *display) -{ - GdkX11DisplayManager *manager_x11 = GDK_X11_DISPLAY_MANAGER (manager); - - manager_x11->displays = g_slist_prepend (manager_x11->displays, display); -} - -void -_gdk_x11_display_manager_remove_display (GdkDisplayManager *manager, - GdkDisplay *display) -{ - GdkX11DisplayManager *manager_x11 = GDK_X11_DISPLAY_MANAGER (manager); - - manager_x11->displays = g_slist_remove (manager_x11->displays, display); - - if (gdk_display_manager_get_default_display (manager) == display) - { - if (manager_x11->displays) - gdk_display_manager_set_default_display (manager, manager_x11->displays->data); - else - gdk_display_manager_set_default_display (manager, NULL); - } -} diff --git a/gdk/x11/gdkprivate-x11.h b/gdk/x11/gdkprivate-x11.h index 6f7754a997..cbeb3030ed 100644 --- a/gdk/x11/gdkprivate-x11.h +++ b/gdk/x11/gdkprivate-x11.h @@ -247,11 +247,6 @@ void _gdk_device_xi2_reset_scroll_valuators (GdkX11DeviceXI2 *device); void _gdk_x11_event_translate_keyboard_string (GdkEventKey *event); -void _gdk_x11_display_manager_add_display (GdkDisplayManager *manager, - GdkDisplay *display); -void _gdk_x11_display_manager_remove_display (GdkDisplayManager *manager, - GdkDisplay *display); - GdkAtom _gdk_x11_display_manager_atom_intern (GdkDisplayManager *manager, const gchar *atom_name, gboolean copy_name);