Merge branch 'display-woes' into 'gtk-3-24'

Couple of fixes for GtkDisplay open/close

See merge request GNOME/gtk!1343
This commit is contained in:
Matthias Clasen 2020-01-24 16:35:13 +00:00
commit e4509d723e
4 changed files with 40 additions and 11 deletions

View File

@ -992,15 +992,14 @@ gdk_window_impl_wayland_beep (GdkWindow *window)
static void
gdk_window_impl_wayland_finalize (GObject *object)
{
GdkWindow *window = GDK_WINDOW (object);
GdkWindowImplWayland *impl;
g_return_if_fail (GDK_IS_WINDOW_IMPL_WAYLAND (object));
impl = GDK_WINDOW_IMPL_WAYLAND (object);
if (gdk_wayland_window_is_exported (window))
gdk_wayland_window_unexport_handle (window);
if (gdk_wayland_window_is_exported (impl->wrapper))
gdk_wayland_window_unexport_handle (impl->wrapper);
g_free (impl->title);

View File

@ -608,9 +608,10 @@ unset_screen (GtkIconTheme *icon_theme)
g_signal_handlers_disconnect_by_func (display,
(gpointer) display_closed,
icon_theme);
g_signal_handlers_disconnect_by_func (settings,
(gpointer) theme_changed,
icon_theme);
if (settings)
g_signal_handlers_disconnect_by_func (settings,
(gpointer) theme_changed,
icon_theme);
priv->screen = NULL;
}

View File

@ -463,10 +463,10 @@ display_closed_cb (GdkDisplay *display,
screen = gdk_display_get_default_screen (display);
settings = gtk_settings_get_for_screen (screen);
g_object_set_data_full (G_OBJECT (settings),
I_("gtk-modules"),
NULL, NULL);
if (settings)
g_object_set_data_full (G_OBJECT (settings),
I_("gtk-modules"),
NULL, NULL);
}

View File

@ -1900,6 +1900,29 @@ settings_init_style (GtkSettings *settings)
settings_update_key_theme (settings);
}
static void
settings_display_closed (GdkDisplay *display,
gboolean is_error,
gpointer data)
{
DisplaySettings *ds;
int i;
if (G_UNLIKELY (display_settings == NULL))
return;
ds = (DisplaySettings *)display_settings->data;
for (i = 0; i < display_settings->len; i++)
{
if (ds[i].display == display)
{
g_clear_object (&ds[i].settings);
display_settings = g_array_remove_index_fast (display_settings, i);
break;
}
}
}
static GtkSettings *
gtk_settings_create_for_display (GdkDisplay *display)
{
@ -1955,7 +1978,9 @@ gtk_settings_create_for_display (GdkDisplay *display)
v.display = display;
v.settings = settings;
g_array_append_val (display_settings, v);
display_settings = g_array_append_val (display_settings, v);
g_signal_connect (display, "closed",
G_CALLBACK (settings_display_closed), NULL);
settings_init_style (settings);
settings_update_xsettings (settings);
@ -1975,6 +2000,10 @@ gtk_settings_get_for_display (GdkDisplay *display)
DisplaySettings *ds;
int i;
/* If the display is closed, we don't want to recreate the settings! */
if G_UNLIKELY (gdk_display_is_closed (display))
return NULL;
if G_UNLIKELY (display_settings == NULL)
display_settings = g_array_new (FALSE, TRUE, sizeof (DisplaySettings));