summaryrefslogtreecommitdiff
path: root/decode11.c
diff options
context:
space:
mode:
authorKeith Packard <keithp@keithp.com>2001-06-08 00:32:52 +0000
committerAlan Coopersmith <alan.coopersmith@sun.com>2009-05-04 18:13:07 -0700
commit062412a066cc62635c1d1eb99999ee774775ca6f (patch)
tree3a72f748e101900c292cf242055862ecce4bccb7 /decode11.c
parent306057f2475b216fb73686bcb0003355cf88944a (diff)
downloadxscope-062412a066cc62635c1d1eb99999ee774775ca6f.tar.gz
Import xscope bits into keithp.com CVS
Diffstat (limited to 'decode11.c')
-rw-r--r--decode11.c603
1 files changed, 369 insertions, 234 deletions
diff --git a/decode11.c b/decode11.c
index eb2a12f..9f51214 100644
--- a/decode11.c
+++ b/decode11.c
@@ -26,7 +26,7 @@
* ************************************************************ */
#include "scope.h"
-#include "x11.h"
+#include "x11.h"
/*
There are 4 types of things in X11: requests, replies, errors, and events.
@@ -63,6 +63,7 @@ struct QueueEntry
struct QueueEntry *Next;
long SequenceNumber;
short Request;
+ short RequestMinor;
};
/* free space list of Q entries */
@@ -70,9 +71,10 @@ struct QueueEntry
static struct QueueEntry *FreeQEntries = NULL;
/* ************************************************************ */
-struct QueueEntry *NewQEntry (SequenceNumber, Request)
+struct QueueEntry *NewQEntry (SequenceNumber, Request, RequestMinor)
long SequenceNumber;
short Request;
+ short RequestMinor;
{
struct QueueEntry *p;
@@ -93,6 +95,7 @@ struct QueueEntry *NewQEntry (SequenceNumber, Request)
p->Next = NULL;
p->SequenceNumber = SequenceNumber;
p->Request = Request;
+ p->RequestMinor = RequestMinor;
return(p);
}
/* ************************************************************ */
@@ -129,12 +132,12 @@ FD fd;
for (p = ReplyQ[fd].Head; p != NULL; p = NextQEntry)
{
NextQEntry = p->Next;
-
+
/* put freed entry on list of free entries (for later reuse) */
p->Next = FreeQEntries;
FreeQEntries = p;
}
-
+
ReplyQ[fd].Head = NULL;
ReplyQ[fd].Tail = NULL;
}
@@ -143,7 +146,7 @@ FD fd;
DumpReplyQ(fd)
FD fd;
{
- fprintf(stderr, "ReplyQ[%d] = { Head 0x%x; Tail 0x%x }\n",
+ fprintf(stderr, "ReplyQ[%d] = { Head 0x%x; Tail 0x%x }\n",
fd, ReplyQ[fd].Head, ReplyQ[fd].Tail);
{
struct QueueEntry *p;
@@ -160,17 +163,17 @@ DumpReplyQ(fd)
/* A reply is expected to the type of request given for the fd associated
with this one */
-SequencedReplyExpected(fd, SequenceNumber, RequestType)
+SequencedReplyExpected(fd, SequenceNumber, RequestType, RequestMinorType)
FD fd;
long SequenceNumber;
short RequestType;
{
struct QueueEntry *p;
- debug(8,(stderr, "Reply expected: sequence %d and request type %d for fd %d\n",
- SequenceNumber, RequestType, fd));
+ debug(8,(stderr, "Reply expected: sequence %d and request type %d,%d for fd %d\n",
+ SequenceNumber, RequestType, RequestMinorType, fd));
/* create a new queue entry */
- p = NewQEntry(SequenceNumber, RequestType);
+ p = NewQEntry(SequenceNumber, RequestType, RequestMinorType);
/* find the server associated with this client */
fd = FDPair(fd);
@@ -183,45 +186,23 @@ SequencedReplyExpected(fd, SequenceNumber, RequestType)
ReplyQ[fd].Head = p;
ReplyQ[fd].Tail = p;
- debug(8,(stderr, "Save sequence %d and request type %d for fd %d\n",
- p->SequenceNumber, p->Request, fd));
-}
-
-
-/* search for the type of request that is associated with a reply
- to the given sequence number for this fd */
-
-short CheckReplyTable (fd, SequenceNumber)
- FD fd;
- short SequenceNumber;
-{
- struct QueueEntry *p;
-
- if (debuglevel & 128) DumpReplyQ(fd);
- for (p = ReplyQ[fd].Head;
- p != NULL;
- p = p->Next)
- {
- /* look for matching sequence number in queue of this fd */
- if (SequenceNumber == ((short)(0xFFFF & p->SequenceNumber)))
- {
- return(p->Request);
- }
- }
-
- /* not expecting a reply for that sequence number */
- return(0);
+ debug(8,(stderr, "Save sequence %d and request type %d,%d for fd %d\n",
+ p->SequenceNumber, p->Request, p->RequestMinor, fd));
}
static FD Lastfd;
static long LastSequenceNumber;
static short LastReplyType;
+static short LastReplyMinorType;
+/* search for the type of request that is associated with a reply
+ to the given sequence number for this fd */
-short ExtractReplyTable (fd, SequenceNumber)
+short CheckReplyTable (fd, SequenceNumber, minorp)
FD fd;
short SequenceNumber;
+ short *minorp;
{
struct QueueEntry *p;
struct QueueEntry *trailer;
@@ -238,6 +219,7 @@ short ExtractReplyTable (fd, SequenceNumber)
Lastfd = fd;
LastSequenceNumber = p->SequenceNumber;
LastReplyType = p->Request;
+ LastReplyMinorType = p->RequestMinor;
/* pull the queue entry out of the queue for this fd */
if (trailer == NULL)
@@ -251,8 +233,9 @@ short ExtractReplyTable (fd, SequenceNumber)
p->Next = FreeQEntries;
FreeQEntries = p;
- debug(8,(stderr, "Reply on fd %d for sequence %d is type %d\n",
- fd, SequenceNumber, LastReplyType));
+ debug(8,(stderr, "Reply on fd %d for sequence %d is type %d,%x\n",
+ fd, SequenceNumber, LastReplyType, LastReplyMinorType));
+ *minorp = LastReplyMinorType;
return(LastReplyType);
}
}
@@ -272,7 +255,15 @@ ReplyExpected(fd, Request)
FD fd;
short Request;
{
- SequencedReplyExpected(fd, CS[fd].SequenceNumber, Request);
+ SequencedReplyExpected(fd, CS[fd].SequenceNumber, Request, 0);
+}
+
+ExtendedReplyExpected (fd, Request, RequestMinor)
+ FD fd;
+ short Request;
+ short RequestMinor;
+{
+ SequencedReplyExpected(fd, CS[fd].SequenceNumber, Request, RequestMinor);
}
/* ************************************************************ */
@@ -281,14 +272,58 @@ ReplyExpected(fd, Request)
KeepLastReplyExpected()
{
- SequencedReplyExpected(Lastfd, LastSequenceNumber, LastReplyType);
+ SequencedReplyExpected(Lastfd, LastSequenceNumber, LastReplyType,
+ LastReplyMinorType);
}
+#define DUMP_REQUEST 0
+#define DUMP_REPLY 1
+#define DUMP_EVENT 2
+#define DUMP_ERROR 3
+
+static char *simple_names[] = {
+ "REQUEST",
+ "REPLY ",
+ "EVENT ",
+ "ERROR ",
+};
+
+SimpleDump (type, fd, Major, Minor, bytes)
+{
+ PrintTime ();
+ fprintf (stdout, "@@%s %3d %3d %3d %7d\n",
+ simple_names[type],
+ ClientNumber(fd),
+ Major, Minor, bytes);
+}
+
/* ************************************************************ */
/* */
/* */
/* ************************************************************ */
+#ifdef PEX
+extern unsigned char LookForPEXFlag;
+extern unsigned char PEXCode;
+#endif
+
+extern unsigned char LookForLBXFlag;
+extern unsigned char LBXRequest;
+extern unsigned char LBXError;
+extern unsigned char LBXEvent;
+
+extern unsigned char LookForWCPFlag;
+extern unsigned char WCPRequest;
+extern unsigned char WCPError;
+
+extern unsigned char LookForRENDERFlag;
+extern unsigned char RENDERRequest;
+extern unsigned char RENDERError;
+#define RENDERNError 5
+
+extern unsigned char LookForRANDRFlag;
+extern unsigned char RANDRRequest;
+extern unsigned char RANDREvent;
DecodeRequest(fd, buf, n)
FD fd;
@@ -296,18 +331,53 @@ DecodeRequest(fd, buf, n)
long n;
{
short Request = IByte (&buf[0]);
+ short RequestMinor = Request >= 128 ? IByte (&buf[1]) : 0;
+ unsigned long seq;
+
CS[fd].SequenceNumber += 1;
- bcopy ((char *)&(CS[fd].SequenceNumber), (char *)SBf, sizeof(long));
+ seq = CS[fd].SequenceNumber;
+ if (CS[fd].littleEndian) {
+ SBf[0] = seq;
+ SBf[1] = seq >> 8;
+ SBf[2] = seq >> 16;
+ SBf[3] = seq >> 24;
+ } else {
+ SBf[0] = seq >> 24;
+ SBf[1] = seq >> 16;
+ SBf[2] = seq >> 8;
+ SBf[3] = seq;
+ }
SetIndentLevel(PRINTCLIENT);
+ if (Verbose < 0)
+ {
+ SimpleDump (DUMP_REQUEST, fd, Request, RequestMinor, n);
+ return;
+ }
+
if (Verbose > 3)
DumpItem("Request", fd, buf, n);
- if (Request <= 0 || 127 < Request)
+ if (Request < 0 || 127 < Request) {
+#ifdef PEX
+ if (Request == PEXCode) {
+ pex_decode_req(fd, buf);
+ } else
+#endif
+ if (Request == LBXRequest) {
+ lbx_decode_req(fd, buf);
+ } else
+ if (Request == WCPRequest) {
+ wcp_decode_req(fd, buf);
+ } else if (Request == RENDERRequest) {
+ render_decode_req(fd,buf);
+ } else if (Request == RANDRRequest) {
+ randr_decode_req(fd,buf);
+ } else
{
- warn("Extended request opcode");
- fprintf(stdout, "Extended request opcode: %d\n", Request);
+ ExtendedRequest(buf);
+ ReplyExpected(fd, Request);
}
- else switch (Request)
+ } else switch (Request)
{
case 1:
CreateWindow(buf);
@@ -631,6 +701,25 @@ DecodeRequest(fd, buf, n)
break;
case 98:
QueryExtension(buf);
+
+#ifdef PEX
+ /* PEX content */
+ if (strncmp("X3D-PEX",(char *)&buf[8],7) == 0)
+ LookForPEXFlag=1;
+#endif
+
+ if (strncmp("LBX",(char *)&buf[8],3) == 0)
+ LookForLBXFlag=1;
+
+ if (strncmp("NCD-WinCenterPro",(char *)&buf[8],16) == 0)
+ LookForWCPFlag=1;
+
+ if (strncmp("RENDER",(char *)&buf[8],6) == 0)
+ LookForRENDERFlag=1;
+
+ if (strncmp("RANDR",(char *)&buf[8],6) == 0)
+ LookForRANDRFlag=1;
+
ReplyExpected(fd, Request);
break;
case 99:
@@ -726,24 +815,41 @@ DecodeReply(fd, buf, n)
long n;
{
short SequenceNumber = IShort (&buf[2]);
- short Request = ExtractReplyTable (fd, SequenceNumber);
- if (Request == 0)
- {
- warn("Unexpected reply");
- fprintf(stdout, "Unexpected reply: %d\n", SequenceNumber);
- return;
- }
+ short RequestMinor;
+ short Request = CheckReplyTable (fd, SequenceNumber, &RequestMinor);
+
+ if (Verbose < 0)
+ {
+ SimpleDump (DUMP_REPLY, fd, Request, RequestMinor, n);
+ return;
+ }
+
SetIndentLevel(PRINTSERVER);
RBf[0] = Request /* for the PrintField in the Reply procedure */ ;
+ RBf[1] = RequestMinor;
if (Verbose > 3)
DumpItem("Reply", fd, buf, n);
- if (Request <= 0 || 127 < Request)
- {
- warn("Extended reply opcode");
- fprintf(stdout, "Extended reply opcode: %d\n", Request);
- }
+#ifdef PEX
+ if (Request == PEXCode)
+ pex_decode_reply(fd, buf);
+ else
+#endif
+ if (Request == LBXRequest)
+ lbx_decode_reply(fd, buf, RequestMinor);
+ else
+ if (Request == WCPRequest)
+ wcp_decode_reply(fd, buf, RequestMinor);
+ else if (Request == RENDERRequest)
+ render_decode_reply(fd, buf, RequestMinor);
+ else if (Request == RANDRRequest)
+ randr_decode_reply(fd, buf, RequestMinor);
+ else if (Request < 0 || 127 < Request)
+ warn("Extended reply opcode");
else switch (Request)
{
+ case 0:
+ UnknownReply(buf);
+ break;
case 3:
GetWindowAttributesReply(buf);
break;
@@ -880,69 +986,86 @@ DecodeError(fd, buf, n)
unsigned char *buf;
long n;
{
- short Error = IByte (&buf[1]);
- SetIndentLevel(PRINTSERVER);
- if (Verbose > 3)
- DumpItem("Error", fd, buf, n);
- (void)ExtractReplyTable (fd, (short)IShort(&buf[2]));
- if (Error < 1 || Error > 17)
- warn("Extended Error code");
- else switch (Error)
+ short Error = IByte (&buf[1]);
+ short Request = 0;
+ short RequestMinor = 0;
+
+ Request = CheckReplyTable (fd, (short)IShort(&buf[2]), &RequestMinor);
+
+ if (Verbose < 0)
{
- case 1:
- RequestError(buf);
- break;
- case 2:
- ValueError(buf);
- break;
- case 3:
- WindowError(buf);
- break;
- case 4:
- PixmapError(buf);
- break;
- case 5:
- AtomError(buf);
- break;
- case 6:
- CursorError(buf);
- break;
- case 7:
- FontError(buf);
- break;
- case 8:
- MatchError(buf);
- break;
- case 9:
- DrawableError(buf);
- break;
- case 10:
- AccessError(buf);
- break;
- case 11:
- AllocError(buf);
- break;
- case 12:
- ColormapError(buf);
- break;
- case 13:
- GContextError(buf);
- break;
- case 14:
- IDChoiceError(buf);
- break;
- case 15:
- NameError(buf);
- break;
- case 16:
- LengthError(buf);
- break;
- case 17:
- ImplementationError(buf);
- break;
- default:
- warn("Unimplemented error code");
- break;
+ SimpleDump (DUMP_ERROR, fd, Request, RequestMinor, n);
+ return;
+ }
+
+ SetIndentLevel(PRINTSERVER);
+ if (Verbose > 3)
+ DumpItem("Error", fd, buf, n);
+
+ if (Error == LBXError)
+ lbx_decode_error(fd, buf);
+ else if (Error == WCPError)
+ wcp_decode_error(fd, buf);
+ else if (Error >= RENDERError && Error < RENDERError + RENDERNError)
+ render_decode_error(fd,buf);
+ else if (Error < 1 || Error > 17)
+ warn("Extended Error code");
+ else switch (Error)
+ {
+ case 1:
+ RequestError(buf);
+ break;
+ case 2:
+ ValueError(buf);
+ break;
+ case 3:
+ WindowError(buf);
+ break;
+ case 4:
+ PixmapError(buf);
+ break;
+ case 5:
+ AtomError(buf);
+ break;
+ case 6:
+ CursorError(buf);
+ break;
+ case 7:
+ FontError(buf);
+ break;
+ case 8:
+ MatchError(buf);
+ break;
+ case 9:
+ DrawableError(buf);
+ break;
+ case 10:
+ AccessError(buf);
+ break;
+ case 11:
+ AllocError(buf);
+ break;
+ case 12:
+ ColormapError(buf);
+ break;
+ case 13:
+ GContextError(buf);
+ break;
+ case 14:
+ IDChoiceError(buf);
+ break;
+ case 15:
+ NameError(buf);
+ break;
+ case 16:
+ LengthError(buf);
+ break;
+ case 17:
+ ImplementationError(buf);
+ break;
+ default:
+ warn("Unimplemented error code");
+ break;
}
}
@@ -956,121 +1079,133 @@ DecodeEvent(fd, buf, n)
unsigned char *buf;
long n;
{
- short Event = IByte (&buf[0]);
- SetIndentLevel(PRINTSERVER);
- if (Verbose > 3)
- DumpItem("Event", fd, buf, n);
- /* high-order bit means SendEvent generated */
- if (Event & 0x80)
+ short Event = IByte (&buf[0]);
+ short EventMinor = Event == LBXEvent ? IByte (&buf[1]) : 0;
+
+ if (Verbose < 0)
{
- debug(8,(stderr, "SendEvent generated event 0x%x\n", Event));
- Event = Event & 0x7F;
+ SimpleDump (DUMP_EVENT, fd, Event, EventMinor, n);
+ return;
}
- if (Event < 2 || Event > 34)
- warn("Extended Event code");
- else switch (Event)
+
+ SetIndentLevel(PRINTSERVER);
+ if (Verbose > 3)
+ DumpItem("Event", fd, buf, n);
+ /* high-order bit means SendEvent generated */
+ if (Event & 0x80)
{
- case 2:
- KeyPressEvent(buf);
- break;
- case 3:
- KeyReleaseEvent(buf);
- break;
- case 4:
- ButtonPressEvent(buf);
- break;
- case 5:
- ButtonReleaseEvent(buf);
- break;
- case 6:
- MotionNotifyEvent(buf);
- break;
- case 7:
- EnterNotifyEvent(buf);
- break;
- case 8:
- LeaveNotifyEvent(buf);
- break;
- case 9:
- FocusInEvent(buf);
- break;
- case 10:
- FocusOutEvent(buf);
- break;
- case 11:
- KeymapNotifyEvent(buf);
- break;
- case 12:
- ExposeEvent(buf);
- break;
- case 13:
- GraphicsExposureEvent(buf);
- break;
- case 14:
- NoExposureEvent(buf);
- break;
- case 15:
- VisibilityNotifyEvent(buf);
- break;
- case 16:
- CreateNotifyEvent(buf);
- break;
- case 17:
- DestroyNotifyEvent(buf);
- break;
- case 18:
- UnmapNotifyEvent(buf);
- break;
- case 19:
- MapNotifyEvent(buf);
- break;
- case 20:
- MapRequestEvent(buf);
- break;
- case 21:
- ReparentNotifyEvent(buf);
- break;
- case 22:
- ConfigureNotifyEvent(buf);
- break;
- case 23:
- ConfigureRequestEvent(buf);
- break;
- case 24:
- GravityNotifyEvent(buf);
- break;
- case 25:
- ResizeRequestEvent(buf);
- break;
- case 26:
- CirculateNotifyEvent(buf);
- break;
- case 27:
- CirculateRequestEvent(buf);
- break;
- case 28:
- PropertyNotifyEvent(buf);
- break;
- case 29:
- SelectionClearEvent(buf);
- break;
- case 30:
- SelectionRequestEvent(buf);
- break;
- case 31:
- SelectionNotifyEvent(buf);
- break;
- case 32:
- ColormapNotifyEvent(buf);
- break;
- case 33:
- ClientMessageEvent(buf);
- break;
- case 34:
- MappingNotifyEvent(buf);
- break;
- default:
- warn("Unimplemented event code");
- break;
+ debug(8,(stderr, "SendEvent generated event 0x%x\n", Event));
+ Event = Event & 0x7F;
+ }
+ if (Event == LBXEvent)
+ lbx_decode_event (fd, buf);
+ else if (Event == RANDREvent)
+ randr_decode_event (fd, buf);
+ else if (Event < 2 || Event > 34)
+ warn("Extended Event code");
+ else switch (Event)
+ {
+ case 2:
+ KeyPressEvent(buf);
+ break;
+ case 3:
+ KeyReleaseEvent(buf);
+ break;
+ case 4:
+ ButtonPressEvent(buf);
+ break;
+ case 5:
+ ButtonReleaseEvent(buf);
+ break;
+ case 6:
+ MotionNotifyEvent(buf);
+ break;
+ case 7:
+ EnterNotifyEvent(buf);
+ break;
+ case 8:
+ LeaveNotifyEvent(buf);
+ break;
+ case 9:
+ FocusInEvent(buf);
+ break;
+ case 10:
+ FocusOutEvent(buf);
+ break;
+ case 11:
+ KeymapNotifyEvent(buf);
+ break;
+ case 12:
+ ExposeEvent(buf);
+ break;
+ case 13:
+ GraphicsExposureEvent(buf);
+ break;
+ case 14:
+ NoExposureEvent(buf);
+ break;
+ case 15:
+ VisibilityNotifyEvent(buf);
+ break;
+ case 16:
+ CreateNotifyEvent(buf);
+ break;
+ case 17:
+ DestroyNotifyEvent(buf);
+ break;
+ case 18:
+ UnmapNotifyEvent(buf);
+ break;
+ case 19:
+ MapNotifyEvent(buf);
+ break;
+ case 20:
+ MapRequestEvent(buf);
+ break;
+ case 21:
+ ReparentNotifyEvent(buf);
+ break;
+ case 22:
+ ConfigureNotifyEvent(buf);
+ break;
+ case 23:
+ ConfigureRequestEvent(buf);
+ break;
+ case 24:
+ GravityNotifyEvent(buf);
+ break;
+ case 25:
+ ResizeRequestEvent(buf);
+ break;
+ case 26:
+ CirculateNotifyEvent(buf);
+ break;
+ case 27:
+ CirculateRequestEvent(buf);
+ break;
+ case 28:
+ PropertyNotifyEvent(buf);
+ break;
+ case 29:
+ SelectionClearEvent(buf);
+ break;
+ case 30:
+ SelectionRequestEvent(buf);
+ break;
+ case 31:
+ SelectionNotifyEvent(buf);
+ break;
+ case 32:
+ ColormapNotifyEvent(buf);
+ break;
+ case 33:
+ ClientMessageEvent(buf);
+ break;
+ case 34:
+ MappingNotifyEvent(buf);
+ break;
+ default:
+ warn("Unimplemented event code");
+ break;
}
}