more dnd changes
[wmaker-crm.git] / WINGs / wframe.c
blobd229b384531fa13d6391fd5a404d3e04e8eaea30
2 #include "WINGsP.h"
5 typedef struct W_Frame {
6 W_Class widgetClass;
7 W_View *view;
9 char *caption;
12 struct {
13 WMReliefType relief:4;
14 WMTitlePosition titlePosition:4;
15 } flags;
16 } Frame;
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);
30 void
31 WMSetFrameTitlePosition(WMFrame *fPtr, WMTitlePosition position)
33 fPtr->flags.titlePosition = position;
35 if (fPtr->view->flags.realized) {
36 paintFrame(fPtr);
41 void
42 WMSetFrameRelief(WMFrame *fPtr, WMReliefType relief)
44 fPtr->flags.relief = relief;
46 if (fPtr->view->flags.realized) {
47 paintFrame(fPtr);
52 void
53 WMSetFrameTitle(WMFrame *fPtr, char *title)
55 if (fPtr->caption)
56 wfree(fPtr->caption);
57 if (title)
58 fPtr->caption = wstrdup(title);
59 else
60 fPtr->caption = NULL;
62 if (fPtr->view->flags.realized) {
63 paintFrame(fPtr);
68 static void
69 paintFrame(Frame *fPtr)
71 W_View *view = fPtr->view;
72 W_Screen *scrPtr = view->screen;
73 int tx, ty, tw, th;
74 int fy, fh;
75 Bool drawTitle;
77 if (fPtr->caption!=NULL)
78 th = WMFontHeight(scrPtr->normalFont);
79 else {
80 th = 0;
83 fh = view->size.height;
84 fy = 0;
86 switch (fPtr->flags.titlePosition) {
87 case WTPAboveTop:
88 ty = 0;
89 fy = th + 4;
90 fh = view->size.height - fy;
91 break;
93 case WTPAtTop:
94 ty = 0;
95 fy = th/2;
96 fh = view->size.height - fy;
97 break;
99 case WTPBelowTop:
100 ty = 4;
101 fy = 0;
102 fh = view->size.height;
103 break;
105 case WTPAboveBottom:
106 ty = view->size.height - th - 4;
107 fy = 0;
108 fh = view->size.height;
109 break;
111 case WTPAtBottom:
112 ty = view->size.height - th;
113 fy = 0;
114 fh = view->size.height - th/2;
115 break;
117 case WTPBelowBottom:
118 ty = view->size.height - th;
119 fy = 0;
120 fh = view->size.height - th - 4;
121 break;
123 default:
124 ty = 0;
125 fy = 0;
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;
135 drawTitle = True;
136 } else {
137 drawTitle = False;
140 /* XClearArea(scrPtr->display, view->window, x, y, width, height, False);
144 XRectangle rect;
145 Region region, tmp;
146 GC gc[4];
147 int i;
149 region = XCreateRegion();
151 if (drawTitle) {
152 tmp = XCreateRegion();
153 rect.x = tx;
154 rect.y = ty;
155 rect.width = tw;
156 rect.height = th;
157 XUnionRectWithRegion(&rect, tmp, tmp);
159 rect.x = 0;
160 rect.y = 0;
161 rect.width = view->size.width;
162 rect.height = view->size.height;
163 XUnionRectWithRegion(&rect, region, region);
164 if (drawTitle) {
165 XSubtractRegion(region, tmp, region);
166 XDestroyRegion(tmp);
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);
186 if (drawTitle) {
187 WMDrawString(scrPtr, view->window, WMColorGC(scrPtr->black),
188 scrPtr->normalFont, tx, ty, fPtr->caption,
189 strlen(fPtr->caption));
197 static void
198 handleEvents(XEvent *event, void *data)
200 Frame *fPtr = (Frame*)data;
202 CHECK_CLASS(data, WC_Frame);
204 switch (event->type) {
205 case Expose:
206 if (event->xexpose.count == 0)
207 paintFrame(fPtr);
208 break;
210 case DestroyNotify:
211 destroyFrame(fPtr);
212 break;
217 WMFrame*
218 WMCreateFrame(WMWidget *parent)
220 Frame *fPtr;
222 fPtr = wmalloc(sizeof(Frame));
223 memset(fPtr, 0, sizeof(Frame));
225 fPtr->widgetClass = WC_Frame;
227 fPtr->view = W_CreateView(W_VIEW(parent));
228 if (!fPtr->view) {
229 wfree(fPtr);
230 return NULL;
232 fPtr->view->self = fPtr;
234 WMCreateEventHandler(fPtr->view, ExposureMask|StructureNotifyMask,
235 handleEvents, fPtr);
238 fPtr->flags.relief = DEFAULT_RELIEF;
239 fPtr->flags.titlePosition = DEFAULT_TITLE_POSITION;
241 WMResizeWidget(fPtr, DEFAULT_WIDTH, DEFAULT_HEIGHT);
243 return fPtr;
247 static void
248 destroyFrame(Frame *fPtr)
250 if (fPtr->caption)
251 wfree(fPtr->caption);
253 wfree(fPtr);