Annotation of researchv9/X11/src/X.V11R1/lib/oldXtk/GCManager.c, revision 1.1.1.1

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.