23 #if SDL_VIDEO_DRIVER_X11
29 #include "../SDL_sysvideo.h"
30 #include "../SDL_pixels_c.h"
38 #if SDL_VIDEO_OPENGL_EGL
46 static const char *dbus_library =
"libdbus-1.so.3";
47 static void *dbus_handle =
NULL;
51 load_dbus_sym(
const char *fn,
void **
addr)
63 static DBusConnection *(*DBUS_dbus_bus_get_private)(DBusBusType, DBusError *) =
NULL;
64 static void (*DBUS_dbus_connection_set_exit_on_disconnect)(DBusConnection *, dbus_bool_t) =
NULL;
65 static dbus_bool_t (*DBUS_dbus_connection_send)(DBusConnection *, DBusMessage *, dbus_uint32_t *) =
NULL;
66 static void (*DBUS_dbus_connection_close)(DBusConnection *) =
NULL;
67 static void (*DBUS_dbus_connection_unref)(DBusConnection *) =
NULL;
68 static void (*DBUS_dbus_connection_flush)(DBusConnection *) =
NULL;
69 static DBusMessage *(*DBUS_dbus_message_new_method_call)(
const char *,
const char *,
const char *,
const char *) =
NULL;
70 static void (*DBUS_dbus_message_unref)(DBusMessage *) =
NULL;
71 static void (*DBUS_dbus_error_init)(DBusError *) =
NULL;
72 static dbus_bool_t (*DBUS_dbus_error_is_set)(
const DBusError *) =
NULL;
73 static void (*DBUS_dbus_error_free)(DBusError *) =
NULL;
79 #define SDL_DBUS_SYM(x) \
80 if (!load_dbus_sym(#x, (void **) (char *) &DBUS_##x)) return -1
82 SDL_DBUS_SYM(dbus_bus_get_private);
83 SDL_DBUS_SYM(dbus_connection_set_exit_on_disconnect);
84 SDL_DBUS_SYM(dbus_connection_send);
85 SDL_DBUS_SYM(dbus_connection_close);
86 SDL_DBUS_SYM(dbus_connection_unref);
87 SDL_DBUS_SYM(dbus_connection_flush);
88 SDL_DBUS_SYM(dbus_message_new_method_call);
89 SDL_DBUS_SYM(dbus_message_unref);
90 SDL_DBUS_SYM(dbus_error_init);
91 SDL_DBUS_SYM(dbus_error_is_set);
92 SDL_DBUS_SYM(dbus_error_free);
100 UnloadDBUSLibrary(
void)
102 if (dbus_handle !=
NULL) {
109 LoadDBUSLibrary(
void)
112 if (dbus_handle ==
NULL) {
114 if (dbus_handle ==
NULL) {
118 retval = load_dbus_syms();
131 if (LoadDBUSLibrary() != -1) {
134 DBUS_dbus_error_init(&err);
135 data->dbus = DBUS_dbus_bus_get_private(DBUS_BUS_SESSION, &err);
136 if (DBUS_dbus_error_is_set(&err)) {
137 DBUS_dbus_error_free(&err);
139 DBUS_dbus_connection_unref(data->dbus);
144 DBUS_dbus_connection_set_exit_on_disconnect(data->dbus, 0);
153 DBUS_dbus_connection_close(data->dbus);
154 DBUS_dbus_connection_unref(data->dbus);
160 SDL_dbus_screensaver_tickle(
_THIS)
163 DBusConnection *conn = data->dbus;
165 DBusMessage *msg = DBUS_dbus_message_new_method_call(
"org.gnome.ScreenSaver",
166 "/org/gnome/ScreenSaver",
167 "org.gnome.ScreenSaver",
168 "SimulateUserActivity");
170 if (DBUS_dbus_connection_send(conn, msg,
NULL)) {
171 DBUS_dbus_connection_flush(conn);
173 DBUS_dbus_message_unref(msg);
180 static int X11_VideoInit(
_THIS);
181 static void X11_VideoQuit(
_THIS);
188 #if defined(__LINUX__) || defined(__FREEBSD__)
201 #if defined(__LINUX__) || defined(__FREEBSD__)
202 #if defined(__LINUX__)
204 #elif defined(__FREEBSD__)
208 #error Where can we find the executable name?
210 linksize = readlink(procfile, linkfile,
sizeof(linkfile) - 1);
212 linkfile[linksize] =
'\0';
234 if (display !=
NULL) {
239 return (display !=
NULL);
258 static int (*orig_x11_errhandler) (Display *, XErrorEvent *) =
NULL;
260 X11_SafetyNetErrHandler(Display *
d, XErrorEvent *
e)
264 if (!safety_net_triggered) {
267 if (device !=
NULL) {
279 if (orig_x11_errhandler !=
NULL) {
280 return orig_x11_errhandler(d, e);
287 X11_CreateDevice(
int devindex)
291 const char *display =
NULL;
324 #if defined(__osf__) && defined(SDL_VIDEO_DRIVER_X11_DYNAMIC)
349 orig_x11_errhandler = XSetErrorHandler(X11_SafetyNetErrHandler);
388 #if SDL_VIDEO_OPENGL_GLX
398 #elif SDL_VIDEO_OPENGL_EGL
414 device->
free = X11_DeleteDevice;
420 "x11",
"SDL X11 video driver",
421 X11_Available, X11_CreateDevice
424 static int (*handler) (Display *, XErrorEvent *) =
NULL;
426 X11_CheckWindowManagerErrorHandler(Display * d, XErrorEvent * e)
428 if (e->error_code == BadWindow) {
431 return (handler(d, e));
436 X11_CheckWindowManager(
_THIS)
439 Display *display = data->
display;
440 Atom _NET_SUPPORTING_WM_CHECK;
441 int status, real_format;
443 unsigned long items_read, items_left;
444 unsigned char *propdata;
445 Window wm_window = 0;
446 #ifdef DEBUG_WINDOW_MANAGER
451 XSync(display, False);
452 handler = XSetErrorHandler(X11_CheckWindowManagerErrorHandler);
454 _NET_SUPPORTING_WM_CHECK =
XInternAtom(display,
"_NET_SUPPORTING_WM_CHECK", False);
455 status = XGetWindowProperty(display, DefaultRootWindow(display), _NET_SUPPORTING_WM_CHECK, 0L, 1L, False, XA_WINDOW, &real_type, &real_format, &items_read, &items_left, &propdata);
456 if (status == Success && items_read) {
457 wm_window = ((Window*)propdata)[0];
464 status = XGetWindowProperty(display, wm_window, _NET_SUPPORTING_WM_CHECK, 0L, 1L, False, XA_WINDOW, &real_type, &real_format, &items_read, &items_left, &propdata);
465 if (status != Success || !items_read || wm_window != ((Window*)propdata)[0]) {
474 XSync(display, False);
475 XSetErrorHandler(handler);
478 #ifdef DEBUG_WINDOW_MANAGER
479 printf(
"Couldn't get _NET_SUPPORTING_WM_CHECK property\n");
485 #ifdef DEBUG_WINDOW_MANAGER
487 printf(
"Window manager: %s\n", wm_name);
502 data->
pid = getpid();
505 #ifdef X_HAVE_UTF8_STRING
513 #define GET_ATOM(X) data->X = XInternAtom(data->display, #X, False)
541 X11_CheckWindowManager(
_this);
569 #ifdef X_HAVE_UTF8_STRING
void(* SetWindowMaximumSize)(_THIS, SDL_Window *window)
void(* GetDisplayModes)(_THIS, SDL_VideoDisplay *display)
void X11_PumpEvents(_THIS)
void(* MinimizeWindow)(_THIS, SDL_Window *window)
return Display return Display Bool Bool int int int return Display XEvent Bool(*) XPointer retur XCloseDisplay)
int(* UpdateWindowFramebuffer)(_THIS, SDL_Window *window, const SDL_Rect *rects, int numrects)
SDL_bool(* GetWindowWMInfo)(_THIS, SDL_Window *window, struct SDL_SysWMinfo *info)
Atom _NET_WM_STATE_FULLSCREEN
int X11_ResizeWindowShape(SDL_Window *window)
void(* RaiseWindow)(_THIS, SDL_Window *window)
Atom _NET_WM_ALLOWED_ACTIONS
void X11_SetWindowTitle(_THIS, SDL_Window *window)
int X11_CreateWindowFramebuffer(_THIS, SDL_Window *window, Uint32 *format, void **pixels, int *pitch)
int(* SetClipboardText)(_THIS, const char *text)
GLvoid **typedef void(GLAPIENTRY *PFNGLGETVERTEXATTRIBDVPROC)(GLuint
DECLSPEC void *SDLCALL SDL_calloc(size_t nmemb, size_t size)
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 int int return Display Window Cursor return Display Window return Display Drawable GC int int unsigned int unsigned int return Display Drawable GC int int _Xconst char int return Display Drawable GC int int unsigned int unsigned int return Display return Display Cursor return Display GC return XModifierKeymap return char Display Window int return Display return Display Atom return Display Window XWindowAttributes return Display Window return Display XEvent Bool(*) XPointer return Display Window Bool unsigned int int int Window Cursor Time return Display Window int return KeySym return Display _Xconst char Bool return Display _Xconst char return XKeyEvent char int KeySym XComposeStatus return Display int int int XVisualInfo return Display Window int int retur XOpenDisplay)
DECLSPEC int SDLCALL SDL_snprintf(char *text, size_t maxlen, const char *fmt,...)
int X11_SetDisplayMode(_THIS, SDL_VideoDisplay *display, SDL_DisplayMode *mode)
void(* HideWindow)(_THIS, SDL_Window *window)
Atom _NET_WM_STATE_MAXIMIZED_VERT
int(* GL_MakeCurrent)(_THIS, SDL_Window *window, SDL_GLContext context)
char * X11_GetClipboardText(_THIS)
void X11_QuitKeyboard(_THIS)
int(* GetDisplayBounds)(_THIS, SDL_VideoDisplay *display, SDL_Rect *rect)
int X11_SetWindowShape(SDL_WindowShaper *shaper, SDL_Surface *shape, SDL_WindowShapeMode *shapeMode)
return Display return Display Bool Bool int int e
SDL_bool X11_UseDirectColorVisuals(void)
DECLSPEC char *SDLCALL SDL_strrchr(const char *str, int c)
DECLSPEC void SDLCALL SDL_free(void *mem)
void(* SetWindowGrab)(_THIS, SDL_Window *window, SDL_bool grabbed)
The structure that defines a display mode.
SDL_WindowData ** windowlist
void(* SetWindowIcon)(_THIS, SDL_Window *window, SDL_Surface *icon)
int X11_UpdateWindowFramebuffer(_THIS, SDL_Window *window, const SDL_Rect *rects, int numrects)
DECLSPEC int SDLCALL SDL_memcmp(const void *s1, const void *s2, size_t len)
void X11_SetWindowFullscreen(_THIS, SDL_Window *window, SDL_VideoDisplay *display, SDL_bool fullscreen)
void X11_MinimizeWindow(_THIS, SDL_Window *window)
return Display return Display Bool Bool int d
void X11_InitMouse(_THIS)
int(* CreateWindowFrom)(_THIS, SDL_Window *window, const void *data)
#define SDL_X11_HAVE_UTF8
void X11_DestroyWindowFramebuffer(_THIS, SDL_Window *window)
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 int int return Display Window Cursor return Display Window return Display Drawable GC int int unsigned int unsigned int return Display Drawable GC int int _Xconst char int return Display Drawable GC int int unsigned int unsigned int return Display return Display Cursor return Display GC return XModifierKeymap return char Display Window int return Display return Display Atom return Display Window XWindowAttributes return Display Window return Display XEvent Bool(*) XPointer return Display Window Bool unsigned int int int Window Cursor Time return Display Window int return KeySym return Display _Xconst char Bool return Display _Xconst char return XKeyEvent char int KeySym XComposeStatus return Display int int int XVisualInfo return Display Window int int return _Xconst char return Display XEvent return Display Drawable GC XImage int int int int unsigned int unsigned int return Display Window Window Window int int int int unsigned int return Display Window Window int int return Display Window unsigned int unsigned int return Display Window Bool long XEvent return Display GC unsigned long return Display Window int Time return Display Window Window return Display Window unsigned long return Display Window XSizeHints Display Colormap XColor int return char int XTextProperty return XFontStruct _Xconst char int int int int XCharStruct return Display Window return Display Time return Display Colormap return Display Window Window int int unsigned int unsigned int int int return Display Window int return XExtensionInfo Display char XExtensionHooks int XPointer return XExtensionInfo XExtensionInfo Display return Display return Display unsigned long Display GC Display char long Display xReply int Bool retur XSynchronize)
void X11_MaximizeWindow(_THIS, SDL_Window *window)
int X11_GetDisplayBounds(_THIS, SDL_VideoDisplay *sdl_display, SDL_Rect *rect)
int(* GL_SetSwapInterval)(_THIS, int interval)
static SDL_VideoDevice * _this
void(* DestroyWindowFramebuffer)(_THIS, SDL_Window *window)
int(* CreateWindow)(_THIS, SDL_Window *window)
void(* GL_UnloadLibrary)(_THIS)
Atom _NET_WM_STATE_HIDDEN
SDL_bool X11_HasClipboardText(_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 int int return Display Window Cursor return Display Window return Display Drawable GC int int unsigned int unsigned int return Display Drawable GC int int _Xconst char int return Display Drawable GC int int unsigned int unsigned int return Display return Display Cursor return Display GC return XModifierKeymap return char Display Window int return Display return Display Atom return Display Window XWindowAttributes return Display Window return Display XEvent Bool(*) XPointer return Display Window Bool unsigned int int int Window Cursor Time return Display Window int return KeySym retur XInternAtom)
int X11_CreateWindow(_THIS, SDL_Window *window)
void X11_GetDisplayModes(_THIS, SDL_VideoDisplay *display)
void X11_SuspendScreenSaver(_THIS)
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
int(* SetWindowShape)(SDL_WindowShaper *shaper, SDL_Surface *shape, SDL_WindowShapeMode *shape_mode)
int X11_SetWindowGammaRamp(_THIS, SDL_Window *window, const Uint16 *ramp)
DECLSPEC char *SDLCALL SDL_strdup(const char *str)
DECLSPEC void *SDLCALL SDL_LoadObject(const char *sofile)
int X11_CreateWindowFrom(_THIS, SDL_Window *window, const void *data)
int(* SetWindowGammaRamp)(_THIS, SDL_Window *window, const Uint16 *ramp)
int SDL_X11_LoadSymbols(void)
DECLSPEC void SDLCALL SDL_Delay(Uint32 ms)
Wait a specified number of milliseconds before returning.
SDL_DisplayMode current_mode
void X11_RestoreWindow(_THIS, SDL_Window *window)
SDL_VideoDisplay * displays
DECLSPEC void SDLCALL SDL_UnloadObject(void *handle)
Atom _NET_WM_ACTION_FULLSCREEN
DECLSPEC int SDLCALL SDL_SetError(const char *fmt,...)
void(* SetWindowPosition)(_THIS, SDL_Window *window)
void X11_ShowWindow(_THIS, SDL_Window *window)
void X11_DestroyWindow(_THIS, SDL_Window *window)
void X11_QuitMouse(_THIS)
void(* PumpEvents)(_THIS)
SDL_WindowShaper * X11_CreateShaper(SDL_Window *window)
int X11_SetClipboardText(_THIS, const char *text)
void(* SetWindowMinimumSize)(_THIS, SDL_Window *window)
void(* SuspendScreenSaver)(_THIS)
SDL_WindowShaper *(* CreateShaper)(SDL_Window *window)
int(* GL_GetSwapInterval)(_THIS)
void X11_SetWindowMinimumSize(_THIS, SDL_Window *window)
#define SDL_OutOfMemory()
SDL_DisplayMode desktop_mode
#define SDL_arraysize(array)
void(* GL_DeleteContext)(_THIS, SDL_GLContext context)
void(* MaximizeWindow)(_THIS, SDL_Window *window)
Atom _NET_WM_STATE_MAXIMIZED_HORZ
void(* DestroyWindow)(_THIS, SDL_Window *window)
void(* SetWindowSize)(_THIS, SDL_Window *window)
int(* SetDisplayMode)(_THIS, SDL_VideoDisplay *display, SDL_DisplayMode *mode)
int X11_InitKeyboard(_THIS)
void X11_QuitModes(_THIS)
char *(* GetClipboardText)(_THIS)
Atom _NET_WM_STATE_FOCUSED
SDL_GLContext(* GL_CreateContext)(_THIS, SDL_Window *window)
void X11_RaiseWindow(_THIS, SDL_Window *window)
void X11_InitTouch(_THIS)
int(* GL_LoadLibrary)(_THIS, const char *path)
void X11_SetWindowIcon(_THIS, SDL_Window *window, SDL_Surface *icon)
void(* GL_SwapWindow)(_THIS, SDL_Window *window)
char * X11_GetWindowTitle(_THIS, Window xwindow)
void(* ShowWindow)(_THIS, SDL_Window *window)
SDL_VideoDevice * SDL_GetVideoDevice(void)
SDL_ShapeDriver shape_driver
int(* CreateWindowFramebuffer)(_THIS, SDL_Window *window, Uint32 *format, void **pixels, int *pitch)
SDL_bool(* HasClipboardText)(_THIS)
DECLSPEC char *SDLCALL SDL_getenv(const char *name)
void SDL_X11_UnloadSymbols(void)
void(* SetWindowTitle)(_THIS, SDL_Window *window)
void(* SetWindowBordered)(_THIS, SDL_Window *window, SDL_bool bordered)
void X11_SetWindowSize(_THIS, SDL_Window *window)
void(* SetWindowFullscreen)(_THIS, SDL_Window *window, SDL_VideoDisplay *display, SDL_bool fullscreen)
DECLSPEC void *SDLCALL SDL_LoadFunction(void *handle, const char *name)
void X11_SetWindowBordered(_THIS, SDL_Window *window, SDL_bool bordered)
void X11_HideWindow(_THIS, SDL_Window *window)
void *(* GL_GetProcAddress)(_THIS, const char *proc)
void X11_SetWindowGrab(_THIS, SDL_Window *window, SDL_bool grabbed)
int(* ResizeWindowShape)(SDL_Window *window)
SDL_bool X11_GetWindowWMInfo(_THIS, SDL_Window *window, struct SDL_SysWMinfo *info)
void X11_SetWindowMaximumSize(_THIS, SDL_Window *window)
void(* RestoreWindow)(_THIS, SDL_Window *window)
void X11_QuitTouch(_THIS)
void X11_SetWindowPosition(_THIS, SDL_Window *window)