- Add patch gnome-shell-ScreenShield-become-modal-and-catch.patch to fix an issue where the screen would not return to the desktop properly when resuming from screen lock (bnc#801797, rh#878736, bgo#689106); patch taken from the upstream bug and rebased for version 3.6.2 (please forward to openSUSE:12.3 if acceptable). OBS-URL: https://build.opensuse.org/request/show/151117 OBS-URL: https://build.opensuse.org/package/show/GNOME:Factory/gnome-shell?expand=0&rev=140
96 lines
3.9 KiB
Diff
96 lines
3.9 KiB
Diff
From cdcebae636d80f53fc3fde02d1c026144042a6c5 Mon Sep 17 00:00:00 2001
|
|
From: Giovanni Campagna <gcampagna@src.gnome.org>
|
|
Date: Mon, 26 Nov 2012 20:18:57 +0100
|
|
Subject: [PATCH] ScreenShield: try harder to become modal, and catch failures
|
|
|
|
The screenshield was not checking the return value of pushModal(), meaning
|
|
that it believed it was fully locked when it was not. Later, calling
|
|
popModal() would fail, causing an exception and blocking the unlock.
|
|
Now we do nothing for user initiated actions, and fail with an explanatory
|
|
message at idle time.
|
|
|
|
https://bugzilla.gnome.org/show_bug.cgi?id=689106
|
|
|
|
Conflicts:
|
|
js/ui/screenShield.js
|
|
---
|
|
js/ui/screenShield.js | 43 +++++++++++++++++++++++++++++++++----------
|
|
1 file changed, 33 insertions(+), 10 deletions(-)
|
|
|
|
Index: gnome-shell-3.6.2/js/ui/screenShield.js
|
|
===================================================================
|
|
--- gnome-shell-3.6.2.orig/js/ui/screenShield.js
|
|
+++ gnome-shell-3.6.2/js/ui/screenShield.js
|
|
@@ -441,6 +441,21 @@ const ScreenShield = new Lang.Class({
|
|
this.idleMonitor = Shell.IdleMonitor.get();
|
|
},
|
|
|
|
+ _becomeModal: function() {
|
|
+ if (this._isModal)
|
|
+ return true;
|
|
+
|
|
+ this._isModal = Main.pushModal(this.actor, { keybindingMode: Main.KeybindingMode.LOCK_SCREEN });
|
|
+ if (this._isModal)
|
|
+ return true;
|
|
+
|
|
+ // We failed to get a pointer grab, it means that
|
|
+ // something else has it. Try with a keyboard grab only
|
|
+ this._isModal = Main.pushModal(this.actor, { options: Meta.ModalOptions.POINTER_ALREADY_GRABBED,
|
|
+ keybindingMode: Main.KeybindingMode.LOCK_SCREEN });
|
|
+ return this._isModal;
|
|
+ },
|
|
+
|
|
_onLockScreenKeyRelease: function(actor, event) {
|
|
let symbol = event.get_key_symbol();
|
|
|
|
@@ -558,9 +573,17 @@ const ScreenShield = new Lang.Class({
|
|
}
|
|
}
|
|
|
|
- if (!this._isModal) {
|
|
- Main.pushModal(this.actor);
|
|
- this._isModal = true;
|
|
+ if (!this._becomeModal()) {
|
|
+ // We could not become modal, so we can't activate the
|
|
+ // screenshield. The user is probably very upset at this
|
|
+ // point, but any application using global grabs is broken
|
|
+ // Just tell him to stop using this app
|
|
+ //
|
|
+ // XXX: another option is to kick the user into the gdm login
|
|
+ // screen, where we're not affected by grabs
|
|
+ Main.notifyError(_("Failed to activate screen lock"),
|
|
+ _("The activation of the screen lock was blocked by an application that captured the keyboard."));
|
|
+ return;
|
|
}
|
|
|
|
if (!this._isActive) {
|
|
@@ -598,9 +621,10 @@ const ScreenShield = new Lang.Class({
|
|
// Ensure that the stage window is mapped, before taking a grab
|
|
// otherwise X errors out
|
|
Meta.later_add(Meta.LaterType.BEFORE_REDRAW, Lang.bind(this, function() {
|
|
- if (!this._isModal) {
|
|
- Main.pushModal(this.actor);
|
|
- this._isModal = true;
|
|
+ if (!this._becomeModal()) {
|
|
+ // In the login screen, this is a hard error. Fail-whale
|
|
+ log('Could not acquire modal grab for the login screen. Aborting login process.');
|
|
+ Meta.quit(Meta.ExitCode.ERROR);
|
|
}
|
|
|
|
return false;
|
|
@@ -854,9 +878,11 @@ const ScreenShield = new Lang.Class({
|
|
},
|
|
|
|
lock: function(animate) {
|
|
- if (!this._isModal) {
|
|
- Main.pushModal(this.actor);
|
|
- this._isModal = true;
|
|
+ // Warn the user if we can't become modal
|
|
+ if (!this._becomeModal()) {
|
|
+ Main.notifyError(_("Failed to activate screen lock"),
|
|
+ _("The screen lock is inhibited by an application capturing the keyboard."));
|
|
+ return;
|
|
}
|
|
|
|
if (this._activationTime == 0)
|