diff --git a/src/gnome-shell-plugin.c b/src/gnome-shell-plugin.c index 4c72e14fa..46da710eb 100644 --- a/src/gnome-shell-plugin.c +++ b/src/gnome-shell-plugin.c @@ -286,18 +286,18 @@ gnome_shell_plugin_kill_switch_workspace (MetaPlugin *plugin) static gboolean ignore_crossing_event (MetaPlugin *plugin, - XEvent *xev) + XIEnterEvent *enter_event) { MetaScreen *screen = meta_plugin_get_screen (plugin); ClutterStage *stage = CLUTTER_STAGE (meta_get_stage_for_screen (screen)); - if (xev->xcrossing.window == clutter_x11_get_stage_window (stage)) + if (enter_event->event == clutter_x11_get_stage_window (stage)) { /* If the pointer enters a child of the stage window (eg, a * trayicon), we want to consider it to still be in the stage, * so don't let Clutter see the event. */ - if (xev->xcrossing.detail == NotifyInferior) + if (enter_event->detail == XINotifyInferior) return TRUE; /* If the pointer is grabbed by a window it is not currently in, @@ -307,9 +307,9 @@ ignore_crossing_event (MetaPlugin *plugin, * out of sync, but that happens fairly often with grabs, and we * can work around it. (Eg, shell_global_sync_pointer().) */ - if (xev->xcrossing.mode == NotifyGrab && - (xev->xcrossing.detail == NotifyNonlinear || - xev->xcrossing.detail == NotifyNonlinearVirtual)) + if (enter_event->mode == XINotifyGrab && + (enter_event->detail == XINotifyNonlinear || + enter_event->detail == XINotifyNonlinearVirtual)) return TRUE; } @@ -320,6 +320,9 @@ static gboolean gnome_shell_plugin_xevent_filter (MetaPlugin *plugin, XEvent *xev) { + MetaScreen *screen = meta_plugin_get_screen (plugin); + MetaDisplay *display = meta_screen_get_display (screen); + GnomeShellPlugin *shell_plugin = GNOME_SHELL_PLUGIN (plugin); #ifdef GLX_INTEL_swap_event if (shell_plugin->have_swap_event && @@ -341,9 +344,14 @@ gnome_shell_plugin_xevent_filter (MetaPlugin *plugin, /* Make sure that Clutter doesn't see certain focus change events, * so that when we're moving into something like a tray icon, we * don't unfocus the container. */ - if ((xev->xany.type == EnterNotify || xev->xany.type == LeaveNotify) && - ignore_crossing_event (plugin, xev)) - return TRUE; + if (xev->type == GenericEvent && + xev->xcookie.extension == meta_display_get_xinput_opcode (display)) + { + XIEvent *input_event = (XIEvent *) xev->xcookie.data; + if ((input_event->evtype == XI_Enter || input_event->evtype == XI_Leave) && + ignore_crossing_event (plugin, (XIEnterEvent *) input_event)) + return TRUE; + } /* * Pass the event to shell-global