mirror of
https://github.com/brl/mutter.git
synced 2025-04-01 16:13:46 +00:00
core: Untangle input focus management
In all places (including src/wayland) we tap into meta_x11_display* focus API, which then calls meta_display* API. This relation is backwards, so rework input focus management so it's the other way around. We now have high-level meta_display_(un)set_input_focus functions, which perform the backend-independent maintenance, and calls into the X11 functions where relevant. These functions are what callers should use. https://gitlab.gnome.org/GNOME/mutter/merge_requests/420
This commit is contained in:
parent
1d77641f0b
commit
86de79cfc5
@ -779,10 +779,12 @@ meta_display_open (void)
|
|||||||
if (old_active_window)
|
if (old_active_window)
|
||||||
meta_window_focus (old_active_window, timestamp);
|
meta_window_focus (old_active_window, timestamp);
|
||||||
else
|
else
|
||||||
meta_x11_display_focus_the_no_focus_window (display->x11_display, timestamp);
|
meta_display_unset_input_focus (display, timestamp);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
meta_display_unset_input_focus (display, timestamp);
|
||||||
}
|
}
|
||||||
else if (display->x11_display)
|
|
||||||
meta_x11_display_focus_the_no_focus_window (display->x11_display, timestamp);
|
|
||||||
|
|
||||||
meta_idle_monitor_init_dbus ();
|
meta_idle_monitor_init_dbus ();
|
||||||
|
|
||||||
@ -1307,6 +1309,51 @@ meta_display_timestamp_too_old (MetaDisplay *display,
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
meta_display_set_input_focus (MetaDisplay *display,
|
||||||
|
MetaWindow *window,
|
||||||
|
gboolean focus_frame,
|
||||||
|
guint32 timestamp)
|
||||||
|
{
|
||||||
|
if (meta_display_timestamp_too_old (display, ×tamp))
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (display->x11_display)
|
||||||
|
{
|
||||||
|
MetaX11Display *x11_display = display->x11_display;
|
||||||
|
Window xwindow;
|
||||||
|
gulong serial;
|
||||||
|
|
||||||
|
meta_x11_error_trap_push (x11_display);
|
||||||
|
|
||||||
|
if (window)
|
||||||
|
xwindow = focus_frame ? window->frame->xwindow : window->xwindow;
|
||||||
|
else
|
||||||
|
xwindow = x11_display->no_focus_window;
|
||||||
|
|
||||||
|
meta_x11_display_set_input_focus (x11_display, xwindow, timestamp);
|
||||||
|
serial = XNextRequest (x11_display->xdisplay);
|
||||||
|
|
||||||
|
meta_x11_display_update_focus_window (x11_display, xwindow, serial, TRUE);
|
||||||
|
|
||||||
|
meta_x11_error_trap_pop (display->x11_display);
|
||||||
|
}
|
||||||
|
|
||||||
|
meta_display_update_focus_window (display, window);
|
||||||
|
|
||||||
|
display->last_focus_time = timestamp;
|
||||||
|
|
||||||
|
if (window == NULL || window != display->autoraise_window)
|
||||||
|
meta_display_remove_autoraise_callback (display);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
meta_display_unset_input_focus (MetaDisplay *display,
|
||||||
|
guint32 timestamp)
|
||||||
|
{
|
||||||
|
meta_display_set_input_focus (display, NULL, FALSE, timestamp);
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
meta_display_register_wayland_window (MetaDisplay *display,
|
meta_display_register_wayland_window (MetaDisplay *display,
|
||||||
MetaWindow *window)
|
MetaWindow *window)
|
||||||
|
@ -8088,8 +8088,7 @@ mouse_mode_focus (MetaWindow *window,
|
|||||||
"Unsetting focus from %s due to mouse entering "
|
"Unsetting focus from %s due to mouse entering "
|
||||||
"the DESKTOP window\n",
|
"the DESKTOP window\n",
|
||||||
display->focus_window->desc);
|
display->focus_window->desc);
|
||||||
meta_x11_display_focus_the_no_focus_window (display->x11_display,
|
meta_display_unset_input_focus (display, timestamp);
|
||||||
timestamp);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1308,8 +1308,7 @@ meta_workspace_focus_default_window (MetaWorkspace *workspace,
|
|||||||
meta_topic (META_DEBUG_FOCUS,
|
meta_topic (META_DEBUG_FOCUS,
|
||||||
"Setting focus to no_focus_window, since no valid "
|
"Setting focus to no_focus_window, since no valid "
|
||||||
"window to focus found.\n");
|
"window to focus found.\n");
|
||||||
meta_x11_display_focus_the_no_focus_window (workspace->display->x11_display,
|
meta_display_unset_input_focus (workspace->display, timestamp);
|
||||||
timestamp);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1381,8 +1380,7 @@ focus_ancestor_or_top_window (MetaWorkspace *workspace,
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
meta_topic (META_DEBUG_FOCUS, "No MRU window to focus found; focusing no_focus_window.\n");
|
meta_topic (META_DEBUG_FOCUS, "No MRU window to focus found; focusing no_focus_window.\n");
|
||||||
meta_x11_display_focus_the_no_focus_window (workspace->display->x11_display,
|
meta_display_unset_input_focus (workspace->display, timestamp);
|
||||||
timestamp);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -297,4 +297,13 @@ MetaSoundPlayer * meta_display_get_sound_player (MetaDisplay *display);
|
|||||||
META_EXPORT
|
META_EXPORT
|
||||||
MetaSelection * meta_display_get_selection (MetaDisplay *display);
|
MetaSelection * meta_display_get_selection (MetaDisplay *display);
|
||||||
|
|
||||||
|
META_EXPORT
|
||||||
|
void meta_display_set_input_focus (MetaDisplay *display,
|
||||||
|
MetaWindow *window,
|
||||||
|
gboolean focus_frame,
|
||||||
|
guint32 timestamp);
|
||||||
|
META_EXPORT
|
||||||
|
void meta_display_unset_input_focus (MetaDisplay *display,
|
||||||
|
guint32 timestamp);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -63,27 +63,4 @@ META_EXPORT
|
|||||||
gboolean meta_x11_display_xwindow_is_a_no_focus_window (MetaX11Display *x11_display,
|
gboolean meta_x11_display_xwindow_is_a_no_focus_window (MetaX11Display *x11_display,
|
||||||
Window xwindow);
|
Window xwindow);
|
||||||
|
|
||||||
/* meta_x11_display_set_input_focus_window is like XSetInputFocus, except
|
|
||||||
* that (a) it can't detect timestamps later than the current time,
|
|
||||||
* since Mutter isn't part of the XServer, and thus gives erroneous
|
|
||||||
* behavior in this circumstance (so don't do it), (b) it uses
|
|
||||||
* display->last_focus_time since we don't have access to the true
|
|
||||||
* Xserver one, (c) it makes use of display->user_time since checking
|
|
||||||
* whether a window should be allowed to be focused should depend
|
|
||||||
* on user_time events (see bug 167358, comment 15 in particular)
|
|
||||||
*/
|
|
||||||
META_EXPORT
|
|
||||||
void meta_x11_display_set_input_focus_window (MetaX11Display *x11_display,
|
|
||||||
MetaWindow *window,
|
|
||||||
gboolean focus_frame,
|
|
||||||
guint32 timestamp);
|
|
||||||
|
|
||||||
/* meta_x11_display_focus_the_no_focus_window is called when the
|
|
||||||
* designated no_focus_window should be focused, but is otherwise the
|
|
||||||
* same as meta_display_set_input_focus_window
|
|
||||||
*/
|
|
||||||
META_EXPORT
|
|
||||||
void meta_x11_display_focus_the_no_focus_window (MetaX11Display *x11_display,
|
|
||||||
guint32 timestamp);
|
|
||||||
|
|
||||||
#endif /* META_X11_DISPLAY_H */
|
#endif /* META_X11_DISPLAY_H */
|
||||||
|
@ -142,10 +142,12 @@ meta_window_wayland_focus (MetaWindow *window,
|
|||||||
guint32 timestamp)
|
guint32 timestamp)
|
||||||
{
|
{
|
||||||
if (meta_window_is_focusable (window))
|
if (meta_window_is_focusable (window))
|
||||||
meta_x11_display_set_input_focus_window (window->display->x11_display,
|
{
|
||||||
window,
|
meta_display_set_input_focus (window->display,
|
||||||
FALSE,
|
window,
|
||||||
timestamp);
|
FALSE,
|
||||||
|
timestamp);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -245,5 +245,8 @@ void meta_x11_display_update_focus_window (MetaX11Display *x11_display,
|
|||||||
Window xwindow,
|
Window xwindow,
|
||||||
gulong serial,
|
gulong serial,
|
||||||
gboolean focused_by_us);
|
gboolean focused_by_us);
|
||||||
|
void meta_x11_display_set_input_focus (MetaX11Display *x11_display,
|
||||||
|
Window xwindow,
|
||||||
|
guint32 timestamp);
|
||||||
|
|
||||||
#endif /* META_X11_DISPLAY_PRIVATE_H */
|
#endif /* META_X11_DISPLAY_PRIVATE_H */
|
||||||
|
@ -1838,17 +1838,11 @@ meta_x11_display_update_focus_window (MetaX11Display *x11_display,
|
|||||||
meta_x11_display_update_active_window_hint (x11_display);
|
meta_x11_display_update_active_window_hint (x11_display);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
void
|
||||||
request_xserver_input_focus_change (MetaX11Display *x11_display,
|
meta_x11_display_set_input_focus (MetaX11Display *x11_display,
|
||||||
MetaWindow *meta_window,
|
Window xwindow,
|
||||||
Window xwindow,
|
guint32 timestamp)
|
||||||
guint32 timestamp)
|
|
||||||
{
|
{
|
||||||
gulong serial;
|
|
||||||
|
|
||||||
if (meta_display_timestamp_too_old (x11_display->display, ×tamp))
|
|
||||||
return;
|
|
||||||
|
|
||||||
meta_x11_error_trap_push (x11_display);
|
meta_x11_error_trap_push (x11_display);
|
||||||
|
|
||||||
/* In order for mutter to know that the focus request succeeded, we track
|
/* In order for mutter to know that the focus request succeeded, we track
|
||||||
@ -1861,8 +1855,6 @@ request_xserver_input_focus_change (MetaX11Display *x11_display,
|
|||||||
*/
|
*/
|
||||||
XGrabServer (x11_display->xdisplay);
|
XGrabServer (x11_display->xdisplay);
|
||||||
|
|
||||||
serial = XNextRequest (x11_display->xdisplay);
|
|
||||||
|
|
||||||
XSetInputFocus (x11_display->xdisplay,
|
XSetInputFocus (x11_display->xdisplay,
|
||||||
xwindow,
|
xwindow,
|
||||||
RevertToPointerRoot,
|
RevertToPointerRoot,
|
||||||
@ -1876,27 +1868,7 @@ request_xserver_input_focus_change (MetaX11Display *x11_display,
|
|||||||
XUngrabServer (x11_display->xdisplay);
|
XUngrabServer (x11_display->xdisplay);
|
||||||
XFlush (x11_display->xdisplay);
|
XFlush (x11_display->xdisplay);
|
||||||
|
|
||||||
meta_display_update_focus_window (x11_display->display, meta_window);
|
|
||||||
meta_x11_display_update_focus_window (x11_display, xwindow, serial, TRUE);
|
|
||||||
|
|
||||||
meta_x11_error_trap_pop (x11_display);
|
meta_x11_error_trap_pop (x11_display);
|
||||||
|
|
||||||
x11_display->display->last_focus_time = timestamp;
|
|
||||||
|
|
||||||
if (meta_window == NULL || meta_window != x11_display->display->autoraise_window)
|
|
||||||
meta_display_remove_autoraise_callback (x11_display->display);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
meta_x11_display_set_input_focus_window (MetaX11Display *x11_display,
|
|
||||||
MetaWindow *window,
|
|
||||||
gboolean focus_frame,
|
|
||||||
guint32 timestamp)
|
|
||||||
{
|
|
||||||
request_xserver_input_focus_change (x11_display,
|
|
||||||
window,
|
|
||||||
focus_frame ? window->frame->xwindow : window->xwindow,
|
|
||||||
timestamp);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@ -1904,20 +1876,12 @@ meta_x11_display_set_input_focus_xwindow (MetaX11Display *x11_display,
|
|||||||
Window window,
|
Window window,
|
||||||
guint32 timestamp)
|
guint32 timestamp)
|
||||||
{
|
{
|
||||||
request_xserver_input_focus_change (x11_display,
|
gulong serial;
|
||||||
NULL,
|
|
||||||
window,
|
|
||||||
timestamp);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
meta_display_unset_input_focus (x11_display->display, timestamp);
|
||||||
meta_x11_display_focus_the_no_focus_window (MetaX11Display *x11_display,
|
serial = XNextRequest (x11_display->xdisplay);
|
||||||
guint32 timestamp)
|
meta_x11_display_set_input_focus (x11_display, window, timestamp);
|
||||||
{
|
meta_x11_display_update_focus_window (x11_display, window, serial, TRUE);
|
||||||
request_xserver_input_focus_change (x11_display,
|
|
||||||
NULL,
|
|
||||||
x11_display->no_focus_window,
|
|
||||||
timestamp);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static MetaX11DisplayLogicalMonitorData *
|
static MetaX11DisplayLogicalMonitorData *
|
||||||
|
@ -794,10 +794,10 @@ meta_window_x11_focus (MetaWindow *window,
|
|||||||
{
|
{
|
||||||
meta_topic (META_DEBUG_FOCUS,
|
meta_topic (META_DEBUG_FOCUS,
|
||||||
"Focusing frame of %s\n", window->desc);
|
"Focusing frame of %s\n", window->desc);
|
||||||
meta_x11_display_set_input_focus_window (window->display->x11_display,
|
meta_display_set_input_focus (window->display,
|
||||||
window,
|
window,
|
||||||
TRUE,
|
TRUE,
|
||||||
timestamp);
|
timestamp);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -806,10 +806,10 @@ meta_window_x11_focus (MetaWindow *window,
|
|||||||
meta_topic (META_DEBUG_FOCUS,
|
meta_topic (META_DEBUG_FOCUS,
|
||||||
"Setting input focus on %s since input = true\n",
|
"Setting input focus on %s since input = true\n",
|
||||||
window->desc);
|
window->desc);
|
||||||
meta_x11_display_set_input_focus_window (window->display->x11_display,
|
meta_display_set_input_focus (window->display,
|
||||||
window,
|
window,
|
||||||
FALSE,
|
FALSE,
|
||||||
timestamp);
|
timestamp);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (priv->wm_take_focus)
|
if (priv->wm_take_focus)
|
||||||
@ -832,8 +832,7 @@ meta_window_x11_focus (MetaWindow *window,
|
|||||||
*/
|
*/
|
||||||
if (window->display->focus_window != NULL &&
|
if (window->display->focus_window != NULL &&
|
||||||
window->display->focus_window->unmanaging)
|
window->display->focus_window->unmanaging)
|
||||||
meta_x11_display_focus_the_no_focus_window (window->display->x11_display,
|
meta_display_unset_input_focus (window->display, timestamp);
|
||||||
timestamp);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
request_take_focus (window, timestamp);
|
request_take_focus (window, timestamp);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user