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

1.1       root        1: #ifndef lint
                      2: static char *sccsid = "@(#)Event.c     1.7     2/25/87";
                      3: #endif lint
                      4: 
                      5: /*
                      6:  * Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
                      7:  * 
                      8:  *                         All Rights Reserved
                      9:  * 
                     10:  * Permission to use, copy, modify, and distribute this software and its 
                     11:  * documentation for any purpose and without fee is hereby granted, 
                     12:  * provided that the above copyright notice appear in all copies and that
                     13:  * both that copyright notice and this permission notice appear in 
                     14:  * supporting documentation, and that the name of Digital Equipment
                     15:  * Corporation not be used in advertising or publicity pertaining to
                     16:  * distribution of the software without specific, written prior permission.  
                     17:  * 
                     18:  * 
                     19:  * DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
                     20:  * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
                     21:  * DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
                     22:  * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
                     23:  * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
                     24:  * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
                     25:  * SOFTWARE.
                     26:  */
                     27: 
                     28: #include "Xlib.h"
                     29: #include "Intrinsic.h"
                     30: #include "Xutil.h"
                     31: 
                     32: /* Private Definitions */
                     33: 
                     34: typedef struct _ProcRec {
                     35:     XtEventHandler          proc;
                     36:     unsigned long    mask;
                     37:     caddr_t         data;
                     38:     struct _ProcRec  *next;
                     39: } ProcRec, *ProcPtr;
                     40: 
                     41: typedef struct {
                     42:     Display       *dpy;
                     43:     Window        window;
                     44:     ProcPtr       firstproc;
                     45:     unsigned long  totalmask;
                     46:     Boolean        master;     /* True if this window is a child of root. */
                     47: } EventRec, *EventPtr;
                     48: 
                     49: static XContext eventContext;
                     50: static Boolean initialized = FALSE;
                     51: 
                     52: /* Private Routines */
                     53: 
                     54: void EventInitialize()
                     55: {
                     56:     if (initialized)
                     57:        return;
                     58:     initialized = TRUE;
                     59: 
                     60:     eventContext = XUniqueContext();
                     61: }
                     62: 
                     63: static EventPtr EventPtrFromWindow(dpy, w)
                     64: Display        *dpy;
                     65: Window w;
                     66: {
                     67:     EventPtr result;
                     68:     if (XFindContext(dpy, w, eventContext, (caddr_t *)&result) != XCNOENT)
                     69:         return(result);
                     70:     return(0);
                     71: }
                     72: 
                     73: /*
                     74:  * Delete the event handler reference in the dispatcher for this window.
                     75:  */
                     76: static void ResetEventHandler(dpy, w)
                     77: Display *dpy;
                     78: Window w;
                     79: {
                     80:     register EventPtr ctx;
                     81:     register ProcPtr p, p2;
                     82: 
                     83:     ctx = EventPtrFromWindow(dpy, w);
                     84:     if (!ctx)
                     85:          return;
                     86:     p = ctx->firstproc;
                     87:     while (p != NULL) {
                     88:        p2 = p->next;
                     89:        XtFree((char *) p);
                     90:        p = p2;
                     91:     }
                     92:     XtFree((char *)ctx);
                     93: 
                     94:     (void) XDeleteContext(dpy, w, eventContext);
                     95:     return;
                     96: }
                     97: 
                     98: static XtEventReturnCode CallProc(ctx, event)
                     99:     EventPtr ctx;
                    100:     XEvent *event;
                    101: {
                    102:     register EventPtr evp;
                    103:     EventPtr first;
                    104:     register ProcPtr p;
                    105:     register int nprocs, i;
                    106:     XtEventHandler procs[100]; /* We need to copy the procs into this */
                    107:                                /* local storage before calling any of */
                    108:                                /* them, because one of the calls */
                    109:                                /* could cause the ctx record to be */
                    110:                                /* destroyed! */
                    111:     caddr_t data[100];
                    112:     unsigned long kinds;
                    113:     XtEventReturnCode  result;
                    114:     XtEventReturnCode  finalresult = XteventNoHandler;
                    115: 
                    116:     static unsigned long masks[] = {
                    117:        0,                      /* No such event. */
                    118:        StructureNotifyMask,    /* MessageEvent (Faked by toolkit). */
                    119:        KeyPressMask,           /* KeyPress */
                    120:        KeyReleaseMask,         /* KeyRelease */
                    121:        ButtonPressMask,        /* ButtonPress */
                    122:        ButtonReleaseMask,      /* ButtonRelease */
                    123:        PointerMotionMask | PointerMotionHintMask | Button1MotionMask |
                    124:            Button2MotionMask | Button3MotionMask | Button4MotionMask |
                    125:                Button5MotionMask | ButtonMotionMask,
                    126:                                /* MotionNotify */
                    127:        EnterWindowMask,        /* EnterNotify */
                    128:        LeaveWindowMask,        /* LeaveNotify */
                    129:        FocusChangeMask,        /* FocusIn */
                    130:        FocusChangeMask,        /* FocusOut */
                    131:        KeymapStateMask,        /* KeymapNotify */
                    132:        ExposureMask,           /* Expose */
                    133:        ExposureMask,           /* GraphicsExpose */
                    134:        ExposureMask,           /* NoExpose */
                    135:        VisibilityChangeMask,   /* VisibilityNotify */
                    136:        0,                      /* CreateNotify */
                    137:        StructureNotifyMask,    /* DestroyNotify */
                    138:        StructureNotifyMask,    /* UnmapNotify */
                    139:        StructureNotifyMask,    /* MapNotify */
                    140:        0,                      /* MapRequest */
                    141:        StructureNotifyMask,    /* ReparentNotify */
                    142:        StructureNotifyMask,    /* ConfigureNotify */
                    143:        0,                      /* ConfigureRequest */
                    144:        StructureNotifyMask,    /* GravityNotify */
                    145:        0,                      /* ResizeRequest */
                    146:        StructureNotifyMask,    /* CirculateNotify */
                    147:        0,                      /* CirculateRequest */
                    148:        PropertyChangeMask,     /* PropertyNotify */
                    149:        StructureNotifyMask,    /* SelectionClear */
                    150:        StructureNotifyMask,    /* SelectionRequest */
                    151:        StructureNotifyMask,    /* SelectionNotify */
                    152:        ColormapChangeMask,     /* ColormapNotify */
                    153:        StructureNotifyMask,    /* ClientMessage */
                    154:        StructureNotifyMask     /* MappingNotify */
                    155:     };
                    156:        
                    157:     if (event->type >= LASTEvent) return(finalresult);
                    158: 
                    159:     kinds = masks[event->type];
                    160: 
                    161:     nprocs = 0;
                    162:     if (XFindContext(event->xany.display, (Window) 0,
                    163:                      eventContext, (caddr_t *)&first))
                    164:        first = ctx;
                    165:     for (evp = first; evp != NULL; evp = (evp == ctx) ? NULL : ctx) {
                    166:        for (p = evp->firstproc; p != NULL; p = p->next) {
                    167:            if (kinds & p->mask) {
                    168:                procs[nprocs] = p->proc;
                    169:                data[nprocs++] = p->data;
                    170:            }
                    171:        }
                    172:     }
                    173:     for (i=0 ; i<nprocs ; i++) {
                    174:        result = (*(procs[i]))(event, data[i]);
                    175:        if (finalresult != XteventHandled)
                    176:            finalresult = result;
                    177:     }
                    178:     return(finalresult);
                    179: }
                    180: 
                    181: 
                    182: /* Public routines */
                    183: 
                    184: /*
                    185:  * Dispatch an event to the appropriate subwindow.
                    186:  * Return a value indicating how the event was handled.
                    187:  */
                    188: XtEventReturnCode XtDispatchEvent(event)
                    189: XEvent *event;
                    190: {
                    191:     EventPtr ctx;
                    192:  
                    193:     if (XFindContext(event->xany.display, event->xany.window,
                    194:                      eventContext, (caddr_t *)&ctx) != 0)
                    195:         return XteventNoHandler;
                    196:     else
                    197:        return CallProc(ctx, event);
                    198: }
                    199: 
                    200: /*
                    201:  * Register an event handler "proc" for window "w" with the
                    202:  * event dispatcher for "eventMask" events.
                    203:  * Note that re-registering the same window and handler with
                    204:  * a new event mask OVERWRITES the previous eventMask for that
                    205:  * window/handler combination.
                    206:  */
                    207: void XtSetEventHandler(dpy, w, proc, eventMask, data)
                    208:     Display        *dpy;
                    209:     Window         w;
                    210:     XtEventHandler  proc;
                    211:     unsigned long   eventMask;
                    212:     caddr_t        data;
                    213: {
                    214:     register EventPtr ctx;
                    215:     register ProcPtr p, p2;
                    216:     register unsigned long totalmask;
                    217: 
                    218:     ctx = EventPtrFromWindow(dpy, w);
                    219:     if (ctx == NULL) {
                    220:         ctx = (EventPtr)XtMalloc(sizeof(EventRec));
                    221:        ctx->dpy = dpy;
                    222:         ctx->window = w;
                    223:         (void) XSaveContext(dpy, w, eventContext, (caddr_t)ctx);
                    224:         ctx->firstproc = NULL;
                    225:         ctx->totalmask = 0;
                    226:        ctx->master = FALSE;
                    227:     }
                    228:     totalmask = 0;
                    229:     p2 = NULL;
                    230:     p = ctx->firstproc;
                    231:     while (p != NULL && p->proc != proc) {
                    232:         totalmask |= p->mask;
                    233:         p2 = p;
                    234:         p = p->next;
                    235:     }
                    236:     if (p == NULL) {
                    237:         if (eventMask == 0)
                    238:             return;
                    239:         p = (ProcPtr)XtMalloc(sizeof(ProcRec));
                    240:         p->next = ctx->firstproc;
                    241:         ctx->firstproc = p;
                    242:         p->proc = proc;
                    243:     }
                    244:     if (eventMask) {
                    245:         p->mask = eventMask;
                    246:         p->data = data;
                    247:     }
                    248:     else {
                    249:         if (p2)
                    250:             p2->next = p->next;
                    251:         else
                    252:             ctx->firstproc = p->next;
                    253:         p2 = p;
                    254:         p = p->next;
                    255:         XtFree((char *)p2);
                    256:     }
                    257:     totalmask |= eventMask;
                    258:     for (; p != NULL; p = p->next)
                    259:         totalmask |= p->mask;
                    260:     if (totalmask != ctx->totalmask) {
                    261:         ctx->totalmask = totalmask;
                    262:         if (ctx->window) {
                    263:            if (!ctx->master) totalmask &= ~StructureNotifyMask;
                    264:             XSelectInput(dpy, w, totalmask);
                    265:        }
                    266:     }
                    267: }
                    268: 
                    269: void XtDeleteEventHandler(dpy, w, proc)
                    270:     Display       *dpy;
                    271:     Window         w;
                    272:     XtEventHandler proc;
                    273: {
                    274:     XtSetEventHandler(dpy, w, (XtEventHandler) proc, (unsigned long) 0, (caddr_t) NULL);
                    275: }
                    276: 
                    277: /* 
                    278:  * Make the given window be treated as a "master" window; that is, one that
                    279:  * is not a child of some other widget.
                    280:  */
                    281: 
                    282: void XtMakeMaster(dpy, w)
                    283:     Display *dpy;
                    284:     Window w;
                    285: {
                    286:     EventPtr ctx;
                    287:     XWMHints *hints;
                    288: 
                    289:     ctx = EventPtrFromWindow(dpy, w);
                    290:     if (ctx == NULL) {
                    291:         ctx = (EventPtr)XtMalloc(sizeof(EventRec));
                    292:         ctx->window = w;
                    293:         (void) XSaveContext(dpy, w, eventContext, (caddr_t)ctx);
                    294:         ctx->firstproc = NULL;
                    295:         ctx->totalmask = 0;
                    296:     } else XSelectInput(dpy, w, ctx->totalmask);
                    297:     ctx->master = TRUE;
                    298:     /* ||| Maybe the following stuff doesn't belong here.  It's just trying
                    299:        to tell the window manager that we handle our own focus.  -TW %%% */
                    300:     hints = XGetWMHints(dpy, w);
                    301:     if (hints == NULL) {
                    302:        hints = (XWMHints *) XtMalloc(sizeof(XWMHints));
                    303:        hints->flags = 0;
                    304:     }
                    305:     hints->flags |= InputHint;
                    306:     hints->input = FALSE;
                    307:     XSetWMHints(dpy, w, hints);
                    308:     XtFree(hints);
                    309: }
                    310: 
                    311: /*
                    312:  * Arrange to have the given procedure called whenever ANY event happens
                    313:  * that matches the given mask.
                    314:  */
                    315: void XtSetGlobalEventHandler(dpy, proc, eventMask, data)
                    316:     Display        *dpy;
                    317:     XtEventHandler  proc;
                    318:     unsigned long   eventMask;
                    319:     caddr_t        data;
                    320: {
                    321:     XtSetEventHandler(dpy, (Window) 0, (XtEventHandler) proc, eventMask, data);
                    322: }
                    323: 
                    324: void XtClearEventHandlers(dpy, window)
                    325:     Display *dpy;
                    326:     Window window;
                    327: {
                    328:     ResetEventHandler(dpy, window);
                    329:     (void) XtClearGeometryHandler(dpy, window);
                    330: }

unix.superglobalmegacorp.com

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