3 * Widget for testing double-clicks
7 #include <WINGs/WINGsP.h>
11 typedef struct W_DoubleTest {
21 /* some forward declarations */
23 static void destroyDoubleTest(_DoubleTest * dPtr);
24 static void paintDoubleTest(_DoubleTest * dPtr);
26 static void handleEvents(XEvent * event, void *data);
27 static void handleActionEvents(XEvent * event, void *data);
29 /* our widget class ID */
30 static W_Class DoubleTestClass = 0;
33 * Initializer for our widget. Must be called before creating any
34 * instances of the widget.
36 W_Class InitDoubleTest(WMScreen * scr)
38 /* register our widget with WINGs and get our widget class ID */
39 if (!DoubleTestClass) {
40 DoubleTestClass = W_RegisterUserWidget();
43 return DoubleTestClass;
47 * Our widget fabrication plant.
49 DoubleTest *CreateDoubleTest(WMWidget * parent, char *text)
54 InitDoubleTest(WMWidgetScreen(parent));
56 /* allocate some storage for our new widget instance */
57 dPtr = wmalloc(sizeof(DoubleTest));
59 memset(dPtr, 0, sizeof(DoubleTest));
61 /* set the class ID */
62 dPtr->widgetClass = DoubleTestClass;
64 dPtr->view = W_CreateView(W_VIEW(parent));
70 dPtr->view->self = dPtr;
72 dPtr->text = wstrdup(text);
74 WMCreateEventHandler(dPtr->view, ExposureMask /* this allows us to know when we should paint */
75 | StructureNotifyMask, /* this allows us to know things like when we are destroyed */
78 WMCreateEventHandler(dPtr->view, ButtonPressMask, handleActionEvents, dPtr);
83 static void paintDoubleTest(_DoubleTest * dPtr)
85 W_Screen *scr = dPtr->view->screen;
88 XFillRectangle(scr->display, dPtr->view->window, WMColorGC(scr->white),
89 0, 0, dPtr->view->size.width, dPtr->view->size.height);
91 XClearWindow(scr->display, dPtr->view->window);
94 W_DrawRelief(scr, dPtr->view->window, 0, 0, dPtr->view->size.width,
95 dPtr->view->size.height, dPtr->on ? WRSunken : WRRaised);
99 y = (dPtr->view->size.height - scr->normalFont->height) / 2;
100 W_PaintText(dPtr->view, dPtr->view->window, scr->normalFont,
101 dPtr->on, dPtr->on + y, dPtr->view->size.width, WACenter,
102 scr->black, False, dPtr->text, strlen(dPtr->text));
106 static void handleEvents(XEvent * event, void *data)
108 _DoubleTest *dPtr = (_DoubleTest *) data;
110 switch (event->type) {
112 if (event->xexpose.count != 0)
114 paintDoubleTest(dPtr);
118 destroyDoubleTest(dPtr);
124 static void deactivate(void *data)
126 _DoubleTest *dPtr = (_DoubleTest *) data;
130 paintDoubleTest(dPtr);
135 static void handleActionEvents(XEvent * event, void *data)
137 _DoubleTest *dPtr = (_DoubleTest *) data;
138 extern _WINGsConfiguration WINGsConfiguration;
140 switch (event->type) {
142 if (WMIsDoubleClick(event)) {
144 WMDeleteTimerHandler(dPtr->timer);
146 dPtr->on = !dPtr->on;
148 paintDoubleTest(dPtr);
150 dPtr->timer = WMAddTimerHandler(WINGsConfiguration.doubleClickDelay, deactivate, dPtr);
152 paintDoubleTest(dPtr);
158 static void destroyDoubleTest(_DoubleTest * dPtr)
161 WMDeleteTimerHandler(dPtr->timer);