Fix build with latest glibc, fix openQA clicking bug
This commit is contained in:
parent
31c3b2c8fa
commit
272a70e23a
177
0001-clutter-Do-not-check-redraw-area-for-pointer-repicks.patch
Normal file
177
0001-clutter-Do-not-check-redraw-area-for-pointer-repicks.patch
Normal file
@ -0,0 +1,177 @@
|
|||||||
|
From dbfde95c5c7b4fb41e816b65d05d1ac20d59dd8a Mon Sep 17 00:00:00 2001
|
||||||
|
From: Carlos Garnacho <carlosg@gnome.org>
|
||||||
|
Date: Wed, 26 Jan 2022 18:39:27 +0100
|
||||||
|
Subject: [PATCH 1/2] clutter: Do not check redraw area for pointer repicks
|
||||||
|
|
||||||
|
This looks like a relic of glReadPixels-based picking, the pointer
|
||||||
|
might well be outside redrawn areas, yet still require a device
|
||||||
|
update (e.g. in order to reflect the actor layout changes in the
|
||||||
|
"clear area" info).
|
||||||
|
|
||||||
|
Instead, always update all devices that are inside the view after
|
||||||
|
relayouts, the tracking on the need for that update is now done
|
||||||
|
on each ClutterStageView, instead of globally in the ClutterStage.
|
||||||
|
|
||||||
|
This theoretically fixes situations where pointers might miss
|
||||||
|
updating their "clear area" after the actor tree changed.
|
||||||
|
|
||||||
|
Closes: https://gitlab.gnome.org/GNOME/mutter/-/issues/2117
|
||||||
|
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/2257>
|
||||||
|
---
|
||||||
|
clutter/clutter/clutter-stage-private.h | 3 +-
|
||||||
|
clutter/clutter/clutter-stage-view-private.h | 2 +
|
||||||
|
clutter/clutter/clutter-stage-view.c | 14 ++++++-
|
||||||
|
clutter/clutter/clutter-stage.c | 39 ++++++++++++--------
|
||||||
|
4 files changed, 41 insertions(+), 17 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/clutter/clutter/clutter-stage-private.h b/clutter/clutter/clutter-stage-private.h
|
||||||
|
index 50502845bf..efa341cc19 100644
|
||||||
|
--- a/clutter/clutter/clutter-stage-private.h
|
||||||
|
+++ b/clutter/clutter/clutter-stage-private.h
|
||||||
|
@@ -75,7 +75,8 @@ void _clutter_stage_maybe_setup_viewport (ClutterStage
|
||||||
|
ClutterStageView *view);
|
||||||
|
void clutter_stage_maybe_relayout (ClutterActor *stage);
|
||||||
|
void clutter_stage_maybe_finish_queue_redraws (ClutterStage *stage);
|
||||||
|
-GSList * clutter_stage_find_updated_devices (ClutterStage *stage);
|
||||||
|
+GSList * clutter_stage_find_updated_devices (ClutterStage *stage,
|
||||||
|
+ ClutterStageView *view);
|
||||||
|
void clutter_stage_update_devices (ClutterStage *stage,
|
||||||
|
GSList *devices);
|
||||||
|
void clutter_stage_finish_layout (ClutterStage *stage);
|
||||||
|
diff --git a/clutter/clutter/clutter-stage-view-private.h b/clutter/clutter/clutter-stage-view-private.h
|
||||||
|
index 0a20d75b17..39d8601ea5 100644
|
||||||
|
--- a/clutter/clutter/clutter-stage-view-private.h
|
||||||
|
+++ b/clutter/clutter/clutter-stage-view-private.h
|
||||||
|
@@ -79,4 +79,6 @@ void clutter_stage_view_notify_presented (ClutterStageView *view,
|
||||||
|
CLUTTER_EXPORT
|
||||||
|
void clutter_stage_view_notify_ready (ClutterStageView *view);
|
||||||
|
|
||||||
|
+void clutter_stage_view_invalidate_input_devices (ClutterStageView *view);
|
||||||
|
+
|
||||||
|
#endif /* __CLUTTER_STAGE_VIEW_PRIVATE_H__ */
|
||||||
|
diff --git a/clutter/clutter/clutter-stage-view.c b/clutter/clutter/clutter-stage-view.c
|
||||||
|
index ea7f572480..8a82de71ed 100644
|
||||||
|
--- a/clutter/clutter/clutter-stage-view.c
|
||||||
|
+++ b/clutter/clutter/clutter-stage-view.c
|
||||||
|
@@ -93,6 +93,7 @@ typedef struct _ClutterStageViewPrivate
|
||||||
|
|
||||||
|
guint dirty_viewport : 1;
|
||||||
|
guint dirty_projection : 1;
|
||||||
|
+ guint needs_update_devices : 1;
|
||||||
|
} ClutterStageViewPrivate;
|
||||||
|
|
||||||
|
G_DEFINE_TYPE_WITH_PRIVATE (ClutterStageView, clutter_stage_view, G_TYPE_OBJECT)
|
||||||
|
@@ -1176,7 +1177,8 @@ handle_frame_clock_frame (ClutterFrameClock *frame_clock,
|
||||||
|
|
||||||
|
clutter_stage_finish_layout (stage);
|
||||||
|
|
||||||
|
- devices = clutter_stage_find_updated_devices (stage);
|
||||||
|
+ if (priv->needs_update_devices)
|
||||||
|
+ devices = clutter_stage_find_updated_devices (stage, view);
|
||||||
|
|
||||||
|
frame = CLUTTER_FRAME_INIT;
|
||||||
|
|
||||||
|
@@ -1200,6 +1202,7 @@ handle_frame_clock_frame (ClutterFrameClock *frame_clock,
|
||||||
|
_clutter_stage_window_finish_frame (stage_window, view, &frame);
|
||||||
|
|
||||||
|
clutter_stage_update_devices (stage, devices);
|
||||||
|
+ priv->needs_update_devices = FALSE;
|
||||||
|
|
||||||
|
_clutter_run_repaint_functions (CLUTTER_REPAINT_FLAGS_POST_PAINT);
|
||||||
|
clutter_stage_emit_after_update (stage, view);
|
||||||
|
@@ -1522,3 +1525,12 @@ clutter_stage_view_class_init (ClutterStageViewClass *klass)
|
||||||
|
|
||||||
|
g_object_class_install_properties (object_class, PROP_LAST, obj_props);
|
||||||
|
}
|
||||||
|
+
|
||||||
|
+void
|
||||||
|
+clutter_stage_view_invalidate_input_devices (ClutterStageView *view)
|
||||||
|
+{
|
||||||
|
+ ClutterStageViewPrivate *priv =
|
||||||
|
+ clutter_stage_view_get_instance_private (view);
|
||||||
|
+
|
||||||
|
+ priv->needs_update_devices = TRUE;
|
||||||
|
+}
|
||||||
|
diff --git a/clutter/clutter/clutter-stage.c b/clutter/clutter/clutter-stage.c
|
||||||
|
index 3ef7ba69eb..c791959016 100644
|
||||||
|
--- a/clutter/clutter/clutter-stage.c
|
||||||
|
+++ b/clutter/clutter/clutter-stage.c
|
||||||
|
@@ -127,7 +127,6 @@ struct _ClutterStagePrivate
|
||||||
|
|
||||||
|
int update_freeze_count;
|
||||||
|
|
||||||
|
- gboolean needs_update_devices;
|
||||||
|
gboolean pending_finish_queue_redraws;
|
||||||
|
|
||||||
|
GHashTable *pointer_devices;
|
||||||
|
@@ -785,6 +784,19 @@ clutter_stage_dequeue_actor_relayout (ClutterStage *stage,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
+static void
|
||||||
|
+clutter_stage_invalidate_views_devices (ClutterStage *stage)
|
||||||
|
+{
|
||||||
|
+ GList *l;
|
||||||
|
+
|
||||||
|
+ for (l = clutter_stage_peek_stage_views (stage); l; l = l->next)
|
||||||
|
+ {
|
||||||
|
+ ClutterStageView *view = l->data;
|
||||||
|
+
|
||||||
|
+ clutter_stage_view_invalidate_input_devices (view);
|
||||||
|
+ }
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
void
|
||||||
|
clutter_stage_maybe_relayout (ClutterActor *actor)
|
||||||
|
{
|
||||||
|
@@ -832,36 +844,33 @@ clutter_stage_maybe_relayout (ClutterActor *actor)
|
||||||
|
CLUTTER_NOTE (ACTOR, "<<< Completed recomputing layout of %d subtrees", count);
|
||||||
|
|
||||||
|
if (count)
|
||||||
|
- priv->needs_update_devices = TRUE;
|
||||||
|
+ clutter_stage_invalidate_views_devices (stage);
|
||||||
|
}
|
||||||
|
|
||||||
|
GSList *
|
||||||
|
-clutter_stage_find_updated_devices (ClutterStage *stage)
|
||||||
|
+clutter_stage_find_updated_devices (ClutterStage *stage,
|
||||||
|
+ ClutterStageView *view)
|
||||||
|
{
|
||||||
|
ClutterStagePrivate *priv = stage->priv;
|
||||||
|
GSList *updating = NULL;
|
||||||
|
GHashTableIter iter;
|
||||||
|
gpointer value;
|
||||||
|
|
||||||
|
- if (!priv->needs_update_devices)
|
||||||
|
- return NULL;
|
||||||
|
-
|
||||||
|
- priv->needs_update_devices = FALSE;
|
||||||
|
-
|
||||||
|
g_hash_table_iter_init (&iter, priv->pointer_devices);
|
||||||
|
while (g_hash_table_iter_next (&iter, NULL, &value))
|
||||||
|
{
|
||||||
|
PointerDeviceEntry *entry = value;
|
||||||
|
- ClutterStageView *view;
|
||||||
|
- const cairo_region_t *clip;
|
||||||
|
+ ClutterStageView *pointer_view;
|
||||||
|
|
||||||
|
- view = clutter_stage_get_view_at (stage, entry->coords.x, entry->coords.y);
|
||||||
|
- if (!view)
|
||||||
|
+ pointer_view = clutter_stage_get_view_at (stage,
|
||||||
|
+ entry->coords.x,
|
||||||
|
+ entry->coords.y);
|
||||||
|
+ if (!pointer_view)
|
||||||
|
+ continue;
|
||||||
|
+ if (pointer_view != view)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
- clip = clutter_stage_view_peek_redraw_clip (view);
|
||||||
|
- if (!clip || cairo_region_contains_point (clip, entry->coords.x, entry->coords.y))
|
||||||
|
- updating = g_slist_prepend (updating, entry->device);
|
||||||
|
+ updating = g_slist_prepend (updating, entry->device);
|
||||||
|
}
|
||||||
|
|
||||||
|
return updating;
|
||||||
|
--
|
||||||
|
2.35.0.rc1
|
||||||
|
|
40
0002-Drop-CI-test-setup-that-needs-catchsegv.patch
Normal file
40
0002-Drop-CI-test-setup-that-needs-catchsegv.patch
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
From 103f2129530c1c4d4a1a99419005dcdd08d38748 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Adam Williamson <awilliam@redhat.com>
|
||||||
|
Date: Wed, 26 Jan 2022 15:44:31 -0800
|
||||||
|
Subject: [PATCH 2/2] Drop "CI" test setup that needs catchsegv
|
||||||
|
|
||||||
|
glibc has dropped catchsegv:
|
||||||
|
https://sourceware.org/bugzilla/show_bug.cgi?id=14913
|
||||||
|
so mutter no longer builds with recent glibc.
|
||||||
|
|
||||||
|
Signed-off-by: Adam Williamson <awilliam@redhat.com>
|
||||||
|
---
|
||||||
|
meson.build | 12 ------------
|
||||||
|
1 file changed, 12 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/meson.build b/meson.build
|
||||||
|
index 4f7f023043..2a963b3b37 100644
|
||||||
|
--- a/meson.build
|
||||||
|
+++ b/meson.build
|
||||||
|
@@ -327,18 +327,6 @@ if have_tests
|
||||||
|
)
|
||||||
|
|
||||||
|
add_test_setup('plain')
|
||||||
|
-
|
||||||
|
- add_test_setup('CI',
|
||||||
|
- env: [
|
||||||
|
- 'MUTTER_DEBUG_DUMMY_MODE_SPECS=800x600@10.0',
|
||||||
|
- ],
|
||||||
|
- exe_wrapper: [
|
||||||
|
- default_test_wrappers,
|
||||||
|
- find_program('catchsegv'),
|
||||||
|
- find_program('xvfb-run'), '-a', '-s', '+iglx -noreset',
|
||||||
|
- ],
|
||||||
|
- timeout_multiplier: 10,
|
||||||
|
- )
|
||||||
|
endif
|
||||||
|
|
||||||
|
have_profiler = get_option('profiler')
|
||||||
|
--
|
||||||
|
2.35.0.rc1
|
||||||
|
|
16
mutter.spec
16
mutter.spec
@ -10,7 +10,7 @@
|
|||||||
|
|
||||||
Name: mutter
|
Name: mutter
|
||||||
Version: 42~alpha
|
Version: 42~alpha
|
||||||
Release: 2%{?dist}
|
Release: 3%{?dist}
|
||||||
Summary: Window and compositing manager based on Clutter
|
Summary: Window and compositing manager based on Clutter
|
||||||
|
|
||||||
License: GPLv2+
|
License: GPLv2+
|
||||||
@ -26,6 +26,16 @@ Patch1: 0001-Revert-build-Do-not-provide-built-sources-as-libmutt.patch
|
|||||||
# https://bugzilla.redhat.com/show_bug.cgi?id=1936991
|
# https://bugzilla.redhat.com/show_bug.cgi?id=1936991
|
||||||
Patch2: mutter-42.alpha-disable-tegra.patch
|
Patch2: mutter-42.alpha-disable-tegra.patch
|
||||||
|
|
||||||
|
# https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/2257
|
||||||
|
# https://gitlab.gnome.org/GNOME/mutter/-/issues/2117
|
||||||
|
# Fixes a bug that caused clicking not to work in openQA tests sometimes
|
||||||
|
Patch3: 0001-clutter-Do-not-check-redraw-area-for-pointer-repicks.patch
|
||||||
|
|
||||||
|
# https://gitlab.gnome.org/GNOME/mutter/-/issues/2120
|
||||||
|
# Fixes build with recent glibc. Upstream may not do exactly this but
|
||||||
|
# it's good enough for a package build
|
||||||
|
Patch4: 0002-Drop-CI-test-setup-that-needs-catchsegv.patch
|
||||||
|
|
||||||
BuildRequires: pkgconfig(gobject-introspection-1.0) >= 1.41.0
|
BuildRequires: pkgconfig(gobject-introspection-1.0) >= 1.41.0
|
||||||
BuildRequires: pkgconfig(sm)
|
BuildRequires: pkgconfig(sm)
|
||||||
BuildRequires: pkgconfig(libwacom)
|
BuildRequires: pkgconfig(libwacom)
|
||||||
@ -169,6 +179,10 @@ desktop-file-validate %{buildroot}/%{_datadir}/applications/%{name}.desktop
|
|||||||
%{_datadir}/mutter-%{mutter_api_version}/tests
|
%{_datadir}/mutter-%{mutter_api_version}/tests
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Thu Jan 27 2022 Adam Williamson <awilliam@redhat.com> - 42~alpha-3
|
||||||
|
- Drop a test setup to fix build with latest glibc (catchsegv removed)
|
||||||
|
- Backport MR #2257 to fix clicks on burger menus failing in openQA
|
||||||
|
|
||||||
* Thu Jan 20 2022 Fedora Release Engineering <releng@fedoraproject.org> - 42~alpha-2
|
* Thu Jan 20 2022 Fedora Release Engineering <releng@fedoraproject.org> - 42~alpha-2
|
||||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_36_Mass_Rebuild
|
- Rebuilt for https://fedoraproject.org/wiki/Fedora_36_Mass_Rebuild
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user