Пример #1
0
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);
}
Пример #2
0
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);
}