[gnome-shell] Make checking if an item is under the pointer asynchonous again



commit b7b4c54ab5dd0d1359e3b1c8e13832347ac899d0
Author: Owen W. Taylor <otaylor fishsoup net>
Date:   Fri Sep 4 17:51:43 2009 -0400

    Make checking if an item is under the pointer asynchonous again
    
    Checking if an item is under the pointer by calling stage.get_actor_at_pos()
    synchronously will trigger a too-early allocation of the stage. Use an idle
    at Meta.PRIORITY_BEFORE_REDRAW. (Before 553503d it was using a 5 msec timeout,
    553503d made it synchronous.)
    
    http://bugzilla.gnome.org/show_bug.cgi?id=592608

 js/ui/genericDisplay.js |   27 ++++++++++++++++++---------
 1 files changed, 18 insertions(+), 9 deletions(-)
---
diff --git a/js/ui/genericDisplay.js b/js/ui/genericDisplay.js
index 28e6b7e..2ebdf8c 100644
--- a/js/ui/genericDisplay.js
+++ b/js/ui/genericDisplay.js
@@ -7,6 +7,7 @@ const Gdk = imports.gi.Gdk;
 const Gtk = imports.gi.Gtk;
 const Lang = imports.lang;
 const Mainloop = imports.mainloop;
+const Meta = imports.gi.Meta;
 const Pango = imports.gi.Pango;
 const Signals = imports.signals;
 const Shell = imports.gi.Shell;
@@ -496,15 +497,23 @@ GenericDisplay.prototype = {
         }
 
         // Check if the pointer is over one of the items and display the information button if it is.
-        let [child, x, y, mask] = Gdk.Screen.get_default().get_root_window().get_pointer();
-        let global = Shell.Global.get();
-        let actor = global.stage.get_actor_at_pos(Clutter.PickMode.REACTIVE, x, y);
-        if (actor != null) {
-            let item = this._findDisplayedByActor(actor);
-            if (item != null) {
-                item.onDrawnUnderPointer();
-            }
-        }
+        // We want to do this between finishing our changes to the display and the point where
+        // the display is redrawn.
+        Mainloop.idle_add(Lang.bind(this,
+                                    function() {
+                                        let [child, x, y, mask] = Gdk.Screen.get_default().get_root_window().get_pointer();
+                                        let global = Shell.Global.get();
+                                        let actor = global.stage.get_actor_at_pos(Clutter.PickMode.REACTIVE,
+                                                                                  x, y);
+                                        if (actor != null) {
+                                            let item = this._findDisplayedByActor(actor);
+                                            if (item != null) {
+                                                item.onDrawnUnderPointer();
+                                            }
+                                        }
+                                        return false;
+                                    }),
+                          Meta.PRIORITY_BEFORE_REDRAW);
     },
 
     // Creates a display item based on the information associated with itemId 



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