popupMenu: Add a simple way to get the toplevel for a submenu / section

This will be used to avoid some nasty signal propagation when wanting to
rework how sections / submenus work.

https://bugzilla.gnome.org/show_bug.cgi?id=702539
This commit is contained in:
Jasper St. Pierre 2013-07-08 15:19:34 -04:00
parent 78b1ba56ce
commit c1e2d66abd

View File

@ -672,6 +672,7 @@ const PopupMenuBase = new Lang.Class({
_init: function(sourceActor, styleClass) { _init: function(sourceActor, styleClass) {
this.sourceActor = sourceActor; this.sourceActor = sourceActor;
this._parent = null;
if (styleClass !== undefined) { if (styleClass !== undefined) {
this.box = new St.BoxLayout({ style_class: styleClass, this.box = new St.BoxLayout({ style_class: styleClass,
@ -694,6 +695,13 @@ const PopupMenuBase = new Lang.Class({
this._sessionUpdatedId = Main.sessionMode.connect('updated', Lang.bind(this, this._sessionUpdated)); this._sessionUpdatedId = Main.sessionMode.connect('updated', Lang.bind(this, this._sessionUpdated));
}, },
_getTopMenu: function() {
if (this._parent)
return this._parent._getTopMenu();
else
return this;
},
_sessionUpdated: function() { _sessionUpdated: function() {
this._setSettingsVisibility(Main.sessionMode.allowSettings); this._setSettingsVisibility(Main.sessionMode.allowSettings);
}, },
@ -903,6 +911,8 @@ const PopupMenuBase = new Lang.Class({
else else
throw TypeError("Invalid argument to PopupMenuBase.addMenuItem()"); throw TypeError("Invalid argument to PopupMenuBase.addMenuItem()");
menuItem._parent = this;
this.length++; this.length++;
}, },
@ -1154,18 +1164,6 @@ const PopupSubMenu = new Lang.Class({
this.actor.hide(); this.actor.hide();
}, },
_getTopMenu: function() {
let actor = this.actor.get_parent();
while (actor) {
if (actor._delegate && actor._delegate instanceof PopupMenu)
return actor._delegate;
actor = actor.get_parent();
}
return null;
},
_needsScrollbar: function() { _needsScrollbar: function() {
let topMenu = this._getTopMenu(); let topMenu = this._getTopMenu();
let [topMinHeight, topNaturalHeight] = topMenu.actor.get_preferred_height(-1); let [topMinHeight, topNaturalHeight] = topMenu.actor.get_preferred_height(-1);