summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarlos Garnacho <carlosg@gnome.org>2018-12-30 12:58:31 +0100
committerJonas Ã…dahl <jadahl@gmail.com>2019-05-24 15:30:30 +0000
commit0200f4fcd9bc5921f15a8547cce6c5ba85f4cea9 (patch)
tree49bd4fb501331caa067fefea8feca84b5e0533da
parent439afb3f19adff751d8a643dc57e07046190483a (diff)
downloadmutter-0200f4fcd9bc5921f15a8547cce6c5ba85f4cea9.tar.gz
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
-rw-r--r--src/core/display-private.h8
-rw-r--r--src/core/display.c32
-rw-r--r--src/core/window.c10
-rw-r--r--src/x11/events.c4
-rw-r--r--src/x11/meta-x11-display-private.h9
-rw-r--r--src/x11/meta-x11-display.c31
6 files changed, 48 insertions, 46 deletions
diff --git a/src/core/display-private.h b/src/core/display-private.h
index 068c710af..ea683a39a 100644
--- a/src/core/display-private.h
+++ b/src/core/display-private.h
@@ -203,10 +203,6 @@ struct _MetaDisplay
MetaEdgeResistanceData *grab_edge_resistance_data;
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;
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_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,
MetaWindow *window);
void meta_display_remove_autoraise_callback (MetaDisplay *display);
diff --git a/src/core/display.c b/src/core/display.c
index adef7de5d..a762af7fd 100644
--- a/src/core/display.c
+++ b/src/core/display.c
@@ -683,7 +683,6 @@ meta_display_open (void)
}
display->current_time = META_CURRENT_TIME;
- display->sentinel_counter = 0;
display->grab_resize_timeout_id = 0;
display->grab_have_keyboard = FALSE;
@@ -2491,37 +2490,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
meta_display_sanity_check_timestamps (MetaDisplay *display,
guint32 timestamp)
{
diff --git a/src/core/window.c b/src/core/window.c
index 89408081d..c37afa36b 100644
--- a/src/core/window.c
+++ b/src/core/window.c
@@ -1939,9 +1939,10 @@ idle_calc_showing (gpointer data)
while (tmp != NULL)
{
MetaWindow *window = tmp->data;
+ MetaDisplay *display = window->display;
- if (!window->display->mouse_mode)
- meta_display_increment_focus_sentinel (window->display);
+ if (display->x11_display && !display->mouse_mode)
+ meta_x11_display_increment_focus_sentinel (display->x11_display);
tmp = tmp->next;
}
@@ -2411,6 +2412,7 @@ meta_window_show (MetaWindow *window)
gboolean needs_stacking_adjustment;
MetaWindow *focus_window;
gboolean notify_demands_attention = FALSE;
+ MetaDisplay *display = window->display;
meta_topic (META_DEBUG_WINDOW_STATE,
"Showing window %s, shaded: %d iconic: %d placed: %d\n",
@@ -2577,7 +2579,7 @@ meta_window_show (MetaWindow *window)
meta_window_focus (window, timestamp);
}
- else
+ else if (display->x11_display)
{
/* Prevent EnterNotify events in sloppy/mouse focus from
* 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
* 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);
}
}
diff --git a/src/x11/events.c b/src/x11/events.c
index 92b5d7015..5fdff162c 100644
--- a/src/x11/events.c
+++ b/src/x11/events.c
@@ -882,7 +882,7 @@ handle_input_xevent (MetaX11Display *x11_display,
enter_event->mode != XINotifyGrab &&
enter_event->mode != XINotifyUngrab &&
enter_event->detail != XINotifyInferior &&
- meta_display_focus_sentinel_clear (display))
+ meta_x11_display_focus_sentinel_clear (x11_display))
{
meta_window_handle_enter (window,
enter_event->time,
@@ -1525,7 +1525,7 @@ handle_other_xevent (MetaX11Display *x11_display,
if (event->xproperty.atom ==
x11_display->atom__MUTTER_SENTINEL)
{
- meta_display_decrement_focus_sentinel (display);
+ meta_x11_display_decrement_focus_sentinel (x11_display);
}
}
}
diff --git a/src/x11/meta-x11-display-private.h b/src/x11/meta-x11-display-private.h
index 9a8ab83b2..c7af182d9 100644
--- a/src/x11/meta-x11-display-private.h
+++ b/src/x11/meta-x11-display-private.h
@@ -135,6 +135,11 @@ struct _MetaX11Display
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_error_base;
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_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 */
diff --git a/src/x11/meta-x11-display.c b/src/x11/meta-x11-display.c
index af8ae7a8d..2aece19a8 100644
--- a/src/x11/meta-x11-display.c
+++ b/src/x11/meta-x11-display.c
@@ -2177,3 +2177,34 @@ prefs_changed_callback (MetaPreference pref,
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);
+}