If a window is created with the flag SDL_WINDOW_ALWAYS_ON_TOP it will only remain so only as long as the window is not hidden.
When the window is re-shown it :
- Will have lost this property.
- Will not be no top.
- Will require manual raising.
- Will not remain on top after being manually raised
In the example code following the following keys are active:
F1 - Create a new on top window.
F2 - Destroy the on top window.
F3 - Hide the on top window.
F4 - Show the on top window.
F5 - Manually raise the on top window.
When testing it is important to test the on top behavio(u)r by clicking on the TITLE BAR of the other window.
#include <SDL2/SDL.h>
#define SCREEN_WIDTH 640
#define SCREEN_HEIGHT 480
int main(int argc, char* args[]) {
SDL_Window *window = NULL, *ontopwin = NULL;
SDL_Renderer *renderer, *renderer2;
if (SDL_Init(SDL_INIT_VIDEO) < 0) {
fprintf(stderr, "could not initialize sdl2: %s\n", SDL_GetError());
return 1;
}
window = SDL_CreateWindow(
"Master Window",
SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED,
SCREEN_WIDTH, SCREEN_HEIGHT,
SDL_WINDOW_SHOWN
);
if (window == NULL) {
return 1;
}
renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_PRESENTVSYNC | SDL_RENDERER_ACCELERATED); // renderer not required for master window
SDL_Rect r = { 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT };
SDL_SetRenderDrawColor(renderer, 200, 200, 200, 255);
SDL_RenderFillRect(renderer, &r);
SDL_RenderPresent(renderer);
SDL_Event ev;
int running = 1;
while(running)
{
while(SDL_PollEvent(&ev))
{
switch(ev.type)
{
case SDL_KEYUP:
switch(ev.key.keysym.scancode)
{
case SDL_SCANCODE_F1:
if (ontopwin == NULL)
{
ontopwin = SDL_CreateWindow(
"Ontop Window",
SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED,
SCREEN_WIDTH/2, SCREEN_HEIGHT/2,
SDL_WINDOW_SHOWN | SDL_WINDOW_ALWAYS_ON_TOP
);
renderer2 = SDL_CreateRenderer(ontopwin, -1, SDL_RENDERER_PRESENTVSYNC | SDL_RENDERER_ACCELERATED); // renderer not required for master window
SDL_Rect r = { 0, 0, SCREEN_WIDTH/2, SCREEN_HEIGHT/2 };
SDL_SetRenderDrawColor(renderer2, 200, 200, 200, 255);
SDL_RenderFillRect(renderer2, &r);
SDL_RenderPresent(renderer2);
}
break;
case SDL_SCANCODE_F2:
if (ontopwin != NULL)
{
SDL_DestroyWindow(ontopwin);
ontopwin = NULL;
}
break;
case SDL_SCANCODE_F3:
if (ontopwin != NULL)
{
SDL_HideWindow(ontopwin);
}
break;
case SDL_SCANCODE_F4:
if (ontopwin != NULL)
{
SDL_ShowWindow(ontopwin);
SDL_Rect r = { 0, 0, SCREEN_WIDTH/2, SCREEN_HEIGHT/2 };
SDL_SetRenderDrawColor(renderer2, 200, 200, 200, 255);
SDL_RenderFillRect(renderer2, &r);
SDL_RenderPresent(renderer2);
}
break;
case SDL_SCANCODE_F5:
if (ontopwin != NULL)
{
SDL_RaiseWindow(ontopwin);
}
break;
case SDL_SCANCODE_ESCAPE:
running = 0;
break;
default:
break;
}
break;
case SDL_WINDOWEVENT:
switch(ev.window.event)
{
case SDL_WINDOWEVENT_CLOSE:
running = 0;
break;
default:
break;
}
break;
default:
break;
}
}
}
if (ontopwin != NULL) SDL_DestroyWindow(ontopwin);
SDL_DestroyWindow(window);
SDL_Quit();
return 0;
}