Canddisp *canddisp_singleton() { if (XimServer::gCandWinStyleUpdated) { terminate_canddisp_connection(); command = NULL; XimServer::gCandWinStyleUpdated = false; } if (!command) command = candwin_command(); if (!candwin_initted && command) { candwin_pid = uim_ipc_open_command(candwin_pid, &candwin_r, &candwin_w, command); if (disp) delete disp; disp = new Canddisp(); int fd = fileno(candwin_r); if (fd != -1) { int flag = fcntl(fd, F_GETFL); if (flag != -1) { flag |= O_NONBLOCK; if (fcntl(fd, F_SETFL, flag) != -1) add_fd_watch(fd, READ_OK, candwin_read_cb); } } candwin_initted = true; } return disp; }
static void candwin_read_cb(int fd, int /* ev */) { char buf[1024]; int n; n = static_cast<int>(read(fd, buf, 1024 - 1)); if (n == 0) { terminate_canddisp_connection(); return; } if (n == -1) return; buf[n] = '\0'; if (!strcmp(buf, "err")) { terminate_canddisp_connection(); return; } InputContext *focusedContext = InputContext::focusedContext(); if (focusedContext) { char *line = buf; char *eol = strchr(line, '\n'); if (eol != NULL) *eol = '\0'; if (strcmp("index", line) == 0) { line = eol + 1; eol = strchr(line, '\n'); if (eol != NULL) *eol = '\0'; int index; sscanf(line, "%d", &index); focusedContext->candidate_select(index); uim_set_candidate_index(focusedContext->getUC(), index); // send packet queue for drawing on-the-spot preedit strings focusedContext->get_ic()->force_send_packet(); } } return; }
void reload_uim(int reload_libuim) { if (reload_libuim) { fprintf(stderr, "\nReloading uim...\n\n"); terminate_canddisp_connection(); helper_disconnect_cb(); terminate_x_connection(); std::map<Window, XimServer *>::iterator it; std::list<InputContext *>::iterator it_c; for (it = XimServer::gServerMap.begin(); it != XimServer::gServerMap.end(); ++it) { XimServer *xs = it->second; for (it_c = xs->ic_list.begin(); it_c != xs->ic_list.end(); ++it_c) (*it_c)->clear(); } uim_quit(); } clear_uim_info(); get_uim_info(); //print_uim_info(); if (reload_libuim) { std::map<Window, XimServer *>::iterator it; std::list<InputContext *>::iterator it_c; for (it = XimServer::gServerMap.begin(); it != XimServer::gServerMap.end(); ++it) { XimServer *xs = it->second; for (it_c = xs->ic_list.begin(); it_c != xs->ic_list.end(); ++it_c) { const char *engine = (*it_c)->get_engine_name(); (*it_c)->createUimContext(engine); } } // make sure to use appropriate locale for the focused context InputContext *focusedContext = InputContext::focusedContext(); if (focusedContext) focusedContext->focusIn(); pretrans_setup(); } }
void Canddisp::check_connection() { if (errno == EBADF || errno == EPIPE) terminate_canddisp_connection(); }