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