void notify(DBusMessage *dmsg) { DBusMessage *reply; DBusMessageIter args; DBusMessageIter hints; DBusMessageIter hint; char *hint_name; int i; int id = 23; const char *appname = NULL; const char *summary = NULL; const char *body = NULL; const char *icon = NULL; const char *fgcolor = NULL; const char *bgcolor = NULL; int urgency = 1; msg_queue_t *msg = malloc(sizeof(msg_queue_t)); dbus_uint32_t nid=0; dbus_int32_t expires=-1; dbus_serial++; dunst_printf(DEBUG, "new dbus message\n"); dbus_message_iter_init(dmsg, &args); dunst_printf(DEBUG, "extracting appname\n"); _extract_basic(DBUS_TYPE_STRING, &args, &appname); dbus_message_iter_next( &args ); dunst_printf(DEBUG, "extracting nid\n"); _extract_basic(DBUS_TYPE_UINT32, &args, &nid); dbus_message_iter_next( &args ); dunst_printf(DEBUG, "extracting icon\n"); _extract_basic(DBUS_TYPE_STRING, &args, &icon); dbus_message_iter_next( &args ); dunst_printf(DEBUG, "extracting summary\n"); _extract_basic(DBUS_TYPE_STRING, &args, &summary); dbus_message_iter_next( &args ); dunst_printf(DEBUG, "extracting body\n"); _extract_basic(DBUS_TYPE_STRING, &args, &body); dbus_message_iter_next( &args ); dbus_message_iter_next( &args ); dunst_printf(DEBUG, "extracting hints\n"); dbus_message_iter_recurse(&args, &hints); dbus_message_iter_next( &args ); dunst_printf(DEBUG, "extracting expires\n"); _extract_basic(DBUS_TYPE_INT32, &args, &expires); dunst_printf(DEBUG, "extracting hints\n"); while (dbus_message_iter_get_arg_type(&hints) != DBUS_TYPE_INVALID) { dbus_message_iter_recurse(&hints, &hint); while (dbus_message_iter_get_arg_type(&hint) != DBUS_TYPE_INVALID) { if(dbus_message_iter_get_arg_type(&hint) != DBUS_TYPE_STRING) { dbus_message_iter_next(&hint); continue; } dbus_message_iter_get_basic(&hint, &hint_name); _extract_hint("urgency", hint_name, &hint, &urgency); _extract_hint("fgcolor", hint_name, &hint, &fgcolor); _extract_hint("bgcolor", hint_name, &hint, &bgcolor); dbus_message_iter_next(&hint); } dbus_message_iter_next(&hints); } if(expires > 0) { /* do some rounding */ expires = (expires+500)/1000; if(expires < 1) { expires = 1; } } msg->appname = strdup(appname); msg->summary = strdup(summary); msg->body = strdup(body); msg->icon = strdup(icon); msg->timeout = expires; msg->urgency = urgency; for(i = 0; i < ColLast; i++) { msg->color_strings[i] = NULL; } msg->color_strings[ColFG] = fgcolor == NULL ? NULL : strdup(fgcolor); msg->color_strings[ColBG] = bgcolor == NULL ? NULL : strdup(bgcolor); initmsg(msg); msgqueue = add(msgqueue, msg); drawmsg(); reply = dbus_message_new_method_return(dmsg); dbus_message_iter_init_append(reply, &args); dbus_message_iter_append_basic(&args, DBUS_TYPE_UINT32, &id); dbus_connection_send(dbus_conn, reply, &dbus_serial); dbus_message_unref(reply); }
void notify(DBusMessage * dmsg) { DBusMessage *reply; DBusMessageIter args; DBusMessageIter hints; DBusMessageIter hint; char *hint_name; int i; int id; const char *appname = NULL; const char *summary = NULL; const char *body = NULL; const char *icon = NULL; const char *fgcolor = NULL; const char *bgcolor = NULL; int urgency = 1; int progress = -1; notification *n = malloc(sizeof(notification)); dbus_uint32_t replaces_id = 0; dbus_int32_t expires = -1; dbus_serial++; dbus_message_iter_init(dmsg, &args); _extract_basic(DBUS_TYPE_STRING, &args, &appname); dbus_message_iter_next(&args); _extract_basic(DBUS_TYPE_UINT32, &args, &replaces_id); dbus_message_iter_next(&args); _extract_basic(DBUS_TYPE_STRING, &args, &icon); dbus_message_iter_next(&args); _extract_basic(DBUS_TYPE_STRING, &args, &summary); dbus_message_iter_next(&args); _extract_basic(DBUS_TYPE_STRING, &args, &body); dbus_message_iter_next(&args); dbus_message_iter_next(&args); dbus_message_iter_recurse(&args, &hints); dbus_message_iter_next(&args); _extract_basic(DBUS_TYPE_INT32, &args, &expires); while (dbus_message_iter_get_arg_type(&hints) != DBUS_TYPE_INVALID) { dbus_message_iter_recurse(&hints, &hint); while (dbus_message_iter_get_arg_type(&hint) != DBUS_TYPE_INVALID) { if (dbus_message_iter_get_arg_type(&hint) != DBUS_TYPE_STRING) { dbus_message_iter_next(&hint); continue; } dbus_message_iter_get_basic(&hint, &hint_name); _extract_hint(DBUS_TYPE_BYTE, "urgency", hint_name, &hint, &urgency); _extract_hint(DBUS_TYPE_STRING, "fgcolor", hint_name, &hint, &fgcolor); _extract_hint(DBUS_TYPE_STRING, "bgcolor", hint_name, &hint, &bgcolor); _extract_hint(DBUS_TYPE_INT32, "value", hint_name, &hint, &progress); if (!progress) _extract_hint(DBUS_TYPE_UINT32, "value", hint_name, &hint, &progress); dbus_message_iter_next(&hint); } dbus_message_iter_next(&hints); } if (expires > 0) { /* do some rounding */ expires = (expires + 500) / 1000; if (expires < 1) { expires = 1; } } n->appname = appname != NULL ? strdup(appname) : ""; n->summary = summary != NULL ? strdup(summary) : ""; n->body = body != NULL ? strdup(body) : ""; n->icon = icon != NULL ? strdup(icon) : ""; n->timeout = expires; n->progress = (progress < 0 || progress > 100) ? 0 : progress + 1; n->urgency = urgency; n->dbus_client = strdup(dbus_message_get_sender(dmsg)); for (i = 0; i < ColLast; i++) { n->color_strings[i] = NULL; } n->color_strings[ColFG] = fgcolor == NULL ? NULL : strdup(fgcolor); n->color_strings[ColBG] = bgcolor == NULL ? NULL : strdup(bgcolor); id = init_notification(n, replaces_id); if (id > 0) map_win(); reply = dbus_message_new_method_return(dmsg); dbus_message_iter_init_append(reply, &args); dbus_message_iter_append_basic(&args, DBUS_TYPE_UINT32, &id); dbus_connection_send(dbus_conn, reply, &dbus_serial); dbus_message_unref(reply); }