dix: add touch to pointer event conversion helper
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net> Reviewed-by: Chase Douglas <chase.douglas@canonical.com>
This commit is contained in:
parent
c3843f5498
commit
753c4dca1e
62
dix/touch.c
62
dix/touch.c
|
@ -598,6 +598,68 @@ TouchEnsureSprite(DeviceIntPtr sourcedev, TouchPointInfoPtr ti,
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Copy the touch event into the pointer_event, switching the required
|
||||||
|
* fields to make it a correct pointer event.
|
||||||
|
*
|
||||||
|
* @param event The original touch event
|
||||||
|
* @param[in] motion_event The respective motion event
|
||||||
|
* @param[in] button_event The respective button event (if any)
|
||||||
|
*
|
||||||
|
* @returns The number of converted events.
|
||||||
|
* @retval 0 An error occured
|
||||||
|
* @retval 1 only the motion event is valid
|
||||||
|
* @retval 2 motion and button event are valid
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
TouchConvertToPointerEvent(const InternalEvent *event,
|
||||||
|
InternalEvent *motion_event,
|
||||||
|
InternalEvent *button_event)
|
||||||
|
{
|
||||||
|
int ptrtype;
|
||||||
|
int nevents = 0;
|
||||||
|
|
||||||
|
BUG_WARN(!event);
|
||||||
|
BUG_WARN(!motion_event);
|
||||||
|
|
||||||
|
switch(event->any.type)
|
||||||
|
{
|
||||||
|
case ET_TouchUpdate:
|
||||||
|
nevents = 1;
|
||||||
|
break;
|
||||||
|
case ET_TouchBegin:
|
||||||
|
nevents = 2; /* motion + press */
|
||||||
|
ptrtype = ET_ButtonPress;
|
||||||
|
break;
|
||||||
|
case ET_TouchEnd:
|
||||||
|
nevents = 2; /* motion + release */
|
||||||
|
ptrtype = ET_ButtonRelease;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
BUG_WARN_MSG(1,"Invalid event type %d\n", event->any.type);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
BUG_WARN_MSG(!(event->device_event.flags & TOUCH_POINTER_EMULATED),
|
||||||
|
"Non-emulating touch event\n");
|
||||||
|
|
||||||
|
*motion_event = *event;
|
||||||
|
motion_event->any.type = ET_Motion;
|
||||||
|
motion_event->device_event.detail.button = 0;
|
||||||
|
motion_event->device_event.flags = XIPointerEmulated;
|
||||||
|
|
||||||
|
if (nevents > 1)
|
||||||
|
{
|
||||||
|
BUG_WARN(!button_event);
|
||||||
|
*button_event = *event;
|
||||||
|
button_event->any.type = ptrtype;
|
||||||
|
button_event->device_event.flags = XIPointerEmulated;
|
||||||
|
/* detail is already correct */
|
||||||
|
}
|
||||||
|
|
||||||
|
return nevents;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return the corresponding pointer emulation internal event type for the given
|
* Return the corresponding pointer emulation internal event type for the given
|
||||||
* touch event or 0 if no such event type exists.
|
* touch event or 0 if no such event type exists.
|
||||||
|
|
|
@ -619,6 +619,8 @@ extern void TouchSetupListeners(DeviceIntPtr dev, TouchPointInfoPtr ti, Internal
|
||||||
extern Bool TouchEnsureSprite(DeviceIntPtr sourcedev, TouchPointInfoPtr ti,
|
extern Bool TouchEnsureSprite(DeviceIntPtr sourcedev, TouchPointInfoPtr ti,
|
||||||
InternalEvent *ev);
|
InternalEvent *ev);
|
||||||
extern Bool TouchBuildDependentSpriteTrace(DeviceIntPtr dev, SpritePtr sprite);
|
extern Bool TouchBuildDependentSpriteTrace(DeviceIntPtr dev, SpritePtr sprite);
|
||||||
|
extern int TouchConvertToPointerEvent(const InternalEvent *ev,
|
||||||
|
InternalEvent *motion, InternalEvent *button);
|
||||||
extern int TouchGetPointerEventType(const InternalEvent *ev);
|
extern int TouchGetPointerEventType(const InternalEvent *ev);
|
||||||
|
|
||||||
/* misc event helpers */
|
/* misc event helpers */
|
||||||
|
|
Loading…
Reference in New Issue