diff --git a/js/ui/popupMenu.js b/js/ui/popupMenu.js index b2a3c4a48..f06bee65f 100644 --- a/js/ui/popupMenu.js +++ b/js/ui/popupMenu.js @@ -1276,16 +1276,6 @@ export class PopupMenuManager { constructor(owner, grabParams) { this._grabParams = Params.parse(grabParams, {actionMode: Shell.ActionMode.POPUP}); - global.stage.connect('notify::key-focus', () => { - if (!this.activeMenu) - return; - - let actor = global.stage.get_key_focus(); - let newMenu = this._findMenuForSource(actor); - - if (newMenu) - this._changeMenu(newMenu); - }); this._menus = []; } @@ -1309,6 +1299,11 @@ export class PopupMenuManager { if (menu === this.activeMenu) { Main.popModal(this._grab); this._grab = null; + + if (this._keyFocusId) { + global.stage.disconnect(this._keyFocusId); + delete this._keyFocusId; + } } const position = this._menus.indexOf(menu); @@ -1336,10 +1331,29 @@ export class PopupMenuManager { oldMenu?.close(BoxPointer.PopupAnimation.FADE); if (oldGrab) Main.popModal(oldGrab); + + if (!this._keyFocusId) { + this._keyFocusId = + global.stage.connect('notify::key-focus', () => { + if (!this.activeMenu) + return; + + let actor = global.stage.get_key_focus(); + let newMenu = this._findMenuForSource(actor); + + if (newMenu) + this._changeMenu(newMenu); + }); + } } else if (this.activeMenu === menu) { this.activeMenu = null; Main.popModal(this._grab); this._grab = null; + + if (this._keyFocusId) { + global.stage.disconnect(this._keyFocusId); + delete this._keyFocusId; + } } }