From e598c34e7de66b72c59e96a637135e5a485f0067 Mon Sep 17 00:00:00 2001 From: David Reveman Date: Sat, 2 Aug 2008 10:29:40 -0400 Subject: [PATCH] Add atom tables. --- hw/dmx/dmx.h | 5 +++ hw/dmx/dmxatom.c | 80 ++++++++++++++++++++++++++++++++++++++++++------ hw/dmx/dmxinit.c | 11 +++++++ 3 files changed, 86 insertions(+), 10 deletions(-) diff --git a/hw/dmx/dmx.h b/hw/dmx/dmx.h index d6f5c65e5..c347f2872 100644 --- a/hw/dmx/dmx.h +++ b/hw/dmx/dmx.h @@ -126,6 +126,11 @@ typedef struct _DMXScreenInfo { xcb_connection_t *connection; xcb_get_input_focus_cookie_t sync; + Atom *atomTable; + int atomTableSize; + Atom *beAtomTable; + int beAtomTableSize; + Display *beDisplay; /**< Back-end X server's display */ int beWidth; /**< Width of BE display */ int beHeight; /**< Height of BE display */ diff --git a/hw/dmx/dmxatom.c b/hw/dmx/dmxatom.c index 1eee7fad4..94bc81c26 100644 --- a/hw/dmx/dmxatom.c +++ b/hw/dmx/dmxatom.c @@ -33,24 +33,84 @@ Atom dmxAtom (DMXScreenInfo *dmxScreen, Atom beAtom) { - char *name; + Atom atom = None; - name = XGetAtomName (dmxScreen->beDisplay, beAtom); - if (!name) - return None; + if (beAtom < dmxScreen->beAtomTableSize) + atom = dmxScreen->beAtomTable[beAtom]; - return MakeAtom (name, strlen (name), TRUE); + if (!atom) + { + char *name; + + name = XGetAtomName (dmxScreen->beDisplay, beAtom); + if (!name) + return None; + + atom = MakeAtom (name, strlen (name), TRUE); + if (!atom) + return None; + + if (beAtom >= dmxScreen->beAtomTableSize) + { + Atom *table; + int i; + + table = xrealloc (dmxScreen->beAtomTable, + sizeof (Atom) * (beAtom + 1)); + if (!table) + return atom; + + for (i = dmxScreen->beAtomTableSize; i < beAtom; i++) + table[i] = None; + + dmxScreen->beAtomTable = table; + dmxScreen->beAtomTableSize = beAtom + 1; + } + + dmxScreen->beAtomTable[beAtom] = atom; + } + + return atom; } Atom dmxBEAtom (DMXScreenInfo *dmxScreen, Atom atom) { - char *name; + Atom beAtom = None; - name = NameForAtom (atom); - if (!name) - return None; + if (atom < dmxScreen->atomTableSize) + beAtom = dmxScreen->atomTable[atom]; - return XInternAtom (dmxScreen->beDisplay, name, FALSE); + if (!beAtom) + { + char *name; + + name = NameForAtom (atom); + if (!name) + return None; + + beAtom = XInternAtom (dmxScreen->beDisplay, name, FALSE); + + if (atom >= dmxScreen->beAtomTableSize) + { + Atom *table; + int i; + + table = xrealloc (dmxScreen->atomTable, + sizeof (Atom) * (atom + 1)); + if (!table) + return beAtom; + + for (i = dmxScreen->atomTableSize; i < atom; i++) + table[i] = None; + + dmxScreen->atomTable = table; + dmxScreen->atomTableSize = atom + 1; + } + + dmxScreen->beAtomTable[atom] = beAtom; + } + + return beAtom; } diff --git a/hw/dmx/dmxinit.c b/hw/dmx/dmxinit.c index 9a5caf3ef..d95c6857a 100644 --- a/hw/dmx/dmxinit.c +++ b/hw/dmx/dmxinit.c @@ -305,6 +305,12 @@ Bool dmxOpenDisplay(DMXScreenInfo *dmxScreen) AddEnabledDevice (dmxScreen->fd); + dmxScreen->atomTable = NULL; + dmxScreen->atomTableSize = 0; + + dmxScreen->beAtomTable = NULL; + dmxScreen->beAtomTableSize = 0; + dmxPropertyDisplay(dmxScreen); return TRUE; } @@ -316,6 +322,11 @@ void dmxCloseDisplay(DMXScreenInfo *dmxScreen) /* make sure all pending sync replies are processed */ dmxSync (dmxScreen, TRUE); + if (dmxScreen->atomTable) + xfree (dmxScreen->atomTable); + if (dmxScreen->beAtomTable) + xfree (dmxScreen->beAtomTable); + XLIB_PROLOGUE (dmxScreen); XCloseDisplay (dmxScreen->beDisplay); XLIB_EPILOGUE (dmxScreen);