X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;ds=sidebyside;f=openbox%2Fmainloop.c;h=c1ede830a69eabcd379e2a6576a734cf35ef678b;hb=fb7a71da202632c7301ada67c8b4420bfb8d8fbe;hp=62261dde0af6e52dd2b215aea6a12f8c659e8cd2;hpb=939fbcfd31e07a6e0f1cdbfcef9b04f63e6af700;p=chaz%2Fopenbox diff --git a/openbox/mainloop.c b/openbox/mainloop.c index 62261dde..c1ede830 100644 --- a/openbox/mainloop.c +++ b/openbox/mainloop.c @@ -2,7 +2,7 @@ mainloop.c for the Openbox window manager Copyright (c) 2006 Mikael Magnusson - Copyright (c) 2003 Ben Jansens + Copyright (c) 2003-2007 Dana Jansens This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -18,8 +18,6 @@ */ #include "mainloop.h" -#include "action.h" -#include "client.h" #include "event.h" #include @@ -90,8 +88,6 @@ struct _ObMainLoop gboolean signal_fired; guint signals_fired[NUM_SIGNALS]; GSList *signal_handlers[NUM_SIGNALS]; - - GSList *action_queue; }; struct _ObMainLoopTimer @@ -182,8 +178,6 @@ ObMainLoop *ob_main_loop_new(Display *display) all_loops = g_slist_prepend(all_loops, loop); - loop->action_queue = NULL; - return loop; } @@ -222,8 +216,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) { @@ -234,10 +226,6 @@ void ob_main_loop_destroy(ObMainLoop *loop) } } - for (it = loop->action_queue; it; it = g_slist_next(it)) - action_unref(it->data); - g_slist_free(loop->action_queue); - g_free(loop); } } @@ -253,37 +241,16 @@ static void fd_handle_foreach(gpointer key, h->func(h->fd, h->data); } -void ob_main_loop_queue_action(ObMainLoop *loop, ObAction *act) -{ - loop->action_queue = g_slist_append(loop->action_queue, action_copy(act)); -} - -static void ob_main_loop_client_destroy(ObClient *client, gpointer data) -{ - ObMainLoop *loop = data; - GSList *it; - - for (it = loop->action_queue; it; it = g_slist_next(it)) { - ObAction *act = it->data; - - if (act->data.any.c == client) - act->data.any.c = NULL; - } -} - 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; - client_add_destructor(ob_main_loop_client_destroy, loop); - while (loop->run) { if (loop->signal_fired) { guint i; @@ -314,34 +281,7 @@ void ob_main_loop_run(ObMainLoop *loop) ObMainLoopXHandlerType *h = it->data; h->func(&e, h->data); } - } while (XPending(loop->display)); - } else if (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 :) */ - - do { - act = loop->action_queue->data; - if (act->data.any.client_action == OB_CLIENT_ACTION_ALWAYS && - !act->data.any.c) - { - loop->action_queue = - g_slist_delete_link(loop->action_queue, - loop->action_queue); - action_unref(act); - act = NULL; - } - } while (!act && loop->action_queue); - - if (act) { - event_curtime = act->data.any.time; - act->func(&act->data); - event_curtime = CurrentTime; - loop->action_queue = - g_slist_delete_link(loop->action_queue, - loop->action_queue); - action_unref(act); - } + } while (XPending(loop->display) && loop->run); } else { /* this only runs if there were no x events received */ @@ -365,8 +305,6 @@ void ob_main_loop_run(ObMainLoop *loop) } } - client_remove_destructor(ob_main_loop_client_destroy); - loop->running = FALSE; } @@ -565,7 +503,7 @@ static glong timecompare(GTimeVal *a, GTimeVal *b) if ((r = b->tv_sec - a->tv_sec)) return r; return b->tv_usec - a->tv_usec; - + } static void insert_timer(ObMainLoop *loop, ObMainLoopTimer *ins) @@ -622,7 +560,9 @@ void ob_main_loop_timeout_remove_data(ObMainLoop *loop, GSourceFunc handler, for (it = loop->timers; it; it = g_slist_next(it)) { ObMainLoopTimer *t = it->data; - if (t->func == handler && t->equal(t->data, data)) { + if (t->func == handler && + (t->equal ? t->equal(t->data, data) : (t->data == data))) + { t->del_me = TRUE; if (cancel_dest) t->destroy = NULL; @@ -661,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; @@ -671,14 +611,14 @@ 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) break;