mirror of
https://github.com/brl/mutter.git
synced 2024-12-26 21:02:14 +00:00
workspace: Only consider windows that should be showing as focusable
When selecting the default focus window, is_focusable() was not considering the new conditions for whether a window should be shown or hidden that were added to meta_window_should_be_showing() in39942974
. As a result the default focus window could end up a window already hidden or hidden once meta_window_flush_calc_showing() is called by meta_window_focus() when focusing the default window. This would cause meta_window_focus() to fail, which is an issue if it prevents us from unfocusing a window when it is getting unmanaged. Fixes:399429742
("x11: Integrate frames client into Mutter") Closes: https://gitlab.gnome.org/GNOME/mutter/-/issues/2644 Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/2962>
This commit is contained in:
parent
a86900091d
commit
6b57ab8975
@ -669,6 +669,9 @@ void meta_window_resize_frame_with_gravity (MetaWindow *window,
|
|||||||
int h,
|
int h,
|
||||||
MetaGravity gravity);
|
MetaGravity gravity);
|
||||||
|
|
||||||
|
gboolean meta_window_should_be_showing_on_workspace (MetaWindow *window,
|
||||||
|
MetaWorkspace *workspace);
|
||||||
|
|
||||||
/* Return whether the window should be currently mapped */
|
/* Return whether the window should be currently mapped */
|
||||||
gboolean meta_window_should_be_showing (MetaWindow *window);
|
gboolean meta_window_should_be_showing (MetaWindow *window);
|
||||||
|
|
||||||
|
@ -1691,10 +1691,9 @@ meta_window_showing_on_its_workspace (MetaWindow *window)
|
|||||||
}
|
}
|
||||||
|
|
||||||
gboolean
|
gboolean
|
||||||
meta_window_should_be_showing (MetaWindow *window)
|
meta_window_should_be_showing_on_workspace (MetaWindow *window,
|
||||||
|
MetaWorkspace *workspace)
|
||||||
{
|
{
|
||||||
MetaWorkspaceManager *workspace_manager = window->display->workspace_manager;
|
|
||||||
|
|
||||||
#ifdef HAVE_WAYLAND
|
#ifdef HAVE_WAYLAND
|
||||||
if (window->client_type == META_WINDOW_CLIENT_TYPE_WAYLAND)
|
if (window->client_type == META_WINDOW_CLIENT_TYPE_WAYLAND)
|
||||||
{
|
{
|
||||||
@ -1709,11 +1708,20 @@ meta_window_should_be_showing (MetaWindow *window)
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
/* Windows should be showing if they're located on the
|
/* Windows should be showing if they're located on the
|
||||||
* active workspace and they're showing on their own workspace. */
|
* workspace and they're showing on their own workspace. */
|
||||||
return (meta_window_located_on_workspace (window, workspace_manager->active_workspace) &&
|
return (meta_window_located_on_workspace (window, workspace) &&
|
||||||
meta_window_showing_on_its_workspace (window));
|
meta_window_showing_on_its_workspace (window));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
gboolean
|
||||||
|
meta_window_should_be_showing (MetaWindow *window)
|
||||||
|
{
|
||||||
|
MetaWorkspaceManager *workspace_manager = window->display->workspace_manager;
|
||||||
|
MetaWorkspace *active_workspace = workspace_manager->active_workspace;
|
||||||
|
|
||||||
|
return meta_window_should_be_showing_on_workspace (window, active_workspace);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
implement_showing (MetaWindow *window,
|
implement_showing (MetaWindow *window,
|
||||||
gboolean showing)
|
gboolean showing)
|
||||||
|
@ -1436,8 +1436,7 @@ is_focusable (MetaWindow *window,
|
|||||||
window->unmaps_pending == 0 &&
|
window->unmaps_pending == 0 &&
|
||||||
window->type != META_WINDOW_DOCK &&
|
window->type != META_WINDOW_DOCK &&
|
||||||
meta_window_is_focusable (window) &&
|
meta_window_is_focusable (window) &&
|
||||||
meta_window_located_on_workspace (window, workspace) &&
|
meta_window_should_be_showing_on_workspace (window, workspace);
|
||||||
meta_window_showing_on_its_workspace (window);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
|
Loading…
Reference in New Issue
Block a user