diff --git a/src/video/wayland/SDL_waylandwindow.c b/src/video/wayland/SDL_waylandwindow.c index cfa1c7ecc7..b630bdf975 100644 --- a/src/video/wayland/SDL_waylandwindow.c +++ b/src/video/wayland/SDL_waylandwindow.c @@ -2435,8 +2435,11 @@ void Wayland_ShowWindow(SDL_VideoDevice *_this, SDL_Window *window) Wayland_SetWindowResizable(_this, window, !!(window->flags & SDL_WINDOW_RESIZABLE)); // We're finally done putting the window together, raise if possible - if (c->activation_manager) { - /* Note that we don't check for empty strings, as that is still + if (c->activation_manager && SDL_GetHintBoolean(SDL_HINT_WINDOW_ACTIVATE_WHEN_SHOWN, true)) { + /* if the process was passed an activation token, use it when showing + * the initial window. + * + * Note that we don't check for empty strings, as that is still * considered a valid activation token! */ const char *activation_token = SDL_getenv("XDG_ACTIVATION_TOKEN"); @@ -2447,7 +2450,13 @@ void Wayland_ShowWindow(SDL_VideoDevice *_this, SDL_Window *window) // Clear this variable, per the protocol's request SDL_unsetenv_unsafe("XDG_ACTIVATION_TOKEN"); + } else { + // Try to generate an activation token for this window. + Wayland_RaiseWindow(_this, window); } + } else { + // Clear the ignored activation token, as it won't be used. + SDL_unsetenv_unsafe("XDG_ACTIVATION_TOKEN"); } // No frame callback on an external surface, as it may already have one attached. @@ -2685,9 +2694,6 @@ void Wayland_RaiseWindow(SDL_VideoDevice *_this, SDL_Window *window) xdg_activation_v1_activate(viddata->activation_manager, activation_token, wind->surface); - - // Clear this variable, per the protocol's request. - SDL_unsetenv_unsafe("XDG_ACTIVATION_TOKEN"); return; } }