Mercurial > freewnn
diff Xwnmo/xwnmo/keyin.c @ 0:bbc77ca4def5
initial import
author | Yoshiki Yazawa <yaz@cc.rim.or.jp> |
---|---|
date | Thu, 13 Dec 2007 04:30:14 +0900 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Xwnmo/xwnmo/keyin.c Thu Dec 13 04:30:14 2007 +0900 @@ -0,0 +1,356 @@ +/* + * $Id: keyin.c,v 1.2 2001/06/14 18:16:16 ura Exp $ + */ + +/* + * FreeWnn is a network-extensible Kana-to-Kanji conversion system. + * This file is part of FreeWnn. + * + * Copyright OMRON Corporation. 1987, 1988, 1989, 1990, 1991, 1992, 1999 + * Copyright 1991, 1992 by Massachusetts Institute of Technology + * + * Author: OMRON SOFTWARE Co., Ltd. <freewnn@rd.kyoto.omronsoft.co.jp> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNU Emacs; see the file COPYING. If not, write to the + * Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + * Commentary: + * + * Change log: + * + * Last modified date: 8,Feb.1999 + * + * Code: + * + */ +/* Version 4.0 + */ +#include <stdio.h> +#include "sdefine.h" +#include "xim.h" +#include "sheader.h" +#include "proto.h" +#include "ext.h" + +static int +read_xevent (ev) + XEvent *ev; +{ + ximEventReq req; + + if (EACH_REQUEST (&req, sz_ximEventReq) == -1) + return (-1); + if (_ReadFromClient (ev, sizeof (XEvent)) == -1) + return (-1); + if (need_byteswap () == True) + { + byteswap_xevent (ev); + } + xim->sel_button = '\0'; + return (0); +} + +static int +check_cur_input (w) + Window w; +{ + if (cur_input == NULL) + { +#ifdef XJPLIB + if (XJp_check_cur_input (w) == 0) + return (0); +#endif /* XJPLIB */ + } + else + { + if (w == cur_input->w) + return (0); + } + if (cur_p && w == cur_p->yes_no->w) + return (0); + return (1); +} + +static int +cur_cl_set (set_window) + Window set_window; +{ + register XIMClientRec *xc = NULL; + register XIMInputRec *xi; + + for (xi = input_list; xi != NULL; xi = xi->next) + { + if (xi->w == set_window) + { + xc = xi->pclient; + break; + } + } +#ifdef XJPLIB + if (xc) + { + XJp_cur_cl_set (0); + } + else + { + xc = XJp_cur_cl_set (set_window); + } +#endif /* XJPLIB */ + if (xc) + { + cur_x = xc; + if (IsPreeditNothing (cur_x)) + { + cur_p = cur_x->root_pointer->ximclient; + cur_lang = cur_p->cur_xl->lang_db; + c_c = cur_p->cur_xl->w_c; + } + else + { + cur_p = cur_x; + cur_lang = cur_p->cur_xl->lang_db; + c_c = cur_x->cur_xl->w_c; + } + cur_rk = c_c->rk; + cur_rk_table = cur_rk->rk_table; + cur_input = xi; + set_cswidth (cur_lang->cswidth_id); + return (0); + } + for (xc = ximclient_list; xc; xc = xc->next) + { + if (!IsPreeditNothing (xc) && set_window == xc->yes_no->w) + { + cur_p = xc; + cur_lang = cur_p->cur_xl->lang_db; + c_c = cur_p->cur_xl->w_c; + cur_rk = c_c->rk; + cur_rk_table = cur_rk->rk_table; + set_cswidth (cur_lang->cswidth_id); + return (0); + } + } + if (xim->j_c && (set_window == xim->cur_j_c_root->ichi->w || set_window == xim->cur_j_c_root->inspect->w)) + { + cur_p = xim->j_c; + cur_lang = cur_p->cur_xl->lang_db; + c_c = cur_p->cur_xl->w_c; + cur_rk = c_c->rk; + cur_rk_table = cur_rk->rk_table; + set_cswidth (cur_lang->cswidth_id); + return (0); + } + return (-1); +} + +static XComposeStatus compose_status = { NULL, 0 }; + +int +key_input (buff, ev) + register int *buff; + register XEvent *ev; +{ + unsigned char strbuf[512]; + KeySym keysym; + int nbytes; + int ck; + register int i; + + if (check_cur_input (ev->xkey.window)) + { + if (cur_cl_set (ev->xkey.window) != 0) + { + return (-1); + } + } + if (dpy != ev->xkey.display) + ev->xkey.display = dpy; +#ifdef CALLBACKS + if (IsPreeditCallbacks (cur_x) && cur_x->cb_redraw_needed) + { + *buff++ = 0; + return (1); + } +#endif /* CALLBACKS */ +#ifdef USING_XJUTIL + if (cur_p->cur_xl->working_xjutil) + { + xjutil_send_key_event (ev); + return (-1); + } +#endif /* USING_XJUTIL */ + nbytes = XLookupString ((XKeyEvent *) ev, strbuf, 512, &keysym, &compose_status); +#if defined(XJPLIB) && defined(XJPLIB_DIRECT) + XJp_save_sockbuf (nbytes, strbuf, keysym); +#endif /* defined(XJPLIB) && defined(XJPLIB_DIRECT) */ + if ((ck = cvt_key_fun (keysym, ev->xkey.state)) >= 0) + { +#ifdef XJPLIB + XJp_check_save_event (ev, 0); +#endif /* XJPLIB */ + *buff++ = ck; + return (1); + } + if ((keysym & 0xff00) == 0xff00) + { /* Function Key */ + if (nbytes > 0) + { +#ifdef XJPLIB + XJp_check_save_event (ev, 1); +#endif /* XJPLIB */ + for (i = 0; i < nbytes; i++) + { + *buff++ = (int) strbuf[i]; + } + return (nbytes); + } + else + { +#ifdef XJPLIB + XJp_check_send_cl_key (ev); +#endif /* XJPLIB */ + return (0); + } + } + if (ev->xkey.state & ControlMask) + { /* Control Key */ + if (*strbuf >= 0x20) + { +#ifdef XJPLIB + XJp_check_send_cl_key (ev); +#endif /* XJPLIB */ + return (-1); + } + else if (*strbuf == 0x0) + { +#ifdef XJPLIB + XJp_check_save_event (ev, 0); +#endif /* XJPLIB */ + *buff++ = (int) *strbuf; + return (1); + } + else if (*strbuf <= 0x1f) + { +#ifdef XJPLIB + XJp_check_save_event (ev, 0); +#endif /* XJPLIB */ + *buff++ = (int) *strbuf; + return (1); + } + } + if ((keysym >= 0x4a0) && (keysym <= 0x4df)) + { /* Kana Key */ +#ifdef XJPLIB + XJp_check_save_event (ev, 0); +#endif /* XJPLIB */ + *buff++ = (int) ((SS2 << 8) | (keysym & 0xff)); + return (1); + } + else if ((keysym < 0x100) && (keysym > 0)) + { +#ifdef XJPLIB + XJp_check_save_event (ev, 1); +#endif /* XJPLIB */ + if (nbytes <= 0) + { + nbytes = -1; + } + for (i = 0; i < nbytes; i++) + { + *buff++ = (int) strbuf[i]; + } + return (nbytes); + } + return (-1); +} + +int +ifempty () +{ + if (cur_p->cur_xl->max_pos == 0) + { + return (1); + } + else + { + return (0); + } +} + +int +RequestDispatch () +{ + int buff[32], in; + XEvent event; + int ret = 0; + register int i, n_bytes; + + switch (read_requestheader ()) + { + case XIM_Event: + if (read_xevent (&event) == -1) + { + break; + } + ret = key_input (buff, &event); + if (ret == 0) + { + send_nofilter (); + } + else if (ret > 0) + { + for (i = 0; i < ret;) + { + n_bytes = get_cswidth_by_char (in = buff[i++]); + for (; n_bytes > 1 && i < ret; n_bytes--, i++) + { + in = (in << 8) + buff[i]; + } + in_put (in); + } + } + send_end (); + break; + case XIM_GetIM: + GetIM (); + break; + case XIM_CreateIC: + CreateIC (); + break; + case XIM_ChangeIC: + ChangeIC (); + break; + case XIM_GetIC: + GetIC (); + break; + case XIM_DestroyIC: + DestroyIC (); + break; + case XIM_SetICFocus: + SetICFocus (); + break; + case XIM_UnsetICFocus: + UnsetICFocus (); + break; + case XIM_ResetIC: + ResetIC (); + break; +#ifdef SPOT + case XIM_ChangeSpot: + ChangeSpot (); + break; +#endif /* SPOT */ + } + return (0); +}