queue up ObActions and run them when idle
This commit is contained in:
parent
adb9bb700f
commit
87430acf34
2 changed files with 26 additions and 0 deletions
|
@ -17,6 +17,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "mainloop.h"
|
#include "mainloop.h"
|
||||||
|
#include "action.h"
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
@ -86,6 +87,8 @@ struct _ObMainLoop
|
||||||
gboolean signal_fired;
|
gboolean signal_fired;
|
||||||
guint signals_fired[NUM_SIGNALS];
|
guint signals_fired[NUM_SIGNALS];
|
||||||
GSList *signal_handlers[NUM_SIGNALS];
|
GSList *signal_handlers[NUM_SIGNALS];
|
||||||
|
|
||||||
|
GQueue *action_queue;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct _ObMainLoopTimer
|
struct _ObMainLoopTimer
|
||||||
|
@ -175,6 +178,8 @@ ObMainLoop *ob_main_loop_new(Display *display)
|
||||||
|
|
||||||
all_loops = g_slist_prepend(all_loops, loop);
|
all_loops = g_slist_prepend(all_loops, loop);
|
||||||
|
|
||||||
|
loop->action_queue = g_queue_new();
|
||||||
|
|
||||||
return loop;
|
return loop;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -225,6 +230,8 @@ void ob_main_loop_destroy(ObMainLoop *loop)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
g_queue_free(loop->action_queue);
|
||||||
|
|
||||||
g_free(loop);
|
g_free(loop);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -240,12 +247,18 @@ static void fd_handle_foreach(gpointer key,
|
||||||
h->func(h->fd, h->data);
|
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)
|
void ob_main_loop_run(ObMainLoop *loop)
|
||||||
{
|
{
|
||||||
XEvent e;
|
XEvent e;
|
||||||
struct timeval *wait;
|
struct timeval *wait;
|
||||||
fd_set selset;
|
fd_set selset;
|
||||||
GSList *it;
|
GSList *it;
|
||||||
|
ObAction *act;
|
||||||
|
|
||||||
loop->run = TRUE;
|
loop->run = TRUE;
|
||||||
loop->running = TRUE;
|
loop->running = TRUE;
|
||||||
|
@ -281,10 +294,17 @@ void ob_main_loop_run(ObMainLoop *loop)
|
||||||
h->func(&e, h->data);
|
h->func(&e, h->data);
|
||||||
}
|
}
|
||||||
} while (XPending(loop->display));
|
} 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 {
|
} else {
|
||||||
/* this only runs if there were no x events received */
|
/* this only runs if there were no x events received */
|
||||||
|
|
||||||
timer_dispatch(loop, (GTimeVal**)&wait);
|
timer_dispatch(loop, (GTimeVal**)&wait);
|
||||||
|
|
||||||
selset = loop->fd_set;
|
selset = loop->fd_set;
|
||||||
/* there is a small race condition here. if a signal occurs
|
/* there is a small race condition here. if a signal occurs
|
||||||
between this if() and the select() then we will not process
|
between this if() and the select() then we will not process
|
||||||
|
|
|
@ -67,6 +67,12 @@ void ob_main_loop_timeout_remove_data(ObMainLoop *loop,
|
||||||
GSourceFunc handler,
|
GSourceFunc handler,
|
||||||
gpointer data);
|
gpointer data);
|
||||||
|
|
||||||
|
struct _ObAction;
|
||||||
|
|
||||||
|
/*! Queues an action, which will be run when there are no more X events
|
||||||
|
to process */
|
||||||
|
void ob_main_loop_queue_action(ObMainLoop *loop, struct _ObAction *act);
|
||||||
|
|
||||||
void ob_main_loop_run(ObMainLoop *loop);
|
void ob_main_loop_run(ObMainLoop *loop);
|
||||||
void ob_main_loop_exit(ObMainLoop *loop);
|
void ob_main_loop_exit(ObMainLoop *loop);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue