21 #include "../../SDL_internal.h"
23 #if SDL_VIDEO_DRIVER_X11
30 #include "../SDL_sysvideo.h"
31 #include "../SDL_pixels_c.h"
39 #if SDL_VIDEO_OPENGL_EGL
46 static int X11_VideoInit(
_THIS);
47 static void X11_VideoQuit(
_THIS);
54 #if defined(__LINUX__) || defined(__FREEBSD__)
67 #if defined(__LINUX__) || defined(__FREEBSD__)
68 #if defined(__LINUX__)
70 #elif defined(__FREEBSD__)
74 #error Where can we find the executable name?
76 linksize = readlink(procfile, linkfile,
sizeof(linkfile) - 1);
78 linkfile[linksize] =
'\0';
97 Display *display =
NULL;
99 display = X11_XOpenDisplay(
NULL);
100 if (display !=
NULL) {
101 X11_XCloseDisplay(display);
105 return (display !=
NULL);
116 X11_XCloseDisplay(data->
display);
127 static int (*orig_x11_errhandler) (Display *, XErrorEvent *) =
NULL;
129 X11_SafetyNetErrHandler(Display *
d, XErrorEvent *
e)
133 if (!safety_net_triggered) {
136 if (device !=
NULL) {
148 if (orig_x11_errhandler !=
NULL) {
149 return orig_x11_errhandler(d, e);
156 X11_CreateDevice(
int devindex)
160 const char *display =
NULL;
194 data->
display = X11_XOpenDisplay(display);
195 #ifdef SDL_VIDEO_DRIVER_X11_DYNAMIC
205 data->
display = X11_XOpenDisplay(display);
215 X11_XSynchronize(data->
display, True);
220 orig_x11_errhandler = X11_XSetErrorHandler(X11_SafetyNetErrHandler);
269 #if SDL_VIDEO_OPENGL_GLX
279 #elif SDL_VIDEO_OPENGL_EGL
298 device->
free = X11_DeleteDevice;
311 "x11",
"SDL X11 video driver",
312 X11_Available, X11_CreateDevice
315 static int (*handler) (Display *, XErrorEvent *) =
NULL;
317 X11_CheckWindowManagerErrorHandler(Display * d, XErrorEvent * e)
319 if (e->error_code == BadWindow) {
322 return (handler(d, e));
327 X11_CheckWindowManager(
_THIS)
330 Display *display = data->
display;
331 Atom _NET_SUPPORTING_WM_CHECK;
332 int status, real_format;
334 unsigned long items_read = 0, items_left = 0;
335 unsigned char *propdata =
NULL;
336 Window wm_window = 0;
337 #ifdef DEBUG_WINDOW_MANAGER
342 X11_XSync(display, False);
343 handler = X11_XSetErrorHandler(X11_CheckWindowManagerErrorHandler);
345 _NET_SUPPORTING_WM_CHECK = X11_XInternAtom(display,
"_NET_SUPPORTING_WM_CHECK", False);
346 status = X11_XGetWindowProperty(display, DefaultRootWindow(display), _NET_SUPPORTING_WM_CHECK, 0L, 1L, False, XA_WINDOW, &real_type, &real_format, &items_read, &items_left, &propdata);
347 if (status == Success) {
349 wm_window = ((Window*)propdata)[0];
358 status = X11_XGetWindowProperty(display, wm_window, _NET_SUPPORTING_WM_CHECK, 0L, 1L, False, XA_WINDOW, &real_type, &real_format, &items_read, &items_left, &propdata);
359 if (status != Success || !items_read || wm_window != ((Window*)propdata)[0]) {
362 if (status == Success && propdata) {
369 X11_XSync(display, False);
370 X11_XSetErrorHandler(handler);
373 #ifdef DEBUG_WINDOW_MANAGER
374 printf(
"Couldn't get _NET_SUPPORTING_WM_CHECK property\n");
380 #ifdef DEBUG_WINDOW_MANAGER
382 printf(
"Window manager: %s\n", wm_name);
397 data->
pid = getpid();
403 #define GET_ATOM(X) data->X = X11_XInternAtom(data->display, #X, False)
439 X11_CheckWindowManager(_this);
471 #ifdef X_HAVE_UTF8_STRING
473 X11_XCloseIM(data->
im);