[gnome-shell] Use new plugin-modality functionality in Mutter
- From: Owen Taylor <otaylor src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [gnome-shell] Use new plugin-modality functionality in Mutter
- Date: Wed, 26 Aug 2009 18:10:22 +0000 (UTC)
commit 799f56fe877ca8e66bdf97a702f78e1298aed691
Author: Owen W. Taylor <otaylor fishsoup net>
Date: Wed Aug 12 00:22:46 2009 -0400
Use new plugin-modality functionality in Mutter
We now have functionality in Mutter to grab the keyboard on behalf
of a plugin. This avoids interactions with the key handling code
in Mutter that could leave the user with an inconsistent state
and no way to get out of it.
src/shell-global.[ch]: Change shell_global_grab_keyboard() and
shell_global_grab_keyboard() to shell_global_begin_modal()
shell_global_end_modal() and call mutter_plugin_begin_modal()
mutter_plugin_end_modal() rather than directly grabbing the
keyboard.
main.js: Call global.begin_modal/end_modal from Main.startModal()
and Main.endModal()
altTab.js; Remove call to Main.startModal() - we're letting Mutter
handle modality for Alt-Tab.
main.js lookingGlass.js overview.js runDialog.js: Rename
Main.startModal() to Main.beginModal() for consistency with
naming in mutter and ShellGlobal.
http://bugzilla.gnome.org/show_bug.cgi?id=590686
js/ui/altTab.js | 4 ---
js/ui/lookingGlass.js | 2 +-
js/ui/main.js | 8 ++++--
js/ui/overview.js | 2 +-
js/ui/runDialog.js | 2 +-
src/shell-global.c | 65 +++++++++++++++----------------------------------
src/shell-global.h | 6 +++-
7 files changed, 32 insertions(+), 57 deletions(-)
---
diff --git a/js/ui/altTab.js b/js/ui/altTab.js
index f8470f1..d2a2711 100644
--- a/js/ui/altTab.js
+++ b/js/ui/altTab.js
@@ -144,8 +144,6 @@ AltTabPopup.prototype = {
show : function(initialSelection) {
let global = Shell.Global.get();
- Main.startModal();
-
global.window_group.add_actor(this._overlay);
this._overlay.raise_top();
this._overlay.show();
@@ -164,8 +162,6 @@ AltTabPopup.prototype = {
destroy : function() {
this.actor.destroy();
this._overlay.destroy();
-
- Main.endModal();
},
select : function(n) {
diff --git a/js/ui/lookingGlass.js b/js/ui/lookingGlass.js
index 5091fda..57f2a23 100644
--- a/js/ui/lookingGlass.js
+++ b/js/ui/lookingGlass.js
@@ -555,7 +555,7 @@ LookingGlass.prototype = {
Tweener.removeTweens(this.actor);
- if (!Main.startModal())
+ if (!Main.beginModal())
return;
let global = Shell.Global.get();
diff --git a/js/ui/main.js b/js/ui/main.js
index 4bae932..484bddc 100644
--- a/js/ui/main.js
+++ b/js/ui/main.js
@@ -137,10 +137,11 @@ function _removeUnusedWorkspaces() {
// Used to go into a mode where all keyboard and mouse input goes to
// the stage. Returns true if we successfully grabbed the keyboard and
// went modal, false otherwise
-function startModal() {
+function beginModal() {
let global = Shell.Global.get();
+ let timestamp = global.screen.get_display().get_current_time();
- if (!global.grab_keyboard())
+ if (!global.begin_modal(timestamp))
return false;
global.set_stage_input_mode(Shell.StageInputMode.FULLSCREEN);
@@ -151,8 +152,9 @@ function startModal() {
function endModal() {
let global = Shell.Global.get();
+ let timestamp = global.screen.get_display().get_current_time();
- global.ungrab_keyboard();
+ global.end_modal(timestamp);
global.set_stage_input_mode(Shell.StageInputMode.NORMAL);
inModal = false;
}
diff --git a/js/ui/overview.js b/js/ui/overview.js
index 94b4cbd..bdfea25 100644
--- a/js/ui/overview.js
+++ b/js/ui/overview.js
@@ -271,7 +271,7 @@ Overview.prototype = {
show : function() {
if (this.visible)
return;
- if (!Main.startModal())
+ if (!Main.beginModal())
return;
this.visible = true;
diff --git a/js/ui/runDialog.js b/js/ui/runDialog.js
index 5d68bb8..53a56e9 100644
--- a/js/ui/runDialog.js
+++ b/js/ui/runDialog.js
@@ -124,7 +124,7 @@ RunDialog.prototype = {
if (this._isOpen) // Already shown
return;
- if (!Main.startModal())
+ if (!Main.beginModal())
return;
this._isOpen = true;
diff --git a/src/shell-global.c b/src/shell-global.c
index e192b34..6193e0e 100644
--- a/src/shell-global.c
+++ b/src/shell-global.c
@@ -40,7 +40,6 @@ struct _ShellGlobal {
MutterPlugin *plugin;
ShellWM *wm;
- gboolean keyboard_grabbed;
const char *imagedir;
const char *configdir;
@@ -475,66 +474,42 @@ _shell_global_set_plugin (ShellGlobal *global,
}
/**
- * shell_global_grab_keyboard:
+ * shell_global_begin_modal:
* @global: a #ShellGlobal
*
- * Grab the keyboard to the stage window. The stage will receive
- * all keyboard events until shell_global_ungrab_keyboard() is called.
- * This is appropriate to do when the desktop goes into a special
- * mode where no normal global key shortcuts or application keyboard
- * processing should happen.
+ * Grabs the keyboard and mouse to the stage window. The stage will
+ * receive all keyboard and mouse events until shell_global_end_modal()
+ * is called. This is used to implement "modes" for the shell, such as the
+ * overview mode or the "looking glass" debug overlay, that block
+ * application and normal key shortcuts.
+ *
+ * Returns value: %TRUE if we succesfully entered the mode. %FALSE if we couldn't
+ * enter the mode. Failure may occur because an application has the pointer
+ * or keyboard grabbed, because Mutter is in a mode itself like moving a
+ * window or alt-Tab window selection, or because shell_global_begin_modal()
+ * was previouly called.
*/
gboolean
-shell_global_grab_keyboard (ShellGlobal *global)
+shell_global_begin_modal (ShellGlobal *global,
+ guint32 timestamp)
{
- MetaScreen *screen = mutter_plugin_get_screen (global->plugin);
- MetaDisplay *display = meta_screen_get_display (screen);
- Display *xdisplay = meta_display_get_xdisplay (display);
ClutterStage *stage = CLUTTER_STAGE (mutter_plugin_get_stage (global->plugin));
Window stagewin = clutter_x11_get_stage_window (stage);
- /* FIXME: we need to coordinate with the rest of Metacity or we
- * may grab the keyboard away from other portions of Metacity
- * and leave Metacity in a confused state. An X client is allowed
- * to overgrab itself, though not allowed to grab they keyboard
- * away from another applications.
- */
- if (global->keyboard_grabbed)
- return FALSE;
-
- if (XGrabKeyboard (xdisplay, stagewin,
- False, /* owner_events - steal events from the rest of metacity */
- GrabModeAsync, GrabModeAsync,
- CurrentTime) != Success)
- return FALSE; /* probably AlreadyGrabbed, some other app has a keyboard grab */
-
- global->keyboard_grabbed = TRUE;
-
- return TRUE;
+ return mutter_plugin_begin_modal (global->plugin, stagewin, None, 0, timestamp);
}
/**
- * shell_global_ungrab_keyboard:
+ * shell_global_end_modal:
* @global: a #ShellGlobal
*
- * Undoes the effect of shell_global_grab_keyboard
+ * Undoes the effect of shell_global_begin_modal().
*/
void
-shell_global_ungrab_keyboard (ShellGlobal *global)
+shell_global_end_modal (ShellGlobal *global,
+ guint32 timestamp)
{
- MetaScreen *screen;
- MetaDisplay *display;
- Display *xdisplay;
-
- g_return_if_fail (global->keyboard_grabbed);
-
- screen = mutter_plugin_get_screen (global->plugin);
- display = meta_screen_get_display (screen);
- xdisplay = meta_display_get_xdisplay (display);
-
- XUngrabKeyboard (xdisplay, CurrentTime);
-
- global->keyboard_grabbed = FALSE;
+ mutter_plugin_end_modal (global->plugin, timestamp);
}
/* Code to close all file descriptors before we exec; copied from gspawn.c in GLib.
diff --git a/src/shell-global.h b/src/shell-global.h
index 52d818d..a3ad263 100644
--- a/src/shell-global.h
+++ b/src/shell-global.h
@@ -64,8 +64,10 @@ GList *shell_global_get_windows (ShellGlobal *global);
void _shell_global_set_plugin (ShellGlobal *global,
MutterPlugin *plugin);
-gboolean shell_global_grab_keyboard (ShellGlobal *global);
-void shell_global_ungrab_keyboard (ShellGlobal *global);
+gboolean shell_global_begin_modal (ShellGlobal *global,
+ guint32 timestamp);
+void shell_global_end_modal (ShellGlobal *global,
+ guint32 timestamp);
void shell_global_reexec_self (ShellGlobal *global);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]