layout: Don't use the input mode to block events to windows

Instead, use the standard Clutter scene graph and our Chrome system.

This also removes our last use of the input mode, so remove that as
well.

https://bugzilla.gnome.org/show_bug.cgi?id=700735
This commit is contained in:
Jasper St. Pierre 2013-05-18 19:06:50 -04:00
parent 985d0c786c
commit 3582ba0c77
3 changed files with 11 additions and 63 deletions

View File

@ -589,9 +589,13 @@ const LayoutManager = new Lang.Class({
// screen. So, we set no_clear_hint at the end of the animation. // screen. So, we set no_clear_hint at the end of the animation.
_prepareStartupAnimation: function() { _prepareStartupAnimation: function() {
// Set ourselves to FULLSCREEN input mode while the animation is running // During the initial transition, add a simple actor to block all events,
// so events don't get delivered to X11 windows (which are distorted by the animation) // so they don't get delivered to X11 windows that have been transformed.
global.stage_input_mode = Shell.StageInputMode.FULLSCREEN; this._coverPane = new Clutter.Actor({ opacity: 0,
width: global.screen_width,
height: global.screen_height,
reactive: true });
this.addChrome(this._coverPane);
if (Main.sessionMode.isGreeter) { if (Main.sessionMode.isGreeter) {
this.panelBox.translation_y = -this.panelBox.height; this.panelBox.translation_y = -this.panelBox.height;
@ -661,7 +665,8 @@ const LayoutManager = new Lang.Class({
// we no longer need to clear the stage // we no longer need to clear the stage
global.stage.no_clear_hint = true; global.stage.no_clear_hint = true;
global.stage_input_mode = Shell.StageInputMode.NORMAL; this._coverPane.destroy();
this._coverPane = null;
this._systemBackground.actor.destroy(); this._systemBackground.actor.destroy();
this._systemBackground = null; this._systemBackground = null;

View File

@ -70,7 +70,6 @@ struct _ShellGlobal {
GtkWindow *grab_notifier; GtkWindow *grab_notifier;
gboolean gtk_grab_active; gboolean gtk_grab_active;
ShellStageInputMode input_mode;
XserverRegion input_region; XserverRegion input_region;
GjsContext *js_context; GjsContext *js_context;
@ -108,7 +107,6 @@ enum {
PROP_SCREEN_WIDTH, PROP_SCREEN_WIDTH,
PROP_SCREEN_HEIGHT, PROP_SCREEN_HEIGHT,
PROP_STAGE, PROP_STAGE,
PROP_STAGE_INPUT_MODE,
PROP_WINDOW_GROUP, PROP_WINDOW_GROUP,
PROP_TOP_WINDOW_GROUP, PROP_TOP_WINDOW_GROUP,
PROP_WINDOW_MANAGER, PROP_WINDOW_MANAGER,
@ -143,9 +141,6 @@ shell_global_set_property(GObject *object,
switch (prop_id) switch (prop_id)
{ {
case PROP_STAGE_INPUT_MODE:
shell_global_set_stage_input_mode (global, g_value_get_enum (value));
break;
case PROP_SESSION_MODE: case PROP_SESSION_MODE:
g_clear_pointer (&global->session_mode, g_free); g_clear_pointer (&global->session_mode, g_free);
global->session_mode = g_ascii_strdown (g_value_get_string (value), -1); global->session_mode = g_ascii_strdown (g_value_get_string (value), -1);
@ -197,9 +192,6 @@ shell_global_get_property(GObject *object,
case PROP_STAGE: case PROP_STAGE:
g_value_set_object (value, global->stage); g_value_set_object (value, global->stage);
break; break;
case PROP_STAGE_INPUT_MODE:
g_value_set_enum (value, global->input_mode);
break;
case PROP_WINDOW_GROUP: case PROP_WINDOW_GROUP:
g_value_set_object (value, meta_get_window_group_for_screen (global->meta_screen)); g_value_set_object (value, meta_get_window_group_for_screen (global->meta_screen));
break; break;
@ -280,8 +272,6 @@ shell_global_init (ShellGlobal *global)
g_signal_connect (global->grab_notifier, "grab-notify", G_CALLBACK (grab_notify), global); g_signal_connect (global->grab_notifier, "grab-notify", G_CALLBACK (grab_notify), global);
global->gtk_grab_active = FALSE; global->gtk_grab_active = FALSE;
global->input_mode = SHELL_STAGE_INPUT_MODE_NORMAL;
global->sound_context = ca_gtk_context_get (); global->sound_context = ca_gtk_context_get ();
ca_context_change_props (global->sound_context, ca_context_change_props (global->sound_context,
CA_PROP_APPLICATION_NAME, "GNOME Shell", CA_PROP_APPLICATION_NAME, "GNOME Shell",
@ -419,14 +409,6 @@ shell_global_class_init (ShellGlobalClass *klass)
"Stage holding the desktop scene graph", "Stage holding the desktop scene graph",
CLUTTER_TYPE_ACTOR, CLUTTER_TYPE_ACTOR,
G_PARAM_READABLE)); G_PARAM_READABLE));
g_object_class_install_property (gobject_class,
PROP_STAGE_INPUT_MODE,
g_param_spec_enum ("stage-input-mode",
"Stage input mode",
"The stage input mode",
SHELL_TYPE_STAGE_INPUT_MODE,
SHELL_STAGE_INPUT_MODE_NORMAL,
G_PARAM_READWRITE));
g_object_class_install_property (gobject_class, g_object_class_install_property (gobject_class,
PROP_WINDOW_GROUP, PROP_WINDOW_GROUP,
g_param_spec_object ("window-group", g_param_spec_object ("window-group",
@ -611,39 +593,12 @@ sync_input_region (ShellGlobal *global)
if (global->gtk_grab_active) if (global->gtk_grab_active)
meta_empty_stage_input_region (screen); meta_empty_stage_input_region (screen);
else if (global->input_mode == SHELL_STAGE_INPUT_MODE_FULLSCREEN || !global->input_region || global->has_modal) else if (global->has_modal)
meta_set_stage_input_region (screen, None); meta_set_stage_input_region (screen, None);
else else
meta_set_stage_input_region (screen, global->input_region); meta_set_stage_input_region (screen, global->input_region);
} }
/**
* shell_global_set_stage_input_mode:
* @global: the #ShellGlobal
* @mode: the stage input mode
*
* Sets the input mode of the stage; when @mode is
* %SHELL_STAGE_INPUT_MODE_NORMAL, then the stage accepts clicks in
* the region defined by shell_global_set_stage_input_region() but
* passes through clicks outside that region. When it is
* %SHELL_STAGE_INPUT_MODE_FULLSCREEN, the stage absorbs all input.
*
* Note that whenever a mutter-internal Gtk widget has a pointer grab,
* the shell goes unresponsive and passes things to the underlying GTK+
* widget to ensure that the widget gets any clicks it is expecting.
*/
void
shell_global_set_stage_input_mode (ShellGlobal *global,
ShellStageInputMode mode)
{
if (mode == global->input_mode)
return;
global->input_mode = mode;
sync_input_region (global);
g_object_notify (G_OBJECT (global), "stage-input-mode");
}
/** /**
* shell_global_set_cursor: * shell_global_set_cursor:
* @global: A #ShellGlobal * @global: A #ShellGlobal
@ -736,8 +691,7 @@ shell_global_unset_cursor (ShellGlobal *global)
* describing the input region. * describing the input region.
* *
* Sets the area of the stage that is responsive to mouse clicks when * Sets the area of the stage that is responsive to mouse clicks when
* the stage mode is %SHELL_STAGE_INPUT_MODE_NORMAL (but does not change the * we don't have a modal or grab.
* current stage mode).
*/ */
void void
shell_global_set_stage_input_region (ShellGlobal *global, shell_global_set_stage_input_region (ShellGlobal *global,
@ -1392,10 +1346,6 @@ shell_global_sync_pointer (ShellGlobal *global)
event.type = CLUTTER_MOTION; event.type = CLUTTER_MOTION;
event.time = shell_global_get_current_time (global); event.time = shell_global_get_current_time (global);
event.flags = 0; event.flags = 0;
/* This is wrong: we should be setting event.stage to NULL if the
* pointer is not inside the bounds of the stage given the current
* stage_input_mode. For our current purposes however, this works.
*/
event.stage = global->stage; event.stage = global->stage;
event.x = x; event.x = x;
event.y = y; event.y = y;

View File

@ -47,13 +47,6 @@ void shell_global_end_modal (ShellGlobal *global,
void shell_global_freeze_keyboard (ShellGlobal *global, void shell_global_freeze_keyboard (ShellGlobal *global,
guint32 timestamp); guint32 timestamp);
typedef enum {
SHELL_STAGE_INPUT_MODE_NORMAL,
SHELL_STAGE_INPUT_MODE_FULLSCREEN
} ShellStageInputMode;
void shell_global_set_stage_input_mode (ShellGlobal *global,
ShellStageInputMode mode);
void shell_global_set_stage_input_region (ShellGlobal *global, void shell_global_set_stage_input_region (ShellGlobal *global,
GSList *rectangles); GSList *rectangles);