From 74b372212f649984b79337c7118495be29cd4871 Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Wed, 23 Jan 2019 15:59:42 -0500 Subject: [PATCH] shellActionModes: disable POPUP keybindings in lock screen Certain keybindings should continue to work even when a popup menu is on screen. For instance, the keybinding for showing the app menu and the keyinding for showing the calendar are examples. This is achieved by putting in place a special "POPUP" action mode, whenever a popup menu is active. This mode replaces the (e.g., "NORMAL" or "OVERVIEW") action mode that was in place for as long as the popup menu is active. But those keybindings should not work when the user is at the unlock dialog (which uses an action mode of "UNLOCK"). Unfortunately, right now they do. This commit addresses the problem by using a compound action mode when a popup menu is open at the unlock dialog (the bitwise OR of POPUP and UNLOCK). Closes https://gitlab.gnome.org/GNOME/gnome-shell/issues/851 patch proved: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=921490 diff --git a/js/gdm/authPrompt.js b/js/gdm/authPrompt.js index a6a0374..ac441b1 100644 --- a/js/gdm/authPrompt.js +++ b/js/gdm/authPrompt.js @@ -11,6 +11,7 @@ const Animation = imports.ui.animation; const Batch = imports.gdm.batch; const GdmUtil = imports.gdm.util; const Params = imports.misc.params; +const Shell = imports.gi.Shell; const ShellEntry = imports.ui.shellEntry; const Tweener = imports.ui.tweener; const UserWidget = imports.ui.userWidget; @@ -99,7 +100,7 @@ var AuthPrompt = new Lang.Class({ x_align: St.Align.START }); this._entry = new St.Entry({ style_class: 'login-dialog-prompt-entry', can_focus: true }); - ShellEntry.addContextMenu(this._entry, { isPassword: true }); + ShellEntry.addContextMenu(this._entry, { isPassword: true, actionMode: Shell.ActionMode.NONE }); this.actor.add(this._entry, { expand: true, diff --git a/js/gdm/loginDialog.js b/js/gdm/loginDialog.js index 2f89140..1bf8d6f 100644 --- a/js/gdm/loginDialog.js +++ b/js/gdm/loginDialog.js @@ -342,7 +342,8 @@ var SessionMenuButton = new Lang.Class({ this._button.remove_style_pseudo_class('active'); }); - this._manager = new PopupMenu.PopupMenuManager({ actor: this._button }); + this._manager = new PopupMenu.PopupMenuManager({ actor: this._button }, + { actionMode: Shell.ActionMode.NONE }); this._manager.addMenu(this._menu); this._button.connect('clicked', () => { this._menu.toggle(); }); diff --git a/js/ui/shellEntry.js b/js/ui/shellEntry.js index 9db5136..09bb9bb 100644 --- a/js/ui/shellEntry.js +++ b/js/ui/shellEntry.js @@ -9,6 +9,7 @@ const BoxPointer = imports.ui.boxpointer; const Main = imports.ui.main; const Params = imports.misc.params; const PopupMenu = imports.ui.popupMenu; +const Shell = imports.gi.Shell; var EntryMenu = new Lang.Class({ Name: 'ShellEntryMenu', @@ -150,11 +151,12 @@ function addContextMenu(entry, params) { if (entry.menu) return; - params = Params.parse (params, { isPassword: false }); + params = Params.parse (params, { isPassword: false, actionMode: Shell.ActionMode.POPUP }); entry.menu = new EntryMenu(entry); entry.menu.isPassword = params.isPassword; - entry._menuManager = new PopupMenu.PopupMenuManager({ actor: entry }); + entry._menuManager = new PopupMenu.PopupMenuManager({ actor: entry }, + { actionMode: params.actionMode }); entry._menuManager.addMenu(entry.menu); // Add an event handler to both the entry and its clutter_text; the former