From 062412a066cc62635c1d1eb99999ee774775ca6f Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Fri, 8 Jun 2001 00:32:52 +0000 Subject: Import xscope bits into keithp.com CVS --- decode11.c | 603 +++++++++++++++++++++++++++++++++++++------------------------ 1 file changed, 369 insertions(+), 234 deletions(-) (limited to 'decode11.c') 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; } } -- cgit v1.2.1