From b7b4c54ab5dd0d1359e3b1c8e13832347ac899d0 Mon Sep 17 00:00:00 2001 From: "Owen W. Taylor" Date: Fri, 4 Sep 2009 17:51:43 -0400 Subject: [PATCH] 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 file changed, 18 insertions(+), 9 deletions(-) diff --git a/js/ui/genericDisplay.js b/js/ui/genericDisplay.js index 28e6b7ed5..2ebdf8c59 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