This commit is contained in:
Sascha Kruse 2011-09-16 01:11:49 +02:00
parent e5ebf7fef0
commit cc1d90adca
3 changed files with 75 additions and 17 deletions

View File

@ -21,6 +21,8 @@ dunst \- dmenu\-ish universal notification system
.IR color ]
.RB [ \-to
.IR secs ]
.RB [ \-format
.IR fmt ]
.RB [ \-key
.IR key ]
.RB [ \-mod
@ -69,6 +71,9 @@ close window by pressing key [a,b,space,Return etc.] (should be used in combinat
.BI \-mod " modifier"
defines the modifier for the key. Available modifiers are: ctrl,shift,mod1 (usually the alt-key),mod2,mod3,mod4 (usually windows key). This option can be used multiple times to combine modifiers.
.TP
.BI \-format " fmt"
defines the format of the messages. See FORMAT.
.TP
.BI \-mon " n"
show the notification on monitor n.
.TP
@ -76,6 +81,19 @@ show the notification on monitor n.
The geometry of the message window. The height is measured in lines everything else in pixels. If the width is omitted but the height is given ("-geometry x2"), the message window expands over the whole screen (dmenu-like). If width is 0, the window expands to the longest message displayed. A positive x is measured from the left, a negative from the right side of the screen. Y is measured from the top and down respectevly. see also EXAMPLES
show the notification on monitor n.
.SH FORMAT
fmt is a string containing placeholders. The placeholders will be replaced with the corresponding text, or if the text is not present, nothing.
Possible placeholders are:
.TP
%a appname
.TP
%s summary
.TP
%b body
.TP
%i iconname (including its path)
.TP
%I iconname (without its path)
.SH EXAMPLES
.BI "dunst " \-geometry " x2"
Displays a maximum of two lines across the top of the screen.

52
dunst.c
View File

@ -1,3 +1,4 @@
#define _GNU_SOURCE
#include <unistd.h>
#include <time.h>
#include <stdio.h>
@ -65,6 +66,7 @@ static KeySym mask = 0;
static screen_info scr;
static dimension_t geometry;
static int font_h;
static const char *format = "%s %b";
/* list functions */
msg_queue_t *append(msg_queue_t *queue, char *msg, int to, int urgency);
@ -77,7 +79,9 @@ int list_len(msg_queue_t *list);
void check_timeouts(void);
void delete_msg(msg_queue_t *elem);
void drawmsg(void);
char *format_msg(const char *app, const char *sum, const char *body, const char *icon);
void handleXEvents(void);
char *string_replace(const char *needle, const char *replacement, char *haystack);
void run(void);
void setup(void);
void show_win(void);
@ -303,6 +307,23 @@ drawmsg(void) {
mapdc(dc, win, width, height*font_h);
}
char *
_do_replace(char *buf, char *replace_buf, const char *to_replace, const char *replacement) {
char *replace_buf_old = strdup(replace_buf);
if(strstr(replace_buf, to_replace)) {
if(strlen(replacement) > 0) {
replace_buf = string_replace("%{", "", replace_buf);
replace_buf = string_replace(to_replace, replacement, replace_buf);
replace_buf[strlen(replace_buf)-1] = '\0';
buf = string_replace(replace_buf_old, replace_buf, buf);
} else {
buf = string_replace(replace_buf, "", buf);
}
}
return buf;
}
void
handleXEvents(void) {
XEvent ev;
@ -333,6 +354,32 @@ handleXEvents(void) {
}
}
char *
string_replace(const char *needle, const char *replacement, char *haystack) {
char *tmp, *start;
int size;
start = strstr(haystack, needle);
if(start == NULL) {
return haystack;
}
size = (strlen(haystack) - strlen(needle)) + strlen(replacement) + 1;
tmp = calloc(sizeof(char), size);
memset(tmp, '\0', size);
strncpy(tmp, haystack, start-haystack);
tmp[start-haystack] = '\0';
sprintf(tmp+strlen(tmp), "%s%s", replacement, start+strlen(needle));
free(haystack);
if(strstr(tmp, needle)) {
return string_replace(needle, replacement, tmp);
} else {
return tmp;
}
}
void
run(void) {
@ -534,6 +581,9 @@ main(int argc, char *argv[]) {
else if(!strcmp(argv[i], "-mon")) {
scr.scr = atoi(argv[++i]);
}
else if(!strcmp(argv[i], "-format")) {
format = argv[++i];
}
else if(!strcmp(argv[i], "-key")) {
key = XStringToKeysym(argv[i+1]);
if(key == NoSymbol) {
@ -588,6 +638,6 @@ main(int argc, char *argv[]) {
void
usage(int exit_status) {
fputs("usage: dunst [-h/--help] [-geometry geom] [-fn font]\n[-nb color] [-nf color] [-lb color] [-lf color] [-cb color] [ -cf color]\n[-to secs] [-key key] [-mod modifier] [-mon n] [-msg msg]\n", stderr);
fputs("usage: dunst [-h/--help] [-geometry geom] [-fn font] [-format fmt]\n[-nb color] [-nf color] [-lb color] [-lf color] [-cb color] [ -cf color]\n[-to secs] [-key key] [-mod modifier] [-mon n] [-msg msg]\n", stderr);
exit(exit_status);
}

View File

@ -210,22 +210,12 @@ notify(DBusMessage *dmsg) {
if(strlen(body) > 0) {
msg = malloc(
strlen(appname)
+strlen(summary)
+strlen(body)
+strlen(": -- ")
+5);
sprintf(msg, "%s: %s -- %s", appname, summary, body);
} else {
msg = malloc(
strlen(appname)
+strlen(summary)
+strlen(": ")
+5);
sprintf(msg, "%s: %s", appname, summary);
}
msg = string_replace("%a", appname, strdup(format));
msg = string_replace("%s", summary, msg);
msg = string_replace("%i", icon, msg);
msg = string_replace("%I", basename(icon), msg);
msg = string_replace("%b", body, msg);
if(expires > 0) {
expires = expires/1000;