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_get_args);
61 SDL_DBUS_SYM(message_get_args_valist);
62 SDL_DBUS_SYM(message_iter_init);
63 SDL_DBUS_SYM(message_iter_next);
64 SDL_DBUS_SYM(message_iter_get_basic);
65 SDL_DBUS_SYM(message_iter_get_arg_type);
66 SDL_DBUS_SYM(message_iter_recurse);
67 SDL_DBUS_SYM(message_unref);
68 SDL_DBUS_SYM(error_init);
69 SDL_DBUS_SYM(error_is_set);
70 SDL_DBUS_SYM(error_free);
71 SDL_DBUS_SYM(get_local_machine_id);
73 SDL_DBUS_SYM(free_string_array);
74 SDL_DBUS_SYM(shutdown);
83 UnloadDBUSLibrary(
void)
85 if (dbus_handle !=
NULL) {
95 if (dbus_handle ==
NULL) {
97 if (dbus_handle ==
NULL) {
101 retval = LoadDBUSSyms();
114 if (!dbus.session_conn && LoadDBUSLibrary() != -1) {
116 dbus.error_init(&err);
117 dbus.session_conn = dbus.bus_get_private(DBUS_BUS_SESSION, &err);
118 if (!dbus.error_is_set(&err)) {
119 dbus.system_conn = dbus.bus_get_private(DBUS_BUS_SYSTEM, &err);
121 if (dbus.error_is_set(&err)) {
122 dbus.error_free(&err);
126 dbus.connection_set_exit_on_disconnect(dbus.system_conn, 0);
127 dbus.connection_set_exit_on_disconnect(dbus.session_conn, 0);
134 if (dbus.system_conn) {
135 dbus.connection_close(dbus.system_conn);
136 dbus.connection_unref(dbus.system_conn);
138 if (dbus.session_conn) {
139 dbus.connection_close(dbus.session_conn);
140 dbus.connection_unref(dbus.session_conn);
155 SDL_DBus_GetContext(
void)
157 if(!dbus_handle || !dbus.session_conn){
161 if(dbus_handle && dbus.session_conn){
169 SDL_DBus_CallMethodInternal(DBusConnection *conn,
const char *node,
const char *
path,
const char *interface,
const char *method, va_list ap)
174 DBusMessage *msg = dbus.message_new_method_call(node, path, interface, method);
178 va_copy(ap_reply, ap);
179 firstarg = va_arg(ap,
int);
180 if ((firstarg == DBUS_TYPE_INVALID) || dbus.message_append_args_valist(msg, firstarg, ap)) {
181 DBusMessage *reply = dbus.connection_send_with_reply_and_block(conn, msg, 300,
NULL);
184 while ((firstarg = va_arg(ap_reply,
int)) != DBUS_TYPE_INVALID) {
186 {
void *dumpptr = va_arg(ap_reply,
void*); (
void) dumpptr; }
187 if (firstarg == DBUS_TYPE_ARRAY) {
188 {
const int dumpint = va_arg(ap_reply,
int); (
void) dumpint; }
191 firstarg = va_arg(ap_reply,
int);
192 if ((firstarg == DBUS_TYPE_INVALID) || dbus.message_get_args_valist(reply,
NULL, firstarg, ap_reply)) {
195 dbus.message_unref(reply);
199 dbus.message_unref(msg);
207 SDL_DBus_CallMethodOnConnection(DBusConnection *conn,
const char *node,
const char *path,
const char *interface,
const char *method, ...)
211 va_start(ap, method);
212 retval = SDL_DBus_CallMethodInternal(conn, node, path, interface, method, ap);
218 SDL_DBus_CallMethod(
const char *node,
const char *path,
const char *interface,
const char *method, ...)
222 va_start(ap, method);
223 retval = SDL_DBus_CallMethodInternal(dbus.session_conn, node, path, interface, method, ap);
229 SDL_DBus_CallVoidMethodInternal(DBusConnection *conn,
const char *node,
const char *path,
const char *interface,
const char *method, va_list ap)
234 DBusMessage *msg = dbus.message_new_method_call(node, path, interface, method);
236 int firstarg = va_arg(ap,
int);
237 if ((firstarg == DBUS_TYPE_INVALID) || dbus.message_append_args_valist(msg, firstarg, ap)) {
238 if (dbus.connection_send(conn, msg,
NULL)) {
239 dbus.connection_flush(conn);
244 dbus.message_unref(msg);
252 SDL_DBus_CallVoidMethodOnConnection(DBusConnection *conn,
const char *node,
const char *path,
const char *interface,
const char *method, ...)
256 va_start(ap, method);
257 retval = SDL_DBus_CallVoidMethodInternal(conn, node, path, interface, method, ap);
263 SDL_DBus_CallVoidMethod(
const char *node,
const char *path,
const char *interface,
const char *method, ...)
267 va_start(ap, method);
268 retval = SDL_DBus_CallVoidMethodInternal(dbus.session_conn, node, path, interface, method, ap);
274 SDL_DBus_QueryPropertyOnConnection(DBusConnection *conn,
const char *node,
const char *path,
const char *interface,
const char *property,
const int expectedtype,
void *
result)
279 DBusMessage *msg = dbus.message_new_method_call(node, path,
"org.freedesktop.DBus.Properties",
"Get");
281 if (dbus.message_append_args(msg, DBUS_TYPE_STRING, &interface, DBUS_TYPE_STRING, &property, DBUS_TYPE_INVALID)) {
282 DBusMessage *reply = dbus.connection_send_with_reply_and_block(conn, msg, 300,
NULL);
284 DBusMessageIter iter,
sub;
285 dbus.message_iter_init(reply, &iter);
286 if (dbus.message_iter_get_arg_type(&iter) == DBUS_TYPE_VARIANT) {
287 dbus.message_iter_recurse(&iter, &sub);
288 if (dbus.message_iter_get_arg_type(&sub) == expectedtype) {
289 dbus.message_iter_get_basic(&sub, result);
293 dbus.message_unref(reply);
296 dbus.message_unref(msg);
304 SDL_DBus_QueryProperty(
const char *node,
const char *path,
const char *interface,
const char *property,
const int expectedtype,
void *result)
306 return SDL_DBus_QueryPropertyOnConnection(dbus.session_conn, node, path, interface, property, expectedtype, result);
311 SDL_DBus_ScreensaverTickle(
void)
313 SDL_DBus_CallVoidMethod(
"org.gnome.ScreenSaver",
"/org/gnome/ScreenSaver",
"org.gnome.ScreenSaver",
"SimulateUserActivity", DBUS_TYPE_INVALID);
317 SDL_DBus_ScreensaverInhibit(
SDL_bool inhibit)
319 if ( (inhibit && (screensaver_cookie != 0)) || (!inhibit && (screensaver_cookie == 0)) ) {
322 const char *node =
"org.freedesktop.ScreenSaver";
323 const char *path =
"/org/freedesktop/ScreenSaver";
324 const char *
interface = "org.freedesktop.ScreenSaver";
327 const char *app =
"My SDL application";
328 const char *reason =
"Playing a game";
329 if (!SDL_DBus_CallMethod(node, path, interface,
"Inhibit",
330 DBUS_TYPE_STRING, &app, DBUS_TYPE_STRING, &reason, DBUS_TYPE_INVALID,
331 DBUS_TYPE_UINT32, &screensaver_cookie, DBUS_TYPE_INVALID)) {
336 if (!SDL_DBus_CallVoidMethod(node, path, interface,
"UnInhibit", DBUS_TYPE_UINT32, &screensaver_cookie, DBUS_TYPE_INVALID)) {
339 screensaver_cookie = 0;
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
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