Commit fea13fcf authored by Matthias Clasen's avatar Matthias Clasen

Fix a problem with screen changes and csd

When a new screen is set on a window, we unrealize it, to
recreate all the resources. But we don't reset the client_decorated
flag, so realize() doesn't call create_decoration() - which makes
sense, since the decoration already exists. But the side-effect
of create_decoration() is to select the rgba visual, and visuals
are per-screen.

Fix this by looking for the rgba visual in set_screen(), and
replacing it with the rgba visual for the new screen, if necessary.
parent 20026130
......@@ -10291,6 +10291,7 @@ gtk_window_set_screen (GtkWindow *window,
GtkWindowPrivate *priv;
GtkWidget *widget;
GdkScreen *previous_screen;
gboolean was_rgba;
gboolean was_mapped;
g_return_if_fail (GTK_IS_WINDOW (window));
......@@ -10304,6 +10305,12 @@ gtk_window_set_screen (GtkWindow *window,
widget = GTK_WIDGET (window);
previous_screen = priv->screen;
if (gdk_screen_get_rgba_visual (previous_screen) == gtk_widget_get_visual (widget))
was_rgba = TRUE;
else
was_rgba = FALSE;
was_mapped = gtk_widget_get_mapped (widget);
if (was_mapped)
......@@ -10337,6 +10344,15 @@ gtk_window_set_screen (GtkWindow *window,
}
g_object_notify (G_OBJECT (window), "screen");
if (was_rgba)
{
GdkVisual *visual;
visual = gdk_screen_get_rgba_visual (screen);
if (visual)
gtk_widget_set_visual (widget, visual);
}
if (was_mapped)
gtk_widget_map (widget);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment