[mutter] window/x11: Add `always_update_shape()` vfunc
- From: Jonas Ådahl <jadahl src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [mutter] window/x11: Add `always_update_shape()` vfunc
- Date: Thu, 16 Jan 2020 08:51:21 +0000 (UTC)
commit 4d5a86327a1c2ec4f8a9ac6202373e629c4cc2a0
Author: Olivier Fourdan <ofourdan redhat com>
Date: Fri Dec 6 16:01:35 2019 +0100
window/x11: Add `always_update_shape()` vfunc
To address the black shadows that sometimes show during resize with
Xwayland, we need to update the window shape regardless of the frozen
status of the window actor.
However, plain Xorg does not need this, as resized windows do not clear
to black, so add a new vfunc to window/x11 to indicate whether or not
the backing windowing system (either plain X11 or Xwayland) would
require the shape to be always updated.
https://gitlab.gnome.org/GNOME/mutter/merge_requests/942
src/wayland/meta-window-xwayland.c | 16 ++++++++++++++++
src/x11/window-x11-private.h | 1 +
src/x11/window-x11.c | 15 +++++++++++++++
src/x11/window-x11.h | 1 +
4 files changed, 33 insertions(+)
---
diff --git a/src/wayland/meta-window-xwayland.c b/src/wayland/meta-window-xwayland.c
index 5b1c4198e..0c77ca5d7 100644
--- a/src/wayland/meta-window-xwayland.c
+++ b/src/wayland/meta-window-xwayland.c
@@ -219,6 +219,21 @@ meta_window_xwayland_thaw_commits (MetaWindow *window)
apply_allow_commits_x11_property (xwayland_window, TRUE);
}
+static gboolean
+meta_window_xwayland_always_update_shape (MetaWindow *window)
+{
+ /*
+ * On Xwayland, resizing a window will clear the corresponding Wayland
+ * buffer to plain solid black.
+ *
+ * Therefore, to address the black shadows which sometimes show during
+ * resize with Xwayland, we need to always update the window shape
+ * regardless of the actual frozen state of the window actor.
+ */
+
+ return TRUE;
+}
+
static void
meta_window_xwayland_get_property (GObject *object,
guint prop_id,
@@ -270,6 +285,7 @@ meta_window_xwayland_class_init (MetaWindowXwaylandClass *klass)
window_x11_class->freeze_commits = meta_window_xwayland_freeze_commits;
window_x11_class->thaw_commits = meta_window_xwayland_thaw_commits;
+ window_x11_class->always_update_shape = meta_window_xwayland_always_update_shape;
gobject_class->get_property = meta_window_xwayland_get_property;
gobject_class->set_property = meta_window_xwayland_set_property;
diff --git a/src/x11/window-x11-private.h b/src/x11/window-x11-private.h
index 621609e3e..906d44546 100644
--- a/src/x11/window-x11-private.h
+++ b/src/x11/window-x11-private.h
@@ -36,6 +36,7 @@ struct _MetaWindowX11Class
void (*freeze_commits) (MetaWindow *window);
void (*thaw_commits) (MetaWindow *window);
+ gboolean (*always_update_shape) (MetaWindow *window);
};
struct _MetaWindowX11
diff --git a/src/x11/window-x11.c b/src/x11/window-x11.c
index 93cfa8e0d..87067955b 100644
--- a/src/x11/window-x11.c
+++ b/src/x11/window-x11.c
@@ -2014,6 +2014,12 @@ meta_window_x11_unmap (MetaWindow *window)
window->unmaps_pending ++;
}
+static gboolean
+meta_window_x11_impl_always_update_shape (MetaWindow *window)
+{
+ return FALSE;
+}
+
static void
meta_window_x11_class_init (MetaWindowX11Class *klass)
{
@@ -2047,6 +2053,7 @@ meta_window_x11_class_init (MetaWindowX11Class *klass)
klass->freeze_commits = meta_window_x11_impl_freeze_commits;
klass->thaw_commits = meta_window_x11_impl_thaw_commits;
+ klass->always_update_shape = meta_window_x11_impl_always_update_shape;
}
void
@@ -4051,3 +4058,11 @@ meta_window_x11_should_thaw_after_paint (MetaWindow *window)
return priv->thaw_after_paint;
}
+
+gboolean
+meta_window_x11_always_update_shape (MetaWindow *window)
+{
+ MetaWindowX11 *window_x11 = META_WINDOW_X11 (window);
+
+ return META_WINDOW_X11_GET_CLASS (window_x11)->always_update_shape (window);
+}
diff --git a/src/x11/window-x11.h b/src/x11/window-x11.h
index 7864135bb..256bca568 100644
--- a/src/x11/window-x11.h
+++ b/src/x11/window-x11.h
@@ -87,5 +87,6 @@ void meta_window_x11_thaw_commits (MetaWindow *window);
void meta_window_x11_set_thaw_after_paint (MetaWindow *window,
gboolean thaw_after_paint);
gboolean meta_window_x11_should_thaw_after_paint (MetaWindow *window);
+gboolean meta_window_x11_always_update_shape (MetaWindow *window);
#endif
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]