#include <ggi/events.h>
typedef struct gii_pmove_event {
COMMON_DATA;
int32_t x, y; /* absolute/relative position */
int32_t z, wheel;
} gii_pmove_event;
LibGII does not attempt to interpolate or keep track of the current pointer position. (This is the application's responsibility.) LibGII may also report both relative and absolute pointer motion for the same input, which may happen when the mouse is being emulated using a keyboard on an input/target that is normally reports absolute motion.
{
static int mousex,mousey;
ggiEventPoll(vis, emKey|emPointer, NULL);
events = ggiEventsQueued(vis, emKey|emPointer);
while (events--) {
ggiEventRead(vis, &event, emKey|emPointer);
switch(event.any.type) {
case evPtrButtonPress:
switch(event.pbutton.button) {
case GII_PBUTTON_FIRST:
do_something_as_appropriate(mousex,mousey);
break;
case GII_PBUTTON_SECOND:
/* ... */
}
break;
case evPtrButtonRelease:
/* ... if needed ... */
break;
case evPtrAbsolute:
mousex = event.pmove.x;
mousey = event.pmove.y;
break;
case evPtrRelative:
mousex += event.pmove.x;
mousey += event.pmove.y;
break;
}
/* Constrain mouse in any case */
if (mousex < 0) mousex = 0;
if (mousey < 0) mousey = 0;
if (mousex > xmax) mousex = xmax;
if (mousey > ymax) mousey = ymax;
} /* while */
}