17 typedef struct W_Box
{
21 SubviewItem
*subviews
;
26 unsigned horizontal
:1;
30 #define DEFAULT_WIDTH 40
31 #define DEFAULT_HEIGHT 40
35 static void destroyBox(Box
*bPtr
);
37 static void handleEvents(XEvent
*event
, void *data
);
39 static void didResize(struct W_ViewDelegate
*, WMView
*);
41 static W_ViewDelegate delegate
= {
52 static void resizedParent(void *self
, WMNotification
*notif
)
54 WMView
*view
= (WMView
*)WMGetNotificationObject(notif
);
55 WMSize size
= WMGetViewSize(view
);
57 WMResizeWidget((WMWidget
*)self
, size
.width
, size
.height
);
62 WMCreateBox(WMWidget
*parent
)
66 bPtr
= wmalloc(sizeof(Box
));
67 memset(bPtr
, 0, sizeof(Box
));
69 bPtr
->widgetClass
= WC_Box
;
71 bPtr
->view
= W_CreateView(W_VIEW(parent
));
76 bPtr
->view
->self
= bPtr
;
78 bPtr
->view
->delegate
= &delegate
;
80 WMCreateEventHandler(bPtr
->view
, StructureNotifyMask
,
83 WMResizeWidget(bPtr
, DEFAULT_WIDTH
, DEFAULT_HEIGHT
);
85 bPtr
->subviews
= NULL
;
86 bPtr
->subviewCount
= 0;
102 x
= box
->borderWidth
;
103 y
= box
->borderWidth
;
105 if (box
->horizontal
) {
106 ye
= box
->borderWidth
;
107 xe
= WMWidgetWidth(box
) - box
->borderWidth
;
108 h
= WMWidgetHeight(box
) - 2 * box
->borderWidth
;
109 total
= WMWidgetWidth(box
) - 2 * box
->borderWidth
;
111 xe
= box
->borderWidth
;
112 ye
= WMWidgetHeight(box
) - box
->borderWidth
;
113 w
= WMWidgetWidth(box
) - 2 * box
->borderWidth
;
114 total
= WMWidgetHeight(box
) - 2 * box
->borderWidth
;
117 if (w
<= 0 || h
<= 0 || total
<= 0) {
121 for (i
= 0; i
< box
->subviewCount
; i
++) {
122 total
-= box
->subviews
[i
].minSize
;
123 total
-= box
->subviews
[i
].space
;
124 if (box
->subviews
[i
].expand
) {
129 for (i
= 0; i
< box
->subviewCount
; i
++) {
130 if (box
->horizontal
) {
131 w
= box
->subviews
[i
].minSize
;
132 if (box
->subviews
[i
].expand
)
135 h
= box
->subviews
[i
].minSize
;
136 if (box
->subviews
[i
].expand
)
139 if (!box
->subviews
[i
].end
) {
140 W_MoveView(box
->subviews
[i
].view
, x
, y
);
142 W_ResizeView(box
->subviews
[i
].view
, w
, h
);
143 if (box
->horizontal
) {
144 if (box
->subviews
[i
].end
)
145 xe
-= w
+ box
->subviews
[i
].space
;
147 x
+= w
+ box
->subviews
[i
].space
;
149 if (box
->subviews
[i
].end
)
150 ye
-= h
+ box
->subviews
[i
].space
;
152 y
+= h
+ box
->subviews
[i
].space
;
154 if (box
->subviews
[i
].end
) {
155 W_MoveView(box
->subviews
[i
].view
, xe
, ye
);
162 WMSetBoxBorderWidth(WMBox
*box
, unsigned width
)
164 box
->borderWidth
= width
;
171 WMAddBoxSubview(WMBox
*bPtr
, WMView
*view
, Bool expand
, Bool fill
,
172 int minSize
, int maxSize
, int space
)
174 int i
= bPtr
->subviewCount
;
176 bPtr
->subviewCount
++;
178 bPtr
->subviews
= wmalloc(sizeof(SubviewItem
));
180 bPtr
->subviews
= wrealloc(bPtr
->subviews
,
181 bPtr
->subviewCount
*sizeof(SubviewItem
));
182 bPtr
->subviews
[i
].view
= view
;
183 bPtr
->subviews
[i
].minSize
= minSize
;
184 bPtr
->subviews
[i
].maxSize
= maxSize
;
185 bPtr
->subviews
[i
].expand
= expand
;
186 bPtr
->subviews
[i
].fill
= fill
;
187 bPtr
->subviews
[i
].space
= space
;
188 bPtr
->subviews
[i
].end
= 0;
196 WMAddBoxSubviewAtEnd(WMBox
*bPtr
, WMView
*view
, Bool expand
, Bool fill
,
197 int minSize
, int maxSize
, int space
)
199 int i
= bPtr
->subviewCount
;
201 bPtr
->subviewCount
++;
203 bPtr
->subviews
= wmalloc(sizeof(SubviewItem
));
205 bPtr
->subviews
= wrealloc(bPtr
->subviews
,
206 bPtr
->subviewCount
*sizeof(SubviewItem
));
207 bPtr
->subviews
[i
].view
= view
;
208 bPtr
->subviews
[i
].minSize
= minSize
;
209 bPtr
->subviews
[i
].maxSize
= maxSize
;
210 bPtr
->subviews
[i
].expand
= expand
;
211 bPtr
->subviews
[i
].fill
= fill
;
212 bPtr
->subviews
[i
].space
= space
;
213 bPtr
->subviews
[i
].end
= 1;
220 WMRemoveBoxSubview(WMBox
*bPtr
, WMView
*view
)
224 for (i
= 0; i
< bPtr
->subviewCount
; i
++) {
225 if (bPtr
->subviews
[i
].view
== view
) {
226 memmove(&bPtr
->subviews
[i
], &bPtr
->subviews
[i
+1],
227 (bPtr
->subviewCount
- i
- 1) * sizeof(void*));
228 bPtr
->subviewCount
--;
237 WMSetBoxHorizontal(WMBox
*box
, Bool flag
)
239 box
->horizontal
= flag
;
245 WMSetBoxExpandsToParent(WMBox
*box
)
247 WMSize size
= W_VIEW(box
)->parent
->size
;
249 WMAddNotificationObserver(resizedParent
, box
,
250 WMViewSizeDidChangeNotification
,
251 W_VIEW(box
)->parent
);
252 WMSetViewNotifySizeChanges(W_VIEW(box
)->parent
, True
);
254 WMResizeWidget(box
, size
.width
, size
.height
);
259 destroyBox(Box
*bPtr
)
261 WMRemoveNotificationObserver(bPtr
);
267 didResize(struct W_ViewDelegate
*delegate
, WMView
*view
)
269 rearrange(view
->self
);
274 handleEvents(XEvent
*event
, void *data
)
276 Box
*bPtr
= (Box
*)data
;
278 CHECK_CLASS(data
, WC_Box
);
280 switch (event
->type
) {
285 case ConfigureNotify
: