X-Git-Url: https://git.decadent.org.uk/gitweb/?p=ion3.git;a=blobdiff_plain;f=ioncore%2Ftags.c;h=aeaadd62981054643fed46d3cdbdee16ccf5029b;hp=6b7d5c24431cd34c9ec6680c9d3ae4dfd3a17db2;hb=HEAD;hpb=8366314611bf30a0f31d25bf5f5023186fa87692 diff --git a/ioncore/tags.c b/ioncore/tags.c index 6b7d5c2..aeaadd6 100644 --- a/ioncore/tags.c +++ b/ioncore/tags.c @@ -1,18 +1,18 @@ /* * ion/ioncore/tags.c * - * Copyright (c) Tuomo Valkonen 1999-2006. + * Copyright (c) Tuomo Valkonen 1999-2009. * - * 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 - * the Free Software Foundation; either version 2.1 of the License, or - * (at your option) any later version. + * See the included file LICENSE for details. */ #include #include + +#include "global.h" #include "region.h" #include "tags.h" +#include "extlconv.h" static ObjList *taglist=NULL; @@ -34,7 +34,7 @@ bool region_set_tagged(WRegion *reg, int sp) reg->flags|=REGION_TAGGED; objlist_insert_last(&taglist, (Obj*)reg); } - region_notify_change(reg, "tag"); + region_notify_change(reg, ioncore_g.notifies.tag); } return nset; @@ -43,7 +43,8 @@ bool region_set_tagged(WRegion *reg, int sp) /*EXTL_DOC * Change tagging state of \var{reg} as defined by \var{how} - * (set/unset/toggle). Resulting state is returned. + * (one of \codestr{set}, \codestr{unset}, or \codestr{toggle}). + * The resulting state is returned. */ EXTL_EXPORT_AS(WRegion, set_tagged) bool region_set_tagged_extl(WRegion *reg, const char *how) @@ -67,9 +68,9 @@ bool region_is_tagged(WRegion *reg) * Untag all regions. */ EXTL_EXPORT -void ioncore_clear_tags() +void ioncore_tagged_clear() { - while(ioncore_tags_take_first()!=NULL) + while(ioncore_tagged_first(TRUE)!=NULL) /* nothing */; } @@ -81,52 +82,40 @@ void ioncore_clear_tags() /*EXTL_DOC - * Returns first tagged object. + * Returns first tagged object, untagging it as well if \var{untag} is set. */ EXTL_SAFE EXTL_EXPORT -WRegion *ioncore_tags_first() +WRegion *ioncore_tagged_first(bool untag) { - return (WRegion*)OBJLIST_FIRST(WRegion*, taglist); -} - - -WRegion *ioncore_tags_take_first() -{ - WRegion *reg=(WRegion*)objlist_take_first(&taglist); + WRegion *reg; + + if(!untag){ + reg=(WRegion*)OBJLIST_FIRST(WRegion*, taglist); + }else{ + reg=(WRegion*)objlist_take_first(&taglist); - if(reg!=NULL){ - reg->flags&=~REGION_TAGGED; - region_notify_change(reg, "tag"); + if(reg!=NULL){ + reg->flags&=~REGION_TAGGED; + region_notify_change(reg, ioncore_g.notifies.tag); + } } return reg; } + /*EXTL_DOC - * Returns a list of tagged regions. + * Iterate over tagged regions until \var{iterfn} returns \code{false}. + * The function is called in protected mode. + * This routine returns \code{true} if it reaches the end of list + * without this happening. */ EXTL_SAFE EXTL_EXPORT -ExtlTab ioncore_tagged_list() +bool ioncore_tagged_i(ExtlFn iterfn) { - int n=0; - ExtlTab tab; - WRegion *region; - ObjListIterTmp tmp; - - region=ioncore_tags_first(); - if(!region) - return extl_table_none(); - - tab=extl_create_table(); - - FOR_ALL_ON_OBJLIST(WRegion*, region, taglist, tmp){ - if(extl_table_seti_o(tab, n+1, (Obj*)region)) - n++; - } - - return tab; + return extl_iter_objlist(iterfn, taglist); }