panel: remove legacyBox, mix legacy icons in with regular

Legacy trayicons are mostly gone, so remove some of the special-casing
for them to simplify things.

Also, fix panel.addToStatusArea() to interpret its "position" relative
to tray_icon_order, not relative to the existing contents of
statusBox, so that the order that extension icons appear in does not
depend on the order they are loaded in.

https://bugzilla.gnome.org/show_bug.cgi?id=651299
This commit is contained in:
Dan Winship 2011-08-25 11:46:25 -04:00
parent 0febcbfa2a
commit 6d89d0b02a
2 changed files with 27 additions and 47 deletions

View File

@ -418,20 +418,6 @@ StTooltip StLabel {
spacing: .4em; spacing: .4em;
} }
#legacyTray {
spacing: 14px;
padding-left: 14px;
}
#legacyTray:rtl {
padding-left: 0px;
padding-right: 14px;
}
#legacyTray:compact {
spacing: 8px;
}
.system-status-icon { .system-status-icon {
icon-size: 1.14em; icon-size: 1.14em;
} }

View File

@ -960,14 +960,7 @@ Panel.prototype = {
/* right */ /* right */
// System status applets live in statusBox, while legacy tray icons
// live in trayBox
// The trayBox is hidden when there are no tray icons.
this._trayBox = new St.BoxLayout({ name: 'legacyTray' });
this._statusBox = new St.BoxLayout({ name: 'statusTray' }); this._statusBox = new St.BoxLayout({ name: 'statusTray' });
this._trayBox.hide();
this._rightBox.add(this._trayBox);
this._rightBox.add(this._statusBox); this._rightBox.add(this._statusBox);
if (global.session_type == Shell.SessionType.USER) { if (global.session_type == Shell.SessionType.USER) {
@ -1077,6 +1070,24 @@ Panel.prototype = {
this._menus.addMenu(this._userMenu.menu); this._menus.addMenu(this._userMenu.menu);
}, },
_insertStatusItem: function(actor, position) {
let children = this._statusBox.get_children();
let i;
for (i = children.length - 1; i >= 0; i--) {
let rolePosition = children[i]._rolePosition;
if (position > rolePosition) {
this._statusBox.insert_actor(actor, i + 1);
break;
}
}
if (i == -1) {
// If we didn't find a position, we must be first
this._statusBox.insert_actor(actor, 0);
}
actor._rolePosition = position;
},
addToStatusArea: function(role, indicator, position) { addToStatusArea: function(role, indicator, position) {
if (this._statusArea[role]) if (this._statusArea[role])
throw new Error('Extension point conflict: there is already a status indicator for role ' + role); throw new Error('Extension point conflict: there is already a status indicator for role ' + role);
@ -1086,8 +1097,7 @@ Panel.prototype = {
if (!position) if (!position)
position = 0; position = 0;
this._insertStatusItem(indicator.actor, position);
this._statusBox.insert_actor(indicator.actor, position);
this._menus.addMenu(indicator.menu); this._menus.addMenu(indicator.menu);
this._statusArea[role] = indicator; this._statusArea[role] = indicator;
@ -1100,39 +1110,23 @@ Panel.prototype = {
}, },
_onTrayIconAdded: function(o, icon, role) { _onTrayIconAdded: function(o, icon, role) {
icon.height = PANEL_ICON_SIZE;
if (this._tray_icon_shell_implementation[role]) { if (this._tray_icon_shell_implementation[role]) {
// This icon is legacy, and replaced by a Shell version // This icon is legacy, and replaced by a Shell version
// Hide it // Hide it
return; return;
} }
// Figure out the index in our well-known order for this icon
let position = this._tray_icon_order.indexOf(role);
icon._rolePosition = position;
let children = this._trayBox.get_children();
let i;
// Walk children backwards, until we find one that isn't
// well-known, or one where we should follow
for (i = children.length - 1; i >= 0; i--) {
let rolePosition = children[i]._rolePosition;
if (!rolePosition || position > rolePosition) {
this._trayBox.insert_actor(icon, i + 1);
break;
}
}
if (i == -1) {
// If we didn't find a position, we must be first
this._trayBox.insert_actor(icon, 0);
}
// Make sure the trayBox is shown. icon.height = PANEL_ICON_SIZE;
this._trayBox.show(); let bin = new St.Bin({ style_class: 'panel-button' });
bin.child = icon;
this._insertStatusItem(bin, this._tray_icon_order.indexOf(role));
}, },
_onTrayIconRemoved: function(o, icon) { _onTrayIconRemoved: function(o, icon) {
if (icon.get_parent() != null) let bin = icon.get_parent();
this._trayBox.remove_actor(icon); if (bin && bin instanceof St.Bin)
bin.destroy();
}, },
}; };