SDL_WINDOW_ALWAYS_ON_TOP becomes stale!

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;
}