diff options
Diffstat (limited to 'tk/generic/tkGC.c')
-rw-r--r-- | tk/generic/tkGC.c | 123 |
1 files changed, 17 insertions, 106 deletions
diff --git a/tk/generic/tkGC.c b/tk/generic/tkGC.c index 9d1c6949009..8ddcd391e4c 100644 --- a/tk/generic/tkGC.c +++ b/tk/generic/tkGC.c @@ -14,9 +14,6 @@ */ #include "tkPort.h" -#include "tk.h" - -/* CYGNUS LOCAL, for TkRegisterColorGC. */ #include "tkInt.h" /* @@ -32,46 +29,20 @@ typedef struct { int refCount; /* Number of active uses of gc. */ Tcl_HashEntry *valueHashPtr;/* Entry in valueTable (needed when deleting * this structure). */ - /* CYGNUS LOCAL. */ - XColor *foreground; /* Foreground color. */ - XColor *background; /* Background color. */ } TkGC; -/* - * Hash table to map from a GC's values to a TkGC structure describing - * a GC with those values (used by Tk_GetGC). - */ - -static Tcl_HashTable valueTable; typedef struct { XGCValues values; /* Desired values for GC. */ Display *display; /* Display for which GC is valid. */ int screenNum; /* screen number of display */ int depth; /* and depth for which GC is valid. */ - /* CYGNUS LOCAL. */ - XColor *foreground; /* Foreground color. */ - XColor *background; /* Background color. */ } ValueKey; /* - * Hash table for <display + GC> -> TkGC mapping. This table is used by - * Tk_FreeGC. - */ - -static Tcl_HashTable idTable; -typedef struct { - Display *display; /* Display for which GC was allocated. */ - GC gc; /* X's identifier for GC. */ -} IdKey; - -static int initialized = 0; /* 0 means static structures haven't been - * initialized yet. */ - -/* * Forward declarations for procedures defined in this file: */ -static void GCInit _ANSI_ARGS_((void)); +static void GCInit _ANSI_ARGS_((TkDisplay *dispPtr)); /* *---------------------------------------------------------------------- @@ -95,11 +66,8 @@ static void GCInit _ANSI_ARGS_((void)); *---------------------------------------------------------------------- */ -/* CYGNUS LOCAL: Rename this to Tk_GetGCColor. The new Tk_GetGC is - below. */ - GC -Tk_GetGCColor(tkwin, valueMask, valuePtr, foreground, background) +Tk_GetGC(tkwin, valueMask, valuePtr) Tk_Window tkwin; /* Window in which GC will be used. */ register unsigned long valueMask; /* 1 bits correspond to values specified @@ -108,31 +76,18 @@ Tk_GetGCColor(tkwin, valueMask, valuePtr, foreground, background) register XGCValues *valuePtr; /* Values are specified here for bits set * in valueMask. */ - /* CYGNUS LOCAL. */ - XColor *foreground; /* Foreground color. */ - XColor *background; /* Background color. */ { ValueKey valueKey; - IdKey idKey; Tcl_HashEntry *valueHashPtr, *idHashPtr; register TkGC *gcPtr; int new; Drawable d, freeDrawable; + TkDisplay *dispPtr = ((TkWindow *) tkwin)->dispPtr; - if (!initialized) { - GCInit(); + if (!dispPtr->gcInit) { + GCInit(dispPtr); } -#if !defined(__WIN32__) && !defined(_WIN32) - /* CYGNUS LOCAL. We only care about special foreground and - background colors on Windows. If we are on some other - platform, just ignore them. If we don't do this, we may - allocate an unnecessary GC if we have two colors with different - names but the same pixel value. */ - foreground = NULL; - background = NULL; -#endif - /* * Must zero valueKey at start to clear out pad bytes that may be * part of structure on some systems. @@ -263,12 +218,8 @@ Tk_GetGCColor(tkwin, valueMask, valuePtr, foreground, background) valueKey.display = Tk_Display(tkwin); valueKey.screenNum = Tk_ScreenNumber(tkwin); valueKey.depth = Tk_Depth(tkwin); - - /* CYGNUS LOCAL. Set colors. */ - valueKey.foreground = foreground; - valueKey.background = background; - - valueHashPtr = Tcl_CreateHashEntry(&valueTable, (char *) &valueKey, &new); + valueHashPtr = Tcl_CreateHashEntry(&dispPtr->gcValueTable, + (char *) &valueKey, &new); if (!new) { gcPtr = (TkGC *) Tcl_GetHashValue(valueHashPtr); gcPtr->refCount++; @@ -305,9 +256,8 @@ Tk_GetGCColor(tkwin, valueMask, valuePtr, foreground, background) gcPtr->display = valueKey.display; gcPtr->refCount = 1; gcPtr->valueHashPtr = valueHashPtr; - idKey.display = valueKey.display; - idKey.gc = gcPtr->gc; - idHashPtr = Tcl_CreateHashEntry(&idTable, (char *) &idKey, &new); + idHashPtr = Tcl_CreateHashEntry(&dispPtr->gcIdTable, + (char *) gcPtr->gc, &new); if (!new) { panic("GC already registered in Tk_GetGC"); } @@ -317,36 +267,8 @@ Tk_GetGCColor(tkwin, valueMask, valuePtr, foreground, background) Tk_FreePixmap(valueKey.display, freeDrawable); } - /* CYGNUS LOCAL. Record and register the colors. */ - gcPtr->foreground = foreground; - gcPtr->background = background; - if (foreground != NULL) { - TkRegisterColorGC(foreground, valueKey.display, gcPtr->gc, - GCForeground); - } - if (background != NULL) { - TkRegisterColorGC(background, valueKey.display, gcPtr->gc, - GCBackground); - } - return gcPtr->gc; } - -/* CYGNUS LOCAL. Tk_GetGC now just calls Tk_GetGCColor. */ - -GC -Tk_GetGC(tkwin, valueMask, valuePtr) - Tk_Window tkwin; /* Window in which GC will be used. */ - register unsigned long valueMask; - /* 1 bits correspond to values specified - * in *valuesPtr; other values are set - * from defaults. */ - register XGCValues *valuePtr; - /* Values are specified here for bits set - * in valueMask. */ -{ - return Tk_GetGCColor(tkwin, valueMask, valuePtr, NULL, NULL); -} /* *---------------------------------------------------------------------- @@ -371,33 +293,21 @@ Tk_FreeGC(display, gc) Display *display; /* Display for which gc was allocated. */ GC gc; /* Graphics context to be released. */ { - IdKey idKey; Tcl_HashEntry *idHashPtr; register TkGC *gcPtr; + TkDisplay *dispPtr = TkGetDisplay(display); - if (!initialized) { + if (!dispPtr->gcInit) { panic("Tk_FreeGC called before Tk_GetGC"); } - idKey.display = display; - idKey.gc = gc; - idHashPtr = Tcl_FindHashEntry(&idTable, (char *) &idKey); + idHashPtr = Tcl_FindHashEntry(&dispPtr->gcIdTable, (char *) gc); if (idHashPtr == NULL) { panic("Tk_FreeGC received unknown gc argument"); } gcPtr = (TkGC *) Tcl_GetHashValue(idHashPtr); gcPtr->refCount--; if (gcPtr->refCount == 0) { - /* CYGNUS LOCAL: Deregister the colors. */ - if (gcPtr->foreground != NULL) { - TkDeregisterColorGC(gcPtr->foreground, gcPtr->gc, - GCForeground); - } - if (gcPtr->background != NULL) { - TkDeregisterColorGC(gcPtr->background, gcPtr->gc, - GCBackground); - } - Tk_FreeXId(gcPtr->display, (XID) XGContextFromGC(gcPtr->gc)); XFreeGC(gcPtr->display, gcPtr->gc); Tcl_DeleteHashEntry(gcPtr->valueHashPtr); @@ -423,9 +333,10 @@ Tk_FreeGC(display, gc) */ static void -GCInit() +GCInit(dispPtr) + TkDisplay *dispPtr; { - initialized = 1; - Tcl_InitHashTable(&valueTable, sizeof(ValueKey)/sizeof(int)); - Tcl_InitHashTable(&idTable, sizeof(IdKey)/sizeof(int)); + dispPtr->gcInit = 1; + Tcl_InitHashTable(&dispPtr->gcValueTable, sizeof(ValueKey)/sizeof(int)); + Tcl_InitHashTable(&dispPtr->gcIdTable, TCL_ONE_WORD_KEYS); } |