From 8d5b312a1eb39d181f6f627e677823b0570f0c76 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?T=C3=A9rence=20Clastres?= Date: Sun, 28 Jul 2019 00:39:16 +0200 Subject: [PATCH] Add !429 Thanks verdre! --- .SRCINFO | 4 +- 429.diff | 218 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ PKGBUILD | 14 +++- 3 files changed, 232 insertions(+), 4 deletions(-) create mode 100644 429.diff diff --git a/.SRCINFO b/.SRCINFO index 7d191b5..15ee89a 100644 --- a/.SRCINFO +++ b/.SRCINFO @@ -1,7 +1,7 @@ pkgbase = mutter-performance pkgdesc = A window manager for GNOME | Attempts to improve performances with non-upstreamed merge-requests and frequent stable branch resync pkgver = 3.32.2+43+gb7f158811 - pkgrel = 3 + pkgrel = 4 url = https://gitlab.gnome.org/GNOME/mutter arch = x86_64 groups = gnome @@ -35,7 +35,9 @@ pkgbase = mutter-performance options = debug options = !strip source = mutter-performance::git+https://gitlab.gnome.org/GNOME/mutter.git#commit=b7f158811934d8e4d9dd0be28ad8e1746ceac46c + source = 429.diff sha256sums = SKIP + sha256sums = c22bc32ab8a29e3da986f386d14a8376f1985c051328ca6786571b4b67ec9e48 pkgname = mutter-performance diff --git a/429.diff b/429.diff new file mode 100644 index 0000000..3c30b13 --- /dev/null +++ b/429.diff @@ -0,0 +1,218 @@ +diff --git a/clutter/clutter/clutter-actor.c b/clutter/clutter/clutter-actor.c +index 33c439533..7c8d671bb 100644 +--- a/clutter/clutter/clutter-actor.c ++++ b/clutter/clutter/clutter-actor.c +@@ -1798,6 +1798,7 @@ static void + clutter_actor_real_show (ClutterActor *self) + { + ClutterActorPrivate *priv = self->priv; ++ ClutterStage *stage; + + if (CLUTTER_ACTOR_IS_VISIBLE (self)) + return; +@@ -1832,6 +1833,11 @@ clutter_actor_real_show (ClutterActor *self) + clutter_actor_queue_shallow_relayout (self); + clutter_actor_queue_redraw (self); + } ++ ++ stage = CLUTTER_STAGE (_clutter_actor_get_stage_internal (self)); ++ ++ if (stage != NULL) ++ _clutter_stage_queue_repick (stage); + } + + static inline void +@@ -1975,6 +1981,7 @@ static void + clutter_actor_real_hide (ClutterActor *self) + { + ClutterActorPrivate *priv = self->priv; ++ ClutterStage *stage; + + if (!CLUTTER_ACTOR_IS_VISIBLE (self)) + return; +@@ -1993,6 +2000,11 @@ clutter_actor_real_hide (ClutterActor *self) + if (priv->parent != NULL && + (!(priv->parent->flags & CLUTTER_ACTOR_NO_LAYOUT))) + clutter_actor_queue_relayout (priv->parent); ++ ++ stage = CLUTTER_STAGE (_clutter_actor_get_stage_internal (self)); ++ ++ if (stage != NULL) ++ _clutter_stage_queue_repick (stage); + } + + /** +@@ -2640,6 +2652,8 @@ clutter_actor_set_allocation_internal (ClutterActor *self, + x2_changed || + y2_changed) + { ++ ClutterStage *stage = CLUTTER_STAGE (_clutter_actor_get_stage_internal (self)); ++ + CLUTTER_NOTE (LAYOUT, "Allocation for '%s' changed", + _clutter_actor_get_debug_name (self)); + +@@ -2654,6 +2668,8 @@ clutter_actor_set_allocation_internal (ClutterActor *self, + g_object_notify_by_pspec (obj, obj_props[PROP_CONTENT_BOX]); + } + ++ _clutter_stage_queue_repick (stage); ++ + retval = TRUE; + } + else +@@ -4486,7 +4502,12 @@ clutter_actor_remove_child_internal (ClutterActor *self, + * for the removed child + */ + if (was_mapped) +- clutter_actor_queue_relayout (self); ++ { ++ ClutterStage *stage = CLUTTER_STAGE (_clutter_actor_get_stage_internal (self)); ++ ++ _clutter_stage_queue_repick (stage); ++ clutter_actor_queue_relayout (self); ++ } + + /* we need to emit the signal before dropping the reference */ + if (emit_actor_removed) +@@ -13153,7 +13174,12 @@ clutter_actor_add_child_internal (ClutterActor *self, + * the actor is supposed to be visible when it's added + */ + if (CLUTTER_ACTOR_IS_MAPPED (child)) +- clutter_actor_queue_redraw (child); ++ { ++ ClutterStage *stage = CLUTTER_STAGE (_clutter_actor_get_stage_internal (self)); ++ ++ _clutter_stage_queue_repick (stage); ++ clutter_actor_queue_redraw (child); ++ } + + /* maintain the invariant that if an actor needs layout, + * its parents do as well +diff --git a/clutter/clutter/clutter-stage-private.h b/clutter/clutter/clutter-stage-private.h +index 1dd3a82f8..2812b5fac 100644 +--- a/clutter/clutter/clutter-stage-private.h ++++ b/clutter/clutter/clutter-stage-private.h +@@ -63,6 +63,7 @@ void _clutter_stage_maybe_relayout (ClutterActor + gboolean _clutter_stage_needs_update (ClutterStage *stage); + gboolean _clutter_stage_do_update (ClutterStage *stage); + ++void _clutter_stage_queue_repick (ClutterStage *stage); + void _clutter_stage_queue_event (ClutterStage *stage, + ClutterEvent *event, + gboolean copy_event); +diff --git a/clutter/clutter/clutter-stage.c b/clutter/clutter/clutter-stage.c +index 52fecfddd..48dbdbb7f 100644 +--- a/clutter/clutter/clutter-stage.c ++++ b/clutter/clutter/clutter-stage.c +@@ -174,6 +174,7 @@ struct _ClutterStagePrivate + int update_freeze_count; + + guint redraw_pending : 1; ++ guint needs_repick : 1; + guint is_cursor_visible : 1; + guint use_fog : 1; + guint throttle_motion_events : 1; +@@ -182,7 +183,6 @@ struct _ClutterStagePrivate + guint accept_focus : 1; + guint motion_events_enabled : 1; + guint has_custom_perspective : 1; +- guint stage_was_relayout : 1; + }; + + enum +@@ -1319,8 +1319,6 @@ _clutter_stage_maybe_relayout (ClutterActor *actor) + + g_list_free_full (pending_queue_relayouts, g_object_unref); + +- if (count) +- priv->stage_was_relayout = TRUE; + } + + static void +@@ -1431,11 +1429,8 @@ gboolean + _clutter_stage_do_update (ClutterStage *stage) + { + ClutterStagePrivate *priv = stage->priv; +- gboolean stage_was_relayout = priv->stage_was_relayout; + GSList *pointers = NULL; + +- priv->stage_was_relayout = FALSE; +- + /* if the stage is being destroyed, or if the destruction already + * happened and we don't have an StageWindow any more, then we + * should bail out +@@ -1447,18 +1442,33 @@ _clutter_stage_do_update (ClutterStage *stage) + return FALSE; + + /* NB: We need to ensure we have an up to date layout *before* we +- * check or clear the pending redraws flag since a relayout may +- * queue a redraw. ++ * check or clear the pending redraws flag since a relayout or the ++ * repick afterwards may queue a redraw. + */ + _clutter_stage_maybe_relayout (CLUTTER_ACTOR (stage)); + +- if (!priv->redraw_pending) +- return FALSE; ++ /* Finish the queued redraws now so the redraw clip is initialized ++ * when we do the repick. */ ++ clutter_stage_maybe_finish_queue_redraws (stage); + +- if (stage_was_relayout) +- pointers = _clutter_stage_check_updated_pointers (stage); ++ if (priv->needs_repick) ++ { ++ pointers = _clutter_stage_check_updated_pointers (stage); ++ while (pointers) ++ { ++ _clutter_input_device_update (pointers->data, NULL, TRUE); ++ pointers = g_slist_delete_link (pointers, pointers); ++ } + +- clutter_stage_maybe_finish_queue_redraws (stage); ++ /* Make sure any newly queued redraws are also handled in this ++ * paint cycle. */ ++ clutter_stage_maybe_finish_queue_redraws (stage); ++ ++ priv->needs_repick = FALSE; ++ } ++ ++ if (!priv->redraw_pending) ++ return FALSE; + + clutter_stage_do_redraw (stage); + +@@ -1475,15 +1485,18 @@ _clutter_stage_do_update (ClutterStage *stage) + } + #endif /* CLUTTER_ENABLE_DEBUG */ + +- while (pointers) +- { +- _clutter_input_device_update (pointers->data, NULL, TRUE); +- pointers = g_slist_delete_link (pointers, pointers); +- } +- + return TRUE; + } + ++void ++_clutter_stage_queue_repick (ClutterStage *self) ++{ ++ ClutterStagePrivate *priv = self->priv; ++ ++ if (!priv->needs_repick) ++ priv->needs_repick = TRUE; ++} ++ + static void + clutter_stage_real_queue_relayout (ClutterActor *self) + { +@@ -2349,6 +2362,8 @@ clutter_stage_init (ClutterStage *self) + + clutter_stage_queue_actor_relayout (self, CLUTTER_ACTOR (self)); + ++ priv->needs_repick = FALSE; ++ + clutter_actor_set_reactive (CLUTTER_ACTOR (self), TRUE); + clutter_stage_set_title (self, g_get_prgname ()); + clutter_stage_set_key_focus (self, NULL); diff --git a/PKGBUILD b/PKGBUILD index 159cfe7..bc9b24e 100644 --- a/PKGBUILD +++ b/PKGBUILD @@ -7,7 +7,7 @@ pkgname=mutter-performance pkgver=3.32.2+43+gb7f158811 -pkgrel=3 +pkgrel=4 pkgdesc="A window manager for GNOME | Attempts to improve performances with non-upstreamed merge-requests and frequent stable branch resync" url="https://gitlab.gnome.org/GNOME/mutter" arch=(x86_64) @@ -23,8 +23,10 @@ conflicts=(mutter) replaces=(mutter-781835-workaround) groups=(gnome) _commit=b7f158811934d8e4d9dd0be28ad8e1746ceac46c # tags/3.32.2^43 -source=("$pkgname::git+https://gitlab.gnome.org/GNOME/mutter.git#commit=$_commit") -sha256sums=('SKIP') +source=("$pkgname::git+https://gitlab.gnome.org/GNOME/mutter.git#commit=$_commit" + 429.diff) +sha256sums=('SKIP' + 'c22bc32ab8a29e3da986f386d14a8376f1985c051328ca6786571b4b67ec9e48') pkgver() { cd $pkgname @@ -216,6 +218,12 @@ prepare() { # Comment: #git cherry-pick -n f2694e72^..d0edf91c + # Title: clutter/stage: Update input devices right after doing a relayout + # URL: https://gitlab.gnome.org/GNOME/mutter/merge_requests/429 + # Type: 1 + # Status: 2 + # Comment: Can't be cleanly applied on 3.32 without lot of cherry-pick unrelated commits... + patch -Np1 < ../429.diff } build() {