| Summary: | Tabbing out when cursor is within SDL window bounds and then covered up doesn't update mouse focus | ||
|---|---|---|---|
| Product: | SDL | Reporter: | Jeff <jeffp1618> |
| Component: | events | Assignee: | Ryan C. Gordon <icculus> |
| Status: | ASSIGNED --- | QA Contact: | Sam Lantinga <slouken> |
| Severity: | normal | ||
| Priority: | P2 | Keywords: | target-2.0.16 |
| Version: | don't know | ||
| Hardware: | x86_64 | ||
| OS: | Linux | ||
| Attachments: | Red cross shows where cursor is located before alt-tabbing | ||
Created attachment 4326 [details] Red cross shows where cursor is located before alt-tabbing On Linux if you have an active SDL window and the mouse is within the bounds of the window SDL_GetWindowsFlags reports SDL_WINDOW_MOUSE_FOCUS. However if while the mouse is within bounds the user alt-tabs to another applications window which overlaps the SDL window (including the current cursor position) the SDL_GetWindowsFlags continues to report SDL_WINDOW_MOUSE_FOCUS. It then doesn't update itself until the cursor leaves the bounds of the other application, and crosses into the bounds of the visible portion of the SDL Window. Using the included C code (it's fairly rudimentary as I usually access SDL from a .NET context via a C# wrapper), it shows white when the window reports Mouse Focus, and Black when it does not. The picture I have attached shows with a red cross where the cursor is before alt tabbing from the active SDL window to in this case a terminal. I have confirmed this is still an issue on the latest commit to default, running on XUbuntu 18.04 with the reported video driver being X11. #include <stdio.h> #include <SDL2/SDL.h> int main(int argc, char *argv[]) { if (SDL_Init(SDL_INIT_VIDEO|SDL_INIT_AUDIO) != 0) { SDL_Log("Unable to initialize SDL: %s", SDL_GetError()); return 1; } printf("Current: %s\n", SDL_GetCurrentVideoDriver()); SDL_Window *window = SDL_CreateWindow("Test", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 640, 480, 0); SDL_Surface *surface = NULL; surface = SDL_GetWindowSurface(window); SDL_bool poll = SDL_TRUE; while (poll) { SDL_Event event; while (SDL_PollEvent(&event)) { if (event.type == SDL_QUIT) { poll = SDL_FALSE; break; } } if (SDL_GetWindowFlags(window) & SDL_WINDOW_MOUSE_FOCUS) { SDL_FillRect(surface, NULL, SDL_MapRGB(surface->format, 0xFF, 0xFF, 0xFF)); } else { SDL_FillRect(surface, NULL, SDL_MapRGB(surface->format, 0x00, 0x00, 0x00)); } SDL_UpdateWindowSurface(window); SDL_Delay(500); } SDL_DestroyWindow(window); SDL_Quit(); return 0; }