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
);
27 static void repaintFrame(Frame
*fPtr
);
32 WMSetFrameTitlePosition(WMFrame
*fPtr
, WMTitlePosition position
)
34 fPtr
->flags
.titlePosition
= position
;
36 if (fPtr
->view
->flags
.realized
) {
43 WMSetFrameRelief(WMFrame
*fPtr
, WMReliefType relief
)
45 fPtr
->flags
.relief
= relief
;
47 if (fPtr
->view
->flags
.realized
) {
54 WMSetFrameTitle(WMFrame
*fPtr
, char *title
)
59 fPtr
->caption
= wstrdup(title
);
63 if (fPtr
->view
->flags
.realized
) {
70 repaintFrame(Frame
*fPtr
)
72 W_View
*view
= fPtr
->view
;
73 W_Screen
*scrPtr
= view
->screen
;
75 XClearWindow(scrPtr
->display
, view
->window
);
81 paintFrame(Frame
*fPtr
)
83 W_View
*view
= fPtr
->view
;
84 W_Screen
*scrPtr
= view
->screen
;
89 if (fPtr
->caption
!=NULL
)
90 th
= WMFontHeight(scrPtr
->normalFont
);
95 fh
= view
->size
.height
;
98 switch (fPtr
->flags
.titlePosition
) {
102 fh
= view
->size
.height
- fy
;
108 fh
= view
->size
.height
- fy
;
114 fh
= view
->size
.height
;
118 ty
= view
->size
.height
- th
- 4;
120 fh
= view
->size
.height
;
124 ty
= view
->size
.height
- th
;
126 fh
= view
->size
.height
- th
/2;
130 ty
= view
->size
.height
- th
;
132 fh
= view
->size
.height
- th
- 4;
138 fh
= view
->size
.height
;
141 if (fPtr
->caption
!=NULL
&& fPtr
->flags
.titlePosition
!=WTPNoTitle
) {
142 tw
= WMWidthOfString(scrPtr
->normalFont
, fPtr
->caption
,
143 strlen(fPtr
->caption
));
145 tx
= (view
->size
.width
- tw
) / 2;
158 region
= XCreateRegion();
161 tmp
= XCreateRegion();
166 XUnionRectWithRegion(&rect
, tmp
, tmp
);
170 rect
.width
= view
->size
.width
;
171 rect
.height
= view
->size
.height
;
172 XUnionRectWithRegion(&rect
, region
, region
);
174 XSubtractRegion(region
, tmp
, region
);
177 gc
[0] = WMColorGC(scrPtr
->black
);
178 gc
[1] = WMColorGC(scrPtr
->darkGray
);
179 gc
[2] = WMColorGC(scrPtr
->gray
);
180 gc
[3] = WMColorGC(scrPtr
->white
);
182 for (i
= 0; i
< 4; i
++) {
183 XSetRegion(scrPtr
->display
, gc
[i
], region
);
185 XDestroyRegion(region
);
187 W_DrawReliefWithGC(scrPtr
, view
->window
, 0, fy
, view
->size
.width
, fh
,
188 fPtr
->flags
.relief
, gc
[0], gc
[1], gc
[2], gc
[3]);
190 for (i
= 0; i
< 4; i
++) {
191 XSetClipMask(scrPtr
->display
, gc
[i
], None
);
196 WMDrawString(scrPtr
, view
->window
, WMColorGC(scrPtr
->black
),
197 scrPtr
->normalFont
, tx
, ty
, fPtr
->caption
,
198 strlen(fPtr
->caption
));
207 handleEvents(XEvent
*event
, void *data
)
209 Frame
*fPtr
= (Frame
*)data
;
211 CHECK_CLASS(data
, WC_Frame
);
213 switch (event
->type
) {
215 if (event
->xexpose
.count
== 0)
227 WMCreateFrame(WMWidget
*parent
)
231 fPtr
= wmalloc(sizeof(Frame
));
232 memset(fPtr
, 0, sizeof(Frame
));
234 fPtr
->widgetClass
= WC_Frame
;
236 fPtr
->view
= W_CreateView(W_VIEW(parent
));
241 fPtr
->view
->self
= fPtr
;
243 WMCreateEventHandler(fPtr
->view
, ExposureMask
|StructureNotifyMask
,
247 fPtr
->flags
.relief
= DEFAULT_RELIEF
;
248 fPtr
->flags
.titlePosition
= DEFAULT_TITLE_POSITION
;
250 WMResizeWidget(fPtr
, DEFAULT_WIDTH
, DEFAULT_HEIGHT
);
257 destroyFrame(Frame
*fPtr
)
260 wfree(fPtr
->caption
);