]> Dogcows Code - chaz/openbox/blobdiff - openbox/mainloop.c
remove action_run_string, as this is not going to be a common thing I think
[chaz/openbox] / openbox / mainloop.c
index 6b931957b073b85ca2b8781b95c704a7f29d29c0..dea9e8c16ac293f9b6a62756e6311332309be1b8 100644 (file)
@@ -17,6 +17,7 @@
 */
 
 #include "mainloop.h"
+#include "action.h"
 
 #include <stdio.h>
 #include <stdlib.h>
@@ -86,6 +87,8 @@ struct _ObMainLoop
     gboolean signal_fired;
     guint signals_fired[NUM_SIGNALS];
     GSList *signal_handlers[NUM_SIGNALS];
+
+    GQueue *action_queue;
 };
 
 struct _ObMainLoopTimer
@@ -175,6 +178,8 @@ ObMainLoop *ob_main_loop_new(Display *display)
 
     all_loops = g_slist_prepend(all_loops, loop);
 
+    loop->action_queue = g_queue_new();
+
     return loop;
 }
 
@@ -225,6 +230,8 @@ void ob_main_loop_destroy(ObMainLoop *loop)
             }
         }
 
+        g_queue_free(loop->action_queue);
+
         g_free(loop);
     }
 }
@@ -240,12 +247,18 @@ static void fd_handle_foreach(gpointer key,
         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;
@@ -281,10 +294,17 @@ void ob_main_loop_run(ObMainLoop *loop)
                     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
@@ -507,14 +527,14 @@ 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) {
-           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,
@@ -609,7 +629,7 @@ static void timer_dispatch(ObMainLoop *loop, GTimeVal **wait)
        
         /* 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,
This page took 0.023323 seconds and 4 git commands to generate.