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
This commit is contained in:
Adel Gadllah 2011-10-21 09:12:17 +02:00
parent 2b140f8fb7
commit f4d8a35b9d
4 changed files with 17 additions and 9 deletions

View File

@ -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);

View File

@ -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;
}

View File

@ -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);
}
/**

View File

@ -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);