frames: Freeze Xwayland commits until repainted

To make sure the frame is painted before the commits are thawed, freeze
the commits when invalidating the GDK window, only to thaw to it after
the actual frame draw is performed or the frame is destroyed.

https://gitlab.gnome.org/GNOME/mutter/merge_requests/942
This commit is contained in:
Olivier Fourdan 2020-01-15 10:40:54 +01:00
parent 4ae9953607
commit 53fce8e988
2 changed files with 17 additions and 0 deletions

View File

@ -157,6 +157,11 @@ prefs_changed_callback (MetaPreference pref,
static void
invalidate_whole_window (MetaUIFrame *frame)
{
if (!frame->is_frozen)
{
meta_window_x11_freeze_commits (frame->meta_window);
frame->is_frozen = TRUE;
}
gdk_window_invalidate_rect (frame->window, NULL, FALSE);
}
@ -526,6 +531,7 @@ meta_frames_manage_window (MetaFrames *frames,
frame->title = NULL;
frame->prelit_control = META_FRAME_CONTROL_NONE;
frame->button_state = META_BUTTON_STATE_NORMAL;
frame->is_frozen = FALSE;
meta_x11_wm_grab_buttons (frames->x11_display, frame->xwindow);
@ -555,6 +561,9 @@ meta_ui_frame_unmanage (MetaUIFrame *frame)
if (frame->text_layout)
g_object_unref (G_OBJECT (frame->text_layout));
if (frame->is_frozen)
meta_window_x11_thaw_commits (frame->meta_window);
g_free (frame->title);
g_free (frame);
@ -1563,6 +1572,12 @@ meta_ui_frame_paint (MetaUIFrame *frame,
&button_layout,
button_states,
mini_icon);
if (frame->is_frozen)
{
meta_window_x11_thaw_commits (frame->meta_window);
frame->is_frozen = FALSE;
}
}
static gboolean

View File

@ -82,6 +82,8 @@ struct _MetaUIFrame
MetaFrameControl prelit_control;
MetaButtonState button_state;
int grab_button;
gboolean is_frozen;
};
struct _MetaFrames