Files
wmaker/WPrefs.app/double.c
T

164 lines
3.4 KiB
C
Raw Normal View History

1998-09-29 22:36:29 +00:00
/*
* Widget for testing double-clicks
2004-10-12 21:28:27 +00:00
*
1998-09-29 22:36:29 +00:00
*/
#include <WINGs/WINGsP.h>
#include "WPrefs.h"
1998-09-29 22:36:29 +00:00
typedef struct W_DoubleTest {
2009-08-20 00:59:40 +02:00
W_Class widgetClass;
WMView *view;
1998-09-29 22:36:29 +00:00
2009-08-20 00:59:40 +02:00
WMHandlerID timer;
char on;
char active;
char *text;
1998-09-29 22:36:29 +00:00
} _DoubleTest;
/* some forward declarations */
2009-08-20 00:59:40 +02:00
static void destroyDoubleTest(_DoubleTest * dPtr);
static void paintDoubleTest(_DoubleTest * dPtr);
1998-09-29 22:36:29 +00:00
2009-08-20 00:59:40 +02:00
static void handleEvents(XEvent * event, void *data);
static void handleActionEvents(XEvent * event, void *data);
1998-09-29 22:36:29 +00:00
/* our widget class ID */
static W_Class DoubleTestClass = 0;
/*
* Initializer for our widget. Must be called before creating any
* instances of the widget.
*/
W_Class InitDoubleTest(void)
1998-09-29 22:36:29 +00:00
{
2009-08-20 00:59:40 +02:00
/* register our widget with WINGs and get our widget class ID */
if (!DoubleTestClass) {
DoubleTestClass = W_RegisterUserWidget();
}
2009-08-20 00:59:40 +02:00
return DoubleTestClass;
1998-09-29 22:36:29 +00:00
}
/*
* Our widget fabrication plant.
*/
DoubleTest *CreateDoubleTest(WMWidget * parent, const char *text)
1998-09-29 22:36:29 +00:00
{
2009-08-20 00:59:40 +02:00
DoubleTest *dPtr;
1998-09-29 22:36:29 +00:00
2009-08-20 00:59:40 +02:00
if (!DoubleTestClass)
InitDoubleTest();
2004-10-12 21:28:27 +00:00
2009-08-20 00:59:40 +02:00
/* allocate some storage for our new widget instance */
dPtr = wmalloc(sizeof(DoubleTest));
1998-09-29 22:36:29 +00:00
2009-08-20 00:59:40 +02:00
/* set the class ID */
dPtr->widgetClass = DoubleTestClass;
2004-10-12 21:28:27 +00:00
2009-08-20 00:59:40 +02:00
dPtr->view = W_CreateView(W_VIEW(parent));
if (!dPtr->view) {
wfree(dPtr);
return NULL;
}
/* always do this */
dPtr->view->self = dPtr;
2004-10-12 21:28:27 +00:00
2009-08-20 00:59:40 +02:00
dPtr->text = wstrdup(text);
1998-09-29 22:36:29 +00:00
2009-08-20 00:59:40 +02:00
WMCreateEventHandler(dPtr->view, ExposureMask /* this allows us to know when we should paint */
| StructureNotifyMask, /* this allows us to know things like when we are destroyed */
handleEvents, dPtr);
1998-09-29 22:36:29 +00:00
2009-08-20 00:59:40 +02:00
WMCreateEventHandler(dPtr->view, ButtonPressMask, handleActionEvents, dPtr);
1998-09-29 22:36:29 +00:00
2009-08-20 00:59:40 +02:00
return dPtr;
1998-09-29 22:36:29 +00:00
}
2009-08-20 00:59:40 +02:00
static void paintDoubleTest(_DoubleTest * dPtr)
1998-09-29 22:36:29 +00:00
{
2009-08-20 00:59:40 +02:00
W_Screen *scr = dPtr->view->screen;
if (dPtr->active) {
XFillRectangle(scr->display, dPtr->view->window, WMColorGC(scr->white),
0, 0, dPtr->view->size.width, dPtr->view->size.height);
} else {
XClearWindow(scr->display, dPtr->view->window);
}
W_DrawRelief(scr, dPtr->view->window, 0, 0, dPtr->view->size.width,
dPtr->view->size.height, dPtr->on ? WRSunken : WRRaised);
if (dPtr->text) {
int y;
y = (dPtr->view->size.height - scr->normalFont->height) / 2;
W_PaintText(dPtr->view, dPtr->view->window, scr->normalFont,
dPtr->on, dPtr->on + y, dPtr->view->size.width, WACenter,
scr->black, False, dPtr->text, strlen(dPtr->text));
}
1998-09-29 22:36:29 +00:00
}
2009-08-20 00:59:40 +02:00
static void handleEvents(XEvent * event, void *data)
1998-09-29 22:36:29 +00:00
{
2009-08-20 00:59:40 +02:00
_DoubleTest *dPtr = (_DoubleTest *) data;
1998-09-29 22:36:29 +00:00
2009-08-20 00:59:40 +02:00
switch (event->type) {
case Expose:
if (event->xexpose.count != 0)
break;
paintDoubleTest(dPtr);
break;
1998-09-29 22:36:29 +00:00
2009-08-20 00:59:40 +02:00
case DestroyNotify:
destroyDoubleTest(dPtr);
break;
2004-10-12 21:28:27 +00:00
2009-08-20 00:59:40 +02:00
}
1998-09-29 22:36:29 +00:00
}
2009-08-20 00:59:40 +02:00
static void deactivate(void *data)
1998-09-29 22:36:29 +00:00
{
2009-08-20 00:59:40 +02:00
_DoubleTest *dPtr = (_DoubleTest *) data;
2004-10-12 21:28:27 +00:00
2009-08-20 00:59:40 +02:00
if (dPtr->active)
dPtr->active = 0;
paintDoubleTest(dPtr);
2004-10-12 21:28:27 +00:00
2009-08-20 00:59:40 +02:00
dPtr->timer = NULL;
1998-09-29 22:36:29 +00:00
}
2009-08-20 00:59:40 +02:00
static void handleActionEvents(XEvent * event, void *data)
1998-09-29 22:36:29 +00:00
{
2009-08-20 00:59:40 +02:00
_DoubleTest *dPtr = (_DoubleTest *) data;
switch (event->type) {
case ButtonPress:
if (WMIsDoubleClick(event)) {
if (dPtr->timer)
WMDeleteTimerHandler(dPtr->timer);
dPtr->timer = NULL;
dPtr->on = !dPtr->on;
dPtr->active = 0;
paintDoubleTest(dPtr);
} else {
dPtr->timer = WMAddTimerHandler(WINGsConfiguration.doubleClickDelay, deactivate, dPtr);
dPtr->active = 1;
paintDoubleTest(dPtr);
}
break;
}
1998-09-29 22:36:29 +00:00
}
2009-08-20 00:59:40 +02:00
static void destroyDoubleTest(_DoubleTest * dPtr)
1998-09-29 22:36:29 +00:00
{
2009-08-20 00:59:40 +02:00
if (dPtr->timer)
WMDeleteTimerHandler(dPtr->timer);
if (dPtr->text)
wfree(dPtr->text);
2004-10-12 21:28:27 +00:00
2009-08-20 00:59:40 +02:00
wfree(dPtr);
1998-09-29 22:36:29 +00:00
}