From 1a7ab5dc9ad4bf8d9cb762fd5b035e3f9ae26504 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Tue, 15 Oct 2024 16:44:18 -0400 Subject: [PATCH] gdk: No displays before init Don't allow to create displays before gdk has been initialized. Note that this error triggers in nautilus 47.0, but we consider what it is doing unsupported and broken. Related: #7035 --- gdk/gdk.c | 13 ++++++++----- gdk/gdkdisplaymanager.c | 3 +++ gdk/gdkprivate.h | 7 +++++++ 3 files changed, 18 insertions(+), 5 deletions(-) diff --git a/gdk/gdk.c b/gdk/gdk.c index 13856d2d30..b67025cef0 100644 --- a/gdk/gdk.c +++ b/gdk/gdk.c @@ -113,6 +113,12 @@ static int gdk_initialized = 0; /* 1 if the library is initi * 0 otherwise. */ +gboolean +gdk_is_initialized (void) +{ + return gdk_initialized != 0; +} + static const GdkDebugKey gdk_debug_keys[] = { { "misc", GDK_DEBUG_MISC, "Miscellaneous information" }, { "events", GDK_DEBUG_EVENTS, "Information about events" }, @@ -360,13 +366,10 @@ gdk_display_open_default (void) { GdkDisplay *display; - g_return_val_if_fail (gdk_initialized, NULL); - display = gdk_display_get_default (); - if (display) - return display; - display = gdk_display_open (NULL); + if (!display) + display = gdk_display_open (NULL); return display; } diff --git a/gdk/gdkdisplaymanager.c b/gdk/gdkdisplaymanager.c index a9ebe06c28..7429ab18f8 100644 --- a/gdk/gdkdisplaymanager.c +++ b/gdk/gdkdisplaymanager.c @@ -28,6 +28,7 @@ #include "gdkdisplaymanagerprivate.h" #include "gdkdisplayprivate.h" #include "gdkkeysprivate.h" +#include "gdkprivate.h" #include #ifdef GDK_WINDOWING_X11 @@ -294,6 +295,8 @@ gdk_display_manager_get (void) { static GdkDisplayManager *manager = NULL; + gdk_ensure_initialized (); + if (manager == NULL) manager = g_object_new (GDK_TYPE_DISPLAY_MANAGER, NULL); diff --git a/gdk/gdkprivate.h b/gdk/gdkprivate.h index fd2972f9aa..6fefe1e991 100644 --- a/gdk/gdkprivate.h +++ b/gdk/gdkprivate.h @@ -5,6 +5,13 @@ /* Private API for use in GTK+ */ void gdk_pre_parse (void); +gboolean gdk_is_initialized (void); + +#define gdk_ensure_initialized() \ +G_STMT_START { \ + if (!gdk_is_initialized ()) \ + g_error ("%s() was called before gtk_init()", G_STRFUNC); \ +} G_STMT_END gboolean gdk_running_in_sandbox (void); gboolean gdk_should_use_portal (void);