Sort out the dbus function prototypes
* Moved dbus prototypes from common.h to dbus.h * Removed private function prototypes from dbus.h * Removed private macros from dbus.h * Hide dbus types from common.h Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
This commit is contained in:
parent
eeb1f8f286
commit
4ff9e810ff
41
src/common.h
41
src/common.h
@ -81,11 +81,6 @@
|
|||||||
#include <ev.h>
|
#include <ev.h>
|
||||||
#include <pixman.h>
|
#include <pixman.h>
|
||||||
|
|
||||||
// libdbus
|
|
||||||
#ifdef CONFIG_DBUS
|
|
||||||
#include <dbus/dbus.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef CONFIG_OPENGL
|
#ifdef CONFIG_OPENGL
|
||||||
// libGL
|
// libGL
|
||||||
#define GL_GLEXT_PROTOTYPES
|
#define GL_GLEXT_PROTOTYPES
|
||||||
@ -888,10 +883,7 @@ typedef struct session {
|
|||||||
|
|
||||||
#ifdef CONFIG_DBUS
|
#ifdef CONFIG_DBUS
|
||||||
// === DBus related ===
|
// === DBus related ===
|
||||||
// DBus connection.
|
void *dbus_data;
|
||||||
DBusConnection *dbus_conn;
|
|
||||||
// DBus service name.
|
|
||||||
char *dbus_service;
|
|
||||||
#endif
|
#endif
|
||||||
} session_t;
|
} session_t;
|
||||||
|
|
||||||
@ -1507,37 +1499,6 @@ xr_sync(session_t *ps, Drawable d, XSyncFence *pfence) {
|
|||||||
*/
|
*/
|
||||||
///@{
|
///@{
|
||||||
#ifdef CONFIG_DBUS
|
#ifdef CONFIG_DBUS
|
||||||
/** @name DBus handling
|
|
||||||
*/
|
|
||||||
///@{
|
|
||||||
bool
|
|
||||||
cdbus_init(session_t *ps);
|
|
||||||
|
|
||||||
void
|
|
||||||
cdbus_destroy(session_t *ps);
|
|
||||||
|
|
||||||
void
|
|
||||||
cdbus_loop(session_t *ps);
|
|
||||||
|
|
||||||
void
|
|
||||||
cdbus_ev_win_added(session_t *ps, win *w);
|
|
||||||
|
|
||||||
void
|
|
||||||
cdbus_ev_win_destroyed(session_t *ps, win *w);
|
|
||||||
|
|
||||||
void
|
|
||||||
cdbus_ev_win_mapped(session_t *ps, win *w);
|
|
||||||
|
|
||||||
void
|
|
||||||
cdbus_ev_win_unmapped(session_t *ps, win *w);
|
|
||||||
|
|
||||||
void
|
|
||||||
cdbus_ev_win_focusout(session_t *ps, win *w);
|
|
||||||
|
|
||||||
void
|
|
||||||
cdbus_ev_win_focusin(session_t *ps, win *w);
|
|
||||||
//!@}
|
|
||||||
|
|
||||||
/** @name DBus hooks
|
/** @name DBus hooks
|
||||||
*/
|
*/
|
||||||
///@{
|
///@{
|
||||||
|
@ -36,6 +36,9 @@
|
|||||||
#include "kernel.h"
|
#include "kernel.h"
|
||||||
#include "vsync.h"
|
#include "vsync.h"
|
||||||
#include "log.h"
|
#include "log.h"
|
||||||
|
#ifdef CONFIG_DBUS
|
||||||
|
#include "dbus.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
#define auto __auto_type
|
#define auto __auto_type
|
||||||
|
|
||||||
@ -3545,8 +3548,7 @@ session_init(session_t *ps_old, int argc, char **argv) {
|
|||||||
.track_atom_lst = NULL,
|
.track_atom_lst = NULL,
|
||||||
|
|
||||||
#ifdef CONFIG_DBUS
|
#ifdef CONFIG_DBUS
|
||||||
.dbus_conn = NULL,
|
.dbus_data = NULL,
|
||||||
.dbus_service = NULL,
|
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -3831,6 +3833,19 @@ session_init(session_t *ps_old, int argc, char **argv) {
|
|||||||
|
|
||||||
xcb_grab_server(ps->c);
|
xcb_grab_server(ps->c);
|
||||||
|
|
||||||
|
// Initialize DBus. We need to do this early, because add_win might call dbus functions
|
||||||
|
if (ps->o.dbus) {
|
||||||
|
#ifdef CONFIG_DBUS
|
||||||
|
cdbus_init(ps);
|
||||||
|
if (!ps->dbus_data) {
|
||||||
|
ps->o.dbus = false;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
log_fatal("DBus support not compiled in!");
|
||||||
|
exit(1);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
xcb_window_t *children;
|
xcb_window_t *children;
|
||||||
int nchildren;
|
int nchildren;
|
||||||
@ -3861,20 +3876,6 @@ session_init(session_t *ps_old, int argc, char **argv) {
|
|||||||
// ALWAYS flush after xcb_ungrab_server()!
|
// ALWAYS flush after xcb_ungrab_server()!
|
||||||
XFlush(ps->dpy);
|
XFlush(ps->dpy);
|
||||||
|
|
||||||
// Initialize DBus
|
|
||||||
if (ps->o.dbus) {
|
|
||||||
#ifdef CONFIG_DBUS
|
|
||||||
cdbus_init(ps);
|
|
||||||
if (!ps->dbus_conn) {
|
|
||||||
cdbus_destroy(ps);
|
|
||||||
ps->o.dbus = false;
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
log_fatal("DBus support not compiled in!");
|
|
||||||
exit(1);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
// Fork to background, if asked
|
// Fork to background, if asked
|
||||||
if (ps->o.fork_after_register) {
|
if (ps->o.fork_after_register) {
|
||||||
if (!fork_after(ps)) {
|
if (!fork_after(ps)) {
|
||||||
@ -3914,10 +3915,10 @@ session_destroy(session_t *ps) {
|
|||||||
|
|
||||||
#ifdef CONFIG_DBUS
|
#ifdef CONFIG_DBUS
|
||||||
// Kill DBus connection
|
// Kill DBus connection
|
||||||
if (ps->o.dbus)
|
if (ps->o.dbus) {
|
||||||
|
assert(ps->dbus_data);
|
||||||
cdbus_destroy(ps);
|
cdbus_destroy(ps);
|
||||||
|
}
|
||||||
free(ps->dbus_service);
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Free window linked list
|
// Free window linked list
|
||||||
|
200
src/dbus.c
200
src/dbus.c
@ -9,6 +9,11 @@
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <ctype.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
|
||||||
|
#include "common.h"
|
||||||
#include "compiler.h"
|
#include "compiler.h"
|
||||||
#include "win.h"
|
#include "win.h"
|
||||||
#include "string_utils.h"
|
#include "string_utils.h"
|
||||||
@ -16,6 +21,45 @@
|
|||||||
|
|
||||||
#include "dbus.h"
|
#include "dbus.h"
|
||||||
|
|
||||||
|
struct cdbus_data {
|
||||||
|
/// DBus connection.
|
||||||
|
DBusConnection *dbus_conn;
|
||||||
|
/// DBus service name.
|
||||||
|
char *dbus_service;
|
||||||
|
};
|
||||||
|
|
||||||
|
// Window type
|
||||||
|
typedef uint32_t cdbus_window_t;
|
||||||
|
#define CDBUS_TYPE_WINDOW DBUS_TYPE_UINT32
|
||||||
|
#define CDBUS_TYPE_WINDOW_STR DBUS_TYPE_UINT32_AS_STRING
|
||||||
|
|
||||||
|
typedef uint16_t cdbus_enum_t;
|
||||||
|
#define CDBUS_TYPE_ENUM DBUS_TYPE_UINT16
|
||||||
|
#define CDBUS_TYPE_ENUM_STR DBUS_TYPE_UINT16_AS_STRING
|
||||||
|
|
||||||
|
#define CDBUS_SERVICE_NAME "com.github.chjj.compton"
|
||||||
|
#define CDBUS_INTERFACE_NAME CDBUS_SERVICE_NAME
|
||||||
|
#define CDBUS_OBJECT_NAME "/com/github/chjj/compton"
|
||||||
|
#define CDBUS_ERROR_PREFIX CDBUS_INTERFACE_NAME ".error"
|
||||||
|
#define CDBUS_ERROR_UNKNOWN CDBUS_ERROR_PREFIX ".unknown"
|
||||||
|
#define CDBUS_ERROR_UNKNOWN_S "Well, I don't know what happened. Do you?"
|
||||||
|
#define CDBUS_ERROR_BADMSG CDBUS_ERROR_PREFIX ".bad_message"
|
||||||
|
#define CDBUS_ERROR_BADMSG_S "Unrecognized command. Beware compton " \
|
||||||
|
"cannot make you a sandwich."
|
||||||
|
#define CDBUS_ERROR_BADARG CDBUS_ERROR_PREFIX ".bad_argument"
|
||||||
|
#define CDBUS_ERROR_BADARG_S "Failed to parse argument %d: %s"
|
||||||
|
#define CDBUS_ERROR_BADWIN CDBUS_ERROR_PREFIX ".bad_window"
|
||||||
|
#define CDBUS_ERROR_BADWIN_S "Requested window %#010x not found."
|
||||||
|
#define CDBUS_ERROR_BADTGT CDBUS_ERROR_PREFIX ".bad_target"
|
||||||
|
#define CDBUS_ERROR_BADTGT_S "Target \"%s\" not found."
|
||||||
|
#define CDBUS_ERROR_FORBIDDEN CDBUS_ERROR_PREFIX ".forbidden"
|
||||||
|
#define CDBUS_ERROR_FORBIDDEN_S "Incorrect password, access denied."
|
||||||
|
#define CDBUS_ERROR_CUSTOM CDBUS_ERROR_PREFIX ".custom"
|
||||||
|
#define CDBUS_ERROR_CUSTOM_S "%s"
|
||||||
|
|
||||||
|
#define cdbus_reply_err(ps, srcmsg, err_name, err_format, ...) \
|
||||||
|
cdbus_reply_errm((ps), dbus_message_new_error_printf((srcmsg), (err_name), (err_format), ## __VA_ARGS__))
|
||||||
|
|
||||||
static DBusHandlerResult
|
static DBusHandlerResult
|
||||||
cdbus_process(DBusConnection *conn, DBusMessage *m, void *);
|
cdbus_process(DBusConnection *conn, DBusMessage *m, void *);
|
||||||
|
|
||||||
@ -42,6 +86,12 @@ cdbus_callback_watch_toggled(DBusWatch *watch, void *data);
|
|||||||
*/
|
*/
|
||||||
bool
|
bool
|
||||||
cdbus_init(session_t *ps) {
|
cdbus_init(session_t *ps) {
|
||||||
|
auto cd = cmalloc(struct cdbus_data);
|
||||||
|
cd->dbus_service = NULL;
|
||||||
|
|
||||||
|
// Set ps->dbus_data here because add_watch functions need it
|
||||||
|
ps->dbus_data = cd;
|
||||||
|
|
||||||
DBusError err = { };
|
DBusError err = { };
|
||||||
|
|
||||||
// Initialize
|
// Initialize
|
||||||
@ -49,69 +99,76 @@ cdbus_init(session_t *ps) {
|
|||||||
|
|
||||||
// Connect to D-Bus
|
// Connect to D-Bus
|
||||||
// Use dbus_bus_get_private() so we can fully recycle it ourselves
|
// Use dbus_bus_get_private() so we can fully recycle it ourselves
|
||||||
ps->dbus_conn = dbus_bus_get_private(DBUS_BUS_SESSION, &err);
|
cd->dbus_conn = dbus_bus_get_private(DBUS_BUS_SESSION, &err);
|
||||||
if (dbus_error_is_set(&err)) {
|
if (dbus_error_is_set(&err)) {
|
||||||
log_error("D-Bus connection failed (%s).", err.message);
|
log_error("D-Bus connection failed (%s).", err.message);
|
||||||
dbus_error_free(&err);
|
dbus_error_free(&err);
|
||||||
return false;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!ps->dbus_conn) {
|
if (!cd->dbus_conn) {
|
||||||
log_error("D-Bus connection failed for unknown reason.");
|
log_error("D-Bus connection failed for unknown reason.");
|
||||||
return false;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Avoid exiting on disconnect
|
// Avoid exiting on disconnect
|
||||||
dbus_connection_set_exit_on_disconnect(ps->dbus_conn, false);
|
dbus_connection_set_exit_on_disconnect(cd->dbus_conn, false);
|
||||||
|
|
||||||
// Request service name
|
// Request service name
|
||||||
{
|
{
|
||||||
// Build service name
|
// Build service name
|
||||||
char *service = mstrjoin3(CDBUS_SERVICE_NAME, ".", ps->o.display_repr);
|
char *service = mstrjoin3(CDBUS_SERVICE_NAME, ".", ps->o.display_repr);
|
||||||
ps->dbus_service = service;
|
cd->dbus_service = service;
|
||||||
|
|
||||||
// Request for the name
|
// Request for the name
|
||||||
int ret = dbus_bus_request_name(ps->dbus_conn, service,
|
int ret = dbus_bus_request_name(cd->dbus_conn, service,
|
||||||
DBUS_NAME_FLAG_DO_NOT_QUEUE, &err);
|
DBUS_NAME_FLAG_DO_NOT_QUEUE, &err);
|
||||||
|
|
||||||
if (dbus_error_is_set(&err)) {
|
if (dbus_error_is_set(&err)) {
|
||||||
log_error("Failed to obtain D-Bus name (%s).", err.message);
|
log_error("Failed to obtain D-Bus name (%s).", err.message);
|
||||||
dbus_error_free(&err);
|
dbus_error_free(&err);
|
||||||
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER != ret
|
if (DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER != ret
|
||||||
&& DBUS_REQUEST_NAME_REPLY_ALREADY_OWNER != ret) {
|
&& DBUS_REQUEST_NAME_REPLY_ALREADY_OWNER != ret) {
|
||||||
log_error("Failed to become the primary owner of requested D-Bus name (%d).", ret);
|
log_error("Failed to become the primary owner of requested D-Bus name (%d).", ret);
|
||||||
|
goto fail;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Add watch handlers
|
// Add watch handlers
|
||||||
if (!dbus_connection_set_watch_functions(ps->dbus_conn,
|
if (!dbus_connection_set_watch_functions(cd->dbus_conn,
|
||||||
cdbus_callback_add_watch, cdbus_callback_remove_watch,
|
cdbus_callback_add_watch, cdbus_callback_remove_watch,
|
||||||
cdbus_callback_watch_toggled, ps, NULL)) {
|
cdbus_callback_watch_toggled, ps, NULL)) {
|
||||||
log_error("Failed to add D-Bus watch functions.");
|
log_error("Failed to add D-Bus watch functions.");
|
||||||
return false;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add timeout handlers
|
// Add timeout handlers
|
||||||
if (!dbus_connection_set_timeout_functions(ps->dbus_conn,
|
if (!dbus_connection_set_timeout_functions(cd->dbus_conn,
|
||||||
cdbus_callback_add_timeout, cdbus_callback_remove_timeout,
|
cdbus_callback_add_timeout, cdbus_callback_remove_timeout,
|
||||||
cdbus_callback_timeout_toggled, ps, NULL)) {
|
cdbus_callback_timeout_toggled, ps, NULL)) {
|
||||||
log_error("Failed to add D-Bus timeout functions.");
|
log_error("Failed to add D-Bus timeout functions.");
|
||||||
return false;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add match
|
// Add match
|
||||||
dbus_bus_add_match(ps->dbus_conn,
|
dbus_bus_add_match(cd->dbus_conn,
|
||||||
"type='method_call',interface='" CDBUS_INTERFACE_NAME "'", &err);
|
"type='method_call',interface='" CDBUS_INTERFACE_NAME "'", &err);
|
||||||
if (dbus_error_is_set(&err)) {
|
if (dbus_error_is_set(&err)) {
|
||||||
log_error("Failed to add D-Bus match.");
|
log_error("Failed to add D-Bus match.");
|
||||||
dbus_error_free(&err);
|
dbus_error_free(&err);
|
||||||
return false;
|
goto fail;
|
||||||
}
|
}
|
||||||
dbus_connection_add_filter(ps->dbus_conn, cdbus_process, ps, NULL);
|
dbus_connection_add_filter(cd->dbus_conn, cdbus_process, ps, NULL);
|
||||||
return true;
|
return true;
|
||||||
|
fail:
|
||||||
|
ps->dbus_data = NULL;
|
||||||
|
free(cd->dbus_service);
|
||||||
|
free(cd);
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -119,13 +176,14 @@ cdbus_init(session_t *ps) {
|
|||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
cdbus_destroy(session_t *ps) {
|
cdbus_destroy(session_t *ps) {
|
||||||
if (ps->dbus_conn) {
|
struct cdbus_data *cd = ps->dbus_data;
|
||||||
|
if (cd->dbus_conn) {
|
||||||
// Release DBus name firstly
|
// Release DBus name firstly
|
||||||
if (ps->dbus_service) {
|
if (cd->dbus_service) {
|
||||||
DBusError err = { };
|
DBusError err = { };
|
||||||
dbus_error_init(&err);
|
dbus_error_init(&err);
|
||||||
|
|
||||||
dbus_bus_release_name(ps->dbus_conn, ps->dbus_service, &err);
|
dbus_bus_release_name(cd->dbus_conn, cd->dbus_service, &err);
|
||||||
if (dbus_error_is_set(&err)) {
|
if (dbus_error_is_set(&err)) {
|
||||||
log_error("Failed to release DBus name (%s).", err.message);
|
log_error("Failed to release DBus name (%s).", err.message);
|
||||||
dbus_error_free(&err);
|
dbus_error_free(&err);
|
||||||
@ -133,9 +191,10 @@ cdbus_destroy(session_t *ps) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Close and unref the connection
|
// Close and unref the connection
|
||||||
dbus_connection_close(ps->dbus_conn);
|
dbus_connection_close(cd->dbus_conn);
|
||||||
dbus_connection_unref(ps->dbus_conn);
|
dbus_connection_unref(cd->dbus_conn);
|
||||||
}
|
}
|
||||||
|
free(cd);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @name DBusTimeout handling
|
/** @name DBusTimeout handling
|
||||||
@ -213,7 +272,7 @@ cdbus_callback_timeout_toggled(DBusTimeout *timeout, void *data) {
|
|||||||
|
|
||||||
typedef struct ev_dbus_io {
|
typedef struct ev_dbus_io {
|
||||||
ev_io w;
|
ev_io w;
|
||||||
session_t *ps;
|
struct cdbus_data *cd;
|
||||||
DBusWatch *dw;
|
DBusWatch *dw;
|
||||||
} ev_dbus_io;
|
} ev_dbus_io;
|
||||||
|
|
||||||
@ -225,7 +284,7 @@ void cdbus_io_callback(EV_P_ ev_io *w, int revents) {
|
|||||||
if (revents & EV_WRITE)
|
if (revents & EV_WRITE)
|
||||||
flags |= DBUS_WATCH_WRITABLE;
|
flags |= DBUS_WATCH_WRITABLE;
|
||||||
dbus_watch_handle(dw->dw, flags);
|
dbus_watch_handle(dw->dw, flags);
|
||||||
while (dbus_connection_dispatch(dw->ps->dbus_conn) != DBUS_DISPATCH_COMPLETE);
|
while (dbus_connection_dispatch(dw->cd->dbus_conn) != DBUS_DISPATCH_COMPLETE);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -252,7 +311,7 @@ cdbus_callback_add_watch(DBusWatch *watch, void *data) {
|
|||||||
|
|
||||||
auto w = ccalloc(1, ev_dbus_io);
|
auto w = ccalloc(1, ev_dbus_io);
|
||||||
w->dw = watch;
|
w->dw = watch;
|
||||||
w->ps = ps;
|
w->cd = ps->dbus_data;
|
||||||
ev_io_init(&w->w, cdbus_io_callback, dbus_watch_get_unix_fd(watch),
|
ev_io_init(&w->w, cdbus_io_callback, dbus_watch_get_unix_fd(watch),
|
||||||
cdbus_get_watch_cond(watch));
|
cdbus_get_watch_cond(watch));
|
||||||
|
|
||||||
@ -460,6 +519,7 @@ static bool
|
|||||||
cdbus_signal(session_t *ps, const char *name,
|
cdbus_signal(session_t *ps, const char *name,
|
||||||
bool (*func)(session_t *ps, DBusMessage *msg, const void *data),
|
bool (*func)(session_t *ps, DBusMessage *msg, const void *data),
|
||||||
const void *data) {
|
const void *data) {
|
||||||
|
struct cdbus_data *cd = ps->dbus_data;
|
||||||
DBusMessage* msg = NULL;
|
DBusMessage* msg = NULL;
|
||||||
|
|
||||||
// Create a signal
|
// Create a signal
|
||||||
@ -477,12 +537,12 @@ cdbus_signal(session_t *ps, const char *name,
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Send the message and flush the connection
|
// Send the message and flush the connection
|
||||||
if (!dbus_connection_send(ps->dbus_conn, msg, NULL)) {
|
if (!dbus_connection_send(cd->dbus_conn, msg, NULL)) {
|
||||||
log_error("Failed to send D-Bus signal.");
|
log_error("Failed to send D-Bus signal.");
|
||||||
dbus_message_unref(msg);
|
dbus_message_unref(msg);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
dbus_connection_flush(ps->dbus_conn);
|
dbus_connection_flush(cd->dbus_conn);
|
||||||
|
|
||||||
// Free the message
|
// Free the message
|
||||||
dbus_message_unref(msg);
|
dbus_message_unref(msg);
|
||||||
@ -490,6 +550,14 @@ cdbus_signal(session_t *ps, const char *name,
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Send a signal with a Window ID as argument.
|
||||||
|
*/
|
||||||
|
static inline bool
|
||||||
|
cdbus_signal_wid(session_t *ps, const char *name, Window wid) {
|
||||||
|
return cdbus_signal(ps, name, cdbus_apdarg_wid, &wid);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Send a D-Bus reply.
|
* Send a D-Bus reply.
|
||||||
*
|
*
|
||||||
@ -503,6 +571,7 @@ static bool
|
|||||||
cdbus_reply(session_t *ps, DBusMessage *srcmsg,
|
cdbus_reply(session_t *ps, DBusMessage *srcmsg,
|
||||||
bool (*func)(session_t *ps, DBusMessage *msg, const void *data),
|
bool (*func)(session_t *ps, DBusMessage *msg, const void *data),
|
||||||
const void *data) {
|
const void *data) {
|
||||||
|
struct cdbus_data *cd = ps->dbus_data;
|
||||||
DBusMessage* msg = NULL;
|
DBusMessage* msg = NULL;
|
||||||
|
|
||||||
// Create a reply
|
// Create a reply
|
||||||
@ -519,12 +588,12 @@ cdbus_reply(session_t *ps, DBusMessage *srcmsg,
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Send the message and flush the connection
|
// Send the message and flush the connection
|
||||||
if (!dbus_connection_send(ps->dbus_conn, msg, NULL)) {
|
if (!dbus_connection_send(cd->dbus_conn, msg, NULL)) {
|
||||||
log_error("Failed to send D-Bus reply.");
|
log_error("Failed to send D-Bus reply.");
|
||||||
dbus_message_unref(msg);
|
dbus_message_unref(msg);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
dbus_connection_flush(ps->dbus_conn);
|
dbus_connection_flush(cd->dbus_conn);
|
||||||
|
|
||||||
// Free the message
|
// Free the message
|
||||||
dbus_message_unref(msg);
|
dbus_message_unref(msg);
|
||||||
@ -532,6 +601,62 @@ cdbus_reply(session_t *ps, DBusMessage *srcmsg,
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Send a reply with a bool argument.
|
||||||
|
*/
|
||||||
|
static inline bool
|
||||||
|
cdbus_reply_bool(session_t *ps, DBusMessage *srcmsg, bool bval) {
|
||||||
|
return cdbus_reply(ps, srcmsg, cdbus_apdarg_bool, &bval);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Send a reply with an int32 argument.
|
||||||
|
*/
|
||||||
|
static inline bool
|
||||||
|
cdbus_reply_int32(session_t *ps, DBusMessage *srcmsg, int32_t val) {
|
||||||
|
return cdbus_reply(ps, srcmsg, cdbus_apdarg_int32, &val);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Send a reply with an uint32 argument.
|
||||||
|
*/
|
||||||
|
static inline bool
|
||||||
|
cdbus_reply_uint32(session_t *ps, DBusMessage *srcmsg, uint32_t val) {
|
||||||
|
return cdbus_reply(ps, srcmsg, cdbus_apdarg_uint32, &val);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Send a reply with a double argument.
|
||||||
|
*/
|
||||||
|
static inline bool
|
||||||
|
cdbus_reply_double(session_t *ps, DBusMessage *srcmsg, double val) {
|
||||||
|
return cdbus_reply(ps, srcmsg, cdbus_apdarg_double, &val);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Send a reply with a wid argument.
|
||||||
|
*/
|
||||||
|
static inline bool
|
||||||
|
cdbus_reply_wid(session_t *ps, DBusMessage *srcmsg, Window wid) {
|
||||||
|
return cdbus_reply(ps, srcmsg, cdbus_apdarg_wid, &wid);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Send a reply with a string argument.
|
||||||
|
*/
|
||||||
|
static inline bool
|
||||||
|
cdbus_reply_string(session_t *ps, DBusMessage *srcmsg, const char *str) {
|
||||||
|
return cdbus_reply(ps, srcmsg, cdbus_apdarg_string, str);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Send a reply with a enum argument.
|
||||||
|
*/
|
||||||
|
static inline bool
|
||||||
|
cdbus_reply_enum(session_t *ps, DBusMessage *srcmsg, cdbus_enum_t eval) {
|
||||||
|
return cdbus_reply(ps, srcmsg, cdbus_apdarg_enum, &eval);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Send a D-Bus error reply.
|
* Send a D-Bus error reply.
|
||||||
*
|
*
|
||||||
@ -540,18 +665,19 @@ cdbus_reply(session_t *ps, DBusMessage *srcmsg,
|
|||||||
*/
|
*/
|
||||||
static bool
|
static bool
|
||||||
cdbus_reply_errm(session_t *ps, DBusMessage *msg) {
|
cdbus_reply_errm(session_t *ps, DBusMessage *msg) {
|
||||||
|
struct cdbus_data *cd = ps->dbus_data;
|
||||||
if (!msg) {
|
if (!msg) {
|
||||||
log_error("Failed to create D-Bus reply.");
|
log_error("Failed to create D-Bus reply.");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Send the message and flush the connection
|
// Send the message and flush the connection
|
||||||
if (!dbus_connection_send(ps->dbus_conn, msg, NULL)) {
|
if (!dbus_connection_send(cd->dbus_conn, msg, NULL)) {
|
||||||
log_error("Failed to send D-Bus reply.");
|
log_error("Failed to send D-Bus reply.");
|
||||||
dbus_message_unref(msg);
|
dbus_message_unref(msg);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
dbus_connection_flush(ps->dbus_conn);
|
dbus_connection_flush(cd->dbus_conn);
|
||||||
|
|
||||||
// Free the message
|
// Free the message
|
||||||
dbus_message_unref(msg);
|
dbus_message_unref(msg);
|
||||||
@ -1235,37 +1361,43 @@ cdbus_process(DBusConnection *c, DBusMessage *msg, void *ud) {
|
|||||||
///@{
|
///@{
|
||||||
void
|
void
|
||||||
cdbus_ev_win_added(session_t *ps, win *w) {
|
cdbus_ev_win_added(session_t *ps, win *w) {
|
||||||
if (ps->dbus_conn)
|
struct cdbus_data *cd = ps->dbus_data;
|
||||||
|
if (cd->dbus_conn)
|
||||||
cdbus_signal_wid(ps, "win_added", w->id);
|
cdbus_signal_wid(ps, "win_added", w->id);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
cdbus_ev_win_destroyed(session_t *ps, win *w) {
|
cdbus_ev_win_destroyed(session_t *ps, win *w) {
|
||||||
if (ps->dbus_conn)
|
struct cdbus_data *cd = ps->dbus_data;
|
||||||
|
if (cd->dbus_conn)
|
||||||
cdbus_signal_wid(ps, "win_destroyed", w->id);
|
cdbus_signal_wid(ps, "win_destroyed", w->id);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
cdbus_ev_win_mapped(session_t *ps, win *w) {
|
cdbus_ev_win_mapped(session_t *ps, win *w) {
|
||||||
if (ps->dbus_conn)
|
struct cdbus_data *cd = ps->dbus_data;
|
||||||
|
if (cd->dbus_conn)
|
||||||
cdbus_signal_wid(ps, "win_mapped", w->id);
|
cdbus_signal_wid(ps, "win_mapped", w->id);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
cdbus_ev_win_unmapped(session_t *ps, win *w) {
|
cdbus_ev_win_unmapped(session_t *ps, win *w) {
|
||||||
if (ps->dbus_conn)
|
struct cdbus_data *cd = ps->dbus_data;
|
||||||
|
if (cd->dbus_conn)
|
||||||
cdbus_signal_wid(ps, "win_unmapped", w->id);
|
cdbus_signal_wid(ps, "win_unmapped", w->id);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
cdbus_ev_win_focusout(session_t *ps, win *w) {
|
cdbus_ev_win_focusout(session_t *ps, win *w) {
|
||||||
if (ps->dbus_conn)
|
struct cdbus_data *cd = ps->dbus_data;
|
||||||
|
if (cd->dbus_conn)
|
||||||
cdbus_signal_wid(ps, "win_focusout", w->id);
|
cdbus_signal_wid(ps, "win_focusout", w->id);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
cdbus_ev_win_focusin(session_t *ps, win *w) {
|
cdbus_ev_win_focusin(session_t *ps, win *w) {
|
||||||
if (ps->dbus_conn)
|
struct cdbus_data *cd = ps->dbus_data;
|
||||||
|
if (cd->dbus_conn)
|
||||||
cdbus_signal_wid(ps, "win_focusin", w->id);
|
cdbus_signal_wid(ps, "win_focusin", w->id);
|
||||||
}
|
}
|
||||||
//!@}
|
//!@}
|
||||||
|
206
src/dbus.h
206
src/dbus.h
@ -9,182 +9,46 @@
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "common.h"
|
#include <stdbool.h>
|
||||||
|
|
||||||
#include <ctype.h>
|
#include <dbus/dbus.h>
|
||||||
#include <sys/types.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
|
|
||||||
#define CDBUS_SERVICE_NAME "com.github.chjj.compton"
|
typedef struct session session_t;
|
||||||
#define CDBUS_INTERFACE_NAME CDBUS_SERVICE_NAME
|
typedef struct win win;
|
||||||
#define CDBUS_OBJECT_NAME "/com/github/chjj/compton"
|
|
||||||
#define CDBUS_ERROR_PREFIX CDBUS_INTERFACE_NAME ".error"
|
|
||||||
#define CDBUS_ERROR_UNKNOWN CDBUS_ERROR_PREFIX ".unknown"
|
|
||||||
#define CDBUS_ERROR_UNKNOWN_S "Well, I don't know what happened. Do you?"
|
|
||||||
#define CDBUS_ERROR_BADMSG CDBUS_ERROR_PREFIX ".bad_message"
|
|
||||||
#define CDBUS_ERROR_BADMSG_S "Unrecognized command. Beware compton " \
|
|
||||||
"cannot make you a sandwich."
|
|
||||||
#define CDBUS_ERROR_BADARG CDBUS_ERROR_PREFIX ".bad_argument"
|
|
||||||
#define CDBUS_ERROR_BADARG_S "Failed to parse argument %d: %s"
|
|
||||||
#define CDBUS_ERROR_BADWIN CDBUS_ERROR_PREFIX ".bad_window"
|
|
||||||
#define CDBUS_ERROR_BADWIN_S "Requested window %#010x not found."
|
|
||||||
#define CDBUS_ERROR_BADTGT CDBUS_ERROR_PREFIX ".bad_target"
|
|
||||||
#define CDBUS_ERROR_BADTGT_S "Target \"%s\" not found."
|
|
||||||
#define CDBUS_ERROR_FORBIDDEN CDBUS_ERROR_PREFIX ".forbidden"
|
|
||||||
#define CDBUS_ERROR_FORBIDDEN_S "Incorrect password, access denied."
|
|
||||||
#define CDBUS_ERROR_CUSTOM CDBUS_ERROR_PREFIX ".custom"
|
|
||||||
#define CDBUS_ERROR_CUSTOM_S "%s"
|
|
||||||
|
|
||||||
// Window type
|
|
||||||
typedef uint32_t cdbus_window_t;
|
|
||||||
#define CDBUS_TYPE_WINDOW DBUS_TYPE_UINT32
|
|
||||||
#define CDBUS_TYPE_WINDOW_STR DBUS_TYPE_UINT32_AS_STRING
|
|
||||||
|
|
||||||
typedef uint16_t cdbus_enum_t;
|
|
||||||
#define CDBUS_TYPE_ENUM DBUS_TYPE_UINT16
|
|
||||||
#define CDBUS_TYPE_ENUM_STR DBUS_TYPE_UINT16_AS_STRING
|
|
||||||
|
|
||||||
static bool
|
|
||||||
cdbus_apdarg_bool(session_t *ps, DBusMessage *msg, const void *data);
|
|
||||||
|
|
||||||
static bool
|
|
||||||
cdbus_apdarg_int32(session_t *ps, DBusMessage *msg, const void *data);
|
|
||||||
|
|
||||||
static bool
|
|
||||||
cdbus_apdarg_uint32(session_t *ps, DBusMessage *msg, const void *data);
|
|
||||||
|
|
||||||
static bool
|
|
||||||
cdbus_apdarg_double(session_t *ps, DBusMessage *msg, const void *data);
|
|
||||||
|
|
||||||
static bool
|
|
||||||
cdbus_apdarg_wid(session_t *ps, DBusMessage *msg, const void *data);
|
|
||||||
|
|
||||||
static bool
|
|
||||||
cdbus_apdarg_enum(session_t *ps, DBusMessage *msg, const void *data);
|
|
||||||
|
|
||||||
static bool
|
|
||||||
cdbus_apdarg_string(session_t *ps, DBusMessage *msg, const void *data);
|
|
||||||
|
|
||||||
static bool
|
|
||||||
cdbus_apdarg_wids(session_t *ps, DBusMessage *msg, const void *data);
|
|
||||||
|
|
||||||
/** @name DBus signal sending
|
|
||||||
*/
|
|
||||||
///@{
|
|
||||||
|
|
||||||
static bool
|
|
||||||
cdbus_signal(session_t *ps, const char *name,
|
|
||||||
bool (*func)(session_t *ps, DBusMessage *msg, const void *data),
|
|
||||||
const void *data);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Send a signal with no argument.
|
|
||||||
*/
|
|
||||||
static inline bool
|
|
||||||
cdbus_signal_noarg(session_t *ps, const char *name) {
|
|
||||||
return cdbus_signal(ps, name, NULL, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Send a signal with a Window ID as argument.
|
|
||||||
*/
|
|
||||||
static inline bool
|
|
||||||
cdbus_signal_wid(session_t *ps, const char *name, Window wid) {
|
|
||||||
return cdbus_signal(ps, name, cdbus_apdarg_wid, &wid);
|
|
||||||
}
|
|
||||||
|
|
||||||
///@}
|
|
||||||
|
|
||||||
/** @name DBus reply sending
|
|
||||||
*/
|
|
||||||
///@{
|
|
||||||
|
|
||||||
static bool
|
|
||||||
cdbus_reply(session_t *ps, DBusMessage *srcmsg,
|
|
||||||
bool (*func)(session_t *ps, DBusMessage *msg, const void *data),
|
|
||||||
const void *data);
|
|
||||||
|
|
||||||
static bool
|
|
||||||
cdbus_reply_errm(session_t *ps, DBusMessage *msg);
|
|
||||||
|
|
||||||
#define cdbus_reply_err(ps, srcmsg, err_name, err_format, ...) \
|
|
||||||
cdbus_reply_errm((ps), dbus_message_new_error_printf((srcmsg), (err_name), (err_format), ## __VA_ARGS__))
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Send a reply with no argument.
|
|
||||||
*/
|
|
||||||
static inline bool
|
|
||||||
cdbus_reply_noarg(session_t *ps, DBusMessage *srcmsg) {
|
|
||||||
return cdbus_reply(ps, srcmsg, NULL, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Send a reply with a bool argument.
|
|
||||||
*/
|
|
||||||
static inline bool
|
|
||||||
cdbus_reply_bool(session_t *ps, DBusMessage *srcmsg, bool bval) {
|
|
||||||
return cdbus_reply(ps, srcmsg, cdbus_apdarg_bool, &bval);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Send a reply with an int32 argument.
|
|
||||||
*/
|
|
||||||
static inline bool
|
|
||||||
cdbus_reply_int32(session_t *ps, DBusMessage *srcmsg, int32_t val) {
|
|
||||||
return cdbus_reply(ps, srcmsg, cdbus_apdarg_int32, &val);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Send a reply with an uint32 argument.
|
|
||||||
*/
|
|
||||||
static inline bool
|
|
||||||
cdbus_reply_uint32(session_t *ps, DBusMessage *srcmsg, uint32_t val) {
|
|
||||||
return cdbus_reply(ps, srcmsg, cdbus_apdarg_uint32, &val);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Send a reply with a double argument.
|
|
||||||
*/
|
|
||||||
static inline bool
|
|
||||||
cdbus_reply_double(session_t *ps, DBusMessage *srcmsg, double val) {
|
|
||||||
return cdbus_reply(ps, srcmsg, cdbus_apdarg_double, &val);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Send a reply with a wid argument.
|
|
||||||
*/
|
|
||||||
static inline bool
|
|
||||||
cdbus_reply_wid(session_t *ps, DBusMessage *srcmsg, Window wid) {
|
|
||||||
return cdbus_reply(ps, srcmsg, cdbus_apdarg_wid, &wid);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Send a reply with a string argument.
|
|
||||||
*/
|
|
||||||
static inline bool
|
|
||||||
cdbus_reply_string(session_t *ps, DBusMessage *srcmsg, const char *str) {
|
|
||||||
return cdbus_reply(ps, srcmsg, cdbus_apdarg_string, str);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Send a reply with a enum argument.
|
|
||||||
*/
|
|
||||||
static inline bool
|
|
||||||
cdbus_reply_enum(session_t *ps, DBusMessage *srcmsg, cdbus_enum_t eval) {
|
|
||||||
return cdbus_reply(ps, srcmsg, cdbus_apdarg_enum, &eval);
|
|
||||||
}
|
|
||||||
|
|
||||||
///@}
|
|
||||||
|
|
||||||
static bool
|
|
||||||
cdbus_msg_get_arg(DBusMessage *msg, int count, const int type, void *pdest);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return a string representation of a D-Bus message type.
|
* Return a string representation of a D-Bus message type.
|
||||||
*/
|
*/
|
||||||
static inline const char *
|
static inline const char *cdbus_repr_msgtype(DBusMessage *msg) {
|
||||||
cdbus_repr_msgtype(DBusMessage *msg) {
|
return dbus_message_type_to_string(dbus_message_get_type(msg));
|
||||||
return dbus_message_type_to_string(dbus_message_get_type(msg));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
///@}
|
/**
|
||||||
|
* Initialize D-Bus connection.
|
||||||
|
*/
|
||||||
|
bool cdbus_init(session_t *ps);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Destroy D-Bus connection.
|
||||||
|
*/
|
||||||
|
void cdbus_destroy(session_t *ps);
|
||||||
|
|
||||||
|
/// Generate dbus win_added signal
|
||||||
|
void cdbus_ev_win_added(session_t *ps, win *w);
|
||||||
|
|
||||||
|
/// Generate dbus win_destroyed signal
|
||||||
|
void cdbus_ev_win_destroyed(session_t *ps, win *w);
|
||||||
|
|
||||||
|
/// Generate dbus win_mapped signal
|
||||||
|
void cdbus_ev_win_mapped(session_t *ps, win *w);
|
||||||
|
|
||||||
|
/// Generate dbus win_unmapped signal
|
||||||
|
void cdbus_ev_win_unmapped(session_t *ps, win *w);
|
||||||
|
|
||||||
|
/// Generate dbus win_focusout signal
|
||||||
|
void cdbus_ev_win_focusout(session_t *ps, win *w);
|
||||||
|
|
||||||
|
/// Generate dbus win_focusin signal
|
||||||
|
void cdbus_ev_win_focusin(session_t *ps, win *w);
|
||||||
|
|
||||||
|
// vim: set noet sw=8 ts=8 :
|
||||||
|
@ -17,6 +17,10 @@
|
|||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
#include "log.h"
|
#include "log.h"
|
||||||
|
|
||||||
|
#ifdef CONFIG_DBUS
|
||||||
|
#include "dbus.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
#include "win.h"
|
#include "win.h"
|
||||||
|
|
||||||
/// Generate a "return by value" function, from a function that returns the
|
/// Generate a "return by value" function, from a function that returns the
|
||||||
|
Loading…
Reference in New Issue
Block a user