From 871c1e17e527857cd86b5e517d9a18e5041f00fd Mon Sep 17 00:00:00 2001 From: Chase Douglas Date: Fri, 17 Dec 2010 17:13:27 +0000 Subject: [PATCH 1/4] Export all valuator_mask_* functions Input drivers may use valuator masks for internal state. Having all the valuator_mask_* functions available will help. Signed-off-by: Chase Douglas Reviewed-by: Daniel Stone Bump ABI_XINPUT_VERSION minor. Signed-off-by: Peter Hutterer --- hw/xfree86/common/xf86Module.h | 2 +- include/input.h | 8 +++++++- include/inpututils.h | 8 -------- 3 files changed, 8 insertions(+), 10 deletions(-) diff --git a/hw/xfree86/common/xf86Module.h b/hw/xfree86/common/xf86Module.h index af7b778da..609819b52 100644 --- a/hw/xfree86/common/xf86Module.h +++ b/hw/xfree86/common/xf86Module.h @@ -83,7 +83,7 @@ typedef enum { */ #define ABI_ANSIC_VERSION SET_ABI_VERSION(0, 4) #define ABI_VIDEODRV_VERSION SET_ABI_VERSION(9, 0) -#define ABI_XINPUT_VERSION SET_ABI_VERSION(12, 0) +#define ABI_XINPUT_VERSION SET_ABI_VERSION(12, 1) #define ABI_EXTENSION_VERSION SET_ABI_VERSION(5, 0) #define ABI_FONT_VERSION SET_ABI_VERSION(0, 6) diff --git a/include/input.h b/include/input.h index 8feac28f5..fef69a1fa 100644 --- a/include/input.h +++ b/include/input.h @@ -554,7 +554,6 @@ extern _X_HIDDEN void valuator_set_mode(DeviceIntPtr dev, int axis, int mode); xfixes/cursor.c uses it to determine if the cursor is enabled */ extern Bool EnableCursor; -/* For server-internal functions, see inpututil.h */ extern _X_EXPORT ValuatorMask *valuator_mask_new(int num_valuators); extern _X_EXPORT void valuator_mask_set_range(ValuatorMask *mask, int first_valuator, int num_valuators, @@ -563,5 +562,12 @@ extern _X_EXPORT void valuator_mask_set(ValuatorMask *mask, int valuator, int data); extern _X_EXPORT void valuator_mask_zero(ValuatorMask *mask); +extern _X_EXPORT int valuator_mask_size(const ValuatorMask *mask); +extern _X_EXPORT int valuator_mask_isset(const ValuatorMask *mask, int bit); +extern _X_EXPORT void valuator_mask_unset(ValuatorMask *mask, int bit); +extern _X_EXPORT int valuator_mask_num_valuators(const ValuatorMask *mask); +extern _X_EXPORT void valuator_mask_copy(ValuatorMask *dest, + const ValuatorMask *src); +extern _X_EXPORT int valuator_mask_get(const ValuatorMask *mask, int valnum); #endif /* INPUT_H */ diff --git a/include/inpututils.h b/include/inpututils.h index 54b5764a4..b8ca6abfc 100644 --- a/include/inpututils.h +++ b/include/inpututils.h @@ -37,12 +37,4 @@ struct _ValuatorMask { int valuators[MAX_VALUATORS]; /* valuator data */ }; -/* server-internal */ -extern _X_HIDDEN int valuator_mask_size(const ValuatorMask *mask); -extern _X_HIDDEN int valuator_mask_isset(const ValuatorMask *mask, int bit); -extern _X_HIDDEN void valuator_mask_unset(ValuatorMask *mask, int bit); -extern _X_HIDDEN int valuator_mask_num_valuators(const ValuatorMask *mask); -extern _X_HIDDEN void valuator_mask_copy(ValuatorMask *dest, const ValuatorMask *src); -extern _X_HIDDEN int valuator_mask_get(const ValuatorMask *mask, int valnum); - #endif From 4fbe67beb56e5600c1df789c08725c45b9bef0d4 Mon Sep 17 00:00:00 2001 From: Daniel Stone Date: Fri, 17 Dec 2010 17:13:26 +0000 Subject: [PATCH 2/4] Resources: Move rClient to resource.h The definition of rClient was duplicated across three source files, so move it to resource.h. Signed-off-by: Daniel Stone Signed-off-by: Peter Hutterer --- Xext/geext.c | 2 -- Xext/security.c | 2 -- dix/events.c | 2 -- include/resource.h | 2 ++ 4 files changed, 2 insertions(+), 6 deletions(-) diff --git a/Xext/geext.c b/Xext/geext.c index 8319c9291..b37c1a0bd 100644 --- a/Xext/geext.c +++ b/Xext/geext.c @@ -33,8 +33,6 @@ #include "geext.h" #include "protocol-versions.h" -#define rClient(obj) (clients[CLIENT_ID((obj)->resource)]) - DevPrivateKeyRec GEClientPrivateKeyRec; int RT_GECLIENT = 0; diff --git a/Xext/security.c b/Xext/security.c index 7eb95de74..8673880d1 100644 --- a/Xext/security.c +++ b/Xext/security.c @@ -154,8 +154,6 @@ SecurityLookupRequestName(ClientPtr client) } -#define rClient(obj) (clients[CLIENT_ID((obj)->resource)]) - /* SecurityDeleteAuthorization * * Arguments: diff --git a/dix/events.c b/dix/events.c index ac0792360..4e2dd89da 100644 --- a/dix/events.c +++ b/dix/events.c @@ -195,8 +195,6 @@ typedef const char *string; #define XE_KBPTR (xE->u.keyButtonPointer) -#define rClient(obj) (clients[CLIENT_ID((obj)->resource)]) - CallbackListPtr EventCallback; CallbackListPtr DeviceEventCallback; diff --git a/include/resource.h b/include/resource.h index 0c5a59dbc..080061f77 100644 --- a/include/resource.h +++ b/include/resource.h @@ -121,6 +121,8 @@ typedef unsigned long RESTYPE; #define BAD_RESOURCE 0xe0000000 +#define rClient(obj) (clients[CLIENT_ID((obj)->resource)]) + /* Resource state callback */ extern _X_EXPORT CallbackListPtr ResourceStateCallback; From 495e0142a77152c4cde5c88cdba4103ddc94df2c Mon Sep 17 00:00:00 2001 From: Chase Douglas Date: Fri, 17 Dec 2010 17:13:30 +0000 Subject: [PATCH 3/4] Make EventIsDeliverable non-static Will be used outside dix/events.c in proceeding XI 2.1 MT changes. Signed-off-by: Chase Douglas Reviewed-by: Daniel Stone Signed-off-by: Peter Hutterer --- dix/events.c | 13 +------------ include/input.h | 12 ++++++++++++ 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/dix/events.c b/dix/events.c index 4e2dd89da..f280f9d7a 100644 --- a/dix/events.c +++ b/dix/events.c @@ -2289,17 +2289,6 @@ FixUpEventFromWindow( } } -/** - * Return masks for EventIsDeliverable. - * @defgroup EventIsDeliverable return flags - * @{ - */ -#define XI_MASK (1 << 0) /**< XI mask set on window */ -#define CORE_MASK (1 << 1) /**< Core mask set on window */ -#define DONT_PROPAGATE_MASK (1 << 2) /**< DontPropagate mask set on window */ -#define XI2_MASK (1 << 3) /**< XI2 mask set on window */ -/* @} */ - /** * Check if a given event is deliverable at all on a given window. * @@ -2313,7 +2302,7 @@ FixUpEventFromWindow( * @return Bitmask of ::XI2_MASK, ::XI_MASK, ::CORE_MASK, and * ::DONT_PROPAGATE_MASK. */ -static int +int EventIsDeliverable(DeviceIntPtr dev, InternalEvent* event, WindowPtr win) { int rc = 0; diff --git a/include/input.h b/include/input.h index fef69a1fa..9f3227fb0 100644 --- a/include/input.h +++ b/include/input.h @@ -532,6 +532,18 @@ void FixUpEventFromWindow(DeviceIntPtr pDev, WindowPtr pWin, Window child, Bool calcChild); +extern int EventIsDeliverable(DeviceIntPtr dev, InternalEvent* event, + WindowPtr win); +/** + * Return masks for EventIsDeliverable. + * @defgroup EventIsDeliverable return flags + * @{ + */ +#define XI_MASK (1 << 0) /**< XI mask set on window */ +#define CORE_MASK (1 << 1) /**< Core mask set on window */ +#define DONT_PROPAGATE_MASK (1 << 2) /**< DontPropagate mask set on window */ +#define XI2_MASK (1 << 3) /**< XI2 mask set on window */ +/* @} */ /* Implemented by the DDX. */ extern _X_EXPORT int NewInputDeviceRequest( From b01dd9d33651999b0390bf8ed412b84f6929a13e Mon Sep 17 00:00:00 2001 From: Daniel Stone Date: Fri, 17 Dec 2010 17:13:34 +0000 Subject: [PATCH 4/4] Input: Set client error value for invalid mask bits When we send BadValue back to the client for having invalid mask bits, at least tell them what the (first) invalid bit was. Signed-off-by: Daniel Stone Signed-off-by: Peter Hutterer --- Xi/xigrabdev.c | 2 +- Xi/xipassivegrab.c | 2 +- Xi/xiselectev.c | 15 +++++++++++++-- include/exevents.h | 2 +- 4 files changed, 16 insertions(+), 5 deletions(-) diff --git a/Xi/xigrabdev.c b/Xi/xigrabdev.c index 24ededcb1..0adc8787d 100644 --- a/Xi/xigrabdev.c +++ b/Xi/xigrabdev.c @@ -79,7 +79,7 @@ ProcXIGrabDevice(ClientPtr client) if (!IsMaster(dev)) stuff->paired_device_mode = GrabModeAsync; - if (XICheckInvalidMaskBits((unsigned char*)&stuff[1], + if (XICheckInvalidMaskBits(client, (unsigned char*)&stuff[1], stuff->mask_len * 4) != Success) return BadValue; diff --git a/Xi/xipassivegrab.c b/Xi/xipassivegrab.c index 296614510..e99b6e554 100644 --- a/Xi/xipassivegrab.c +++ b/Xi/xipassivegrab.c @@ -118,7 +118,7 @@ ProcXIPassiveGrabDevice(ClientPtr client) return BadValue; } - if (XICheckInvalidMaskBits((unsigned char*)&stuff[1], + if (XICheckInvalidMaskBits(client, (unsigned char*)&stuff[1], stuff->mask_len * 4) != Success) return BadValue; diff --git a/Xi/xiselectev.c b/Xi/xiselectev.c index 7aa3f0ab6..22fbaf5e7 100644 --- a/Xi/xiselectev.c +++ b/Xi/xiselectev.c @@ -42,14 +42,19 @@ * * @return BadValue if at least one invalid bit is set or Success otherwise. */ -int XICheckInvalidMaskBits(unsigned char *mask, int len) +int XICheckInvalidMaskBits(ClientPtr client, unsigned char *mask, int len) { if (len >= XIMaskLen(XI2LASTEVENT)) { int i; for (i = XI2LASTEVENT + 1; i < len * 8; i++) + { if (BitIsOn(mask, i)) + { + client->errorValue = i; return BadValue; + } + } } return Success; @@ -126,7 +131,10 @@ ProcXISelectEvents(ClientPtr client) { unsigned char *bits = (unsigned char*)&evmask[1]; if (BitIsOn(bits, XI_HierarchyChanged)) + { + client->errorValue = XI_HierarchyChanged; return BadValue; + } } /* Raw events may only be selected on root windows */ @@ -138,10 +146,13 @@ ProcXISelectEvents(ClientPtr client) BitIsOn(bits, XI_RawButtonPress) || BitIsOn(bits, XI_RawButtonRelease) || BitIsOn(bits, XI_RawMotion)) + { + client->errorValue = XI_RawKeyPress; return BadValue; + } } - if (XICheckInvalidMaskBits((unsigned char*)&evmask[1], + if (XICheckInvalidMaskBits(client, (unsigned char*)&evmask[1], evmask->mask_len * 4) != Success) return BadValue; diff --git a/include/exevents.h b/include/exevents.h index bfee385d3..dc594304f 100644 --- a/include/exevents.h +++ b/include/exevents.h @@ -307,6 +307,6 @@ XISetEventMask(DeviceIntPtr dev, WindowPtr win, ClientPtr client, unsigned int len, unsigned char* mask); extern int -XICheckInvalidMaskBits(unsigned char *mask, int len); +XICheckInvalidMaskBits(ClientPtr client, unsigned char *mask, int len); #endif /* EXEVENTS_H */