From 475161f7163055ac0d10393daa3ffc6e0725414e Mon Sep 17 00:00:00 2001 From: Dan Winship Date: Fri, 25 Mar 2011 10:04:28 -0400 Subject: [PATCH] boxpointer: reposition after a size change If the BoxPointer changes size (eg, when opening the "More" section of the network menu), reposition it to make sure it's still aligned correctly and still completely on-screen. This is not the right fix for this problem (and causes the menu to be drawn in the wrong position for one frame). The right fix would involve a ClutterConstraint, but that would be more invasive, and can happen post-3.0.0. https://bugzilla.gnome.org/show_bug.cgi?id=645647 --- js/ui/boxpointer.js | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/js/ui/boxpointer.js b/js/ui/boxpointer.js index 99de6f18c..619e0c552 100644 --- a/js/ui/boxpointer.js +++ b/js/ui/boxpointer.js @@ -2,6 +2,7 @@ const Clutter = imports.gi.Clutter; const Lang = imports.lang; +const Meta = imports.gi.Meta; const St = imports.gi.St; const Shell = imports.gi.Shell; @@ -176,6 +177,18 @@ BoxPointer.prototype = { break; } this.bin.allocate(childBox, flags); + + if (this._sourceActor) { + Meta.later_add (Meta.LaterType.BEFORE_REDRAW, Lang.bind(this, + function () { + // This won't cause a loop if _allocate() was + // called as a result of repositioning, because in + // that case _reposition() will set the same + // coordinates again, which Clutter will just + // ignore. + this._reposition(this._sourceActor, this._gap, this._alignment); + })); + } }, _drawBorder: function(area) { @@ -306,6 +319,14 @@ BoxPointer.prototype = { // so that we can query the correct size. this.actor.show(); + this._sourceActor = sourceActor; + this._gap = gap; + this._alignment = alignment; + + this._reposition(sourceActor, gap, alignment); + }, + + _reposition: function(sourceActor, gap, alignment) { // Position correctly relative to the sourceActor let sourceNode = sourceActor.get_theme_node(); let sourceContentBox = sourceNode.get_content_box(sourceActor.get_allocation_box());