summaryrefslogtreecommitdiff
path: root/extensions.c
diff options
context:
space:
mode:
authorAlan Coopersmith <alan.coopersmith@sun.com>2009-08-12 16:40:09 -0700
committerAlan Coopersmith <alan.coopersmith@sun.com>2009-08-12 16:50:41 -0700
commitb90bb97a5b8686ba050835724c6b299a0cfb0305 (patch)
tree81d76426bb76ba03565a4b45ed537ed84834dd85 /extensions.c
parentf65c809fb7c269c2bf450274f424feab85ea95cb (diff)
downloadxscope-b90bb97a5b8686ba050835724c6b299a0cfb0305.tar.gz
Add GenericEvent support
Allows extensions to register their own decoders for GenericEvents, though none do, since XInput isn't decoded yet Signed-off-by: Alan Coopersmith <alan.coopersmith@sun.com>
Diffstat (limited to 'extensions.c')
-rw-r--r--extensions.c28
1 files changed, 28 insertions, 0 deletions
diff --git a/extensions.c b/extensions.c
index bacc47e..b374b67 100644
--- a/extensions.c
+++ b/extensions.c
@@ -85,6 +85,9 @@ DefineExtNameValue(int type, unsigned char value, const char *extname)
case ERROR:
typename = "-Error";
break;
+ case EXTENSION:
+ typename = "";
+ break;
default:
panic("Impossible argument to DefineExtNameValue");
}
@@ -142,6 +145,8 @@ ProcessQueryExtensionReply(long seq, const unsigned char *buf)
ext_by_request[qe->request - EXTENSION_MIN_REQ] = qe;
+ DefineExtNameValue(EXTENSION, qe->request, qe->name);
+
for (i = 0; decodable_extensions[i].name != NULL ; i++) {
if (strcmp(qe->name, decodable_extensions[i].name) == 0) {
decodable_extensions[i].init_func(buf);
@@ -171,6 +176,7 @@ static extension_decode_req_ptr ExtensionRequestDecoder[NUM_EXTENSIONS];
static extension_decode_reply_ptr ExtensionReplyDecoder[NUM_EXTENSIONS];
static extension_decode_error_ptr ExtensionErrorDecoder[NUM_EXTENSIONS];
static extension_decode_event_ptr ExtensionEventDecoder[NUM_EXT_EVENTS];
+static extension_decode_event_ptr GenericEventDecoder[NUM_EXTENSIONS];
void
InitializeExtensionDecoder (int Request, extension_decode_req_ptr reqd,
@@ -216,6 +222,21 @@ InitializeExtensionEventDecoder(int Event, extension_decode_event_ptr evd)
ExtensionEventDecoder[Event - EXTENSION_MIN_EV] = evd;
}
+
+void
+InitializeGenericEventDecoder(int Request, extension_decode_event_ptr evd)
+{
+ if ((Request > EXTENSION_MAX_REQ) || (Request < EXTENSION_MIN_REQ)) {
+ char errmsg[128];
+
+ snprintf(errmsg, sizeof(errmsg), "Failed to register decoder"
+ " for invalid generic extension event code %d.", Request);
+ warn(errmsg);
+ return;
+ }
+ GenericEventDecoder[Request - EXTENSION_MIN_REQ] = evd;
+}
+
void
ExtensionRequest (FD fd, const unsigned char *buf, short Request)
{
@@ -273,10 +294,17 @@ ExtensionEvent (FD fd, const unsigned char *buf, short Event)
if ((Event <= EXTENSION_MAX_EV) && (Event >= EXTENSION_MIN_EV)) {
decode_event = ExtensionEventDecoder[Event - EXTENSION_MIN_EV];
+ } else if (Event == Event_Type_Generic) {
+ int Request = IByte (&buf[1]);
+ if ((Request <= EXTENSION_MAX_REQ) && (Request >= EXTENSION_MIN_REQ)) {
+ decode_event = GenericEventDecoder[Request - EXTENSION_MIN_REQ];
+ }
}
if (decode_event != NULL) {
decode_event(fd, buf);
+ } else if (Event == Event_Type_Generic) {
+ UnknownGenericEvent(buf);
} else {
UnknownEvent(buf);
}