Skip to content
Commits on Source (27)
3.38.3
======
* xwayland: Set xrandr primary output [Aleksandr; !1638]
* Disable CRTCs if there is no monitor [Kai-Heng; !1561]
* Fixed crashes [Olivier, Jonas; !1650]
* Misc. bug fixes [Marc-Antoine, Carlos; !1668, !1655]
Contributors:
Jonas Ådahl, Kai-Heng Feng, Olivier Fourdan, Carlos Garnacho,
Aleksandr Mezin, Marc-Antoine Perennou
Translators:
Kjartan Maraas [nb], Juliano de Souza Camargo [pt], Florentina Mușat [ro]
3.38.2
======
* Fix unwanted position changes on window resize
......
......@@ -1866,7 +1866,7 @@ static gint
_cally_atk_attribute_lookup_func (gconstpointer data,
gconstpointer user_data)
{
AtkTextAttribute attr = (AtkTextAttribute) user_data;
AtkTextAttribute attr = (AtkTextAttribute) GPOINTER_TO_INT (user_data);
AtkAttribute *at = (AtkAttribute *) data;
if (!g_strcmp0 (at->name, atk_text_attribute_get_name (attr)))
return 0;
......
mutter (3.38.3-2ubuntu1) hirsute; urgency=medium
* Merge with debian, containing new upstream release (LP: #1915025)
- Disable CRTCs when system becomes headless (LP: #1905825)
- Fixed crash during windows unmanagement (LP: #1870822)
- Do not handle ungrabbed events when unmanaging (LP: #1880405)
- Downgrade assert to warning when adding window (LP: #1911921)
* d/p/x11-Add-support-for-fractional-scaling-using-Randr.patch:
- Refreshed
* debian/rules: Enable remote desktop for all linux builds (LP: #1730612)
-- Marco Trevisan (Treviño) <marco@ubuntu.com> Tue, 09 Feb 2021 04:59:11 +0100
mutter (3.38.3-2) unstable; urgency=medium
* Team upload
* d/patches: Update to commit 3.38.3-12-g2d424a739 from gnome-3-38 branch
- Cope with monitors with metacharacters in their EDID data
- Don't crash if parsing monitor configuration fails
- Don't crash if an extension tries to add the same window to a
workspace more than once, such as auto-move-windows
- Cope with monitor configuration changes during screencasting
- Speed up workspace switching when many windows are open
- Fix Xwayland windows not always appearing in the gnome-shell overview
- Avoid warning spam and poor performance when unmanaging a window
(probably Closes: #970295, LP: #1841774)
-- Simon McVittie <smcv@debian.org> Thu, 04 Feb 2021 10:26:19 +0000
mutter (3.38.3-1) unstable; urgency=medium
* Team upload
* d/watch: Only watch for 3.38.x versions
* New upstream release
-- Simon McVittie <smcv@debian.org> Thu, 14 Jan 2021 20:13:35 +0000
mutter (3.38.2-1ubuntu1) hirsute; urgency=medium
* Merge with debian, containing new upstream release (LP: #1908158):
......
......@@ -31,10 +31,10 @@ index 387360d..683400b 100644
is_parallel: false,
)
diff --git a/src/tests/meson.build b/src/tests/meson.build
index 77ab3b5..7069a75 100644
index 1eab95f..c177cc8 100644
--- a/src/tests/meson.build
+++ b/src/tests/meson.build
@@ -197,7 +197,7 @@ test('headless-start', headless_start_test,
@@ -198,7 +198,7 @@ test('headless-start', headless_start_test,
)
test('stage-view', stage_view_tests,
......
......@@ -44,7 +44,7 @@ index a3c61cf..c45614c 100644
input: 'cogl-config.h.meson',
output: 'cogl-config.h',
diff --git a/meson.build b/meson.build
index 1238bf4..45e3b24 100644
index d87c1ee..616d476 100644
--- a/meson.build
+++ b/meson.build
@@ -224,6 +224,8 @@ if have_wayland_eglstream
......
From: =?utf-8?q?Thomas_M=C3=BChlbacher?= <tmuehlbacher@posteo.net>
Date: Wed, 27 Jan 2021 20:00:04 +0100
Subject: monitor-config: Free `meta_monitor_spec` safely
`g_free()` alone can't help if the value it gets is `NULL` + the offset
of the struct members.
This prevents gnome-shell from segfaulting if `monitors.xml` contains
invalid XML.
Bug: <https://gitlab.gnome.org/GNOME/mutter/-/issues/1011>
(cherry picked from commit 88647ae23cd818c28ff81fd9de38aac4144c4994)
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1694>
Origin: upstream, 3.38.4, commit:8af95b4c4b07524e43004eaf00dbf18ec63fa594
---
src/backends/meta-monitor-config-manager.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/src/backends/meta-monitor-config-manager.c b/src/backends/meta-monitor-config-manager.c
index 1ef92c2..fc7a8dd 100644
--- a/src/backends/meta-monitor-config-manager.c
+++ b/src/backends/meta-monitor-config-manager.c
@@ -1388,7 +1388,8 @@ meta_monitor_config_manager_class_init (MetaMonitorConfigManagerClass *klass)
void
meta_monitor_config_free (MetaMonitorConfig *monitor_config)
{
- meta_monitor_spec_free (monitor_config->monitor_spec);
+ if (monitor_config->monitor_spec)
+ meta_monitor_spec_free (monitor_config->monitor_spec);
g_free (monitor_config->mode_spec);
g_free (monitor_config);
}
From: =?utf-8?q?Jonas_=C3=85dahl?= <jadahl@gmail.com>
Date: Thu, 28 Jan 2021 23:21:12 +0100
Subject: screen-cast/area-src: Handle monitors changes here too
Like with the monitor source, we need to reattach to the new views after
monitor changes, otherwise the screen cast will get stuck.
(cherry picked from commit 893c0cd2f93a0d10a211af32d26be167e9656cd7)
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1694>
Origin: upstream, 3.38.4, commit:d881fcdece6087b32cee725c1879a3278ceee9b6
---
src/backends/meta-screen-cast-area-stream-src.c | 21 +++++++++++++++++++++
1 file changed, 21 insertions(+)
diff --git a/src/backends/meta-screen-cast-area-stream-src.c b/src/backends/meta-screen-cast-area-stream-src.c
index e7d42d4..7cc70dc 100644
--- a/src/backends/meta-screen-cast-area-stream-src.c
+++ b/src/backends/meta-screen-cast-area-stream-src.c
@@ -316,12 +316,29 @@ add_view_painted_watches (MetaScreenCastAreaStreamSrc *area_src,
}
}
+static void
+on_monitors_changed (MetaMonitorManager *monitor_manager,
+ MetaScreenCastAreaStreamSrc *area_src)
+{
+ MetaStage *stage = META_STAGE (get_stage (area_src));
+ GList *l;
+
+ for (l = area_src->watches; l; l = l->next)
+ meta_stage_remove_watch (stage, l->data);
+ g_clear_pointer (&area_src->watches, g_list_free);
+
+ add_view_painted_watches (area_src,
+ META_STAGE_WATCH_AFTER_ACTOR_PAINT);
+}
+
static void
meta_screen_cast_area_stream_src_enable (MetaScreenCastStreamSrc *src)
{
MetaScreenCastAreaStreamSrc *area_src =
META_SCREEN_CAST_AREA_STREAM_SRC (src);
MetaBackend *backend = get_backend (area_src);
+ MetaMonitorManager *monitor_manager =
+ meta_backend_get_monitor_manager (backend);
MetaCursorTracker *cursor_tracker = meta_backend_get_cursor_tracker (backend);
ClutterStage *stage;
MetaScreenCastStream *stream;
@@ -354,6 +371,10 @@ meta_screen_cast_area_stream_src_enable (MetaScreenCastStreamSrc *src)
break;
}
+ g_signal_connect_object (monitor_manager, "monitors-changed-internal",
+ G_CALLBACK (on_monitors_changed),
+ area_src, 0);
+
clutter_actor_queue_redraw (CLUTTER_ACTOR (stage));
}
From: =?utf-8?q?Jonas_=C3=85dahl?= <jadahl@gmail.com>
Date: Wed, 27 Jan 2021 23:25:51 +0100
Subject: screen-cast/monitor-stream: Don't fall apart when monitor changes
If the monitor configuration changed, even though the streamed monitor
didn't change, we'd still fail to continue streaming, as we failed to
update the stage watchers, meaning we wouldn't be notified about when
the stage views were painted.
Fix this by reattaching the stage watches, i.e. update the painted
signalling listeners to listen to the right views, when monitor changes
happens.
(cherry picked from commit e877b06fdde60a9fc391628c83258e4ee3b42297)
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1694>
Origin: upstream, 3.38.4, commit:d3b386c5f33539bbeef9d2facc96369e88e337dc
---
src/backends/meta-screen-cast-monitor-stream-src.c | 63 +++++++++++++++++-----
1 file changed, 50 insertions(+), 13 deletions(-)
diff --git a/src/backends/meta-screen-cast-monitor-stream-src.c b/src/backends/meta-screen-cast-monitor-stream-src.c
index ab3be96..5d395b6 100644
--- a/src/backends/meta-screen-cast-monitor-stream-src.c
+++ b/src/backends/meta-screen-cast-monitor-stream-src.c
@@ -336,18 +336,59 @@ add_view_watches (MetaScreenCastMonitorStreamSrc *monitor_src,
}
}
+static void
+reattach_watches (MetaScreenCastMonitorStreamSrc *monitor_src)
+{
+ MetaScreenCastStreamSrc *src = META_SCREEN_CAST_STREAM_SRC (monitor_src);
+ MetaScreenCastStream *stream;
+ ClutterStage *stage;
+ GList *l;
+
+ stream = meta_screen_cast_stream_src_get_stream (src);
+ stage = get_stage (monitor_src);
+
+ for (l = monitor_src->watches; l; l = l->next)
+ meta_stage_remove_watch (META_STAGE (stage), l->data);
+ g_clear_pointer (&monitor_src->watches, g_list_free);
+
+ switch (meta_screen_cast_stream_get_cursor_mode (stream))
+ {
+ case META_SCREEN_CAST_CURSOR_MODE_METADATA:
+ case META_SCREEN_CAST_CURSOR_MODE_HIDDEN:
+ add_view_watches (monitor_src,
+ META_STAGE_WATCH_BEFORE_PAINT,
+ before_stage_painted);
+ add_view_watches (monitor_src,
+ META_STAGE_WATCH_AFTER_ACTOR_PAINT,
+ stage_painted);
+ break;
+ case META_SCREEN_CAST_CURSOR_MODE_EMBEDDED:
+ add_view_watches (monitor_src,
+ META_STAGE_WATCH_AFTER_PAINT,
+ stage_painted);
+ break;
+ }
+}
+
+static void
+on_monitors_changed (MetaMonitorManager *monitor_manager,
+ MetaScreenCastMonitorStreamSrc *monitor_src)
+{
+ reattach_watches (monitor_src);
+}
+
static void
meta_screen_cast_monitor_stream_src_enable (MetaScreenCastStreamSrc *src)
{
MetaScreenCastMonitorStreamSrc *monitor_src =
META_SCREEN_CAST_MONITOR_STREAM_SRC (src);
MetaBackend *backend = get_backend (monitor_src);
+ MetaMonitorManager *monitor_manager =
+ meta_backend_get_monitor_manager (backend);
MetaCursorTracker *cursor_tracker = meta_backend_get_cursor_tracker (backend);
- ClutterStage *stage;
MetaScreenCastStream *stream;
stream = meta_screen_cast_stream_src_get_stream (src);
- stage = get_stage (monitor_src);
switch (meta_screen_cast_stream_get_cursor_mode (stream))
{
@@ -361,25 +402,21 @@ meta_screen_cast_monitor_stream_src_enable (MetaScreenCastStreamSrc *src)
G_CALLBACK (cursor_changed),
monitor_src);
meta_cursor_tracker_track_position (cursor_tracker);
- G_GNUC_FALLTHROUGH;
+ break;
case META_SCREEN_CAST_CURSOR_MODE_HIDDEN:
- add_view_watches (monitor_src,
- META_STAGE_WATCH_BEFORE_PAINT,
- before_stage_painted);
- add_view_watches (monitor_src,
- META_STAGE_WATCH_AFTER_ACTOR_PAINT,
- stage_painted);
break;
case META_SCREEN_CAST_CURSOR_MODE_EMBEDDED:
inhibit_hw_cursor (monitor_src);
meta_cursor_tracker_track_position (cursor_tracker);
- add_view_watches (monitor_src,
- META_STAGE_WATCH_AFTER_PAINT,
- stage_painted);
break;
}
- clutter_actor_queue_redraw (CLUTTER_ACTOR (stage));
+ reattach_watches (monitor_src);
+ g_signal_connect_object (monitor_manager, "monitors-changed-internal",
+ G_CALLBACK (on_monitors_changed),
+ monitor_src, 0);
+
+ clutter_actor_queue_redraw (CLUTTER_ACTOR (get_stage (monitor_src)));
}
static void
From: =?utf-8?q?Jonas_=C3=85dahl?= <jadahl@gmail.com>
Date: Wed, 27 Jan 2021 23:36:51 +0100
Subject: screen-cast-stream: Add getter for stream src
(cherry picked from commit 9f6a4416651263181d22aea28caa7f2181982705)
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1694>
Origin: upstream, 3.38.4, commit:6724bbe497a259987e3bc1e9f05546c72c5e25f0
---
src/backends/meta-screen-cast-stream.c | 9 +++++++++
src/backends/meta-screen-cast-stream.h | 2 ++
2 files changed, 11 insertions(+)
diff --git a/src/backends/meta-screen-cast-stream.c b/src/backends/meta-screen-cast-stream.c
index fa2f368..fed1560 100644
--- a/src/backends/meta-screen-cast-stream.c
+++ b/src/backends/meta-screen-cast-stream.c
@@ -168,6 +168,15 @@ meta_screen_cast_stream_get_object_path (MetaScreenCastStream *stream)
return priv->object_path;
}
+MetaScreenCastStreamSrc *
+meta_screen_cast_stream_get_src (MetaScreenCastStream *stream)
+{
+ MetaScreenCastStreamPrivate *priv =
+ meta_screen_cast_stream_get_instance_private (stream);
+
+ return priv->src;
+}
+
void
meta_screen_cast_stream_transform_position (MetaScreenCastStream *stream,
double stream_x,
diff --git a/src/backends/meta-screen-cast-stream.h b/src/backends/meta-screen-cast-stream.h
index 1fa8ddd..d121c15 100644
--- a/src/backends/meta-screen-cast-stream.h
+++ b/src/backends/meta-screen-cast-stream.h
@@ -59,6 +59,8 @@ void meta_screen_cast_stream_close (MetaScreenCastStream *stream);
char * meta_screen_cast_stream_get_object_path (MetaScreenCastStream *stream);
+MetaScreenCastStreamSrc * meta_screen_cast_stream_get_src (MetaScreenCastStream *stream);
+
void meta_screen_cast_stream_transform_position (MetaScreenCastStream *stream,
double stream_x,
double stream_y,
window-Do-not-handle-ungrabbed-events-when-unmanaging.patch
window-Guard-can_ping-against-unmanaging-windows.patch
monitor-config-store-Properly-escape-monitor-spec.patch
monitor-config-Free-meta_monitor_spec-safely.patch
tests-monitor-config-Improve-debugging-output.patch
workspace-Downgrade-assert-to-warning-when-adding-window.patch
screen-cast-stream-Add-getter-for-stream-src.patch
screen-cast-monitor-stream-Don-t-fall-apart-when-monitor-.patch
screen-cast-area-src-Handle-monitors-changes-here-too.patch
window-Freeze-stack-when-calculating-showing-state.patch
window-actor-Add-a-new-can_freeze_commits-API.patch
window-x11-Check-before-freezing-commits.patch
theme-use-gtk_render_icon_suface-to-paint-button-icon.patch
theme-load-icons-as-Gtk-does-with-fallback-and-RTL-suppor.patch
meson-add-back-default_driver-option.patch
......
From: =?utf-8?q?Thomas_M=C3=BChlbacher?= <tmuehlbacher@posteo.net>
Date: Thu, 28 Jan 2021 16:03:10 +0100
Subject: tests/monitor-config: Improve debugging output
Make it easier to find out what went wrong with `migrated_data` by
having it included in the debug logs.
Bug: <https://gitlab.gnome.org/GNOME/mutter/-/issues/1011>
(cherry picked from commit 180e62519b4697ef263a28aa6a3db746627c0a4d)
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1694>
Origin: upstream, 3.38.4, commit:015acbbc30b7d00e5c36a1d21ea9dc40c1e47e0a
---
src/tests/monitor-config-migration-unit-tests.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/tests/monitor-config-migration-unit-tests.c b/src/tests/monitor-config-migration-unit-tests.c
index 461035d..bb2ac62 100644
--- a/src/tests/monitor-config-migration-unit-tests.c
+++ b/src/tests/monitor-config-migration-unit-tests.c
@@ -75,7 +75,7 @@ test_migration (const char *old_config,
g_assert_nonnull (expected_data);
g_assert_nonnull (migrated_data);
- g_assert (strcmp (expected_data, migrated_data) == 0);
+ g_assert_cmpstr (expected_data, ==, migrated_data);
migrated_file = g_file_new_for_path (migrated_path);
if (!g_file_delete (migrated_file, NULL, &error))
From: =?utf-8?q?Florian_M=C3=BCllner?= <fmuellner@gnome.org>
Date: Wed, 20 Jan 2021 12:22:22 +0100
Subject: window: Do not handle ungrabbed events when unmanaging
Once we are no longer managing a window, we have no business in
dealing with it anymore, and operations like focusing, raising or
pinging the window aren't expected to work, and can go horribly
wrong if we try.
Bug: https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/2467
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1676>
(cherry picked from commit e7b58c23b896c604b71d542b2f477523df60e637)
Origin: upstream, 3.38.4, commit:dd2f4963d39a46eeda5825ba25af925424821ac9
---
src/core/window.c | 3 +++
1 file changed, 3 insertions(+)
diff --git a/src/core/window.c b/src/core/window.c
index 2e37e9d..1abad19 100644
--- a/src/core/window.c
+++ b/src/core/window.c
@@ -8313,6 +8313,9 @@ meta_window_handle_ungrabbed_event (MetaWindow *window,
gfloat x, y;
guint button;
+ if (window->unmanaging)
+ return;
+
if (event->type != CLUTTER_BUTTON_PRESS &&
event->type != CLUTTER_TOUCH_BEGIN)
return;
From: =?utf-8?q?Jonas_=C3=85dahl?= <jadahl@gmail.com>
Date: Mon, 30 Nov 2020 10:03:16 +0000
Subject: window: Freeze stack when calculating showing state
Constantly manipulating the stack caused severe stalls (several seconds)
with many open windows when switching workspaces. The cause for this was
that each show/hide call dealt with the stack in isolation, meaning if
you hid N windows, we'd manipulate and synchronize the stack N times,
potentially doing synchronous calls to the X server while doing so.
Avoid the most severe stalls by freezing the stack while calculating
showing; this made the worst case go from several seconds to around
10-20 ms, which is still bad, but by far not as bad.
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1616>
(cherry picked from commit d43c8cd8425fe1ab83c1c959a07f99c21f4844c4
Origin: upstream, 3.38.4, commit:f68f06073295352d53a78499928975825b9c1c11
---
src/core/window.c | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/src/core/window.c b/src/core/window.c
index c87f8ee..3180d15 100644
--- a/src/core/window.c
+++ b/src/core/window.c
@@ -1798,6 +1798,7 @@ stackcmp (gconstpointer a, gconstpointer b)
static gboolean
idle_calc_showing (gpointer data)
{
+ MetaDisplay *display = meta_get_display ();
GSList *tmp;
GSList *copy;
GSList *should_show;
@@ -1868,6 +1869,8 @@ idle_calc_showing (gpointer data)
tmp = tmp->next;
}
+ meta_stack_freeze (display->stack);
+
tmp = should_show;
while (tmp != NULL)
{
@@ -1892,6 +1895,8 @@ idle_calc_showing (gpointer data)
tmp = tmp->next;
}
+ meta_stack_thaw (display->stack);
+
tmp = copy;
while (tmp != NULL)
{
From: =?utf-8?q?Florian_M=C3=BCllner?= <fmuellner@gnome.org>
Date: Wed, 20 Jan 2021 11:55:10 +0100
Subject: window: Guard can_ping() against unmanaging windows
We remove pending pings when unmanaging a window, but currently
don't prevent new pings to be scheduled after that.
The previous commit fixed a code path where this did indeed happen,
but as the result of gnome-shell trying to attach a Clutter actor
to a non-existent window actor is pretty bad, also guard can_ping()
against being called for an unmanaging window.
Bug: https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/2467
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1676>
(cherry picked from commit 81f369480424fb5dd151f44c36104b3d237d789c)
Origin: upstream, 3.38.4, commit:75c3fc560eb7be9396dcf41bf7dd7c7d91b30417
---
src/core/window.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/src/core/window.c b/src/core/window.c
index 1abad19..c87f8ee 100644
--- a/src/core/window.c
+++ b/src/core/window.c
@@ -8573,6 +8573,8 @@ meta_window_is_focusable (MetaWindow *window)
gboolean
meta_window_can_ping (MetaWindow *window)
{
+ g_return_val_if_fail (!window->unmanaging, FALSE);
+
return META_WINDOW_GET_CLASS (window)->can_ping (window);
}
From: Olivier Fourdan <ofourdan@redhat.com>
Date: Fri, 22 Jan 2021 16:26:17 +0100
Subject: window-actor: Add a new can_freeze_commits() API
Mutter freezes Xwayland commits when resizing windows, and thaw them in
the window actors' after_paint() for X11.
Yet, after_paint() could be never called, as when a new window is mapped
while the overview is active in gnome-shell.
As a result, the content of the X11 window will remain invisible to the
overview.
Add a new window actor API to tell whether commits can be frozen. For
Wayland window actors, this always return FALSE, whereas for X11 window
actors, it checks whether the Clutter actor is mapped.
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1678>
(cherry picked from commit df5a5d279d1ec9757881304f6cb3ca546a3743a0)
Origin: upstream, 3.38.4, commit:2d47adc109376ebc81a8dd6d920ff970c4f17cb4
---
src/compositor/meta-window-actor-private.h | 3 +++
src/compositor/meta-window-actor-wayland.c | 7 +++++++
src/compositor/meta-window-actor-x11.c | 9 +++++++++
src/compositor/meta-window-actor.c | 8 ++++++++
4 files changed, 27 insertions(+)
diff --git a/src/compositor/meta-window-actor-private.h b/src/compositor/meta-window-actor-private.h
index 57dbd0a..64741e4 100644
--- a/src/compositor/meta-window-actor-private.h
+++ b/src/compositor/meta-window-actor-private.h
@@ -32,6 +32,7 @@ struct _MetaWindowActorClass
void (*set_frozen) (MetaWindowActor *actor,
gboolean frozen);
void (*update_regions) (MetaWindowActor *actor);
+ gboolean (*can_freeze_commits) (MetaWindowActor *actor);
};
typedef enum
@@ -96,4 +97,6 @@ gboolean meta_window_actor_is_opaque (MetaWindowActor *self);
void meta_window_actor_update_regions (MetaWindowActor *self);
+gboolean meta_window_actor_can_freeze_commits (MetaWindowActor *self);
+
#endif /* META_WINDOW_ACTOR_PRIVATE_H */
diff --git a/src/compositor/meta-window-actor-wayland.c b/src/compositor/meta-window-actor-wayland.c
index cab6bbc..7c3be56 100644
--- a/src/compositor/meta-window-actor-wayland.c
+++ b/src/compositor/meta-window-actor-wayland.c
@@ -146,6 +146,12 @@ meta_window_actor_wayland_update_regions (MetaWindowActor *actor)
{
}
+static gboolean
+meta_window_actor_wayland_can_freeze_commits (MetaWindowActor *actor)
+{
+ return FALSE;
+}
+
static void
meta_window_actor_wayland_class_init (MetaWindowActorWaylandClass *klass)
{
@@ -159,6 +165,7 @@ meta_window_actor_wayland_class_init (MetaWindowActorWaylandClass *klass)
window_actor_class->queue_destroy = meta_window_actor_wayland_queue_destroy;
window_actor_class->set_frozen = meta_window_actor_wayland_set_frozen;
window_actor_class->update_regions = meta_window_actor_wayland_update_regions;
+ window_actor_class->can_freeze_commits = meta_window_actor_wayland_can_freeze_commits;
}
static void
diff --git a/src/compositor/meta-window-actor-x11.c b/src/compositor/meta-window-actor-x11.c
index 566aac4..6764877 100644
--- a/src/compositor/meta-window-actor-x11.c
+++ b/src/compositor/meta-window-actor-x11.c
@@ -1458,6 +1458,14 @@ meta_window_actor_x11_update_regions (MetaWindowActor *actor)
update_regions (META_WINDOW_ACTOR_X11 (actor));
}
+static gboolean
+meta_window_actor_x11_can_freeze_commits (MetaWindowActor *actor)
+{
+ ClutterActor *clutter_actor = CLUTTER_ACTOR (actor);
+
+ return clutter_actor_is_mapped (clutter_actor);
+}
+
static void
meta_window_actor_x11_set_property (GObject *object,
guint prop_id,
@@ -1632,6 +1640,7 @@ meta_window_actor_x11_class_init (MetaWindowActorX11Class *klass)
window_actor_class->queue_destroy = meta_window_actor_x11_queue_destroy;
window_actor_class->set_frozen = meta_window_actor_x11_set_frozen;
window_actor_class->update_regions = meta_window_actor_x11_update_regions;
+ window_actor_class->can_freeze_commits = meta_window_actor_x11_can_freeze_commits;
actor_class->paint = meta_window_actor_x11_paint;
actor_class->get_paint_volume = meta_window_actor_x11_get_paint_volume;
diff --git a/src/compositor/meta-window-actor.c b/src/compositor/meta-window-actor.c
index 8d2548f..ae450a1 100644
--- a/src/compositor/meta-window-actor.c
+++ b/src/compositor/meta-window-actor.c
@@ -257,6 +257,14 @@ meta_window_actor_update_regions (MetaWindowActor *self)
META_WINDOW_ACTOR_GET_CLASS (self)->update_regions (self);
}
+gboolean
+meta_window_actor_can_freeze_commits (MetaWindowActor *self)
+{
+ g_return_val_if_fail (META_IS_WINDOW_ACTOR (self), FALSE);
+
+ return META_WINDOW_ACTOR_GET_CLASS (self)->can_freeze_commits (self);
+}
+
static void
meta_window_actor_set_frozen (MetaWindowActor *self,
gboolean frozen)
From: Olivier Fourdan <ofourdan@redhat.com>
Date: Fri, 22 Jan 2021 16:30:57 +0100
Subject: window/x11: Check before freezing commits
Now that we have a window actor API that can hint whether or not the
window actor would support freezing commits, use it to avoid freezing
Xwayland commit on actors that will not be thawed after paint.
Bug: https://gitlab.gnome.org/GNOME/mutter/-/issues/1615
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1678>
(cherry picked from commit a2e2cfe43714df656e451ef525b97c24fa786fed)
Origin: upstream, 3.38.4, commit:2d424a73936d48a129732fa8c888b214f241b5ac
---
src/x11/window-x11.c | 16 +++++++++++++++-
1 file changed, 15 insertions(+), 1 deletion(-)
diff --git a/src/x11/window-x11.c b/src/x11/window-x11.c
index ea9e82c..980a151 100644
--- a/src/x11/window-x11.c
+++ b/src/x11/window-x11.c
@@ -35,6 +35,7 @@
#include "backends/meta-logical-monitor.h"
#include "backends/x11/meta-backend-x11.h"
+#include "compositor/meta-window-actor-private.h"
#include "core/boxes-private.h"
#include "core/frame.h"
#include "core/meta-workspace-manager-private.h"
@@ -1324,6 +1325,18 @@ meta_window_x11_current_workspace_changed (MetaWindow *window)
meta_x11_error_trap_pop (x11_display);
}
+static gboolean
+meta_window_x11_can_freeze_commits (MetaWindow *window)
+{
+ MetaWindowActor *window_actor;
+
+ window_actor = meta_window_actor_from_window (window);
+ if (window_actor == NULL)
+ return FALSE;
+
+ return meta_window_actor_can_freeze_commits (window_actor);
+}
+
static void
meta_window_x11_move_resize_internal (MetaWindow *window,
MetaGravity gravity,
@@ -1475,7 +1488,8 @@ meta_window_x11_move_resize_internal (MetaWindow *window,
/* If resizing, freeze commits - This is for Xwayland, and a no-op on Xorg */
if (need_resize_client || need_resize_frame)
{
- if (!meta_window_x11_should_thaw_after_paint (window))
+ if (meta_window_x11_can_freeze_commits (window) &&
+ !meta_window_x11_should_thaw_after_paint (window))
{
meta_window_x11_set_thaw_after_paint (window, TRUE);
meta_window_x11_freeze_commits (window);
From: =?utf-8?q?Jonas_=C3=85dahl?= <jadahl@gmail.com>
Date: Thu, 28 Jan 2021 18:59:22 +0100
Subject: workspace: Downgrade assert to warning when adding window
An extension can by accident cause us to end up in a state where we try
to add the same window to a workspace twice. When this happens we
shouldn't crash, but instead complain loudly.
Bug: https://gitlab.gnome.org/GNOME/mutter/-/issues/992
Related: https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/157
(cherry picked from commit b55b26661f748791fd7207bf5c43b332e8da094c)
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1694>
Origin: upstream, 3.38.4, commit:93a210fd29f233d26e28a7dc7baf6f88d319748f
---
src/core/workspace.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/src/core/workspace.c b/src/core/workspace.c
index a94f92c..a80560b 100644
--- a/src/core/workspace.c
+++ b/src/core/workspace.c
@@ -369,10 +369,11 @@ void
meta_workspace_add_window (MetaWorkspace *workspace,
MetaWindow *window)
{
+ g_return_if_fail (g_list_find (workspace->mru_list, window) == NULL);
+
COGL_TRACE_BEGIN_SCOPED (MetaWorkspaceAddWindow,
"Workspace (add window)");
- g_assert (g_list_find (workspace->mru_list, window) == NULL);
workspace->mru_list = g_list_prepend (workspace->mru_list, window);
workspace->windows = g_list_prepend (workspace->windows, window);
......@@ -174,7 +174,7 @@ index 50db1a5..6f2b974 100644
void meta_crtc_unset_config (MetaCrtc *crtc);
diff --git a/src/backends/meta-monitor-config-manager.c b/src/backends/meta-monitor-config-manager.c
index 1ef92c2..eeb2258 100644
index fc7a8dd..04e8e0d 100644
--- a/src/backends/meta-monitor-config-manager.c
+++ b/src/backends/meta-monitor-config-manager.c
@@ -217,6 +217,18 @@ assign_monitor_crtc (MetaMonitor *monitor,
......@@ -534,7 +534,7 @@ index 1ef92c2..eeb2258 100644
NULL,
layout_mode);
primary_logical_monitor_config->is_primary = TRUE;
@@ -1664,6 +1835,7 @@ gboolean
@@ -1665,6 +1836,7 @@ gboolean
meta_verify_logical_monitor_config (MetaLogicalMonitorConfig *logical_monitor_config,
MetaLogicalMonitorLayoutMode layout_mode,
MetaMonitorManager *monitor_manager,
......@@ -542,7 +542,7 @@ index 1ef92c2..eeb2258 100644
GError **error)
{
GList *l;
@@ -1700,6 +1872,10 @@ meta_verify_logical_monitor_config (MetaLogicalMonitorConfig *logical_monitor
@@ -1701,6 +1873,10 @@ meta_verify_logical_monitor_config (MetaLogicalMonitorConfig *logical_monitor
switch (layout_mode)
{
......@@ -619,7 +619,7 @@ index d619dc4..69c426c 100644
if (!meta_verify_monitors_config (config, monitor_manager, error))
diff --git a/src/backends/meta-monitor-config-store.c b/src/backends/meta-monitor-config-store.c
index 129b632..28bde1c 100644
index 9ad432c..e4bde15 100644
--- a/src/backends/meta-monitor-config-store.c
+++ b/src/backends/meta-monitor-config-store.c
@@ -496,6 +496,7 @@ handle_start_element (GMarkupParseContext *context,
......@@ -2065,10 +2065,10 @@ index 553e2cd..405664d 100644
g_signal_new ("experimental-features-changed",
G_TYPE_FROM_CLASS (object_class),
diff --git a/src/backends/native/meta-monitor-manager-kms.c b/src/backends/native/meta-monitor-manager-kms.c
index b57f98c..d55824b 100644
index 0909322..c8323d6 100644
--- a/src/backends/native/meta-monitor-manager-kms.c
+++ b/src/backends/native/meta-monitor-manager-kms.c
@@ -490,20 +490,8 @@ meta_monitor_manager_kms_is_transform_handled (MetaMonitorManager *manager,
@@ -498,20 +498,8 @@ meta_monitor_manager_kms_is_transform_handled (MetaMonitorManager *manager,
return meta_crtc_kms_is_transform_handled (META_CRTC_KMS (crtc), transform);
}
......@@ -2091,7 +2091,7 @@ index b57f98c..d55824b 100644
{
MetaMonitorScalesConstraint constraints =
META_MONITOR_SCALES_CONSTRAINT_NONE;
@@ -511,12 +499,38 @@ meta_monitor_manager_kms_calculate_supported_scales (MetaMonitorManager
@@ -519,12 +507,38 @@ meta_monitor_manager_kms_calculate_supported_scales (MetaMonitorManager
switch (layout_mode)
{
case META_LOGICAL_MONITOR_LAYOUT_MODE_LOGICAL:
......@@ -2130,7 +2130,7 @@ index b57f98c..d55824b 100644
return meta_monitor_calculate_supported_scales (monitor, monitor_mode,
constraints,
n_supported_scales);
@@ -528,7 +542,7 @@ meta_monitor_manager_kms_get_capabilities (MetaMonitorManager *manager)
@@ -536,7 +550,7 @@ meta_monitor_manager_kms_get_capabilities (MetaMonitorManager *manager)
MetaBackend *backend = meta_monitor_manager_get_backend (manager);
MetaSettings *settings = meta_backend_get_settings (backend);
MetaMonitorManagerCapability capabilities =
......@@ -2514,7 +2514,7 @@ index 2086f86..a1f3b48 100644
int *max_width,
int *max_height);
diff --git a/src/backends/x11/meta-monitor-manager-xrandr.c b/src/backends/x11/meta-monitor-manager-xrandr.c
index 946a221..9e048e4 100644
index 54c2b38..e7e9d4a 100644
--- a/src/backends/x11/meta-monitor-manager-xrandr.c
+++ b/src/backends/x11/meta-monitor-manager-xrandr.c
@@ -35,6 +35,7 @@
......@@ -2879,7 +2879,7 @@ index 946a221..9e048e4 100644
meta_crtc_unset_config (crtc);
}
@@ -452,21 +661,20 @@ apply_crtc_assignments (MetaMonitorManager *manager,
@@ -452,6 +661,10 @@ apply_crtc_assignments (MetaMonitorManager *manager,
0, 0, XCB_NONE,
XCB_RANDR_ROTATION_ROTATE_0,
NULL, 0);
......@@ -2890,6 +2890,9 @@ index 946a221..9e048e4 100644
meta_crtc_unset_config (crtc);
}
@@ -459,17 +672,12 @@ apply_crtc_assignments (MetaMonitorManager *manager,
if (!n_crtcs)
goto out;
- g_assert (width > 0 && height > 0);
- /* The 'physical size' of an X screen is meaningless if that screen
......@@ -2911,7 +2914,7 @@ index 946a221..9e048e4 100644
for (i = 0; i < n_crtcs; i++)
{
@@ -482,12 +690,21 @@ apply_crtc_assignments (MetaMonitorManager *manager,
@@ -485,12 +693,21 @@ apply_crtc_assignments (MetaMonitorManager *manager,
int x, y;
xcb_randr_rotation_t rotation;
xcb_randr_mode_t mode;
......@@ -2933,7 +2936,7 @@ index 946a221..9e048e4 100644
for (j = 0; j < n_output_ids; j++)
{
MetaOutput *output;
@@ -512,6 +729,14 @@ apply_crtc_assignments (MetaMonitorManager *manager,
@@ -515,6 +732,14 @@ apply_crtc_assignments (MetaMonitorManager *manager,
rotation =
meta_monitor_transform_to_xrandr (crtc_assignment->transform);
mode = meta_crtc_mode_get_id (crtc_mode);
......@@ -2948,7 +2951,7 @@ index 946a221..9e048e4 100644
if (!xrandr_set_crtc_config (manager_xrandr,
crtc,
save_timestamp,
@@ -540,6 +765,20 @@ apply_crtc_assignments (MetaMonitorManager *manager,
@@ -543,6 +768,20 @@ apply_crtc_assignments (MetaMonitorManager *manager,
&crtc_assignment->layout,
crtc_mode,
crtc_assignment->transform);
......@@ -2969,7 +2972,7 @@ index 946a221..9e048e4 100644
}
}
@@ -555,6 +794,13 @@ apply_crtc_assignments (MetaMonitorManager *manager,
@@ -558,6 +797,13 @@ apply_crtc_assignments (MetaMonitorManager *manager,
(GFunc) meta_output_unassign_crtc,
NULL);
......@@ -2980,10 +2983,10 @@ index 946a221..9e048e4 100644
+ avg_screen_scale);
+ }
+
out:
XUngrabServer (manager_xrandr->xdisplay);
XFlush (manager_xrandr->xdisplay);
}
@@ -580,14 +826,88 @@ meta_monitor_manager_xrandr_ensure_initial_config (MetaMonitorManager *manager)
@@ -584,14 +830,88 @@ meta_monitor_manager_xrandr_ensure_initial_config (MetaMonitorManager *manager)
}
static void
......@@ -3076,16 +3079,16 @@ index 946a221..9e048e4 100644
}
static gboolean
@@ -601,7 +921,7 @@ meta_monitor_manager_xrandr_apply_monitors_config (MetaMonitorManager *mana
@@ -608,7 +928,7 @@ meta_monitor_manager_xrandr_apply_monitors_config (MetaMonitorManager *mana
if (!manager->in_init)
apply_crtc_assignments (manager, TRUE, NULL, 0, NULL, 0);
if (!config)
{
- meta_monitor_manager_xrandr_rebuild_derived (manager, NULL);
+ meta_monitor_manager_rebuild_derived (manager, NULL);
return TRUE;
}
@@ -613,6 +933,8 @@ meta_monitor_manager_xrandr_apply_monitors_config (MetaMonitorManager *mana
@@ -620,6 +940,8 @@ meta_monitor_manager_xrandr_apply_monitors_config (MetaMonitorManager *mana
if (method != META_MONITORS_CONFIG_METHOD_VERIFY)
{
......@@ -3094,7 +3097,7 @@ index 946a221..9e048e4 100644
/*
* If the assignment has not changed, we won't get any notification about
* any new configuration from the X server; but we still need to update
@@ -620,12 +942,16 @@ meta_monitor_manager_xrandr_apply_monitors_config (MetaMonitorManager *mana
@@ -627,12 +949,16 @@ meta_monitor_manager_xrandr_apply_monitors_config (MetaMonitorManager *mana
* have changed locally, such as the logical monitors scale. This means we
* must check that our new assignment actually changes anything, otherwise
* just update the logical state.
......@@ -3112,7 +3115,7 @@ index 946a221..9e048e4 100644
{
apply_crtc_assignments (manager,
TRUE,
@@ -633,10 +959,14 @@ meta_monitor_manager_xrandr_apply_monitors_config (MetaMonitorManager *mana
@@ -640,10 +966,14 @@ meta_monitor_manager_xrandr_apply_monitors_config (MetaMonitorManager *mana
crtc_assignments->len,
(MetaOutputAssignment **) output_assignments->pdata,
output_assignments->len);
......@@ -3128,7 +3131,7 @@ index 946a221..9e048e4 100644
}
}
@@ -769,7 +1099,8 @@ meta_monitor_manager_xrandr_tiled_monitor_added (MetaMonitorManager *manager,
@@ -776,7 +1106,8 @@ meta_monitor_manager_xrandr_tiled_monitor_added (MetaMonitorManager *manager,
GList *l;
int i;
......@@ -3138,7 +3141,7 @@ index 946a221..9e048e4 100644
return;
product = meta_monitor_get_product (monitor);
@@ -818,7 +1149,8 @@ meta_monitor_manager_xrandr_tiled_monitor_removed (MetaMonitorManager *manager,
@@ -825,7 +1156,8 @@ meta_monitor_manager_xrandr_tiled_monitor_removed (MetaMonitorManager *manager,
int monitor_count;
......@@ -3148,7 +3151,7 @@ index 946a221..9e048e4 100644
return;
monitor_xrandr_data = meta_monitor_xrandr_data_from_monitor (monitor);
@@ -836,10 +1168,12 @@ meta_monitor_manager_xrandr_tiled_monitor_removed (MetaMonitorManager *manager,
@@ -843,10 +1175,12 @@ meta_monitor_manager_xrandr_tiled_monitor_removed (MetaMonitorManager *manager,
static void
meta_monitor_manager_xrandr_init_monitors (MetaMonitorManagerXrandr *manager_xrandr)
{
......@@ -3162,7 +3165,7 @@ index 946a221..9e048e4 100644
return;
/* delete any tiled monitors setup, as mutter will want to recreate
@@ -871,83 +1205,26 @@ meta_monitor_manager_xrandr_is_transform_handled (MetaMonitorManager *manager,
@@ -878,83 +1212,26 @@ meta_monitor_manager_xrandr_is_transform_handled (MetaMonitorManager *manager,
return TRUE;
}
......@@ -3260,7 +3263,7 @@ index 946a221..9e048e4 100644
}
static float *
@@ -957,20 +1234,38 @@ meta_monitor_manager_xrandr_calculate_supported_scales (MetaMonitorManager
@@ -964,20 +1241,38 @@ meta_monitor_manager_xrandr_calculate_supported_scales (MetaMonitorManager
MetaMonitorMode *monitor_mode,
int *n_supported_scales)
{
......@@ -3308,7 +3311,7 @@ index 946a221..9e048e4 100644
}
static gboolean
@@ -988,9 +1283,41 @@ meta_monitor_manager_xrandr_get_max_screen_size (MetaMonitorManager *manager,
@@ -995,9 +1290,41 @@ meta_monitor_manager_xrandr_get_max_screen_size (MetaMonitorManager *manager,
return TRUE;
}
......@@ -3350,7 +3353,7 @@ index 946a221..9e048e4 100644
return META_LOGICAL_MONITOR_LAYOUT_MODE_PHYSICAL;
}
@@ -1002,6 +1329,7 @@ meta_monitor_manager_xrandr_constructed (GObject *object)
@@ -1009,6 +1336,7 @@ meta_monitor_manager_xrandr_constructed (GObject *object)
MetaMonitorManager *manager = META_MONITOR_MANAGER (manager_xrandr);
MetaBackend *backend = meta_monitor_manager_get_backend (manager);
MetaBackendX11 *backend_x11 = META_BACKEND_X11 (backend);
......@@ -3358,7 +3361,7 @@ index 946a221..9e048e4 100644
manager_xrandr->xdisplay = meta_backend_x11_get_xdisplay (backend_x11);
@@ -1022,19 +1350,19 @@ meta_monitor_manager_xrandr_constructed (GObject *object)
@@ -1029,19 +1357,19 @@ meta_monitor_manager_xrandr_constructed (GObject *object)
| RRCrtcChangeNotifyMask
| RROutputPropertyNotifyMask);
......@@ -3386,7 +3389,7 @@ index 946a221..9e048e4 100644
G_OBJECT_CLASS (meta_monitor_manager_xrandr_parent_class)->constructed (object);
}
@@ -1044,7 +1372,6 @@ meta_monitor_manager_xrandr_finalize (GObject *object)
@@ -1051,7 +1379,6 @@ meta_monitor_manager_xrandr_finalize (GObject *object)
MetaMonitorManagerXrandr *manager_xrandr = META_MONITOR_MANAGER_XRANDR (object);
g_hash_table_destroy (manager_xrandr->tiled_monitor_atoms);
......@@ -3394,7 +3397,7 @@ index 946a221..9e048e4 100644
G_OBJECT_CLASS (meta_monitor_manager_xrandr_parent_class)->finalize (object);
}
@@ -1067,6 +1394,7 @@ meta_monitor_manager_xrandr_class_init (MetaMonitorManagerXrandrClass *klass)
@@ -1074,6 +1401,7 @@ meta_monitor_manager_xrandr_class_init (MetaMonitorManagerXrandrClass *klass)
manager_class->read_current_state = meta_monitor_manager_xrandr_read_current_state;
manager_class->ensure_initial_config = meta_monitor_manager_xrandr_ensure_initial_config;
manager_class->apply_monitors_config = meta_monitor_manager_xrandr_apply_monitors_config;
......@@ -3402,7 +3405,7 @@ index 946a221..9e048e4 100644
manager_class->set_power_save_mode = meta_monitor_manager_xrandr_set_power_save_mode;
manager_class->change_backlight = meta_monitor_manager_xrandr_change_backlight;
manager_class->get_crtc_gamma = meta_monitor_manager_xrandr_get_crtc_gamma;
@@ -1128,7 +1456,7 @@ meta_monitor_manager_xrandr_handle_xevent (MetaMonitorManagerXrandr *manager_xra
@@ -1135,7 +1463,7 @@ meta_monitor_manager_xrandr_handle_xevent (MetaMonitorManagerXrandr *manager_xra
config = NULL;
}
......@@ -3644,7 +3647,7 @@ index 37d04bb..93a2b6b 100644
void
meta_rectangle_clamp_to_fit_into_region (const GList *spanning_rects,
diff --git a/src/core/window.c b/src/core/window.c
index 2e37e9d..e89a74b 100644
index 3180d15..0078b63 100644
--- a/src/core/window.c
+++ b/src/core/window.c
@@ -227,6 +227,7 @@ enum
......
......@@ -19,6 +19,7 @@ export MUTTER_SONAME
ifeq ($(DEB_HOST_ARCH_OS),linux)
CONFFLAGS = \
-Degl_device=true \
-Dremote_desktop=true \
-Dwayland_eglstream=true
else
CONFFLAGS += \
......@@ -38,15 +39,6 @@ CONFFLAGS += \
-Ddefault_driver=gl
endif
# pipewire is not in Ubuntu main yet
ifeq ($(DEB_HOST_ARCH_OS),linux)
ifeq ($(shell dpkg-vendor --query vendor),Ubuntu)
CONFFLAGS += -Dremote_desktop=false
else
CONFFLAGS += -Dremote_desktop=true
endif
endif
override_dh_auto_configure:
dh_auto_configure -- \
-Dinstalled_tests=false \
......