17 typedef struct W_Box
{
21 SubviewItem
*subviews
;
26 unsigned horizontal
:1;
30 #define DEFAULT_WIDTH 40
31 #define DEFAULT_HEIGHT 40
34 static void destroyBox(Box
*bPtr
);
36 static void handleEvents(XEvent
*event
, void *data
);
38 static void didResize(struct W_ViewDelegate
*, WMView
*);
40 static W_ViewDelegate delegate
= {
51 WMCreateBox(WMWidget
*parent
)
55 bPtr
= wmalloc(sizeof(Box
));
56 memset(bPtr
, 0, sizeof(Box
));
58 bPtr
->widgetClass
= WC_Box
;
60 bPtr
->view
= W_CreateView(W_VIEW(parent
));
65 bPtr
->view
->self
= bPtr
;
67 bPtr
->view
->delegate
= &delegate
;
69 WMCreateEventHandler(bPtr
->view
, StructureNotifyMask
,
72 WMResizeWidget(bPtr
, DEFAULT_WIDTH
, DEFAULT_HEIGHT
);
74 bPtr
->subviews
= NULL
;
75 bPtr
->subviewCount
= 0;
94 if (box
->horizontal
) {
95 ye
= box
->borderWidth
;
96 xe
= WMWidgetWidth(box
) - box
->borderWidth
;
97 h
= WMWidgetHeight(box
) - 2 * box
->borderWidth
;
98 total
= WMWidgetWidth(box
) - 2 * box
->borderWidth
;
100 xe
= box
->borderWidth
;
101 ye
= WMWidgetHeight(box
) - box
->borderWidth
;
102 w
= WMWidgetWidth(box
) - 2 * box
->borderWidth
;
103 total
= WMWidgetHeight(box
) - 2 * box
->borderWidth
;
106 if (w
<= 0 || h
<= 0 || total
<= 0) {
110 for (i
= 0; i
< box
->subviewCount
; i
++) {
111 total
-= box
->subviews
[i
].minSize
;
112 total
-= box
->subviews
[i
].space
;
113 if (box
->subviews
[i
].expand
) {
118 for (i
= 0; i
< box
->subviewCount
; i
++) {
119 if (box
->horizontal
) {
120 w
= box
->subviews
[i
].minSize
;
121 if (box
->subviews
[i
].expand
)
124 h
= box
->subviews
[i
].minSize
;
125 if (box
->subviews
[i
].expand
)
128 if (!box
->subviews
[i
].end
) {
129 W_MoveView(box
->subviews
[i
].view
, x
, y
);
131 W_ResizeView(box
->subviews
[i
].view
, w
, h
);
132 if (box
->horizontal
) {
133 if (box
->subviews
[i
].end
)
134 xe
-= w
+ box
->subviews
[i
].space
;
136 x
+= w
+ box
->subviews
[i
].space
;
138 if (box
->subviews
[i
].end
)
139 ye
-= h
+ box
->subviews
[i
].space
;
141 y
+= h
+ box
->subviews
[i
].space
;
143 if (box
->subviews
[i
].end
) {
144 W_MoveView(box
->subviews
[i
].view
, xe
, ye
);
151 WMSetBoxBorderWidth(WMBox
*box
, unsigned width
)
153 box
->borderWidth
= width
;
160 WMAddBoxSubview(WMBox
*bPtr
, WMView
*view
, Bool expand
, Bool fill
,
161 int minSize
, int maxSize
, int space
)
163 int i
= bPtr
->subviewCount
;
165 bPtr
->subviewCount
++;
167 bPtr
->subviews
= wmalloc(sizeof(SubviewItem
));
169 bPtr
->subviews
= wrealloc(bPtr
->subviews
,
170 bPtr
->subviewCount
*sizeof(SubviewItem
));
171 bPtr
->subviews
[i
].view
= view
;
172 bPtr
->subviews
[i
].minSize
= minSize
;
173 bPtr
->subviews
[i
].maxSize
= maxSize
;
174 bPtr
->subviews
[i
].expand
= expand
;
175 bPtr
->subviews
[i
].fill
= fill
;
176 bPtr
->subviews
[i
].space
= space
;
177 bPtr
->subviews
[i
].end
= 0;
185 WMAddBoxSubviewAtEnd(WMBox
*bPtr
, WMView
*view
, Bool expand
, Bool fill
,
186 int minSize
, int maxSize
, int space
)
188 int i
= bPtr
->subviewCount
;
190 bPtr
->subviewCount
++;
192 bPtr
->subviews
= wmalloc(sizeof(SubviewItem
));
194 bPtr
->subviews
= wrealloc(bPtr
->subviews
,
195 bPtr
->subviewCount
*sizeof(SubviewItem
));
196 bPtr
->subviews
[i
].view
= view
;
197 bPtr
->subviews
[i
].minSize
= minSize
;
198 bPtr
->subviews
[i
].maxSize
= maxSize
;
199 bPtr
->subviews
[i
].expand
= expand
;
200 bPtr
->subviews
[i
].fill
= fill
;
201 bPtr
->subviews
[i
].space
= space
;
202 bPtr
->subviews
[i
].end
= 1;
209 WMSetBoxHorizontal(WMBox
*box
, Bool flag
)
211 box
->horizontal
= flag
;
217 destroyBox(Box
*bPtr
)
224 didResize(struct W_ViewDelegate
*delegate
, WMView
*view
)
226 rearrange(view
->self
);
230 handleEvents(XEvent
*event
, void *data
)
232 Box
*bPtr
= (Box
*)data
;
234 CHECK_CLASS(data
, WC_Box
);
236 switch (event
->type
) {
241 case ConfigureNotify
: