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:
parent
4ae9953607
commit
53fce8e988
@ -157,6 +157,11 @@ prefs_changed_callback (MetaPreference pref,
|
|||||||
static void
|
static void
|
||||||
invalidate_whole_window (MetaUIFrame *frame)
|
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);
|
gdk_window_invalidate_rect (frame->window, NULL, FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -526,6 +531,7 @@ meta_frames_manage_window (MetaFrames *frames,
|
|||||||
frame->title = NULL;
|
frame->title = NULL;
|
||||||
frame->prelit_control = META_FRAME_CONTROL_NONE;
|
frame->prelit_control = META_FRAME_CONTROL_NONE;
|
||||||
frame->button_state = META_BUTTON_STATE_NORMAL;
|
frame->button_state = META_BUTTON_STATE_NORMAL;
|
||||||
|
frame->is_frozen = FALSE;
|
||||||
|
|
||||||
meta_x11_wm_grab_buttons (frames->x11_display, frame->xwindow);
|
meta_x11_wm_grab_buttons (frames->x11_display, frame->xwindow);
|
||||||
|
|
||||||
@ -555,6 +561,9 @@ meta_ui_frame_unmanage (MetaUIFrame *frame)
|
|||||||
if (frame->text_layout)
|
if (frame->text_layout)
|
||||||
g_object_unref (G_OBJECT (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->title);
|
||||||
|
|
||||||
g_free (frame);
|
g_free (frame);
|
||||||
@ -1563,6 +1572,12 @@ meta_ui_frame_paint (MetaUIFrame *frame,
|
|||||||
&button_layout,
|
&button_layout,
|
||||||
button_states,
|
button_states,
|
||||||
mini_icon);
|
mini_icon);
|
||||||
|
|
||||||
|
if (frame->is_frozen)
|
||||||
|
{
|
||||||
|
meta_window_x11_thaw_commits (frame->meta_window);
|
||||||
|
frame->is_frozen = FALSE;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
|
@ -82,6 +82,8 @@ struct _MetaUIFrame
|
|||||||
MetaFrameControl prelit_control;
|
MetaFrameControl prelit_control;
|
||||||
MetaButtonState button_state;
|
MetaButtonState button_state;
|
||||||
int grab_button;
|
int grab_button;
|
||||||
|
|
||||||
|
gboolean is_frozen;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct _MetaFrames
|
struct _MetaFrames
|
||||||
|
Loading…
x
Reference in New Issue
Block a user