Initial revision
[wmaker-crm.git] / WPrefs.app / double.c
blobb4da703436db6f319bccabebadb5a86958ce179c
2 /*
3 * Widget for testing double-clicks
4 *
5 */
7 #include "WINGsP.h"
9 #include "double.h"
12 typedef struct W_DoubleTest {
13 W_Class widgetClass;
14 WMView *view;
16 WMHandlerID timer;
17 char on;
18 char active;
19 char *text;
20 } _DoubleTest;
25 /* some forward declarations */
27 static void destroyDoubleTest(_DoubleTest *dPtr);
28 static void paintDoubleTest(_DoubleTest *dPtr);
31 static void handleEvents(XEvent *event, void *data);
32 static void handleActionEvents(XEvent *event, void *data);
35 static W_ViewProcedureTable _DoubleTestViewProcedures = {
36 NULL,
37 NULL,
38 NULL
42 /* our widget class ID */
43 static W_Class DoubleTestClass = 0;
47 * Initializer for our widget. Must be called before creating any
48 * instances of the widget.
50 W_Class
51 InitDoubleTest(WMScreen *scr)
53 /* register our widget with WINGs and get our widget class ID */
54 if (!DoubleTestClass) {
55 DoubleTestClass = W_RegisterUserWidget(&_DoubleTestViewProcedures);
58 return DoubleTestClass;
63 * Our widget fabrication plant.
65 DoubleTest*
66 CreateDoubleTest(WMWidget *parent, char *text)
68 DoubleTest *dPtr;
70 if (!DoubleTestClass)
71 InitDoubleTest(WMWidgetScreen(parent));
73 /* allocate some storage for our new widget instance */
74 dPtr = wmalloc(sizeof(DoubleTest));
75 /* initialize it */
76 memset(dPtr, 0, sizeof(DoubleTest));
78 /* set the class ID */
79 dPtr->widgetClass = DoubleTestClass;
81 dPtr->view = W_CreateView(W_VIEW(parent));
82 if (!dPtr->view) {
83 free(dPtr);
84 return NULL;
86 /* always do this */
87 dPtr->view->self = dPtr;
89 dPtr->text = wstrdup(text);
91 WMCreateEventHandler(dPtr->view, ExposureMask /* this allows us to know when we should paint */
92 |StructureNotifyMask, /* this allows us to know things like when we are destroyed */
93 handleEvents, dPtr);
95 WMCreateEventHandler(dPtr->view, ButtonPressMask,handleActionEvents, dPtr);
97 return dPtr;
102 static void
103 paintDoubleTest(_DoubleTest *dPtr)
105 W_Screen *scr = dPtr->view->screen;
107 if (dPtr->active) {
108 XFillRectangle(scr->display, dPtr->view->window, W_GC(scr->white),
109 0, 0, dPtr->view->size.width, dPtr->view->size.height);
110 } else {
111 XClearWindow(scr->display, dPtr->view->window);
114 W_DrawRelief(scr, dPtr->view->window, 0, 0, dPtr->view->size.width,
115 dPtr->view->size.height, dPtr->on ? WRSunken : WRRaised);
117 if (dPtr->text) {
118 int y;
119 y = (dPtr->view->size.height-scr->normalFont->height)/2;
120 W_PaintText(dPtr->view, dPtr->view->window, scr->normalFont,
121 dPtr->on, dPtr->on+y, dPtr->view->size.width, WACenter,
122 W_GC(scr->black), False, dPtr->text, strlen(dPtr->text));
128 static void
129 handleEvents(XEvent *event, void *data)
131 _DoubleTest *dPtr = (_DoubleTest*)data;
134 switch (event->type) {
135 case Expose:
136 if (event->xexpose.count!=0)
137 break;
138 paintDoubleTest(dPtr);
139 break;
141 case DestroyNotify:
142 destroyDoubleTest(dPtr);
143 break;
149 static void
150 deactivate(void *data)
152 _DoubleTest *dPtr = (_DoubleTest*)data;
154 if (dPtr->active)
155 dPtr->active = 0;
156 paintDoubleTest(dPtr);
158 dPtr->timer = NULL;
162 static void
163 handleActionEvents(XEvent *event, void *data)
165 _DoubleTest *dPtr = (_DoubleTest*)data;
166 extern _WINGsConfiguration WINGsConfiguration;
168 switch (event->type) {
169 case ButtonPress:
170 if (WMIsDoubleClick(event)) {
171 if (dPtr->timer)
172 WMDeleteTimerHandler(dPtr->timer);
173 dPtr->timer = NULL;
174 dPtr->on = !dPtr->on;
175 dPtr->active = 0;
176 paintDoubleTest(dPtr);
177 } else {
178 dPtr->timer=WMAddTimerHandler(WINGsConfiguration.doubleClickDelay,
179 deactivate, dPtr);
180 dPtr->active = 1;
181 paintDoubleTest(dPtr);
183 break;
189 static void
190 destroyDoubleTest(_DoubleTest *dPtr)
192 if (dPtr->timer)
193 WMDeleteTimerHandler(dPtr->timer);
194 if (dPtr->text)
195 free(dPtr->text);
197 free(dPtr);