*/
#include "mainloop.h"
+#include "action.h"
#include <stdio.h>
#include <stdlib.h>
gboolean signal_fired;
guint signals_fired[NUM_SIGNALS];
GSList *signal_handlers[NUM_SIGNALS];
+
+ GQueue *action_queue;
};
struct _ObMainLoopTimer
all_loops = g_slist_prepend(all_loops, loop);
+ loop->action_queue = g_queue_new();
+
return loop;
}
}
}
+ g_queue_free(loop->action_queue);
+
g_free(loop);
}
}
h->func(h->fd, h->data);
}
+void ob_main_loop_queue_action(ObMainLoop *loop, ObAction *act)
+{
+ g_queue_push_tail(loop->action_queue, action_copy(act));
+}
+
void ob_main_loop_run(ObMainLoop *loop)
{
XEvent e;
struct timeval *wait;
fd_set selset;
GSList *it;
+ ObAction *act;
loop->run = TRUE;
loop->running = TRUE;
h->func(&e, h->data);
}
} while (XPending(loop->display));
+ } else if ((act = g_queue_pop_head(loop->action_queue))) {
+ /* only fire off one action at a time, then go back for more
+ X events, since the action might cause some X events (like
+ FocusIn :) */
+ act->func(&act->data);
+ action_unref(act);
} else {
/* this only runs if there were no x events received */
timer_dispatch(loop, (GTimeVal**)&wait);
+
selset = loop->fd_set;
/* there is a small race condition here. if a signal occurs
between this if() and the select() then we will not process
{
GSList *it;
for (it = loop->timers; it; it = g_slist_next(it)) {
- ObMainLoopTimer *t = it->data;
- if (timecompare(&ins->timeout, &t->timeout) <= 0) {
- loop->timers = g_slist_insert_before(loop->timers, it, ins);
- break;
- }
+ ObMainLoopTimer *t = it->data;
+ if (timecompare(&ins->timeout, &t->timeout) >= 0) {
+ loop->timers = g_slist_insert_before(loop->timers, it, ins);
+ break;
+ }
}
if (it == NULL) /* didnt fit anywhere in the list */
- loop->timers = g_slist_append(loop->timers, ins);
+ loop->timers = g_slist_append(loop->timers, ins);
}
void ob_main_loop_timeout_add(ObMainLoop *loop,
/* 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,