tkAtom.c
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:6k
源码类别:

通讯编程

开发平台:

Visual C++

  1. /* 
  2.  * tkAtom.c --
  3.  *
  4.  * This file manages a cache of X Atoms in order to avoid
  5.  * interactions with the X server.  It's much like the Xmu
  6.  * routines, except it has a cleaner interface (caller
  7.  * doesn't have to provide permanent storage for atom names,
  8.  * for example).
  9.  *
  10.  * Copyright (c) 1990-1994 The Regents of the University of California.
  11.  * Copyright (c) 1994 Sun Microsystems, Inc.
  12.  *
  13.  * See the file "license.terms" for information on usage and redistribution
  14.  * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
  15.  *
  16.  * RCS: @(#) $Id: tkAtom.c,v 1.3 2002/08/05 04:30:38 dgp Exp $
  17.  */
  18. #include "tkPort.h"
  19. #include "tkInt.h"
  20. /*
  21.  * The following are a list of the predefined atom strings.
  22.  * They should match those found in xatom.h
  23.  */
  24. static char * atomNameArray[] = {
  25.     "PRIMARY", "SECONDARY", "ARC",
  26.     "ATOM", "BITMAP", "CARDINAL",
  27.     "COLORMAP", "CURSOR", "CUT_BUFFER0",
  28.     "CUT_BUFFER1", "CUT_BUFFER2", "CUT_BUFFER3",
  29.     "CUT_BUFFER4", "CUT_BUFFER5", "CUT_BUFFER6",
  30.     "CUT_BUFFER7", "DRAWABLE", "FONT",
  31.     "INTEGER", "PIXMAP", "POINT",
  32.     "RECTANGLE", "RESOURCE_MANAGER", "RGB_COLOR_MAP",
  33.     "RGB_BEST_MAP", "RGB_BLUE_MAP", "RGB_DEFAULT_MAP",
  34.     "RGB_GRAY_MAP", "RGB_GREEN_MAP", "RGB_RED_MAP",
  35.     "STRING", "VISUALID", "WINDOW",
  36.     "WM_COMMAND", "WM_HINTS", "WM_CLIENT_MACHINE",
  37.     "WM_ICON_NAME", "WM_ICON_SIZE", "WM_NAME",
  38.     "WM_NORMAL_HINTS", "WM_SIZE_HINTS", "WM_ZOOM_HINTS",
  39.     "MIN_SPACE", "NORM_SPACE", "MAX_SPACE",
  40.     "END_SPACE", "SUPERSCRIPT_X", "SUPERSCRIPT_Y",
  41.     "SUBSCRIPT_X", "SUBSCRIPT_Y", "UNDERLINE_POSITION",
  42.     "UNDERLINE_THICKNESS", "STRIKEOUT_ASCENT", "STRIKEOUT_DESCENT",
  43.     "ITALIC_ANGLE", "X_HEIGHT", "QUAD_WIDTH",
  44.     "WEIGHT", "POINT_SIZE", "RESOLUTION",
  45.     "COPYRIGHT", "NOTICE", "FONT_NAME",
  46.     "FAMILY_NAME", "FULL_NAME", "CAP_HEIGHT",
  47.     "WM_CLASS", "WM_TRANSIENT_FOR",
  48.     (char *) NULL
  49. };
  50. /*
  51.  * Forward references to procedures defined in this file:
  52.  */
  53. static void AtomInit _ANSI_ARGS_((TkDisplay *dispPtr));
  54. /*
  55.  *--------------------------------------------------------------
  56.  *
  57.  * Tk_InternAtom --
  58.  *
  59.  * Given a string, produce the equivalent X atom.  This
  60.  * procedure is equivalent to XInternAtom, except that it
  61.  * keeps a local cache of atoms.  Once a name is known,
  62.  * the server need not be contacted again for that name.
  63.  *
  64.  * Results:
  65.  * The return value is the Atom corresponding to name.
  66.  *
  67.  * Side effects:
  68.  * A new entry may be added to the local atom cache.
  69.  *
  70.  *--------------------------------------------------------------
  71.  */
  72. Atom
  73. Tk_InternAtom(tkwin, name)
  74.     Tk_Window tkwin; /* Window token;  map name to atom
  75.  * for this window's display. */
  76.     CONST char *name; /* Name to turn into atom. */
  77. {
  78.     register TkDisplay *dispPtr;
  79.     register Tcl_HashEntry *hPtr;
  80.     int new;
  81.     dispPtr = ((TkWindow *) tkwin)->dispPtr;
  82.     if (!dispPtr->atomInit) {
  83. AtomInit(dispPtr);
  84.     }
  85.     hPtr = Tcl_CreateHashEntry(&dispPtr->nameTable, name, &new);
  86.     if (new) {
  87. Tcl_HashEntry *hPtr2;
  88. Atom atom;
  89. atom = XInternAtom(dispPtr->display, name, False);
  90. Tcl_SetHashValue(hPtr, atom);
  91. hPtr2 = Tcl_CreateHashEntry(&dispPtr->atomTable, (char *) atom,
  92. &new);
  93. Tcl_SetHashValue(hPtr2, Tcl_GetHashKey(&dispPtr->nameTable, hPtr));
  94.     }
  95.     return (Atom) Tcl_GetHashValue(hPtr);
  96. }
  97. /*
  98.  *--------------------------------------------------------------
  99.  *
  100.  * Tk_GetAtomName --
  101.  *
  102.  * This procedure is equivalent to XGetAtomName except that
  103.  * it uses the local atom cache to avoid contacting the
  104.  * server.
  105.  *
  106.  * Results:
  107.  * The return value is a character string corresponding to
  108.  * the atom given by "atom".  This string's storage space
  109.  * is static:  it need not be freed by the caller, and should
  110.  * not be modified by the caller.  If "atom" doesn't exist
  111.  * on tkwin's display, then the string "?bad atom?" is returned.
  112.  *
  113.  * Side effects:
  114.  * None.
  115.  *
  116.  *--------------------------------------------------------------
  117.  */
  118. CONST char *
  119. Tk_GetAtomName(tkwin, atom)
  120.     Tk_Window tkwin; /* Window token;  map atom to name
  121.  * relative to this window's
  122.  * display. */
  123.     Atom atom; /* Atom whose name is wanted. */
  124. {
  125.     register TkDisplay *dispPtr;
  126.     register Tcl_HashEntry *hPtr;
  127.     dispPtr = ((TkWindow *) tkwin)->dispPtr;
  128.     if (!dispPtr->atomInit) {
  129. AtomInit(dispPtr);
  130.     }
  131.     hPtr = Tcl_FindHashEntry(&dispPtr->atomTable, (char *) atom);
  132.     if (hPtr == NULL) {
  133. char *name;
  134. Tk_ErrorHandler handler;
  135. int new, mustFree;
  136. handler= Tk_CreateErrorHandler(dispPtr->display, BadAtom,
  137. -1, -1, (Tk_ErrorProc *) NULL, (ClientData) NULL);
  138. name = XGetAtomName(dispPtr->display, atom);
  139. mustFree = 1;
  140. if (name == NULL) {
  141.     name = "?bad atom?";
  142.     mustFree = 0;
  143. }
  144. Tk_DeleteErrorHandler(handler);
  145. hPtr = Tcl_CreateHashEntry(&dispPtr->nameTable, (char *) name,
  146. &new);
  147. Tcl_SetHashValue(hPtr, atom);
  148. if (mustFree) {
  149.     XFree(name);
  150. }
  151. name = Tcl_GetHashKey(&dispPtr->nameTable, hPtr);
  152. hPtr = Tcl_CreateHashEntry(&dispPtr->atomTable, (char *) atom,
  153. &new);
  154. Tcl_SetHashValue(hPtr, name);
  155.     }
  156.     return Tcl_GetHashValue(hPtr);
  157. }
  158. /*
  159.  *--------------------------------------------------------------
  160.  *
  161.  * AtomInit --
  162.  *
  163.  * Initialize atom-related information for a display.
  164.  *
  165.  * Results:
  166.  * None.
  167.  *
  168.  * Side effects:
  169.  * Tables get initialized, etc. etc..
  170.  *
  171.  *--------------------------------------------------------------
  172.  */
  173. static void
  174. AtomInit(dispPtr)
  175.     register TkDisplay *dispPtr; /* Display to initialize. */
  176. {
  177.     Tcl_HashEntry *hPtr;
  178.     Atom atom;
  179.     dispPtr->atomInit = 1;
  180.     Tcl_InitHashTable(&dispPtr->nameTable, TCL_STRING_KEYS);
  181.     Tcl_InitHashTable(&dispPtr->atomTable, TCL_ONE_WORD_KEYS);
  182.     for (atom = 1; atom <= XA_LAST_PREDEFINED; atom++) {
  183. hPtr = Tcl_FindHashEntry(&dispPtr->atomTable, (char *) atom);
  184. if (hPtr == NULL) {
  185.     char *name;
  186.     int new;
  187.     name = atomNameArray[atom - 1];
  188.     hPtr = Tcl_CreateHashEntry(&dispPtr->nameTable, (char *) name,
  189. &new);
  190.     Tcl_SetHashValue(hPtr, atom);
  191.     name = Tcl_GetHashKey(&dispPtr->nameTable, hPtr);
  192.     hPtr = Tcl_CreateHashEntry(&dispPtr->atomTable, (char *) atom,
  193. &new);
  194.     Tcl_SetHashValue(hPtr, name);
  195. }
  196.     }
  197. }