[gnome-shell] Make checking if an item is under the pointer asynchonous again
- From: Owen Taylor <otaylor src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [gnome-shell] Make checking if an item is under the pointer asynchonous again
- Date: Fri, 4 Sep 2009 23:12:26 +0000 (UTC)
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]