/* ARGSUSED */ static void AddCallbacks( Widget widget, InternalCallbackList *callbacks, XtCallbackList newcallbacks) { register InternalCallbackList icl; register int i, j; register XtCallbackList cl; icl = *callbacks; i = icl ? icl->count : 0; for (j=0, cl = newcallbacks; cl->callback; cl++, j++); if (icl && icl->call_state) { icl->call_state |= _XtCBFreeAfterCalling; icl = (InternalCallbackList) __XtMalloc(sizeof(InternalCallbackRec) + sizeof(XtCallbackRec) * (i+j)); (void) memmove((char *)ToList(*callbacks), (char *)ToList(icl), sizeof(XtCallbackRec) * i); } else { icl = (InternalCallbackList) XtRealloc((char *) icl, sizeof(InternalCallbackRec) + sizeof(XtCallbackRec) * (i+j)); } *callbacks = icl; icl->count = i+j; icl->is_padded = 0; icl->call_state = 0; for (cl = ToList(icl) + i; --j >= 0; ) *cl++ = *newcallbacks++; } /* AddCallbacks */
void _XtAddCallback( InternalCallbackList* callbacks, XtCallbackProc callback, XtPointer closure) { register InternalCallbackList icl; register XtCallbackList cl; register int count; icl = *callbacks; count = icl ? icl->count : 0; if (icl && icl->call_state) { icl->call_state |= _XtCBFreeAfterCalling; icl = (InternalCallbackList) __XtMalloc(sizeof(InternalCallbackRec) + sizeof(XtCallbackRec) * (count + 1)); (void) memmove((char *)ToList(icl), (char *)ToList(*callbacks), sizeof(XtCallbackRec) * count); } else { icl = (InternalCallbackList) XtRealloc((char *) icl, sizeof(InternalCallbackRec) + sizeof(XtCallbackRec) * (count + 1)); } *callbacks = icl; icl->count = count + 1; icl->is_padded = 0; icl->call_state = 0; cl = ToList(icl) + count; cl->callback = callback; cl->closure = closure; } /* _XtAddCallback */
void _XtRemoveCallback ( InternalCallbackList *callbacks, XtCallbackProc callback, XtPointer closure) { register InternalCallbackList icl; register int i, j; register XtCallbackList cl, ncl, ocl; icl = *callbacks; if (!icl) return; cl = ToList(icl); for (i=icl->count; --i >= 0; cl++) { if (cl->callback == callback && cl->closure == closure) { if (icl->call_state) { icl->call_state |= _XtCBFreeAfterCalling; if (icl->count == 1) { *callbacks = NULL; } else { j = icl->count - i - 1; ocl = ToList(icl); icl = (InternalCallbackList) __XtMalloc(sizeof(InternalCallbackRec) + sizeof(XtCallbackRec) * (i + j)); icl->count = i + j; icl->is_padded = 0; icl->call_state = 0; ncl = ToList(icl); while (--j >= 0) *ncl++ = *ocl++; while (--i >= 0) *ncl++ = *++cl; *callbacks = icl; } } else { if (--icl->count) { ncl = cl + 1; while (--i >= 0) *cl++ = *ncl++; icl = (InternalCallbackList) XtRealloc((char *) icl, sizeof(InternalCallbackRec) + sizeof(XtCallbackRec) * icl->count); icl->is_padded = 0; *callbacks = icl; } else { XtFree((char *) icl); *callbacks = NULL; } } return; } } } /* _XtRemoveCallback */
void XtCallCallbackList( Widget widget, XtCallbackList callbacks, XtPointer call_data) { register InternalCallbackList icl; register XtCallbackList cl; register int i; char ostate; WIDGET_TO_APPCON(widget); LOCK_APP(app); if (!callbacks) { UNLOCK_APP(app); return; } icl = (InternalCallbackList)callbacks; cl = ToList(icl); if (icl->count == 1) { (*cl->callback) (widget, cl->closure, call_data); UNLOCK_APP(app); return; } ostate = icl->call_state; icl->call_state = _XtCBCalling; for (i = icl->count; --i >= 0; cl++) (*cl->callback) (widget, cl->closure, call_data); if (ostate) icl->call_state |= ostate; else if (icl->call_state & _XtCBFreeAfterCalling) XtFree((char *)icl); else icl->call_state = 0; UNLOCK_APP(app); } /* XtCallCallbackList */
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 */
XtCallbackList _XtGetCallbackList( InternalCallbackList *callbacks) { register int i; register InternalCallbackList icl; register XtCallbackList cl, ocl; icl = *callbacks; if (!icl) { static XtCallbackRec emptyList[1] = { {NULL, NULL} }; return (XtCallbackList)emptyList; } if (icl->is_padded) return ToList(icl); i = icl->count; if (icl->call_state) { icl->call_state |= _XtCBFreeAfterCalling; ocl = ToList(icl); icl = (InternalCallbackList) __XtMalloc(sizeof(InternalCallbackRec) + sizeof(XtCallbackRec) * (i+1)); icl->count = i; icl->call_state = 0; cl = ToList(icl); while (--i >= 0) *cl++ = *ocl++; } else { icl = (InternalCallbackList) XtRealloc((char *)icl, sizeof(InternalCallbackRec) + sizeof(XtCallbackRec) * (i+1)); cl = ToList(icl) + i; } icl->is_padded = 1; cl->callback = (XtCallbackProc) NULL; cl->closure = NULL; *callbacks = icl; return ToList(icl); }
void XtCallCallbacks( Widget widget, _Xconst char* name, XtPointer call_data ) { InternalCallbackList *callbacks; InternalCallbackList icl; XtCallbackList cl; int i; char ostate; XtAppContext app = XtWidgetToApplicationContext(widget); LOCK_APP(app); callbacks = FetchInternalList(widget, name); if (!callbacks) { XtAppWarningMsg(app, XtNinvalidCallbackList,XtNxtCallCallback,XtCXtToolkitError, "Cannot find callback list in XtCallCallbacks", (String *)NULL, (Cardinal *)NULL); UNLOCK_APP(app); return; } icl = *callbacks; if (!icl) { UNLOCK_APP(app); return; } cl = ToList(icl); if (icl->count == 1) { (*cl->callback) (widget, cl->closure, call_data); UNLOCK_APP(app); return; } ostate = icl->call_state; icl->call_state = _XtCBCalling; for (i = icl->count; --i >= 0; cl++) (*cl->callback) (widget, cl->closure, call_data); if (ostate) icl->call_state |= ostate; else if (icl->call_state & _XtCBFreeAfterCalling) XtFree((char *)icl); else icl->call_state = ostate; UNLOCK_APP(app); } /* XtCallCallbacks */
void _XtPeekCallback( Widget widget, XtCallbackList callbacks, XtCallbackProc *callback, XtPointer *closure) { register InternalCallbackList icl = (InternalCallbackList) callbacks; register XtCallbackList cl; if (!callbacks) { *callback = (XtCallbackProc) NULL; return; } cl = ToList(icl); *callback = cl->callback; *closure = cl->closure; return; }
InternalCallbackList _XtCompileCallbackList( XtCallbackList xtcallbacks) { register int n; register XtCallbackList xtcl, cl; register InternalCallbackList callbacks; for (n=0, xtcl=xtcallbacks; xtcl->callback; n++, xtcl++) {}; if (n == 0) return (InternalCallbackList) NULL; callbacks = (InternalCallbackList) __XtMalloc(sizeof(InternalCallbackRec) + sizeof(XtCallbackRec) * n); callbacks->count = n; callbacks->is_padded = 0; callbacks->call_state = 0; cl = ToList(callbacks); while (--n >= 0) *cl++ = *xtcallbacks++; return(callbacks); } /* _XtCompileCallbackList */
void XtRemoveCallbacks ( Widget widget, _Xconst char* name, XtCallbackList xtcallbacks) { InternalCallbackList *callbacks; Widget hookobj; int i; InternalCallbackList icl; XtCallbackList cl, ccl, rcl; XtAppContext app = XtWidgetToApplicationContext(widget); LOCK_APP(app); callbacks = FetchInternalList(widget, name); if (!callbacks) { XtAppWarningMsg(app, XtNinvalidCallbackList,XtNxtRemoveCallback,XtCXtToolkitError, "Cannot find callback list in XtRemoveCallbacks", (String *)NULL, (Cardinal *)NULL); UNLOCK_APP(app); return; } icl = *callbacks; if (!icl) { UNLOCK_APP(app); return; } i = icl->count; cl = ToList(icl); if (icl->call_state) { icl->call_state |= _XtCBFreeAfterCalling; icl = (InternalCallbackList)__XtMalloc(sizeof(InternalCallbackRec) + sizeof(XtCallbackRec) * i); icl->count = i; icl->call_state = 0; } ccl = ToList(icl); while (--i >= 0) { *ccl++ = *cl; for (rcl=xtcallbacks; rcl->callback; rcl++) { if (cl->callback == rcl->callback && cl->closure == rcl->closure) { ccl--; icl->count--; break; } } cl++; } if (icl->count) { icl = (InternalCallbackList) XtRealloc((char *)icl, (sizeof(InternalCallbackRec) + sizeof(XtCallbackRec) * icl->count)); icl->is_padded = 0; *callbacks = icl; } else { XtFree((char *)icl); *callbacks = NULL; } hookobj = XtHooksOfDisplay(XtDisplayOfObject(widget)); if (XtHasCallbacks(hookobj, XtNchangeHook) == XtCallbackHasSome) { XtChangeHookDataRec call_data; call_data.type = XtHremoveCallbacks; call_data.widget = widget; call_data.event_data = (XtPointer) name; XtCallCallbackList(hookobj, ((HookObject)hookobj)->hooks.changehook_callbacks, (XtPointer)&call_data); } UNLOCK_APP(app); } /* XtRemoveCallbacks */
CXFA_List* CJX_List::GetXFAList() { return ToList(GetXFAObject()); }