new option to sort messages by order
This commit is contained in:
parent
22859984ed
commit
5915cbdd9f
@ -60,6 +60,14 @@ defines the format of the message. See FORMAT.
|
|||||||
|
|
||||||
show the notification on monitor n.
|
show the notification on monitor n.
|
||||||
|
|
||||||
|
=item B<-s>
|
||||||
|
|
||||||
|
sort messages by urgency.
|
||||||
|
|
||||||
|
=item B<-ns>
|
||||||
|
|
||||||
|
don't sort messages by urgency.
|
||||||
|
|
||||||
=item B<-geometry [{width}]x{height}][+/-{x}+/-{y}]>
|
=item B<-geometry [{width}]x{height}][+/-{x}+/-{y}]>
|
||||||
|
|
||||||
The geometry of the message window. The height is measured
|
The geometry of the message window. The height is measured
|
||||||
|
@ -19,6 +19,7 @@ const char *lowfgcolor = "#000000";
|
|||||||
const char *format = "%s %b"; /* default format */
|
const char *format = "%s %b"; /* default format */
|
||||||
int timeouts[] = { 10, 10, 0 }; /* low, normal, critical */
|
int timeouts[] = { 10, 10, 0 }; /* low, normal, critical */
|
||||||
const char *geom = "0x3-30+20"; /* geometry */
|
const char *geom = "0x3-30+20"; /* geometry */
|
||||||
|
int sort = True; /* sort messages by urgency */
|
||||||
/* const char *geom = "x1"; */
|
/* const char *geom = "x1"; */
|
||||||
|
|
||||||
|
|
||||||
|
119
dunst.c
119
dunst.c
@ -51,7 +51,7 @@ static dimension_t geometry;
|
|||||||
static int font_h;
|
static int font_h;
|
||||||
|
|
||||||
/* list functions */
|
/* list functions */
|
||||||
msg_queue_t *append(msg_queue_t *queue, msg_queue_t *msg);
|
msg_queue_t *add(msg_queue_t *queue, msg_queue_t *msg);
|
||||||
msg_queue_t *delete(msg_queue_t *elem);
|
msg_queue_t *delete(msg_queue_t *elem);
|
||||||
int list_len(msg_queue_t *list);
|
int list_len(msg_queue_t *list);
|
||||||
|
|
||||||
@ -66,6 +66,7 @@ void dunst_printf(int level, const char *fmt, ...);
|
|||||||
char *fix_markup(char *str);
|
char *fix_markup(char *str);
|
||||||
void free_msgqueue_t(msg_queue_t *elem);
|
void free_msgqueue_t(msg_queue_t *elem);
|
||||||
void handleXEvents(void);
|
void handleXEvents(void);
|
||||||
|
void initmsg(msg_queue_t *msg);
|
||||||
char *string_replace(const char *needle, const char *replacement, char *haystack);
|
char *string_replace(const char *needle, const char *replacement, char *haystack);
|
||||||
void run(void);
|
void run(void);
|
||||||
void setup(void);
|
void setup(void);
|
||||||
@ -74,53 +75,40 @@ void usage(int exit_status);
|
|||||||
|
|
||||||
#include "dunst_dbus.h"
|
#include "dunst_dbus.h"
|
||||||
|
|
||||||
static void
|
|
||||||
_set_color(msg_queue_t *msg, int color_idx) {
|
|
||||||
Colormap cmap = DefaultColormap(dc->dpy, DefaultScreen(dc->dpy));
|
|
||||||
XColor color;
|
|
||||||
if(msg->color_strings[color_idx] == NULL
|
|
||||||
|| !XAllocNamedColor(dc->dpy, cmap,
|
|
||||||
msg->color_strings[color_idx], &color, &color)) {
|
|
||||||
msg->colors[color_idx] = colors[msg->urgency][color_idx];
|
|
||||||
} else {
|
|
||||||
msg->colors[color_idx] = color.pixel;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
msg_queue_t*
|
msg_queue_t*
|
||||||
append(msg_queue_t *queue, msg_queue_t *new) {
|
add(msg_queue_t *queue, msg_queue_t *new) {
|
||||||
msg_queue_t *last;
|
msg_queue_t *i;
|
||||||
|
msg_queue_t *prev = NULL;
|
||||||
|
|
||||||
new->format = format;
|
|
||||||
apply_rules(new);
|
|
||||||
|
|
||||||
new->msg = string_replace("%a", new->appname, strdup(new->format));
|
|
||||||
new->msg = string_replace("%s", new->summary, new->msg);
|
|
||||||
new->msg = string_replace("%i", new->icon, new->msg);
|
|
||||||
new->msg = string_replace("%I", basename(new->icon), new->msg);
|
|
||||||
new->msg = string_replace("%b", new->body, new->msg);
|
|
||||||
|
|
||||||
new->msg = fix_markup(new->msg);
|
|
||||||
/* urgency > CRIT -> array out of range */
|
|
||||||
new->urgency = new->urgency > CRIT ? CRIT : new->urgency;
|
|
||||||
|
|
||||||
_set_color(new, ColFG);
|
|
||||||
_set_color(new, ColBG);
|
|
||||||
|
|
||||||
new->timeout = new->timeout == -1 ? timeouts[new->urgency] : new->timeout;
|
|
||||||
new->start = 0;
|
|
||||||
|
|
||||||
dunst_printf(MSG, "%s\n", new->msg);
|
|
||||||
dunst_printf(INFO, "{\n appname: %s\n summary: %s\n body: %s\n icon: %s\n urgency: %d\n timeout: %d\n}",
|
|
||||||
new->appname, new->summary, new->body, new->icon, new->urgency, new->timeout);
|
|
||||||
|
|
||||||
new->next = NULL;
|
new->next = NULL;
|
||||||
if(queue == NULL) {
|
if(queue == NULL) {
|
||||||
return new;
|
return new;
|
||||||
}
|
}
|
||||||
for(last = queue; last->next; last = last->next);
|
|
||||||
last->next = new;
|
if(sort) {
|
||||||
|
for(i = queue; i->next; i = i->next) {
|
||||||
|
if(new->urgency > i->urgency) {
|
||||||
|
if (!prev) {
|
||||||
|
/* we are at the first element */
|
||||||
|
queue = new;
|
||||||
|
new->next = i;
|
||||||
|
return queue;
|
||||||
|
} else {
|
||||||
|
prev->next = new;
|
||||||
|
new->next = i;
|
||||||
|
return queue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
prev = i;
|
||||||
|
}
|
||||||
|
/* we've reached the end of the queue */
|
||||||
|
i->next = new;
|
||||||
|
new->next = NULL;
|
||||||
|
} else {
|
||||||
|
for(i = queue; i->next; i = i->next);
|
||||||
|
i->next = new;
|
||||||
|
}
|
||||||
return queue;
|
return queue;
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -424,6 +412,46 @@ handleXEvents(void) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_set_color(msg_queue_t *msg, int color_idx) {
|
||||||
|
Colormap cmap = DefaultColormap(dc->dpy, DefaultScreen(dc->dpy));
|
||||||
|
XColor color;
|
||||||
|
if(msg->color_strings[color_idx] == NULL
|
||||||
|
|| !XAllocNamedColor(dc->dpy, cmap,
|
||||||
|
msg->color_strings[color_idx], &color, &color)) {
|
||||||
|
msg->colors[color_idx] = colors[msg->urgency][color_idx];
|
||||||
|
} else {
|
||||||
|
msg->colors[color_idx] = color.pixel;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
initmsg(msg_queue_t *msg) {
|
||||||
|
msg->format = format;
|
||||||
|
apply_rules(msg);
|
||||||
|
|
||||||
|
msg->msg = string_replace("%a", msg->appname, strdup(msg->format));
|
||||||
|
msg->msg = string_replace("%s", msg->summary, msg->msg);
|
||||||
|
msg->msg = string_replace("%i", msg->icon, msg->msg);
|
||||||
|
msg->msg = string_replace("%I", basename(msg->icon), msg->msg);
|
||||||
|
msg->msg = string_replace("%b", msg->body, msg->msg);
|
||||||
|
|
||||||
|
msg->msg = fix_markup(msg->msg);
|
||||||
|
/* urgency > CRIT -> array out of range */
|
||||||
|
msg->urgency = msg->urgency > CRIT ? CRIT : msg->urgency;
|
||||||
|
|
||||||
|
_set_color(msg, ColFG);
|
||||||
|
_set_color(msg, ColBG);
|
||||||
|
|
||||||
|
msg->timeout = msg->timeout == -1 ? timeouts[msg->urgency] : msg->timeout;
|
||||||
|
msg->start = 0;
|
||||||
|
|
||||||
|
dunst_printf(MSG, "%s\n", msg->msg);
|
||||||
|
dunst_printf(INFO, "{\n appname: %s\n summary: %s\n body: %s\n icon: %s\n urgency: %d\n timeout: %d\n}",
|
||||||
|
msg->appname, msg->summary, msg->body, msg->icon, msg->urgency, msg->timeout);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
char *
|
char *
|
||||||
string_replace(const char *needle, const char *replacement, char *haystack) {
|
string_replace(const char *needle, const char *replacement, char *haystack) {
|
||||||
char *tmp, *start;
|
char *tmp, *start;
|
||||||
@ -572,13 +600,14 @@ main(int argc, char *argv[]) {
|
|||||||
{"key", required_argument, NULL, 'k'},
|
{"key", required_argument, NULL, 'k'},
|
||||||
{"geometry", required_argument, NULL, 'g'},
|
{"geometry", required_argument, NULL, 'g'},
|
||||||
{"mod", required_argument, NULL, 'M'},
|
{"mod", required_argument, NULL, 'M'},
|
||||||
|
{"ns", no_argument, NULL, 'x'},
|
||||||
{0,0,0,0}
|
{0,0,0,0}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
int option_index = 0;
|
int option_index = 0;
|
||||||
|
|
||||||
c = getopt_long_only(argc, argv, "bhv", long_options, &option_index);
|
c = getopt_long_only(argc, argv, "bhsv", long_options, &option_index);
|
||||||
|
|
||||||
if(c == -1) {
|
if(c == -1) {
|
||||||
break;
|
break;
|
||||||
@ -659,6 +688,12 @@ main(int argc, char *argv[]) {
|
|||||||
fprintf(stderr, "See manpage for list of available masks\n");
|
fprintf(stderr, "See manpage for list of available masks\n");
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case 's':
|
||||||
|
sort = True;
|
||||||
|
break;
|
||||||
|
case 'x':
|
||||||
|
sort = False;
|
||||||
|
break;
|
||||||
case 'v':
|
case 'v':
|
||||||
verbosity++;
|
verbosity++;
|
||||||
break;
|
break;
|
||||||
|
@ -274,7 +274,8 @@ notify(DBusMessage *dmsg) {
|
|||||||
}
|
}
|
||||||
msg->color_strings[ColFG] = fgcolor == NULL ? NULL : strdup(fgcolor);
|
msg->color_strings[ColFG] = fgcolor == NULL ? NULL : strdup(fgcolor);
|
||||||
msg->color_strings[ColBG] = bgcolor == NULL ? NULL : strdup(bgcolor);
|
msg->color_strings[ColBG] = bgcolor == NULL ? NULL : strdup(bgcolor);
|
||||||
msgqueue = append(msgqueue, msg);
|
initmsg(msg);
|
||||||
|
msgqueue = add(msgqueue, msg);
|
||||||
drawmsg();
|
drawmsg();
|
||||||
|
|
||||||
reply = dbus_message_new_method_return(dmsg);
|
reply = dbus_message_new_method_return(dmsg);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user