summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlan Coopersmith <alan.coopersmith@oracle.com>2012-07-15 01:30:16 -0700
committerAlan Coopersmith <alan.coopersmith@oracle.com>2012-09-06 23:22:21 -0700
commit93c8c0a8813b1a3971cfe9c2712f4afb68d33a44 (patch)
tree08352d76fe79a61da30bead714d56ef5edf1d4bd
parent485fa790ca73929a397fe1e243a5f610c8f2c197 (diff)
Record atoms from InternAtom and GetAtomName requests
Uses them to display strings instead of just numeric ids for atoms beyond the builtin set in other requests, such as property lookups. Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
-rw-r--r--COPYING3
-rw-r--r--print11.c92
-rw-r--r--proto.h2
-rw-r--r--prtype.c35
-rw-r--r--table11.c53
5 files changed, 157 insertions, 28 deletions
diff --git a/COPYING b/COPYING
index 5990ff1..1b509fc 100644
--- a/COPYING
+++ b/COPYING
@@ -64,8 +64,9 @@ CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
------------------------------------------------------------
Copyright © 2000, 2001 Keith Packard, member of The XFree86 Project, Inc.
-Copyright (c) 2002, 2009, Oracle and/or its affiliates. All rights reserved.
Copyright © 2010 Intel Corporation
+Copyright (c) 2002, 2009, 2012, Oracle and/or its affiliates.
+All rights reserved.
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
diff --git a/print11.c b/print11.c
index 4bf74a4..a84de9e 100644
--- a/print11.c
+++ b/print11.c
@@ -25,7 +25,8 @@
*
*/
/*
- * Copyright (c) 2002, 2009, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 2009, 2012, Oracle and/or its affiliates.
+ * All rights reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
@@ -1250,6 +1251,65 @@ QueryTreeReply(const unsigned char *buf)
PrintList(&buf[32], (long) n, WINDOW, "children");
}
+/* Keep track of InternAtom & GetAtomName requests so we can add them to
+ our tables */
+struct atomic_req {
+ uint32_t seq;
+ uint32_t atom;
+ char *name;
+ struct atomic_req *next;
+};
+
+static struct atomic_req *pending_atom_reqs;
+
+static void
+start_atom_request(uint32_t atom, char *name)
+{
+ struct atomic_req *new_ar = malloc(sizeof(struct atomic_req));
+
+ if (new_ar) {
+ new_ar->seq = ILong(SBf);
+ new_ar->atom = atom;
+ new_ar->name = name;
+ new_ar->next = NULL;
+
+ if (pending_atom_reqs == NULL)
+ pending_atom_reqs = new_ar;
+ else {
+ struct atomic_req *ar;
+ for (ar = pending_atom_reqs; ar->next != NULL; ar = ar->next) {
+ /* find list tail */
+ }
+ ar->next = new_ar;
+ }
+ }
+}
+
+static void
+finish_atom_request(uint32_t seq, uint32_t atom, char *name)
+{
+ struct atomic_req *ar, *par, *next;
+
+ for (ar = pending_atom_reqs, par = NULL; ar != NULL; ar = next) {
+ next = ar->next;
+ if (ar->seq == seq) {
+ if (ar->atom == 0)
+ ar->atom = atom;
+ if (ar->name == NULL)
+ ar->name = name;
+ DefineAtom(ar->atom, ar->name);
+ free(ar->name); /* DefineAtom makes a copy if needed */
+ free(ar);
+ if (par == NULL)
+ pending_atom_reqs = next;
+ else
+ par->next = next;
+ }
+ else
+ par = ar;
+ }
+}
+
void
InternAtom(FD fd, const unsigned char *buf)
{
@@ -1267,22 +1327,39 @@ InternAtom(FD fd, const unsigned char *buf)
printfield(buf, 4, 2, DVALUE2(n), "length of name");
n = IShort(&buf[4]);
PrintString8(&buf[8], n, "name");
+
+ if (n > 0) {
+ char *name = malloc(n + 1);
+ if (name != NULL) {
+ memcpy(name, buf + 8, n);
+ name[n] = 0;
+ start_atom_request(0, name);
+ }
+ }
}
void
InternAtomReply(const unsigned char *buf)
{
+ uint32_t seq, atom;
+
PrintField(RBf, 0, 1, REPLY, REPLYHEADER); /* InternAtom */
if (Verbose < 1)
return;
printfield(buf, 2, 2, CARD16, "sequence number");
printfield(buf, 4, 4, CONST4(0), "reply length");
PrintField(buf, 8, 4, ATOM, "atom");
+
+ seq = IShort(&buf[2]);
+ atom = ILong(&buf[8]);
+ finish_atom_request(seq, atom, NULL);
}
void
GetAtomName(FD fd, const unsigned char *buf)
{
+ uint32_t atom;
+
/* Request GetAtomName is opcode 17 */
PrintField(buf, 0, 1, REQUEST, REQUESTHEADER); /* GetAtomName */
if (Verbose < 1)
@@ -1292,12 +1369,17 @@ GetAtomName(FD fd, const unsigned char *buf)
printreqlen(buf, fd, CONST2(2));
PrintField(buf, 4, 4, ATOM, "atom");
+
+ atom = ILong(&buf[4]);
+ start_atom_request(atom, NULL);
}
void
GetAtomNameReply(const unsigned char *buf)
{
short n;
+ uint32_t seq;
+ char *name;
PrintField(RBf, 0, 1, REPLY, REPLYHEADER); /* GetAtomName */
if (Verbose < 1)
@@ -1307,6 +1389,14 @@ GetAtomNameReply(const unsigned char *buf)
printfield(buf, 8, 2, DVALUE2(n), "length of name");
n = IShort(&buf[8]);
PrintString8(&buf[32], n, "name");
+
+ seq = IShort(&buf[2]);
+ name = malloc(n + 1);
+ if (name != NULL) {
+ memcpy(name, buf + 32, n);
+ name[n] = 0;
+ }
+ finish_atom_request(seq, 0, name);
}
void
diff --git a/proto.h b/proto.h
index 5232d59..14ab41e 100644
--- a/proto.h
+++ b/proto.h
@@ -297,3 +297,5 @@ extern void DefineEValue(TYPE type, long value, const char *name);
extern void DefineValues(TYPE type, long value, short length,
short ctype, const char *name);
extern long GetEValue(short typeid, const char *name);
+extern void DefineAtom(uint32_t atom, const char *name);
+extern const char *FindAtomName(uint32_t atom);
diff --git a/prtype.c b/prtype.c
index 8d4e06f..38b44c6 100644
--- a/prtype.c
+++ b/prtype.c
@@ -25,7 +25,7 @@
*
*/
/*
- * Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 2012, Oracle and/or its affiliates. All rights reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
@@ -456,37 +456,22 @@ PrintFONTABLE(const unsigned char *buf)
/* ************************************************************ */
-#define NumberofAtoms 68
-
-static const char *const AtomTable[NumberofAtoms + 1] = {
- "NONE", "PRIMARY", "SECONDARY", "ARC", "ATOM", "BITMAP", "CARDINAL",
- "COLORMAP", "CURSOR", "CUT_BUFFER0", "CUT_BUFFER1", "CUT_BUFFER2",
- "CUT_BUFFER3", "CUT_BUFFER4", "CUT_BUFFER5", "CUT_BUFFER6",
- "CUT_BUFFER7", "DRAWABLE", "FONT", "INTEGER", "PIXMAP", "POINT",
- "RECTANGLE", "RESOURCE_MANAGER", "RGB_COLOR_MAP", "RGB_BEST_MAP",
- "RGB_BLUE_MAP", "RGB_DEFAULT_MAP", "RGB_GRAY_MAP", "RGB_GREEN_MAP",
- "RGB_RED_MAP", "STRING", "VISUALID", "WINDOW", "WM_COMMAND",
- "WM_HINTS", "WM_CLIENT_MACHINE", "WM_ICON_NAME", "WM_ICON_SIZE",
- "WM_NAME", "WM_NORMAL_HINTS", "WM_SIZE_HINTS", "WM_ZOOM_HINTS",
- "MIN_SPACE", "NORM_SPACE", "MAX_SPACE", "END_SPACE", "SUPERSCRIPT_X",
- "SUPERSCRIPT_Y", "SUBSCRIPT_X", "SUBSCRIPT_Y", "UNDERLINE_POSITION",
- "UNDERLINE_THICKNESS", "STRIKEOUT_ASCENT", "STRIKEOUT_DESCENT",
- "ITALIC_ANGLE", "X_HEIGHT", "QUAD_WIDTH", "WEIGHT", "POINT_SIZE",
- "RESOLUTION", "COPYRIGHT", "NOTICE", "FONT_NAME", "FAMILY_NAME",
- "FULL_NAME", "CAP_HEIGHT", "WM_CLASS", "WM_TRANSIENT_FOR"
-};
-
-/* for atoms, we print the built-in atoms. We could expand to printing
- the user defined ones, too. */
+/* for atoms, we print the built-in atoms, as well as any user defined
+ ones we've captured during this session. */
int
PrintATOM(const unsigned char *buf)
{
/* print a ATOM -- CARD32 plus 0 = None */
long n = ILong(buf);
+ const char *name = FindAtomName(n);
- if (0 <= n && n <= NumberofAtoms)
- fprintf(stdout, "<%s>", AtomTable[n]);
+ if (name != NULL) {
+ if (Verbose > 1)
+ fprintf(stdout, "ATM %08lx <%s>", n, name);
+ else
+ fprintf(stdout, "<%s>", name);
+ }
else
fprintf(stdout, "ATM %08lx", n);
return (4);
diff --git a/table11.c b/table11.c
index 3463173..1bc1b95 100644
--- a/table11.c
+++ b/table11.c
@@ -25,7 +25,7 @@
*
*/
/*
- * Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 2012, Oracle and/or its affiliates. All rights reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
@@ -314,6 +314,57 @@ DefineValues(TYPE type, long value, short length, short ctype, const char *name)
/* ************************************************************ */
+/* Atoms are defined as a builtin type for the core protocol defined
+ atoms, with atoms passed via InternAtom & GetAtomName added as
+ additional enumerated type values */
+#define NumberofAtoms 68
+
+static const char *const AtomTable[NumberofAtoms + 1] = {
+ "NONE", "PRIMARY", "SECONDARY", "ARC", "ATOM", "BITMAP", "CARDINAL",
+ "COLORMAP", "CURSOR", "CUT_BUFFER0", "CUT_BUFFER1", "CUT_BUFFER2",
+ "CUT_BUFFER3", "CUT_BUFFER4", "CUT_BUFFER5", "CUT_BUFFER6",
+ "CUT_BUFFER7", "DRAWABLE", "FONT", "INTEGER", "PIXMAP", "POINT",
+ "RECTANGLE", "RESOURCE_MANAGER", "RGB_COLOR_MAP", "RGB_BEST_MAP",
+ "RGB_BLUE_MAP", "RGB_DEFAULT_MAP", "RGB_GRAY_MAP", "RGB_GREEN_MAP",
+ "RGB_RED_MAP", "STRING", "VISUALID", "WINDOW", "WM_COMMAND",
+ "WM_HINTS", "WM_CLIENT_MACHINE", "WM_ICON_NAME", "WM_ICON_SIZE",
+ "WM_NAME", "WM_NORMAL_HINTS", "WM_SIZE_HINTS", "WM_ZOOM_HINTS",
+ "MIN_SPACE", "NORM_SPACE", "MAX_SPACE", "END_SPACE", "SUPERSCRIPT_X",
+ "SUPERSCRIPT_Y", "SUBSCRIPT_X", "SUBSCRIPT_Y", "UNDERLINE_POSITION",
+ "UNDERLINE_THICKNESS", "STRIKEOUT_ASCENT", "STRIKEOUT_DESCENT",
+ "ITALIC_ANGLE", "X_HEIGHT", "QUAD_WIDTH", "WEIGHT", "POINT_SIZE",
+ "RESOLUTION", "COPYRIGHT", "NOTICE", "FONT_NAME", "FAMILY_NAME",
+ "FULL_NAME", "CAP_HEIGHT", "WM_CLASS", "WM_TRANSIENT_FOR"
+};
+
+const char *
+FindAtomName(uint32_t atom)
+{
+ struct ValueListEntry *p;
+
+ if (atom <= NumberofAtoms)
+ return AtomTable[atom];
+
+ for (p = TD[ATOM].ValueList; p != NULL; p = p->Next) {
+ if (p->Value == atom)
+ return p->Name;
+ }
+
+ return NULL;
+}
+
+void
+DefineAtom(uint32_t atom, const char *name)
+{
+ if ((atom == 0) || (name == NULL))
+ return;
+
+ if (FindAtomName(atom) == NULL)
+ DefineEValue(&TD[ATOM], atom, strdup(name));
+}
+
+
+/* ************************************************************ */
static void
InitBuiltInTypes(void)