X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Fmainloop.c;h=c1ede830a69eabcd379e2a6576a734cf35ef678b;hb=fb7a71da202632c7301ada67c8b4420bfb8d8fbe;hp=5e053da43795227e26a8ab8567c7c2fffc4c9c9d;hpb=0e6161b0d4953b81273200fd31bd9c14fac4981b;p=chaz%2Fopenbox diff --git a/openbox/mainloop.c b/openbox/mainloop.c index 5e053da4..c1ede830 100644 --- a/openbox/mainloop.c +++ b/openbox/mainloop.c @@ -1,7 +1,8 @@ /* -*- indent-tabs-mode: nil; tab-width: 4; c-basic-offset: 4; -*- mainloop.c for the Openbox window manager - Copyright (c) 2003 Ben Jansens + Copyright (c) 2006 Mikael Magnusson + 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 @@ -17,8 +18,7 @@ */ #include "mainloop.h" -#include "action.h" -#include "client.h" +#include "event.h" #include #include @@ -88,8 +88,6 @@ struct _ObMainLoop gboolean signal_fired; guint signals_fired[NUM_SIGNALS]; GSList *signal_handlers[NUM_SIGNALS]; - - GSList *action_queue; }; struct _ObMainLoopTimer @@ -97,6 +95,7 @@ struct _ObMainLoopTimer gulong delay; GSourceFunc func; gpointer data; + GEqualFunc equal; GDestroyNotify destroy; /* The timer needs to be freed */ @@ -179,8 +178,6 @@ ObMainLoop *ob_main_loop_new(Display *display) all_loops = g_slist_prepend(all_loops, loop); - loop->action_queue = NULL; - return loop; } @@ -219,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) { @@ -231,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); } } @@ -250,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; @@ -311,32 +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) { - act->func(&act->data); - 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 */ @@ -360,8 +305,6 @@ void ob_main_loop_run(ObMainLoop *loop) } } - client_remove_destructor(ob_main_loop_client_destroy); - loop->running = FALSE; } @@ -417,7 +360,8 @@ static void sighandler(gint sig) /* XXX special case for signals that default to core dump. but throw some helpful output here... */ - fprintf(stderr, "Fuck yah. Core dump. (Signal=%d)\n", sig); + fprintf(stderr, "How are you gentlemen? All your base are" + " belong to us. (Openbox received signal %d)\n", sig); /* die with a core dump */ abort(); @@ -559,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) @@ -580,12 +524,14 @@ void ob_main_loop_timeout_add(ObMainLoop *loop, gulong microseconds, GSourceFunc handler, gpointer data, + GEqualFunc cmp, GDestroyNotify notify) { ObMainLoopTimer *t = g_new(ObMainLoopTimer, 1); t->delay = microseconds; t->func = handler; t->data = data; + t->equal = cmp; t->destroy = notify; t->del_me = FALSE; g_get_current_time(&loop->now); @@ -607,16 +553,20 @@ void ob_main_loop_timeout_remove(ObMainLoop *loop, } } -void ob_main_loop_timeout_remove_data(ObMainLoop *loop, - GSourceFunc handler, - gpointer data) +void ob_main_loop_timeout_remove_data(ObMainLoop *loop, GSourceFunc handler, + gpointer data, gboolean cancel_dest) { GSList *it; for (it = loop->timers; it; it = g_slist_next(it)) { ObMainLoopTimer *t = it->data; - if (t->func == handler && 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; + } } } @@ -651,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; @@ -661,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;