[gnome-shell] boxpointer: Use X/Y actor positioning instead of an anchor point



commit 044572cb60aeb47a099258cd5617c8df0e7bcdbc
Author: Marco Trevisan (Treviño) <mail 3v1n0 net>
Date:   Mon Mar 4 17:38:32 2019 -0600

    boxpointer: Use X/Y actor positioning instead of an anchor point
    
    Currently all the widgets using BoxPointer and so popup actors are always drawn
    at screen origin and then shifted at paint time in the proper position.
    
    This doesn't work when using resource scale, since the widgets need to know
    in which monitor they currently are in order to use properly scaled resources.
    
    So, basically revert commit 22c22e0d7 and go back using the actual actor
    coordinates for positioning and the actor translation for animating it, as the
    relayouting issues of the past seem to be gone now.
    
    https://gitlab.gnome.org/GNOME/gnome-shell/issues/1008
    https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/435

 js/ui/boxpointer.js | 71 ++++++++++++++---------------------------------------
 1 file changed, 19 insertions(+), 52 deletions(-)
---
diff --git a/js/ui/boxpointer.js b/js/ui/boxpointer.js
index 59c91f037..82dbbaf6a 100644
--- a/js/ui/boxpointer.js
+++ b/js/ui/boxpointer.js
@@ -47,10 +47,6 @@ var BoxPointer = GObject.registerClass({
         this._border.connect('repaint', this._drawBorder.bind(this));
         this.add_actor(this._border);
         this.bin.raise(this._border);
-        this._xOffset = 0;
-        this._yOffset = 0;
-        this._xPosition = 0;
-        this._yPosition = 0;
         this._sourceAlignment = 0.5;
         this._capturedEventId = 0;
         this._muteInput();
@@ -118,23 +114,23 @@ var BoxPointer = GObject.registerClass({
         if (animate & PopupAnimation.SLIDE) {
             switch (this._arrowSide) {
                 case St.Side.TOP:
-                    this.yOffset = -rise;
+                    this.translation_y = -rise;
                     break;
                 case St.Side.BOTTOM:
-                    this.yOffset = rise;
+                    this.translation_y = rise;
                     break;
                 case St.Side.LEFT:
-                    this.xOffset = -rise;
+                    this.translation_x = -rise;
                     break;
                 case St.Side.RIGHT:
-                    this.xOffset = rise;
+                    this.translation_x = rise;
                     break;
             }
         }
 
         Tweener.addTween(this, { opacity: 255,
-                                 xOffset: 0,
-                                 yOffset: 0,
+                                 translation_x: 0,
+                                 translation_y: 0,
                                  transition: 'linear',
                                  onComplete: () => {
                                      this._unmuteInput();
@@ -148,8 +144,8 @@ var BoxPointer = GObject.registerClass({
         if (!this.visible)
             return;
 
-        let xOffset = 0;
-        let yOffset = 0;
+        let translationX = 0;
+        let translationY = 0;
         let themeNode = this.get_theme_node();
         let rise = themeNode.get_length('-arrow-rise');
         let fade = (animate & PopupAnimation.FADE);
@@ -158,16 +154,16 @@ var BoxPointer = GObject.registerClass({
         if (animate & PopupAnimation.SLIDE) {
             switch (this._arrowSide) {
                 case St.Side.TOP:
-                    yOffset = rise;
+                    translationY = rise;
                     break;
                 case St.Side.BOTTOM:
-                    yOffset = -rise;
+                    translationY = -rise;
                     break;
                 case St.Side.LEFT:
-                    xOffset = rise;
+                    translationX = rise;
                     break;
                 case St.Side.RIGHT:
-                    xOffset = -rise;
+                    translationX = -rise;
                     break;
             }
         }
@@ -176,15 +172,15 @@ var BoxPointer = GObject.registerClass({
 
         Tweener.removeTweens(this);
         Tweener.addTween(this, { opacity: fade ? 0 : 255,
-                                 xOffset: xOffset,
-                                 yOffset: yOffset,
+                                 translation_x: translationX,
+                                 translation_y: translationY,
                                  transition: 'linear',
                                  time: animationTime,
                                  onComplete: () => {
                                      this.hide();
                                      this.opacity = 0;
-                                     this.xOffset = 0;
-                                     this.yOffset = 0;
+                                     this.translation_x = 0;
+                                     this.translation_y = 0;
                                      if (onComplete)
                                          onComplete();
                                  }
@@ -584,9 +580,9 @@ var BoxPointer = GObject.registerClass({
             parent = parent.get_parent();
         }
 
-        this._xPosition = Math.floor(x);
-        this._yPosition = Math.floor(y);
-        this._shiftActor();
+        // Actually set the position
+        this.x = Math.floor(x);
+        this.y = Math.floor(y);
     }
 
     // @origin: Coordinate specifying middle of the arrow, along
@@ -609,17 +605,6 @@ var BoxPointer = GObject.registerClass({
         }
     }
 
-    _shiftActor() {
-        // Since the position of the BoxPointer depends on the allocated size
-        // of the BoxPointer and the position of the source actor, trying
-        // to position the BoxPointer via the x/y properties will result in
-        // allocation loops and warnings. Instead we do the positioning via
-        // the anchor point, which is independent of allocation, and leave
-        // x == y == 0.
-        this.set_anchor_point(-(this._xPosition + this._xOffset),
-                              -(this._yPosition + this._yOffset));
-    }
-
     _calculateArrowSide(arrowSide) {
         let sourceAllocation = Shell.util_get_transformed_allocation(this._sourceActor);
         let [minWidth, minHeight, boxWidth, boxHeight] = this.get_preferred_size();
@@ -666,24 +651,6 @@ var BoxPointer = GObject.registerClass({
         }
     }
 
-    set xOffset(offset) {
-        this._xOffset = offset;
-        this._shiftActor();
-    }
-
-    get xOffset() {
-        return this._xOffset;
-    }
-
-    set yOffset(offset) {
-        this._yOffset = offset;
-        this._shiftActor();
-    }
-
-    get yOffset() {
-        return this._yOffset;
-    }
-
     updateArrowSide(side) {
         this._arrowSide = side;
         this._border.queue_repaint();


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