Compare commits

...

4 Commits

Author SHA1 Message Date
Alexander Mikhaylenko
0c03702168 window: Appear as focused while focusing
Prevent focused window from blinking after switching to another
workspace on X11.

https://gitlab.gnome.org/GNOME/mutter/merge_requests/850
2020-07-07 20:49:55 +00:00
Alexander Mikhaylenko
03514bb31a window: Make default focus window on each workspace appear focused
Makes workspace transitions in gnome-shell look more seamless, since
both outgoing and incoming workspace have focused windows.

This is only done for click focus mode, since it's not known which
window would be focused for the other modes.

https://gitlab.gnome.org/GNOME/mutter/merge_requests/850
2020-07-07 20:49:55 +00:00
Alexander Mikhaylenko
697b84e80e workspace: Add meta_workspace_get_default_focus_window()
This will be used in the next commit to make this window appear focused.

https://gitlab.gnome.org/GNOME/mutter/merge_requests/850
2020-07-07 20:49:54 +00:00
Alexander Mikhaylenko
5fd90e85ed stack: Check workspace in get_default_focus_window()
Check against the window argument, instead of active workspace.

https://gitlab.gnome.org/GNOME/mutter/merge_requests/850
2020-07-07 20:49:54 +00:00
5 changed files with 76 additions and 6 deletions

View File

@ -34,6 +34,7 @@
#include "core/frame.h"
#include "core/main-private.h"
#include "core/meta-workspace-manager-private.h"
#include "core/workspace-private.h"
#include "core/window-private.h"
#include "meta/group.h"
#include "meta/prefs.h"
@ -1016,7 +1017,8 @@ window_contains_point (MetaWindow *window,
}
static gboolean
window_can_get_default_focus (MetaWindow *window)
window_can_get_default_focus (MetaWindow *window,
MetaWorkspace *workspace)
{
if (window->unmaps_pending > 0)
return FALSE;
@ -1027,7 +1029,10 @@ window_can_get_default_focus (MetaWindow *window)
if (!meta_window_is_focusable (window))
return FALSE;
if (!meta_window_should_be_showing (window))
if (!meta_window_showing_on_its_workspace (window))
return FALSE;
if (!meta_window_located_on_workspace (window, workspace))
return FALSE;
if (window->type == META_WINDOW_DOCK)
@ -1063,7 +1068,7 @@ get_default_focus_window (MetaStack *stack,
if (window == not_this_one)
continue;
if (!window_can_get_default_focus (window))
if (!window_can_get_default_focus (window, workspace))
continue;
if (must_be_at_point && !window_contains_point (window, root_x, root_y))
@ -1134,7 +1139,7 @@ meta_stack_get_default_focus_candidates (MetaStack *stack,
{
GList *next = l->next;
if (!window_can_get_default_focus (l->data))
if (!window_can_get_default_focus (l->data, workspace))
windows = g_list_delete_link (windows, l);
l = next;

View File

@ -550,6 +550,9 @@ struct _MetaWindow
guint unmanage_idle_id;
pid_t client_pid;
/* Prevent blinking when focusing */
gboolean focusing;
};
struct _MetaWindowClass
@ -704,6 +707,8 @@ void meta_window_get_session_geometry (MetaWindow *window,
void meta_window_update_unfocused_button_grabs (MetaWindow *window);
void meta_window_appears_focused_changed (MetaWindow *window);
void meta_window_set_focused_internal (MetaWindow *window,
gboolean focused);

View File

@ -251,6 +251,10 @@ prefs_changed_callback (MetaPreference pref,
meta_window_recalc_features (window);
meta_window_queue (window, META_QUEUE_MOVE_RESIZE);
}
else if (pref == META_PREF_FOCUS_MODE)
{
meta_window_appears_focused_changed (window);
}
}
static void
@ -4778,6 +4782,10 @@ meta_window_focus (MetaWindow *window,
window = modal_transient;
}
/* If the window was already appearing focused, but didn't have has_focus set,
* it will now briefly appear unfocused on X11. Set a flag to prevent that. */
window->focusing = TRUE;
meta_window_flush_calc_showing (window);
if ((!window->mapped || window->hidden) && !window->shaded)
@ -4785,6 +4793,7 @@ meta_window_focus (MetaWindow *window,
meta_topic (META_DEBUG_FOCUS,
"Window %s is not showing, not focusing after all\n",
window->desc);
window->focusing = FALSE;
return;
}
@ -4872,6 +4881,9 @@ set_workspace_state (MetaWindow *window,
}
}
if (!window->constructing)
meta_window_appears_focused_changed (window);
/* queue a move_resize since changing workspaces may change
* the relevant struts
*/
@ -5171,7 +5183,7 @@ meta_window_change_workspace_by_index (MetaWindow *window,
meta_window_change_workspace (window, workspace);
}
static void
void
meta_window_appears_focused_changed (MetaWindow *window)
{
set_net_wm_state (window);
@ -5267,6 +5279,8 @@ meta_window_set_focused_internal (MetaWindow *window,
{
MetaWorkspaceManager *workspace_manager = window->display->workspace_manager;
window->focusing = FALSE;
if (focused)
{
window->has_focus = TRUE;
@ -7255,7 +7269,17 @@ meta_window_get_frame (MetaWindow *window)
gboolean
meta_window_appears_focused (MetaWindow *window)
{
return window->has_focus || (window->attached_focus_window != NULL);
MetaWorkspaceManager *workspace_manager;
MetaWorkspace *workspace;
MetaWindow *default_window = NULL;
workspace_manager = window->display->workspace_manager;
workspace = meta_window_get_workspace (window);
if (workspace && workspace != workspace_manager->active_workspace)
default_window = meta_workspace_get_default_focus_window (workspace);
return window->has_focus || window->focusing || (window->attached_focus_window != NULL) || (window == default_window);
}
gboolean

View File

@ -92,6 +92,7 @@ GList* meta_workspace_get_onscreen_region (MetaWorkspace *workspace);
GList * meta_workspace_get_onmonitor_region (MetaWorkspace *workspace,
MetaLogicalMonitor *logical_monitor);
MetaWindow* meta_workspace_get_default_focus_window (MetaWorkspace *workspace);
void meta_workspace_focus_default_window (MetaWorkspace *workspace,
MetaWindow *not_this_one,
guint32 timestamp);

View File

@ -365,10 +365,27 @@ meta_workspace_remove (MetaWorkspace *workspace)
*/
}
static void
workspace_default_focus_changed (MetaWorkspace *workspace,
MetaWindow *not_this_one)
{
GSList *windows, *l;
windows = meta_display_list_windows (workspace->display, META_LIST_DEFAULT);
for (l = windows; l; l = l->next) {
MetaWindow *window = META_WINDOW (l->data);
if (meta_window_located_on_workspace (window, workspace) && window != not_this_one)
meta_window_appears_focused_changed (window);
}
}
void
meta_workspace_add_window (MetaWorkspace *workspace,
MetaWindow *window)
{
MetaWorkspaceManager *manager = workspace->display->workspace_manager;
COGL_TRACE_BEGIN_SCOPED (MetaWorkspaceAddWindow,
"Workspace (add window)");
@ -385,6 +402,9 @@ meta_workspace_add_window (MetaWorkspace *workspace,
meta_workspace_invalidate_work_area (workspace);
}
if (workspace != manager->active_workspace)
workspace_default_focus_changed (workspace, window);
g_signal_emit (workspace, signals[WINDOW_ADDED], 0, window);
g_object_notify_by_pspec (G_OBJECT (workspace), obj_props[PROP_N_WINDOWS]);
}
@ -393,6 +413,8 @@ void
meta_workspace_remove_window (MetaWorkspace *workspace,
MetaWindow *window)
{
MetaWorkspaceManager *manager = workspace->display->workspace_manager;
COGL_TRACE_BEGIN_SCOPED (MetaWorkspaceRemoveWindow,
"Workspace (remove window)");
@ -409,6 +431,9 @@ meta_workspace_remove_window (MetaWorkspace *workspace,
meta_workspace_invalidate_work_area (workspace);
}
if (workspace != manager->active_workspace)
workspace_default_focus_changed (workspace, window);
g_signal_emit (workspace, signals[WINDOW_REMOVED], 0, window);
g_object_notify (G_OBJECT (workspace), "n-windows");
}
@ -657,6 +682,7 @@ meta_workspace_activate_with_focus (MetaWorkspace *workspace,
if (focus_this)
{
meta_window_activate (focus_this, timestamp);
workspace_default_focus_changed (workspace, focus_this);
}
else if (move_window)
{
@ -1281,6 +1307,15 @@ meta_workspace_get_name (MetaWorkspace *workspace)
return meta_prefs_get_workspace_name (meta_workspace_index (workspace));
}
MetaWindow *
meta_workspace_get_default_focus_window (MetaWorkspace *workspace)
{
if (meta_prefs_get_focus_mode () == G_DESKTOP_FOCUS_MODE_CLICK)
return meta_stack_get_default_focus_window (workspace->display->stack, workspace, NULL);
return NULL;
}
void
meta_workspace_focus_default_window (MetaWorkspace *workspace,
MetaWindow *not_this_one,