/* * Copyright © 2008 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: David Reveman */ #ifdef HAVE_DMX_CONFIG_H #include #endif #include "dmxatom.h" #include "dmxsync.h" Atom dmxAtom (DMXScreenInfo *dmxScreen, Atom beAtom) { Atom atom = None; if (beAtom < dmxScreen->beAtomTableSize) atom = dmxScreen->beAtomTable[beAtom]; if (!atom) { xcb_get_atom_name_reply_t *reply; reply = xcb_get_atom_name_reply (dmxScreen->connection, xcb_get_atom_name (dmxScreen->connection, beAtom), NULL); if (!reply) return None; atom = MakeAtom ((char *) (reply + 1), reply->name_len, TRUE); free (reply); 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) { Atom beAtom = None; if (atom < dmxScreen->atomTableSize) beAtom = dmxScreen->atomTable[atom]; if (!beAtom) { xcb_intern_atom_reply_t *reply; char *name; name = NameForAtom (atom); if (!name) return None; reply = xcb_intern_atom_reply (dmxScreen->connection, xcb_intern_atom (dmxScreen->connection, FALSE, strlen (name), name), NULL); if (!reply) return None; beAtom = reply->atom; free (reply); if (atom >= dmxScreen->atomTableSize) { 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->atomTable[atom] = beAtom; } return beAtom; }