From a722b4c51d2cc20cbec614a93c4a9b13214c2e8d Mon Sep 17 00:00:00 2001 From: Carlos Garnacho Date: Tue, 8 Oct 2019 12:22:34 +0200 Subject: [PATCH] ibusCandidatePopup: Use an internal actor to track IM focus position We share this actor with other shell menus, which arguably track a different "cursor" as we care of the caret/anchor text positions, and menus care about pointer click coordinates. Use a standalone actor for this, so popups/IM are entirely decoupled. Closes: https://gitlab.gnome.org/GNOME/gnome-shell/issues/1571 --- js/ui/ibusCandidatePopup.js | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/js/ui/ibusCandidatePopup.js b/js/ui/ibusCandidatePopup.js index b9d209261..9f23f578c 100644 --- a/js/ui/ibusCandidatePopup.js +++ b/js/ui/ibusCandidatePopup.js @@ -126,6 +126,9 @@ Signals.addSignalMethods(CandidateArea.prototype); var CandidatePopup = class CandidatePopup { constructor() { + this._dummyCursor = new St.Widget({ opacity: 0 }); + Main.layoutManager.uiGroup.add_actor(this._dummyCursor); + this._boxPointer = new BoxPointer.BoxPointer(St.Side.TOP); this._boxPointer.visible = false; this._boxPointer.style_class = 'candidate-popup-boxpointer'; @@ -272,9 +275,11 @@ var CandidatePopup = class CandidatePopup { } _setDummyCursorGeometry(x, y, w, h) { - Main.layoutManager.setDummyCursorGeometry(x, y, w, h); + this._dummyCursor.set_position(Math.round(x), Math.round(y)); + this._dummyCursor.set_size(Math.round(w), Math.round(h)); + if (this._boxPointer.visible) - this._boxPointer.setPosition(Main.layoutManager.dummyCursor, 0); + this._boxPointer.setPosition(this._dummyCursor, 0); } _updateVisibility() { @@ -284,7 +289,7 @@ var CandidatePopup = class CandidatePopup { this._candidateArea.actor.visible)); if (isVisible) { - this._boxPointer.setPosition(Main.layoutManager.dummyCursor, 0); + this._boxPointer.setPosition(this._dummyCursor, 0); this._boxPointer.open(BoxPointer.PopupAnimation.NONE); this._boxPointer.raise_top(); } else {