history
This commit is contained in:
parent
dcb451cadc
commit
ccd5cd063b
77
dunst.c
77
dunst.c
@ -54,6 +54,7 @@ char *geom = "0x0"; /* geometry */
|
|||||||
int sort = True; /* sort messages by urgency */
|
int sort = True; /* sort messages by urgency */
|
||||||
int indicate_hidden = True; /* show count of hidden messages */
|
int indicate_hidden = True; /* show count of hidden messages */
|
||||||
char *key_string = NULL;
|
char *key_string = NULL;
|
||||||
|
char *history_key_string = NULL;
|
||||||
KeySym mask = 0;
|
KeySym mask = 0;
|
||||||
int idle_threshold = 0;
|
int idle_threshold = 0;
|
||||||
|
|
||||||
@ -68,9 +69,11 @@ static Atom utf8;
|
|||||||
static DC *dc;
|
static DC *dc;
|
||||||
static Window win;
|
static Window win;
|
||||||
static msg_queue_t *msgqueue = NULL;
|
static msg_queue_t *msgqueue = NULL;
|
||||||
|
static msg_queue_t *history = NULL;
|
||||||
static time_t now;
|
static time_t now;
|
||||||
static int visible = False;
|
static int visible = False;
|
||||||
static KeySym key = NoSymbol;
|
static KeySym key = NoSymbol;
|
||||||
|
static KeySym history_key = NoSymbol;
|
||||||
static screen_info scr;
|
static screen_info scr;
|
||||||
static dimension_t geometry;
|
static dimension_t geometry;
|
||||||
static XScreenSaverInfo *screensaver_info;
|
static XScreenSaverInfo *screensaver_info;
|
||||||
@ -80,6 +83,7 @@ static char *config_file;
|
|||||||
/* list functions */
|
/* list functions */
|
||||||
msg_queue_t *add(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);
|
||||||
|
msg_queue_t *pop(msg_queue_t *list, msg_queue_t **target);
|
||||||
int list_len(msg_queue_t *list);
|
int list_len(msg_queue_t *list);
|
||||||
|
|
||||||
|
|
||||||
@ -91,9 +95,9 @@ void delete_msg(msg_queue_t *elem);
|
|||||||
void drawmsg(void);
|
void drawmsg(void);
|
||||||
void dunst_printf(int level, const char *fmt, ...);
|
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 handle_mouse_click(XEvent ev);
|
void handle_mouse_click(XEvent ev);
|
||||||
void handleXEvents(void);
|
void handleXEvents(void);
|
||||||
|
void history_pop(void);
|
||||||
void initmsg(msg_queue_t *msg);
|
void initmsg(msg_queue_t *msg);
|
||||||
rule_t *initrule(void);
|
rule_t *initrule(void);
|
||||||
int is_idle(void);
|
int is_idle(void);
|
||||||
@ -202,7 +206,7 @@ delete(msg_queue_t *elem) {
|
|||||||
|
|
||||||
if(elem == msgqueue) {
|
if(elem == msgqueue) {
|
||||||
next = elem->next;
|
next = elem->next;
|
||||||
free_msgqueue_t(elem);
|
history = add(history, elem);
|
||||||
return next;
|
return next;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -218,7 +222,7 @@ delete(msg_queue_t *elem) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
prev->next = next;
|
prev->next = next;
|
||||||
free_msgqueue_t(elem);
|
history = add(history, elem);
|
||||||
return msgqueue;
|
return msgqueue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -234,6 +238,34 @@ int list_len(msg_queue_t *list) {
|
|||||||
return count;
|
return count;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
msg_queue_t*
|
||||||
|
pop(msg_queue_t *list, msg_queue_t **target) {
|
||||||
|
msg_queue_t *prev = NULL;
|
||||||
|
msg_queue_t *cur = NULL;
|
||||||
|
|
||||||
|
if (!list) {
|
||||||
|
*target = NULL;
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!list->next) {
|
||||||
|
*target = list;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
cur = list->next;
|
||||||
|
prev = list;
|
||||||
|
while(cur->next) {
|
||||||
|
cur = cur->next;
|
||||||
|
prev = prev->next;
|
||||||
|
}
|
||||||
|
|
||||||
|
prev->next = NULL;
|
||||||
|
|
||||||
|
*target = cur;
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
check_timeouts(void) {
|
check_timeouts(void) {
|
||||||
msg_queue_t *cur, *next;
|
msg_queue_t *cur, *next;
|
||||||
@ -449,15 +481,6 @@ char
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
|
||||||
free_msgqueue_t(msg_queue_t *elem) {
|
|
||||||
free(elem->appname);
|
|
||||||
free(elem->summary);
|
|
||||||
free(elem->body);
|
|
||||||
free(elem->icon);
|
|
||||||
free(elem->msg);
|
|
||||||
free(elem);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
handle_mouse_click(XEvent ev) {
|
handle_mouse_click(XEvent ev) {
|
||||||
@ -500,9 +523,26 @@ handleXEvents(void) {
|
|||||||
if(XLookupKeysym(&ev.xkey, 0) == key) {
|
if(XLookupKeysym(&ev.xkey, 0) == key) {
|
||||||
delete_msg(NULL);
|
delete_msg(NULL);
|
||||||
}
|
}
|
||||||
|
if(XLookupKeysym(&ev.xkey, 0) == history_key) {
|
||||||
|
history_pop();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
history_pop(void) {
|
||||||
|
msg_queue_t *elem = NULL;
|
||||||
|
history = pop(history, &elem);
|
||||||
|
if(!elem) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
msgqueue = add(msgqueue, elem);
|
||||||
|
elem->timeout = elem->timeout == -1 ? timeouts[elem->urgency] : elem->timeout;
|
||||||
|
|
||||||
|
elem->start = 0;
|
||||||
|
drawmsg();
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
initmsg(msg_queue_t *msg) {
|
initmsg(msg_queue_t *msg) {
|
||||||
@ -668,6 +708,11 @@ setup(void) {
|
|||||||
code = XKeysymToKeycode(dc->dpy, key);
|
code = XKeysymToKeycode(dc->dpy, key);
|
||||||
XGrabKey(dc->dpy, code, mask, root, True, GrabModeAsync, GrabModeAsync);
|
XGrabKey(dc->dpy, code, mask, root, True, GrabModeAsync, GrabModeAsync);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (history_key != NoSymbol) {
|
||||||
|
code = XKeysymToKeycode(dc->dpy, history_key);
|
||||||
|
XGrabKey(dc->dpy, code, mask, root, True, GrabModeAsync, GrabModeAsync);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@ -705,6 +750,7 @@ parse_cmdline(int argc, char *argv[]) {
|
|||||||
{"mon", required_argument, NULL, 'm'},
|
{"mon", required_argument, NULL, 'm'},
|
||||||
{"format", required_argument, NULL, 'f'},
|
{"format", required_argument, NULL, 'f'},
|
||||||
{"key", required_argument, NULL, 'k'},
|
{"key", required_argument, NULL, 'k'},
|
||||||
|
{"history_key", required_argument, NULL, 'K'},
|
||||||
{"geometry", required_argument, NULL, 'g'},
|
{"geometry", required_argument, NULL, 'g'},
|
||||||
{"config", required_argument, NULL, 'r'},
|
{"config", required_argument, NULL, 'r'},
|
||||||
{"mod", required_argument, NULL, 'M'},
|
{"mod", required_argument, NULL, 'M'},
|
||||||
@ -771,6 +817,9 @@ parse_cmdline(int argc, char *argv[]) {
|
|||||||
case 'k':
|
case 'k':
|
||||||
key = XStringToKeysym(optarg);
|
key = XStringToKeysym(optarg);
|
||||||
break;
|
break;
|
||||||
|
case 'K':
|
||||||
|
history_key = XStringToKeysym(optarg);
|
||||||
|
break;
|
||||||
case 'g':
|
case 'g':
|
||||||
geometry.mask = XParseGeometry(optarg,
|
geometry.mask = XParseGeometry(optarg,
|
||||||
&geometry.x, &geometry.y,
|
&geometry.x, &geometry.y,
|
||||||
@ -876,6 +925,7 @@ parse_dunstrc(void) {
|
|||||||
indicate_hidden = iniparser_getboolean(ini, "global:indicate_hidden", indicate_hidden);
|
indicate_hidden = iniparser_getboolean(ini, "global:indicate_hidden", indicate_hidden);
|
||||||
idle_threshold = iniparser_getint(ini, "global:idle_threshold", idle_threshold);
|
idle_threshold = iniparser_getint(ini, "global:idle_threshold", idle_threshold);
|
||||||
key_string = iniparser_getstring(ini, "global:key", key_string);
|
key_string = iniparser_getstring(ini, "global:key", key_string);
|
||||||
|
history_key_string = iniparser_getstring(ini, "global:history_key", history_key_string);
|
||||||
|
|
||||||
geom = iniparser_getstring(ini, "global:geometry", geom);
|
geom = iniparser_getstring(ini, "global:geometry", geom);
|
||||||
geometry.mask = XParseGeometry(geom,
|
geometry.mask = XParseGeometry(geom,
|
||||||
@ -1018,6 +1068,7 @@ main(int argc, char *argv[]) {
|
|||||||
parse_dunstrc();
|
parse_dunstrc();
|
||||||
parse_cmdline(argc, argv);
|
parse_cmdline(argc, argv);
|
||||||
key = key_string ? XStringToKeysym(key_string) : NoSymbol;
|
key = key_string ? XStringToKeysym(key_string) : NoSymbol;
|
||||||
|
history_key = history_key_string ? XStringToKeysym(history_key_string) : NoSymbol;
|
||||||
screensaver_info = XScreenSaverAllocInfo();
|
screensaver_info = XScreenSaverAllocInfo();
|
||||||
|
|
||||||
initdbus();
|
initdbus();
|
||||||
@ -1043,6 +1094,6 @@ main(int argc, char *argv[]) {
|
|||||||
|
|
||||||
void
|
void
|
||||||
usage(int exit_status) {
|
usage(int exit_status) {
|
||||||
fputs("usage: dunst [-h/--help] [-v] [-geometry geom] [-fn font] [-format fmt]\n[-nb color] [-nf color] [-lb color] [-lf color] [-cb color] [ -cf color]\n[-to secs] [-lto secs] [-cto secs] [-nto secs] [-key key] [-mod modifier] [-mon n] [-config dunstrc]\n", stderr);
|
fputs("usage: dunst [-h/--help] [-v] [-geometry geom] [-fn font] [-format fmt]\n[-nb color] [-nf color] [-lb color] [-lf color] [-cb color] [ -cf color]\n[-to secs] [-lto secs] [-cto secs] [-nto secs] [-key key] [-history_key key] [-mod modifier] [-mon n] [-config dunstrc]\n", stderr);
|
||||||
exit(exit_status);
|
exit(exit_status);
|
||||||
}
|
}
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
#include "dunst.h"
|
#include "dunst.h"
|
||||||
|
|
||||||
#define DBUS_POLL_TIMEOUT 1000
|
#define DBUS_POLL_TIMEOUT 200
|
||||||
|
|
||||||
DBusError dbus_err;
|
DBusError dbus_err;
|
||||||
DBusConnection *dbus_conn;
|
DBusConnection *dbus_conn;
|
||||||
|
5
dunstrc
5
dunstrc
@ -16,8 +16,11 @@
|
|||||||
indicate_hidden = yes
|
indicate_hidden = yes
|
||||||
|
|
||||||
# keybindings to remove notification
|
# keybindings to remove notification
|
||||||
key = space
|
|
||||||
modifier = ctrl
|
modifier = ctrl
|
||||||
|
key = space
|
||||||
|
# key to redisplay last message(s)
|
||||||
|
history_key = grave
|
||||||
|
|
||||||
|
|
||||||
# the geometry of the window
|
# the geometry of the window
|
||||||
# geometry [{width}]x{height}][+/-{x}+/-{y}]
|
# geometry [{width}]x{height}][+/-{x}+/-{y}]
|
||||||
|
Loading…
x
Reference in New Issue
Block a user