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

1.1       root        1: /* $Header: Command.c,v 1.3 87/09/12 12:42:17 swick Exp $ */
                      2: #ifndef lint
                      3: static char *sccsid = "@(#)Command.c   1.13    2/25/87";
                      4: #endif lint
                      5: 
                      6: /*
                      7:  * Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
                      8:  * 
                      9:  *                         All Rights Reserved
                     10:  * 
                     11:  * Permission to use, copy, modify, and distribute this software and its 
                     12:  * documentation for any purpose and without fee is hereby granted, 
                     13:  * provided that the above copyright notice appear in all copies and that
                     14:  * both that copyright notice and this permission notice appear in 
                     15:  * supporting documentation, and that the name of Digital Equipment
                     16:  * Corporation not be used in advertising or publicity pertaining to
                     17:  * distribution of the software without specific, written prior permission.  
                     18:  * 
                     19:  * 
                     20:  * DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
                     21:  * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
                     22:  * DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
                     23:  * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
                     24:  * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
                     25:  * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
                     26:  * SOFTWARE.
                     27:  */
                     28: 
                     29: 
                     30: #include <stdio.h>
                     31: #include <strings.h>
                     32: #include "Xlib.h"
                     33: #include "Intrinsic.h"
                     34: #include "Command.h"
                     35: #include "Atoms.h"
                     36: 
                     37: /* Private Definitions */
                     38: 
                     39: typedef void  (*CommandProc)();
                     40:         
                     41: typedef struct _WidgetDataRec {
                     42:     Display    *dpy;           /* widget display connection */
                     43:     Window     mywin;          /* widget window */
                     44:     Position   x, y;           /* Location of widget. */
                     45:     Dimension  borderWidth;    /* border width in pixels */
                     46:     Dimension  width, height;  /* width/height in pixels */
                     47:     Dimension  ibw, ibh;       /* internal border width/height in pixels */
                     48:     char       *text;          /* button text */
                     49:     Pixel      fgpixel;        /* color index for text */
                     50:     Pixel      bgpixel;        /* color index for background */
                     51:     Pixel      brpixel;        /* color for border */
                     52:     Boolean    sensitive;      /* user actions processed */
                     53:     Boolean    highlighted;    /* are we border highlighted? */
                     54:     Boolean    set;            /* are we text highlighted */
                     55:     Boolean    notifying;      /* are we in the notify proc? */
                     56:     Boolean    needsfreeing;   /* were we destroyed by the notify proc? */
                     57:     int                eventlevels;    /* recursion levels of event processing */
                     58:     XFontStruct        *fontstruct;    /* font for text */
                     59:     Dimension  twidth, theight;/* text width/height */
                     60:     XtJustify  justify;        /* text justification */
                     61:     CommandProc        proc;           /* command procedure to invoke on notify */
                     62:     caddr_t    tag;            /* widget client data */
                     63:     GC         normgc;         /* gc for normal display */
                     64:     GC         invgc;          /* gc for inverted display */
                     65:     GC         graygc;         /* gc for grayed-out text */
                     66:     XtEventsPtr eventTable;     /* Table for translation manager. */
                     67:     TranslationPtr state;      /* Translation manager state handle. */
                     68: } WidgetDataRec, *WidgetData;
                     69: 
                     70: static WidgetDataRec globaldata;
                     71: extern void Dummy();
                     72: static WidgetDataRec globalinit = {
                     73:     NULL,              /* Display dpy; */
                     74:     NULL,              /* Window mywin; */
                     75:     0, 0,              /* Position x, y; */
                     76:     1,                 /* Dimension borderWidth; */
                     77:     0, 0,              /* Dimension width, height; */
                     78:     4, 2,              /* Dimension ibw, ibh; */
                     79:     NULL,              /* char *text; */
                     80:     NULL,              /* Pixel fgpixel; */ /* init proc */
                     81:     NULL,              /* Pixel bgpixel; */ /* init proc */
                     82:     NULL,              /* Pixel brpixel; */ /* init proc */
                     83:     TRUE,              /* int sensitive; */
                     84:     FALSE,             /* int highlighted; */
                     85:     FALSE,             /* int set; */
                     86:     FALSE,             /* int notifying; */
                     87:     FALSE,             /* int needsfreeing; */
                     88:     0,                 /* int eventlevels; */
                     89:     NULL,              /* XFontStruct *fontstruct; */ /* init proc */
                     90:     0, 0,              /* int twidth, theight; */
                     91:     XtjustifyCenter,      /* text justification */
                     92:     Dummy,             /* void (*Proc) (); */
                     93:     NULL,              /* caddr_t tag; */
                     94:     NULL,              /* GC normgc; */
                     95:     NULL,              /* GC invgc; */
                     96:     NULL,              /* GC graygc; */
                     97:     NULL,               /* XtEventsPtr eventTable; */ /* init proc */
                     98:     NULL,               /* caddr_t state; */
                     99: };
                    100: 
                    101: /* Private Data */
                    102: 
                    103: static Resource resources[] = {
                    104:     {XtNwindow, XtCWindow, XrmRWindow,
                    105:        sizeof(Window), (caddr_t)&globaldata.mywin, (caddr_t)NULL},
                    106:     {XtNx, XtCX, XrmRInt,
                    107:         sizeof(int), (caddr_t)&globaldata.x, (caddr_t)NULL},
                    108:     {XtNy, XtCY, XrmRInt,
                    109:         sizeof(int), (caddr_t)&globaldata.y, (caddr_t)NULL},
                    110:     {XtNborderWidth, XtCBorderWidth, XrmRInt,
                    111:        sizeof(int), (caddr_t)&globaldata.borderWidth, (caddr_t)NULL},
                    112:     {XtNwidth, XtCWidth, XrmRInt,
                    113:        sizeof(int), (caddr_t)&globaldata.width, (caddr_t)NULL},
                    114:     {XtNheight, XtCHeight, XrmRInt,
                    115:        sizeof(int), (caddr_t)&globaldata.height, (caddr_t)NULL},
                    116:     {XtNinternalWidth, XtCWidth, XrmRInt,
                    117:        sizeof(int), (caddr_t)&globaldata.ibw, (caddr_t)NULL},
                    118:     {XtNinternalHeight, XtCHeight, XrmRInt,
                    119:        sizeof(int), (caddr_t)&globaldata.ibh, (caddr_t)NULL},
                    120:     {XtNlabel, XtCLabel, XrmRString,
                    121:        sizeof(char *), (caddr_t)&globaldata.text, (caddr_t)NULL},
                    122:     {XtNforeground, XtCColor, XrmRPixel,
                    123:        sizeof(int), (caddr_t)&globaldata.fgpixel, (caddr_t)&XtDefaultFGPixel},
                    124:     {XtNbackground, XtCColor, XrmRPixel,
                    125:        sizeof(int), (caddr_t)&globaldata.bgpixel, (caddr_t)&XtDefaultBGPixel},
                    126:     {XtNborder, XtCColor, XrmRPixel, sizeof(int),
                    127:        (caddr_t)&globaldata.brpixel, (caddr_t)&XtDefaultFGPixel},
                    128:     {XtNfont, XtCFont, XrmRFontStruct,
                    129:        sizeof(XFontStruct *), (caddr_t)&globaldata.fontstruct, (caddr_t)NULL},
                    130:     {XtNjustify, XtCJustify, XtRJustify,
                    131:         sizeof(XtJustify), (caddr_t)&globaldata.justify, (caddr_t)NULL},
                    132:     {XtNfunction, XtCFunction, XtRFunction,
                    133:        sizeof(CommandProc), (caddr_t)&globaldata.proc, (caddr_t)NULL},
                    134:     {XtNparameter, XtCParameter, XrmRPointer,
                    135:        sizeof(caddr_t), (caddr_t)&globaldata.tag, (caddr_t)NULL},
                    136:     {XtNsensitive, XtCBoolean, XrmRBoolean, sizeof(Boolean),
                    137:         (caddr_t)&globaldata.sensitive, NULL},
                    138:     {XtNeventBindings, XtCEventBindings, XtREventBindings, sizeof(caddr_t),
                    139:         (caddr_t)&globaldata.eventTable, NULL},
                    140: };
                    141: static char *defaultEventBindings[] = {
                    142:     "<ButtonPress>left:       set\n",
                    143:     "<ButtonRelease>left:      notify unset\n",
                    144:     "<EnterWindow>:             highlight\n",
                    145:     "<LeaveWindow>:             unhighlight unset\n",
                    146:     NULL
                    147: };
                    148: 
                    149: /****************************************************************
                    150:  *
                    151:  * Private Procedures
                    152:  *
                    153:  ****************************************************************/
                    154: 
                    155: /* !!! STATIC !!! */
                    156: static Boolean initialized = FALSE;       /* initialization flag */
                    157: 
                    158: static XContext widgetContext;
                    159: 
                    160: static void CommandInitialize () 
                    161: {
                    162:     if (initialized)
                    163:        return;
                    164:     initialized = TRUE;
                    165:     widgetContext = XUniqueContext();
                    166: 
                    167:     globalinit.eventTable = XtParseEventBindings(defaultEventBindings);
                    168: }
                    169: 
                    170: /*ARGSUSED*/
                    171: static void Dummy(p)                  /* default call back proc */
                    172: caddr_t p;
                    173: {
                    174:     (void) printf("dummy call back for Command\n");
                    175: }
                    176: 
                    177: static void Ignore()
                    178: {}
                    179: 
                    180: 
                    181: /*
                    182:  * Given a display and window, get the widget data.
                    183:  */
                    184: 
                    185: static WidgetData DataFromWindow(dpy, window)
                    186: Display *dpy;
                    187: Window window;
                    188: {
                    189:     WidgetData result;
                    190:     if (XFindContext(dpy, window, widgetContext, (caddr_t *)&result))
                    191:        return NULL;
                    192:     return result;
                    193: }
                    194: 
                    195: /*
                    196:  * Calculate how wide and high the text will be when displayed.
                    197:  */
                    198: 
                    199: static void SetTextWidthAndHeight(data)
                    200: WidgetData data;
                    201: {
                    202:     data->theight = data->fontstruct->max_bounds.ascent +
                    203:        data->fontstruct->max_bounds.descent;
                    204:     data->twidth = XTextWidth(data->fontstruct, data->text,
                    205:                              strlen(data->text));
                    206: }
                    207: 
                    208: 
                    209: /*
                    210:  * Build the gc's for the widget.
                    211:  */
                    212: 
                    213: #define gray_width     32
                    214: #define gray_height    32
                    215: 
                    216: static BuildGcs(data)
                    217: WidgetData data;
                    218: {
                    219:     unsigned long valuemask;
                    220:     XGCValues values;
                    221:     Pixmap gray;
                    222:     static short gray_bits[] = {
                    223:        0xaaaa, 0xaaaa, 0x5555, 0x5555,
                    224:        0xaaaa, 0xaaaa, 0x5555, 0x5555,
                    225:        0xaaaa, 0xaaaa, 0x5555, 0x5555,
                    226:        0xaaaa, 0xaaaa, 0x5555, 0x5555,
                    227:        0xaaaa, 0xaaaa, 0x5555, 0x5555,
                    228:        0xaaaa, 0xaaaa, 0x5555, 0x5555,
                    229:        0xaaaa, 0xaaaa, 0x5555, 0x5555,
                    230:        0xaaaa, 0xaaaa, 0x5555, 0x5555,
                    231:        0xaaaa, 0xaaaa, 0x5555, 0x5555,
                    232:        0xaaaa, 0xaaaa, 0x5555, 0x5555,
                    233:        0xaaaa, 0xaaaa, 0x5555, 0x5555,
                    234:        0xaaaa, 0xaaaa, 0x5555, 0x5555,
                    235:        0xaaaa, 0xaaaa, 0x5555, 0x5555,
                    236:        0xaaaa, 0xaaaa, 0x5555, 0x5555,
                    237:        0xaaaa, 0xaaaa, 0x5555, 0x5555,
                    238:        0xaaaa, 0xaaaa, 0x5555, 0x5555
                    239:     };
                    240:     if (XFindContext(data->dpy, (Window) NULL, widgetContext,
                    241:                      (caddr_t *)&gray)) {
                    242:        XImage ximage;
                    243:        GC pgc;
                    244:        XGCValues gcv;
                    245: 
                    246:        gcv.foreground = 1;
                    247:        gcv.background = 0;
                    248:        gray = XCreatePixmap(data->dpy, data->mywin,
                    249:                             gray_width, gray_height, 
                    250:                             DefaultDepth(data->dpy, DefaultScreen(data->dpy)));
                    251: 
                    252: /*
                    253:     Instead of calling the GCManager, since it doesn't handle depths,
                    254:     and stipples are always XYBitmap, depth == 1, use XCreateGC
                    255:     directly.
                    256: */
                    257:         pgc = XCreateGC(data->dpy, gray, GCForeground | GCBackground, &gcv);
                    258: 
                    259: /*
                    260:        pgc = XtGetGC(data->dpy, widgetContext, gray,
                    261:                      GCForeground | GCBackground, &gcv);
                    262: */
                    263:        ximage.height = gray_height;
                    264:        ximage.width = gray_width;
                    265:        ximage.xoffset = 0;
                    266:        ximage.format = XYBitmap;
                    267:        ximage.data = (char *)gray_bits;
                    268:        ximage.byte_order = ImageByteOrder(data->dpy);
                    269:        ximage.bitmap_unit = BitmapUnit(data->dpy); 
                    270:        ximage.bitmap_bit_order = BitmapBitOrder(data->dpy);
                    271:        ximage.bitmap_pad = BitmapPad(data->dpy);
                    272:        ximage.bytes_per_line = gray_width / 8;
                    273:        ximage.depth = 1;
                    274: 
                    275:        XPutImage(data->dpy, gray, pgc, &ximage, 0, 0, 0, 0,
                    276:                  gray_width, gray_height);
                    277:        (void)XSaveContext(data->dpy, (Window) NULL, widgetContext,
                    278:                            (caddr_t)gray);
                    279:         XFreeGC(data->dpy, pgc);    /* if the GCManager used, don't do this */
                    280:     }
                    281: 
                    282:     valuemask = GCForeground | GCBackground | GCFont | GCFillStyle;
                    283:     values.font = data->fontstruct->fid;
                    284:     values.foreground = data->bgpixel;
                    285:     values.background = data->fgpixel;
                    286:     values.fill_style = FillSolid;
                    287:     data->invgc = XtGetGC(data->dpy, widgetContext, data->mywin,
                    288:                          valuemask, &values);
                    289:     values.foreground = data->fgpixel;
                    290:     values.background = data->bgpixel;
                    291:     data->normgc = XtGetGC(data->dpy, widgetContext, data->mywin,
                    292:                           valuemask, &values);
                    293:     valuemask |= GCStipple;
                    294:     values.fill_style = FillStippled;
                    295:     values.stipple = gray;
                    296:     data->graygc = XtGetGC(data->dpy, widgetContext, data->mywin,
                    297:                           valuemask, &values);
                    298: }
                    299: 
                    300: 
                    301: /*
                    302:  *
                    303:  * Repaint the widget window
                    304:  *
                    305:  */
                    306: 
                    307: static void Redisplay(data)
                    308: WidgetData     data;
                    309: {
                    310:     int     textx, texty;
                    311:     Window  w = data->mywin;
                    312: 
                    313: 
                    314:     /*
                    315:      * Calculate Text x,y given window width and text width
                    316:      * to the specified justification
                    317:      */
                    318: 
                    319:     if (data->needsfreeing) return;
                    320: 
                    321:     if (data->justify == XtjustifyLeft) 
                    322:        textx = 2;
                    323:     else if (data->justify == XtjustifyRight)
                    324:        textx = data->width - data->twidth - 2;
                    325:     else
                    326:         textx = ((data->width - data->twidth) / 2);
                    327:     if (textx < 0) textx = 0;
                    328:     texty = (data->height - data->theight) / 2 +
                    329:        data->fontstruct->max_bounds.ascent;
                    330: 
                    331:     XFillRectangle(data->dpy, w,
                    332:                   ((data->highlighted || data->set)
                    333:                    ? data->normgc : data->invgc),
                    334:                   0, 0, data->width, data->height);
                    335: 
                    336:     if (data->highlighted || data->set)
                    337:        XFillRectangle(data->dpy, w,
                    338:                       data->set ? data->normgc : data->invgc,
                    339:                       textx, (int) ((data->height - data->theight) / 2),
                    340:                       data->twidth, data->theight);
                    341: 
                    342:     XDrawString(data->dpy, w,
                    343:                data->set ? data->invgc : (data->sensitive ? data->normgc : data->graygc),
                    344:                textx, texty, data->text, strlen(data->text));
                    345: }
                    346: 
                    347: extern void Destroy();
                    348: 
                    349: /*
                    350:  *
                    351:  * Generic widget event handler
                    352:  *
                    353:  */
                    354: 
                    355: static XtEventReturnCode EventHandler(event, eventdata)
                    356: XEvent *event;
                    357: caddr_t eventdata;
                    358: {
                    359:     WidgetData data = (WidgetData) eventdata;
                    360:     XtActionTokenPtr    actionList;
                    361:     CommandProc         proc;
                    362: 
                    363:     data->eventlevels++;
                    364:     switch (event->type) {
                    365:        case ConfigureNotify:
                    366:            data->x = event->xconfigure.x;
                    367:            data->y = event->xconfigure.y;
                    368:            data->width = event->xconfigure.width;
                    369:            data->height = event->xconfigure.height;
                    370:            data->borderWidth = event->xconfigure.border_width;
                    371: /*         Redisplay(data);*/
                    372:            break;
                    373: 
                    374:         case DestroyNotify: Destroy(data); break;
                    375: 
                    376:         case Expose:
                    377:            if (event->xexpose.count == 0)
                    378:                Redisplay(data);
                    379:            break;
                    380:         default:
                    381:            if (!data->sensitive) break;
                    382:             actionList =
                    383:             (XtActionTokenPtr) XtTranslateEvent(event, data->state);
                    384:             for ( ; actionList != NULL; actionList = actionList->next) {
                    385:                 if (actionList->type == XttokenAction) {
                    386:                     proc = (CommandProc) XtInterpretAction(
                    387:                        data->dpy, data->state,
                    388:                        actionList->value.action);
                    389:                     (*(proc))(data);
                    390:                 }
                    391:             }
                    392:             break;
                    393:     }
                    394:     data->eventlevels--;
                    395:     if (data->needsfreeing && data->eventlevels == 0) {
                    396:        XtClearEventHandlers(data->dpy, data->mywin);
                    397:        (void) XDeleteContext(data->dpy, data->mywin, widgetContext);
                    398:         XtFree((char*)data->text);
                    399:         XtFree((char *) data);
                    400:     }
                    401: 
                    402:     return (XteventHandled);
                    403: }
                    404: 
                    405: /*
                    406:  *
                    407:  * Widget hilight event handler
                    408:  *
                    409:  */
                    410: 
                    411: static void Highlight(data)
                    412: WidgetData data;
                    413: {
                    414:     data->highlighted = TRUE;
                    415:     Redisplay(data);
                    416: }
                    417: 
                    418: /*
                    419:  *
                    420:  * Widget un-hilight event handler
                    421:  *
                    422:  */
                    423: 
                    424: static void UnHighlight(data)
                    425: WidgetData data;
                    426: {
                    427:     data->highlighted = FALSE;
                    428:     Redisplay(data);
                    429: }
                    430: 
                    431: /*
                    432:  *
                    433:  * Widget set event handler
                    434:  *
                    435:  */
                    436: 
                    437: static void Set(data)
                    438: WidgetData data;
                    439: {
                    440:     data->set = TRUE;
                    441:     Redisplay(data);
                    442: }
                    443: 
                    444: /*
                    445:  *
                    446:  * Widget un-set event handler
                    447:  *
                    448:  */
                    449: 
                    450: static void UnSet(data)
                    451: WidgetData data;
                    452: {
                    453:     data->set = FALSE;
                    454:     Redisplay(data);
                    455: }
                    456: 
                    457: /*
                    458:  *
                    459:  * Widget notify event handler
                    460:  *
                    461:  */
                    462: 
                    463: static void Notify(data)
                    464: WidgetData data;
                    465: {
                    466:     data->notifying = TRUE;
                    467:     XFlush(data->dpy);
                    468:     data->proc(data->tag);
                    469:     data->notifying = FALSE;
                    470: }
                    471: 
                    472: /*
                    473:  *
                    474:  * Destroy the widget; the window's been destroyed already.
                    475:  *
                    476:  */
                    477: 
                    478: static void Destroy(data)
                    479:     WidgetData data;
                    480: {
                    481:     data->needsfreeing = TRUE;
                    482: }
                    483: 
                    484: /****************************************************************
                    485:  *
                    486:  * Public Procedures
                    487:  *
                    488:  ****************************************************************/
                    489: 
                    490: Window XtCommandCreate(dpy, parent, args, argCount)
                    491:     Display  *dpy;
                    492:     Window   parent;
                    493:     ArgList  args;
                    494:     int      argCount;
                    495: {
                    496:     WidgetData data;
                    497:     XrmNameList  names;
                    498:     XrmClassList       classes;
                    499:     Drawable   root;
                    500:     Position x, y;
                    501:     unsigned int depth;
                    502:     unsigned long valuemask;
                    503:     XSetWindowAttributes wvals;
                    504: 
                    505:     static XtActionsRec actionsTable[] = {
                    506:         {"set",                (caddr_t)Set},
                    507:         {"unset",      (caddr_t)UnSet},
                    508:         {"highlight",  (caddr_t)Highlight},
                    509:         {"unhighlight",        (caddr_t)UnHighlight},
                    510:         {"notify",     (caddr_t)Notify},
                    511:         {NULL, NULL}
                    512:     };
                    513: 
                    514:     if (!initialized) CommandInitialize ();
                    515: 
                    516:     data = (WidgetData) XtMalloc (sizeof (WidgetDataRec));
                    517: 
                    518:     /* Set Default Values */
                    519:     globaldata = globalinit;
                    520:     globaldata.dpy = dpy;
                    521:     XtGetResources(dpy, resources, XtNumber(resources), args, argCount, parent,
                    522:        "command", "Command", &names, &classes);
                    523:     *data = globaldata;
                    524: 
                    525:     data->state = (TranslationPtr) XtSetActionBindings(
                    526:        data->dpy,
                    527:        data->eventTable, actionsTable, (caddr_t) Ignore);
                    528: 
                    529:     if (data->fontstruct == NULL)
                    530:        data->fontstruct = globalinit.fontstruct =
                    531:            XLoadQueryFont(data->dpy, "variable");
                    532: 
                    533:     if (data->text == NULL)
                    534:        data->text = XrmNameToAtom(names[XrmNameListLength(names) - 1]);
                    535:     data->text = strcpy( XtMalloc ((unsigned) strlen(data->text) + 1),
                    536:                         data->text);
                    537: 
                    538:     /* obtain text dimensions and calculate the window size */
                    539:     SetTextWidthAndHeight(data);
                    540:     if (data->width == 0) data->width = data->twidth + 2*data->ibw;
                    541:     if (data->height == 0) data->height = data->theight + 2*data->ibh;
                    542: 
                    543:     wvals.background_pixel = data->bgpixel;
                    544:     wvals.border_pixel = data->brpixel;
                    545:     wvals.bit_gravity = CenterGravity;
                    546:     
                    547:     valuemask = CWBackPixel | CWBorderPixel | CWBitGravity;
                    548:     
                    549:     if (data->mywin != NULL) {
                    550:        /* set global data from window parameters */
                    551:        if (XGetGeometry(data->dpy, data->mywin, &root, &x, &y,
                    552:                          &(data->width), &(data->height), &(data->borderWidth),
                    553:                          &depth)) {
                    554:            XReparentWindow(data->dpy, data->mywin, parent, data->x,data->y);
                    555:            XChangeWindowAttributes(data->dpy, data->mywin,
                    556:                                    valuemask, &wvals);
                    557:        } else
                    558:            data->mywin = NULL;
                    559:     }
                    560:     if (data->mywin == NULL)
                    561:        data->mywin = XCreateWindow(data->dpy, parent, data->x, data->y,
                    562:                         data->width, data->height, data->borderWidth,
                    563:                         0, InputOutput, (Visual *)CopyFromParent,
                    564:                         valuemask, &wvals);
                    565: 
                    566:     BuildGcs(data);
                    567: 
                    568:     XtSetNameAndClass(data->dpy, data->mywin, names, classes);
                    569:     XrmFreeNameList(names);
                    570:     XrmFreeClassList(classes);
                    571: 
                    572:     (void)XSaveContext(data->dpy, data->mywin, widgetContext, (caddr_t) data);
                    573: 
                    574:     /* set handler for expose, resize, and message events */
                    575:     /* HACK -- translation mgr should somehow do the event selection, not us! */
                    576:      XtSetEventHandler (data->dpy, data->mywin, (XtEventHandler)EventHandler,
                    577:                          StructureNotifyMask | ExposureMask | ButtonPressMask
                    578:                          | ButtonReleaseMask | EnterWindowMask
                    579:                          | LeaveWindowMask | KeyPressMask,
                    580:                          (caddr_t)data);
                    581: 
                    582:     return (data->mywin);
                    583: }
                    584: 
                    585: 
                    586: /*
                    587:  * Get Attributes
                    588:  */
                    589: 
                    590: void XtCommandGetValues(dpy, window, args, argCount)
                    591: Display *dpy;
                    592: Window window;
                    593: ArgList args;
                    594: int argCount;
                    595: {
                    596:     WidgetData data;
                    597:     data = DataFromWindow(dpy, window);
                    598:     if (data) {
                    599:        globaldata = *data;
                    600:        XtGetValues(resources, XtNumber(resources), args, argCount);
                    601:     }
                    602: }
                    603: 
                    604: 
                    605: 
                    606: /*
                    607:  * Set Attributes
                    608:  */
                    609: 
                    610: void XtCommandSetValues(dpy, window, args, argCount)
                    611: Display *dpy;
                    612: Window window;
                    613: ArgList args;
                    614: int argCount;
                    615: {
                    616:     WidgetData data;
                    617:     data = DataFromWindow(dpy, window);
                    618:     if (data == NULL) return;
                    619: 
                    620:     globaldata = *data;
                    621:     XtSetValues(resources, XtNumber(resources), args, argCount);
                    622: 
                    623:     if (strcmp (data->text, globaldata.text)
                    624:          || data->fontstruct != globaldata.fontstruct) {
                    625:        XtGeometryReturnCode reply;
                    626:        WindowBox reqbox, replybox;
                    627: 
                    628:        globaldata.text = strcpy(
                    629:            XtMalloc ((unsigned) strlen(globaldata.text) + 1),
                    630:            globaldata.text);
                    631:         XtFree ((char *) data->text);
                    632: 
                    633:        /* obtain text dimensions and calculate the window size */
                    634:        SetTextWidthAndHeight(&globaldata);
                    635:        reqbox.width = globaldata.twidth + 2*globaldata.ibw;
                    636:        reqbox.height = globaldata.theight + 2*globaldata.ibh;
                    637:        reply = XtMakeGeometryRequest(globaldata.dpy, globaldata.mywin, XtgeometryResize, 
                    638:                                      &reqbox, &replybox);
                    639:        if (reply == XtgeometryAlmost) {
                    640:            reqbox = replybox;
                    641:            (void) XtMakeGeometryRequest(globaldata.dpy, globaldata.mywin, XtgeometryResize, 
                    642:                                         &reqbox, &replybox);
                    643:        }
                    644:     }
                    645: 
                    646:     if (data->fgpixel != globaldata.fgpixel ||
                    647:        data->bgpixel != globaldata.bgpixel ||
                    648:        data->fontstruct != globaldata.fontstruct) BuildGcs(&globaldata);
                    649:     *data = globaldata;
                    650:     if (!data->sensitive) data->set = data->highlighted = FALSE;
                    651:     Redisplay (data);
                    652: }
                    653: 

unix.superglobalmegacorp.com

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