gtkwindow: Shuffle gdk_window_set_startup_id() calls
While this used to be tangential to windows showing or requesting focus, the xdg-activation Wayland protocol does merge both concepts together. But also, for a correct interaction with the compositor, the toolkit should ideally merge the activation request resulting from both into the same one, so that the gdk_window_focus() request replies to the startup token that started the application and correct focus-stealing prevention/etc happens, instead making up one just in time for the focus request. This kind of requires doing things in the right order, a show() request on the GtkWindow should activate any pending activation token on the toplevel, a present() request should additionally create a new token if there was none pending. And xdg_activation_v1_activate() should happen once on both. Shuffle the gdk_window_set_startup_id() calls so that this happens in the right order for Wayland, while making X11 happy too. (cherry-picked from commit e8adfa2a889cd45ee0ce0727d7eae0a61fdb7dce)
This commit is contained in:
parent
6ccd786a93
commit
2a47038635
@ -266,6 +266,8 @@ struct _GtkWindowPrivate
|
||||
|
||||
guint use_subsurface : 1;
|
||||
|
||||
guint in_present : 1;
|
||||
|
||||
GdkWindowTypeHint type_hint;
|
||||
|
||||
GtkGesture *multipress_gesture;
|
||||
@ -2563,15 +2565,12 @@ gtk_window_set_startup_id (GtkWindow *window,
|
||||
*/
|
||||
if (startup_id_is_fake (priv->startup_id))
|
||||
gtk_window_present_with_time (window, timestamp);
|
||||
else
|
||||
else
|
||||
{
|
||||
gdk_window_set_startup_id (gdk_window,
|
||||
priv->startup_id);
|
||||
|
||||
/* If window is mapped, terminate the startup-notification too */
|
||||
/* If window is mapped, terminate the startup-notification */
|
||||
if (_gtk_widget_get_mapped (widget) &&
|
||||
!disable_startup_notification)
|
||||
gdk_notify_startup_complete_with_id (priv->startup_id);
|
||||
gdk_window_set_startup_id (gdk_window, priv->startup_id);
|
||||
}
|
||||
}
|
||||
|
||||
@ -6380,7 +6379,8 @@ gtk_window_map (GtkWidget *widget)
|
||||
|
||||
gdk_window_show (gdk_window);
|
||||
|
||||
gtk_window_notify_startup (window);
|
||||
if (!priv->in_present)
|
||||
gtk_window_notify_startup (window);
|
||||
|
||||
/* if mnemonics visible is not already set
|
||||
* (as in the case of popup menus), then hide mnemonics initially
|
||||
@ -7622,8 +7622,6 @@ gtk_window_realize (GtkWidget *widget)
|
||||
gdk_x11_window_set_user_time (gdk_window, timestamp);
|
||||
}
|
||||
#endif
|
||||
if (!startup_id_is_fake (priv->startup_id))
|
||||
gdk_window_set_startup_id (gdk_window, priv->startup_id);
|
||||
}
|
||||
|
||||
#ifdef GDK_WINDOWING_X11
|
||||
@ -10605,8 +10603,12 @@ gtk_window_present_with_time (GtkWindow *window,
|
||||
else
|
||||
{
|
||||
priv->initial_timestamp = timestamp;
|
||||
priv->in_present = TRUE;
|
||||
gtk_widget_show (widget);
|
||||
priv->in_present = FALSE;
|
||||
}
|
||||
|
||||
gtk_window_notify_startup (window);
|
||||
}
|
||||
|
||||
/**
|
||||
|
Loading…
Reference in New Issue
Block a user