예제 #1
0
파일: canddisp.cpp 프로젝트: NgoHuy/uim
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;
}
예제 #2
0
파일: canddisp.cpp 프로젝트: NgoHuy/uim
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;
}
예제 #3
0
파일: main.cpp 프로젝트: dai-vdr/uim
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();
    }
}
예제 #4
0
파일: canddisp.cpp 프로젝트: NgoHuy/uim
void Canddisp::check_connection()
{
    if (errno == EBADF || errno == EPIPE)
	terminate_canddisp_connection();
}