Input: Add DeviceEventSource enum

Add a flag to DeviceEvents, giving the source of the event. Currently
this only supports a 'normal' flag, but will be used later to add a
'focus-in' flag, noting events synthesised from key/button arrays on
focus-in notifications.

Signed-off-by: Daniel Stone <daniels@collabora.com>
Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net>
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
This commit is contained in:
Daniel Stone 2015-11-20 15:37:29 +00:00 committed by Peter Hutterer
parent 2e61901e46
commit c3788394e9
5 changed files with 29 additions and 14 deletions

View File

@ -1092,6 +1092,7 @@ GetKeyboardEvents(InternalEvent *events, DeviceIntPtr pDev, int type,
CARD32 ms = 0; CARD32 ms = 0;
DeviceEvent *event; DeviceEvent *event;
RawDeviceEvent *raw; RawDeviceEvent *raw;
enum DeviceEventSource source_type = EVENT_SOURCE_NORMAL;
#if XSERVER_DTRACE #if XSERVER_DTRACE
if (XSERVER_INPUT_EVENT_ENABLED()) { if (XSERVER_INPUT_EVENT_ENABLED()) {
@ -1126,14 +1127,15 @@ GetKeyboardEvents(InternalEvent *events, DeviceIntPtr pDev, int type,
ms = GetTimeInMillis(); ms = GetTimeInMillis();
raw = &events->raw_event; if (source_type == EVENT_SOURCE_NORMAL) {
events++; raw = &events->raw_event;
num_events++; init_raw(pDev, raw, ms, type, key_code);
events++;
init_raw(pDev, raw, ms, type, key_code); num_events++;
}
event = &events->device_event; event = &events->device_event;
init_device_event(event, pDev, ms); init_device_event(event, pDev, ms, source_type);
event->detail.key = key_code; event->detail.key = key_code;
if (type == KeyPress) { if (type == KeyPress) {
@ -1468,7 +1470,7 @@ fill_pointer_events(InternalEvent *events, DeviceIntPtr pDev, int type,
} }
event = &events->device_event; event = &events->device_event;
init_device_event(event, pDev, ms); init_device_event(event, pDev, ms, EVENT_SOURCE_NORMAL);
if (type == MotionNotify) { if (type == MotionNotify) {
event->type = ET_Motion; event->type = ET_Motion;
@ -1804,7 +1806,7 @@ GetProximityEvents(InternalEvent *events, DeviceIntPtr pDev, int type,
UpdateFromMaster(events, pDev, DEVCHANGE_POINTER_EVENT, &num_events); UpdateFromMaster(events, pDev, DEVCHANGE_POINTER_EVENT, &num_events);
event = &events->device_event; event = &events->device_event;
init_device_event(event, pDev, GetTimeInMillis()); init_device_event(event, pDev, GetTimeInMillis(), EVENT_SOURCE_NORMAL);
event->type = (type == ProximityIn) ? ET_ProximityIn : ET_ProximityOut; event->type = (type == ProximityIn) ? ET_ProximityIn : ET_ProximityOut;
clipValuators(pDev, &mask); clipValuators(pDev, &mask);
@ -1939,7 +1941,7 @@ GetTouchEvents(InternalEvent *events, DeviceIntPtr dev, uint32_t ddx_touchid,
event = &events->device_event; event = &events->device_event;
num_events++; num_events++;
init_device_event(event, dev, ms); init_device_event(event, dev, ms, EVENT_SOURCE_NORMAL);
switch (type) { switch (type) {
case XI_TouchBegin: case XI_TouchBegin:
@ -2054,7 +2056,7 @@ GetDixTouchEnd(InternalEvent *ievent, DeviceIntPtr dev, TouchPointInfoPtr ti,
BUG_WARN(!dev->enabled); BUG_WARN(!dev->enabled);
init_device_event(event, dev, ms); init_device_event(event, dev, ms, EVENT_SOURCE_NORMAL);
event->sourceid = ti->sourceid; event->sourceid = ti->sourceid;
event->type = ET_TouchEnd; event->type = ET_TouchEnd;
@ -2098,7 +2100,7 @@ PostSyntheticMotion(DeviceIntPtr pDev,
#endif #endif
memset(&ev, 0, sizeof(DeviceEvent)); memset(&ev, 0, sizeof(DeviceEvent));
init_device_event(&ev, pDev, time); init_device_event(&ev, pDev, time, EVENT_SOURCE_NORMAL);
ev.root_x = x; ev.root_x = x;
ev.root_y = y; ev.root_y = y;
ev.type = ET_Motion; ev.type = ET_Motion;

View File

@ -727,7 +727,8 @@ verify_internal_event(const InternalEvent *ev)
* device. * device.
*/ */
void void
init_device_event(DeviceEvent *event, DeviceIntPtr dev, Time ms) init_device_event(DeviceEvent *event, DeviceIntPtr dev, Time ms,
enum DeviceEventSource source_type)
{ {
memset(event, 0, sizeof(DeviceEvent)); memset(event, 0, sizeof(DeviceEvent));
event->header = ET_Internal; event->header = ET_Internal;
@ -735,6 +736,7 @@ init_device_event(DeviceEvent *event, DeviceIntPtr dev, Time ms)
event->time = ms; event->time = ms;
event->deviceid = dev->id; event->deviceid = dev->id;
event->sourceid = dev->id; event->sourceid = dev->id;
event->source_type = source_type;
} }
int int

View File

@ -25,6 +25,7 @@
#ifndef EVENTSTR_H #ifndef EVENTSTR_H
#define EVENTSTR_H #define EVENTSTR_H
#include "inputstr.h"
#include <events.h> #include <events.h>
/** /**
* @file events.h * @file events.h
@ -77,6 +78,13 @@ enum EventType {
ET_Internal = 0xFF /* First byte */ ET_Internal = 0xFF /* First byte */
}; };
/**
* How a DeviceEvent was provoked
*/
enum DeviceEventSource {
EVENT_SOURCE_NORMAL = 0, /**< Default: from a user action (e.g. key press) */
};
/** /**
* Used for ALL input device events internal in the server until * Used for ALL input device events internal in the server until
* copied into the matching protocol event. * copied into the matching protocol event.
@ -124,6 +132,7 @@ struct _DeviceEvent {
int key_repeat; /**< Internally-generated key repeat event */ int key_repeat; /**< Internally-generated key repeat event */
uint32_t flags; /**< Flags to be copied into the generated event */ uint32_t flags; /**< Flags to be copied into the generated event */
uint32_t resource; /**< Touch event resource, only for TOUCH_REPLAYING */ uint32_t resource; /**< Touch event resource, only for TOUCH_REPLAYING */
enum DeviceEventSource source_type; /**< How this event was provoked */
}; };
/** /**

View File

@ -30,6 +30,7 @@
#define INPUTUTILS_H #define INPUTUTILS_H
#include "input.h" #include "input.h"
#include "eventstr.h"
#include <X11/extensions/XI2proto.h> #include <X11/extensions/XI2proto.h>
extern Mask event_filters[MAXDEVICES][MAXEVENTS]; extern Mask event_filters[MAXDEVICES][MAXEVENTS];
@ -43,7 +44,8 @@ struct _ValuatorMask {
}; };
extern void verify_internal_event(const InternalEvent *ev); extern void verify_internal_event(const InternalEvent *ev);
extern void init_device_event(DeviceEvent *event, DeviceIntPtr dev, Time ms); extern void init_device_event(DeviceEvent *event, DeviceIntPtr dev, Time ms,
enum DeviceEventSource event_source);
extern int event_get_corestate(DeviceIntPtr mouse, DeviceIntPtr kbd); extern int event_get_corestate(DeviceIntPtr mouse, DeviceIntPtr kbd);
extern void event_set_state(DeviceIntPtr mouse, DeviceIntPtr kbd, extern void event_set_state(DeviceIntPtr mouse, DeviceIntPtr kbd,
DeviceEvent *event); DeviceEvent *event);

View File

@ -126,7 +126,7 @@ AccessXKeyboardEvent(DeviceIntPtr keybd, int type, BYTE keyCode, Bool isRepeat)
{ {
DeviceEvent event; DeviceEvent event;
init_device_event(&event, keybd, GetTimeInMillis()); init_device_event(&event, keybd, GetTimeInMillis(), EVENT_SOURCE_NORMAL);
event.type = type; event.type = type;
event.detail.key = keyCode; event.detail.key = keyCode;
event.key_repeat = isRepeat; event.key_repeat = isRepeat;