improve responsiveness
This commit is contained in:
parent
0829615385
commit
ee8c9dbe02
76
dunst.c
76
dunst.c
@ -84,9 +84,11 @@ static char **dmenu_cmd;
|
|||||||
static unsigned long framec;
|
static unsigned long framec;
|
||||||
static unsigned long sep_custom_col;
|
static unsigned long sep_custom_col;
|
||||||
|
|
||||||
bool force_redraw = false;
|
GMainLoop *mainloop = NULL;
|
||||||
|
bool timer_active = false;
|
||||||
|
|
||||||
bool dunst_grab_errored = false;
|
bool dunst_grab_errored = false;
|
||||||
|
bool force_redraw = false;
|
||||||
|
|
||||||
int next_notification_id = 1;
|
int next_notification_id = 1;
|
||||||
|
|
||||||
@ -103,7 +105,6 @@ int cmp_notification_data(const void *va, const void *vb, void *data);
|
|||||||
void check_timeouts(void);
|
void check_timeouts(void);
|
||||||
char *fix_markup(char *str);
|
char *fix_markup(char *str);
|
||||||
void handle_mouse_click(XEvent ev);
|
void handle_mouse_click(XEvent ev);
|
||||||
void handleXEvents(void);
|
|
||||||
void history_pop(void);
|
void history_pop(void);
|
||||||
void initrule(rule_t *r);
|
void initrule(rule_t *r);
|
||||||
bool is_idle(void);
|
bool is_idle(void);
|
||||||
@ -117,6 +118,7 @@ void print_version(void);
|
|||||||
char *extract_urls(const char *str);
|
char *extract_urls(const char *str);
|
||||||
void context_menu(void);
|
void context_menu(void);
|
||||||
void run_script(notification *n);
|
void run_script(notification *n);
|
||||||
|
void wake_up(void);
|
||||||
|
|
||||||
void init_shortcut(keyboard_shortcut * shortcut);
|
void init_shortcut(keyboard_shortcut * shortcut);
|
||||||
KeySym string_to_mask(char *str);
|
KeySym string_to_mask(char *str);
|
||||||
@ -146,12 +148,11 @@ x11_fd_dispatch(GSource *source, GSourceFunc callback, gpointer user_data)
|
|||||||
|
|
||||||
XEvent ev;
|
XEvent ev;
|
||||||
while (XPending(dpy) > 0) {
|
while (XPending(dpy) > 0) {
|
||||||
printf("in while\n");
|
printf("dispatching xevent\n");
|
||||||
XNextEvent(dpy, &ev);
|
XNextEvent(dpy, &ev);
|
||||||
switch (ev.type) {
|
switch (ev.type) {
|
||||||
case Expose:
|
case Expose:
|
||||||
if (ev.xexpose.count == 0 && visible) {
|
if (ev.xexpose.count == 0 && visible) {
|
||||||
force_redraw = true;
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case SelectionNotify:
|
case SelectionNotify:
|
||||||
@ -164,7 +165,6 @@ x11_fd_dispatch(GSource *source, GSourceFunc callback, gpointer user_data)
|
|||||||
case ButtonPress:
|
case ButtonPress:
|
||||||
if (ev.xbutton.window == win) {
|
if (ev.xbutton.window == win) {
|
||||||
handle_mouse_click(ev);
|
handle_mouse_click(ev);
|
||||||
force_redraw = true;
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case KeyPress:
|
case KeyPress:
|
||||||
@ -190,7 +190,6 @@ x11_fd_dispatch(GSource *source, GSourceFunc callback, gpointer user_data)
|
|||||||
&& context_ks.mask == ev.xkey.state) {
|
&& context_ks.mask == ev.xkey.state) {
|
||||||
context_menu();
|
context_menu();
|
||||||
}
|
}
|
||||||
force_redraw = true;
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -523,6 +522,7 @@ void check_timeouts(void)
|
|||||||
|
|
||||||
/* remove old message */
|
/* remove old message */
|
||||||
if (difftime(now, n->start) > n->timeout) {
|
if (difftime(now, n->start) > n->timeout) {
|
||||||
|
force_redraw = true;
|
||||||
/* close_notification may conflict with iter, so restart */
|
/* close_notification may conflict with iter, so restart */
|
||||||
close_notification(n, 1);
|
close_notification(n, 1);
|
||||||
check_timeouts();
|
check_timeouts();
|
||||||
@ -563,6 +563,8 @@ void update_lists()
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
force_redraw = true;
|
||||||
|
|
||||||
notification *n = g_queue_pop_head(queue);
|
notification *n = g_queue_pop_head(queue);
|
||||||
|
|
||||||
if (!n)
|
if (!n)
|
||||||
@ -573,7 +575,6 @@ void update_lists()
|
|||||||
}
|
}
|
||||||
|
|
||||||
g_queue_insert_sorted(displayed, n, cmp_notification_data, NULL);
|
g_queue_insert_sorted(displayed, n, cmp_notification_data, NULL);
|
||||||
force_redraw = true;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1125,6 +1126,7 @@ int init_notification(notification * n, int id)
|
|||||||
&& strcmp(orig->msg, n->msg) == 0) {
|
&& strcmp(orig->msg, n->msg) == 0) {
|
||||||
orig->dup_count++;
|
orig->dup_count++;
|
||||||
free_notification(n);
|
free_notification(n);
|
||||||
|
wake_up();
|
||||||
return orig->id;
|
return orig->id;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1136,6 +1138,7 @@ int init_notification(notification * n, int id)
|
|||||||
orig->dup_count++;
|
orig->dup_count++;
|
||||||
orig->start = now;
|
orig->start = now;
|
||||||
free_notification(n);
|
free_notification(n);
|
||||||
|
wake_up();
|
||||||
return orig->id;
|
return orig->id;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1188,6 +1191,7 @@ int init_notification(notification * n, int id)
|
|||||||
if (print_notifications)
|
if (print_notifications)
|
||||||
print_notification(n);
|
print_notification(n);
|
||||||
|
|
||||||
|
wake_up();
|
||||||
return n->id;
|
return n->id;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1226,7 +1230,8 @@ int close_notification_by_id(int id, int reason)
|
|||||||
notificationClosed(target, reason);
|
notificationClosed(target, reason);
|
||||||
}
|
}
|
||||||
|
|
||||||
return target == NULL;
|
wake_up();
|
||||||
|
return reason;
|
||||||
}
|
}
|
||||||
|
|
||||||
int close_notification(notification * n, int reason)
|
int close_notification(notification * n, int reason)
|
||||||
@ -1334,25 +1339,60 @@ bool is_idle(void)
|
|||||||
return screensaver_info->idle / 1000 > idle_threshold;
|
return screensaver_info->idle / 1000 > idle_threshold;
|
||||||
}
|
}
|
||||||
|
|
||||||
gboolean run(gpointer data)
|
void update(void)
|
||||||
{
|
{
|
||||||
printf("running\n");
|
|
||||||
time_t last_time = time(&last_time);
|
time_t last_time = time(&last_time);
|
||||||
|
static time_t last_redraw = 0;
|
||||||
|
|
||||||
now = time(&now);
|
now = time(&now);
|
||||||
time_t delta = now - last_time;
|
|
||||||
last_time = now;
|
printf("updating (%d)\n", now);
|
||||||
|
|
||||||
/* move messages from notification_queue to displayed_notifications */
|
/* move messages from notification_queue to displayed_notifications */
|
||||||
update_lists();
|
update_lists();
|
||||||
if (displayed->length > 0 && ! visible)
|
if (displayed->length > 0 && ! visible) {
|
||||||
map_win();
|
map_win();
|
||||||
if (displayed->length == 0 && visible)
|
}
|
||||||
|
if (displayed->length == 0 && visible) {
|
||||||
hide_win();
|
hide_win();
|
||||||
|
}
|
||||||
|
|
||||||
if (visible && (force_redraw || delta > 0))
|
if (visible && (force_redraw || now - last_redraw > 0)) {
|
||||||
|
if (force_redraw)
|
||||||
|
printf("forced_redraw\n");
|
||||||
|
if (now - last_redraw > 0)
|
||||||
|
printf("last_redraw too old\n");
|
||||||
draw_win();
|
draw_win();
|
||||||
force_redraw = false;
|
force_redraw = false;
|
||||||
|
last_redraw = now;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void wake_up(void)
|
||||||
|
{
|
||||||
|
force_redraw = true;
|
||||||
|
update();
|
||||||
|
if (!timer_active) {
|
||||||
|
timer_active = true;
|
||||||
|
g_timeout_add(1000, run, mainloop);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
gboolean run(void *data)
|
||||||
|
{
|
||||||
|
|
||||||
|
update();
|
||||||
|
|
||||||
|
if (visible && !timer_active) {
|
||||||
|
g_timeout_add(200, run, mainloop);
|
||||||
|
timer_active = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!visible && timer_active) {
|
||||||
|
timer_active = false;
|
||||||
|
/* returning false disables timeout */
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -1579,7 +1619,6 @@ void map_win(void)
|
|||||||
update_screen_info();
|
update_screen_info();
|
||||||
XMapRaised(dc->dpy, win);
|
XMapRaised(dc->dpy, win);
|
||||||
visible = true;
|
visible = true;
|
||||||
force_redraw = true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void parse_follow_mode(const char *mode)
|
void parse_follow_mode(const char *mode)
|
||||||
@ -1915,12 +1954,8 @@ int main(int argc, char *argv[])
|
|||||||
init_notification(n, 0);
|
init_notification(n, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
GMainLoop *mainloop = NULL;
|
|
||||||
mainloop = g_main_loop_new(NULL, FALSE);
|
mainloop = g_main_loop_new(NULL, FALSE);
|
||||||
|
|
||||||
/* FIXME */
|
|
||||||
g_timeout_add(5000, run, mainloop);
|
|
||||||
|
|
||||||
GPollFD dpy_pollfd = {dc->dpy->fd,
|
GPollFD dpy_pollfd = {dc->dpy->fd,
|
||||||
G_IO_IN | G_IO_HUP | G_IO_ERR, 0 };
|
G_IO_IN | G_IO_HUP | G_IO_ERR, 0 };
|
||||||
|
|
||||||
@ -1940,6 +1975,7 @@ int main(int argc, char *argv[])
|
|||||||
|
|
||||||
g_source_attach(x11_source, NULL);
|
g_source_attach(x11_source, NULL);
|
||||||
|
|
||||||
|
run(NULL);
|
||||||
g_main_loop_run(mainloop);
|
g_main_loop_run(mainloop);
|
||||||
|
|
||||||
g_bus_unown_name(owner_id);
|
g_bus_unown_name(owner_id);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user