4 typedef struct W_Frame
{
11 WMReliefType relief
:4;
12 WMTitlePosition titlePosition
:4;
16 #define DEFAULT_RELIEF WRGroove
17 #define DEFAULT_TITLE_POSITION WTPAtTop
18 #define DEFAULT_WIDTH 40
19 #define DEFAULT_HEIGHT 40
21 static void destroyFrame(Frame
* fPtr
);
22 static void paintFrame(Frame
* fPtr
);
23 static void repaintFrame(Frame
* fPtr
);
25 void WMSetFrameTitlePosition(WMFrame
* fPtr
, WMTitlePosition position
)
27 fPtr
->flags
.titlePosition
= position
;
29 if (fPtr
->view
->flags
.realized
) {
34 void WMSetFrameRelief(WMFrame
* fPtr
, WMReliefType relief
)
36 fPtr
->flags
.relief
= relief
;
38 if (fPtr
->view
->flags
.realized
) {
43 void WMSetFrameTitle(WMFrame
* fPtr
, char *title
)
49 fPtr
->caption
= wstrdup(title
);
53 if (fPtr
->view
->flags
.realized
) {
58 static void repaintFrame(Frame
* fPtr
)
60 W_View
*view
= fPtr
->view
;
61 W_Screen
*scrPtr
= view
->screen
;
63 XClearWindow(scrPtr
->display
, view
->window
);
67 static void paintFrame(Frame
* fPtr
)
69 W_View
*view
= fPtr
->view
;
70 W_Screen
*scrPtr
= view
->screen
;
71 WMFont
*font
= scrPtr
->normalFont
;
72 Display
*display
= scrPtr
->display
;
73 int tx
, ty
, tw
, th
, tlen
;
77 if (fPtr
->caption
!= NULL
) {
78 th
= WMFontHeight(font
);
79 tlen
= strlen(fPtr
->caption
);
85 fh
= view
->size
.height
;
88 switch (fPtr
->flags
.titlePosition
) {
92 fh
= view
->size
.height
- fy
;
98 fh
= view
->size
.height
- fy
;
104 fh
= view
->size
.height
;
108 ty
= view
->size
.height
- th
- 4;
110 fh
= view
->size
.height
;
114 ty
= view
->size
.height
- th
;
116 fh
= view
->size
.height
- th
/ 2;
120 ty
= view
->size
.height
- th
;
122 fh
= view
->size
.height
- th
- 4;
128 fh
= view
->size
.height
;
131 if (tlen
> 0 && fPtr
->flags
.titlePosition
!= WTPNoTitle
) {
132 tw
= WMWidthOfString(font
, fPtr
->caption
, tlen
);
134 tx
= (view
->size
.width
- tw
) / 2;
148 region
= XCreateRegion();
152 rect
.width
= view
->size
.width
;
153 rect
.height
= view
->size
.height
;
154 XUnionRectWithRegion(&rect
, region
, region
);
156 tmp
= XCreateRegion();
161 XUnionRectWithRegion(&rect
, tmp
, tmp
);
162 XSubtractRegion(region
, tmp
, region
);
165 gc
[0] = WMColorGC(scrPtr
->black
);
166 gc
[1] = WMColorGC(scrPtr
->darkGray
);
167 gc
[2] = WMColorGC(scrPtr
->gray
);
168 gc
[3] = WMColorGC(scrPtr
->white
);
170 for (i
= 0; i
< 4; i
++) {
171 XSetRegion(display
, gc
[i
], region
);
173 XDestroyRegion(region
);
175 W_DrawReliefWithGC(scrPtr
, view
->window
, 0, fy
, view
->size
.width
, fh
,
176 fPtr
->flags
.relief
, gc
[0], gc
[1], gc
[2], gc
[3]);
178 for (i
= 0; i
< 4; i
++) {
179 XSetClipMask(display
, gc
[i
], None
);
184 /* can't draw AA text over and over again because it gets messed */
185 /* // TODO create the dbl buffer pixmap when create/set frame title */
186 if (scrPtr
->antialiasedText
) {
189 d
= XCreatePixmap(display
, view
->window
, tw
, th
, scrPtr
->depth
);
190 XFillRectangle(display
, d
, WMColorGC(view
->backColor
), 0, 0, tw
, th
);
192 WMDrawString(scrPtr
, d
, scrPtr
->black
, font
, 0, 0, fPtr
->caption
, tlen
);
193 XCopyArea(display
, d
, view
->window
, scrPtr
->copyGC
, 0, 0, tw
, th
, tx
, ty
);
194 XFreePixmap(display
, d
);
196 WMDrawString(scrPtr
, view
->window
, scrPtr
->black
, font
, tx
, ty
, fPtr
->caption
, tlen
);
201 static void handleEvents(XEvent
* event
, void *data
)
203 Frame
*fPtr
= (Frame
*) data
;
205 CHECK_CLASS(data
, WC_Frame
);
207 switch (event
->type
) {
209 if (event
->xexpose
.count
== 0)
219 WMFrame
*WMCreateFrame(WMWidget
* parent
)
223 fPtr
= wmalloc(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
, handleEvents
, fPtr
);
236 fPtr
->flags
.relief
= DEFAULT_RELIEF
;
237 fPtr
->flags
.titlePosition
= DEFAULT_TITLE_POSITION
;
239 WMResizeWidget(fPtr
, DEFAULT_WIDTH
, DEFAULT_HEIGHT
);
244 static void destroyFrame(Frame
* fPtr
)
247 wfree(fPtr
->caption
);