mirror of
https://github.com/brl/mutter.git
synced 2024-12-23 11:32:04 +00:00
x11: Move focus sentinel to MetaX11Display
This focus sentinel is a mechanism to avoid some X11-specific race conditions in focus-follows-pointer, using X11 mechanisms. Move it to MetaX11Display altogether. https://gitlab.gnome.org/GNOME/mutter/merge_requests/420
This commit is contained in:
parent
439afb3f19
commit
0200f4fcd9
@ -203,10 +203,6 @@ struct _MetaDisplay
|
|||||||
MetaEdgeResistanceData *grab_edge_resistance_data;
|
MetaEdgeResistanceData *grab_edge_resistance_data;
|
||||||
unsigned int grab_last_user_action_was_snap;
|
unsigned int grab_last_user_action_was_snap;
|
||||||
|
|
||||||
/* we use property updates as sentinels for certain window focus events
|
|
||||||
* to avoid some race conditions on EnterNotify events
|
|
||||||
*/
|
|
||||||
int sentinel_counter;
|
|
||||||
int grab_resize_timeout_id;
|
int grab_resize_timeout_id;
|
||||||
|
|
||||||
MetaKeyBindingManager key_binding_manager;
|
MetaKeyBindingManager key_binding_manager;
|
||||||
@ -363,10 +359,6 @@ gboolean meta_grab_op_is_resizing (MetaGrabOp op);
|
|||||||
gboolean meta_grab_op_is_mouse (MetaGrabOp op);
|
gboolean meta_grab_op_is_mouse (MetaGrabOp op);
|
||||||
gboolean meta_grab_op_is_keyboard (MetaGrabOp op);
|
gboolean meta_grab_op_is_keyboard (MetaGrabOp op);
|
||||||
|
|
||||||
void meta_display_increment_focus_sentinel (MetaDisplay *display);
|
|
||||||
void meta_display_decrement_focus_sentinel (MetaDisplay *display);
|
|
||||||
gboolean meta_display_focus_sentinel_clear (MetaDisplay *display);
|
|
||||||
|
|
||||||
void meta_display_queue_autoraise_callback (MetaDisplay *display,
|
void meta_display_queue_autoraise_callback (MetaDisplay *display,
|
||||||
MetaWindow *window);
|
MetaWindow *window);
|
||||||
void meta_display_remove_autoraise_callback (MetaDisplay *display);
|
void meta_display_remove_autoraise_callback (MetaDisplay *display);
|
||||||
|
@ -683,7 +683,6 @@ meta_display_open (void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
display->current_time = META_CURRENT_TIME;
|
display->current_time = META_CURRENT_TIME;
|
||||||
display->sentinel_counter = 0;
|
|
||||||
|
|
||||||
display->grab_resize_timeout_id = 0;
|
display->grab_resize_timeout_id = 0;
|
||||||
display->grab_have_keyboard = FALSE;
|
display->grab_have_keyboard = FALSE;
|
||||||
@ -2490,37 +2489,6 @@ prefs_changed_callback (MetaPreference pref,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
|
||||||
meta_display_increment_focus_sentinel (MetaDisplay *display)
|
|
||||||
{
|
|
||||||
unsigned long data[1];
|
|
||||||
|
|
||||||
data[0] = meta_display_get_current_time (display);
|
|
||||||
|
|
||||||
XChangeProperty (display->x11_display->xdisplay,
|
|
||||||
display->x11_display->xroot,
|
|
||||||
display->x11_display->atom__MUTTER_SENTINEL,
|
|
||||||
XA_CARDINAL,
|
|
||||||
32, PropModeReplace, (guchar*) data, 1);
|
|
||||||
|
|
||||||
display->sentinel_counter += 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
meta_display_decrement_focus_sentinel (MetaDisplay *display)
|
|
||||||
{
|
|
||||||
display->sentinel_counter -= 1;
|
|
||||||
|
|
||||||
if (display->sentinel_counter < 0)
|
|
||||||
display->sentinel_counter = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
gboolean
|
|
||||||
meta_display_focus_sentinel_clear (MetaDisplay *display)
|
|
||||||
{
|
|
||||||
return (display->sentinel_counter == 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
meta_display_sanity_check_timestamps (MetaDisplay *display,
|
meta_display_sanity_check_timestamps (MetaDisplay *display,
|
||||||
guint32 timestamp)
|
guint32 timestamp)
|
||||||
|
@ -1939,9 +1939,10 @@ idle_calc_showing (gpointer data)
|
|||||||
while (tmp != NULL)
|
while (tmp != NULL)
|
||||||
{
|
{
|
||||||
MetaWindow *window = tmp->data;
|
MetaWindow *window = tmp->data;
|
||||||
|
MetaDisplay *display = window->display;
|
||||||
|
|
||||||
if (!window->display->mouse_mode)
|
if (display->x11_display && !display->mouse_mode)
|
||||||
meta_display_increment_focus_sentinel (window->display);
|
meta_x11_display_increment_focus_sentinel (display->x11_display);
|
||||||
|
|
||||||
tmp = tmp->next;
|
tmp = tmp->next;
|
||||||
}
|
}
|
||||||
@ -2411,6 +2412,7 @@ meta_window_show (MetaWindow *window)
|
|||||||
gboolean needs_stacking_adjustment;
|
gboolean needs_stacking_adjustment;
|
||||||
MetaWindow *focus_window;
|
MetaWindow *focus_window;
|
||||||
gboolean notify_demands_attention = FALSE;
|
gboolean notify_demands_attention = FALSE;
|
||||||
|
MetaDisplay *display = window->display;
|
||||||
|
|
||||||
meta_topic (META_DEBUG_WINDOW_STATE,
|
meta_topic (META_DEBUG_WINDOW_STATE,
|
||||||
"Showing window %s, shaded: %d iconic: %d placed: %d\n",
|
"Showing window %s, shaded: %d iconic: %d placed: %d\n",
|
||||||
@ -2577,7 +2579,7 @@ meta_window_show (MetaWindow *window)
|
|||||||
|
|
||||||
meta_window_focus (window, timestamp);
|
meta_window_focus (window, timestamp);
|
||||||
}
|
}
|
||||||
else
|
else if (display->x11_display)
|
||||||
{
|
{
|
||||||
/* Prevent EnterNotify events in sloppy/mouse focus from
|
/* Prevent EnterNotify events in sloppy/mouse focus from
|
||||||
* erroneously focusing the window that had been denied
|
* erroneously focusing the window that had been denied
|
||||||
@ -2585,7 +2587,7 @@ meta_window_show (MetaWindow *window)
|
|||||||
* ideas for a better way to accomplish the same thing, but
|
* ideas for a better way to accomplish the same thing, but
|
||||||
* they're more involved so do it this way for now.
|
* they're more involved so do it this way for now.
|
||||||
*/
|
*/
|
||||||
meta_display_increment_focus_sentinel (window->display);
|
meta_x11_display_increment_focus_sentinel (display->x11_display);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -882,7 +882,7 @@ handle_input_xevent (MetaX11Display *x11_display,
|
|||||||
enter_event->mode != XINotifyGrab &&
|
enter_event->mode != XINotifyGrab &&
|
||||||
enter_event->mode != XINotifyUngrab &&
|
enter_event->mode != XINotifyUngrab &&
|
||||||
enter_event->detail != XINotifyInferior &&
|
enter_event->detail != XINotifyInferior &&
|
||||||
meta_display_focus_sentinel_clear (display))
|
meta_x11_display_focus_sentinel_clear (x11_display))
|
||||||
{
|
{
|
||||||
meta_window_handle_enter (window,
|
meta_window_handle_enter (window,
|
||||||
enter_event->time,
|
enter_event->time,
|
||||||
@ -1525,7 +1525,7 @@ handle_other_xevent (MetaX11Display *x11_display,
|
|||||||
if (event->xproperty.atom ==
|
if (event->xproperty.atom ==
|
||||||
x11_display->atom__MUTTER_SENTINEL)
|
x11_display->atom__MUTTER_SENTINEL)
|
||||||
{
|
{
|
||||||
meta_display_decrement_focus_sentinel (display);
|
meta_x11_display_decrement_focus_sentinel (x11_display);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -135,6 +135,11 @@ struct _MetaX11Display
|
|||||||
|
|
||||||
guint keys_grabbed : 1;
|
guint keys_grabbed : 1;
|
||||||
|
|
||||||
|
/* we use property updates as sentinels for certain window focus events
|
||||||
|
* to avoid some race conditions on EnterNotify events
|
||||||
|
*/
|
||||||
|
int sentinel_counter;
|
||||||
|
|
||||||
int composite_event_base;
|
int composite_event_base;
|
||||||
int composite_error_base;
|
int composite_error_base;
|
||||||
int composite_major_version;
|
int composite_major_version;
|
||||||
@ -222,4 +227,8 @@ MetaLogicalMonitor *meta_x11_display_xinerama_index_to_logical_monitor (MetaX11D
|
|||||||
void meta_x11_display_update_workspace_layout (MetaX11Display *x11_display);
|
void meta_x11_display_update_workspace_layout (MetaX11Display *x11_display);
|
||||||
void meta_x11_display_update_workspace_names (MetaX11Display *x11_display);
|
void meta_x11_display_update_workspace_names (MetaX11Display *x11_display);
|
||||||
|
|
||||||
|
void meta_x11_display_increment_focus_sentinel (MetaX11Display *x11_display);
|
||||||
|
void meta_x11_display_decrement_focus_sentinel (MetaX11Display *x11_display);
|
||||||
|
gboolean meta_x11_display_focus_sentinel_clear (MetaX11Display *x11_display);
|
||||||
|
|
||||||
#endif /* META_X11_DISPLAY_PRIVATE_H */
|
#endif /* META_X11_DISPLAY_PRIVATE_H */
|
||||||
|
@ -2177,3 +2177,34 @@ prefs_changed_callback (MetaPreference pref,
|
|||||||
set_workspace_names (x11_display);
|
set_workspace_names (x11_display);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
meta_x11_display_increment_focus_sentinel (MetaX11Display *x11_display)
|
||||||
|
{
|
||||||
|
unsigned long data[1];
|
||||||
|
|
||||||
|
data[0] = meta_display_get_current_time (x11_display->display);
|
||||||
|
|
||||||
|
XChangeProperty (x11_display->xdisplay,
|
||||||
|
x11_display->xroot,
|
||||||
|
x11_display->atom__MUTTER_SENTINEL,
|
||||||
|
XA_CARDINAL,
|
||||||
|
32, PropModeReplace, (guchar*) data, 1);
|
||||||
|
|
||||||
|
x11_display->sentinel_counter += 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
meta_x11_display_decrement_focus_sentinel (MetaX11Display *x11_display)
|
||||||
|
{
|
||||||
|
x11_display->sentinel_counter -= 1;
|
||||||
|
|
||||||
|
if (x11_display->sentinel_counter < 0)
|
||||||
|
x11_display->sentinel_counter = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
gboolean
|
||||||
|
meta_x11_display_focus_sentinel_clear (MetaX11Display *x11_display)
|
||||||
|
{
|
||||||
|
return (x11_display->sentinel_counter == 0);
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user