[gnome-shell] windowManager: Add a switcher for mutter's switch-monitor keybinding



commit b35dfc8914e5152ed4b85ba286312dd3afc6cacb
Author: Rui Matos <tiagomatos gmail com>
Date:   Thu Jun 8 16:49:20 2017 +0200

    windowManager: Add a switcher for mutter's switch-monitor keybinding
    
    https://bugzilla.gnome.org/show_bug.cgi?id=783550

 js/js-resources.gresource.xml |    1 +
 js/ui/switchMonitor.js        |  101 +++++++++++++++++++++++++++++++++++++++++
 js/ui/windowManager.js        |    8 +++
 po/POTFILES.in                |    1 +
 4 files changed, 111 insertions(+), 0 deletions(-)
---
diff --git a/js/js-resources.gresource.xml b/js/js-resources.gresource.xml
index 79a200e..c9ffb4d 100644
--- a/js/js-resources.gresource.xml
+++ b/js/js-resources.gresource.xml
@@ -95,6 +95,7 @@
     <file>ui/shellMountOperation.js</file>
     <file>ui/slider.js</file>
     <file>ui/switcherPopup.js</file>
+    <file>ui/switchMonitor.js</file>
     <file>ui/tweener.js</file>
     <file>ui/unlockDialog.js</file>
     <file>ui/userWidget.js</file>
diff --git a/js/ui/switchMonitor.js b/js/ui/switchMonitor.js
new file mode 100644
index 0000000..0a05d43
--- /dev/null
+++ b/js/ui/switchMonitor.js
@@ -0,0 +1,101 @@
+// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
+
+const Clutter = imports.gi.Clutter;
+const Lang = imports.lang;
+const Meta = imports.gi.Meta;
+const St = imports.gi.St;
+
+const SwitcherPopup = imports.ui.switcherPopup;
+
+var APP_ICON_SIZE = 96;
+
+var SwitchMonitorPopup = new Lang.Class({
+    Name: 'SwitchMonitorPopup',
+    Extends: SwitcherPopup.SwitcherPopup,
+
+    _init: function() {
+        let items = [{ icon:  'view-mirror-symbolic',
+                       /* Translators: this is for display mirroring i.e. cloning.
+                        * Try to keep it under around 15 characters.
+                        */
+                       label: _('Mirror') },
+                     { icon:  'video-joined-displays-symbolic',
+                       /* Translators: this is for the desktop spanning displays.
+                        * Try to keep it under around 15 characters.
+                        */
+                       label: _('Join Displays') },
+                     { icon:  'video-single-display-symbolic',
+                       /* Translators: this is for using only an external display.
+                        * Try to keep it under around 15 characters.
+                        */
+                       label: _('External Only') },
+                     { icon:  'computer-symbolic',
+                       /* Translators: this is for using only the laptop display.
+                        * Try to keep it under around 15 characters.
+                        */
+                       label: _('Built-in Only') }];
+
+        this.parent(items);
+
+        this._switcherList = new SwitchMonitorSwitcher(items);
+    },
+
+    show: function(backward, binding, mask) {
+        if (!Meta.MonitorManager.get().can_switch_config())
+            return false;
+
+        return this.parent(backward, binding, mask);
+    },
+
+    _initialSelection: function() {
+        let currentConfig = Meta.MonitorManager.get().get_switch_config();
+        currentConfig %= Meta.MonitorSwitchConfigType.UNKNOWN;
+        this._select(currentConfig);
+    },
+
+    _keyPressHandler: function(keysym, action) {
+        if (action == Meta.KeyBindingAction.SWITCH_MONITOR)
+            this._select(this._next());
+        else if (keysym == Clutter.Left)
+            this._select(this._previous());
+        else if (keysym == Clutter.Right)
+            this._select(this._next());
+        else
+            return Clutter.EVENT_PROPAGATE;
+
+        return Clutter.EVENT_STOP;
+    },
+
+    _finish : function() {
+        this.parent();
+
+        Meta.MonitorManager.get().switch_config(this._selectedIndex);
+    },
+});
+
+var SwitchMonitorSwitcher = new Lang.Class({
+    Name: 'SwitchMonitorSwitcher',
+    Extends: SwitcherPopup.SwitcherList,
+
+    _init: function(items) {
+        this.parent(true);
+
+        for (let i = 0; i < items.length; i++)
+            this._addIcon(items[i]);
+    },
+
+    _addIcon: function(item) {
+        let box = new St.BoxLayout({ style_class: 'alt-tab-app',
+                                     vertical: true });
+
+        let icon = new St.Icon({ icon_name: item.icon,
+                                 icon_size: APP_ICON_SIZE });
+        box.add(icon, { x_fill: false, y_fill: false } );
+
+        let text = new St.Label({ text: item.label });
+        box.add(text, { x_fill: false });
+
+        this.addItem(box, text);
+    }
+});
+
diff --git a/js/ui/windowManager.js b/js/ui/windowManager.js
index 04599b7..16e55fb 100644
--- a/js/ui/windowManager.js
+++ b/js/ui/windowManager.js
@@ -22,6 +22,7 @@ const WindowMenu = imports.ui.windowMenu;
 const PadOsd = imports.ui.padOsd;
 const EdgeDragAction = imports.ui.edgeDragAction;
 const CloseDialog = imports.ui.closeDialog;
+const SwitchMonitor = imports.ui.switchMonitor;
 
 const SHELL_KEYBINDINGS_SCHEMA = 'org.gnome.shell.keybindings';
 var MINIMIZE_WINDOW_ANIMATION_TIME = 0.2;
@@ -898,6 +899,10 @@ var WindowManager = new Lang.Class({
                                         Shell.ActionMode.UNLOCK_SCREEN |
                                         Shell.ActionMode.LOGIN_SCREEN,
                                         Lang.bind(this, this._startA11ySwitcher));
+        this.setCustomKeybindingHandler('switch-monitor',
+                                        Shell.ActionMode.NORMAL |
+                                        Shell.ActionMode.OVERVIEW,
+                                        Lang.bind(this, this._startSwitcher));
 
         this.addKeybinding('pause-resume-tweens',
                            new Gio.Settings({ schema_id: SHELL_KEYBINDINGS_SCHEMA }),
@@ -1838,6 +1843,9 @@ var WindowManager = new Lang.Class({
             case 'cycle-group-backward':
                 constructor = AltTab.GroupCyclerPopup;
                 break;
+            case 'switch-monitor':
+                constructor = SwitchMonitor.SwitchMonitorPopup;
+                break;
         }
 
         if (!constructor)
diff --git a/po/POTFILES.in b/po/POTFILES.in
index d564cb0..fe31315 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -59,6 +59,7 @@ js/ui/status/power.js
 js/ui/status/rfkill.js
 js/ui/status/system.js
 js/ui/status/volume.js
+js/ui/switchMonitor.js
 js/ui/unlockDialog.js
 js/ui/viewSelector.js
 js/ui/windowAttentionHandler.js


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