diff --git a/README.1 b/README.1 index 5ef80e0..78251a3 100644 --- a/README.1 +++ b/README.1 @@ -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. diff --git a/dunst.c b/dunst.c index 147e4fb..3539092 100644 --- a/dunst.c +++ b/dunst.c @@ -1,3 +1,4 @@ +#define _GNU_SOURCE #include #include #include @@ -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); } diff --git a/dunst_dbus.c b/dunst_dbus.c index 4dca948..ccc46de 100644 --- a/dunst_dbus.c +++ b/dunst_dbus.c @@ -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;