|
|
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:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.