diff --git a/js/ui/panelMenu.js b/js/ui/panelMenu.js index 863e0d7ed..29acd29b4 100644 --- a/js/ui/panelMenu.js +++ b/js/ui/panelMenu.js @@ -101,7 +101,6 @@ const Button = new Lang.Class({ accessible_role: Atk.Role.MENU }); this.actor.connect('event', Lang.bind(this, this._onEvent)); - this.actor.connect('key-press-event', Lang.bind(this, this._onSourceKeyPress)); this.actor.connect('notify::visible', Lang.bind(this, this._onVisibilityChanged)); if (dontCreateMenu) @@ -140,26 +139,6 @@ const Button = new Lang.Class({ return Clutter.EVENT_PROPAGATE; }, - _onSourceKeyPress: function(actor, event) { - if (!this.menu) - return Clutter.EVENT_PROPAGATE; - - let symbol = event.get_key_symbol(); - if (symbol == Clutter.KEY_space || symbol == Clutter.KEY_Return) { - this.menu.toggle(); - return Clutter.EVENT_STOP; - } else if (symbol == Clutter.KEY_Escape && this.menu.isOpen) { - this.menu.close(); - return Clutter.EVENT_STOP; - } else if (symbol == Clutter.KEY_Down) { - if (!this.menu.isOpen) - this.menu.toggle(); - this.menu.actor.navigate_focus(this.actor, Gtk.DirectionType.DOWN, false); - return Clutter.EVENT_STOP; - } else - return Clutter.EVENT_PROPAGATE; - }, - _onVisibilityChanged: function() { if (!this.menu) return; diff --git a/js/ui/popupMenu.js b/js/ui/popupMenu.js index 0e9e0c497..3d41b73f4 100644 --- a/js/ui/popupMenu.js +++ b/js/ui/popupMenu.js @@ -731,6 +731,10 @@ const PopupMenu = new Lang.Class({ global.focus_manager.add_group(this.actor); this.actor.reactive = true; + if (this.sourceActor) + this._keyPressId = this.sourceActor.connect('key-press-event', + Lang.bind(this, this._onKeyPress)); + this._openedSubMenu = null; }, @@ -741,6 +745,24 @@ const PopupMenu = new Lang.Class({ this._openedSubMenu = submenu; }, + _onKeyPress: function(actor, event) { + let symbol = event.get_key_symbol(); + if (symbol == Clutter.KEY_space || symbol == Clutter.KEY_Return) { + this.toggle(); + return Clutter.EVENT_STOP; + } else if (symbol == Clutter.KEY_Escape && this.isOpen) { + this.close(); + return Clutter.EVENT_STOP; + } else if (symbol == Clutter.KEY_Down) { + if (!this.isOpen) + this.toggle(); + this.actor.navigate_focus(actor, Gtk.DirectionType.DOWN, false); + return Clutter.EVENT_STOP; + } else + return Clutter.EVENT_PROPAGATE; + }, + + setArrowOrigin: function(origin) { this._boxPointer.setArrowOrigin(origin); }, @@ -781,6 +803,12 @@ const PopupMenu = new Lang.Class({ this.isOpen = false; this.emit('open-state-changed', false); + }, + + destroy: function() { + if (this._keyPressId) + this.sourceActor.disconnect(this._keyPressId); + this.parent(); } });