Add SDL_HINT_VIDEO_X11_NET_WM_PING to allow disabling

_NET_WM_PING protocol handling in CreateWindow if
desired.
This commit is contained in:
Sam Lantinga 2015-10-27 11:18:04 -07:00
parent 2b0140a91f
commit 38edc1779a
2 changed files with 31 additions and 5 deletions

View File

@ -185,6 +185,20 @@ extern "C" {
*/ */
#define SDL_HINT_VIDEO_X11_XRANDR "SDL_VIDEO_X11_XRANDR" #define SDL_HINT_VIDEO_X11_XRANDR "SDL_VIDEO_X11_XRANDR"
/**
* \brief A variable controlling whether the X11 _NET_WM_PING protocol should be supported.
*
* This variable can be set to the following values:
* "0" - Disable _NET_WM_PING
* "1" - Enable _NET_WM_PING
*
* By default SDL will use _NET_WM_PING, but for applications that know they
* will not always be able to respond to ping requests in a timely manner they can
* turn it off to avoid the window manager thinking the app is hung.
* The hint is checked in CreateWindow.
*/
#define SDL_HINT_VIDEO_X11_NET_WM_PING "SDL_VIDEO_X11_NET_WM_PING"
/** /**
* \brief A variable controlling whether the window frame and title bar are interactive when the cursor is hidden * \brief A variable controlling whether the window frame and title bar are interactive when the cursor is hidden
* *

View File

@ -542,11 +542,23 @@ X11_CreateWindow(_THIS, SDL_Window * window)
(unsigned char *)&_NET_WM_BYPASS_COMPOSITOR_HINT_ON, 1); (unsigned char *)&_NET_WM_BYPASS_COMPOSITOR_HINT_ON, 1);
{ {
Atom protocols[] = { Atom protocols[2];
data->WM_DELETE_WINDOW, /* Allow window to be deleted by the WM */ int proto_count = 0;
data->_NET_WM_PING, /* Respond so WM knows we're alive */ const char *ping_hint;
};
X11_XSetWMProtocols(display, w, protocols, sizeof (protocols) / sizeof (protocols[0])); protocols[proto_count] = data->WM_DELETE_WINDOW; /* Allow window to be deleted by the WM */
proto_count++;
ping_hint = SDL_GetHint(SDL_HINT_VIDEO_X11_NET_WM_PING);
/* Default to using ping if there is no hint */
if (!ping_hint || SDL_atoi(ping_hint)) {
protocols[proto_count] = data->_NET_WM_PING; /* Respond so WM knows we're alive */
proto_count++;
}
SDL_assert(proto_count <= sizeof(protocols) / sizeof(protocols[0]));
X11_XSetWMProtocols(display, w, protocols, proto_count);
} }
if (SetupWindowData(_this, window, w, SDL_TRUE) < 0) { if (SetupWindowData(_this, window, w, SDL_TRUE) < 0) {