X-Git-Url: https://git.decadent.org.uk/gitweb/?a=blobdiff_plain;f=libmainloop%2Fdefer.c;h=c8d56163761dfd43ddb2549d14e8a9e0c0b571e7;hb=20070318;hp=c79e2ce94328804fb9cf91e65908fd5da800dc04;hpb=8366314611bf30a0f31d25bf5f5023186fa87692;p=ion3.git diff --git a/libmainloop/defer.c b/libmainloop/defer.c index c79e2ce..c8d5616 100644 --- a/libmainloop/defer.c +++ b/libmainloop/defer.c @@ -1,7 +1,7 @@ /* * ion/libmainloop/defer.c * - * Copyright (c) Tuomo Valkonen 1999-2006. + * Copyright (c) Tuomo Valkonen 1999-2007. * * Ion is free software; you can redistribute it and/or modify it under * the terms of the GNU Lesser General Public License as published by @@ -84,12 +84,29 @@ static void defer_watch_handler(Watch *w, Obj *obj) warn(TR("Object destroyed while deferred actions are still pending.")); } + +static bool already_deferred(Obj *obj, WDeferredAction *action, + WDeferred *list) +{ + WDeferred *d; + + for(d=list; d!=NULL; d=d->next){ + if(d->action==action && d->watch.obj==obj) + return TRUE; + } + return FALSE; +} + + bool mainloop_defer_action_on_list(Obj *obj, WDeferredAction *action, WDeferred **list) { WDeferred *d; + if(already_deferred(obj, action, *list)) + return TRUE; + d=alloc_defer(); if(d==NULL){