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
This commit is contained in:
Owen W. Taylor 2009-09-04 17:51:43 -04:00
parent 52abf266c0
commit b7b4c54ab5

View File

@ -7,6 +7,7 @@ const Gdk = imports.gi.Gdk;
const Gtk = imports.gi.Gtk; const Gtk = imports.gi.Gtk;
const Lang = imports.lang; const Lang = imports.lang;
const Mainloop = imports.mainloop; const Mainloop = imports.mainloop;
const Meta = imports.gi.Meta;
const Pango = imports.gi.Pango; const Pango = imports.gi.Pango;
const Signals = imports.signals; const Signals = imports.signals;
const Shell = imports.gi.Shell; 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. // 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(); // We want to do this between finishing our changes to the display and the point where
let global = Shell.Global.get(); // the display is redrawn.
let actor = global.stage.get_actor_at_pos(Clutter.PickMode.REACTIVE, x, y); Mainloop.idle_add(Lang.bind(this,
if (actor != null) { function() {
let item = this._findDisplayedByActor(actor); let [child, x, y, mask] = Gdk.Screen.get_default().get_root_window().get_pointer();
if (item != null) { let global = Shell.Global.get();
item.onDrawnUnderPointer(); 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 // Creates a display item based on the information associated with itemId