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

1.1       root        1: /* $Header: Actions.c,v 1.1 87/09/11 07:57:01 toddb Exp $ */
                      2: #ifndef lint
                      3: static char *sccsid = "@(#)Actions.c   1.12    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: /* Actions.c -- parse all X events into widget specific actions. */
                     30: 
                     31: #include <stdio.h>
                     32: #include "Xlib.h"
                     33: #include "Xutil.h"
                     34: #include "Intrinsic.h"
                     35: #include <strings.h>
                     36: #include "Atoms.h"
                     37: 
                     38: /* Private definitions. */
                     39: 
                     40: #define NUMBUTTONS 3
                     41: #define NUMKEYS 256
                     42: #define HASH(x)        (((unsigned long)(x)) % NUMKEYS)
                     43: #define LF 0x0a
                     44: #define BSLASH '\\'
                     45: 
                     46: /* X10 Compatibility sillyness stuff (that should go away ...) */
                     47: 
                     48: #define MetaMask       Mod1Mask
                     49: 
                     50: typedef enum UpDown {down, up};
                     51:  
                     52: typedef struct _EventSeqRec {
                     53:     unsigned long eventCode;
                     54:     unsigned long eventType;
                     55:     short modeBits, modeMask;
                     56:     XtActionTokenPtr token;
                     57:     struct _EventSeqRec *next;
                     58: } EventSeqRec, *EventSeqPtr;
                     59: 
                     60: typedef struct _TranslationRec {
                     61:     XContext    context;
                     62:     EventSeqPtr  *eventTable;
                     63:     XtActionsPtr actionTable;
                     64: } TranslationRec;
                     65: 
                     66: typedef struct {
                     67:     char       *event;
                     68:     XContext   context;
                     69:     short      mode;
                     70:     unsigned long eventType;
                     71: }EventKey, *EventKeys;
                     72: 
                     73: EventKey events[] = {
                     74:     {"Key",            NULL, 0,                KeyPress},
                     75:     {"Ctrl",           NULL, ControlMask,      KeyPress},
                     76:     {"Meta",           NULL, MetaMask,         KeyPress},
                     77:     {"Shift",          NULL, ShiftMask,        KeyPress},
                     78:     {"BtnDown",        NULL, 0,                ButtonPress},
                     79:     {"BtnUp",          NULL, 0,                ButtonRelease},
                     80:     {"PtrMoved",       NULL, 0,                MotionNotify},
                     81:     {"KeyPress",       NULL, 0,                KeyPress},
                     82:     {"KeyRelease",     NULL, 0,                KeyRelease},
                     83:     {"ButtonPress",    NULL, 0,                ButtonPress},
                     84:     {"ButtonRelease",  NULL, 0,                ButtonRelease},
                     85:     {"MouseMoved",     NULL, 0,                MotionNotify},
                     86:     {"MotionNotify",   NULL, 0,                MotionNotify},
                     87:     {"EnterWindow",    NULL, 0,                EnterNotify},
                     88:     {"LeaveWindow",    NULL, 0,                LeaveNotify},
                     89:     {"FocusIn",        NULL, 0,                FocusIn},
                     90:     {"FocusOut",       NULL, 0,                FocusOut},
                     91:     {"KeymapNotify",   NULL, 0,                KeymapNotify},
                     92:     {"Expose",                 NULL, 0,                Expose},
                     93:     {"GraphicsExpose",         NULL, 0,                GraphicsExpose},
                     94:     {"NoExpose",       NULL, 0,                NoExpose},
                     95:     {"VisibilityNotify",NULL, 0,               VisibilityNotify},
                     96:     {"CreateNotify",   NULL, 0,                CreateNotify},
                     97:     {"DestroyNotify",  NULL, 0,                DestroyNotify},
                     98:     {"UnmapNotify",    NULL, 0,                UnmapNotify},
                     99:     {"MapNotify",      NULL, 0,                MapNotify},
                    100:     {"MapRequest",     NULL, 0,                MapRequest},
                    101:     {"ReparentNotify",         NULL, 0,                ReparentNotify},
                    102:     {"ConfigureNotify", NULL, 0,               ConfigureNotify},
                    103:     {"ConfigureRequest",NULL, 0,               ConfigureRequest},
                    104:     {"GravityNotify",  NULL, 0,                GravityNotify},
                    105:     {"ResizeRequest",  NULL, 0,                ResizeRequest},
                    106:     {"CirculateNotify",        NULL, 0,                CirculateNotify},
                    107:     {"CirculateRequest",NULL, 0,               CirculateRequest},
                    108:     {"PropertyNotify", NULL, 0,                PropertyNotify},
                    109:     {"SelectionClear", NULL, 0,                SelectionClear},
                    110:     {"SelectionRequest",NULL, 0,               SelectionRequest},
                    111:     {"SelectionNotify",        NULL, 0,                SelectionNotify},
                    112:     {"ColormapNotify", NULL, 0,                ColormapNotify},
                    113:     {"ClientMessage",  NULL, 0,                ClientMessage},
                    114:     { NULL, NULL, NULL, NULL}
                    115: };
                    116: 
                    117: static Boolean initialized = FALSE;
                    118: static Boolean parseError;
                    119: 
                    120: void ActionsInitialize()
                    121: {
                    122:     int i;
                    123:     void CvtStringToEventBindings();
                    124: 
                    125:     if (initialized)
                    126:        return;
                    127:     initialized = TRUE;
                    128: 
                    129:     for (i = 0; events[i].event != NULL; i++)
                    130:          events[i].context = XAtomToContext(events[i].event);
                    131:     XrmRegisterTypeConverter(XrmRString, XtREventBindings,
                    132:                             CvtStringToEventBindings);
                    133: }
                    134: 
                    135: static int StrToNum(s)
                    136:     char *s;
                    137: {
                    138:     int base = 10;
                    139:     register int val = 0;
                    140:     register int c;
                    141:     if (*s == '0') {
                    142:        s++;
                    143:        if (*s == 'x' || *s == 'X') {
                    144:            base = 16;
                    145:            s++;
                    146:        } else
                    147:            base = 8;
                    148:     }
                    149:     while (*s)
                    150:         switch (c = *s++) {
                    151:            case '0':
                    152:            case '1':
                    153:            case '2':
                    154:            case '3':
                    155:            case '4':
                    156:            case '5':
                    157:            case '6':
                    158:            case '7':
                    159:                val = (val * base) + (c - '0');
                    160:                break;
                    161:            case '8':
                    162:            case '9':
                    163:                if (base < 10)
                    164:                        return -1;
                    165:                val = (val * base) + (c - '0');
                    166:                break;
                    167:            case 'a':
                    168:            case 'b':
                    169:            case 'c':
                    170:            case 'd':
                    171:            case 'e':
                    172:            case 'f':
                    173:                if (base != 16)
                    174:                        return -1;
                    175:                val = (val * base) + (c - 'a' + 10);
                    176:                break;
                    177:            case 'A':
                    178:            case 'B':
                    179:            case 'C':
                    180:            case 'D':
                    181:            case 'E':
                    182:            case 'F':
                    183:                if (base != 16)
                    184:                        return -1;
                    185:                val = (val * base) + (c - 'A' + 10);
                    186:                break;
                    187:            default:
                    188:                return -1;
                    189:        }
                    190:        return val;             
                    191: }
                    192: 
                    193: static Syntax(str)
                    194:     char *str;
                    195: {
                    196:     (void) fprintf(stderr,
                    197:      "Event Sequence description error (ignored): %s\n", str);
                    198: }
                    199: 
                    200: static EventSeqPtr *NewEventTable()
                    201: {
                    202:     EventSeqPtr *eventTable;
                    203:     int i;
                    204: 
                    205:     eventTable = (EventSeqPtr *) XtMalloc(sizeof(EventSeqPtr)* NUMKEYS);
                    206:     for (i = 0; i < NUMKEYS; i++)
                    207:        eventTable[i] = (EventSeqPtr) NULL;
                    208:     return eventTable;
                    209: }
                    210: 
                    211: static XtActionTokenPtr FindAction(list, modeBits, eventCode, eventType)
                    212:   EventSeqPtr list;
                    213:   short modeBits;
                    214:   register int eventCode, eventType;
                    215: {
                    216:     register EventSeqPtr ptr;
                    217: 
                    218:     for (ptr = list; ptr != NULL; ptr = ptr->next) {
                    219:         if ((ptr->eventCode == eventCode) &&
                    220:            (ptr->eventType == eventType) &&
                    221:             (ptr->modeBits == (modeBits & ptr->modeMask)))
                    222:            return ptr->token;
                    223:     }
                    224:     return NULL;
                    225: }
                    226: 
                    227: static MakeKeyOrButtonEntry(list, modeBits, modeMask, eventCode, eventType, token)
                    228:   EventSeqPtr *list;
                    229:   short modeBits, modeMask;
                    230:   unsigned long eventCode, eventType;
                    231:   XtActionTokenPtr token;
                    232: {
                    233:   register EventSeqPtr ptr;
                    234:   
                    235:   ptr = (EventSeqPtr) XtMalloc(sizeof(EventSeqRec));
                    236:   ptr->eventCode = eventCode;
                    237:   ptr->eventType = eventType;
                    238:   ptr->modeBits = modeBits;
                    239:   ptr->modeMask = modeMask;
                    240:   ptr->token = token;
                    241:   ptr->next = *list;
                    242:   *list = ptr;
                    243: }
                    244: 
                    245: static int ButtonMaskFromString(str)
                    246:   char *str;
                    247: {
                    248:     switch (StrToNum(str)) {
                    249:        case 1:
                    250:            return Button1Mask;
                    251:        case 2:
                    252:            return Button2Mask;
                    253:        case 3:
                    254:            return Button3Mask;
                    255:        case 4:
                    256:            return Button4Mask;
                    257:        case 5:
                    258:            return Button5Mask;
                    259:     }
                    260:     if (strcmp(str, "left") == 0) return Button1Mask;
                    261:     if (strcmp(str, "middle") == 0) return Button2Mask;
                    262:     if (strcmp(str, "right") == 0) return Button3Mask;
                    263: 
                    264:     return 0;
                    265: }
                    266: 
                    267: static int ButtonFromString(str)
                    268:   char *str;
                    269: {
                    270:     switch (ButtonMaskFromString(str)) {
                    271:        case Button1Mask:
                    272:            return Button1;
                    273:        case Button2Mask:
                    274:            return Button2;
                    275:        case Button3Mask:
                    276:            return Button3;
                    277:        case Button4Mask:
                    278:            return Button4;
                    279:        case Button5Mask:
                    280:            return Button5;
                    281:     }
                    282: 
                    283:     parseError = TRUE;
                    284:     return 0;
                    285: }
                    286: 
                    287: /*
                    288: static StringToToken(table, str, token)
                    289:   XtActionsPtr table;
                    290:   char *str;
                    291:   int *token;
                    292: {
                    293:     register XtActionsPtr tab = table;
                    294:     while (tab->string) {
                    295:        if (strcmp(tab->string, str) == 0) {
                    296:            *token = tab->value;
                    297:            return TRUE;
                    298:        }
                    299:        tab++;
                    300:     }
                    301:     return FALSE;
                    302: }
                    303: */
                    304: 
                    305: static Boolean ParseChar(s, c)
                    306:   char **s;
                    307:   char *c;
                    308: {
                    309:     Boolean result = FALSE;
                    310:     register char *ptr;
                    311: 
                    312:     ptr = *s;
                    313:     *c = *ptr++;
                    314:     if (*c == '\\') {
                    315:        result = TRUE;
                    316:        *c = *ptr++;
                    317:        switch (*c) {
                    318:            case 't': *c = '\t';        break;
                    319:            case 'n': *c = '\n';        break;
                    320:            case 'r': *c = '\r';        break;
                    321:            case 'e': *c = '\033';      break;
                    322:        }
                    323:        if (*c >= '0' && *c <= '9') {
                    324:            *c = (*c - '0') * 64 + (ptr[0] - '0') * 8 + ptr[1] - '0';
                    325:            ptr += 2;
                    326:        }
                    327:     }
                    328:     *s = ptr;
                    329:     return result;
                    330: }
                    331: 
                    332: 
                    333: static ParseEventSequenceBinding(str, tbl)
                    334:   char *str;
                    335:   EventSeqPtr *tbl;
                    336: {
                    337:     char    str2[500], modeStr[50], typeStr[50],  detailStr[50];
                    338:     char   *ptr, *ptr2, c;
                    339:     Boolean backSlash;
                    340:     int     modeBits, modeMask, i, code;
                    341:     Boolean notFlag, done;
                    342:     XtActionTokenPtr tok, lasttok, firsttok;
                    343:     unsigned long   eventType;
                    344:     XContext eventContext;
                    345: 
                    346:     ptr = str;
                    347:     modeStr[0] = 0;
                    348:     typeStr[0] = 0;
                    349:     detailStr[0] = 0;
                    350:     parseError = FALSE;
                    351:     ptr2 = modeStr;
                    352:     while (*ptr != ':') {      /* find end of lhs  and collect pieces */
                    353:        switch (*ptr) {
                    354:            case 0: 
                    355:            case LF: 
                    356:                Syntax(str);
                    357:                return;
                    358: 
                    359:            case BSLASH: 
                    360:                ptr++;
                    361:                *ptr2++ = *ptr++;
                    362:                break;
                    363:            case '<': 
                    364:                *ptr2 = 0;
                    365:                ptr2 = typeStr;
                    366:                ptr++;
                    367:                break;
                    368:            case '>': 
                    369:                *ptr2 = 0;
                    370:                ptr2 = detailStr;
                    371:                ptr++;
                    372:                break;
                    373:            default: 
                    374:                *ptr2++ = *ptr++;
                    375:        }
                    376:     }
                    377:     *ptr2 = 0;
                    378:     ptr++;                     /* step over ':' */
                    379:  /* process mode flags */
                    380:     ptr2 = modeStr;
                    381:     notFlag = FALSE;
                    382:     code = 0;
                    383:     modeBits = 0;
                    384:     modeMask = 0;
                    385:     while (*(ptr2)) {
                    386:        switch (*ptr2) {
                    387:            case '~': 
                    388:                notFlag = TRUE;
                    389:                break;
                    390:            case 'c':
                    391:                modeMask |= ControlMask;
                    392:                if (notFlag)
                    393:                    modeBits &= ~ControlMask;
                    394:                else
                    395:                    modeBits |= ControlMask;
                    396:                notFlag = FALSE;
                    397:                break;
                    398:            case 'm': 
                    399:                modeMask |= MetaMask;
                    400:                if (notFlag)
                    401:                    modeBits &= ~MetaMask;
                    402:                else
                    403:                    modeBits |= MetaMask;
                    404:                notFlag = FALSE;
                    405:                break;
                    406:            case 's': 
                    407:                modeMask |= ShiftMask;
                    408:                if (notFlag)
                    409:                    modeBits &= ~ShiftMask;
                    410:                else
                    411:                    modeBits |= ShiftMask;
                    412:                notFlag = FALSE;
                    413:                break;
                    414:            case 'l': 
                    415:                modeMask |= LockMask;
                    416:                if (notFlag)
                    417:                    modeBits &= ~LockMask;
                    418:                else
                    419:                    modeBits |= LockMask;
                    420:                notFlag = FALSE;
                    421:                break;
                    422:            case '1':
                    423:            case '2':
                    424:            case '3':
                    425:            case '4':
                    426:            case '5':
                    427:                str2[0] = *ptr2;
                    428:                str2[1] = '\0';
                    429:                i = ButtonMaskFromString(str2);
                    430:                modeMask |= i;
                    431:                if (notFlag)
                    432:                    modeBits &= ~i;
                    433:                else
                    434:                    modeBits |= i;
                    435:                break;
                    436: 
                    437:            default: 
                    438:                Syntax (str);
                    439:                return;
                    440: 
                    441:        }
                    442:        ptr2++;
                    443:     }
                    444:     if (detailStr[0] >= '0' && detailStr[0] <= '9')
                    445:        code = StrToNum (detailStr);
                    446:  /* check for valid event type and set detail */
                    447:     eventType = 0;
                    448:     eventContext = XAtomToContext(typeStr);
                    449:     for (i = 0; events[i].event != NULL; i++) {
                    450:         if (events[i].context == eventContext) {
                    451:            modeBits |= events[i].mode;
                    452:            modeMask |= events[i].mode;
                    453:            eventType = events[i].eventType;
                    454:            break;
                    455:        }
                    456:     }
                    457:     switch (eventType) {
                    458:         case KeyPress:
                    459:        case KeyRelease:
                    460:            if (detailStr[0] >= '0' && detailStr[0] <= '9')
                    461:                 code = StrToNum (detailStr);
                    462:            else code = (detailStr[0] >= 'A' && detailStr[0] <= 'Z') ?
                    463:                                (detailStr[0] + 'a' - 'A') : detailStr[0];
                    464:            break;
                    465:         case ButtonPress:
                    466:              code = ButtonFromString (detailStr);
                    467:              break;
                    468:         case ButtonRelease:
                    469:             code = ButtonFromString (detailStr);
                    470:             break;
                    471:         case MotionNotify:
                    472:             code = 0;
                    473:              modeBits |= ButtonMaskFromString(detailStr);
                    474:             modeMask |= ButtonMaskFromString(detailStr);
                    475:              break;
                    476:         case 0:
                    477:              Syntax(str);
                    478:             return;
                    479:     }
                    480:     done = FALSE;
                    481:     lasttok = NULL;
                    482:     firsttok = NULL;
                    483:  /* now process rhs */
                    484:     while (*ptr) {
                    485:        tok = (XtActionTokenPtr) XtMalloc (sizeof (XtActionTokenRec));
                    486:        tok->next = NULL;
                    487:        while (*ptr == ' ' || *ptr == '\t')
                    488:            ptr++;
                    489:        switch (*ptr) {
                    490:            case '\n': 
                    491:            case '#':
                    492:            case 0: 
                    493:                done = TRUE;
                    494:                XtFree ((char *) tok);
                    495:                break;
                    496:            case '\'': 
                    497:                ptr++;
                    498:                (void) ParseChar (&ptr, &c);
                    499:                if (*ptr != '\'') {
                    500:                    Syntax (str);
                    501:                    return;
                    502:                }
                    503:                tok->type = XttokenChar;
                    504:                tok->value.c = c;
                    505:                ptr++;
                    506:                break;
                    507:            case '"': 
                    508:                ptr++;
                    509:                ptr2 = str2;
                    510:                while (1) {
                    511:                    backSlash = ParseChar (&ptr, ptr2);
                    512:                    if (!backSlash && *ptr2 == '"')
                    513:                        break;
                    514:                    if (!backSlash && *ptr2 == '\n') {
                    515:                        Syntax (str);
                    516:                        return;
                    517:                    }
                    518:                    ptr2++;
                    519:                }
                    520:                *ptr2 = 0;
                    521:                tok->type = XttokenString;
                    522:                tok->value.str =
                    523:                 strcpy (XtMalloc ((unsigned) strlen (str2) + 1), str2);
                    524:                break;
                    525:            default: 
                    526:                ptr2 = str2;
                    527:                do {
                    528:                    (void) ParseChar (&ptr, ptr2);
                    529:                    c = *ptr2++;
                    530:                } while (c != ' ' && c != '\t' && c != '\n' && c != 0);
                    531:                *--ptr2 = 0;
                    532:                tok->type = XttokenAction;
                    533:                tok->value.action = XtAtomToAction (str2);
                    534:        }
                    535:        if (!done && tok) {
                    536:            if (lasttok)
                    537:                lasttok->next = tok;
                    538:            else
                    539:                firsttok = tok;
                    540:            lasttok = tok;
                    541:        }
                    542:     }
                    543:  /* set action based on eventType */
                    544:     if (parseError)
                    545:        Syntax(str);
                    546:     else
                    547:        MakeKeyOrButtonEntry (&tbl[HASH(code)], modeBits, modeMask,
                    548:                              code, eventType, firsttok);
                    549: 
                    550: }
                    551: 
                    552: /*ARGSUSED*/
                    553: void CvtStringToEventBindings(dpy, fromVal, toVal)
                    554:   Display      *dpy;
                    555:   XrmValue     fromVal;
                    556:   XrmValue     *toVal;
                    557: {
                    558:     FILE *fid;
                    559:     char str[1024];
                    560:     static EventSeqPtr *eventTable; /* ||| STATIC */
                    561:     extern char *getenv();
                    562: 
                    563:     (void) sprintf (str, "%s/%s", getenv ("HOME"), (char *) fromVal.addr);
                    564:     fid = fopen (str, "r");
                    565:     if (fid == NULL) {
                    566:         (void) strcpy (str, LIBDIR);
                    567:         (void) strcat (str, (char *) fromVal.addr);
                    568:        fid = fopen (str, "r");
                    569:        if (fid == NULL) {
                    570:            (void) fprintf (stderr,
                    571:             " Can't find Event Bindings file: %s, using defaults\n",
                    572:             fromVal.addr);
                    573:            return;
                    574:        }
                    575:     }
                    576:     eventTable = NewEventTable();
                    577:     while (!feof (fid)) {
                    578:        (void) fgets (str, 1020, fid);
                    579:        if (str[0] != '#')
                    580:            ParseEventSequenceBinding(str, eventTable);
                    581:     }
                    582:     (void) fclose(fid);
                    583:     (*toVal).size = sizeof(caddr_t);
                    584:     (*toVal).addr = (caddr_t) &eventTable;
                    585: }
                    586: 
                    587: /* Public routines. */
                    588: 
                    589: XtEventsPtr XtParseEventBindings(stringTable)
                    590:   register char **stringTable;
                    591: {
                    592:     register int i = 0;
                    593:     register EventSeqPtr *eventTable;
                    594: 
                    595:     eventTable = NewEventTable();
                    596:     while (stringTable[i]) {
                    597:         ParseEventSequenceBinding(stringTable[i], eventTable);
                    598:        i++;
                    599:     }
                    600:     return (XtEventsPtr)eventTable;
                    601: }
                    602: 
                    603: caddr_t XtSetActionBindings(dpy, eventTable, actionTable, defaultValue)
                    604:     Display    *dpy;
                    605:     XtEventsPtr  eventTable;
                    606:     register XtActionsPtr actionTable;
                    607:     caddr_t     defaultValue;
                    608: {
                    609:     register XContext context;
                    610:     register TranslationPtr state;
                    611: 
                    612:     state = (TranslationPtr)XtMalloc(sizeof(TranslationRec));
                    613:     context = XUniqueContext();
                    614:     state->actionTable = actionTable;
                    615:     state->eventTable = (EventSeqPtr *) eventTable;
                    616:     while (actionTable->string) {
                    617:        (void) XSaveContext (
                    618:                dpy, (Window) XtAtomToAction (actionTable->string),
                    619:                context, (caddr_t) actionTable->value);
                    620:        actionTable++;
                    621:     }
                    622:     (void) XSaveContext (dpy, (Window) NULL, context, defaultValue);
                    623:     state->context = context;
                    624:     return (caddr_t) state;
                    625: }
                    626: 
                    627: XtActionTokenPtr XtTranslateEvent(event, state)
                    628:   register XEvent *event;
                    629:   TranslationPtr state;
                    630: {
                    631:     register XtActionTokenPtr result;
                    632:     static  XtActionTokenRec temp;
                    633:     static char str[1024];     /* !!! STATIC ||| */
                    634:     register int code;
                    635:     register int modeBits;
                    636:     int          n;
                    637:     
                    638:     result = NULL;
                    639:     code = 0;
                    640:     modeBits = 0;
                    641:     switch (event->type) {
                    642:        case KeyPress:
                    643:        case KeyRelease:
                    644:            code = XLookupKeysym(&event->xkey, 0);
                    645:            modeBits = event->xkey.state;
                    646:            break;
                    647:        case ButtonPress:
                    648:        case ButtonRelease:
                    649:            code = event->xbutton.button;
                    650:            modeBits = event->xbutton.state;
                    651:            break;
                    652:        case MotionNotify:
                    653:            modeBits = event->xmotion.state;
                    654:            break;
                    655:        case EnterNotify:
                    656:        case LeaveNotify:
                    657:            modeBits = event->xcrossing.state;
                    658:            break;
                    659:     }
                    660:     result = FindAction (state->eventTable[HASH(code)], modeBits, code, event->type);
                    661:     if (result == NULL &&
                    662:           (event->type == KeyPress || event->type == KeyRelease)) {
                    663:        n = XLookupString((XKeyEvent *)event, str, sizeof(str),
                    664:                          (KeySym *)NULL, (XComposeStatus *)NULL);
                    665:        if (n == 0)
                    666:            result = NULL;
                    667:        else {
                    668:            str[n] = 0;
                    669:            temp.value.str = str;
                    670:            temp.type = XttokenString;
                    671:            temp.next = NULL;
                    672:            result = &temp;
                    673:        }
                    674:     }
                    675:     return result;
                    676: }
                    677: 
                    678: 
                    679: caddr_t XtInterpretAction(dpy, state, action)
                    680:   Display *dpy;
                    681:   TranslationPtr state;
                    682:   XtAction action;
                    683: {
                    684:     caddr_t result;
                    685:     if (XFindContext(
                    686:        dpy, (Window) action, state->context, (caddr_t *) &result))
                    687:        (void) XFindContext(dpy, (Window) NULL, state->context,
                    688:                             (caddr_t *) &result);
                    689:     return result;
                    690: }
                    691: 
                    692: 
                    693: XtAddAction(dpy, context, string, action)
                    694:   Display *dpy;
                    695:   XContext context;
                    696:   char *string;
                    697:   int action;
                    698: {
                    699:     (void) XSaveContext(dpy, (Window) XAtomToContext(string),
                    700:                         context, (caddr_t) action);
                    701: }
                    702: 

unix.superglobalmegacorp.com

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