|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T e
Length: 28969 (0x7129) Types: TextFile Names: »extevent.diff«
└─⟦8648bda34⟧ Bits:30007244 EUUGD5_II: X11R5 └─⟦b23e377d7⟧ »./contrib-2/contrib-2.00« └─⟦0ed22c3ba⟧ └─⟦this⟧ »contrib/lib/Xt/extevent.diff«
*** old/Display.c --- /mit/lib/Xt/Display.c *************** *** 1,4 **** ! /* $XConsortium: Display.c,v 1.81 91/07/12 13:45:00 rws Exp $ */ /*********************************************************** Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts, --- 1,4 ---- ! /* $XConsortium: Display.c,v 1.81.1.1 91/08/27 18:05:30 swick Exp $ */ /*********************************************************** Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts, *************** *** 44,50 **** (XtAppContext)NULL, (XtAppContext)NULL, (ConverterTable)NULL, ! {(XtLanguageProc)NULL, (XtPointer)NULL} }; return &processContextRec; --- 44,51 ---- (XtAppContext)NULL, (XtAppContext)NULL, (ConverterTable)NULL, ! {(XtLanguageProc)NULL, (XtPointer)NULL}, ! (XtEventDispatchProc*)NULL }; return &processContextRec; *************** *** 293,298 **** --- 294,308 ---- app->process->appContextList = app; app->langProcRec.proc = app->process->globalLangProcRec.proc; app->langProcRec.closure = app->process->globalLangProcRec.closure; + if (app->process->globalDispatcherList) { + app->dispatcherList = + (XtEventDispatchProc*) XtMalloc(0x7f * + sizeof(XtEventDispatchProc)); + bcopy(app->process->globalDispatcherList, app->dispatcherList, + 0x7f * sizeof(XtEventDispatchProc)); + } + else app->dispatcherList = NULL; + app->destroy_callbacks = NULL; app->list = NULL; app->count = app->max = app->last = 0; *************** *** 347,352 **** --- 357,363 ---- while (app->workQueue) XtRemoveWorkProc((XtWorkProcId)app->workQueue); if (app->input_list) _XtRemoveAllInputs(app); XtFree((char*)app->destroy_list); + XtFree((char*)app->dispatcherList); _XtHeapFree(&app->heap); while (*prev_app != app) prev_app = &(*prev_app)->next; *prev_app = app->next; *** old/Event.c --- /mit/lib/Xt/Event.c *************** *** 1,4 **** ! /* $XConsortium: Event.c,v 1.134 91/08/26 14:20:42 swick Exp $ */ /*********************************************************** Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts, --- 1,4 ---- ! /* $XConsortium: Event.c,v 1.134.1.2 91/08/27 18:41:09 swick Exp $ */ /*********************************************************** Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts, *************** *** 34,39 **** --- 34,47 ---- #define Const /**/ #endif + typedef struct _XtEventRecExt { + int type; + XtPointer select_data[1]; /* actual dimension is [mask] */ + } XtEventRecExt; + + #define TYPE(p) (((XtEventRecExt*) ((p)+1))->type) + #define SELECT_DATA(p,n) (((XtEventRecExt*) ((p)+1))->select_data[n]) + #define NonMaskableMask ((EventMask)0x80000000L) /* *************** *** 60,66 **** EventMask mask = 0L; for (ev = widget->core.event_table; ev != NULL; ev = ev->next) ! if (ev->select) mask |= ev->mask; if (widget->core.widget_class->core_class.expose != NULL) mask |= ExposureMask; if (widget->core.widget_class->core_class.visible_interest) --- 68,86 ---- EventMask mask = 0L; for (ev = widget->core.event_table; ev != NULL; ev = ev->next) ! if (ev->select) { ! if (!ev->has_type_specifier) ! mask |= ev->mask; ! else if (TYPE(ev) < LASTEvent) { ! int i; ! for (i = 0; i < ev->mask; i++) ! if (SELECT_DATA(ev,i)) ! mask |= *(EventMask*)SELECT_DATA(ev,i); ! } ! /* %%% eventually, call a select routine here when ! * TYPE(ev) >= LASTEvent ! */ ! } if (widget->core.widget_class->core_class.expose != NULL) mask |= ExposureMask; if (widget->core.widget_class->core_class.visible_interest) *************** *** 72,100 **** } static void ! RemoveEventHandler(widget, eventMask, other, proc, closure, raw) Widget widget; ! EventMask eventMask; ! Boolean other; XtEventHandler proc; XtPointer closure; Boolean raw; { XtEventRec *p, **pp; ! EventMask oldMask = XtBuildEventMask(widget); if (raw) raw = 1; pp = &widget->core.event_table; while ((p = *pp) && ! (p->proc != proc || p->closure != closure || p->select == raw)) pp = &p->next; if (!p) return; /* un-register it */ ! eventMask &= ~NonMaskableMask; ! if (other) ! eventMask |= NonMaskableMask; ! p->mask &= ~eventMask; if (!p->mask) { /* delete it entirely */ *pp = p->next; --- 92,144 ---- } static void ! RemoveEventHandler(widget, select_data, type, has_type_specifier, other, ! proc, closure, raw) Widget widget; ! XtPointer select_data; ! Boolean has_type_specifier, other; XtEventHandler proc; XtPointer closure; Boolean raw; { XtEventRec *p, **pp; ! EventMask eventMask, oldMask = XtBuildEventMask(widget); if (raw) raw = 1; pp = &widget->core.event_table; while ((p = *pp) && ! (p->proc != proc || p->closure != closure || p->select == raw || ! has_type_specifier != p->has_type_specifier || ! (has_type_specifier && TYPE(p) != type))) pp = &p->next; if (!p) return; /* un-register it */ ! if (!has_type_specifier) { ! eventMask = *(EventMask*)select_data; ! eventMask &= ~NonMaskableMask; ! if (other) ! eventMask |= NonMaskableMask; ! p->mask &= ~eventMask; ! } ! else { ! int i; ! /* p->mask specifies count of SELECT_DATA(p) ! * search through the list of selection data, if not found ! * don't remove this handler ! */ ! for (i = 0; i < p->mask && select_data != SELECT_DATA(p,i);) i++; ! if (i == p->mask) return; ! if (p->mask == 1) ! p->mask = 0; ! else { ! p->mask--; ! while (i < p->mask) { ! SELECT_DATA(p,i) = SELECT_DATA(p,i+1); ! i++; ! } ! } ! } if (!p->mask) { /* delete it entirely */ *pp = p->next; *************** *** 127,162 **** */ static void ! AddEventHandler(widget, eventMask, other, proc, closure, position, force_new_position, raw) Widget widget; ! EventMask eventMask; ! Boolean other, force_new_position, raw; XtEventHandler proc; XtPointer closure; XtListPosition position; { register XtEventRec *p, **pp; ! EventMask oldMask; ! ! eventMask &= ~NonMaskableMask; ! if (other) ! eventMask |= NonMaskableMask; ! if (!eventMask) return; ! if (XtIsRealized(widget) && !raw) oldMask = XtBuildEventMask(widget); if (raw) raw = 1; pp = &widget->core.event_table; while ((p = *pp) && ! (p->proc != proc || p->closure != closure || p->select == raw)) pp = &p->next; if (!p) { /* New proc to add to list */ ! p = XtNew(XtEventRec); p->proc = proc; p->closure = closure; - p->mask = eventMask; p->select = ! raw; if (position == XtListHead) { --- 171,222 ---- */ static void ! AddEventHandler(widget, select_data, type, has_type_specifier, other, proc, closure, position, force_new_position, raw) Widget widget; ! XtPointer select_data; ! Boolean has_type_specifier, other, force_new_position, raw; XtEventHandler proc; XtPointer closure; XtListPosition position; { register XtEventRec *p, **pp; ! EventMask eventMask, oldMask; ! ! if (!has_type_specifier) { ! eventMask = *(EventMask*)select_data & ~NonMaskableMask; ! if (other) ! eventMask |= NonMaskableMask; ! if (!eventMask) return; ! } ! else if (!type) return; ! if (XtIsRealized(widget) && !raw) oldMask = XtBuildEventMask(widget); if (raw) raw = 1; pp = &widget->core.event_table; while ((p = *pp) && ! (p->proc != proc || p->closure != closure || p->select == raw || ! has_type_specifier != p->has_type_specifier || ! (has_type_specifier && TYPE(p) != type))) pp = &p->next; if (!p) { /* New proc to add to list */ ! if (has_type_specifier) { ! p = (XtEventRec*) XtMalloc(sizeof(XtEventRec) + ! sizeof(XtEventRecExt)); ! TYPE(p) = type; ! SELECT_DATA(p,0) = select_data; ! p->mask = 1; ! p->has_type_specifier = True; ! } ! else { ! p = (XtEventRec*) XtMalloc(sizeof(XtEventRec)); ! p->mask = eventMask; ! p->has_type_specifier = False; ! } p->proc = proc; p->closure = closure; p->select = ! raw; if (position == XtListHead) { *************** *** 174,179 **** --- 234,240 ---- if (position == XtListHead) { p->next = widget->core.event_table; widget->core.event_table = p; + pp = &widget->core.event_table; } else { /* * Find the last element in the list. *************** *** 185,192 **** } } ! /* update existing proc */ ! p->mask |= eventMask; } if (XtIsRealized(widget) && !raw) { --- 246,267 ---- } } ! if (! has_type_specifier) ! p->mask |= eventMask; ! else { ! int i; ! /* p->mask specifies count of SELECT_DATA(p) */ ! for (i = 0; i < p->mask && select_data != SELECT_DATA(p,i);) i++; ! if (i == p->mask) { ! p = (XtEventRec*) XtRealloc((char*)p, ! sizeof(XtEventRec) + ! sizeof(XtEventRecExt) + ! p->mask * sizeof(XtPointer)); ! SELECT_DATA(p,i) = select_data; ! p->mask++; ! *pp = p; ! } ! } } if (XtIsRealized(widget) && !raw) { *************** *** 215,221 **** XtPointer closure; #endif { ! RemoveEventHandler(widget, eventMask, other, proc, closure, FALSE); } #if NeedFunctionPrototypes --- 290,297 ---- XtPointer closure; #endif { ! RemoveEventHandler(widget, (XtPointer)&eventMask, 0, FALSE, ! other, proc, closure, FALSE); } #if NeedFunctionPrototypes *************** *** 235,241 **** XtPointer closure; #endif { ! AddEventHandler(widget, eventMask, other, proc, closure, XtListTail, FALSE, FALSE); } --- 311,317 ---- XtPointer closure; #endif { ! AddEventHandler(widget, (XtPointer)&eventMask, 0, FALSE, other, proc, closure, XtListTail, FALSE, FALSE); } *************** *** 258,264 **** XtListPosition position; #endif { ! AddEventHandler(widget, eventMask, other, proc, closure, position, TRUE, FALSE); } --- 334,340 ---- XtListPosition position; #endif { ! AddEventHandler(widget, (XtPointer)&eventMask, 0, FALSE, other, proc, closure, position, TRUE, FALSE); } *************** *** 279,285 **** XtPointer closure; #endif { ! RemoveEventHandler(widget, eventMask, other, proc, closure, TRUE); } #if NeedFunctionPrototypes --- 355,362 ---- XtPointer closure; #endif { ! RemoveEventHandler(widget, (XtPointer)&eventMask, 0, FALSE, ! other, proc, closure, TRUE); } #if NeedFunctionPrototypes *************** *** 301,307 **** XtListPosition position; #endif { ! AddEventHandler(widget, eventMask, other, proc, closure, position, TRUE, TRUE); } --- 378,384 ---- XtListPosition position; #endif { ! AddEventHandler(widget, (XtPointer)&eventMask, 0, FALSE, other, proc, closure, position, TRUE, TRUE); } *************** *** 322,331 **** XtPointer closure; #endif { ! AddEventHandler(widget, eventMask, other, proc, closure, XtListTail, FALSE, TRUE); } typedef struct _WWPair { struct _WWPair *next; Window window; --- 399,460 ---- XtPointer closure; #endif { ! AddEventHandler(widget, (XtPointer)&eventMask, 0, FALSE, other, proc, closure, XtListTail, FALSE, TRUE); } + #if NeedFunctionPrototypes + void XtRemoveEventTypeHandler( + Widget widget, + int type, + XtPointer select_data, + XtEventHandler proc, + XtPointer closure + ) + #else + void XtRemoveEventTypeHandler(widget, type, select_data, proc, closure) + Widget widget; + int type; + XtPointer select_data; + XtEventHandler proc; + XtPointer closure; + #endif + { + RemoveEventHandler(widget, select_data, type, TRUE, + FALSE, proc, closure, FALSE); + } + + #if NeedFunctionPrototypes + void XtAddEventTypeHandler( + Widget widget, + int type, + XtPointer select_data, + XtEventHandler proc, + XtPointer closure, + XtListPosition position + ) + #else + void XtAddEventTypeHandler(widget, type, select_data, proc, closure, position) + Widget widget; + int type; + XtPointer select_data; + XtEventHandler proc; + XtPointer closure; + XtListPosition position; + #endif + { + if (type >= LASTEvent && select_data) { + XtAppWarningMsg(XtWidgetToApplicationContext(widget), + "invalidData", "xtAddEventTypeHandler", + XtCXtToolkitError, + "XtAddEventTypeHandler requires select_data to be NULL for non-core events", + (String *) NULL, (Cardinal *) NULL); + } + + AddEventHandler(widget, select_data, type, TRUE, FALSE, + proc, closure, position, TRUE, FALSE); + } + typedef struct _WWPair { struct _WWPair *next; Window window; *************** *** 528,534 **** numprocs = 0; for (p=widget->core.event_table; p; p = p->next) { ! if (mask & p->mask) numprocs++; } if (numprocs > EHMAXSIZE) { --- 657,664 ---- numprocs = 0; for (p=widget->core.event_table; p; p = p->next) { ! if ((! p->has_type_specifier && (mask & p->mask)) || ! (p->has_type_specifier && event->type == TYPE(p))) numprocs++; } if (numprocs > EHMAXSIZE) { *************** *** 541,547 **** } numprocs = 0; for (p=widget->core.event_table; p; p = p->next) { ! if (mask & p->mask) { proc[numprocs] = p->proc; closure[numprocs] = p->closure; numprocs++; --- 671,679 ---- } numprocs = 0; for (p=widget->core.event_table; p; p = p->next) { ! if ((! p->has_type_specifier && (mask & p->mask)) || ! (p->has_type_specifier && event->type == TYPE(p))) { ! proc[numprocs] = p->proc; closure[numprocs] = p->closure; numprocs++; *************** *** 571,583 **** XtPerDisplay pd; { register XtEventRec *p; - XEvent nextEvent; Boolean was_dispatched = XtDidNothing; Boolean call_tm = XtDidNothing; - if (XFilterEvent(event, XtWindow(widget))) - return XtDidFilter; - if ( (mask == ExposureMask) || ((event->type == NoExpose) && NO_EXPOSE) || ((event->type == GraphicsExpose) && GRAPHICS_EXPOSE) ) { --- 703,711 ---- *************** *** 599,631 **** } } - if (mask == EnterWindowMask && - widget->core.widget_class->core_class.compress_enterleave) { - if (XPending(event->xcrossing.display)) { - XPeekEvent(event->xcrossing.display, &nextEvent); - if (nextEvent.type == LeaveNotify && - event->xcrossing.window == nextEvent.xcrossing.window && - event->xcrossing.subwindow == nextEvent.xcrossing.subwindow){ - /* skip the enter/leave pair */ - XNextEvent(event->xcrossing.display, &nextEvent); - return XtDidNothing; - } - } - } - - if (event->type == MotionNotify && - widget->core.widget_class->core_class.compress_motion) { - while (XPending(event->xmotion.display)) { - XPeekEvent(event->xmotion.display, &nextEvent); - if (nextEvent.type == MotionNotify && - event->xmotion.window == nextEvent.xmotion.window && - event->xmotion.subwindow == nextEvent.xmotion.subwindow) { - /* replace the current event with the next one */ - XNextEvent(event->xmotion.display, event); - } else break; - } - } - if ((mask == VisibilityChangeMask) && XtClass(widget)->core_class.visible_interest) { was_dispatched = XtDidDispatch; --- 727,732 ---- *************** *** 663,669 **** * call XtRemoveEventHandler, which would break our linked list. */ for (; p; p = p->next) { ! if (mask & p->mask) { if (numprocs >= EHSIZE) break; proc[numprocs] = p->proc; --- 764,772 ---- * call XtRemoveEventHandler, which would break our linked list. */ for (; p; p = p->next) { ! if ((! p->has_type_specifier && (mask & p->mask)) || ! (p->has_type_specifier && event->type == TYPE(p))) { ! if (numprocs >= EHSIZE) break; proc[numprocs] = p->proc; *************** *** 682,688 **** } was_dispatched = XtDidDispatch; } ! } else if (mask & p->mask) { was_dispatched = XtDidDispatch; (*p->proc)(widget, p->closure, event, &was_dispatched); was_dispatched = XtDidDispatch; --- 785,792 ---- } was_dispatched = XtDidDispatch; } ! } else if ((! p->has_type_specifier && (mask & p->mask)) || ! (p->has_type_specifier && event->type == TYPE(p))) { was_dispatched = XtDidDispatch; (*p->proc)(widget, p->closure, event, &was_dispatched); was_dispatched = XtDidDispatch; *************** *** 693,698 **** --- 797,812 ---- return (was_dispatched|call_tm); } + Boolean XtDispatchEventToWidget(widget, event) + Widget widget; + XEvent *event; + { + return (DispatchEvent(event, widget, + _XtConvertTypeToMask(event->xany.type), + _XtGetPerDisplay(event->xany.display)) + ? True : False); + } + /* * This structure is passed into the check exposure proc. */ *************** *** 951,956 **** --- 1065,1111 ---- return NULL; } + static Boolean DefaultDispatcher(event, widget, mask, pd) + XEvent *event; + Widget widget; + EventMask mask; + XtPerDisplay pd; + { + if (XFilterEvent(event, XtWindow(widget))) + return XtDidFilter; + + if (mask == EnterWindowMask && + widget->core.widget_class->core_class.compress_enterleave) { + if (XPending(event->xcrossing.display)) { + XEvent nextEvent; + XPeekEvent(event->xcrossing.display, &nextEvent); + if (nextEvent.type == LeaveNotify && + event->xcrossing.window == nextEvent.xcrossing.window && + event->xcrossing.subwindow == nextEvent.xcrossing.subwindow){ + /* skip the enter/leave pair */ + XNextEvent(event->xcrossing.display, &nextEvent); + return XtDidNothing; + } + } + } + + if (event->type == MotionNotify && + widget->core.widget_class->core_class.compress_motion) { + while (XPending(event->xmotion.display)) { + XEvent nextEvent; + XPeekEvent(event->xmotion.display, &nextEvent); + if (nextEvent.type == MotionNotify && + event->xmotion.window == nextEvent.xmotion.window && + event->xmotion.subwindow == nextEvent.xmotion.subwindow) { + /* replace the current event with the next one */ + XNextEvent(event->xmotion.display, event); + } else break; + } + } + + return DispatchEvent(event, widget, mask, pd); + } + typedef enum _GrabType {pass, ignore, remap} GrabType; static Boolean DecideToDispatch(event) *************** *** 965,976 **** XtPerDisplayInput pdi; XtGrabList grabList; - widget = XtWindowToWidget (event->xany.display, event->xany.window); pd = _XtGetPerDisplay(event->xany.display); - pdi = _XtGetPerDisplayInput(event->xany.display); - grabList = *_XtGetGrabList(pdi); - - mask = _XtConvertTypeToMask(event->xany.type); grabType = pass; switch (event->xany.type & 0x7f) { --- 1120,1126 ---- *************** *** 997,1002 **** --- 1147,1163 ---- if (time) pd->last_timestamp = time; + if (pd->appContext->dispatcherList) { + XtEventDispatchProc d; + if (d = pd->appContext->dispatcherList[event->xany.type & 0x7f]) + return (*d)(event); + } + + pdi = _XtGetPerDisplayInput(event->xany.display); + grabList = *_XtGetGrabList(pdi); + mask = _XtConvertTypeToMask(event->xany.type); + widget = XtWindowToWidget (event->xany.display, event->xany.window); + if (widget == NULL) { if (grabType != remap) return XFilterEvent(event, None); *************** *** 1003,1020 **** /* event occurred in a non-widget window, but we've promised also to dispatch it to the nearest accessible spring_loaded widget */ else if ((widget = LookupSpringLoaded(grabList)) != NULL) ! return DispatchEvent(event, widget, mask, pd); return XFilterEvent(event, None); } switch(grabType) { case pass: ! return DispatchEvent(event, widget, mask, pd); case ignore: if ((grabList == NULL || _XtOnGrabList(widget,grabList)) && XtIsSensitive(widget)) { ! return DispatchEvent(event, widget, mask, pd); } return XtDidNothing; --- 1164,1181 ---- /* event occurred in a non-widget window, but we've promised also to dispatch it to the nearest accessible spring_loaded widget */ else if ((widget = LookupSpringLoaded(grabList)) != NULL) ! return DefaultDispatcher(event, widget, mask, pd); return XFilterEvent(event, None); } switch(grabType) { case pass: ! return DefaultDispatcher(event, widget, mask, pd); case ignore: if ((grabList == NULL || _XtOnGrabList(widget,grabList)) && XtIsSensitive(widget)) { ! return DefaultDispatcher(event, widget, mask, pd); } return XtDidNothing; *************** *** 1030,1037 **** if ((grabList == NULL || _XtOnGrabList(dspWidget, grabList)) && XtIsSensitive(dspWidget)) { ! was_dispatched = DispatchEvent(event, dspWidget, ! mask, pd); if (was_dispatched & XtDidFilter) return was_dispatched; } --- 1191,1198 ---- if ((grabList == NULL || _XtOnGrabList(dspWidget, grabList)) && XtIsSensitive(dspWidget)) { ! was_dispatched = DefaultDispatcher(event, dspWidget, ! mask, pd); if (was_dispatched & XtDidFilter) return was_dispatched; } *************** *** 1042,1049 **** grabList = *_XtGetGrabList(pdi); widget = LookupSpringLoaded(grabList); if (widget != NULL && widget != dspWidget) { ! was_dispatched |= DispatchEvent(event, widget, ! mask, pd); } return was_dispatched; --- 1203,1210 ---- grabList = *_XtGetGrabList(pdi); widget = LookupSpringLoaded(grabList); if (widget != NULL && widget != dspWidget) { ! was_dispatched |= DefaultDispatcher(event, widget, ! mask, pd); } return was_dispatched; *************** *** 1274,1280 **** event.window = XtWindow(child); event.mode = NotifyNormal; event.detail = NotifyAncestor; ! DispatchEvent((XEvent*)&event, child, _XtConvertTypeToMask(type), ! _XtGetPerDisplay(XtDisplay(child))); } } --- 1435,1508 ---- event.window = XtWindow(child); event.mode = NotifyNormal; event.detail = NotifyAncestor; ! DefaultDispatcher((XEvent*)&event, child, _XtConvertTypeToMask(type), ! _XtGetPerDisplay(XtDisplay(child))); ! } ! } ! ! ! static XtEventDispatchProc* NewDispatcherList() ! { ! XtEventDispatchProc* l = ! (XtEventDispatchProc*) XtCalloc((Cardinal)0x7f, ! (Cardinal)sizeof(XtEventDispatchProc)); ! return l; ! } ! ! #if NeedFunctionPrototypes ! void XtSetEventDispatcher( ! XtAppContext app, ! int min_event_type, ! int max_event_type, ! XtEventDispatchProc proc ! ) ! #else ! void XtSetEventDispatcher(app, min_event_type, max_event_type, proc) ! register XtAppContext app; ! int min_event_type; ! int max_event_type; ! XtEventDispatchProc proc; ! #endif ! { ! ProcessContext pctx; ! XtEventDispatchProc *list; ! register int type; ! ! if (min_event_type > 0x7f || max_event_type > 0x7f) return; ! ! if (app) { ! list = app->dispatcherList; ! if (!list) { ! if (proc) ! list = app->dispatcherList = NewDispatcherList(); ! else ! return; ! } ! while (min_event_type <= max_event_type) ! list[min_event_type++] = proc; ! return; ! } ! ! /* no app context; do global list & all current contexts */ ! ! pctx = _XtGetProcessContext(); ! ! list = pctx->globalDispatcherList; ! if (!list && proc) ! list = pctx->globalDispatcherList = NewDispatcherList(); ! ! if (list && proc) ! for (type=min_event_type; type <= max_event_type;) ! list[type++] = proc; ! ! ! for (app=pctx->appContextList; app; app=app->next) { ! list = app->dispatcherList; ! if (!list && proc) ! list = app->dispatcherList = NewDispatcherList(); ! ! if (list && proc) ! for (type=min_event_type; type <= max_event_type;) ! list[type++] = proc; } } *** old/EventI.h --- /mit/lib/Xt/EventI.h *************** *** 1,4 **** ! /* $XConsortium: EventI.h,v 1.18 91/01/29 10:56:58 rws Exp $ */ /* $oHeader: EventI.h,v 1.3 88/08/24 09:21:11 asente Exp $ */ /*********************************************************** --- 1,4 ---- ! /* $XConsortium: EventI.h,v 1.18.1.1 91/08/27 18:07:30 swick Exp $ */ /* $oHeader: EventI.h,v 1.3 88/08/24 09:21:11 asente Exp $ */ /*********************************************************** *************** *** 61,70 **** typedef struct _XtEventRec { XtEventTable next; ! EventMask mask; XtEventHandler proc; XtPointer closure; unsigned int select:1; unsigned int async:1; /* not used, here for Digital extension? */ } XtEventRec; --- 61,71 ---- typedef struct _XtEventRec { XtEventTable next; ! EventMask mask; /* also select_data count for RecExt */ XtEventHandler proc; XtPointer closure; unsigned int select:1; + unsigned int has_type_specifier:1; unsigned int async:1; /* not used, here for Digital extension? */ } XtEventRec; *** /old/InitialI.h --- /mit/lib/Xt/InitialI.h *************** *** 1,4 **** ! /* $XConsortium: InitialI.h,v 1.61 91/07/12 12:33:51 rws Exp $ */ /*********************************************************** Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts, --- 1,4 ---- ! /* $XConsortium: InitialI.h,v 1.61.1.1 91/08/27 18:08:21 swick Exp $ */ /*********************************************************** Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts, *************** *** 104,109 **** --- 104,110 ---- XtAppContext appContextList; ConverterTable globalConverterTable; LangProcRec globalLangProcRec; + XtEventDispatchProc *globalDispatcherList; } ProcessContextRec, *ProcessContext; typedef struct { *************** *** 147,152 **** --- 148,154 ---- DestroyRec* destroy_list; Widget in_phase2_destroy; LangProcRec langProcRec; + XtEventDispatchProc *dispatcherList; } XtAppStruct; #ifdef XTTRACEMEMORY *** /old/Intrinsic.h --- /mit/lib/Xt/Intrinsic.h *************** *** 1,4 **** ! /* $XConsortium: Intrinsic.h,v 1.173 91/07/21 00:19:04 rws Exp $ */ /*********************************************************** Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts, --- 1,4 ---- ! /* $XConsortium: Intrinsic.h,v 1.173.1.1 91/08/27 18:08:53 swick Exp $ */ /*********************************************************** Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts, *************** *** 515,520 **** --- 515,526 ---- #endif ); + typedef Boolean (*XtEventDispatchProc)( + #if NeedFunctionPrototypes + XEvent* /* event */ + #endif + ); + /*************************************************************** * * Exported Interfaces *************** *** 1018,1023 **** --- 1024,1066 ---- XtEventHandler /* proc */, XtPointer /* closure */, XtListPosition /* position */ + #endif + ); + + extern void XtSetEventDispatcher( + #if NeedFunctionPrototypes + XtAppContext /* app */, + int /* min_event_type */, + int /* max_event_type */, + XtEventDispatchProc /* proc */ + #endif + ); + + extern Boolean XtDispatchEventToWidget( + #if NeedFunctionPrototypes + Widget /* widget */, + XEvent* /* event */ + #endif + ); + + extern void XtAddEventTypeHandler( + #if NeedFunctionPrototypes + Widget /* widget */, + int /* type */, + XtPointer /* select_data */, + XtEventHandler /* proc */, + XtPointer /* closure */, + XtListPosition /* position */ + #endif + ); + + extern void XtRemoveEventTypeHandler( + #if NeedFunctionPrototypes + Widget /* widget */, + int /* type */, + XtPointer /* select_data */, + XtEventHandler /* proc */, + XtPointer /* closure */ #endif );