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:
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user