snoti/dbus.c
2025-12-30 22:46:42 +09:00

104 lines
3.4 KiB
C

#include <dbus/dbus.h>
#include "dat.h"
#include "fn.h"
static DBusConnection *conn;
static u32int notifyid = 1;
static void
sendnoti(DBusMessage *msg)
{
DBusMessageIter args;
Noti n;
char *summary, *body;
if(!dbus_message_iter_init(msg, &args))
return;
dbus_message_iter_next(&args);
dbus_message_iter_next(&args);
dbus_message_iter_next(&args);
if(dbus_message_iter_get_arg_type(&args) != DBUS_TYPE_STRING)
return;
dbus_message_iter_get_basic(&args, &summary);
dbus_message_iter_next(&args);
if(dbus_message_iter_get_arg_type(&args) != DBUS_TYPE_STRING)
return;
dbus_message_iter_get_basic(&args, &body);
notifyid++;
sinit(&n.summary, summary, strlen(summary));
sinit(&n.body, body, strlen(body));
send(notic, &n);
}
static DBusHandlerResult
filter(DBusConnection *c, DBusMessage *msg, void *data)
{
DBusMessage *reply;
DBusMessageIter iter, arr;
u32int id;
char *s;
USED(c);
USED(data);
if(dbus_message_is_method_call(msg, "org.freedesktop.Notifications", "Notify")){
sendnoti(msg);
reply = dbus_message_new_method_return(msg);
id = notifyid - 1;
dbus_message_append_args(reply, DBUS_TYPE_UINT32, &id, DBUS_TYPE_INVALID);
dbus_connection_send(conn, reply, nil);
dbus_message_unref(reply);
return DBUS_HANDLER_RESULT_HANDLED;
}
if(dbus_message_is_method_call(msg, "org.freedesktop.Notifications", "GetCapabilities")){
reply = dbus_message_new_method_return(msg);
dbus_message_iter_init_append(reply, &iter);
dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, "s", &arr);
s = "body"; dbus_message_iter_append_basic(&arr, DBUS_TYPE_STRING, &s);
s = "body-markup"; dbus_message_iter_append_basic(&arr, DBUS_TYPE_STRING, &s);
s = "icon-static"; dbus_message_iter_append_basic(&arr, DBUS_TYPE_STRING, &s);
s = "actions"; dbus_message_iter_append_basic(&arr, DBUS_TYPE_STRING, &s);
s = "persistence"; dbus_message_iter_append_basic(&arr, DBUS_TYPE_STRING, &s);
dbus_message_iter_close_container(&iter, &arr);
dbus_connection_send(conn, reply, nil);
dbus_message_unref(reply);
return DBUS_HANDLER_RESULT_HANDLED;
}
if(dbus_message_is_method_call(msg, "org.freedesktop.Notifications", "GetServerInformation")){
reply = dbus_message_new_method_return(msg);
s = "snoti"; dbus_message_append_args(reply, DBUS_TYPE_STRING, &s, DBUS_TYPE_INVALID);
s = "plan9"; dbus_message_append_args(reply, DBUS_TYPE_STRING, &s, DBUS_TYPE_INVALID);
s = "1.0"; dbus_message_append_args(reply, DBUS_TYPE_STRING, &s, DBUS_TYPE_INVALID);
s = "1.2"; dbus_message_append_args(reply, DBUS_TYPE_STRING, &s, DBUS_TYPE_INVALID);
dbus_connection_send(conn, reply, nil);
dbus_message_unref(reply);
return DBUS_HANDLER_RESULT_HANDLED;
}
if(dbus_message_is_method_call(msg, "org.freedesktop.Notifications", "CloseNotification")){
reply = dbus_message_new_method_return(msg);
dbus_connection_send(conn, reply, nil);
dbus_message_unref(reply);
return DBUS_HANDLER_RESULT_HANDLED;
}
return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
}
void
dbusthread(void*)
{
DBusError err;
int ret;
dbus_error_init(&err);
conn = dbus_bus_get(DBUS_BUS_SESSION, &err);
if(dbus_error_is_set(&err))
die("dbus: %s", err.message);
ret = dbus_bus_request_name(conn, "org.freedesktop.Notifications",
DBUS_NAME_FLAG_REPLACE_EXISTING, &err);
if(ret != DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER)
die("dbus: can't get name");
dbus_connection_add_filter(conn, filter, nil, nil);
while(dbus_connection_read_write_dispatch(conn, 100))
;
die("dbus: connection lost");
}