static Status xi18n_openIM(XIMS ims) { Xi18n i18n_core = ims->protocol; Display *dpy = i18n_core->address.dpy; if (!CheckIMName(i18n_core) || !SetXi18nSelectionOwner(i18n_core) || !i18n_core->methods.begin(ims)) { XFree(i18n_core->address.im_name); XFree(i18n_core->address.im_locale); XFree(i18n_core->address.im_addr); XFree(i18n_core); return False; } /*endif*/ _XRegisterFilterByType(dpy, i18n_core->address.im_window, SelectionRequest, SelectionRequest, WaitXSelectionRequest, (XPointer)ims); XFlush(dpy); return True; }
Public Bool _XimRegisterIMInstantiateCallback( XLCd lcd, Display *display, XrmDatabase rdb, char *res_name, char *res_class, XIDProc callback, XPointer client_data) { XimInstCallback icb, tmp; XIM xim; Window root; XWindowAttributes attr; if( lock ) return( False ); icb = (XimInstCallback)Xmalloc(sizeof(XimInstCallbackRec)); if( !icb ) return( False ); icb->call = icb->destroy = False; icb->display = display; icb->lcd = lcd; MakeLocale( lcd, icb->name ); icb->modifiers = lcd->core->modifiers; /* XXXXX */ icb->rdb = rdb; icb->res_name = res_name; icb->res_class = res_class; icb->callback = callback; icb->client_data = client_data; icb->next = NULL; if( !callback_list ) callback_list = icb; else { for( tmp = callback_list; tmp->next; tmp = tmp->next ); tmp->next = icb; } xim = (*lcd->methods->open_im)( lcd, display, rdb, res_name, res_class ); if( icb == callback_list ) { root = RootWindow( display, 0 ); XGetWindowAttributes( display, root, &attr ); _XRegisterFilterByType( display, root, PropertyNotify, PropertyNotify, _XimFilterPropertyNotify, (XPointer)NULL ); XSelectInput( display, root, attr.your_event_mask | PropertyChangeMask ); } if( xim ) { lock = True; xim->methods->close( (XIM)xim ); lock = False; icb->call = True; callback( display, client_data, NULL ); } return( True ); }