only redraw when needed

This commit is contained in:
Sascha Kruse 2013-02-17 03:26:35 +01:00
parent 8e29c4dc5b
commit 5e66f5d007

31
dunst.c
View File

@ -77,6 +77,8 @@ 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;
bool dunst_grab_errored = false; bool dunst_grab_errored = false;
int next_notification_id = 1; int next_notification_id = 1;
@ -493,6 +495,7 @@ 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;
} }
} }
@ -948,8 +951,7 @@ void handleXEvents(void)
switch (ev.type) { switch (ev.type) {
case Expose: case Expose:
if (ev.xexpose.count == 0 && visible) { if (ev.xexpose.count == 0 && visible) {
draw_win(); force_redraw = true;
mapdc(dc, win, scr.dim.w, font_h);
} }
break; break;
case SelectionNotify: case SelectionNotify:
@ -962,6 +964,7 @@ void handleXEvents(void)
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:
@ -987,6 +990,8 @@ void handleXEvents(void)
&& context_ks.mask == ev.xkey.state) { && context_ks.mask == ev.xkey.state) {
context_menu(); context_menu();
} }
force_redraw = true;
break;
} }
} }
} }
@ -1305,6 +1310,7 @@ bool is_idle(void)
void run(void) void run(void)
{ {
time_t last_time = time(&last_time);
while (true) { while (true) {
if (visible) { if (visible) {
dbus_poll(50); dbus_poll(50);
@ -1312,21 +1318,21 @@ void run(void)
dbus_poll(200); dbus_poll(200);
} }
now = time(&now); now = time(&now);
time_t delta = now - last_time;
last_time = 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) { if (displayed->length > 0 && ! visible)
if (!visible) {
map_win(); map_win();
} else { if (displayed->length == 0 && visible)
draw_win();
}
} else {
if (visible) {
hide_win(); hide_win();
}
}
handleXEvents(); handleXEvents();
if (visible && (force_redraw || delta > 0))
draw_win();
force_redraw = false;
} }
} }
@ -1551,9 +1557,8 @@ void map_win(void)
update_screen_info(); update_screen_info();
XMapRaised(dc->dpy, win); XMapRaised(dc->dpy, win);
draw_win();
XFlush(dc->dpy);
visible = true; visible = true;
force_redraw = true;
} }
void parse_follow_mode(const char *mode) void parse_follow_mode(const char *mode)