X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Fmainloop.c;h=825d3f4febc7f0a0c321bdccc177074388c88c5f;hb=ff78d28f8bcdbbdd42fe9501ee81185f67a4166a;hp=f2a25133befed2eb78ea656401ed920dd161c93c;hpb=780d1b0961e2eed5fea4645b4398fafb4adad73a;p=chaz%2Fopenbox diff --git a/openbox/mainloop.c b/openbox/mainloop.c index f2a25133..825d3f4f 100644 --- a/openbox/mainloop.c +++ b/openbox/mainloop.c @@ -104,6 +104,10 @@ struct _ObMainLoopTimer GTimeVal last; /* When this timer will next trigger */ GTimeVal timeout; + + /* Only allow a timer's function to fire once per run through the list, + so that it doesn't get locked in there forever */ + gboolean fired; }; struct _ObMainLoopSignalHandlerType @@ -216,8 +220,6 @@ void ob_main_loop_destroy(ObMainLoop *loop) /* only do this if we're the last loop destroyed */ if (!all_loops) { - guint i; - /* grab all the signals that cause core dumps */ for (i = 0; i < NUM_CORE_SIGNALS; ++i) { if (all_signals[core_signals[i]].installed) { @@ -502,10 +504,8 @@ void ob_main_loop_fd_remove(ObMainLoop *loop, static glong timecompare(GTimeVal *a, GTimeVal *b) { glong r; - - if ((r = b->tv_sec - a->tv_sec)) return r; - return b->tv_usec - a->tv_usec; - + if ((r = a->tv_sec - b->tv_sec)) return r; + return a->tv_usec - b->tv_usec; } static void insert_timer(ObMainLoop *loop, ObMainLoopTimer *ins) @@ -513,7 +513,7 @@ static void insert_timer(ObMainLoop *loop, ObMainLoopTimer *ins) GSList *it; for (it = loop->timers; it; it = g_slist_next(it)) { ObMainLoopTimer *t = it->data; - if (timecompare(&ins->timeout, &t->timeout) >= 0) { + if (timecompare(&ins->timeout, &t->timeout) <= 0) { loop->timers = g_slist_insert_before(loop->timers, it, ins); break; } @@ -601,7 +601,7 @@ static void timer_dispatch(ObMainLoop *loop, GTimeVal **wait) for (it = loop->timers; it; it = next) { ObMainLoopTimer *curr; - + next = g_slist_next(it); curr = it->data; @@ -611,16 +611,16 @@ static void timer_dispatch(ObMainLoop *loop, GTimeVal **wait) */ if (curr->del_me) { /* delete the top */ - loop->timers = g_slist_delete_link(loop->timers, it); + loop->timers = g_slist_delete_link(loop->timers, it); if (curr->destroy) curr->destroy(curr->data); g_free(curr); continue; } - /* the queue is sorted, so if this timer shouldn't fire, none are + /* the queue is sorted, so if this timer shouldn't fire, none are ready */ - if (timecompare(&NEAREST_TIMEOUT(loop), &loop->now) < 0) + if (timecompare(&NEAREST_TIMEOUT(loop), &loop->now) > 0) break; /* we set the last fired time to delay msec after the previous firing, @@ -638,6 +638,10 @@ static void timer_dispatch(ObMainLoop *loop, GTimeVal **wait) g_free(curr); } + /* the timer queue has been shuffled, start from the beginning + (which is the next one to fire) */ + next = loop->timers; + fired = TRUE; }