[gnome-shell/gnome-3-38] Make sure to allocate all children in allocate vfuncs



commit 6ff4749cf003d7d8c4b26de2a9a1fb176fdc7e27
Author: Jonas Dreßler <verdre v0yd nl>
Date:   Sat Oct 24 20:25:49 2020 +0200

    Make sure to allocate all children in allocate vfuncs
    
    Clutter expects actors overriding the allocate vfunc to allocate all
    mapped children of the actor, otherwise bad things happen.
    
    So make sure we actually allocate all our visible children in our custom
    allocation functions, and since we don't want to give them a real
    allocation, just pass them an empty ClutterActorBox.
    
    It would be nice if we had a way to hide children during the allocation
    process where no relayout is queued like gtk allows with
    gtk_widget_set_child_visible(), then we could avoid those weird empty
    ClutterActorBoxes.
    
    Fixes https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/3098
    
    Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1481>
    
    (cherry picked from commit 3fb0284358714ba72d586b918783ddead05a09f8)

 js/ui/search.js             |  7 ++++---
 js/ui/userWidget.js         | 18 +++++++++++-------
 js/ui/workspace.js          |  8 ++++++++
 js/ui/workspaceThumbnail.js |  3 +++
 4 files changed, 26 insertions(+), 10 deletions(-)
---
diff --git a/js/ui/search.js b/js/ui/search.js
index 45ef424444..dd76735cec 100644
--- a/js/ui/search.js
+++ b/js/ui/search.js
@@ -422,10 +422,11 @@ var GridSearchResultsLayout = GObject.registerClass({
 
             const [childWidth] = child.get_preferred_width(-1);
             const [childHeight] = child.get_preferred_height(-1);
-            childBox.set_size(childWidth, childHeight);
 
-            if (childBox.x1 + childWidth > width)
-                return;
+            if (childBox.x1 + childWidth <= width)
+                childBox.set_size(childWidth, childHeight);
+            else
+                childBox.set_size(0, 0);
 
             child.allocate(childBox);
 
diff --git a/js/ui/userWidget.js b/js/ui/userWidget.js
index 0f4ed08912..5540ea6bfc 100644
--- a/js/ui/userWidget.js
+++ b/js/ui/userWidget.js
@@ -152,17 +152,21 @@ class UserWidgetLabel extends St.Widget {
 
         let [, , natRealNameWidth] = this._realNameLabel.get_preferred_size();
 
-        if (natRealNameWidth <= availWidth)
+        let childBox = new Clutter.ActorBox();
+
+        let hiddenLabel;
+        if (natRealNameWidth <= availWidth) {
             this._currentLabel = this._realNameLabel;
-        else
+            hiddenLabel = this._userNameLabel;
+        } else {
             this._currentLabel = this._userNameLabel;
+            hiddenLabel = this._realNameLabel;
+        }
         this.label_actor = this._currentLabel;
 
-        let childBox = new Clutter.ActorBox();
-        childBox.x1 = 0;
-        childBox.y1 = 0;
-        childBox.x2 = availWidth;
-        childBox.y2 = availHeight;
+        hiddenLabel.allocate(childBox);
+
+        childBox.set_size(availWidth, availHeight);
 
         this._currentLabel.allocate(childBox);
     }
diff --git a/js/ui/workspace.js b/js/ui/workspace.js
index ee7cbdc202..ee6e198b1e 100644
--- a/js/ui/workspace.js
+++ b/js/ui/workspace.js
@@ -630,6 +630,14 @@ var WorkspaceLayout = GObject.registerClass({
 
             if (windowInfo.currentTransition) {
                 windowInfo.currentTransition.get_interval().set_final(childBox);
+
+                // The timeline of the transition might not have been updated
+                // before this allocation cycle, so make sure the child
+                // still updates needs_allocation to FALSE.
+                // Unfortunately, this relies on the fast paths in
+                // clutter_actor_allocate(), otherwise we'd start a new
+                // transition on the child, replacing the current one.
+                child.allocate(child.allocation);
                 continue;
             }
 
diff --git a/js/ui/workspaceThumbnail.js b/js/ui/workspaceThumbnail.js
index 611bccfadd..9d7a863eee 100644
--- a/js/ui/workspaceThumbnail.js
+++ b/js/ui/workspaceThumbnail.js
@@ -1270,6 +1270,9 @@ var ThumbnailsBox = GObject.registerClass({
         let y = box.y1;
 
         if (this._dropPlaceholderPos == -1) {
+            this._dropPlaceholder.allocate_preferred_size(
+                ...this._dropPlaceholder.get_position());
+
             Meta.later_add(Meta.LaterType.BEFORE_REDRAW, () => {
                 this._dropPlaceholder.hide();
             });


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]