void _XtAddCallbackOnce( register InternalCallbackList*callbacks, XtCallbackProc callback, XtPointer closure) { register XtCallbackList cl = ToList(*callbacks); register int i; for (i=(*callbacks)->count; --i >= 0; cl++) if (cl->callback == callback && cl->closure == closure) return; _XtAddCallback(callbacks, callback, closure); } /* _XtAddCallbackOnce */
XtBlockHookId XtAppAddBlockHook( XtAppContext app, XtBlockHookProc proc, XtPointer closure) { BlockHook hook = XtNew(BlockHookRec); LOCK_APP(app); hook->next = app->block_hook_list; hook->app = app; hook->proc = proc; hook->closure = closure; if (app->block_hook_list == NULL) { _XtAddCallback( &app->destroy_callbacks, FreeBlockHookList, (XtPointer)&app->block_hook_list ); } app->block_hook_list = hook; UNLOCK_APP(app); return (XtBlockHookId)hook; }
void XtAddCallback( Widget widget, _Xconst char* name, XtCallbackProc callback, XtPointer closure ) { InternalCallbackList *callbacks; Widget hookobj; XtAppContext app = XtWidgetToApplicationContext(widget); LOCK_APP(app); callbacks = FetchInternalList(widget, name); if (!callbacks) { XtAppWarningMsg(app, XtNinvalidCallbackList,XtNxtAddCallback,XtCXtToolkitError, "Cannot find callback list in XtAddCallback", (String *)NULL, (Cardinal *)NULL); UNLOCK_APP(app); return; } _XtAddCallback(callbacks, callback, closure); if (!_XtIsHookObject(widget)) { hookobj = XtHooksOfDisplay(XtDisplayOfObject(widget)); if (XtHasCallbacks(hookobj, XtNchangeHook) == XtCallbackHasSome) { XtChangeHookDataRec call_data; call_data.type = XtHaddCallback; call_data.widget = widget; call_data.event_data = (XtPointer) name; XtCallCallbackList(hookobj, ((HookObject)hookobj)->hooks.changehook_callbacks, (XtPointer)&call_data); } } UNLOCK_APP(app); } /* XtAddCallback */