21 #include "../../SDL_internal.h"
27 static const char *dbus_library =
"libdbus-1.so.3";
28 static void *dbus_handle =
NULL;
29 static unsigned int screensaver_cookie = 0;
30 static SDL_DBusContext dbus;
35 #define SDL_DBUS_SYM2(x, y) \
36 if (!(dbus.x = SDL_LoadFunction(dbus_handle, #y))) return -1
38 #define SDL_DBUS_SYM(x) \
39 SDL_DBUS_SYM2(x, dbus_##x)
41 SDL_DBUS_SYM(bus_get_private);
42 SDL_DBUS_SYM(bus_register);
43 SDL_DBUS_SYM(bus_add_match);
44 SDL_DBUS_SYM(connection_open_private);
45 SDL_DBUS_SYM(connection_set_exit_on_disconnect);
46 SDL_DBUS_SYM(connection_get_is_connected);
47 SDL_DBUS_SYM(connection_add_filter);
48 SDL_DBUS_SYM(connection_try_register_object_path);
49 SDL_DBUS_SYM(connection_send);
50 SDL_DBUS_SYM(connection_send_with_reply_and_block);
51 SDL_DBUS_SYM(connection_close);
52 SDL_DBUS_SYM(connection_unref);
53 SDL_DBUS_SYM(connection_flush);
54 SDL_DBUS_SYM(connection_read_write);
55 SDL_DBUS_SYM(connection_dispatch);
56 SDL_DBUS_SYM(message_is_signal);
57 SDL_DBUS_SYM(message_new_method_call);
58 SDL_DBUS_SYM(message_append_args);
59 SDL_DBUS_SYM(message_append_args_valist);
60 SDL_DBUS_SYM(message_iter_init_append);
61 SDL_DBUS_SYM(message_iter_open_container);
62 SDL_DBUS_SYM(message_iter_append_basic);
63 SDL_DBUS_SYM(message_iter_close_container);
64 SDL_DBUS_SYM(message_get_args);
65 SDL_DBUS_SYM(message_get_args_valist);
66 SDL_DBUS_SYM(message_iter_init);
67 SDL_DBUS_SYM(message_iter_next);
68 SDL_DBUS_SYM(message_iter_get_basic);
69 SDL_DBUS_SYM(message_iter_get_arg_type);
70 SDL_DBUS_SYM(message_iter_recurse);
71 SDL_DBUS_SYM(message_unref);
72 SDL_DBUS_SYM(threads_init_default);
73 SDL_DBUS_SYM(error_init);
74 SDL_DBUS_SYM(error_is_set);
75 SDL_DBUS_SYM(error_free);
76 SDL_DBUS_SYM(get_local_machine_id);
78 SDL_DBUS_SYM(free_string_array);
79 SDL_DBUS_SYM(shutdown);
88 UnloadDBUSLibrary(
void)
90 if (dbus_handle !=
NULL) {
100 if (dbus_handle ==
NULL) {
102 if (dbus_handle ==
NULL) {
120 if (!is_dbus_available) {
124 if (!dbus.session_conn) {
127 if (LoadDBUSLibrary() == -1) {
132 if (!dbus.threads_init_default()) {
137 dbus.error_init(&err);
140 dbus.session_conn = dbus.bus_get_private(DBUS_BUS_SESSION, &err);
141 if (dbus.error_is_set(&err)) {
142 dbus.error_free(&err);
147 dbus.connection_set_exit_on_disconnect(dbus.session_conn, 0);
150 dbus.system_conn = dbus.bus_get_private(DBUS_BUS_SYSTEM, &err);
151 if (!dbus.error_is_set(&err)) {
152 dbus.connection_set_exit_on_disconnect(dbus.system_conn, 0);
155 dbus.error_free(&err);
162 if (dbus.system_conn) {
163 dbus.connection_close(dbus.system_conn);
164 dbus.connection_unref(dbus.system_conn);
166 if (dbus.session_conn) {
167 dbus.connection_close(dbus.session_conn);
168 dbus.connection_unref(dbus.session_conn);
183 SDL_DBus_GetContext(
void)
185 if (!dbus_handle || !dbus.session_conn) {
189 return (dbus_handle && dbus.session_conn) ? &dbus :
NULL;
193 SDL_DBus_CallMethodInternal(DBusConnection *conn,
const char *node,
const char *
path,
const char *interface,
const char *method, va_list ap)
198 DBusMessage *msg = dbus.message_new_method_call(node,
path, interface, method);
202 va_copy(ap_reply, ap);
203 firstarg = va_arg(ap,
int);
204 if ((firstarg == DBUS_TYPE_INVALID) || dbus.message_append_args_valist(msg, firstarg, ap)) {
205 DBusMessage *reply = dbus.connection_send_with_reply_and_block(conn, msg, 300,
NULL);
208 while ((firstarg = va_arg(ap_reply,
int)) != DBUS_TYPE_INVALID) {
210 {
void *dumpptr = va_arg(ap_reply,
void*); (
void) dumpptr; }
211 if (firstarg == DBUS_TYPE_ARRAY) {
212 {
const int dumpint = va_arg(ap_reply,
int); (
void) dumpint; }
215 firstarg = va_arg(ap_reply,
int);
216 if ((firstarg == DBUS_TYPE_INVALID) || dbus.message_get_args_valist(reply,
NULL, firstarg, ap_reply)) {
219 dbus.message_unref(reply);
223 dbus.message_unref(msg);
231 SDL_DBus_CallMethodOnConnection(DBusConnection *conn,
const char *node,
const char *
path,
const char *interface,
const char *method, ...)
235 va_start(ap, method);
236 retval = SDL_DBus_CallMethodInternal(conn, node,
path, interface, method, ap);
242 SDL_DBus_CallMethod(
const char *node,
const char *
path,
const char *interface,
const char *method, ...)
246 va_start(ap, method);
247 retval = SDL_DBus_CallMethodInternal(dbus.session_conn, node,
path, interface, method, ap);
253 SDL_DBus_CallVoidMethodInternal(DBusConnection *conn,
const char *node,
const char *
path,
const char *interface,
const char *method, va_list ap)
258 DBusMessage *msg = dbus.message_new_method_call(node,
path, interface, method);
260 int firstarg = va_arg(ap,
int);
261 if ((firstarg == DBUS_TYPE_INVALID) || dbus.message_append_args_valist(msg, firstarg, ap)) {
262 if (dbus.connection_send(conn, msg,
NULL)) {
263 dbus.connection_flush(conn);
268 dbus.message_unref(msg);
276 SDL_DBus_CallVoidMethodOnConnection(DBusConnection *conn,
const char *node,
const char *
path,
const char *interface,
const char *method, ...)
280 va_start(ap, method);
281 retval = SDL_DBus_CallVoidMethodInternal(conn, node,
path, interface, method, ap);
287 SDL_DBus_CallVoidMethod(
const char *node,
const char *
path,
const char *interface,
const char *method, ...)
291 va_start(ap, method);
292 retval = SDL_DBus_CallVoidMethodInternal(dbus.session_conn, node,
path, interface, method, ap);
298 SDL_DBus_QueryPropertyOnConnection(DBusConnection *conn,
const char *node,
const char *
path,
const char *interface,
const char *property,
const int expectedtype,
void *
result)
303 DBusMessage *msg = dbus.message_new_method_call(node,
path,
"org.freedesktop.DBus.Properties",
"Get");
305 if (dbus.message_append_args(msg, DBUS_TYPE_STRING, &interface, DBUS_TYPE_STRING, &property, DBUS_TYPE_INVALID)) {
306 DBusMessage *reply = dbus.connection_send_with_reply_and_block(conn, msg, 300,
NULL);
308 DBusMessageIter iter,
sub;
309 dbus.message_iter_init(reply, &iter);
310 if (dbus.message_iter_get_arg_type(&iter) == DBUS_TYPE_VARIANT) {
311 dbus.message_iter_recurse(&iter, &
sub);
312 if (dbus.message_iter_get_arg_type(&
sub) == expectedtype) {
313 dbus.message_iter_get_basic(&
sub,
result);
317 dbus.message_unref(reply);
320 dbus.message_unref(msg);
328 SDL_DBus_QueryProperty(
const char *node,
const char *
path,
const char *interface,
const char *property,
const int expectedtype,
void *
result)
330 return SDL_DBus_QueryPropertyOnConnection(dbus.session_conn, node,
path, interface, property, expectedtype,
result);
335 SDL_DBus_ScreensaverTickle(
void)
337 if (screensaver_cookie == 0) {
339 SDL_DBus_CallVoidMethod(
"org.gnome.ScreenSaver",
"/org/gnome/ScreenSaver",
"org.gnome.ScreenSaver",
"SimulateUserActivity", DBUS_TYPE_INVALID);
340 SDL_DBus_CallVoidMethod(
"org.freedesktop.ScreenSaver",
"/org/freedesktop/ScreenSaver",
"org.freedesktop.ScreenSaver",
"SimulateUserActivity", DBUS_TYPE_INVALID);
345 SDL_DBus_ScreensaverInhibit(
SDL_bool inhibit)
347 if ( (inhibit && (screensaver_cookie != 0)) || (!inhibit && (screensaver_cookie == 0)) ) {
350 const char *node =
"org.freedesktop.ScreenSaver";
351 const char *
path =
"/org/freedesktop/ScreenSaver";
352 const char *
interface = "org.freedesktop.ScreenSaver";
355 const char *app =
"My SDL application";
356 const char *reason =
"Playing a game";
357 if (!SDL_DBus_CallMethod(node,
path, interface,
"Inhibit",
358 DBUS_TYPE_STRING, &app, DBUS_TYPE_STRING, &reason, DBUS_TYPE_INVALID,
359 DBUS_TYPE_UINT32, &screensaver_cookie, DBUS_TYPE_INVALID)) {
364 if (!SDL_DBus_CallVoidMethod(node,
path, interface,
"UnInhibit", DBUS_TYPE_UINT32, &screensaver_cookie, DBUS_TYPE_INVALID)) {
367 screensaver_cookie = 0;
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 void
GLsizei const GLchar *const * path
set set set set set set set set set set set set set set set set set set set set *set set set macro pixldst op &r &cond WK op &r &cond WK op &r &cond WK else op &m &cond &ia op &r &cond WK else op &m &cond &ia elseif elseif else error unsupported base if elseif elseif else error unsupported unaligned pixldst unaligned endm macro pixst base base else pixldst base endif endm macro PF base if bpp PF set rept prefetch_distance PF set OFFSET endr endif endm macro preload_leading_step2 base if bpp ifc DST PF PF else if bpp lsl PF PF lsl PF sub