21 #include "../../SDL_internal.h" 23 #if SDL_VIDEO_DRIVER_X11 29 #include "../SDL_sysvideo.h" 30 #include "../SDL_pixels_c.h" 38 #if SDL_VIDEO_OPENGL_EGL 43 static int X11_VideoInit(
_THIS);
44 static void X11_VideoQuit(
_THIS);
51 #if defined(__LINUX__) || defined(__FREEBSD__) 64 #if defined(__LINUX__) || defined(__FREEBSD__) 65 #if defined(__LINUX__) 67 #elif defined(__FREEBSD__) 71 #error Where can we find the executable name? 73 linksize = readlink(procfile, linkfile,
sizeof(linkfile) - 1);
75 linkfile[linksize] =
'\0';
94 Display *display =
NULL;
96 display = X11_XOpenDisplay(
NULL);
97 if (display !=
NULL) {
98 X11_XCloseDisplay(display);
102 return (display !=
NULL);
110 X11_XCloseDisplay(data->
display);
121 static int (*orig_x11_errhandler) (Display *, XErrorEvent *) =
NULL;
123 X11_SafetyNetErrHandler(Display *
d, XErrorEvent *
e)
127 if (!safety_net_triggered) {
130 if (device !=
NULL) {
142 if (orig_x11_errhandler !=
NULL) {
143 return orig_x11_errhandler(d, e);
150 X11_CreateDevice(
int devindex)
154 const char *display =
NULL;
186 data->
display = X11_XOpenDisplay(display);
187 #if defined(__osf__) && defined(SDL_VIDEO_DRIVER_X11_DYNAMIC) 197 data->
display = X11_XOpenDisplay(display);
207 X11_XSynchronize(data->
display, True);
212 orig_x11_errhandler = X11_XSetErrorHandler(X11_SafetyNetErrHandler);
253 #if SDL_VIDEO_OPENGL_GLX 263 #elif SDL_VIDEO_OPENGL_EGL 282 device->
free = X11_DeleteDevice;
288 "x11",
"SDL X11 video driver",
289 X11_Available, X11_CreateDevice
292 static int (*handler) (Display *, XErrorEvent *) =
NULL;
294 X11_CheckWindowManagerErrorHandler(Display * d, XErrorEvent * e)
296 if (e->error_code == BadWindow) {
299 return (handler(d, e));
304 X11_CheckWindowManager(
_THIS)
307 Display *display = data->
display;
308 Atom _NET_SUPPORTING_WM_CHECK;
309 int status, real_format;
311 unsigned long items_read = 0, items_left = 0;
312 unsigned char *propdata =
NULL;
313 Window wm_window = 0;
314 #ifdef DEBUG_WINDOW_MANAGER
319 X11_XSync(display, False);
320 handler = X11_XSetErrorHandler(X11_CheckWindowManagerErrorHandler);
322 _NET_SUPPORTING_WM_CHECK = X11_XInternAtom(display,
"_NET_SUPPORTING_WM_CHECK", False);
323 status = X11_XGetWindowProperty(display, DefaultRootWindow(display), _NET_SUPPORTING_WM_CHECK, 0L, 1L, False, XA_WINDOW, &real_type, &real_format, &items_read, &items_left, &propdata);
324 if (status == Success) {
326 wm_window = ((Window*)propdata)[0];
335 status = X11_XGetWindowProperty(display, wm_window, _NET_SUPPORTING_WM_CHECK, 0L, 1L, False, XA_WINDOW, &real_type, &real_format, &items_read, &items_left, &propdata);
336 if (status != Success || !items_read || wm_window != ((Window*)propdata)[0]) {
339 if (status == Success && propdata) {
346 X11_XSync(display, False);
347 X11_XSetErrorHandler(handler);
350 #ifdef DEBUG_WINDOW_MANAGER 351 printf(
"Couldn't get _NET_SUPPORTING_WM_CHECK property\n");
357 #ifdef DEBUG_WINDOW_MANAGER 359 printf(
"Window manager: %s\n", wm_name);
374 data->
pid = getpid();
377 #ifdef X_HAVE_UTF8_STRING 378 if (SDL_X11_HAVE_UTF8) {
385 #define GET_ATOM(X) data->X = X11_XInternAtom(data->display, #X, False) 414 X11_CheckWindowManager(
_this);
442 #ifdef X_HAVE_UTF8_STRING 444 X11_XCloseIM(data->
im);
void X11_PumpEvents(_THIS)
int(* GetDisplayDPI)(_THIS, SDL_VideoDisplay *display, float *ddpi, float *hdpi, float *vdpi)
int X11_SetWindowHitTest(SDL_Window *window, SDL_bool enabled)
Atom _NET_WM_STATE_FULLSCREEN
int X11_ResizeWindowShape(SDL_Window *window)
Atom _NET_WM_ALLOWED_ACTIONS
void(* RestoreWindow)(_THIS, SDL_Window *window)
void X11_SetWindowTitle(_THIS, SDL_Window *window)
int X11_CreateWindowFramebuffer(_THIS, SDL_Window *window, Uint32 *format, void **pixels, int *pitch)
int(* SetWindowHitTest)(SDL_Window *window, SDL_bool enabled)
SDL_PRINTF_FORMAT_STRING const char int SDL_PRINTF_FORMAT_STRING const char int SDL_PRINTF_FORMAT_STRING const char int SDL_PRINTF_FORMAT_STRING const char const char SDL_SCANF_FORMAT_STRING const char return SDL_ThreadFunction const char void return Uint32 return Uint32 SDL_AssertionHandler void SDL_SpinLock SDL_atomic_t int int return SDL_atomic_t return void void void return void return int return SDL_AudioSpec SDL_AudioSpec return int int return return int SDL_RWops int SDL_AudioSpec Uint8 Uint32 * e
int X11_SetDisplayMode(_THIS, SDL_VideoDisplay *display, SDL_DisplayMode *mode)
Atom _NET_WM_STATE_MAXIMIZED_VERT
char * X11_GetClipboardText(_THIS)
void X11_QuitKeyboard(_THIS)
void X11_SetTextInputRect(_THIS, SDL_Rect *rect)
int(* CreateWindowFrom)(_THIS, SDL_Window *window, const void *data)
struct wl_display * display
int X11_SetWindowShape(SDL_WindowShaper *shaper, SDL_Surface *shape, SDL_WindowShapeMode *shapeMode)
SDL_bool X11_UseDirectColorVisuals(void)
int(* GL_SetSwapInterval)(_THIS, int interval)
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
void(* ShowWindow)(_THIS, SDL_Window *window)
The structure that defines a display mode.
SDL_WindowData ** windowlist
void X11_StartTextInput(_THIS)
void(* StartTextInput)(_THIS)
void(* SetWindowSize)(_THIS, SDL_Window *window)
int X11_UpdateWindowFramebuffer(_THIS, SDL_Window *window, const SDL_Rect *rects, int numrects)
void X11_SetWindowFullscreen(_THIS, SDL_Window *window, SDL_VideoDisplay *display, SDL_bool fullscreen)
void X11_MinimizeWindow(_THIS, SDL_Window *window)
void(* GL_SwapWindow)(_THIS, SDL_Window *window)
void X11_InitMouse(_THIS)
void X11_DestroyWindowFramebuffer(_THIS, SDL_Window *window)
int(* GL_LoadLibrary)(_THIS, const char *path)
void X11_MaximizeWindow(_THIS, SDL_Window *window)
int(* SetDisplayMode)(_THIS, SDL_VideoDisplay *display, SDL_DisplayMode *mode)
void(* SetWindowBordered)(_THIS, SDL_Window *window, SDL_bool bordered)
int X11_GetDisplayBounds(_THIS, SDL_VideoDisplay *sdl_display, SDL_Rect *rect)
static SDL_VideoDevice * _this
void(* HideWindow)(_THIS, SDL_Window *window)
void(* RaiseWindow)(_THIS, SDL_Window *window)
int(* SetWindowShape)(SDL_WindowShaper *shaper, SDL_Surface *shape, SDL_WindowShapeMode *shape_mode)
Atom _NET_WM_STATE_HIDDEN
void(* SetTextInputRect)(_THIS, SDL_Rect *rect)
void * SDL_calloc(size_t nmemb, size_t size)
SDL_bool X11_HasClipboardText(_THIS)
SDL_bool(* GetWindowWMInfo)(_THIS, SDL_Window *window, struct SDL_SysWMinfo *info)
int X11_CreateWindow(_THIS, SDL_Window *window)
void X11_GetDisplayModes(_THIS, SDL_VideoDisplay *display)
SDL_GLContext(* GL_CreateContext)(_THIS, SDL_Window *window)
void X11_SuspendScreenSaver(_THIS)
SDL_PRINTF_FORMAT_STRING const char int SDL_PRINTF_FORMAT_STRING const char int SDL_PRINTF_FORMAT_STRING const char int SDL_PRINTF_FORMAT_STRING const char const char SDL_SCANF_FORMAT_STRING const char return SDL_ThreadFunction const char void return Uint32 return Uint32 SDL_AssertionHandler void SDL_SpinLock SDL_atomic_t int int return SDL_atomic_t return void void void return void return int return SDL_AudioSpec SDL_AudioSpec return int int return return int SDL_RWops int SDL_AudioSpec Uint8 ** d
int X11_SetWindowGammaRamp(_THIS, SDL_Window *window, const Uint16 *ramp)
int(* GL_MakeCurrent)(_THIS, SDL_Window *window, SDL_GLContext context)
int X11_CreateWindowFrom(_THIS, SDL_Window *window, const void *data)
int SDL_X11_LoadSymbols(void)
void(* SetWindowMinimumSize)(_THIS, SDL_Window *window)
int X11_GetDisplayDPI(_THIS, SDL_VideoDisplay *sdl_display, float *ddpi, float *hdpi, float *vdpi)
SDL_DisplayMode current_mode
void X11_RestoreWindow(_THIS, SDL_Window *window)
SDL_VideoDisplay * displays
int(* GetDisplayBounds)(_THIS, SDL_VideoDisplay *display, SDL_Rect *rect)
void(* DestroyWindow)(_THIS, SDL_Window *window)
void(* StopTextInput)(_THIS)
Atom _NET_WM_ACTION_FULLSCREEN
void(* SetWindowIcon)(_THIS, SDL_Window *window, SDL_Surface *icon)
void X11_ShowWindow(_THIS, SDL_Window *window)
void X11_DestroyWindow(_THIS, SDL_Window *window)
void X11_QuitMouse(_THIS)
SDL_WindowShaper * X11_CreateShaper(SDL_Window *window)
int X11_SetClipboardText(_THIS, const char *text)
void(* DestroyWindowFramebuffer)(_THIS, SDL_Window *window)
void(* GL_UnloadLibrary)(_THIS)
return Display return Display Bool Bool int int int return Display XEvent Bool(*) XPointer return Display return Display Drawable _Xconst char unsigned int unsigned int return Display Pixmap Pixmap XColor XColor unsigned int unsigned int return Display _Xconst char char int char return Display Visual unsigned int int int char unsigned int unsigned int in i)
void(* GetDisplayModes)(_THIS, SDL_VideoDisplay *display)
void X11_SetWindowMinimumSize(_THIS, SDL_Window *window)
void(* SetWindowMaximumSize)(_THIS, SDL_Window *window)
#define SDL_OutOfMemory()
SDL_DisplayMode desktop_mode
Atom _NET_WM_STATE_MAXIMIZED_HORZ
void X11_StopTextInput(_THIS)
SDL_WindowShaper *(* CreateShaper)(SDL_Window *window)
int(* ResizeWindowShape)(SDL_Window *window)
int X11_InitKeyboard(_THIS)
void X11_QuitModes(_THIS)
void(* SetWindowPosition)(_THIS, SDL_Window *window)
int(* CreateWindow)(_THIS, SDL_Window *window)
void(* MinimizeWindow)(_THIS, SDL_Window *window)
Atom _NET_WM_STATE_FOCUSED
void X11_RaiseWindow(_THIS, SDL_Window *window)
void X11_InitTouch(_THIS)
void X11_SetWindowIcon(_THIS, SDL_Window *window, SDL_Surface *icon)
char * X11_GetWindowTitle(_THIS, Window xwindow)
SDL_bool(* HasClipboardText)(_THIS)
SDL_VideoDevice * SDL_GetVideoDevice(void)
SDL_ShapeDriver shape_driver
#define SDL_arraysize(array)
void(* SetWindowFullscreen)(_THIS, SDL_Window *window, SDL_VideoDisplay *display, SDL_bool fullscreen)
int(* UpdateWindowFramebuffer)(_THIS, SDL_Window *window, const SDL_Rect *rects, int numrects)
void SDL_X11_UnloadSymbols(void)
void(* GL_DeleteContext)(_THIS, SDL_GLContext context)
char *(* GetClipboardText)(_THIS)
void X11_SetWindowSize(_THIS, SDL_Window *window)
void(* SetWindowTitle)(_THIS, SDL_Window *window)
int(* GL_GetSwapInterval)(_THIS)
void(* MaximizeWindow)(_THIS, SDL_Window *window)
int(* SetClipboardText)(_THIS, const char *text)
int(* SetWindowGammaRamp)(_THIS, SDL_Window *window, const Uint16 *ramp)
void X11_SetWindowBordered(_THIS, SDL_Window *window, SDL_bool bordered)
void X11_HideWindow(_THIS, SDL_Window *window)
void(* SuspendScreenSaver)(_THIS)
void(* SetWindowGrab)(_THIS, SDL_Window *window, SDL_bool grabbed)
void X11_SetWindowGrab(_THIS, SDL_Window *window, SDL_bool grabbed)
int(* CreateWindowFramebuffer)(_THIS, SDL_Window *window, Uint32 *format, void **pixels, int *pitch)
void *(* GL_GetProcAddress)(_THIS, const char *proc)
SDL_bool X11_GetWindowWMInfo(_THIS, SDL_Window *window, struct SDL_SysWMinfo *info)
void X11_SetWindowMaximumSize(_THIS, SDL_Window *window)
void X11_QuitTouch(_THIS)
void(* PumpEvents)(_THIS)
void X11_SetWindowPosition(_THIS, SDL_Window *window)