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));
224 memset(fPtr, 0, sizeof(Frame));
226 fPtr->widgetClass = WC_Frame;
228 fPtr->view = W_CreateView(W_VIEW(parent));
233 fPtr->view->self = fPtr;
235 WMCreateEventHandler(fPtr->view, ExposureMask | StructureNotifyMask, handleEvents, fPtr);
237 fPtr->flags.relief = DEFAULT_RELIEF;
238 fPtr->flags.titlePosition = DEFAULT_TITLE_POSITION;
240 WMResizeWidget(fPtr, DEFAULT_WIDTH, DEFAULT_HEIGHT);
245 static void destroyFrame(Frame * fPtr)
248 wfree(fPtr->caption);