panel: Set up 'open-state-changed' handler on menu changes

Commit 08690d658f generalized the banner-blocking behavior of the
dateMenu to all menus that would obscure the banner. However setting
up the 'open-state-changed' handler only when an indicator is added
does not work for indicators that change their entire menu (like the
app menu) - we currently end up with menus with no connected signal
handler, and throw an error when trying to disconnect an invalid
signal ID.
To address this, add a new PanelButton::menu-set signal and use that
to set up the 'open-state-changed' handler.

https://bugzilla.gnome.org/show_bug.cgi?id=745910
This commit is contained in:
Florian Müllner 2015-04-28 11:05:58 +02:00
parent 8a8abf12f9
commit 1092f55b54
2 changed files with 22 additions and 18 deletions

View File

@ -1003,24 +1003,6 @@ const Panel = new Lang.Class({
if (parent)
parent.remove_actor(container);
if (indicator._openChangedId > 0)
indicator.menu.disconnect(indicator._openChangedId);
indicator._openChangedId = 0;
if (indicator.menu)
indicator._openChangedId = indicator.menu.connect('open-state-changed',
Lang.bind(this, function(menu, isOpen) {
let boxAlignment;
if (box == this._leftBox)
boxAlignment = Clutter.ActorAlign.START;
else if (box == this._centerBox)
boxAlignment = Clutter.ActorAlign.CENTER;
else if (box == this._rightBox)
boxAlignment = Clutter.ActorAlign.END;
if (boxAlignment == Main.messageTray.bannerAlignment)
Main.messageTray.bannerBlocked = isOpen;
}));
box.insert_child_at_index(container, position);
if (indicator.menu)
@ -1031,6 +1013,8 @@ const Panel = new Lang.Class({
emitter.disconnect(destroyId);
container.destroy();
}));
indicator.connect('menu-set', Lang.bind(this, this._onMenuSet));
this._onMenuSet(indicator);
},
addToStatusArea: function(role, indicator, position, box) {
@ -1062,5 +1046,24 @@ const Panel = new Lang.Class({
this.actor.remove_style_class_name(className);
this._rightCorner.actor.remove_style_class_name(className);
this._leftCorner.actor.remove_style_class_name(className);
},
_onMenuSet: function(indicator) {
if (!indicator.menu || indicator.menu._openChangedId > 0)
return;
indicator.menu._openChangedId = indicator.menu.connect('open-state-changed',
Lang.bind(this, function(menu, isOpen) {
let boxAlignment;
if (this._leftBox.contains(indicator.container))
boxAlignment = Clutter.ActorAlign.START;
else if (this._centerBox.contains(indicator.container))
boxAlignment = Clutter.ActorAlign.CENTER;
else if (this._rightBox.contains(indicator.container))
boxAlignment = Clutter.ActorAlign.END;
if (boxAlignment == Main.messageTray.bannerAlignment)
Main.messageTray.bannerBlocked = isOpen;
}));
}
});

View File

@ -128,6 +128,7 @@ const Button = new Lang.Class({
Main.uiGroup.add_actor(this.menu.actor);
this.menu.actor.hide();
}
this.emit('menu-set');
},
_onEvent: function(actor, event) {