From f4d8a35b9d629c7e994fb5e15a59abccfa3932f7 Mon Sep 17 00:00:00 2001 From: Adel Gadllah Date: Fri, 21 Oct 2011 09:12:17 +0200 Subject: [PATCH] altTab: Don't refuse to work when a pointer grab is in place Allow push_modal to optionally only work with a keyboard only grab and use that in altTab as a fallback to allow switching windows while a pointer grab is in effect (like during DND operations). https://bugzilla.gnome.org/show_bug.cgi?id=660457 --- js/ui/altTab.js | 8 ++++++-- js/ui/main.js | 7 +++++-- src/shell-global.c | 8 ++++---- src/shell-global.h | 3 ++- 4 files changed, 17 insertions(+), 9 deletions(-) diff --git a/js/ui/altTab.js b/js/ui/altTab.js index e17344f28..20bad20d0 100644 --- a/js/ui/altTab.js +++ b/js/ui/altTab.js @@ -170,8 +170,12 @@ AltTabPopup.prototype = { if (localApps.length == 0 && otherApps.length == 0) return false; - if (!Main.pushModal(this.actor)) - return false; + if (!Main.pushModal(this.actor)) { + // Probably someone else has a pointer grab, try again with keyboard only + if (!Main.pushModal(this.actor, global.get_current_time(), Meta.ModalOptions.POINTER_ALREADY_GRABBED)) { + return false; + } + } this._haveModal = true; this._modifierMask = primaryModifier(mask); diff --git a/js/ui/main.js b/js/ui/main.js index 4c97440df..e08de3df8 100644 --- a/js/ui/main.js +++ b/js/ui/main.js @@ -668,14 +668,17 @@ function _findModal(actor) { * initiated event. If not provided then the value of * global.get_current_time() is assumed. * + * @options: optional Meta.ModalOptions flags to indicate that the + * pointer is alrady grabbed + * * Returns: true iff we successfully acquired a grab or already had one */ -function pushModal(actor, timestamp) { +function pushModal(actor, timestamp, options) { if (timestamp == undefined) timestamp = global.get_current_time(); if (modalCount == 0) { - if (!global.begin_modal(timestamp)) { + if (!global.begin_modal(timestamp, options ? options : 0)) { log('pushModal: invocation of begin_modal failed'); return false; } diff --git a/src/shell-global.c b/src/shell-global.c index 13ce7b7af..7b3e8f528 100644 --- a/src/shell-global.c +++ b/src/shell-global.c @@ -864,11 +864,11 @@ _shell_global_get_gjs_context (ShellGlobal *global) * was previouly called. */ gboolean -shell_global_begin_modal (ShellGlobal *global, - guint32 timestamp) +shell_global_begin_modal (ShellGlobal *global, + guint32 timestamp, + MetaModalOptions options) { - return meta_plugin_begin_modal (global->plugin, global->stage_xwindow, - None, 0, timestamp); + return meta_plugin_begin_modal (global->plugin, global->stage_xwindow, None, options, timestamp); } /** diff --git a/src/shell-global.h b/src/shell-global.h index cc5cfe7c0..dcb1517ed 100644 --- a/src/shell-global.h +++ b/src/shell-global.h @@ -39,7 +39,8 @@ guint32 shell_global_get_current_time (ShellGlobal *global); /* Input/event handling */ gboolean shell_global_begin_modal (ShellGlobal *global, - guint32 timestamp); + guint32 timestamp, + MetaModalOptions options); void shell_global_end_modal (ShellGlobal *global, guint32 timestamp);