summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Mikhaylenko <exalm7659@gmail.com>2019-10-12 23:55:26 +0500
committerAlexander Mikhaylenko <exalm7659@gmail.com>2021-03-01 15:38:08 +0500
commit811d853a5da8d0327d795d83b48d2bc208428dbd (patch)
treeb9857e4ad63f6f6f22ba289e6304a57e9ad5d2a9
parentd69a190ef0e5c4292a78fca6dfe49a50d29a8021 (diff)
downloadmutter-wip/exalm/focused-appearance.tar.gz
window: Make default focus window on each workspace appear focusedwip/exalm/focused-appearance
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.
-rw-r--r--src/core/window-private.h2
-rw-r--r--src/core/window.c20
-rw-r--r--src/core/workspace.c31
3 files changed, 51 insertions, 2 deletions
diff --git a/src/core/window-private.h b/src/core/window-private.h
index d1730c988..7e9274d6b 100644
--- a/src/core/window-private.h
+++ b/src/core/window-private.h
@@ -717,6 +717,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);
diff --git a/src/core/window.c b/src/core/window.c
index d99db949f..8f3ddcc81 100644
--- a/src/core/window.c
+++ b/src/core/window.c
@@ -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
@@ -4911,6 +4915,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
*/
@@ -5210,7 +5217,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);
@@ -7312,7 +7319,16 @@ 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;
+
+ workspace_manager = window->display->workspace_manager;
+ workspace = meta_window_get_workspace (window);
+
+ if (workspace && workspace != workspace_manager->active_workspace)
+ return window == meta_workspace_get_default_focus_window (workspace);
+ else
+ return window->has_focus || window->attached_focus_window;
}
gboolean
diff --git a/src/core/workspace.c b/src/core/workspace.c
index 83795cab9..347dc8990 100644
--- a/src/core/workspace.c
+++ b/src/core/workspace.c
@@ -365,15 +365,37 @@ meta_workspace_remove (MetaWorkspace *workspace)
*/
}
+static void
+update_workspace_default_focus (MetaWorkspace *workspace,
+ MetaWindow *not_this_one)
+{
+ g_autoptr (GSList) windows = NULL;
+ GSList *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 *workspace_manager;
+
g_return_if_fail (g_list_find (workspace->mru_list, window) == NULL);
COGL_TRACE_BEGIN_SCOPED (MetaWorkspaceAddWindow,
"Workspace (add window)");
+ workspace_manager = workspace->display->workspace_manager;
+
workspace->mru_list = g_list_prepend (workspace->mru_list, window);
workspace->windows = g_list_prepend (workspace->windows, window);
@@ -386,6 +408,9 @@ meta_workspace_add_window (MetaWorkspace *workspace,
meta_workspace_invalidate_work_area (workspace);
}
+ if (workspace != workspace_manager->active_workspace)
+ update_workspace_default_focus (workspace, window);
+
g_signal_emit (workspace, signals[WINDOW_ADDED], 0, window);
g_object_notify_by_pspec (G_OBJECT (workspace), obj_props[PROP_N_WINDOWS]);
}
@@ -394,6 +419,8 @@ void
meta_workspace_remove_window (MetaWorkspace *workspace,
MetaWindow *window)
{
+ MetaWorkspaceManager *workspace_manager = workspace->display->workspace_manager;
+
COGL_TRACE_BEGIN_SCOPED (MetaWorkspaceRemoveWindow,
"Workspace (remove window)");
@@ -410,6 +437,9 @@ meta_workspace_remove_window (MetaWorkspace *workspace,
meta_workspace_invalidate_work_area (workspace);
}
+ if (workspace != workspace_manager->active_workspace)
+ update_workspace_default_focus (workspace, window);
+
g_signal_emit (workspace, signals[WINDOW_REMOVED], 0, window);
g_object_notify (G_OBJECT (workspace), "n-windows");
}
@@ -658,6 +688,7 @@ meta_workspace_activate_with_focus (MetaWorkspace *workspace,
if (focus_this)
{
meta_window_activate (focus_this, timestamp);
+ update_workspace_default_focus (workspace, focus_this);
}
else if (move_window)
{