xserver/hw/dmx/dmxatom.c

155 lines
3.5 KiB
C
Raw Normal View History

2008-08-02 10:04:27 -04:00
/*
* 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 <davidr@novell.com>
*/
#ifdef HAVE_DMX_CONFIG_H
#include <dmx-config.h>
#endif
#include "dmxatom.h"
#include "dmxsync.h"
2008-08-02 10:04:27 -04:00
Atom
dmxAtom (DMXScreenInfo *dmxScreen,
Atom beAtom)
{
2008-08-02 10:29:40 -04:00
Atom atom = None;
2008-08-02 10:04:27 -04:00
2008-08-02 10:29:40 -04:00
if (beAtom < dmxScreen->beAtomTableSize)
atom = dmxScreen->beAtomTable[beAtom];
2008-08-02 10:04:27 -04:00
2008-08-02 10:29:40 -04:00
if (!atom)
{
xcb_get_atom_name_cookie_t cookie;
xcb_get_atom_name_reply_t *reply = NULL;
cookie = xcb_get_atom_name (dmxScreen->connection, beAtom);
do {
dmxDispatch ();
if (xcb_poll_for_reply (dmxScreen->connection,
cookie.sequence,
(void **) &reply,
NULL))
break;
} while (dmxWaitForResponse () && dmxScreen->alive);
if (!reply)
return None;
2008-08-02 10:29:40 -04:00
atom = MakeAtom ((char *) (reply + 1), reply->name_len, TRUE);
2008-08-02 10:56:01 -04:00
free (reply);
2008-08-02 10:29:40 -04:00
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;
2008-08-02 10:04:27 -04:00
}
Atom
dmxBEAtom (DMXScreenInfo *dmxScreen,
Atom atom)
{
2008-08-02 10:29:40 -04:00
Atom beAtom = None;
if (atom < dmxScreen->atomTableSize)
beAtom = dmxScreen->atomTable[atom];
if (!beAtom)
{
xcb_intern_atom_cookie_t cookie;
xcb_intern_atom_reply_t *reply = NULL;
char *name;
2008-08-02 10:29:40 -04:00
name = NameForAtom (atom);
if (!name)
return None;
cookie = xcb_intern_atom (dmxScreen->connection,
FALSE,
strlen (name),
name);
do {
dmxDispatch ();
if (xcb_poll_for_reply (dmxScreen->connection,
cookie.sequence,
(void **) &reply,
NULL))
break;
} while (dmxWaitForResponse () && dmxScreen->alive);
if (!reply)
return None;
beAtom = reply->atom;
free (reply);
2008-08-02 10:29:40 -04:00
2008-08-02 11:07:58 -04:00
if (atom >= dmxScreen->atomTableSize)
2008-08-02 10:29:40 -04:00
{
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;
}
2008-08-02 10:04:27 -04:00
2008-08-02 11:07:58 -04:00
dmxScreen->atomTable[atom] = beAtom;
2008-08-02 10:29:40 -04:00
}
2008-08-02 10:04:27 -04:00
2008-08-02 10:29:40 -04:00
return beAtom;
2008-08-02 10:04:27 -04:00
}