[gnome-shell] layout: Don't update the input region while we have a modal



commit 0ca2fee54fb9be9d5f2006d23bdf52b4b91b91c6
Author: Jasper St. Pierre <jstpierre mecheye net>
Date:   Fri Sep 19 18:54:31 2014 -0600

    layout: Don't update the input region while we have a modal
    
    If we have a modal, the stage's input region doesn't really matter --
    all events go to us anyway. To avoid doing extra work doing animations
    when we have a modal, like menus, the overview, and the message tray,
    just fizzle out all updates.
    
    To make sure we catch updates, update the input region whenever we end a
    modal.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=737001

 js/ui/layout.js |   20 ++++++++++++--------
 js/ui/main.js   |    1 +
 2 files changed, 13 insertions(+), 8 deletions(-)
---
diff --git a/js/ui/layout.js b/js/ui/layout.js
index 5019036..0c7a134 100644
--- a/js/ui/layout.js
+++ b/js/ui/layout.js
@@ -259,7 +259,6 @@ const LayoutManager = new Lang.Class({
 
         this._inOverview = true;
         this._updateVisibility();
-        this._updateRegions();
     },
 
     hideOverview: function() {
@@ -267,7 +266,6 @@ const LayoutManager = new Lang.Class({
 
         this._inOverview = false;
         this._updateVisibility();
-        this._queueUpdateRegions();
     },
 
     _sessionUpdated: function() {
@@ -915,9 +913,6 @@ const LayoutManager = new Lang.Class({
     },
 
     _queueUpdateRegions: function() {
-        if (Main.sessionMode.isGreeter)
-            return;
-
         if (this._startingUp)
             return;
 
@@ -951,13 +946,16 @@ const LayoutManager = new Lang.Class({
     },
 
     _updateRegions: function() {
-        let rects = [], struts = [], i;
-
         if (this._updateRegionIdle) {
             Meta.later_remove(this._updateRegionIdle);
             delete this._updateRegionIdle;
         }
 
+        // No need to update when we have a modal.
+        if (Main.modalCount > 0)
+            return GLib.SOURCE_REMOVE;
+
+        let rects = [], struts = [], i;
         let isPopupMenuVisible = global.top_window_group.get_children().some(isPopupMetaWindow);
         let wantsInputRegion = !isPopupMenuVisible;
 
@@ -1043,7 +1041,13 @@ const LayoutManager = new Lang.Class({
         }
 
         return GLib.SOURCE_REMOVE;
-    }
+    },
+
+    modalEnded: function() {
+        // We don't update the stage input region while in a modal,
+        // so queue an update now.
+        this._queueUpdateRegions();
+    },
 });
 Signals.addSignalMethods(LayoutManager.prototype);
 
diff --git a/js/ui/main.js b/js/ui/main.js
index be69ca1..f9bb59e 100644
--- a/js/ui/main.js
+++ b/js/ui/main.js
@@ -454,6 +454,7 @@ function popModal(actor, timestamp) {
     if (modalCount > 0)
         return;
 
+    layoutManager.modalEnded();
     global.end_modal(timestamp);
     Meta.enable_unredirect_for_screen(global.screen);
     keybindingMode = Shell.KeyBindingMode.NORMAL;


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