From 632ee007a46dfb869f8b2f2598c54f9d19f06cdb Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Thu, 2 May 2013 16:06:21 +0200 Subject: [PATCH] displaymanager: Copy logic to display creation Use the same logic for display creation in gdk_display_manager_open_display() that is used for displaymanager creation. --- gdk/gdkdisplaymanager.c | 41 +++++++++++++++++++++++++++++++++++------ 1 file changed, 35 insertions(+), 6 deletions(-) diff --git a/gdk/gdkdisplaymanager.c b/gdk/gdkdisplaymanager.c index ebbf6b1c5d..577c93063e 100644 --- a/gdk/gdkdisplaymanager.c +++ b/gdk/gdkdisplaymanager.c @@ -501,19 +501,48 @@ GdkDisplay * gdk_display_manager_open_display (GdkDisplayManager *manager, const gchar *name) { - guint i; + const gchar *backend_list; + GdkDisplay *display; + gchar **backends; + gint i, j; + gboolean allow_any; - for (i = 0; gdk_backends[i].name != NULL; i++) + if (allowed_backends == NULL) + allowed_backends = "*"; + allow_any = strstr (allowed_backends, "*") != NULL; + + backend_list = g_getenv ("GDK_BACKEND"); + if (backend_list == NULL) + backend_list = allowed_backends; + backends = g_strsplit (backend_list, ",", 0); + + display = NULL; + + for (i = 0; display == NULL && backends[i] != NULL; i++) { - if (G_OBJECT_TYPE (manager) == gdk_backends[i].get_backend_type ()) + const gchar *backend = backends[i]; + gboolean any = g_str_equal (backend, "*"); + + if (!allow_any && !any && !strstr (allowed_backends, backend)) + continue; + + for (j = 0; gdk_backends[j].name != NULL; j++) { - return gdk_backends[i].open_display (name); + if ((any && allow_any) || + (any && strstr (allowed_backends, gdk_backends[j].name)) || + g_str_equal (backend, gdk_backends[j].name)) + { + GDK_NOTE (MISC, g_message ("Trying %s backend", gdk_backends[j].name)); + display = gdk_backends[j].open_display (name); + if (display) + break; + } } } - g_assert_not_reached (); + g_strfreev (backends); - return NULL; + return display; } void