[gnome-shell] layout: Compute strut side more precisely for non primary monitors



commit c2f5813463f1d4e46c5fb63cf1468fdfb66d81e5
Author: Sylvain Pasche <sylvain pasche gmail com>
Date:   Sun Feb 8 23:03:07 2015 +0100

    layout: Compute strut side more precisely for non primary monitors
    
    Don't assume struts are on the primary monitor while computing
    the strut side. Instead, find the first monitor that overlaps the
    strut and compute the strut side using it.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=744183

 js/ui/layout.js |   47 ++++++++++++++++++++---------------------------
 1 files changed, 20 insertions(+), 27 deletions(-)
---
diff --git a/js/ui/layout.js b/js/ui/layout.js
index 204ab94..407d73e 100644
--- a/js/ui/layout.js
+++ b/js/ui/layout.js
@@ -973,46 +973,39 @@ const LayoutManager = new Lang.Class({
                 let y1 = Math.max(y, 0);
                 let y2 = Math.min(y + h, global.screen_height);
 
-                // NetWM struts are not really powerful enought to handle
-                // a multi-monitor scenario, they only describe what happens
-                // around the outer sides of the full display region. However
-                // it can describe a partial region along each side, so
-                // we can support having the struts only affect the
-                // primary monitor. This should be enough as we only have
-                // chrome affecting the struts on the primary monitor so
-                // far.
-                //
-                // Metacity wants to know what side of the screen the
-                // strut is considered to be attached to. If the actor is
+                // Metacity wants to know what side of the monitor the
+                // strut is considered to be attached to. First, we find
+                // the monitor that contains the strut. If the actor is
                 // only touching one edge, or is touching the entire
-                // border of the primary monitor, then it's obvious which
-                // side to call it. If it's in a corner, we pick a side
-                // arbitrarily. If it doesn't touch any edges, or it spans
-                // the width/height across the middle of the screen, then
-                // we don't create a strut for it at all.
+                // border of that monitor, then it's obvious which side
+                // to call it. If it's in a corner, we pick a side
+                // arbitrarily. If it doesn't touch any edges, or it
+                // spans the width/height across the middle of the
+                // screen, then we don't create a strut for it at all.
+
+                let monitor = this.findMonitorForActor(actorData.actor);
                 let side;
-                let primary = this.primaryMonitor;
-                if (x1 <= primary.x && x2 >= primary.x + primary.width) {
-                    if (y1 <= primary.y)
+                if (x1 <= monitor.x && x2 >= monitor.x + monitor.width) {
+                    if (y1 <= monitor.y)
                         side = Meta.Side.TOP;
-                    else if (y2 >= primary.y + primary.height)
+                    else if (y2 >= monitor.y + monitor.height)
                         side = Meta.Side.BOTTOM;
                     else
                         continue;
-                } else if (y1 <= primary.y && y2 >= primary.y + primary.height) {
-                    if (x1 <= 0)
+                } else if (y1 <= monitor.y && y2 >= monitor.y + monitor.height) {
+                    if (x1 <= monitor.x)
                         side = Meta.Side.LEFT;
-                    else if (x2 >= primary.x + primary.width)
+                    else if (x2 >= monitor.x + monitor.width)
                         side = Meta.Side.RIGHT;
                     else
                         continue;
-                } else if (x1 <= 0)
+                } else if (x1 <= monitor.x)
                     side = Meta.Side.LEFT;
-                else if (y1 <= 0)
+                else if (y1 <= monitor.y)
                     side = Meta.Side.TOP;
-                else if (x2 >= global.screen_width)
+                else if (x2 >= monitor.x + monitor.width)
                     side = Meta.Side.RIGHT;
-                else if (y2 >= global.screen_height)
+                else if (y2 >= monitor.y + monitor.height)
                     side = Meta.Side.BOTTOM;
                 else
                     continue;


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