Fixed bug 3410 - SDL_WINDOW_HIDDEN flag is inaccurate.

Jason Wyatt

After hiding the window, SDL_WINDOW_HIDDEN/SDL_WINDOW_SHOWN flags on a window are correctly updated. However on the next SDL_PumpEvents, they are set incorrectly.

This appears to be because X11_GetNetWMState does not check whether the _NET_WM_STATE property exists (it shouldn't on unmapped windows, see https://specifications.freedesktop.org/wm-spec/wm-spec-1.3.html#idm140130317598336). This results in an empty list of atoms for the state, which would imply that the window is not hidden.

(Seen on Fedora 24, Gnome)

--

Dan Ginsburg

More details on my proposed patch: I am on Kubuntu 16.04.2.  I ran into this same bug, but with Jason's patch I found that actualType != None was true so the SDL_WINDOW_HIDDEN would still not be set.  My fix instead is to explicitly check for whether the window is unmapped rather than relying on the returned values in XGetWindowProperty.
This commit is contained in:
Sam Lantinga 2017-07-20 10:52:43 -07:00
parent 36998b823e
commit 177f19aff0

View File

@ -225,6 +225,19 @@ X11_GetNetWMState(_THIS, Window xwindow)
if (fullscreen == 1) { if (fullscreen == 1) {
flags |= SDL_WINDOW_FULLSCREEN; flags |= SDL_WINDOW_FULLSCREEN;
} }
/* If the window is unmapped, numItems will be zero and _NET_WM_STATE_HIDDEN
* will not be set. Do an additional check to see if the window is unmapped
* and mark it as SDL_WINDOW_HIDDEN if it is.
*/
{
XWindowAttributes attr;
SDL_memset(&attr,0,sizeof(attr));
X11_XGetWindowAttributes(videodata->display, xwindow, &attr);
if (attr.map_state == IsUnmapped) {
flags |= SDL_WINDOW_HIDDEN;
}
}
X11_XFree(propertyValue); X11_XFree(propertyValue);
} }