[gnome-shell] [panel] Port user status menu to panel menu
- From: Colin Walters <walters src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-shell] [panel] Port user status menu to panel menu
- Date: Tue, 11 May 2010 18:13:18 +0000 (UTC)
commit 27bcce0888ffae12e7e679de1e78f4f9641efad1
Author: Colin Walters <walters verbum org>
Date: Mon May 10 09:46:54 2010 -0400
[panel] Port user status menu to panel menu
https://bugzilla.gnome.org/show_bug.cgi?id=613804
data/theme/gnome-shell.css | 2 +-
js/ui/panel.js | 26 ++------
js/ui/statusMenu.js | 143 ++++++++++---------------------------------
3 files changed, 42 insertions(+), 129 deletions(-)
---
diff --git a/data/theme/gnome-shell.css b/data/theme/gnome-shell.css
index 83d8465..00c031f 100644
--- a/data/theme/gnome-shell.css
+++ b/data/theme/gnome-shell.css
@@ -186,7 +186,7 @@ StTooltip {
border-radius-topright: 0px;
}
-#statusMenu {
+#panelStatusMenu {
spacing: 4px;
}
diff --git a/js/ui/panel.js b/js/ui/panel.js
index e4e72e1..b046c22 100644
--- a/js/ui/panel.js
+++ b/js/ui/panel.js
@@ -9,13 +9,13 @@ const Shell = imports.gi.Shell;
const St = imports.gi.St;
const Tweener = imports.ui.tweener;
const Signals = imports.signals;
+const DBus = imports.dbus;
const Gettext = imports.gettext.domain('gnome-shell');
const _ = Gettext.gettext;
const AppDisplay = imports.ui.appDisplay;
const Calendar = imports.ui.calendar;
const Main = imports.ui.main;
-const StatusMenu = imports.ui.statusMenu;
const BoxPointer = imports.ui.boxpointer;
const PANEL_HEIGHT = 26;
@@ -794,24 +794,12 @@ Panel.prototype = {
}));
this._traymanager.manage_stage(global.stage);
- let statusmenu = this._statusmenu = new StatusMenu.StatusMenu();
- let statusbutton = new St.Clickable({ name: 'panelStatus',
- style_class: 'panel-button',
- reactive: true,
- y_fill: true });
- statusbutton.set_child(statusmenu.actor);
- statusbutton.connect('clicked', function (b, event) {
- statusmenu.toggle(event);
- // The statusmenu might not pop up if it couldn't get a pointer grab
- if (statusmenu.isActive())
- statusbutton.active = true;
- return true;
- });
- this._rightBox.add(statusbutton);
- // We get a deactivated event when the popup disappears
- this._statusmenu.connect('deactivated', function (sm) {
- statusbutton.active = false;
- });
+ // We need to do this here to avoid a circular import with
+ // prototype dependencies.
+ let StatusMenu = imports.ui.statusMenu;
+ this._statusmenu = new StatusMenu.StatusMenuButton();
+ this._addMenu(this._statusmenu);
+ this._rightBox.add(this._statusmenu.actor);
// TODO: decide what to do with the rest of the panel in the Overview mode (make it fade-out, become non-reactive, etc.)
// We get into the Overview mode on button-press-event as opposed to button-release-event because eventually we'll probably
diff --git a/js/ui/statusMenu.js b/js/ui/statusMenu.js
index ed350c9..70130d3 100644
--- a/js/ui/statusMenu.js
+++ b/js/ui/statusMenu.js
@@ -2,11 +2,9 @@
const Gdm = imports.gi.Gdm;
const GLib = imports.gi.GLib;
-const Gtk = imports.gi.Gtk;
const Lang = imports.lang;
const Shell = imports.gi.Shell;
const St = imports.gi.St;
-const Signals = imports.signals;
const Gettext = imports.gettext.domain('gnome-shell');
const _ = Gettext.gettext;
@@ -18,21 +16,26 @@ const Panel = imports.ui.panel;
// Copyright (C) 2004-2005 James M. Cape <jcape ignore-your tv>.
// Copyright (C) 2008,2009 Red Hat, Inc.
-function StatusMenu() {
+function StatusMenuButton() {
this._init();
}
-StatusMenu.prototype = {
+StatusMenuButton.prototype = {
+ __proto__: Panel.PanelMenuButton.prototype,
+
_init: function() {
+ Panel.PanelMenuButton.prototype._init.call(this, St.Align.START);
+ let box = new St.BoxLayout({ name: 'panelStatusMenu' });
+ this.actor.set_child(box);
+
this._gdm = Gdm.UserManager.ref_default();
this._user = this._gdm.get_user(GLib.get_user_name());
this._presence = new GnomeSession.Presence();
- this.actor = new St.BoxLayout({ name: 'statusMenu' });
this.actor.connect('destroy', Lang.bind(this, this._onDestroy));
this._iconBox = new St.Bin();
- this.actor.add(this._iconBox, { y_align: St.Align.MIDDLE, y_fill: false });
+ box.add(this._iconBox, { y_align: St.Align.MIDDLE, y_fill: false });
let textureCache = St.TextureCache.get_default();
// FIXME: these icons are all wrong (likewise in createSubMenu)
@@ -45,7 +48,7 @@ StatusMenu.prototype = {
this._presence.getStatus(Lang.bind(this, this._updatePresenceIcon));
this._name = new St.Label({ text: this._user.get_real_name() });
- this.actor.add(this._name, { y_align: St.Align.MIDDLE, y_fill: false });
+ box.add(this._name, { y_align: St.Align.MIDDLE, y_fill: false });
this._userNameChangedId = this._user.connect('notify::display-name', Lang.bind(this, this._updateUserName));
this._createSubMenu();
@@ -65,9 +68,9 @@ StatusMenu.prototype = {
_updateSwitchUser: function() {
let users = this._gdm.list_users();
if (users.length > 1)
- this._loginScreenItem.show();
+ this._loginScreenItem.actor.show();
else
- this._loginScreenItem.hide();
+ this._loginScreenItem.actor.hide();
},
_updatePresenceIcon: function(presence, status) {
@@ -81,80 +84,51 @@ StatusMenu.prototype = {
this._iconBox.child = this._idleIcon;
},
- // The menu
-
- _createImageMenuItem: function(label, iconName, forceIcon) {
- let image = new Gtk.Image();
- let item = new Gtk.ImageMenuItem({ label: label,
- image: image,
- always_show_image: forceIcon == true });
- item.connect('style-set', Lang.bind(this,
- function() {
- image.set_from_icon_name(iconName, Gtk.IconSize.MENU);
- }));
-
- return item;
- },
-
_createSubMenu: function() {
- this._menu = new Gtk.Menu();
- this._menu.connect('deactivate', Lang.bind(this, function() { this.emit('deactivated'); }));
-
let item;
- item = this._createImageMenuItem(_("Available"), 'gtk-yes', true);
+ item = new Panel.PanelImageMenuItem(_("Available"), 'gtk-yes');
item.connect('activate', Lang.bind(this, this._setPresenceStatus, GnomeSession.PresenceStatus.AVAILABLE));
- this._menu.append(item);
- item.show();
+ this.menu.addMenuItem(item);
- item = this._createImageMenuItem(_("Busy"), 'gtk-no', true);
+ item = new Panel.PanelImageMenuItem(_("Busy"), 'gtk-no');
item.connect('activate', Lang.bind(this, this._setPresenceStatus, GnomeSession.PresenceStatus.BUSY));
- this._menu.append(item);
- item.show();
+ this.menu.addMenuItem(item);
- item = this._createImageMenuItem(_("Invisible"), 'gtk-close', true);
+ item = new Panel.PanelImageMenuItem(_("Invisible"), 'gtk-close');
item.connect('activate', Lang.bind(this, this._setPresenceStatus, GnomeSession.PresenceStatus.INVISIBLE));
- this._menu.append(item);
- item.show();
+ this.menu.addMenuItem(item);
- item = new Gtk.SeparatorMenuItem();
- this._menu.append(item);
- item.show();
+ item = new Panel.PanelSeparatorMenuItem();
+ this.menu.addMenuItem(item);
- item = this._createImageMenuItem(_("Account Information..."), 'user-info');
+ item = new Panel.PanelImageMenuItem(_("Account Information..."), 'user-info');
item.connect('activate', Lang.bind(this, this._onAccountInformationActivate));
- this._menu.append(item);
- item.show();
+ this.menu.addMenuItem(item);
- item = this._createImageMenuItem(_("System Preferences..."), 'preferences-desktop');
+ item = new Panel.PanelImageMenuItem(_("System Preferences..."), 'preferences-desktop');
item.connect('activate', Lang.bind(this, this._onPreferencesActivate));
- this._menu.append(item);
- item.show();
+ this.menu.addMenuItem(item);
- item = new Gtk.SeparatorMenuItem();
- this._menu.append(item);
- item.show();
+ item = new Panel.PanelSeparatorMenuItem();
+ this.menu.addMenuItem(item);
- item = this._createImageMenuItem(_("Lock Screen"), 'system-lock-screen');
+ item = new Panel.PanelImageMenuItem(_("Lock Screen"), 'system-lock-screen');
item.connect('activate', Lang.bind(this, this._onLockScreenActivate));
- this._menu.append(item);
- item.show();
+ this.menu.addMenuItem(item);
- item = this._createImageMenuItem(_("Switch User"), 'system-users');
+ item = new Panel.PanelImageMenuItem(_("Switch User"), 'system-users');
item.connect('activate', Lang.bind(this, this._onLoginScreenActivate));
- this._menu.append(item);
- item.show();
+ this.menu.addMenuItem(item);
this._loginScreenItem = item;
- item = this._createImageMenuItem(_("Log Out..."), 'system-log-out');
+ item = new Panel.PanelImageMenuItem(_("Log Out..."), 'system-log-out');
item.connect('activate', Lang.bind(this, this._onQuitSessionActivate));
- this._menu.append(item);
- item.show();
+ this.menu.addMenuItem(item);
- item = this._createImageMenuItem(_("Shut Down..."), 'system-shutdown');
+ item = new Panel.PanelImageMenuItem(_("Shut Down..."), 'system-shutdown');
item.connect('activate', Lang.bind(this, this._onShutDownActivate));
- this._menu.append(item);
- item.show();
+ this.menu.addMenuItem(item);
},
_setPresenceStatus: function(item, status) {
@@ -192,54 +166,5 @@ StatusMenu.prototype = {
// on failure
let p = new Shell.Process({'args' : args});
p.run();
- },
-
- // shell_status_menu_toggle:
- // @event: event causing the toggle
- //
- // If the menu is not currently up, pops it up. Otherwise, hides it.
- // Popping up may fail if another grab is already active; check with
- // isActive().
- toggle: function(event) {
- if (this._menu.visible)
- this._menu.popdown();
- else {
- // We don't want to overgrab a Mutter grab with the grab
- // that GTK+ uses on menus.
- if (global.display_is_grabbed())
- return;
-
- let [menuWidth, menuHeight] = this._menu.get_size_request ();
-
- let panel;
- for (panel = this.actor; panel; panel = panel.get_parent()) {
- if (panel._delegate instanceof Panel.Panel)
- break;
- }
-
- let [panelX, panelY] = panel.get_transformed_position();
- let [panelWidth, panelHeight] = panel.get_transformed_size();
-
- let menuX;
- if (St.Widget.get_default_direction() == St.TextDirection.RTL) {
- menuX = panelX;
- } else {
- menuX = Math.round(panelX + panelWidth - menuWidth);
- }
- let menuY = Math.round(panelY + panelHeight);
-
- Shell.popup_menu(this._menu, event.get_button(), event.get_time(),
- menuX, menuY);
- }
- },
-
- // isActive:
- //
- // Gets whether the menu is currently popped up
- //
- // Return value: %true if the menu is currently popped up
- isActive: function() {
- return this._menu.visible;
}
};
-Signals.addSignalMethods(StatusMenu.prototype);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]