3 * Widget for testing double-clicks
12 typedef struct W_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
= {
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.
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.
66 CreateDoubleTest(WMWidget
*parent
, char *text
)
71 InitDoubleTest(WMWidgetScreen(parent
));
73 /* allocate some storage for our new widget instance */
74 dPtr
= wmalloc(sizeof(DoubleTest
));
76 memset(dPtr
, 0, sizeof(DoubleTest
));
78 /* set the class ID */
79 dPtr
->widgetClass
= DoubleTestClass
;
81 dPtr
->view
= W_CreateView(W_VIEW(parent
));
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 */
95 WMCreateEventHandler(dPtr
->view
, ButtonPressMask
,handleActionEvents
, dPtr
);
103 paintDoubleTest(_DoubleTest
*dPtr
)
105 W_Screen
*scr
= dPtr
->view
->screen
;
108 XFillRectangle(scr
->display
, dPtr
->view
->window
, W_GC(scr
->white
),
109 0, 0, dPtr
->view
->size
.width
, dPtr
->view
->size
.height
);
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
);
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
));
129 handleEvents(XEvent
*event
, void *data
)
131 _DoubleTest
*dPtr
= (_DoubleTest
*)data
;
134 switch (event
->type
) {
136 if (event
->xexpose
.count
!=0)
138 paintDoubleTest(dPtr
);
142 destroyDoubleTest(dPtr
);
150 deactivate(void *data
)
152 _DoubleTest
*dPtr
= (_DoubleTest
*)data
;
156 paintDoubleTest(dPtr
);
163 handleActionEvents(XEvent
*event
, void *data
)
165 _DoubleTest
*dPtr
= (_DoubleTest
*)data
;
166 extern _WINGsConfiguration WINGsConfiguration
;
168 switch (event
->type
) {
170 if (WMIsDoubleClick(event
)) {
172 WMDeleteTimerHandler(dPtr
->timer
);
174 dPtr
->on
= !dPtr
->on
;
176 paintDoubleTest(dPtr
);
178 dPtr
->timer
=WMAddTimerHandler(WINGsConfiguration
.doubleClickDelay
,
181 paintDoubleTest(dPtr
);
190 destroyDoubleTest(_DoubleTest
*dPtr
)
193 WMDeleteTimerHandler(dPtr
->timer
);