[gnome-shell] backgroundMenu: Add a context menu on the background actor



commit fae838b05424078fa1ad8158c82c1676d1a25b1d
Author: Jasper St. Pierre <jstpierre mecheye net>
Date:   Fri Dec 21 07:55:00 2012 -0500

    backgroundMenu: Add a context menu on the background actor
    
    Allow users to change their wallpaper and launch System Settings
    from it.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=681540

 data/theme/gnome-shell.css |    6 ++++
 js/Makefile.am             |    1 +
 js/ui/backgroundMenu.js    |   57 ++++++++++++++++++++++++++++++++++++++++++++
 js/ui/main.js              |    3 ++
 4 files changed, 67 insertions(+), 0 deletions(-)
---
diff --git a/data/theme/gnome-shell.css b/data/theme/gnome-shell.css
index 0e174f2..c06ed56 100644
--- a/data/theme/gnome-shell.css
+++ b/data/theme/gnome-shell.css
@@ -2481,3 +2481,9 @@ StScrollBar StButton#vhandle:active {
    width: 96px;
    height: 96px;
 }
+
+/* Background menu */
+
+.background-menu {
+    -boxpointer-gap: 4px;
+}
diff --git a/js/Makefile.am b/js/Makefile.am
index df389b8..b6fcea7 100644
--- a/js/Makefile.am
+++ b/js/Makefile.am
@@ -39,6 +39,7 @@ nobase_dist_js_DATA =         \
        ui/altTab.js            \
        ui/appDisplay.js        \
        ui/appFavorites.js      \
+       ui/backgroundMenu.js    \
        ui/boxpointer.js        \
        ui/calendar.js          \
        ui/checkBox.js          \
diff --git a/js/ui/backgroundMenu.js b/js/ui/backgroundMenu.js
new file mode 100644
index 0000000..138af05
--- /dev/null
+++ b/js/ui/backgroundMenu.js
@@ -0,0 +1,57 @@
+// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
+
+const Clutter = imports.gi.Clutter;
+const Lang = imports.lang;
+const St = imports.gi.St;
+const Shell = imports.gi.Shell;
+
+const BoxPointer = imports.ui.boxpointer;
+const Main = imports.ui.main;
+const PopupMenu = imports.ui.popupMenu;
+
+const BackgroundMenu = new Lang.Class({
+    Name: 'BackgroundMenu',
+    Extends: PopupMenu.PopupMenu,
+
+    _init: function(source) {
+        this.parent(source, 0, St.Side.TOP);
+
+        this.addSettingsAction(_("Change Wallpaper..."), 'gnome-background-panel.desktop');
+        this.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
+        this.addSettingsAction(_("System Settings"), 'gnome-control-center.desktop');
+
+        this.actor.add_style_class_name('background-menu');
+
+        Main.uiGroup.add_actor(this.actor);
+        this.actor.hide();
+    }
+});
+
+function addBackgroundMenu(actor) {
+    let cursor = new St.Bin({ opacity: 0 });
+    Main.uiGroup.add_actor(cursor);
+
+    actor._backgroundMenu = new BackgroundMenu(cursor);
+    actor._backgroundManager = new PopupMenu.PopupMenuManager({ actor: actor });
+    actor._backgroundManager.addMenu(actor._backgroundMenu);
+
+    function openMenu() {
+        let [x, y] = global.get_pointer();
+        cursor.set_position(x, y);
+        actor._backgroundMenu.open(BoxPointer.PopupAnimation.FULL);
+    }
+
+    let clickAction = new Clutter.ClickAction();
+    clickAction.connect('long-press', function(action, actor, state) {
+        if (state == Clutter.LongPressState.QUERY)
+            return action.get_button() == 1 && !actor._backgroundMenu.isOpen;
+        if (state == Clutter.LongPressState.ACTIVATE)
+            openMenu();
+        return true;
+    });
+    clickAction.connect('clicked', function(action) {
+        if (action.get_button() == 3)
+            openMenu();
+    });
+    actor.add_action(clickAction);
+}
diff --git a/js/ui/main.js b/js/ui/main.js
index ae0754a..68cd449 100644
--- a/js/ui/main.js
+++ b/js/ui/main.js
@@ -10,6 +10,7 @@ const Meta = imports.gi.Meta;
 const Shell = imports.gi.Shell;
 const St = imports.gi.St;
 
+const BackgroundMenu = imports.ui.backgroundMenu;
 const Components = imports.ui.components;
 const CtrlAltTab = imports.ui.ctrlAltTab;
 const EndSessionDialog = imports.ui.endSessionDialog;
@@ -141,6 +142,8 @@ function start() {
     windowAttentionHandler = new WindowAttentionHandler.WindowAttentionHandler();
     componentManager = new Components.ComponentManager();
 
+    BackgroundMenu.addBackgroundMenu(global.background_actor);
+
     layoutManager.init();
     overview.init();
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]