X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Fmainloop.c;h=9ee2075784fa5c8420cad8224141fdc067419574;hb=c1b2fc5324522f74a14a5cfa210c95e1509a6e7f;hp=4b07cc4b351731aaeb289b222715523da2ed96d4;hpb=de4f92ccc66c1dad1a2820a07d1f0161bd61a855;p=chaz%2Fopenbox diff --git a/openbox/mainloop.c b/openbox/mainloop.c index 4b07cc4b..9ee20757 100644 --- a/openbox/mainloop.c +++ b/openbox/mainloop.c @@ -340,7 +340,7 @@ static void sighandler(gint sig) /* XXX special case for signals that default to core dump. but throw some helpful output here... */ - fprintf(stderr, "Fuck ya. Core dump. (Signal=%d)\n", sig); + fprintf(stderr, "Fuck yah. Core dump. (Signal=%d)\n", sig); /* die with a core dump */ abort(); @@ -511,6 +511,7 @@ void ob_main_loop_timeout_add(ObMainLoop *loop, t->data = data; t->destroy = notify; t->del_me = FALSE; + g_get_current_time(&loop->now); t->last = t->timeout = loop->now; g_time_val_add(&t->timeout, t->delay); @@ -524,10 +525,21 @@ void ob_main_loop_timeout_remove(ObMainLoop *loop, for (it = loop->timers; it; it = g_slist_next(it)) { ObMainLoopTimer *t = it->data; - if (t->func == handler) { + if (t->func == handler) + t->del_me = TRUE; + } +} + +void ob_main_loop_timeout_remove_data(ObMainLoop *loop, + GSourceFunc handler, + gpointer data) +{ + GSList *it; + + for (it = loop->timers; it; it = g_slist_next(it)) { + ObMainLoopTimer *t = it->data; + if (t->func == handler && t->data == data) t->del_me = TRUE; - break; - } } } @@ -554,16 +566,25 @@ static gboolean nearest_timeout_wait(ObMainLoop *loop, GTimeVal *tm) static void timer_dispatch(ObMainLoop *loop, GTimeVal **wait) { + GSList *it, *next; + + gboolean fired = FALSE; + g_get_current_time(&loop->now); - while (loop->timers != NULL) { - ObMainLoopTimer *curr = loop->timers->data; /* get the top element */ + for (it = loop->timers; it; it = next) { + ObMainLoopTimer *curr; + + next = g_slist_next(it); + + curr = it->data; + /* since timer_stop doesn't actually free the timer, we have to do our real freeing in here. */ if (curr->del_me) { /* delete the top */ - loop->timers = g_slist_delete_link(loop->timers, loop->timers); + loop->timers = g_slist_delete_link(loop->timers, it); g_free(curr); continue; } @@ -577,24 +598,27 @@ static void timer_dispatch(ObMainLoop *loop, GTimeVal **wait) then re-insert. timers maintain their order and may trigger more than once if they've waited more than one delay's worth of time. */ - loop->timers = g_slist_delete_link(loop->timers, loop->timers); + loop->timers = g_slist_delete_link(loop->timers, it); g_time_val_add(&curr->last, curr->delay); if (curr->func(curr->data)) { g_time_val_add(&curr->timeout, curr->delay); insert_timer(loop, curr); - } else if (curr->destroy) { - curr->destroy(curr->data); + } else { + if (curr->destroy) + curr->destroy(curr->data); + g_free(curr); } + fired = TRUE; + } + + if (fired) { /* if at least one timer fires, then don't wait on X events, as there may already be some in the queue from the timer callbacks. */ loop->ret_wait.tv_sec = loop->ret_wait.tv_usec = 0; *wait = &loop->ret_wait; - return; - } - - if (nearest_timeout_wait(loop, &loop->ret_wait)) + } else if (nearest_timeout_wait(loop, &loop->ret_wait)) *wait = &loop->ret_wait; else *wait = NULL;