Atoms.c revision 0cc2eac3
1/* 2 3Copyright 1988, 1998 The Open Group 4 5Permission to use, copy, modify, distribute, and sell this software and its 6documentation for any purpose is hereby granted without fee, provided that 7the above copyright notice appear in all copies and that both that 8copyright notice and this permission notice appear in supporting 9documentation. 10 11The above copyright notice and this permission notice shall be included in 12all copies or substantial portions of the Software. 13 14THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 17OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 18AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 19CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 20 21Except as contained in this notice, the name of The Open Group shall not be 22used in advertising or otherwise to promote the sale, use or other dealings 23in this Software without prior written authorization from The Open Group. 24 25*/ 26 27/* 28 * This file contains routines to cache atoms, avoiding multiple 29 * server round-trips. Not so useful now that Xlib caches them. 30 * 31 * Public entry points: 32 * 33 * XmuMakeAtom creates & initializes an opaque AtomRec 34 * XmuInternAtom fetches an Atom from cache or Display 35 * XmuInternStrings fetches multiple Atoms as strings 36 * XmuGetAtomName returns name of an Atom 37 * XmuNameOfAtom returns name from an AtomPtr 38 */ 39 40#ifdef HAVE_CONFIG_H 41#include <config.h> 42#endif 43#include <X11/Intrinsic.h> 44#include "Atoms.h" 45 46typedef struct _DisplayRec { 47 struct _DisplayRec* next; 48 Display *dpy; 49 Atom atom; 50} DisplayRec; 51 52struct _AtomRec { 53 _Xconst char *name; 54 DisplayRec* head; 55}; 56 57#ifdef SUNSHLIB 58#define STATIC 59#else 60#define STATIC static 61#endif 62 63#define DeclareAtom(atom,text) \ 64STATIC struct _AtomRec __##atom = { text, NULL }; \ 65AtomPtr _##atom = &__##atom; 66 67DeclareAtom(XA_ATOM_PAIR, "ATOM_PAIR" ) 68DeclareAtom(XA_CHARACTER_POSITION, "CHARACTER_POSITION" ) 69DeclareAtom(XA_CLASS, "CLASS" ) 70DeclareAtom(XA_CLIENT_WINDOW, "CLIENT_WINDOW" ) 71DeclareAtom(XA_CLIPBOARD, "CLIPBOARD" ) 72DeclareAtom(XA_COMPOUND_TEXT, "COMPOUND_TEXT" ) 73DeclareAtom(XA_DECNET_ADDRESS, "DECNET_ADDRESS" ) 74DeclareAtom(XA_DELETE, "DELETE" ) 75DeclareAtom(XA_FILENAME, "FILENAME" ) 76DeclareAtom(XA_HOSTNAME, "HOSTNAME" ) 77DeclareAtom(XA_IP_ADDRESS, "IP_ADDRESS" ) 78DeclareAtom(XA_LENGTH, "LENGTH" ) 79DeclareAtom(XA_LIST_LENGTH, "LIST_LENGTH" ) 80DeclareAtom(XA_NAME, "NAME" ) 81DeclareAtom(XA_NET_ADDRESS, "NET_ADDRESS" ) 82DeclareAtom(XA_NULL, "NULL" ) 83DeclareAtom(XA_OWNER_OS, "OWNER_OS" ) 84DeclareAtom(XA_SPAN, "SPAN" ) 85DeclareAtom(XA_TARGETS, "TARGETS" ) 86DeclareAtom(XA_TEXT, "TEXT" ) 87DeclareAtom(XA_TIMESTAMP, "TIMESTAMP" ) 88DeclareAtom(XA_USER, "USER" ) 89DeclareAtom(XA_UTF8_STRING, "UTF8_STRING" ) 90 91/****************************************************************** 92 93 Public procedures 94 95 ******************************************************************/ 96 97 98AtomPtr 99XmuMakeAtom(_Xconst char *name) 100{ 101 AtomPtr ptr = XtNew(struct _AtomRec); 102 ptr->name = name; 103 ptr->head = NULL; 104 return ptr; 105} 106 107char * 108XmuNameOfAtom(AtomPtr atom_ptr) 109{ 110 return (char *) atom_ptr->name; 111} 112 113 114Atom 115XmuInternAtom(Display *d, AtomPtr atom_ptr) 116{ 117 DisplayRec* display_rec; 118 for (display_rec = atom_ptr->head; display_rec != NULL; 119 display_rec = display_rec->next) { 120 if (display_rec->dpy == d) 121 return display_rec->atom; 122 } 123 display_rec = XtNew(DisplayRec); 124 display_rec->next = atom_ptr->head; 125 atom_ptr->head = display_rec; 126 display_rec->dpy = d; 127 display_rec->atom = XInternAtom(d, atom_ptr->name, False); 128 return display_rec->atom; 129} 130 131 132char * 133XmuGetAtomName(Display *d, Atom atom) 134{ 135 if (atom == 0) return (NULL); 136 return XGetAtomName(d, atom); 137} 138 139/* convert (names, count) to a list of atoms. Caller allocates list */ 140void 141XmuInternStrings(Display *d, register String *names, 142 register Cardinal count, register Atom *atoms) 143{ 144 (void) XInternAtoms(d, (char**)names, (int)count, FALSE, atoms); 145} 146