|
|
1.1 ! root 1: #ifndef lint ! 2: static char rcsid[] = "$Header: GCManager.c,v 1.12 87/09/13 16:44:10 newman Exp $"; ! 3: #endif lint ! 4: ! 5: /* ! 6: * Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts. ! 7: * ! 8: * All Rights Reserved ! 9: * ! 10: * Permission to use, copy, modify, and distribute this software and its ! 11: * documentation for any purpose and without fee is hereby granted, ! 12: * provided that the above copyright notice appear in all copies and that ! 13: * both that copyright notice and this permission notice appear in ! 14: * supporting documentation, and that the name of Digital Equipment ! 15: * Corporation not be used in advertising or publicity pertaining to ! 16: * distribution of the software without specific, written prior permission. ! 17: * ! 18: * ! 19: * DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ! 20: * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL ! 21: * DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ! 22: * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, ! 23: * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ! 24: * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS ! 25: * SOFTWARE. ! 26: */ ! 27: #include "Intrinsic.h" ! 28: ! 29: typedef struct _GCrec { ! 30: Display *dpy; /* Display for GC */ ! 31: Screen *screen; /* Screen for GC */ ! 32: int depth; /* Depth for GC */ ! 33: int ref_count; /* # of shareholders */ ! 34: GC gc; /* The GC itself. */ ! 35: int valueMask; /* What fields are being used right now. */ ! 36: XGCValues values; /* What values those fields have. */ ! 37: struct _GCrec *next; /* Next GC for this widgetkind. */ ! 38: } GCrec, *GCptr; ! 39: ! 40: ! 41: static GCrec *GClist = NULL; ! 42: ! 43: static int Matches(ptr,widget, valueMask, v) ! 44: GCptr ptr; ! 45: Widget widget; ! 46: unsigned long valueMask; ! 47: register XGCValues *v; ! 48: { ! 49: #define CheckGCField(MaskBit,fieldName) \ ! 50: if (m & MaskBit) if (p->fieldName != v->fieldName) return 0 ! 51: ! 52: register int m = ptr->valueMask & valueMask; ! 53: register XGCValues *p = &(ptr->values); ! 54: ! 55: if (ptr->valueMask != valueMask) return 0; ! 56: if (ptr->depth != widget->core.depth) return 0; ! 57: if (ptr->screen != XtScreen(widget)) return 0; ! 58: ! 59: CheckGCField( GCFunction, function); ! 60: CheckGCField( GCPlaneMask, plane_mask); ! 61: CheckGCField( GCForeground, foreground); ! 62: CheckGCField( GCBackground, background); ! 63: CheckGCField( GCLineWidth, line_width); ! 64: CheckGCField( GCLineStyle, line_style); ! 65: CheckGCField( GCCapStyle, cap_style); ! 66: CheckGCField( GCJoinStyle, join_style); ! 67: CheckGCField( GCFillStyle, fill_style); ! 68: CheckGCField( GCFillRule, fill_rule); ! 69: CheckGCField( GCArcMode, arc_mode); ! 70: CheckGCField( GCTile, tile); ! 71: CheckGCField( GCStipple, stipple); ! 72: CheckGCField( GCTileStipXOrigin, ts_x_origin); ! 73: CheckGCField( GCTileStipYOrigin, ts_y_origin); ! 74: CheckGCField( GCFont, font); ! 75: CheckGCField( GCSubwindowMode, subwindow_mode); ! 76: CheckGCField( GCGraphicsExposures, graphics_exposures); ! 77: CheckGCField( GCClipXOrigin, clip_x_origin); ! 78: CheckGCField( GCClipYOrigin, clip_y_origin); ! 79: CheckGCField( GCClipMask, clip_mask); ! 80: CheckGCField( GCDashOffset, dash_offset); ! 81: CheckGCField( GCDashList, dashes); ! 82: #undef CheckGCField ! 83: return 1; ! 84: } ! 85: ! 86: static void SetFields(ptr, valueMask, v) ! 87: GCptr ptr; ! 88: register unsigned long valueMask; ! 89: register XGCValues *v; ! 90: { ! 91: #define SetGCField(MaskBit,fieldName) \ ! 92: if (valueMask & MaskBit) p->fieldName = v->fieldName ! 93: ! 94: register XGCValues *p = &(ptr->values); ! 95: ! 96: SetGCField( GCFunction, function); ! 97: SetGCField( GCPlaneMask, plane_mask); ! 98: SetGCField( GCForeground, foreground); ! 99: SetGCField( GCBackground, background); ! 100: SetGCField( GCLineWidth, line_width); ! 101: SetGCField( GCLineStyle, line_style); ! 102: SetGCField( GCCapStyle, cap_style); ! 103: SetGCField( GCJoinStyle, join_style); ! 104: SetGCField( GCFillStyle, fill_style); ! 105: SetGCField( GCFillRule, fill_rule); ! 106: SetGCField( GCArcMode, arc_mode); ! 107: SetGCField( GCTile, tile); ! 108: SetGCField( GCStipple, stipple); ! 109: SetGCField( GCTileStipXOrigin, ts_x_origin); ! 110: SetGCField( GCTileStipYOrigin, ts_y_origin); ! 111: SetGCField( GCFont, font); ! 112: SetGCField( GCSubwindowMode, subwindow_mode); ! 113: SetGCField( GCGraphicsExposures, graphics_exposures); ! 114: SetGCField( GCClipXOrigin, clip_x_origin); ! 115: SetGCField( GCClipYOrigin, clip_y_origin); ! 116: SetGCField( GCClipMask, clip_mask); ! 117: SetGCField( GCDashOffset, dash_offset); ! 118: SetGCField( GCDashList, dashes); ! 119: ptr->valueMask |= valueMask; ! 120: XChangeGC(ptr->dpy, ptr->gc, valueMask, p); ! 121: #undef SetGCField ! 122: } ! 123: ! 124: ! 125: /* ! 126: * Return a read-only GC with the given values. ! 127: */ ! 128: ! 129: GC XtGetGC(widget, valueMask, values) ! 130: Widget widget; ! 131: XtGCMask valueMask; ! 132: XGCValues *values; ! 133: { ! 134: GCptr first=GClist; ! 135: register GCptr cur; ! 136: Drawable drawable; ! 137: ! 138: for (cur = first; cur != NULL; cur = cur->next) { ! 139: if (Matches(cur, widget,valueMask, values)) { ! 140: valueMask &= ~cur->valueMask; ! 141: if (valueMask) SetFields(cur, valueMask, values); ! 142: cur->ref_count++; ! 143: return cur->gc; ! 144: } ! 145: } ! 146: cur = (GCptr) XtMalloc((unsigned)sizeof(GCrec)); ! 147: cur->dpy = XtDisplay(widget); ! 148: cur->screen = XtScreen(widget); ! 149: cur->depth = widget->core.depth; ! 150: cur->ref_count = 1; ! 151: if (XtWindow(widget) == NULL) ! 152: drawable = XCreatePixmap(XtDisplay(widget), XtScreen(widget)->root, ! 153: 1,1,widget->core.depth); ! 154: else drawable = XtWindow(widget); ! 155: cur->gc = XCreateGC(XtDisplay(widget), drawable, valueMask, values); ! 156: cur->valueMask = valueMask; ! 157: cur->values = *values; ! 158: cur->next = first; ! 159: GClist = cur; ! 160: return cur->gc; ! 161: } ! 162: ! 163: void XtDestroyGC(gc) ! 164: GC gc; ! 165: { ! 166: GCptr first=GClist; ! 167: GCptr cur; ! 168: ! 169: for (cur = first; cur != NULL; cur = cur->next) ! 170: if (cur->gc == gc) ! 171: if (--(cur->ref_count) == 0) XFreeGC(cur->dpy, gc); ! 172: return; ! 173: } ! 174:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.