handle removing of elements in GList correctly

When closing a notification in check_timeouts, iter will get removed
of the list and therefore iter->next is NULL at the end of the
loop. This requires calling check_timeouts again.

Shifting iter to iter->next before removing the notification, we can
avoid recalling check_timeouts and avoid processing the already
processed list again.
This commit is contained in:
Benedikt Heine 2017-08-06 15:14:45 +02:00
parent 111fcaf583
commit 66fceb9661

View File

@ -57,8 +57,8 @@ void check_timeouts(void)
if (displayed->length == 0) if (displayed->length == 0)
return; return;
for (GList * iter = g_queue_peek_head_link(displayed); iter; GList *iter = g_queue_peek_head_link(displayed);
iter = iter->next) { while (iter) {
notification *n = iter->data; notification *n = iter->data;
/* don't timeout when user is idle */ /* don't timeout when user is idle */
@ -72,12 +72,12 @@ void check_timeouts(void)
continue; continue;
} }
/* shift iter before we possibly delete the current notification */
iter = iter->next;
/* remove old message */ /* remove old message */
if (difftime(time(NULL), n->start) > n->timeout) { if (difftime(time(NULL), n->start) > n->timeout) {
/* close_notification may conflict with iter, so restart */
notification_close(n, 1); notification_close(n, 1);
check_timeouts();
return;
} }
} }
} }