]> git.decadent.org.uk Git - ion3.git/blob - mod_tiling/split.h
10a0e5fb7730c2e0d8455a5d25e47b509c5a3b1b
[ion3.git] / mod_tiling / split.h
1 /*
2  * ion/mod_tiling/split.h
3  *
4  * Copyright (c) Tuomo Valkonen 1999-2007. 
5  *
6  * Ion is free software; you can redistribute it and/or modify it under
7  * the terms of the GNU Lesser General Public License as published by
8  * the Free Software Foundation; either version 2.1 of the License, or
9  * (at your option) any later version.
10  */
11
12 #ifndef ION_MOD_TILING_SPLIT_H
13 #define ION_MOD_TILING_SPLIT_H
14
15 #include <ioncore/common.h>
16 #include <ioncore/window.h>
17 #include <ioncore/reginfo.h>
18 #include <ioncore/attach.h>
19 #include <ioncore/rectangle.h>
20 #include <libextl/extl.h>
21
22
23 INTRCLASS(WSplit);
24 INTRCLASS(WSplitInner);
25 INTRCLASS(WSplitSplit);
26 INTRCLASS(WSplitRegion);
27 INTRCLASS(WSplitST);
28
29
30 typedef enum{
31     SPLIT_HORIZONTAL,
32     SPLIT_VERTICAL
33 } WSplitDir;
34
35
36 typedef enum{
37     PRIMN_ANY,
38     PRIMN_TL,
39     PRIMN_BR,
40     PRIMN_NONE
41 } WPrimn;
42
43
44 typedef enum {
45     SPLIT_CURRENT_TL,
46     SPLIT_CURRENT_BR
47 } WSplitCurrent;
48
49
50 DECLCLASS(WSplit){
51     Obj obj;
52     WRectangle geom;
53     WSplitInner *parent;
54     void *ws_if_root;
55     
56     int min_w, min_h;
57     int max_w, max_h;
58     int unused_w, unused_h;
59 };
60
61
62 DECLCLASS(WSplitInner){
63     WSplit split;
64 };
65
66
67 DECLCLASS(WSplitSplit){
68     WSplitInner isplit;
69     int dir;
70     WSplit *tl, *br;
71     int current;
72 };
73
74
75 DECLCLASS(WSplitRegion){
76     WSplit split;
77     WRegion *reg;
78 };
79
80
81 DECLCLASS(WSplitST){
82     WSplitRegion regnode;
83     int orientation;
84     int corner;
85     bool fullsize;
86 };
87
88
89 typedef struct{
90     int tl, br;
91     bool any;
92 } RootwardAmount;
93
94
95 typedef bool WSplitFilter(WSplit *split);
96 typedef void WSplitFn(WSplit *split);
97
98
99 /* Misc. */
100
101 extern int split_size(WSplit *split, int dir);
102 extern int split_pos(WSplit *split, int dir);
103 extern int split_other_size(WSplit *split, int dir);
104 extern int split_other_pos(WSplit *split, int dir);
105
106 extern WSplitRegion *splittree_node_of(WRegion *reg);
107 extern bool splittree_set_node_of(WRegion *reg, WSplitRegion *split);
108
109 extern WPrimn primn_invert(WPrimn primn);
110 extern WPrimn primn_none2any(WPrimn primn);
111
112 /* Init/deinit */
113
114 extern bool split_init(WSplit *split, const WRectangle *geom);
115 extern bool splitinner_init(WSplitInner *split, const WRectangle *geom);
116 extern bool splitsplit_init(WSplitSplit *split, const WRectangle *geom, 
117                             int dir);
118 extern bool splitregion_init(WSplitRegion *split,const WRectangle *geom,
119                              WRegion *reg);
120 extern bool splitst_init(WSplitST *split, const WRectangle *geom,
121                          WRegion *reg);
122
123
124 extern WSplitSplit *create_splitsplit(const WRectangle *geom, int dir);
125 extern WSplitRegion *create_splitregion(const WRectangle *geom, WRegion *reg);
126 extern WSplitST *create_splitst(const WRectangle *geom, WRegion *reg);
127
128
129 extern void split_deinit(WSplit *split);
130 extern void splitsplit_deinit(WSplitSplit *split);
131 extern void splitinner_deinit(WSplitInner *split);
132 extern void splitregion_deinit(WSplitRegion *split);
133 extern void splitst_deinit(WSplitST *split);
134
135 /* Geometry */
136
137 DYNFUN void split_update_bounds(WSplit *node, bool recursive);
138 extern void splitsplit_update_geom_from_children(WSplitSplit *node);
139 DYNFUN void split_do_resize(WSplit *node, const WRectangle *ng, 
140                             WPrimn hprimn, WPrimn vprimn, bool transpose);
141 extern void splitsplit_do_resize(WSplitSplit *node, const WRectangle *ng, 
142                                  WPrimn hprimn, WPrimn vprimn, bool transpose);
143 extern void split_resize(WSplit *node, const WRectangle *ng, 
144                          WPrimn hprimn, WPrimn vprimn);
145 DYNFUN void splitinner_do_rqsize(WSplitInner *p, WSplit *node, 
146                                  RootwardAmount *ha, RootwardAmount *va, 
147                                  WRectangle *rg, bool tryonly);
148 extern ExtlTab split_rqgeom(WSplit *node, ExtlTab g);
149
150 /* Split */
151
152 extern void splittree_rqgeom(WSplit *node, int flags, 
153                              const WRectangle *geom, WRectangle *geomret);
154
155
156 DYNFUN void splitinner_replace(WSplitInner *node, WSplit *child, WSplit *what);
157 extern WSplitRegion *splittree_split(WSplit *node, int dir, 
158                                      WPrimn primn, int minsize, 
159                                      WRegionSimpleCreateFn *fn,
160                                      WWindow *parent);
161
162 extern void splittree_changeroot(WSplit *root, WSplit *node);
163
164 /* Remove */
165
166 DYNFUN void splitinner_remove(WSplitInner *node, WSplit *child, 
167                               bool reclaim_space);
168 extern void splittree_remove(WSplit *node, bool reclaim_space);
169
170 /* Tree traversal */
171
172 extern WSplit *split_find_root(WSplit *split);
173 DYNFUN WSplit *split_current_todir(WSplit *node, 
174                                    WPrimn hprimn, WPrimn vprimn,
175                                    WSplitFilter *filter);
176 DYNFUN WSplit *splitinner_nextto(WSplitInner *node, WSplit *child,
177                                  WPrimn hprimn, WPrimn vprimn, 
178                                  WSplitFilter *filter);
179 DYNFUN WSplit *splitinner_current(WSplitInner *node);
180 DYNFUN void splitinner_mark_current(WSplitInner *split, WSplit *child);
181 DYNFUN void splitinner_forall(WSplitInner *node, WSplitFn *fn);
182 extern WSplit *split_nextto(WSplit *node,
183                             WPrimn hprimn, WPrimn vprimn,
184                             WSplitFilter *filter);
185
186 /* X window handling */
187
188 void split_restack(WSplit *split, Window win, int mode);
189 void split_stacking(WSplit *split, Window *bottom_ret, Window *top_ret);
190 void split_map(WSplit *split);
191 void split_unmap(WSplit *split);
192 void split_reparent(WSplit *split, WWindow *wwin);
193
194 /* Transpose, flip, rotate */
195
196 extern void split_transpose(WSplit *split);
197 extern bool split_transpose_to(WSplit *split, const WRectangle *geom);
198
199 extern void splitsplit_flip_default(WSplitSplit *split);
200 DYNFUN void splitsplit_flip(WSplitSplit *split);
201
202 extern bool split_rotate_to(WSplit *node, const WRectangle *geom, 
203                             int rotation);
204
205 /* Save support */
206
207 extern bool split_get_config(WSplit *node, ExtlTab *ret);
208 extern ExtlTab split_base_config(WSplit *node);
209
210 /* Internal. */
211
212 extern void splittree_begin_resize();
213 extern void splittree_end_resize();
214 extern void splittree_scan_stdisp_rootward(WSplit *node);
215
216 extern void split_do_rqgeom_(WSplit *node, const WRectangle *ng, 
217                              bool hany, bool vany, WRectangle *rg, 
218                              bool tryonly);
219
220
221 #endif /* ION_MOD_TILING_SPLIT_H */