]> git.decadent.org.uk Git - ion3.git/blob - ioncore/activity.c
Update cfg_kludge_flash for Flash 10
[ion3.git] / ioncore / activity.c
1 /*
2  * ion/ioncore/activity.c
3  *
4  * Copyright (c) Tuomo Valkonen 1999-2009. 
5  *
6  * See the included file LICENSE for details.
7  */
8
9 #include <libtu/setparam.h>
10 #include <libtu/minmax.h>
11 #include <libtu/objlist.h>
12 #include "common.h"
13 #include "global.h"
14 #include "region.h"
15 #include "activity.h"
16
17
18 static ObjList *actlist=NULL;
19
20
21 void region_mark_mgd_activity(WRegion *mgr)
22 {
23     bool mgr_marked;
24     
25     if(mgr==NULL)
26         return;
27     
28     mgr_marked=region_is_activity_r(mgr);
29     mgr->mgd_activity++;
30     
31     if(!mgr_marked){
32         region_notify_change(mgr, ioncore_g.notifies.sub_activity);
33         region_mark_mgd_activity(REGION_MANAGER(mgr));
34     }
35 }
36
37
38 void region_clear_mgd_activity(WRegion *mgr)
39 {
40     if(mgr==NULL)
41         return;
42     
43     mgr->mgd_activity=maxof(0, mgr->mgd_activity-1);
44     
45     if(!region_is_activity_r(mgr)){
46         region_notify_change(mgr, ioncore_g.notifies.sub_activity);
47         region_clear_mgd_activity(REGION_MANAGER(mgr));
48     }
49 }
50     
51     
52 static void propagate_activity(WRegion *reg)
53 {
54     region_mark_mgd_activity(REGION_MANAGER(reg));
55 }
56
57
58 static void propagate_clear(WRegion *reg)
59 {
60     region_clear_mgd_activity(REGION_MANAGER(reg));
61 }
62
63
64 bool region_set_activity(WRegion *reg, int sp)
65 {
66     bool set=(reg->flags&REGION_ACTIVITY);
67     bool nset=libtu_do_setparam(sp, set);
68     
69     if(!XOR(set, nset))
70         return nset;
71
72     if(nset){
73         if(REGION_IS_ACTIVE(reg))
74             return FALSE;
75     
76         reg->flags|=REGION_ACTIVITY;
77         objlist_insert_last(&actlist, (Obj*)reg);
78         
79         if(reg->mgd_activity==0)
80             propagate_activity(reg);
81     }else{
82         reg->flags&=~REGION_ACTIVITY;
83         objlist_remove(&actlist, (Obj*)reg);
84         
85         if(reg->mgd_activity==0)
86             propagate_clear(reg);
87     }
88     
89     region_notify_change(reg, ioncore_g.notifies.activity);
90     
91     return nset;
92 }
93
94
95 /*EXTL_DOC
96  * Set activity flag of \var{reg}. The \var{how} parameter must be
97  * one of \codestr{set}, \codestr{unset} or \codestr{toggle}.
98  */
99 EXTL_EXPORT_AS(WRegion, set_activity)
100 bool region_set_activity_extl(WRegion *reg, const char *how)
101 {
102     return region_set_activity(reg, libtu_string_to_setparam(how));
103 }
104
105
106 /*EXTL_DOC
107  * Is activity notification set on \var{reg}.
108  */
109 EXTL_SAFE
110 EXTL_EXPORT_MEMBER
111 bool region_is_activity(WRegion *reg)
112 {
113     return (reg->flags&REGION_ACTIVITY);
114 }
115
116
117 bool region_is_activity_r(WRegion *reg)
118 {
119     return (reg->flags&REGION_ACTIVITY || reg->mgd_activity!=0);
120 }
121
122
123 /*EXTL_DOC
124  * Iterate over activity list until \var{iterfn} returns \code{false}.
125  * The function is called in protected mode.
126  * This routine returns \code{true} if it reaches the end of list
127  * without this happening.
128  */
129 EXTL_SAFE
130 EXTL_EXPORT
131 bool ioncore_activity_i(ExtlFn iterfn)
132 {
133     return extl_iter_objlist(iterfn, actlist);
134 }
135
136
137 /*EXTL_DOC
138  * Returns first region on activity list.
139  */
140 EXTL_SAFE
141 EXTL_EXPORT
142 WRegion *ioncore_activity_first()
143 {
144     if(actlist==NULL)
145         return NULL;
146     return (WRegion*)actlist->watch.obj;
147 }
148
149
150 ObjList *ioncore_activity_list()
151 {
152     return actlist;
153 }
154
155
156 /*EXTL_DOC
157  * Go to first region on activity list.
158  */
159 EXTL_EXPORT
160 bool ioncore_goto_activity()
161 {
162     WRegion *reg=ioncore_activity_first();
163     
164     if(reg!=NULL)
165         return region_goto(reg);
166     else
167         return FALSE;
168 }
169