Public Bool _XimUnRegisterIMInstantiateCallback( XLCd lcd, Display *display, XrmDatabase rdb, char *res_name, char *res_class, XIDProc callback, XPointer client_data) { char locale[XIM_MAXLCNAMELEN]; XimInstCallback icb, picb; if( !callback_list ) return( False ); MakeLocale( lcd, locale ); for( icb = callback_list, picb = NULL; icb; picb = icb, icb = icb->next ) { if( !strcmp( locale, icb->name ) && (lcd->core->modifiers == icb->modifiers || /* XXXXX */ (lcd->core->modifiers && icb->modifiers && !strcmp( lcd->core->modifiers, icb->modifiers ))) && rdb == icb->rdb && /* XXXXX */ ((res_name == NULL && icb->res_name == NULL) || (res_name != NULL && icb->res_name != NULL && !strcmp( res_name, icb->res_name ))) && ((res_class == NULL && icb->res_class == NULL) || (res_class != NULL && icb->res_class != NULL && !strcmp( res_class, icb->res_class ))) && (callback == icb->callback) && (client_data == icb->client_data) && /* XXXXX */ !icb->destroy ) { if( lock ) icb->destroy = True; else { if( !picb ) { callback_list = icb->next; _XUnregisterFilter( display, RootWindow(display, 0), _XimFilterPropertyNotify, (XPointer)NULL ); } else picb->next = icb->next; _XCloseLC( icb->lcd ); XFree( icb ); } return( True ); } } return( False ); }
static Status xi18n_closeIM(XIMS ims) { Xi18n i18n_core = ims->protocol; Display *dpy = i18n_core->address.dpy; DeleteXi18nAtom(i18n_core); if (!i18n_core->methods.end(ims)) return False; _XUnregisterFilter(dpy, i18n_core->address.im_window, WaitXSelectionRequest, (XPointer)ims); XFree(i18n_core->address.im_name); XFree(i18n_core->address.im_locale); XFree(i18n_core->address.im_addr); XFree(i18n_core); return True; }