window: Set the initial suspend state to 'hidden'

Instead of initializing to 'suspended', which will send the `SUSPENDED`
xdg_toplevel state, set it to hidden at first. If the window is placed
on an inactive workspace, it'll eventually enter the 'suspended' state,
but will have had some time in non-suspended state to get map, even if
not visibly.

This fixes inital suspended state when mapping a window maximized.

Closes: https://gitlab.gnome.org/GNOME/mutter/-/issues/3229
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3475>
This commit is contained in:
Jonas Ådahl
2024-04-17 16:38:25 +02:00
committed by Marge Bot
parent cf176df006
commit 73990f011f
4 changed files with 269 additions and 9 deletions

View File

@ -168,6 +168,8 @@ static MetaWindow * meta_window_find_tile_match (MetaWindow *window,
MetaTileMode mode);
static void update_edge_constraints (MetaWindow *window);
static void set_hidden_suspended_state (MetaWindow *window);
static void initable_iface_init (GInitableIface *initable_iface);
typedef struct _MetaWindowPrivate
@ -713,9 +715,6 @@ meta_window_class_init (MetaWindowClass *klass)
static void
meta_window_init (MetaWindow *window)
{
MetaWindowPrivate *priv = meta_window_get_instance_private (window);
priv->suspend_state = META_WINDOW_SUSPEND_STATE_SUSPENDED;
window->stamp = next_window_stamp++;
meta_prefs_add_listener (prefs_changed_callback, window);
window->is_alive = TRUE;
@ -991,6 +990,7 @@ static void
meta_window_constructed (GObject *object)
{
MetaWindow *window = META_WINDOW (object);
MetaWindowPrivate *priv = meta_window_get_instance_private (window);
MetaDisplay *display = window->display;
MetaContext *context = meta_display_get_context (display);
MetaBackend *backend = meta_context_get_backend (context);
@ -1343,6 +1343,11 @@ meta_window_constructed (GObject *object)
!window->initially_iconic)
unminimize_window_and_all_transient_parents (window);
/* There is a slim chance we'll hit time out before a extremely slow client
* managed to become active, but unlikely enough. */
priv->suspend_state = META_WINDOW_SUSPEND_STATE_HIDDEN;
set_hidden_suspended_state (window);
window->constructing = FALSE;
}
@ -2164,6 +2169,19 @@ enter_suspend_state_cb (gpointer user_data)
return G_SOURCE_REMOVE;
}
static void
set_hidden_suspended_state (MetaWindow *window)
{
MetaWindowPrivate *priv = meta_window_get_instance_private (window);
priv->suspend_state = META_WINDOW_SUSPEND_STATE_HIDDEN;
g_return_if_fail (!priv->suspend_timoeut_id);
priv->suspend_timoeut_id =
g_timeout_add_seconds (SUSPEND_HIDDEN_TIMEOUT_S,
enter_suspend_state_cb,
window);
}
static void
update_suspend_state (MetaWindow *window)
{
@ -2181,13 +2199,8 @@ update_suspend_state (MetaWindow *window)
}
else if (priv->suspend_state == META_WINDOW_SUSPEND_STATE_ACTIVE)
{
priv->suspend_state = META_WINDOW_SUSPEND_STATE_HIDDEN;
set_hidden_suspended_state (window);
g_object_notify_by_pspec (G_OBJECT (window), obj_props[PROP_SUSPEND_STATE]);
g_return_if_fail (!priv->suspend_timoeut_id);
priv->suspend_timoeut_id =
g_timeout_add_seconds (SUSPEND_HIDDEN_TIMEOUT_S,
enter_suspend_state_cb,
window);
}
}