5 typedef struct W_Frame
{
13 WMReliefType relief
:4;
14 WMTitlePosition titlePosition
:4;
19 #define DEFAULT_RELIEF WRGroove
20 #define DEFAULT_TITLE_POSITION WTPAtTop
21 #define DEFAULT_WIDTH 40
22 #define DEFAULT_HEIGHT 40
25 static void destroyFrame(Frame
*fPtr
);
26 static void paintFrame(Frame
*fPtr
);
31 WMSetFrameTitlePosition(WMFrame
*fPtr
, WMTitlePosition position
)
33 fPtr
->flags
.titlePosition
= position
;
35 if (fPtr
->view
->flags
.realized
) {
42 WMSetFrameRelief(WMFrame
*fPtr
, WMReliefType relief
)
44 fPtr
->flags
.relief
= relief
;
46 if (fPtr
->view
->flags
.realized
) {
53 WMSetFrameTitle(WMFrame
*fPtr
, char *title
)
58 fPtr
->caption
= wstrdup(title
);
62 if (fPtr
->view
->flags
.realized
) {
69 paintFrame(Frame
*fPtr
)
71 W_View
*view
= fPtr
->view
;
72 W_Screen
*scrPtr
= view
->screen
;
77 if (fPtr
->caption
!=NULL
)
78 th
= WMFontHeight(scrPtr
->normalFont
);
83 fh
= view
->size
.height
;
86 switch (fPtr
->flags
.titlePosition
) {
90 fh
= view
->size
.height
- fy
;
96 fh
= view
->size
.height
- fy
;
102 fh
= view
->size
.height
;
106 ty
= view
->size
.height
- th
- 4;
108 fh
= view
->size
.height
;
112 ty
= view
->size
.height
- th
;
114 fh
= view
->size
.height
- th
/2;
118 ty
= view
->size
.height
- th
;
120 fh
= view
->size
.height
- th
- 4;
126 fh
= view
->size
.height
;
129 if (fPtr
->caption
!=NULL
&& fPtr
->flags
.titlePosition
!=WTPNoTitle
) {
130 tw
= WMWidthOfString(scrPtr
->normalFont
, fPtr
->caption
,
131 strlen(fPtr
->caption
));
133 tx
= (view
->size
.width
- tw
) / 2;
140 /* XClearArea(scrPtr->display, view->window, x, y, width, height, False);
149 region
= XCreateRegion();
152 tmp
= XCreateRegion();
157 XUnionRectWithRegion(&rect
, tmp
, tmp
);
161 rect
.width
= view
->size
.width
;
162 rect
.height
= view
->size
.height
;
163 XUnionRectWithRegion(&rect
, region
, region
);
165 XSubtractRegion(region
, tmp
, region
);
168 gc
[0] = WMColorGC(scrPtr
->black
);
169 gc
[1] = WMColorGC(scrPtr
->darkGray
);
170 gc
[2] = WMColorGC(scrPtr
->gray
);
171 gc
[3] = WMColorGC(scrPtr
->white
);
173 for (i
= 0; i
< 4; i
++) {
174 XSetRegion(scrPtr
->display
, gc
[i
], region
);
176 XDestroyRegion(region
);
178 W_DrawReliefWithGC(scrPtr
, view
->window
, 0, fy
, view
->size
.width
, fh
,
179 fPtr
->flags
.relief
, gc
[0], gc
[1], gc
[2], gc
[3]);
181 for (i
= 0; i
< 4; i
++) {
182 XSetClipMask(scrPtr
->display
, gc
[i
], None
);
187 WMDrawString(scrPtr
, view
->window
, WMColorGC(scrPtr
->black
),
188 scrPtr
->normalFont
, tx
, ty
, fPtr
->caption
,
189 strlen(fPtr
->caption
));
198 handleEvents(XEvent
*event
, void *data
)
200 Frame
*fPtr
= (Frame
*)data
;
202 CHECK_CLASS(data
, WC_Frame
);
204 switch (event
->type
) {
206 if (event
->xexpose
.count
== 0)
218 WMCreateFrame(WMWidget
*parent
)
222 fPtr
= wmalloc(sizeof(Frame
));
223 memset(fPtr
, 0, sizeof(Frame
));
225 fPtr
->widgetClass
= WC_Frame
;
227 fPtr
->view
= W_CreateView(W_VIEW(parent
));
232 fPtr
->view
->self
= fPtr
;
234 WMCreateEventHandler(fPtr
->view
, ExposureMask
|StructureNotifyMask
,
238 fPtr
->flags
.relief
= DEFAULT_RELIEF
;
239 fPtr
->flags
.titlePosition
= DEFAULT_TITLE_POSITION
;
241 WMResizeWidget(fPtr
, DEFAULT_WIDTH
, DEFAULT_HEIGHT
);
248 destroyFrame(Frame
*fPtr
)
251 wfree(fPtr
->caption
);