Compare commits

...

4 Commits

Author SHA1 Message Date
Matthias Clasen
0b30e9a63b gdk: Spread the errors
Call gdk_ensure_initialized() directly in gdk_display_open_default(),
gdk_display_open(), gdk_x11_display_open() and gdk_display_get_default(),
so we get the right function name in the error message. These functions
are likely candidates that people might call without ensuring that GDK is
initialized.
2024-10-21 12:55:07 -04:00
Matthias Clasen
1a7ab5dc9a 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
2024-10-21 12:32:35 -04:00
Matthias Clasen
57b9435e13 print: Avoid calling gdk_display_get_default
Check if GTK has been initialized before trying to get a display
in a class_init function. The introspection property dumper code
will instantiate all types and run into the new introduced errors
if we try to get a display in class_init.
2024-10-21 12:32:35 -04:00
Matthias Clasen
212ba47646 tests: Cosmetics
Our test setups aready enforce GSETTINGS_BACKEND=memory, don't set
it again in code.
2024-10-21 12:32:25 -04:00
7 changed files with 30 additions and 10 deletions

View File

@@ -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,12 @@ gdk_display_open_default (void)
{
GdkDisplay *display;
g_return_val_if_fail (gdk_initialized, NULL);
gdk_ensure_initialized ();
display = gdk_display_get_default ();
if (display)
return display;
display = gdk_display_open (NULL);
if (!display)
display = gdk_display_open (NULL);
return display;
}

View File

@@ -1198,8 +1198,9 @@ gdk_display_get_app_launch_context (GdkDisplay *display)
GdkDisplay *
gdk_display_open (const char *display_name)
{
return gdk_display_manager_open_display (gdk_display_manager_get (),
display_name);
gdk_ensure_initialized ();
return gdk_display_manager_open_display (gdk_display_manager_get (), display_name);
}
gulong

View File

@@ -28,6 +28,7 @@
#include "gdkdisplaymanagerprivate.h"
#include "gdkdisplayprivate.h"
#include "gdkkeysprivate.h"
#include "gdkprivate.h"
#include <glib/gi18n-lib.h>
#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);
@@ -329,6 +332,8 @@ gdk_display_manager_get_default_display (GdkDisplayManager *manager)
GdkDisplay *
gdk_display_get_default (void)
{
gdk_ensure_initialized ();
return gdk_display_manager_get_default_display (gdk_display_manager_get ());
}

View File

@@ -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);

View File

@@ -1432,6 +1432,8 @@ gdk_x11_display_open (const char *display_name)
gboolean rgba;
gboolean composited;
gdk_ensure_initialized ();
XInitThreads ();
xdisplay = XOpenDisplay (display_name);

View File

@@ -368,6 +368,9 @@ ensure_fallback_style (void)
GdkDisplay *display;
GtkCssProvider *provider;
if (!gtk_is_initialized ())
return;
display = gdk_display_get_default ();
if (!display)
return;

View File

@@ -73,7 +73,7 @@ function_exists (const char *function_name)
if (g_module_symbol (module, function_name, &func) && func)
return TRUE;
for (i = 0; i < G_N_ELEMENTS(exceptions); i++)
for (i = 0; i < G_N_ELEMENTS (exceptions); i++)
{
if (g_str_equal (function_name, exceptions[i].expected))
{
@@ -321,9 +321,6 @@ main (int argc, char **argv)
guint n_types = 0, i;
int result;
/* These must be set before before gtk_test_init */
g_setenv ("GSETTINGS_BACKEND", "memory", TRUE);
/* initialize test program */
gtk_test_init (&argc, &argv);
gtk_test_register_all_types ();