diff --git a/gdk/x11/gdkdisplaymanager-x11.c b/gdk/x11/gdkdisplaymanager-x11.c index 544036f1fe..44bd17752d 100644 --- a/gdk/x11/gdkdisplaymanager-x11.c +++ b/gdk/x11/gdkdisplaymanager-x11.c @@ -34,6 +34,8 @@ struct _GdkX11DisplayManager GdkDisplay *default_display; GSList *displays; + + gboolean init_failed; }; struct _GdkX11DisplayManagerClass @@ -41,7 +43,37 @@ struct _GdkX11DisplayManagerClass GdkDisplayManagerClass parent_class; }; -G_DEFINE_TYPE (GdkX11DisplayManager, gdk_x11_display_manager, GDK_TYPE_DISPLAY_MANAGER) +static void g_initable_iface_init (GInitableIface *iface); + +G_DEFINE_TYPE_WITH_CODE (GdkX11DisplayManager, gdk_x11_display_manager, GDK_TYPE_DISPLAY_MANAGER, + G_IMPLEMENT_INTERFACE (G_TYPE_INITABLE, g_initable_iface_init)) + +static gboolean +gdk_x11_display_manager_initable_init (GInitable *initable, + GCancellable *cancellable, + GError **error) +{ + Display *display; + + /* check that a connection to the default display is possible */ + display = XOpenDisplay (gdk_get_display_arg_name ()); + if (!display) + { + GDK_X11_DISPLAY_MANAGER (initable)->init_failed = TRUE; + return FALSE; + } + + XCloseDisplay (display); + + return TRUE; +} + +void +g_initable_iface_init (GInitableIface *iface) +{ + iface->init = gdk_x11_display_manager_initable_init; +} + static GdkDisplay * gdk_x11_display_manager_open_display (GdkDisplayManager *manager, @@ -93,7 +125,8 @@ gdk_x11_display_manager_init (GdkX11DisplayManager *manager) static void gdk_x11_display_manager_finalize (GObject *object) { - g_error ("A GdkX11DisplayManager object was finalized. This should not happen"); + if (GDK_X11_DISPLAY_MANAGER (object)->init_failed == FALSE) + g_error ("A GdkX11DisplayManager object was finalized. This should not happen"); G_OBJECT_CLASS (gdk_x11_display_manager_parent_class)->finalize (object); }