# HG changeset patch # User Yoshiki Yazawa # Date 1267991070 -32400 # Node ID 92745d501b9ae6ccdef194f6aafbfe0dc7b98f35 initial import from kinput2-v3.1 diff -r 000000000000 -r 92745d501b9a Imakefile --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Imakefile Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,21 @@ +/* + * Imakefile for kinput2 + */ + +#include "Kinput2.conf" + +#define IHaveSubdirs +#define PassCDebugFlags 'CDEBUGFLAGS=$(CDEBUGFLAGS)' + +/* + * maybe you should set TOP to make xmkmf work correctly + */ +/* TOP = ../../../xc */ + +SUBDIRS = lib cmd ccdef sj3def + +XCOMM for debug... +XCOMM CDEBUGFLAGS = -g -DDEBUG + +MakeSubdirs($(SUBDIRS)) +DependSubdirs($(SUBDIRS)) diff -r 000000000000 -r 92745d501b9a Kinput2.conf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Kinput2.conf Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,157 @@ +XCOMM +XCOMM Kinput2 global configuration parameters +XCOMM +/* + * Before editing following parameters, you should read + * README file. + */ + +/** + ** Conversion system configuration: + ** Kinput2 supports 4 conversion systems, Wnn, Canna, Sj3 and Atok. + ** In order to install and use kinput2, you have to compile and + ** install at least one of them. If you select more than one + ** conversion system, you can choose one at run time with a + ** command line option. + **/ + +/* #define UseWnn */ /* define if you are going to use Wnn (v4, v6 or v7) */ +/* #define UseWnn6 */ /* define if you are going to use Wnn6 or above */ +#define UseCanna /* define if you are going to use Canna */ +#define UseSj3 /* define if you are going to use Sj3 */ +/* #define UseAtok */ /* define if you are going to use Atok */ + + +XCOMM Wnn configuration +/* + * If you define UseWnn, set following 3 variables: + * + * WNNINCDIR: Wnn include file directory + * WNNLIB: Wnn client-side library + * CCDEF_DIR: directory where character conversion rule + * definition files are to be installed + * + * You have to define WnnLibDir if Wnn4 configuration files + * are not installed in /usr/local/lib/wnn (which is the default). + */ +/* #define WnnLibDir /some/peculiar/directory/wnn */ + +/* for convenience.. */ +#if defined(UseWnn6) && !defined(UseWnn) +#define UseWnn +#endif + +CCDEF_DIR = $(LIBDIR)/ccdef + +/* + * If you have installed Wnn.. + * + * First check the directory where Wnn header files has been installed. + * Note that if you installed Wnn4 configuration files in a directory + * other than the default (/usr/local/lib/wnn), you have to define + * WnnLibDir above. + */ +XCOMM use installed header files +XCOMM WNNINCDIR = /usr/X11R6/include/wnn +XCOMM use installed library +XCOMM WNNLIB = -lwnn + +/* + * Or, use library in the source tree.. + */ +XCOMM use library in the source tree +WNNSRC = $(CONTRIBSRC)/programs/Xsi/Wnn +WNNINCDIR = $(WNNSRC)/include +WNNLIB = $(WNNSRC)/jlib/libwnn.a + + +XCOMM Canna configuration +/* + * If you define UseCanna, set following 2 variables: + * CANNASRC: Canna source directory (or directory of installed headers) + * CANNALIB: Canna user library + * Note that kinput2 no longer supports Canna version 1.x, + * which came with X11R5. Use the new version in R6 contrib. + */ + +/* + * If you have already installed Canna header files and libraries.. + */ +XCOMM use installed headers/libraries +XCOMM CANNAINSTDIR = /usr/local/canna +XCOMM CANNASRC = $(CANNAINSTDIR)/include +XCOMM CANNALIB = -lcanna16 + +/* + * If you have compiled Canna that came with X11R6 (contrib/programs/Canna), + * but not installed yet.. + */ +XCOMM use headers/libraries in the source tree +CANNASRC = $(CONTRIBSRC)/programs/Canna32 +CANNALIB = -L$(CANNASRC)/lib/canna16 -lcanna16 + + +XCOMM SJ3 configuration +/* + * If you define UseSj3, set following 3 variables: + * SJ3SRC: Sj3 source directory + * SJ3LIB: Sj3 user library + * SJ3DEF_DIR: directory where conversion rule + * definition files are to be installed + */ + +SJ3DEF_DIR = $(LIBDIR)/sj3def + +/* + * If you have installed SJ3 library and header file, + * or your machine is Sony NEWS, on which SJ3 is + * already installed.. + * (in this case, you don't have to care about SJ3SRC) + */ +XCOMM use installed header/library +XCOMM specify the directory where libsj3.h resides as SJ3SRC. +XCOMM SJ3SRC = /usr/local/include +XCOMM SJ3LIB = -lsj3lib + +/* + * Use compiled library in the source tree.. + */ +XCOMM use library in the source tree +SJ3SRC = $(CONTRIBSRC)/programs/sj3 +SJ3LIB = $(SJ3SRC)/sj3lib/libsj3lib.a + + +XCOMM Atok configuration +/* + * If you define UseAtok, set following 2 variables: + * ATOKINCDIR: Atok include file directory (if atok.h is there) + * ATOKLIBDIR: Atok client-side library directory + */ + +/* + * If you have already installed Atok header files and libraries.. + */ +XCOMM use installed headers/libraries +XCOMM ATOKINCDIR = /usr/include/atok +XCOMM ATOKLIBDIR = /usr/jp/lib +ATOKLIB = -latok12n -latok12util + + +/** + ** Transport configuration: + ** Kinput2 X Input Method Protocol handler supports + ** 3 transports, X, TCP and local (UNIX domain). + ** If your system does not support any of these, + ** add appropriate flag(s) to TRANSPORTDEFS. + ** + ** -DNO_UNIX_TRANSPORT -- if UNIX domain transport is not available + ** -DNO_TCP_TRANSPORT -- if TCP/IP transport is not available + ** -DNO_X_TRANSPORT -- if X transport is not available (unlikely) + **/ +XCOMM transport configuration + +TRANSPORTDEFS = + +XCOMM +XCOMM End of global configuration parameters +XCOMM diff -r 000000000000 -r 92745d501b9a NEWS --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/NEWS Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,78 @@ +Major changes from version 3.0 to 3.1: + +* Kinput2 now supports ATOK. The source code is kindly contributed + by Justsystem Corporation. Thanks! + To compile for Atok, define symbol `UseAtok' in Kinput2.conf. + +* Minimum support of Wnn7 is implemented. + +* Two IC attributes, XNPreeditState and XNResetState both of which + are introduced by X11R6, are supported. + +* Kinput2's `egg'-emulation is improved. + +* A workaround for bugs in some Xlib implementations has been added. + +* Previously, when kinput2 cannot connect to jserver, kinput2 seems + to be frozen (actually it keeps retrying). Now kinput2 beeps and + ends conversion in such a case. The next time you start conversion, + it tries to connect again. + + +Major changes from version 2.0 fix4 (the last official release) to +version 3.0: + +* Kinput2 now supports Wnn6. The source code is kindly contributed by + MORIBE, Hideyuki. Thanks! To compile for Wnn6, define symbol + `UseWnn6' in Kinput2.conf. + + For those who use both Wnn4 and Wnn6, distinct wnn initialization + files (wnnenvrc) for Wnn4 jserver and Wnn6 jserver can be specified. + Kinput2 checks the server version at run time, and selects an + appropriate one. Use `*.wnnEnvrc4' resource for specifying + initialization file for Wnn4, `*.wnnEnvrc6' for Wnn6. + + Due to Wnn6 support, Wnn4 implementation part saw major changes. + We've tried to keep user visible changes small, though. + +* On-the-spot input style is available for Ximp and XIM protocols. + The code is contributed by Kazuki YASUMATSU. Thank you! + For XIM protocol, following styles are now supported: + XIMPreeditPosition | XIMStatusArea (over-the-spot style) + XIMPreeditPosition | XIMStatusNothing (over-the-spot style) + XIMPreeditArea | XIMStatusArea (off-the-spot style) + XIMPreeditCallbacks | XIMStatusCallbacks (on-the-spot style) + XIMPreeditCallbacks | XIMStatusNothing (on-the-spot style) + XIMPreeditNothing | XIMStatusNothing (root-window style) + +* Kinput2 now supports an IC attribute called FilterEvents. Some + applications seem to require the input server to support this + attribute, or they go crazy if not. + +* Finally, word registration facility is available for Wnn. A new + fuction called `register' is added, and bound to F5 and ^T by + default. (If you're using ccdef.kinput2.egg, that's F4) This + function is supposed to invoke word registration utility called + `tkwnnreg'. You need a separate package for the utility, currently + available from: + ftp://ftp.sra.co.jp/pub/lang/tcl/contrib/tcl-wnn-X.Y.tar.gz + X.Y is 0.3 as of this writing. It is still alpha-quality, but I'll + work on it once I finish release work of kinput2. + +* Kinput2's `egg'-emulation has been improved. + +* You can specify preedit font and status font independently when XIM + protocol is used. Previously preedit font was used for both preedit + area and status area. + +* Now kinput2's mode shell (the small status window appeared when + over-the-spot input is active) has Mwm hints that says "I need no + titlebar". + +* A new boolean resource `useOverrideShellForMode' is provided to use + overrideShell for the mode displaying widget, instead of the default + transientShell. This is needed for some window managers which + ignores kinput2's input focus preference, causing flickering of mode + display. + + diff -r 000000000000 -r 92745d501b9a README --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/README Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,181 @@ + + kinput2 version 3.1 + + -- an input server for easy input of Japanese text -- + + +Kinput2 is an input server for X11 applications that want Japanese +text input. + +A client that wants kana-kanji conversion service for Japanese text +sends a request to kinput2. Kinput2 receives the request, does +kana-kanji conversion, and sends the converted text back to the +client. + + +* Kinput2 Features + + Upward-Compatible with Kinput: + Kinput2 is fully upward-compatible with kinput, which was + contributed to X11R4. Applications using kinput to input + Japanese can also use kinput2 without any modification. + + Multiple Input Style: + Kinput2 supports 4 input styles: root-window, off-the-spot, + over-the-spot and on-the-spot. + + Multiple Protocol: + There are several protocols which define how the communication + between input server and clients should be done. Kinput2 + implements following protocols: + + * kinput protocol + * kinput2 protocol + * Matsushita's jinput protocol + * Sony's xlc protocol + * XIMP protocol (X11R5 Ximp implementation) + * X Input Method Protocol (X11R6 standard) + + If a client can speak at least one of them, the client can + communicate with kinput2 and get Japanese text. + + The support of X Input Method Protocol is not yet fully tested + and might have many bugs. + + Multiple Conversion Engine: + Kinput2 doesn't do actual kana-kanji conversion itself. There + are several conversion servers available, so kinput2 uses them + as its conversion engine. Kinput2 can connect to the + following servers: + + * Wnn jserver (version 4, 6 or 7) + * Canna cannaserver + * Sj3 sj3serv + * Atok server + + Canna and Sj3 are contributed to X11R6. Wnn is contributed + to X11R5. + + You can choose which server to use at compilation time. If + you choose more than one, you can choose your favorite engine + by a command line option when you invoke kinput2. + + + +-------------------------+ + +---------+ +---->| jserver | + | client1 |<------+ +---------+ | | (Wnn conversion daemon) | + +---------+ +--->| |<---+ +-------------------------+ + | kinput2 |<-----+ + +---------+ +--->| |<--+ | + | client2 |<------+ +---------+ | | +-------------------------+ + +---------+ | +-->| irohaserver | + | |(Canna conversion daemon)| + | +-------------------------+ + | + | +-------------------------+ + +----->| sj3serv | + | (SJ3 conversion daemon) | + +-------------------------+ + + +* Directories + +This directory contains the following subdirectories: + + lib/ source code for a library kinput2 uses + include/ header files + cmd/ kinput2 source code + doc/ various documents + client/ sample client library and patch to kterm + ccdef/ character conversion rule files (for Wnn) + sj3def/ SJ3 user customization files + + +* Installation + +First you have to decide which conversion server to use. Currently +kinput2 supports 4 servers -- Wnn jserver, Canna cannasersver, SJ3 +sj3serv and Atok server. You can choose one of them, or more (in this +case, you can choose the server to use at run time with a command line +option). Note that if you choose Wnn6, Wnn4 is also chosen +automatically. + +You have to compile and install the conversion system (i.e. conversion +server and client-side library to communicate with the server) you +have chosen before making kinput2. See the documents in each source +directory for their installation and how to get the servers up and +running. + +Then, you have to edit Kinput2.conf in this directory. It is the +global configuration file for kinput2. See the file for details. + +If you're going to generate Makefiles by xmkmf, maybe you should specify +TOP directory in Imakefile in this directory. + +Ready? Now what you should do to build kinput2 is: + + xmkmf + make Makefiles + make depend + make + make install + +During make depend, you may get warning messages that kinput2.c +includes "WcharDisp.h" more than once, which can be ignored. + +Don't forget to do 'make install'. Kinput2 won't run unless its +application default file (cmd/Kinput2.ad) is properly installed. + + +* How to Use + +Please see cmd/kinput2.man for general setting. Default key bindings +are described in doc/defaultkeys. Other documents will be found in +doc subdirectory, though they are written in Japanese. + + +* Clients + +Since kinput2 supports many protocols, various clients can use kinput2 +as their input server. + +First, internationalized clients using X11R6 Xlib can connect to +kinput2 via X Input Method Protocol. + +Also internationalized clients using Ximp implementation of X11R5 Xlib +can connect to kinput2 via Ximp protocol. + +A Japanized terminal emulator, 'kterm', can also connect to kinput2 +via kinput2 protocol. A sample client-side library source for kinput2 +protocol is provided in client subdirectory. See client/README for +details. + + +* Changes + +See `NEWS' file for recent major changes. + + +* Bugs + +If you find a bug, please send a bug report to kinput2@sra.co.jp. +Please don't forget to include the description of your environment (your +machine, OS version, X window patchlevel, etc.) as well as the version +of kinput2 ("kinput2 -version" prints version information). + + +* Credits + +I wish to thank the following people who have contributed much to this +release: + Akira Kon, Naoshi Suzuki, Hiroshi Ohta, Masaki Takeuchi, Hideki Hiura, + Ryuji Ishiguro, Nayuta Taga, Hideyuki Moribe, Kazuki Yasumatsu, Shinji + Morino, the members of the kinput2 mailing list and XXI working group. + +Also my thanks go to all the people who participated in beta testing of +kinput2. + + + Makoto Ishisone + Software Research Associates, Inc. + ishisone@sra.co.jp diff -r 000000000000 -r 92745d501b9a ccdef/Imakefile --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ccdef/Imakefile Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,18 @@ +#include "../Kinput2.conf" + + CCDEF_FILES = ccdef.kinput2 rule.eggfunc rule.func \ + rule.kana rule.kana2 rule.roma rule.wnnroma rule.zascii \ + rule.greek \ + ccdef.kinput2.egg rule.hiragana.egg \ + rule.katakana.egg rule.kigou.egg + +all:: +depend:: +clean:: + +#ifdef UseWnn +MakeDirectories(install,$(CCDEF_DIR)) +InstallMultiple($(CCDEF_FILES),$(CCDEF_DIR)) +#else +install:: +#endif diff -r 000000000000 -r 92745d501b9a ccdef/ccdef.kinput2 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ccdef/ccdef.kinput2 Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,114 @@ +# $Id: ccdef.kinput2,v 1.4 1991/08/24 02:15:12 ishisone Rel $ + +## +## ccdef for kinput2 +## + +### 注意 +### ccdef ファイル (このファイルおよびインクルードされているファイル) +### はすべて EUC コードでなければなりません。気をつけて下さい。 + +# モードの宣言 +defmode Ascii ZenkakuAscii Kana JIS Kuten All Restricted + +# 初期モードの指定 +initialmode Kana + +# 各モードに対するルールの記述 + +# ローマ字 +mode Kana "ローマ" fallthrough All +### もしあなたが wnn のローマ字かな変換に慣れているならば +### 'rule.roma' の代わりに 'rule.wnnroma' をインクルードして下さい + include 'rule.roma' +# include 'rule.wnnroma' + "" Tab "" goto Ascii + "" shift-Tab "" goto ZenkakuAscii + "n" EXITMODE "ん" +endmode + +# アスキー +mode Ascii "ABC" fallthrough All +# 特にルールを記述する必要はない + "" Tab "" goto ZenkakuAscii + "" shift-Tab "" goto Kana +endmode + +# 全角アスキー +mode ZenkakuAscii "ABC" fallthrough All + include 'rule.zascii' + "" Tab "" goto Kana + "" shift-Tab "" goto Ascii +endmode + +# JISコード入力 +mode JIS "JISコード" fallthrough Restricted + "" ENTERMODE "" jiscode-begin + "" EXITMODE "" jiscode-end + "" '0' "0" + "" '1' "1" + "" '2' "2" + "" '3' "3" + "" '4' "4" + "" '5' "5" + "" '6' "6" + "" '7' "7" + "" '8' "8" + "" '9' "9" + "" 'a' "A" + "" 'b' "B" + "" 'c' "C" + "" 'd' "D" + "" 'e' "E" + "" 'f' "F" + "" 'A' "A" + "" 'B' "B" + "" 'C' "C" + "" 'D' "D" + "" 'E' "E" + "" 'F' "F" +endmode + +# 区点コード入力 +mode Kuten "区点コード" fallthrough Restricted + "" ENTERMODE "" kutencode-begin + "" EXITMODE "" kutencode-end + "" '0' "0" + "" '1' "1" + "" '2' "2" + "" '3' "3" + "" '4' "4" + "" '5' "5" + "" '6' "6" + "" '7' "7" + "" '8' "8" + "" '9' "9" +endmode + +# All -- 共通定義 +mode All "?" +### この設定では変換開始時にはつねにローマ字モードにリセットされる +### ようになっています。もし最後の入力モードのままにしたい時には +### "end-conversion" の後の "goto Kana" を削除して下さい + "" control-Kanji "" end-conversion goto Kana + "" shift-space "" end-conversion goto Kana +# "" '^\\' "" end-conversion goto Kana + "" F5 "" goto JIS + "" mod1-5 "" goto JIS + "" F6 "" goto Kuten + "" mod1-6 "" goto Kuten +### もしあなたがたまごのキーバインディングに慣れているならば +### 'rule.func' の代わりに 'rule.eggfunc' をインクルードして下さい + include 'rule.func' +# include 'rule.eggfunc' +endmode + +# Restricted -- JIS コード / 区点コード用 +mode Restricted "??" + "" F5 "" goto PREV + "" F6 "" goto PREV + "" mod1-5 "" goto PREV + "" mod1-6 "" goto PREV + "" '^H' "" backspace + "" @ascii "" beep +endmode diff -r 000000000000 -r 92745d501b9a ccdef/ccdef.kinput2.egg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ccdef/ccdef.kinput2.egg Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,324 @@ +## Egg が好きな人の為の ccdef for kinput2 +## by nayuta@is.s.u-tokyo.ac.jp + +defmode Ascii ZenkakuAscii Hiragana Katakana JIS All + +initialmode Hiragana + +casesensitive +autofix + +mode Hiragana "[あ]" fallthrough All + include 'rule.hiragana.egg' + + "n" EXITMODE "ん" + "" 'q' "" goto Ascii + "" 'Q' "" goto ZenkakuAscii + + "n" ' ' "ん" convert-next-or-move-top-or-sendback + "n" '^\\' "ん" end-conversion goto Hiragana + "n" '^@' "ん" convert-or-fix1 + "n" '^A' "ん" move-top + "n" '^B' "ん" backward + "n" '^D' "ん" delete-or-cancel + "n" '^E' "ん" move-bottom + "n" '^F' "ん" forward + "n" '^I' "ん" shrink + "n" '^J' "ん" fix + "n" '^K' "ん" kill-line + "n" '^L' "ん" fix + "n" '^M' "ん" fix + "n" '^N' "ん" next + "n" '^O' "ん" expand + "n" '^P' "ん" previous + "n" '^Q' "ん" goto PREV + "n" '^W' "ん" convert + "n" '^Z' "ん" convert-s + "" control-underscore "ん" goto JIS + + "n" mod1-less "ん" to-hankaku + "n" mod1-greater "ん" to-zenkaku + "n" mod1-i "ん" shrink-s + "n" mod1-n "ん" next-s + "n" mod1-o "ん" expand-s + "n" mod1-p "ん" previous-s + "n" mod1-w "ん" convert-s + "n" mod1-h "ん" to-hiragana + "n" mod1-k "ん" to-katakana + "n" mod1-x "ん" to-hankaku + "n" mod1-less "ん" to-hankaku + "n" mod1-greater "ん" to-zenkaku + "n" mod1-control-h "ん" goto Hiragana + "n" mod1-control-k "ん" goto Katakana + "n" mod1-q "ん" goto Ascii + "n" mod1-shift-q "ん" goto Ascii + "n" mod1-s "ん" select-s + "n" mod1-shift-s "ん" select-s + "n" mod1-z "ん" select goto ZenkakuAscii + "n" mod1-shift-z "ん" select goto ZenkakuAscii + "n" control-Kanji "ん" end-conversion goto Hiragana + "n" shift-space "ん" end-conversion goto Hiragana + "n" Kanji "ん" end-conversion goto Hiragana + "n" shift-Muhenkan "ん" to-hiragana + "n" Muhenkan "ん" to-katakana + + "n" Right "ん" forward + "n" Left "ん" backward + "n" Down "ん" next + "n" Up "ん" previous + "n" shift-Right "ん" expand + "n" shift-Left "ん" shrink + + "n" F1 "ん" beep + "n" F2 "ん" beep + "n" F3 "ん" goto JIS + "n" F4 "ん" register + "n" F5 "ん" to-zenkaku + "n" F6 "ん" to-hankaku + "n" F7 "ん" to-katakana + "n" F8 "ん" to-hiragana + "n" F9 "ん" convert-move-top-or-sendback + "n" F10 "ん" beep + "n" F11 "ん" beep + "n" F12 "ん" beep +# "n" F13 "ん" end-conversion goto Hiragana + "n" F13 "ん" beep + "n" F14 "ん" beep + "n" F15 "ん" beep + "n" F16 "ん" beep + "n" F17 "ん" beep + "n" F18 "ん" beep + "n" F19 "ん" beep + "n" F20 "ん" beep + + "n" '^^' "ん" symbol-input + "n" '^[' "ん" add-modifier-mod1 + "n" @keypad "ん&" + "n" @printable "ん&" +endmode + +mode Katakana "[ア]" fallthrough All + include 'rule.katakana.egg' + + "n" EXITMODE "ン" + "" 'q' "" goto Ascii + "" 'Q' "" goto ZenkakuAscii + + "n" ' ' "ン" convert-next-or-move-top-or-sendback + "n" '^\\' "ン" end-conversion goto Hiragana + "n" '^@' "ン" convert-or-fix1 + "n" '^A' "ン" move-top + "n" '^B' "ン" backward + "n" '^D' "ン" delete-or-cancel + "n" '^E' "ン" move-bottom + "n" '^F' "ン" forward + "n" '^I' "ン" shrink + "n" '^J' "ン" fix + "n" '^K' "ン" kill-line + "n" '^L' "ン" fix + "n" '^M' "ン" fix + "n" '^N' "ン" next + "n" '^O' "ン" expand + "n" '^P' "ン" previous + "n" '^Q' "ン" goto PREV + "n" '^W' "ン" convert + "n" '^Z' "ン" convert-s + "" control-underscore "ン" goto JIS + + "n" mod1-less "ン" to-hankaku + "n" mod1-greater "ン" to-zenkaku + "n" mod1-i "ン" shrink-s + "n" mod1-n "ン" next-s + "n" mod1-o "ン" expand-s + "n" mod1-p "ン" previous-s + "n" mod1-w "ン" convert-s + "n" mod1-h "ン" to-hiragana + "n" mod1-k "ン" to-katakana + "n" mod1-x "ン" to-hankaku + "n" mod1-less "ン" to-hankaku + "n" mod1-greater "ン" to-zenkaku + "n" mod1-control-h "ン" goto Hiragana + "n" mod1-control-k "ン" goto Katakana + "n" mod1-q "ン" goto Ascii + "n" mod1-shift-q "ン" goto Ascii + "n" mod1-s "ン" select-s + "n" mod1-shift-s "ン" select-s + "n" mod1-z "ン" select goto ZenkakuAscii + "n" mod1-shift-z "ン" select goto ZenkakuAscii + "n" control-Kanji "ン" end-conversion goto Hiragana + "n" shift-space "ン" end-conversion goto Hiragana + "n" Kanji "ン" end-conversion goto Hiragana + "n" shift-Muhenkan "ン" to-hiragana + "n" Muhenkan "ン" to-katakana + + "n" Right "ン" forward + "n" Left "ン" backward + "n" Down "ン" next + "n" Up "ン" previous + "n" shift-Right "ン" expand + "n" shift-Left "ン" shrink + + "n" F1 "ン" beep + "n" F2 "ン" beep + "n" F3 "ン" goto JIS + "n" F4 "ン" register + "n" F5 "ン" to-zenkaku + "n" F6 "ン" to-hankaku + "n" F7 "ン" to-katakana + "n" F8 "ン" to-hiragana + "n" F9 "ン" convert-move-top-or-sendback + "n" F10 "ン" beep + "n" F11 "ン" beep + "n" F12 "ン" beep +# "n" F13 "ン" end-conversion goto Hiragana + "n" F13 "ン" beep + "n" F14 "ン" beep + "n" F15 "ン" beep + "n" F16 "ン" beep + "n" F17 "ン" beep + "n" F18 "ン" beep + "n" F19 "ン" beep + "n" F20 "ン" beep + + "n" '^^' "ン" symbol-input + "n" '^[' "ン" add-modifier-mod1 + "n" @keypad "ン&" + "n" @printable "ン&" +endmode + +mode Ascii "[aa]" fallthrough All + "" '^G' "" goto PREV + "" '^M' "" goto PREV + "" '^Q' "" goto PREV +endmode + +mode ZenkakuAscii "[a]" fallthrough All + include 'rule.zascii' + "" '^G' "" goto PREV + "" '^M' "" goto PREV + "" '^Q' "" goto PREV +endmode + +mode JIS "[JIS]" + "" ENTERMODE "" jiscode-begin + "" EXITMODE "" jiscode-end + "" '0' "0" + "" '1' "1" + "" '2' "2" + "" '3' "3" + "" '4' "4" + "" '5' "5" + "" '6' "6" + "" '7' "7" + "" '8' "8" + "" '9' "9" + "" 'a' "A" + "" 'b' "B" + "" 'c' "C" + "" 'd' "D" + "" 'e' "E" + "" 'f' "F" + "" 'A' "A" + "" 'B' "B" + "" 'C' "C" + "" 'D' "D" + "" 'E' "E" + "" 'F' "F" + "" '^G' "" goto PREV + "" '^H' "" backspace + "" '^M' "" goto PREV + "" '^Q' "" goto PREV + "" @ascii "" beep +endmode + +mode All "?" + "" ' ' "" convert-next-or-move-top-or-sendback + "" '^\\' "" end-conversion goto Hiragana + "" '^@' "" convert-or-fix1 + "" '^A' "" move-top + "" '^B' "" backward + "" '^C' "" clear-or-cancel + "" '^D' "" delete-or-cancel + "" '^E' "" move-bottom + "" '^F' "" forward + "" '^G' "" clear-or-cancel + "" '^H' "" backspace-or-cancel + "" '^I' "" shrink + "" '^J' "" fix-or-sendback + "" '^K' "" kill-line + "" '^L' "" fix +# "" '^M' "" fix-or-cr + "" '^M' "" fix-or-sendback + "" '^N' "" next + "" '^O' "" expand + "" '^P' "" previous + "" '^Q' "" goto PREV + "" '^W' "" convert + "" '^Z' "" convert-s + "" control-underscore "" goto JIS + + "" mod1-less "" to-hankaku + "" mod1-greater "" to-zenkaku + "" mod1-i "" shrink-s + "" mod1-n "" next-s + "" mod1-o "" expand-s + "" mod1-p "" previous-s + "" mod1-w "" convert-s + "" mod1-h "" to-hiragana + "" mod1-k "" to-katakana + "" mod1-x "" to-hankaku + "" mod1-less "" to-hankaku + "" mod1-greater "" to-zenkaku + + "" mod1-control-h "" goto Hiragana + "" mod1-control-k "" goto Katakana + "" mod1-q "" goto Ascii + "" mod1-shift-q "" goto Ascii + "" mod1-s "" select-s + "" mod1-shift-s "" select-s + "" mod1-z "" select goto ZenkakuAscii + "" mod1-shift-z "" select goto ZenkakuAscii + + "" control-Kanji "" end-conversion goto Hiragana + "" shift-space "" end-conversion goto Hiragana + "" Kanji "" end-conversion goto Hiragana + "" shift-Muhenkan "" to-hiragana + "" Muhenkan "" to-katakana + + "" Right "" forward + "" Left "" backward + "" Down "" next + "" Up "" previous + "" shift-Right "" expand + "" shift-Left "" shrink + "" Delete "" backspace-or-cancel + "" BackSpace "" backspace-or-cancel + + "" F1 "" beep + "" F2 "" beep + "" F3 "" goto JIS + "" F4 "" register + "" F5 "" to-zenkaku + "" F6 "" to-hankaku + "" F7 "" to-katakana + "" F8 "" to-hiragana + "" F9 "" convert-move-top-or-sendback + "" F10 "" convert-next-or-move-top-or-sendback + "" F11 "" beep + "" F12 "" beep +# "" F13 "" end-conversion goto Hiragana + "" F13 "" beep + "" F14 "" beep + "" F15 "" beep + "" F16 "" beep + "" F17 "" beep + "" F18 "" beep + "" F19 "" beep + "" F20 "" beep + + "" '^^' "" symbol-input + "" '^[' "" add-modifier-mod1 + "" '^]' "^]" + "" @keypad "&" + "" @printable "&" +endmode diff -r 000000000000 -r 92745d501b9a ccdef/rule.eggfunc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ccdef/rule.eggfunc Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,44 @@ +# $Id: rule.eggfunc,v 1.2 1999/01/19 03:49:17 ishisone Exp $ + +# conversion function key bindings for egg users + +# function key bindings + "" '^A' "" move-top + "" '^B' "" backward + "" '^C' "" unconvert + "" '^D' "" delete + "" '^E' "" move-bottom + "" '^F' "" forward + "" '^G' "" clear + "" '^H' "" backspace + "" '^I' "" shrink + "" '^K' "" kill-line + "" '^L' "" fix + "" '^M' "" fix + "" '^N' "" next + "" '^O' "" expand + "" '^P' "" previous + "" '^W' "" convert + "" ' ' "" convert-or-space + "" Kanji "" convert + "" mod1-w "" convert-s + "" mod1-n "" next-s + "" mod1-p "" previous-s + "" Right "" forward + "" Left "" backward + "" Down "" next + "" Up "" previous + "" shift-Right "" expand + "" shift-Left "" shrink + "" Delete "" delete + "" F1 "" to-katakana + "" mod1-1 "" to-katakana + "" F2 "" to-hiragana + "" mod1-2 "" to-hiragana + "" F3 "" to-hankaku + "" mod1-3 "" to-hankaku + "" F4 "" to-zenkaku + "" mod1-4 "" to-zenkaku + "" shift-Escape "" symbol-input + "" @keypad "&" + "" @printable "&" diff -r 000000000000 -r 92745d501b9a ccdef/rule.func --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ccdef/rule.func Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,43 @@ +# $Id: rule.func,v 1.4 1999/03/15 09:22:18 ishisone Exp $ + +# conversion function key bindings + +# function key bindings + "" '^J' "" convert + "" Kanji "" convert + "" '^C' "" convert-s + "" '^G' "" unconvert + "" '^F' "" forward + "" '^B' "" backward + "" '^N' "" next + "" mod1-n "" next-s + "" '^P' "" previous + "" mod1-p "" previous-s + "" Right "" forward + "" Left "" backward + "" Down "" next + "" Up "" previous + "" '^A' "" move-top + "" '^E' "" move-bottom + "" shift-Right "" expand + "" shift-Left "" shrink + "" '^L' "" fix + "" '^U' "" clear + "" '^K' "" kill-line + "" '^M' "" carriage-return + "" '^I' "^I" fix + "" '^H' "" backspace + "" Delete "" delete + "" F1 "" to-katakana + "" mod1-1 "" to-katakana + "" F2 "" to-hiragana + "" mod1-2 "" to-hiragana + "" F3 "" to-hankaku + "" mod1-3 "" to-hankaku + "" F4 "" to-zenkaku + "" mod1-4 "" to-zenkaku + "" shift-Escape "" symbol-input + "" F5 "" register + "" '^T' "" register + "" @keypad "&" + "" @printable "&" diff -r 000000000000 -r 92745d501b9a ccdef/rule.greek --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ccdef/rule.greek Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,53 @@ +# $Id: rule.greek,v 1.1 1989/10/19 21:07:49 ishisone Rel $ + +# character conversion rule for greek characters + +# ギリシャ文字変換ルール + "" 'a' "α" + "" 'b' "β" + "" 'g' "γ" + "" 'd' "δ" + "" 'e' "ε" + "" 'z' "ζ" + "" 'y' "η" + "" 'h' "θ" + "" 'i' "ι" + "" 'k' "κ" + "" 'l' "λ" + "" 'm' "μ" + "" 'n' "ν" + "" 'c' "ξ" + "" 'o' "ο" + "" 'p' "π" + "" 'r' "ρ" + "" 's' "σ" + "" 't' "τ" + "" 'u' "υ" + "" 'f' "φ" + "" 'x' "χ" + "" 'q' "ψ" + "" 'w' "ω" + "" 'A' "Α" + "" 'B' "Β" + "" 'G' "Γ" + "" 'D' "Δ" + "" 'E' "Ε" + "" 'Z' "Ζ" + "" 'Y' "Η" + "" 'H' "Θ" + "" 'I' "Ι" + "" 'K' "Κ" + "" 'L' "Λ" + "" 'M' "Μ" + "" 'N' "Ν" + "" 'C' "Ξ" + "" 'O' "Ο" + "" 'P' "Π" + "" 'R' "Ρ" + "" 'S' "Σ" + "" 'T' "Τ" + "" 'U' "Υ" + "" 'F' "Φ" + "" 'X' "Χ" + "" 'Q' "Ψ" + "" 'W' "Ω" diff -r 000000000000 -r 92745d501b9a ccdef/rule.hiragana.egg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ccdef/rule.hiragana.egg Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,333 @@ +## Egg が好きな人の為のローマ字かな変換ルール +## by nayuta@is.s.u-tokyo.ac.jp +# +# +# "lts" 'u' "っ" +# + "xts" 'u' "っ" +# +# + "by" 'a' "びゃ" + "by" 'i' "びぃ" + "by" 'u' "びゅ" + "by" 'e' "びぇ" + "by" 'o' "びょ" +# + "ch" 'a' "ちゃ" + "ch" 'i' "ち" + "ch" 'u' "ちゅ" + "ch" 'e' "ちぇ" + "ch" 'o' "ちょ" +# + "dy" 'a' "ぢゃ" + "dy" 'i' "でぃ" + "dy" 'u' "ぢゅ" + "dy" 'e' "ぢぇ" + "dy" 'o' "ぢょ" + "dh" 'i' "でぃ" +# + "gw" 'a' "ぐゎ" + "gw" 'i' "ぐぃ" + "gw" 'u' "ぐ" + "gw" 'e' "ぐぇ" + "gw" 'o' "ぐぉ" + "gy" 'a' "ぎゃ" + "gy" 'i' "ぎぃ" + "gy" 'u' "ぎゅ" + "gy" 'e' "ぎぇ" + "gy" 'o' "ぎょ" +# + "kw" 'a' "くゎ" + "kw" 'i' "くぃ" + "kw" 'u' "く" + "kw" 'e' "くぇ" + "kw" 'o' "くぉ" + "ky" 'a' "きゃ" + "ky" 'i' "きぃ" + "ky" 'u' "きゅ" + "ky" 'e' "きぇ" + "ky" 'o' "きょ" +# + "hy" 'a' "ひゃ" + "hy" 'i' "ひぃ" + "hy" 'u' "ひゅ" + "hy" 'e' "ひぇ" + "hy" 'o' "ひょ" +# + "jy" 'a' "じゃ" + "jy" 'i' "じぃ" + "jy" 'u' "じゅ" + "jy" 'e' "じぇ" + "jy" 'o' "じょ" +# +# "lt" 'u' "っ" +# "lk" 'a' "ヵ" +# "lk" 'e' "ヶ" +# "ly" 'a' "ゃ" +# "ly" 'u' "ゅ" +# "ly" 'o' "ょ" + "ly" 'a' "りゃ" + "ly" 'i' "りぃ" + "ly" 'u' "りゅ" + "ly" 'e' "りぇ" + "ly" 'o' "りょ" + "lw" 'a' "ゎ" +# + "my" 'a' "みゃ" + "my" 'i' "みぃ" + "my" 'u' "みゅ" + "my" 'e' "みぇ" + "my" 'o' "みょ" +# + "ny" 'a' "にゃ" + "ny" 'i' "にぃ" + "ny" 'u' "にゅ" + "ny" 'e' "にぇ" + "ny" 'o' "にょ" +# + "py" 'a' "ぴゃ" + "py" 'i' "ぴぃ" + "py" 'u' "ぴゅ" + "py" 'e' "ぴぇ" + "py" 'o' "ぴょ" +# + "ry" 'a' "りゃ" + "ry" 'i' "りぃ" + "ry" 'u' "りゅ" + "ry" 'e' "りぇ" + "ry" 'o' "りょ" +# + "sh" 'a' "しゃ" + "sh" 'i' "し" + "sh" 'u' "しゅ" + "sh" 'e' "しぇ" + "sh" 'o' "しょ" +# + "sy" 'a' "しゃ" + "sy" 'i' "しぃ" + "sy" 'u' "しゅ" + "sy" 'e' "しぇ" + "sy" 'o' "しょ" +# + "tc" 'h' "っ" + "ts" 'a' "つぁ" + "ts" 'i' "つぃ" + "ts" 'u' "つ" + "ts" 'e' "つぇ" + "ts" 'o' "つぉ" +# + "ty" 'a' "ちゃ" + "ty" 'i' "てぃ" + "ty" 'u' "ちゅ" + "ty" 'e' "ちぇ" + "ty" 'o' "ちょ" + "th" 'i' "てぃ" +# + "wh" 'i' "うぃ" + "wh" 'e' "うぇ" +# + "xt" 'u' "っ" + "xk" 'a' "ヵ" + "xk" 'e' "ヶ" + "xt" 'i' "てぃ" + "xd" 'i' "でぃ" + "xd" 'u' "どぅ" + "xd" 'e' "どぇ" + "xd" 'o' "どぉ" + "xy" 'a' "ゃ" + "xy" 'u' "ゅ" + "xy" 'o' "ょ" + "xw" 'a' "ゎ" + "xw" 'i' "うぃ" + "xw" 'e' "うぇ" + "xw" 'o' "うぉ" +# + "zy" 'a' "じゃ" + "zy" 'i' "じぃ" + "zy" 'u' "じゅ" + "zy" 'e' "じぇ" + "zy" 'o' "じょ" +# +# + "b" 'a' "ば" + "b" 'i' "び" + "b" 'u' "ぶ" + "b" 'e' "べ" + "b" 'o' "ぼ" + "b" 'b' "っb" +# + "c" 'c' "っc" +# + "f" 'a' "ふぁ" + "f" 'i' "ふぃ" + "f" 'u' "ふ" + "f" 'e' "ふぇ" + "f" 'o' "ふぉ" + "f" 'f' "っf" +# + "d" 'a' "だ" + "d" 'i' "ぢ" + "d" 'u' "づ" + "d" 'e' "で" + "d" 'o' "ど" + "d" 'd' "っd" +# + "g" 'a' "が" + "g" 'i' "ぎ" + "g" 'u' "ぐ" + "g" 'e' "げ" + "g" 'o' "ご" + "g" 'g' "っg" +# + "k" 'a' "か" + "k" 'i' "き" + "k" 'u' "く" + "k" 'e' "け" + "k" 'o' "こ" + "k" 'k' "っk" +# + "h" 'a' "は" + "h" 'i' "ひ" + "h" 'u' "ふ" + "h" 'e' "へ" + "h" 'o' "ほ" + "h" 'h' "っh" +# + "j" 'a' "じゃ" + "j" 'i' "じ" + "j" 'u' "じゅ" + "j" 'e' "じぇ" + "j" 'o' "じょ" + "j" 'j' "っj" +# +# "l" 'a' "ぁ" +# "l" 'i' "ぃ" +# "l" 'u' "ぅ" +# "l" 'e' "ぇ" +# "l" 'o' "ぉ" + "l" 'a' "ら" + "l" 'i' "り" + "l" 'u' "る" + "l" 'e' "れ" + "l" 'o' "ろ" + "l" 'l' "っl" +# + "m" 'a' "ま" + "m" 'i' "み" + "m" 'u' "む" + "m" 'e' "め" + "m" 'o' "も" + "m" 'b' "んb" + "m" 'm' "んm" + "m" 'p' "んp" + "m" 'm' "っm" +# + "n" 'a' "な" + "n" 'b' "んb" + "n" 'c' "んc" + "n" 'd' "んd" + "n" 'e' "ね" + "n" 'f' "んf" + "n" 'g' "んg" + "n" 'h' "んh" + "n" 'i' "に" + "n" 'j' "んj" + "n" 'k' "んk" + "n" 'l' "んl" + "n" 'm' "んm" +# "n" 'n' "ん" + "n" 'N' "んん" + "n" 'n' "んn" + "n" 'o' "の" + "n" 'p' "んp" + "n" 'r' "んr" + "n" 's' "んs" + "n" 't' "んt" + "n" 'u' "ぬ" + "n" 'v' "んv" + "n" 'w' "んw" + "n" 'x' "んx" + "n" 'y' "ny" + "n" 'z' "んz" +# "n" '.' "ん. " +# "n" ',' "ん, " +# "n" '/' "ん・" + "n" '.' "ん。" + "n" ',' "ん、" + "n" '/' "ん/" +# + "p" 'a' "ぱ" + "p" 'i' "ぴ" + "p" 'u' "ぷ" + "p" 'e' "ぺ" + "p" 'o' "ぽ" + "p" 'p' "っp" +# + "r" 'a' "ら" + "r" 'i' "り" + "r" 'u' "る" + "r" 'e' "れ" + "r" 'o' "ろ" + "r" 'r' "っr" +# + "s" 'a' "さ" + "s" 'i' "し" + "s" 'u' "す" + "s" 'e' "せ" + "s" 'o' "そ" + "s" 's' "っs" +# + "t" 'a' "た" + "t" 'i' "ち" + "t" 'u' "つ" + "t" 'e' "て" + "t" 'o' "と" + "t" 't' "っt" +# + "v" 'a' "ヴぁ" + "v" 'i' "ヴぃ" + "v" 'u' "ヴ" + "v" 'e' "ヴぇ" + "v" 'o' "ヴぉ" + "v" 'v' "っv" +# + "w" 'a' "わ" + "w" 'i' "ゐ" + "w" 'u' "う" + "w" 'e' "ゑ" + "w" 'o' "を" + "w" 'n' "ん" + "w" 'w' "っw" +# + "x" 'a' "ぁ" + "x" 'i' "ぃ" + "x" 'u' "ぅ" + "x" 'e' "ぇ" + "x" 'o' "ぉ" + "x" 'x' "っx" +# + "y" 'a' "や" + "y" 'i' "い" + "y" 'u' "ゆ" + "y" 'e' "いぇ" + "y" 'o' "よ" + "y" 'y' "っy" +# + "z" 'a' "ざ" + "z" 'i' "じ" + "z" 'u' "ず" + "z" 'e' "ぜ" + "z" 'o' "ぞ" + "z" 'z' "っz" +# +# + include 'rule.kigou.egg' +# +# + "" 'a' "あ" + "" 'i' "い" + "" 'u' "う" + "" 'e' "え" + "" 'o' "お" + "" 'N' "ん" +# diff -r 000000000000 -r 92745d501b9a ccdef/rule.kana --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ccdef/rule.kana Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,100 @@ +# $Id: rule.kana,v 1.1 1989/10/19 21:07:54 ishisone Rel $ + +# character conversion rule for kana + +# かな (旧JIS) 変換ルール + "" '3' "あ" + "" '#' "ぁ" + "" 'e' "い" + "" 'E' "ぃ" + "" '4' "う" + "" '$' "ぅ" + "" '5' "え" + "" '%' "ぇ" + "" '6' "お" + "" '^' "ぉ" + "" 't' "か" + "" 'T' "ヵ" + "" '"' "ヶ" + "" 'g' "き" + "" 'h' "く" + "" '\'' "け" + "" 'b' "こ" + "" 'x' "さ" + "" 'd' "し" + "" 'r' "す" + "" 'p' "せ" + "" 'c' "そ" + "" 'q' "た" + "" 'a' "ち" + "" 'z' "つ" + "" 'Z' "っ" + "" 'w' "て" + "" 's' "と" + "" 'u' "な" + "" 'i' "に" + "" '1' "ぬ" + "" ',' "ね" + "" 'k' "の" + "" 'f' "は" + "" 'v' "ひ" + "" '2' "ふ" + "" '=' "へ" + "" '-' "ほ" + "" 'j' "ま" + "" 'n' "み" + "" '`' "む" + "" '/' "め" + "" 'm' "も" + "" '7' "や" + "" '&' "ゃ" + "" '8' "ゆ" + "" '*' "ゅ" + "" '9' "よ" + "" '(' "ょ" + "" 'o' "ら" + "" 'l' "り" + "" '.' "る" + "" ';' "れ" + "" '_' "ろ" + "" '0' "わ" + "" ')' "を" + "" 'y' "ん" + "" '<' "、" + "" '>' "。" convert + "" '?' "・" + "" kana_RO "ろ" + "" shift-kana_RO "ー" +# 'ろ' のキーがないかわいそうなキーボードのために... (SUN のことだけど) + "" '|' "ろ" + "" '\\' "ー" + "" '}' "「" + "" '~' "」" + "か" '[' "が" + "き" '[' "ぎ" + "く" '[' "ぐ" + "け" '[' "げ" + "こ" '[' "ご" + "さ" '[' "ざ" + "し" '[' "じ" + "す" '[' "ず" + "せ" '[' "ぜ" + "そ" '[' "ぞ" + "た" '[' "だ" + "ち" '[' "ぢ" + "つ" '[' "づ" + "て" '[' "で" + "と" '[' "ど" + "は" '[' "ば" + "ひ" '[' "び" + "ふ" '[' "ぶ" + "へ" '[' "べ" + "ほ" '[' "ぼ" + "は" ']' "ぱ" + "ひ" ']' "ぴ" + "ふ" ']' "ぷ" + "へ" ']' "ぺ" + "ほ" ']' "ぽ" + "う" '[' "ヴ" + "" '[' "゛" + "" ']' "゜" diff -r 000000000000 -r 92745d501b9a ccdef/rule.kana2 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ccdef/rule.kana2 Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,153 @@ +# $Id: rule.kana2,v 1.3 1997/05/23 08:27:13 ishisone Exp $ + +# この定義ファイルは minmin@astec.co.jp 氏によるもので、かなキーボード +# でのかな入力をするためのものです。 +# かな入力用の定義ファイルとしてはすでに rule.kana が用意されています +# が、あれはかなキーボードでなくても使えるようにアスキーからかなへの変 +# 換を行なうものでした。それに対してこの定義ファイルは実際にかなの +# Keysym を出すかなキーボードでかなを入力するためのものです。 +# 実際にこの定義を使用するためには、ccdef.kinput2 を次のように変更する +# 必要があります。 +# ・mode Kana で rule.roma の代わりに rule.kana2 をインクルード +# するようにする +# ・mode Ascii は必要ないので削る +# また、一部のキーボードでは、かなロックの状態で、コントロールを押しな +# がらキーを入力すると、期待した動作にならない事があります。具体的には +# '^J' と押しても、変換されないとか、'^H' でもバックスペースにならない +# などの不具合が発生します。このような場合、各定義ファイルのコントロー +# ルキーで入力するファンクション部分に、次のような修正を加えるとうまく +# いくことがあります。 +# +# "" '^J' "" convert +# "" control-kana_MA "" convert # Jのかなロックはマ +# "" '^C' "" convert-s +# "" control-kana_SO "" convert-s # Cのかなロックはソ +# "" '^G' "" unconvert +# "" control-kana_KI "" unconvert # Gのかなロックはキ +# "" '^F' "" forward +# "" control-kana_FU "" forward # Fのかなロックはフ +# +# 変更方法については doc/ccdef を読めば多分わかると思いますが、もし疑問の +# 点がありましたら kinput2@sra.co.jp までお問い合わせ下さい。 + + "" kana_fullstop "。" + "" kana_openingbracket "「" + "" kana_closingbracket "」" + "" kana_comma "、" + "" kana_middledot "・" + "" kana_WO "を" + "" kana_a "ぁ" + "" kana_i "ぃ" + "" kana_u "ぅ" + "" kana_e "ぇ" + "" kana_o "ぉ" + "" kana_ya "ゃ" + "" kana_yu "ゅ" + "" kana_yo "ょ" + "" kana_tu "っ" + "" prolongedsound "ー" + "" kana_A "あ" + "" kana_I "い" + "" kana_U "う" + "" kana_E "え" + "" kana_O "お" + "" kana_KA "か" + "" kana_KI "き" + "" kana_KU "く" + "" kana_KE "け" + "" kana_KO "こ" + "" kana_SA "さ" + "" kana_SHI "し" + "" kana_SU "す" + "" kana_SE "せ" + "" kana_SO "そ" + "" kana_TA "た" + "" kana_TI "ち" + "" kana_TU "つ" + "" kana_TE "て" + "" kana_TO "と" + "" kana_NA "な" + "" kana_NI "に" + "" kana_NU "ぬ" + "" kana_NE "ね" + "" kana_NO "の" + "" kana_HA "は" + "" kana_HI "ひ" + "" kana_HU "ふ" + "" kana_HE "へ" + "" kana_HO "ほ" + "" kana_MA "ま" + "" kana_MI "み" + "" kana_MU "む" + "" kana_ME "め" + "" kana_MO "も" + "" kana_YA "や" + "" kana_YU "ゆ" + "" kana_YO "よ" + "" kana_RA "ら" + "" kana_RI "り" + "" kana_RU "る" + "" kana_RE "れ" + "" kana_RO "ろ" + "" kana_WA "わ" + "" kana_N "ん" +# + "か" voicedsound "が" + "き" voicedsound "ぎ" + "く" voicedsound "ぐ" + "け" voicedsound "げ" + "こ" voicedsound "ご" + "さ" voicedsound "ざ" + "し" voicedsound "じ" + "す" voicedsound "ず" + "せ" voicedsound "ぜ" + "そ" voicedsound "ぞ" + "た" voicedsound "だ" + "ち" voicedsound "ぢ" + "つ" voicedsound "づ" + "て" voicedsound "で" + "と" voicedsound "ど" + "は" voicedsound "ば" + "ひ" voicedsound "び" + "ふ" voicedsound "ぶ" + "へ" voicedsound "べ" + "ほ" voicedsound "ぼ" + "は" semivoicedsound "ぱ" + "ひ" semivoicedsound "ぴ" + "ふ" semivoicedsound "ぷ" + "へ" semivoicedsound "ぺ" + "ほ" semivoicedsound "ぽ" +# ここから下は個人の趣味ですので必要ない方はコメントアウトして下さい + "" '!' "!" + "" '"' "“" + "" '#' "#" + "" '$' "$" + "" '%' "%" + "" '&' "&" + "" '\'' "’" + "" '(' "(" + "" ')' ")" + "" '*' "*" + "" '+' "+" + "" ',' "," + "" '-' "−" + "" '.' "." + "" '/' "/" + "" ':' ":" + "" ';' ";" + "" '<' "<" + "" '=' "=" + "" '>' ">" + "" '?' "?" + "" '@' "@" + "" '[' "[" + "" '\\' "¥" + "" ']' "]" + "" '^' "^" + "" '_' "_" + "" '`' "‘" + "" ' ' " " + "" '{' "{" + "" '|' "|" + "" '}' "}" + "" '~' "〜" diff -r 000000000000 -r 92745d501b9a ccdef/rule.katakana.egg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ccdef/rule.katakana.egg Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,333 @@ +## Egg が好きな人の為のローマ字カナ変換ルール +## by nayuta@is.s.u-tokyo.ac.jp +# +# +# "lts" 'u' "ッ" +# + "xts" 'u' "ッ" +# +# + "by" 'a' "ビャ" + "by" 'i' "ビィ" + "by" 'u' "ビュ" + "by" 'e' "ビェ" + "by" 'o' "ビョ" +# + "ch" 'a' "チャ" + "ch" 'i' "チ" + "ch" 'u' "チュ" + "ch" 'e' "チェ" + "ch" 'o' "チョ" +# + "dy" 'a' "ヂャ" + "dy" 'i' "ディ" + "dy" 'u' "ヂュ" + "dy" 'e' "ヂェ" + "dy" 'o' "ヂョ" + "dh" 'i' "ディ" +# + "gw" 'a' "グヮ" + "gw" 'i' "グィ" + "gw" 'u' "グ" + "gw" 'e' "グェ" + "gw" 'o' "グォ" + "gy" 'a' "ギャ" + "gy" 'i' "ギィ" + "gy" 'u' "ギュ" + "gy" 'e' "ギェ" + "gy" 'o' "ギョ" +# + "kw" 'a' "クヮ" + "kw" 'i' "クィ" + "kw" 'u' "ク" + "kw" 'e' "クェ" + "kw" 'o' "クォ" + "ky" 'a' "キャ" + "ky" 'i' "キィ" + "ky" 'u' "キュ" + "ky" 'e' "キェ" + "ky" 'o' "キョ" +# + "hy" 'a' "ヒャ" + "hy" 'i' "ヒィ" + "hy" 'u' "ヒュ" + "hy" 'e' "ヒェ" + "hy" 'o' "ヒョ" +# + "jy" 'a' "ジャ" + "jy" 'i' "ジィ" + "jy" 'u' "ジュ" + "jy" 'e' "ジェ" + "jy" 'o' "ジョ" +# +# "lt" 'u' "ッ" +# "lk" 'a' "ヵ" +# "lk" 'e' "ヶ" +# "ly" 'a' "ャ" +# "ly" 'u' "ュ" +# "ly" 'o' "ョ" + "ly" 'a' "リャ" + "ly" 'i' "リィ" + "ly" 'u' "リュ" + "ly" 'e' "リェ" + "ly" 'o' "リョ" + "lw" 'a' "ヮ" +# + "my" 'a' "ミャ" + "my" 'i' "ミィ" + "my" 'u' "ミュ" + "my" 'e' "ミェ" + "my" 'o' "ミョ" +# + "ny" 'a' "ニャ" + "ny" 'i' "ニィ" + "ny" 'u' "ニュ" + "ny" 'e' "ニェ" + "ny" 'o' "ニョ" +# + "py" 'a' "ピャ" + "py" 'i' "ピィ" + "py" 'u' "ピュ" + "py" 'e' "ピェ" + "py" 'o' "ピョ" +# + "ry" 'a' "リャ" + "ry" 'i' "リィ" + "ry" 'u' "リュ" + "ry" 'e' "リェ" + "ry" 'o' "リョ" +# + "sh" 'a' "シャ" + "sh" 'i' "シ" + "sh" 'u' "シュ" + "sh" 'e' "シェ" + "sh" 'o' "ショ" +# + "sy" 'a' "シャ" + "sy" 'i' "シィ" + "sy" 'u' "シュ" + "sy" 'e' "シェ" + "sy" 'o' "ショ" +# + "tc" 'h' "ッ" + "ts" 'a' "ツァ" + "ts" 'i' "ツィ" + "ts" 'u' "ツ" + "ts" 'e' "ツェ" + "ts" 'o' "ツォ" +# + "ty" 'a' "チャ" + "ty" 'i' "ティ" + "ty" 'u' "チュ" + "ty" 'e' "チェ" + "ty" 'o' "チョ" + "th" 'i' "ティ" +# + "wh" 'i' "ウィ" + "wh" 'e' "ウェ" +# + "xt" 'u' "ッ" + "xk" 'a' "ヵ" + "xk" 'e' "ヶ" + "xt" 'i' "ティ" + "xd" 'i' "ディ" + "xd" 'u' "ドゥ" + "xd" 'e' "ドェ" + "xd" 'o' "ドォ" + "xy" 'a' "ャ" + "xy" 'u' "ュ" + "xy" 'o' "ョ" + "xw" 'a' "ヮ" + "xw" 'i' "ウィ" + "xw" 'e' "ウェ" + "xw" 'o' "ウォ" +# + "zy" 'a' "ジャ" + "zy" 'i' "ジィ" + "zy" 'u' "ジュ" + "zy" 'e' "ジェ" + "zy" 'o' "ジョ" +# +# + "b" 'a' "バ" + "b" 'i' "ビ" + "b" 'u' "ブ" + "b" 'e' "ベ" + "b" 'o' "ボ" + "b" 'b' "ッb" +# + "c" 'c' "ッc" +# + "f" 'a' "ファ" + "f" 'i' "フィ" + "f" 'u' "フ" + "f" 'e' "フェ" + "f" 'o' "フォ" + "f" 'f' "ッf" +# + "d" 'a' "ダ" + "d" 'i' "ヂ" + "d" 'u' "ヅ" + "d" 'e' "デ" + "d" 'o' "ド" + "d" 'd' "ッd" +# + "g" 'a' "ガ" + "g" 'i' "ギ" + "g" 'u' "グ" + "g" 'e' "ゲ" + "g" 'o' "ゴ" + "g" 'g' "ッg" +# + "k" 'a' "カ" + "k" 'i' "キ" + "k" 'u' "ク" + "k" 'e' "ケ" + "k" 'o' "コ" + "k" 'k' "ッk" +# + "h" 'a' "ハ" + "h" 'i' "ヒ" + "h" 'u' "フ" + "h" 'e' "ヘ" + "h" 'o' "ホ" + "h" 'h' "ッh" +# + "j" 'a' "ジャ" + "j" 'i' "ジ" + "j" 'u' "ジュ" + "j" 'e' "ジェ" + "j" 'o' "ジョ" + "j" 'j' "ッj" +# +# "l" 'a' "ァ" +# "l" 'i' "ィ" +# "l" 'u' "ゥ" +# "l" 'e' "ェ" +# "l" 'o' "ォ" + "l" 'a' "ラ" + "l" 'i' "リ" + "l" 'u' "ル" + "l" 'e' "レ" + "l" 'o' "ロ" + "l" 'l' "ッl" +# + "m" 'a' "マ" + "m" 'i' "ミ" + "m" 'u' "ム" + "m" 'e' "メ" + "m" 'o' "モ" + "m" 'b' "ンb" + "m" 'm' "ンm" + "m" 'p' "ンp" + "m" 'm' "ッm" +# + "n" 'a' "ナ" + "n" 'b' "ンb" + "n" 'c' "ンc" + "n" 'd' "ンd" + "n" 'e' "ネ" + "n" 'f' "ンf" + "n" 'g' "ンg" + "n" 'h' "ンh" + "n" 'i' "ニ" + "n" 'j' "ンj" + "n" 'k' "ンk" + "n" 'l' "ンl" + "n" 'm' "ンm" +# "n" 'n' "ン" + "n" 'N' "ンン" + "n" 'n' "ンn" + "n" 'o' "ノ" + "n" 'p' "ンp" + "n" 'r' "ンr" + "n" 's' "ンs" + "n" 't' "ンt" + "n" 'u' "ヌ" + "n" 'v' "ンv" + "n" 'w' "ンw" + "n" 'x' "ンx" + "n" 'y' "ny" + "n" 'z' "ンz" +# "n" '.' "ン. " +# "n" ',' "ン, " +# "n" '/' "ン・" + "n" '.' "ン。" + "n" ',' "ン、" + "n" '/' "ン/" +# + "p" 'a' "パ" + "p" 'i' "ピ" + "p" 'u' "プ" + "p" 'e' "ペ" + "p" 'o' "ポ" + "p" 'p' "ッp" +# + "r" 'a' "ラ" + "r" 'i' "リ" + "r" 'u' "ル" + "r" 'e' "レ" + "r" 'o' "ロ" + "r" 'r' "ッr" +# + "s" 'a' "サ" + "s" 'i' "シ" + "s" 'u' "ス" + "s" 'e' "セ" + "s" 'o' "ソ" + "s" 's' "ッs" +# + "t" 'a' "タ" + "t" 'i' "チ" + "t" 'u' "ツ" + "t" 'e' "テ" + "t" 'o' "ト" + "t" 't' "ッt" +# + "v" 'a' "ヴァ" + "v" 'i' "ヴィ" + "v" 'u' "ヴ" + "v" 'e' "ヴェ" + "v" 'o' "ヴォ" + "v" 'v' "ッv" +# + "w" 'a' "ワ" + "w" 'i' "ヰ" + "w" 'u' "ウ" + "w" 'e' "ヱ" + "w" 'o' "ヲ" + "w" 'n' "ン" + "w" 'w' "ッw" +# + "x" 'a' "ァ" + "x" 'i' "ィ" + "x" 'u' "ゥ" + "x" 'e' "ェ" + "x" 'o' "ォ" + "x" 'x' "ッx" +# + "y" 'a' "ヤ" + "y" 'i' "イ" + "y" 'u' "ユ" + "y" 'e' "イェ" + "y" 'o' "ヨ" + "y" 'y' "ッy" +# + "z" 'a' "ザ" + "z" 'i' "ジ" + "z" 'u' "ズ" + "z" 'e' "ゼ" + "z" 'o' "ゾ" + "z" 'z' "ッz" +# +# + include 'rule.kigou.egg' +# +# + "" 'a' "ア" + "" 'i' "イ" + "" 'u' "ウ" + "" 'e' "エ" + "" 'o' "オ" + "" 'N' "ン" +# diff -r 000000000000 -r 92745d501b9a ccdef/rule.kigou.egg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ccdef/rule.kigou.egg Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,224 @@ +## Egg が好きな人の為の記号変換ルール +## by nayuta@is.s.u-tokyo.ac.jp +# +# + "z" '1' "○" + "z" '!' "●" + "z" '2' "▽" + "z" '@' "▼" + "z" '3' "△" + "z" '#' "▲" + "z" '4' "□" + "z" '$' "■" + "z" '5' "◇" + "z" '%' "◆" + "z" '6' "☆" + "z" '^' "★" + "z" '7' "◎" + "z" '&' "£" + "z" '8' "¢" + "z" '*' "×" + "z" '9' "♂" + "z" '(' "【" + "z" '0' "♀" + "z" ')' "】" + "z" '-' "〜" + "z" '_' "∴" + "z" '=' "≠" + "z" '+' "±" + "z" '\\' "\" + "z" '|' "‖" + "z" '`' "´" + "z" '~' "¨" + "z" 'q' "《" + "z" 'Q' "〈" + "z" 'w' "》" + "z" 'W' "〉" + "z" 'r' "々" + "z" 'R' "仝" + "z" 't' "〆" + "z" 'T' "§" + "z" 'p' "〒" + "z" 'P' "↑" + "z" '[' "『" + "z" '{' "〔" + "z" ']' "』" + "z" '}' "〕" + "z" 's' "ヽ" + "z" 'S' "ヾ" + "z" 'd' "ゝ" + "z" 'D' "ゞ" + "z" 'f' "〃" + "z" 'F' "→" + "z" 'g' "‐" + "z" 'G' "―" + "z" 'h' "←" + "z" 'j' "↓" + "z" 'k' "↑" + "z" 'l' "→" + "z" ';' "゛" + "z" ':' "゜" + "z" '\'' "‘" + "z" '"' "“" + "z" 'x' ":-" + "z" 'X' ":-)" + "z" 'c' "〇" + "z" 'C' "℃" + "z" 'v' "※" + "z" 'V' "÷" + "z" 'b' "°" + "z" 'B' "←" + "z" 'n' "′" + "z" 'N' "↓" + "z" 'm' "″" + "z" 'M' "〓" + "z" ',' "‥" + "z" '<' "≦" + "z" '.' "…" + "z" '>' "≧" + "z" '/' "・" + "z" '?' "∞" +# +# + "Z" '0' "0" + "Z" '1' "1" + "Z" '2' "2" + "Z" '3' "3" + "Z" '4' "4" + "Z" '5' "5" + "Z" '6' "6" + "Z" '7' "7" + "Z" '8' "8" + "Z" '9' "9" + "Z" 'A' "A" + "Z" 'B' "B" + "Z" 'C' "C" + "Z" 'D' "D" + "Z" 'E' "E" + "Z" 'F' "F" + "Z" 'G' "G" + "Z" 'H' "H" + "Z" 'I' "I" + "Z" 'J' "J" + "Z" 'K' "K" + "Z" 'L' "L" + "Z" 'M' "M" + "Z" 'N' "N" + "Z" 'O' "O" + "Z" 'P' "P" + "Z" 'Q' "Q" + "Z" 'R' "R" + "Z" 'S' "S" + "Z" 'T' "T" + "Z" 'U' "U" + "Z" 'V' "V" + "Z" 'W' "W" + "Z" 'X' "X" + "Z" 'Y' "Y" + "Z" 'Z' "Z" + "Z" 'a' "a" + "Z" 'b' "b" + "Z" 'c' "c" + "Z" 'd' "d" + "Z" 'e' "e" + "Z" 'f' "f" + "Z" 'g' "g" + "Z" 'h' "h" + "Z" 'i' "i" + "Z" 'j' "j" + "Z" 'k' "k" + "Z" 'l' "l" + "Z" 'm' "m" + "Z" 'n' "n" + "Z" 'o' "o" + "Z" 'p' "p" + "Z" 'q' "q" + "Z" 'r' "r" + "Z" 's' "s" + "Z" 't' "t" + "Z" 'u' "u" + "Z" 'v' "v" + "Z" 'w' "w" + "Z" 'x' "x" + "Z" 'y' "y" + "Z" 'z' "z" + "Z" ' ' " " + "Z" '!' "!" + "Z" '@' "@" + "Z" '#' "#" + "Z" '$' "$" + "Z" '%' "%" + "Z" '^' "^" + "Z" '&' "&" + "Z" '*' "*" + "Z" '(' "(" + "Z" ')' ")" + "Z" '-' "−" + "Z" '=' "=" + "Z" '`' "`" + "Z" '\\' "¥" + "Z" '|' "|" + "Z" '_' "_" + "Z" '+' "+" + "Z" '~' " ̄" + "Z" '[' "[" + "Z" ']' "]" + "Z" '{' "{" + "Z" '}' "}" + "Z" ':' ":" + "Z" ';' ";" + "Z" '"' "”" + "Z" '\'' "’" + "Z" '<' "<" + "Z" '>' ">" + "Z" '?' "?" + "Z" '/' "/" + "Z" ',' "," + "Z" '.' "." +# +# + "" '0' "0" + "" '1' "1" + "" '2' "2" + "" '3' "3" + "" '4' "4" + "" '5' "5" + "" '6' "6" + "" '7' "7" + "" '8' "8" + "" '9' "9" + "" '!' "!" + "" '@' "@" + "" '#' "#" + "" '$' "$" + "" '%' "%" + "" '^' "^" + "" '&' "&" + "" '*' "*" + "" '(' "(" + "" ')' ")" + "" '-' "ー" + "" '=' "=" + "" '`' "`" + "" '\\' "¥" + "" '|' "|" + "" '_' "_" + "" '+' "+" + "" '~' " ̄" + "" '[' "「" + "" ']' "」" + "" '{' "{" + "" '}' "}" + "" ':' ":" + "" ';' ";" + "" '"' "”" + "" '\'' "’" + "" '<' "<" + "" '>' ">" + "" '?' "?" +# "" '/' "・" +# "" ',' ", " +# "" '.' ". " + "" '/' "/" + "" ',' "、" + "" '.' "。" diff -r 000000000000 -r 92745d501b9a ccdef/rule.roma --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ccdef/rule.roma Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,788 @@ +# $Id: rule.roma,v 1.1 1989/10/19 21:08:02 ishisone Rel $ + +# character conversion rule for romaji + +# ローマ字変換ルール + "by" 'a' "びゃ" + "by" 'i' "びぃ" + "by" 'u' "びゅ" + "by" 'e' "びぇ" + "by" 'o' "びょ" +# + "ch" 'a' "ちゃ" + "ch" 'i' "ち" + "ch" 'u' "ちゅ" + "ch" 'e' "ちぇ" + "ch" 'o' "ちょ" +# + "cy" 'a' "ちゃ" + "cy" 'i' "ちぃ" + "cy" 'u' "ちゅ" + "cy" 'e' "ちぇ" + "cy" 'o' "ちょ" +# + "ds" 'u' "づ" +# + "dh" 'a' "でゃ" + "dh" 'i' "でぃ" + "dh" 'u' "でゅ" + "dh" 'e' "でぇ" + "dh" 'o' "でょ" +# + "dw" 'a' "どゎ" + "dw" 'i' "どぃ" + "dw" 'u' "どぅ" + "dw" 'e' "どぇ" + "dw" 'o' "どぉ" +# + "dy" 'a' "ぢゃ" + "dy" 'i' "ぢぃ" + "dy" 'u' "ぢゅ" + "dy" 'e' "ぢぇ" + "dy" 'o' "ぢょ" +# + "gw" 'a' "ぐぁ" + "gw" 'i' "ぐぃ" + "gw" 'u' "ぐぅ" + "gw" 'e' "ぐぇ" + "gw" 'o' "ぐぉ" +# + "kw" 'a' "くぁ" + "kw" 'i' "くぃ" + "kw" 'u' "くぅ" + "kw" 'e' "くぇ" + "kw" 'o' "くぉ" +# + "ky" 'a' "きゃ" + "ky" 'i' "きぃ" + "ky" 'u' "きゅ" + "ky" 'e' "きぇ" + "ky" 'o' "きょ" +# + "k" 'a' "か" + "k" 'i' "き" + "k" 'u' "く" + "k" 'e' "け" + "k" 'o' "こ" +# + "fy" 'a' "ふゃ" + "fy" 'i' "ふぃ" + "fy" 'u' "ふゅ" + "fy" 'e' "ふぇ" + "fy" 'o' "ふょ" +# + "fw" 'a' "ふゎ" + "fw" 'i' "ふぃ" + "fw" 'u' "ふぅ" + "fw" 'e' "ふぇ" + "fw" 'o' "ふぉ" +# + "gy" 'a' "ぎゃ" + "gy" 'i' "ぎぃ" + "gy" 'u' "ぎゅ" + "gy" 'e' "ぎぇ" + "gy" 'o' "ぎょ" +# + "hw" 'a' "ふぁ" + "hw" 'i' "ふぃ" + "hw" 'e' "ふぇ" + "hw" 'o' "ふぉ" +# + "hy" 'a' "ひゃ" + "hy" 'i' "ひぃ" + "hy" 'u' "ひゅ" + "hy" 'e' "ひぇ" + "hy" 'o' "ひょ" +# + "jy" 'a' "じゃ" + "jy" 'i' "じぃ" + "jy" 'u' "じゅ" + "jy" 'e' "じぇ" + "jy" 'o' "じょ" +# + "ly" 'a' "りゃ" + "ly" 'i' "りぃ" + "ly" 'u' "りゅ" + "ly" 'e' "りぇ" + "ly" 'o' "りょ" +# + "my" 'a' "みゃ" + "my" 'i' "みぃ" + "my" 'u' "みゅ" + "my" 'e' "みぇ" + "my" 'o' "みょ" +# + "ny" 'a' "にゃ" + "ny" 'i' "にぃ" + "ny" 'u' "にゅ" + "ny" 'e' "にぇ" + "ny" 'o' "にょ" +# + "py" 'a' "ぴゃ" + "py" 'i' "ぴぃ" + "py" 'u' "ぴゅ" + "py" 'e' "ぴぇ" + "py" 'o' "ぴょ" +# + "qy" 'a' "くゃ" + "qy" 'i' "くぃ" + "qy" 'u' "くゅ" + "qy" 'e' "くぇ" + "qy" 'o' "くょ" +# + "qw" 'a' "くゎ" + "qw" 'i' "くぃ" + "qw" 'u' "くぅ" + "qw" 'e' "くぇ" + "qw" 'o' "くぉ" +# + "ry" 'a' "りゃ" + "ry" 'i' "りぃ" + "ry" 'u' "りゅ" + "ry" 'e' "りぇ" + "ry" 'o' "りょ" +# + "sw" 'i' "すぃ" + "sw" 'e' "すぇ" +# + "sh" 'a' "しゃ" + "sh" 'i' "し" + "sh" 'u' "しゅ" + "sh" 'e' "しぇ" + "sh" 'o' "しょ" +# + "sy" 'a' "しゃ" + "sy" 'i' "しぃ" + "sy" 'u' "しゅ" + "sy" 'e' "しぇ" + "sy" 'o' "しょ" +# + "th" 'a' "てゃ" + "th" 'i' "てぃ" + "th" 'u' "てゅ" + "th" 'e' "てぇ" + "th" 'o' "てょ" +# + "ts" 'a' "つぁ" + "ts" 'i' "つぃ" + "ts" 'u' "つ" + "ts" 'e' "つぇ" + "ts" 'o' "つぉ" +# + "ty" 'a' "ちゃ" + "ty" 'i' "ちぃ" + "ty" 'u' "ちゅ" + "ty" 'e' "ちぇ" + "ty" 'o' "ちょ" +# + "tw" 'a' "とゎ" + "tw" 'i' "とぃ" + "tw" 'u' "とぅ" + "tw" 'e' "とぇ" + "tw" 'o' "とぉ" +# + "vy" 'a' "ヴヮ" + "vy" 'i' "ヴィ" + "vy" 'u' "ヴゥ" + "vy" 'e' "ヴェ" + "vy" 'o' "ヴョ" +# + "wh" 'a' "うゎ" + "wh" 'i' "うぃ" + "wh" 'u' "うぅ" + "wh" 'e' "うぇ" + "wh" 'o' "うぉ" +# + "xc" 'a' "ヵ" + "xk" 'a' "ヵ" + "xk" 'e' "ヶ" +# + "xts" 'u' "っ" + "xt" 'u' "っ" +# + "xy" 'a' "ゃ" + "xy" 'i' "ぃ" + "xy" 'u' "ゅ" + "xy" 'e' "ぇ" + "xy" 'o' "ょ" +# + "xw" 'a' "ゎ" + "xw" 'i' "ゐ" + "xw" 'e' "ゑ" + "xw" 'o' "を" +# + "zy" 'a' "じゃ" + "zy" 'i' "じぃ" + "zy" 'u' "じゅ" + "zy" 'e' "じぇ" + "zy" 'o' "じょ" +# + "b" 'a' "ば" + "b" 'i' "び" + "b" 'u' "ぶ" + "b" 'e' "べ" + "b" 'o' "ぼ" +# + "c" 'a' "か" + "c" 'i' "し" + "c" 'u' "く" +# "c" 'u' "きゅ" + "c" 'e' "せ" + "c" 'o' "こ" +# + "d" 'a' "だ" + "d" 'i' "ぢ" + "d" 'u' "づ" + "d" 'e' "で" + "d" 'o' "ど" +# + "f" 'a' "ふぁ" + "f" 'i' "ふぃ" + "f" 'u' "ふ" + "f" 'e' "ふぇ" + "f" 'o' "ふぉ" +# + "g" 'a' "が" + "g" 'i' "ぎ" + "g" 'u' "ぐ" + "g" 'e' "げ" + "g" 'o' "ご" +# + "h" 'a' "は" + "h" 'i' "ひ" + "h" 'u' "ふ" + "h" 'e' "へ" + "h" 'o' "ほ" +# + "j" 'a' "じゃ" + "j" 'i' "じ" + "j" 'u' "じゅ" + "j" 'e' "じぇ" + "j" 'o' "じょ" +# + "l" 'a' "ら" + "l" 'i' "り" + "l" 'u' "る" + "l" 'e' "れ" + "l" 'o' "ろ" +# + "m" 'a' "ま" + "m" 'i' "み" + "m" 'u' "む" + "m" 'e' "め" + "m" 'o' "も" +# + "n" 'a' "な" + "n" 'i' "に" + "n" 'u' "ぬ" + "n" 'e' "ね" + "n" 'o' "の" +# + "n" 'n' "ん" +# + "p" 'a' "ぱ" + "p" 'i' "ぴ" + "p" 'u' "ぷ" + "p" 'e' "ぺ" + "p" 'o' "ぽ" +# + "q" 'a' "くぁ" + "q" 'i' "くぃ" + "q" 'u' "く" + "q" 'e' "くぇ" + "q" 'o' "くぉ" +# + "r" 'a' "ら" + "r" 'i' "り" + "r" 'u' "る" + "r" 'e' "れ" + "r" 'o' "ろ" +# + "s" 'a' "さ" + "s" 'i' "し" + "s" 'u' "す" + "s" 'e' "せ" + "s" 'o' "そ" +# + "t" 'a' "た" + "t" 'i' "ち" + "t" 'u' "つ" + "t" 'e' "て" + "t" 'o' "と" +# + "v" 'a' "ヴァ" + "v" 'i' "ヴィ" + "v" 'u' "ヴ" + "v" 'e' "ヴェ" + "v" 'o' "ヴォ" +# + "w" 'a' "わ" + "w" 'i' "ゐ" + "w" 'u' "う" + "w" 'e' "ゑ" + "w" 'o' "を" +# + "x" 'a' "ぁ" + "x" 'i' "ぃ" + "x" 'u' "ぅ" + "x" 'e' "ぇ" + "x" 'o' "ぉ" +# + "y" 'a' "や" + "y" 'i' "い" + "y" 'u' "ゆ" + "y" 'e' "いぇ" + "y" 'o' "よ" +# + "z" 'a' "ざ" + "z" 'i' "じ" + "z" 'u' "ず" + "z" 'e' "ぜ" + "z" 'o' "ぞ" +# + "" 'a' "あ" + "" 'i' "い" + "" 'u' "う" + "" 'e' "え" + "" 'o' "お" +# + "n" '\'' "ん" + "n" 'b' "んb" + "n" 'c' "んc" + "n" 'd' "んd" + "n" 'f' "んf" + "n" 'g' "んg" + "n" 'h' "んh" + "n" 'j' "んj" + "n" 'k' "んk" + "n" 'l' "んl" + "n" 'm' "んm" + "n" 'n' "んn" + "n" 'p' "んp" + "n" 'r' "んr" + "n" 'q' "んq" + "n" 's' "んs" + "n" 't' "んt" + "n" 'v' "んv" + "n" 'w' "んw" + "n" 'x' "んx" +# "n" 'y' "んy" + "n" 'z' "んz" +# + "b" 'b' "っb" + "c" 'c' "っc" + "d" 'd' "っd" + "f" 'f' "っf" + "g" 'g' "っg" + "h" 'h' "っh" + "j" 'j' "っj" + "k" 'k' "っk" + "l" 'l' "っl" + "m" 'm' "っm" + "n" 'n' "っn" + "p" 'p' "っp" + "q" 'q' "っq" + "r" 'r' "っr" + "s" 's' "っs" + "t" 't' "っt" + "v" 'v' "っv" + "w" 'w' "っw" + "y" 'y' "っy" + "z" 'z' "っz" +# カタカナ + "by" 'A' "ビャ" + "by" 'I' "ビィ" + "by" 'U' "ビュ" + "by" 'E' "ビェ" + "by" 'O' "ビョ" +# + "ch" 'A' "チャ" + "ch" 'I' "チ" + "ch" 'U' "チュ" + "ch" 'E' "チェ" + "ch" 'O' "チョ" +# + "cy" 'A' "チャ" + "cy" 'I' "チィ" + "cy" 'U' "チュ" + "cy" 'E' "チェ" + "cy" 'O' "チョ" +# + "ds" 'U' "ヅ" +# + "dh" 'A' "デャ" + "dh" 'I' "ディ" + "dh" 'U' "デュ" + "dh" 'E' "デェ" + "dh" 'O' "デョ" +# + "dw" 'A' "ドヮ" + "dw" 'I' "ドィ" + "dw" 'U' "ドゥ" + "dw" 'E' "ドェ" + "dw" 'O' "ドォ" +# + "dy" 'A' "ヂャ" + "dy" 'I' "ヂィ" + "dy" 'U' "ヂュ" + "dy" 'E' "ヂェ" + "dy" 'O' "ヂョ" +# + "gw" 'A' "グァ" + "gw" 'I' "グィ" + "gw" 'U' "グゥ" + "gw" 'E' "グェ" + "gw" 'O' "グォ" +# + "kw" 'A' "クァ" + "kw" 'I' "クィ" + "kw" 'U' "クゥ" + "kw" 'E' "クェ" + "kw" 'O' "クォ" +# + "ky" 'A' "キャ" + "ky" 'I' "キィ" + "ky" 'U' "キュ" + "ky" 'E' "キェ" + "ky" 'O' "キョ" +# + "fy" 'A' "フャ" + "fy" 'I' "フィ" + "fy" 'U' "フュ" + "fy" 'E' "フェ" + "fy" 'O' "フョ" +# + "fw" 'A' "フヮ" + "fw" 'I' "フィ" + "fw" 'U' "フゥ" + "fw" 'E' "フェ" + "fw" 'O' "フォ" +# + "gy" 'A' "ギャ" + "gy" 'I' "ギィ" + "gy" 'U' "ギュ" + "gy" 'E' "ギェ" + "gy" 'O' "ギョ" +# + "hw" 'A' "フヮ" + "hw" 'I' "フィ" + "hw" 'E' "フェ" + "hw" 'O' "フォ" +# + "hy" 'A' "ヒャ" + "hy" 'I' "ヒィ" + "hy" 'U' "ヒュ" + "hy" 'E' "ヒェ" + "hy" 'O' "ヒョ" +# + "jy" 'A' "ジャ" + "jy" 'I' "ジィ" + "jy" 'U' "ジュ" + "jy" 'E' "ジェ" + "jy" 'O' "ジョ" +# + "ly" 'A' "リャ" + "ly" 'I' "リィ" + "ly" 'U' "リュ" + "ly" 'E' "リェ" + "ly" 'O' "リョ" +# + "my" 'A' "ミャ" + "my" 'I' "ミィ" + "my" 'U' "ミュ" + "my" 'E' "ミェ" + "my" 'O' "ミョ" +# + "ny" 'A' "ニャ" + "ny" 'I' "ニィ" + "ny" 'U' "ニュ" + "ny" 'E' "ニェ" + "ny" 'O' "ニョ" +# + "py" 'A' "ピャ" + "py" 'I' "ピィ" + "py" 'U' "ピュ" + "py" 'E' "ピェ" + "py" 'O' "ピョ" +# + "qy" 'A' "クャ" + "qy" 'I' "クィ" + "qy" 'U' "クュ" + "qy" 'E' "クェ" + "qy" 'O' "クョ" +# + "qw" 'A' "クヮ" + "qw" 'I' "クィ" + "qw" 'U' "クゥ" + "qw" 'E' "クェ" + "qw" 'O' "クォ" +# + "ry" 'A' "リャ" + "ry" 'I' "リィ" + "ry" 'U' "リュ" + "ry" 'E' "リェ" + "ry" 'O' "リョ" +# + "sw" 'I' "スィ" + "sw" 'E' "スェ" +# + "sh" 'A' "シャ" + "sh" 'I' "シ" + "sh" 'U' "シュ" + "sh" 'E' "シェ" + "sh" 'O' "ショ" +# + "sy" 'A' "シャ" + "sy" 'I' "シィ" + "sy" 'U' "シュ" + "sy" 'E' "シェ" + "sy" 'O' "ショ" +# + "th" 'A' "テャ" + "th" 'I' "ティ" + "th" 'U' "テュ" + "th" 'E' "テェ" + "th" 'O' "テョ" +# + "ts" 'A' "ツァ" + "ts" 'I' "ツィ" + "ts" 'U' "ツ" + "ts" 'E' "ツェ" + "ts" 'O' "ツォ" +# + "ty" 'A' "チャ" + "ty" 'I' "チィ" + "ty" 'U' "チュ" + "ty" 'E' "チェ" + "ty" 'O' "チョ" +# + "tw" 'A' "トヮ" + "tw" 'I' "トィ" + "tw" 'U' "トゥ" + "tw" 'E' "トェ" + "tw" 'O' "トォ" +# + "vy" 'A' "ヴヮ" + "vy" 'I' "ヴィ" + "vy" 'U' "ヴゥ" + "vy" 'E' "ヴェ" + "vy" 'O' "ヴョ" +# + "wh" 'A' "ウヮ" + "wh" 'I' "ウィ" + "wh" 'U' "ウゥ" + "wh" 'E' "ウェ" + "wh" 'O' "ウォ" +# + "xc" 'A' "ヵ" + "xk" 'A' "ヵ" + "xk" 'E' "ヶ" +# + "xts" 'u' "ッ" + "xt" 'u' "ッ" +# + "xy" 'A' "ャ" + "xy" 'I' "ィ" + "xy" 'U' "ュ" + "xy" 'E' "ェ" + "xy" 'O' "ョ" +# + "xw" 'A' "ヮ" + "xw" 'I' "ヰ" + "xw" 'E' "ヱ" + "xw" 'O' "ヲ" +# + "zy" 'A' "ジャ" + "zy" 'I' "ジィ" + "zy" 'U' "ジュ" + "zy" 'E' "ジェ" + "zy" 'O' "ジョ" +# + "b" 'A' "バ" + "b" 'I' "ビ" + "b" 'U' "ブ" + "b" 'E' "ベ" + "b" 'O' "ボ" +# + "c" 'A' "カ" + "c" 'I' "シ" + "c" 'U' "ク" +# "c" 'U' "キュ" + "c" 'E' "セ" + "c" 'O' "コ" +# + "d" 'A' "ダ" + "d" 'I' "ヂ" + "d" 'U' "ヅ" + "d" 'E' "デ" + "d" 'O' "ド" +# + "f" 'A' "ファ" + "f" 'I' "フィ" + "f" 'U' "フ" + "f" 'E' "フェ" + "f" 'O' "フォ" +# + "k" 'A' "カ" + "k" 'I' "キ" + "k" 'U' "ク" + "k" 'E' "ケ" + "k" 'O' "コ" +# + "g" 'A' "ガ" + "g" 'I' "ギ" + "g" 'U' "グ" + "g" 'E' "ゲ" + "g" 'O' "ゴ" +# + "h" 'A' "ハ" + "h" 'I' "ヒ" + "h" 'U' "フ" + "h" 'E' "ヘ" + "h" 'O' "ホ" +# + "j" 'A' "ジャ" + "j" 'I' "ジ" + "j" 'U' "ジュ" + "j" 'E' "ジェ" + "j" 'O' "ジョ" +# + "l" 'A' "ラ" + "l" 'I' "リ" + "l" 'U' "ル" + "l" 'E' "レ" + "l" 'O' "ロ" +# + "m" 'A' "マ" + "m" 'I' "ミ" + "m" 'U' "ム" + "m" 'E' "メ" + "m" 'O' "モ" +# + "n" 'A' "ナ" + "n" 'I' "ニ" + "n" 'U' "ヌ" + "n" 'E' "ネ" + "n" 'O' "ノ" +# + "n" 'N' "ン" +# + "p" 'A' "パ" + "p" 'I' "ピ" + "p" 'U' "プ" + "p" 'E' "ペ" + "p" 'O' "ポ" +# + "q" 'A' "クァ" + "q" 'I' "クィ" + "q" 'U' "ク" + "q" 'E' "クェ" + "q" 'O' "クォ" +# + "r" 'A' "ラ" + "r" 'I' "リ" + "r" 'U' "ル" + "r" 'E' "レ" + "r" 'O' "ロ" +# + "s" 'A' "サ" + "s" 'I' "シ" + "s" 'U' "ス" + "s" 'E' "セ" + "s" 'O' "ソ" +# + "t" 'A' "タ" + "t" 'I' "チ" + "t" 'U' "ツ" + "t" 'E' "テ" + "t" 'O' "ト" +# + "v" 'A' "ヴァ" + "v" 'I' "ヴィ" + "v" 'U' "ヴ" + "v" 'E' "ヴェ" + "v" 'O' "ヴォ" +# + "w" 'A' "ワ" + "w" 'I' "ヰ" + "w" 'U' "ウ" + "w" 'E' "ヱ" + "w" 'O' "ヲ" +# + "x" 'A' "ァ" + "x" 'I' "ィ" + "x" 'U' "ゥ" + "x" 'E' "ェ" + "x" 'O' "ォ" +# + "y" 'A' "ヤ" + "y" 'I' "イ" + "y" 'U' "ユ" + "y" 'E' "イェ" + "y" 'O' "ヨ" +# + "z" 'A' "ザ" + "z" 'I' "ジ" + "z" 'U' "ズ" + "z" 'E' "ゼ" + "z" 'O' "ゾ" +# + "" 'A' "ア" + "" 'I' "イ" + "" 'U' "ウ" + "" 'E' "エ" + "" 'O' "オ" +# + "n" '\'' "ン" + "n" 'B' "ンB" + "n" 'C' "ンC" + "n" 'D' "ンD" + "n" 'F' "ンF" + "n" 'G' "ンG" + "n" 'H' "ンH" + "n" 'J' "ンJ" + "n" 'K' "ンK" + "n" 'L' "ンL" + "n" 'M' "ンM" + "n" 'N' "ンN" + "n" 'P' "ンP" + "n" 'R' "ンR" + "n" 'Q' "ンQ" + "n" 'S' "ンS" + "n" 'T' "ンT" + "n" 'V' "ンV" + "n" 'W' "ンW" + "n" 'X' "ンX" +# "n" 'Y' "ンY" + "n" 'Z' "ンZ" +# + "b" 'B' "ッB" + "c" 'C' "ッC" + "d" 'D' "ッD" + "f" 'F' "ッF" + "g" 'G' "ッG" + "h" 'H' "ッH" + "j" 'J' "ッJ" + "k" 'K' "ッK" + "l" 'L' "ッL" + "m" 'M' "ッM" + "n" 'N' "ッN" + "p" 'P' "ッP" + "q" 'Q' "ッQ" + "r" 'R' "ッR" + "s" 'S' "ッS" + "t" 'T' "ッT" + "v" 'V' "ッV" + "w" 'W' "ッW" + "y" 'Y' "ッY" + "z" 'Z' "ッZ" +# アスキーで記号を入れたいときに + "x" '-' "-" + "x" '_' "ー" + "x" ',' "," + "x" '.' "." + "" kana_RO "・" + "" '-' "ー" + "" '_' "ー" + "" ',' "、" + "" '.' "。" convert diff -r 000000000000 -r 92745d501b9a ccdef/rule.wnnroma --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ccdef/rule.wnnroma Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,622 @@ +# $Id: rule.wnnroma,v 1.1 1989/10/19 21:08:07 ishisone Rel $ + +# *** Romaji - Kana conversion rule for wnn users *** +# +# この定義ファイルは naota@ouics1.ics.osaka-u.junet 氏の協力によるもので、 +# wnn の標準ローマ字かな変換ルールに近いものです。 +# +# rule.roma と以下のような点が違います。 +# ・ローマ字かな変換が wnn のデフォルトに近くなった +# ・ローマ字モードで句点で変換しないようにした +# ・ローマ字モードで[]が「」に変換されるようになった +# ・ローマ字モードで/が・に変換されるようになった +# ・ローマ字モードでnの処理が恐らくwnnと同じになった +# そのかわり 'n' を入力するといきなり 'ん' に変換される +# でもその後 'a' を入力すればちゃんと 'な' になるので安心してほしい + + "xts" 'u' "っ" + "\\ts" 'u' "っ" +# + "by" 'a' "びゃ" + "by" 'i' "びぃ" + "by" 'u' "びゅ" + "by" 'e' "びぇ" + "by" 'o' "びょ" +# + "ch" 'a' "ちゃ" + "ch" 'i' "ち" + "ch" 'u' "ちゅ" + "ch" 'e' "ちぇ" + "ch" 'o' "ちょ" +# + "dy" 'a' "ぢゃ" + "dy" 'i' "でぃ" + "dy" 'u' "ぢゅ" + "dy" 'e' "ぢぇ" + "dy" 'o' "ぢょ" +# + "gw" 'a' "ぐゎ" + "gw" 'i' "ぐぃ" + "gw" 'u' "ぐ" + "gw" 'e' "ぐぇ" + "gw" 'o' "ぐぉ" +# + "kw" 'a' "くゎ" + "kw" 'i' "くぃ" + "kw" 'u' "く" + "kw" 'e' "くぇ" + "kw" 'o' "くぉ" +# + "ky" 'a' "きゃ" + "ky" 'i' "きぃ" + "ky" 'u' "きゅ" + "ky" 'e' "きぇ" + "ky" 'o' "きょ" +# + "gy" 'a' "ぎゃ" + "gy" 'i' "ぎぃ" + "gy" 'u' "ぎゅ" + "gy" 'e' "ぎぇ" + "gy" 'o' "ぎょ" +# + "hy" 'a' "ひゃ" + "hy" 'i' "ひぃ" + "hy" 'u' "ひゅ" + "hy" 'e' "ひぇ" + "hy" 'o' "ひょ" +# + "ly" 'a' "りゃ" + "ly" 'i' "りぃ" + "ly" 'u' "りゅ" + "ly" 'e' "りぇ" + "ly" 'o' "りょ" +# + "my" 'a' "みゃ" + "my" 'i' "みぃ" + "my" 'u' "みゅ" + "my" 'e' "みぇ" + "my" 'o' "みょ" +# + "ny" 'a' "にゃ" + "ny" 'i' "にぃ" + "ny" 'u' "にゅ" + "ny" 'e' "にぇ" + "ny" 'o' "にょ" +# + "py" 'a' "ぴゃ" + "py" 'i' "ぴぃ" + "py" 'u' "ぴゅ" + "py" 'e' "ぴぇ" + "py" 'o' "ぴょ" +# + "ry" 'a' "りゃ" + "ry" 'i' "りぃ" + "ry" 'u' "りゅ" + "ry" 'e' "りぇ" + "ry" 'o' "りょ" +# + "sh" 'a' "しゃ" + "sh" 'i' "し" + "sh" 'u' "しゅ" + "sh" 'e' "しぇ" + "sh" 'o' "しょ" +# + "sy" 'a' "しゃ" + "sy" 'i' "しぃ" + "sy" 'u' "しゅ" + "sy" 'e' "しぇ" + "sy" 'o' "しょ" +# + "ts" 'a' "つぁ" + "ts" 'i' "つぃ" + "ts" 'u' "つ" + "ts" 'e' "つぇ" + "ts" 'o' "つぉ" +# + "ty" 'a' "ちゃ" + "ty" 'i' "てぃ" + "ty" 'u' "ちゅ" + "ty" 'e' "ちぇ" + "ty" 'o' "ちょ" +# + "xk" 'a' "ヵ" + "xk" 'e' "ヶ" + "\\k" 'a' "ヵ" + "\\k" 'e' "ヶ" +# + "xt" 'u' "っ" + "\\t" 'u' "っ" +# + "xy" 'a' "ゃ" + "xy" 'u' "ゅ" + "xy" 'o' "ょ" + "\\y" 'a' "ゃ" + "\\y" 'u' "ゅ" + "\\y" 'o' "ょ" +# + "xw" 'a' "ゎ" + "xw" 'i' "うぃ" + "xw" 'e' "うぇ" + "xw" 'o' "うぉ" + "\\w" 'a' "ゎ" +# + "zy" 'a' "じゃ" + "zy" 'i' "じぃ" + "zy" 'u' "じゅ" + "zy" 'e' "じぇ" + "zy" 'o' "じょ" +# + "b" 'a' "ば" + "b" 'i' "び" + "b" 'u' "ぶ" + "b" 'e' "べ" + "b" 'o' "ぼ" +# + "d" 'a' "だ" + "d" 'i' "ぢ" + "d" 'u' "づ" + "d" 'e' "で" + "d" 'o' "ど" +# + "f" 'a' "ふぁ" + "f" 'i' "ふぃ" + "f" 'u' "ふ" + "f" 'e' "ふぇ" + "f" 'o' "ふぉ" +# + "g" 'a' "が" + "g" 'i' "ぎ" + "g" 'u' "ぐ" + "g" 'e' "げ" + "g" 'o' "ご" +# + "h" 'a' "は" + "h" 'i' "ひ" + "h" 'u' "ふ" + "h" 'e' "へ" + "h" 'o' "ほ" +# + "j" 'a' "じゃ" + "j" 'i' "じ" + "j" 'u' "じゅ" + "j" 'e' "じぇ" + "j" 'o' "じょ" +# + "k" 'a' "か" + "k" 'i' "き" + "k" 'u' "く" + "k" 'e' "け" + "k" 'o' "こ" +# + "l" 'a' "ら" + "l" 'i' "り" + "l" 'u' "る" + "l" 'e' "れ" + "l" 'o' "ろ" +# + "m" 'a' "ま" + "m" 'i' "み" + "m" 'u' "む" + "m" 'e' "め" + "m" 'o' "も" +# + "m" 'b' "んb" + "m" 'm' "んm" + "m" 'p' "んp" +# + "ん" 'a' "な" + "ん" 'i' "に" + "ん" 'u' "ぬ" + "ん" 'e' "ね" + "ん" 'o' "の" + "ン" 'a' "な" + "ン" 'i' "に" + "ン" 'u' "ぬ" + "ン" 'e' "ね" + "ン" 'o' "の" +# + "p" 'a' "ぱ" + "p" 'i' "ぴ" + "p" 'u' "ぷ" + "p" 'e' "ぺ" + "p" 'o' "ぽ" +# + "q" 'a' "くぁ" + "q" 'i' "くぃ" + "q" 'u' "く" + "q" 'e' "くぇ" + "q" 'o' "くぉ" +# + "r" 'a' "ら" + "r" 'i' "り" + "r" 'u' "る" + "r" 'e' "れ" + "r" 'o' "ろ" +# + "s" 'a' "さ" + "s" 'i' "し" + "s" 'u' "す" + "s" 'e' "せ" + "s" 'o' "そ" +# + "t" 'a' "た" + "t" 'i' "ち" + "t" 'u' "つ" + "t" 'e' "て" + "t" 'o' "と" +# + "v" 'a' "ヴァ" + "v" 'i' "ヴィ" + "v" 'u' "ヴ" + "v" 'e' "ヴェ" + "v" 'o' "ヴォ" +# + "w" 'a' "わ" + "w" 'i' "ゐ" + "w" 'u' "う" + "w" 'e' "ゑ" + "w" 'o' "を" +# + "x" 'a' "ぁ" + "x" 'i' "ぃ" + "x" 'u' "ぅ" + "x" 'e' "ぇ" + "x" 'o' "ぉ" + "\\" 'a' "ぁ" + "\\" 'i' "ぃ" + "\\" 'u' "ぅ" + "\\" 'e' "ぇ" + "\\" 'o' "ぉ" +# + "y" 'a' "や" + "y" 'i' "い" + "y" 'u' "ゆ" + "y" 'e' "いぇ" + "y" 'o' "よ" +# + "z" 'a' "ざ" + "z" 'i' "じ" + "z" 'u' "ず" + "z" 'e' "ぜ" + "z" 'o' "ぞ" +# + "" 'a' "あ" + "" 'i' "い" + "" 'u' "う" + "" 'e' "え" + "" 'o' "お" +# + "ん" '\'' "ん/" + "ん" 'y' "ny" + "ン" 'Y' "ny" +# + "b" 'b' "っb" + "c" 'c' "っc" + "d" 'd' "っd" + "f" 'f' "っf" + "g" 'g' "っg" + "h" 'h' "っh" + "j" 'j' "っj" + "k" 'k' "っk" + "l" 'l' "っl" + "m" 'm' "っm" + "n" 'n' "っn" + "p" 'p' "っp" + "q" 'q' "っq" + "r" 'r' "っr" + "s" 's' "っs" + "t" 't' "っt" + "v" 'v' "っv" + "w" 'w' "っw" + "y" 'y' "っy" + "z" 'z' "っz" +# カタカナ + "xts" 'U' "ッ" + "\\ts" 'U' "ッ" +# + "by" 'A' "ビャ" + "by" 'I' "ビィ" + "by" 'U' "ビュ" + "by" 'E' "ビェ" + "by" 'O' "ビョ" +# + "ch" 'A' "チャ" + "ch" 'I' "チ" + "ch" 'U' "チュ" + "ch" 'E' "チェ" + "ch" 'O' "チョ" +# + "dy" 'A' "ヂャ" + "dy" 'I' "ディ" + "dy" 'U' "ヂュ" + "dy" 'E' "ヂェ" + "dy" 'O' "ヂョ" +# + "gw" 'A' "グヮ" + "gw" 'I' "グィ" + "gw" 'U' "グ" + "gw" 'E' "グェ" + "gw" 'O' "グォ" +# + "kw" 'A' "クヮ" + "kw" 'I' "クィ" + "kw" 'U' "ク" + "kw" 'E' "クェ" + "kw" 'O' "クォ" +# + "ky" 'A' "キャ" + "ky" 'I' "キィ" + "ky" 'U' "キュ" + "ky" 'E' "キェ" + "ky" 'O' "キョ" +# + "gy" 'A' "ギャ" + "gy" 'I' "ギィ" + "gy" 'U' "ギュ" + "gy" 'E' "ギェ" + "gy" 'O' "ギョ" +# + "hy" 'A' "ヒャ" + "hy" 'I' "ヒィ" + "hy" 'U' "ヒュ" + "hy" 'E' "ヒェ" + "hy" 'O' "ヒョ" +# + "ly" 'A' "リャ" + "ly" 'I' "リィ" + "ly" 'U' "リュ" + "ly" 'E' "リェ" + "ly" 'O' "リョ" +# + "my" 'A' "ミャ" + "my" 'I' "ミィ" + "my" 'U' "ミュ" + "my" 'E' "ミェ" + "my" 'O' "ミョ" +# + "ny" 'A' "ニャ" + "ny" 'I' "ニィ" + "ny" 'U' "ニュ" + "ny" 'E' "ニェ" + "ny" 'O' "ニョ" +# + "py" 'A' "ピャ" + "py" 'I' "ピィ" + "py" 'U' "ピュ" + "py" 'E' "ピェ" + "py" 'O' "ピョ" +# + "ry" 'A' "リャ" + "ry" 'I' "リィ" + "ry" 'U' "リュ" + "ry" 'E' "リェ" + "ry" 'O' "リョ" +# + "sh" 'A' "シャ" + "sh" 'I' "シ" + "sh" 'U' "シュ" + "sh" 'E' "シェ" + "sh" 'O' "ショ" +# + "sy" 'A' "シャ" + "sy" 'I' "シィ" + "sy" 'U' "シュ" + "sy" 'E' "シェ" + "sy" 'O' "ショ" +# + "ts" 'A' "ツァ" + "ts" 'I' "ツィ" + "ts" 'U' "ツ" + "ts" 'E' "ツェ" + "ts" 'O' "ツォ" +# + "ty" 'A' "チャ" + "ty" 'I' "ティ" + "ty" 'U' "チュ" + "ty" 'E' "チェ" + "ty" 'O' "チョ" +# + "xk" 'A' "ヵ" + "xk" 'E' "ヶ" + "\\k" 'A' "ヵ" + "\\k" 'E' "ヶ" +# + "xt" 'u' "ッ" + "\\t" 'u' "ッ" +# + "xy" 'A' "ャ" + "xy" 'U' "ュ" + "xy" 'O' "ョ" + "\\y" 'A' "ャ" + "\\y" 'U' "ュ" + "\\y" 'O' "ョ" +# + "xw" 'A' "ヮ" + "xw" 'I' "ウィ" + "xw" 'E' "ウェ" + "xw" 'O' "ウォ" +# + "zy" 'A' "ジャ" + "zy" 'I' "ジィ" + "zy" 'U' "ジュ" + "zy" 'E' "ジェ" + "zy" 'O' "ジョ" +# + "b" 'A' "バ" + "b" 'I' "ビ" + "b" 'U' "ブ" + "b" 'E' "ベ" + "b" 'O' "ボ" +# + "d" 'A' "ダ" + "d" 'I' "ヂ" + "d" 'U' "ヅ" + "d" 'E' "デ" + "d" 'O' "ド" +# + "f" 'A' "ファ" + "f" 'I' "フィ" + "f" 'U' "フ" + "f" 'E' "フェ" + "f" 'O' "フォ" +# + "k" 'A' "カ" + "k" 'I' "キ" + "k" 'U' "ク" + "k" 'E' "ケ" + "k" 'O' "コ" +# + "g" 'A' "ガ" + "g" 'I' "ギ" + "g" 'U' "グ" + "g" 'E' "ゲ" + "g" 'O' "ゴ" +# + "h" 'A' "ハ" + "h" 'I' "ヒ" + "h" 'U' "フ" + "h" 'E' "ヘ" + "h" 'O' "ホ" +# + "j" 'A' "ジャ" + "j" 'I' "ジ" + "j" 'U' "ジュ" + "j" 'E' "ジェ" + "j" 'O' "ジョ" +# + "l" 'A' "ラ" + "l" 'I' "リ" + "l" 'U' "ル" + "l" 'E' "レ" + "l" 'O' "ロ" +# + "m" 'A' "マ" + "m" 'I' "ミ" + "m" 'U' "ム" + "m" 'E' "メ" + "m" 'O' "モ" +# + "m" 'B' "ンB" + "m" 'M' "ンM" + "m" 'P' "ンP" +# + "ん" 'A' "ナ" + "ん" 'I' "ニ" + "ん" 'U' "ヌ" + "ん" 'E' "ネ" + "ん" 'O' "ノ" + "ン" 'A' "ナ" + "ン" 'I' "ニ" + "ン" 'U' "ヌ" + "ン" 'E' "ネ" + "ン" 'O' "ノ" +# + "p" 'A' "パ" + "p" 'I' "ピ" + "p" 'U' "プ" + "p" 'E' "ペ" + "p" 'O' "ポ" +# + "q" 'A' "クァ" + "q" 'I' "クィ" + "q" 'U' "ク" + "q" 'E' "クェ" + "q" 'O' "クォ" +# + "r" 'A' "ラ" + "r" 'I' "リ" + "r" 'U' "ル" + "r" 'E' "レ" + "r" 'O' "ロ" +# + "s" 'A' "サ" + "s" 'I' "シ" + "s" 'U' "ス" + "s" 'E' "セ" + "s" 'O' "ソ" +# + "t" 'A' "タ" + "t" 'I' "チ" + "t" 'U' "ツ" + "t" 'E' "テ" + "t" 'O' "ト" +# + "v" 'A' "ヴァ" + "v" 'I' "ヴィ" + "v" 'U' "ヴ" + "v" 'E' "ヴェ" + "v" 'O' "ヴォ" +# + "w" 'A' "ワ" + "w" 'I' "ヰ" + "w" 'U' "ウ" + "w" 'E' "ヱ" + "w" 'O' "ヲ" +# + "x" 'A' "ァ" + "x" 'I' "ィ" + "x" 'U' "ゥ" + "x" 'E' "ェ" + "x" 'O' "ォ" + "\\" 'A' "ァ" + "\\" 'I' "ィ" + "\\" 'U' "ゥ" + "\\" 'E' "ェ" + "\\" 'O' "ォ" +# + "y" 'A' "ヤ" + "y" 'I' "イ" + "y" 'U' "ユ" + "y" 'E' "イェ" + "y" 'O' "ヨ" +# + "z" 'A' "ザ" + "z" 'I' "ジ" + "z" 'U' "ズ" + "z" 'E' "ゼ" + "z" 'O' "ゾ" +# + "" 'A' "ア" + "" 'I' "イ" + "" 'U' "ウ" + "" 'E' "エ" + "" 'O' "オ" +# + "ン" '\'' "ン/" + "ん" 'Y' "ny" + "ン" 'Y' "ny" +# + "b" 'B' "ッB" + "c" 'C' "ッC" + "d" 'D' "ッD" + "f" 'F' "ッF" + "g" 'G' "ッG" + "h" 'H' "ッH" + "j" 'J' "ッJ" + "k" 'K' "ッK" + "l" 'L' "ッL" + "m" 'M' "ッM" + "n" 'N' "ッN" + "p" 'P' "ッP" + "q" 'Q' "ッQ" + "r" 'R' "ッR" + "s" 'S' "ッS" + "t" 'T' "ッT" + "v" 'V' "ッV" + "w" 'W' "ッW" + "y" 'Y' "ッY" + "z" 'Z' "ッZ" +# アスキーで記号を入れたいときに + "x" '-' "-" + "x" '_' "ー" + "x" ',' "," + "x" '.' "." + "" '/' "・" + "" '-' "ー" + "" '_' "ー" + "" ',' "、" + "" '.' "。" convert + "" '[' "「" + "" ']' "」" + "" 'n' "ん" + "" 'N' "ン" diff -r 000000000000 -r 92745d501b9a ccdef/rule.zascii --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ccdef/rule.zascii Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,100 @@ +# $Id: rule.zascii,v 1.1 1989/10/19 21:08:16 ishisone Rel $ + +# character conversion rule for double-width ascii characters + +# 全角アスキー変換ルール + "" ' ' " " + "" '!' "!" + "" '"' "“" + "" '#' "#" + "" '$' "$" + "" '%' "%" + "" '&' "&" + "" '\'' "’" + "" '(' "(" + "" ')' ")" + "" '*' "*" + "" '+' "+" + "" ',' "," + "" '-' "−" + "" '.' "." + "" '/' "/" + "" '0' "0" + "" '1' "1" + "" '2' "2" + "" '3' "3" + "" '4' "4" + "" '5' "5" + "" '6' "6" + "" '7' "7" + "" '8' "8" + "" '9' "9" + "" ':' ":" + "" ';' ";" + "" '<' "<" + "" '=' "=" + "" '>' ">" + "" '?' "?" + "" '@' "@" + "" 'A' "A" + "" 'B' "B" + "" 'C' "C" + "" 'D' "D" + "" 'E' "E" + "" 'F' "F" + "" 'G' "G" + "" 'H' "H" + "" 'I' "I" + "" 'J' "J" + "" 'K' "K" + "" 'L' "L" + "" 'M' "M" + "" 'N' "N" + "" 'O' "O" + "" 'P' "P" + "" 'Q' "Q" + "" 'R' "R" + "" 'S' "S" + "" 'T' "T" + "" 'U' "U" + "" 'V' "V" + "" 'W' "W" + "" 'X' "X" + "" 'Y' "Y" + "" 'Z' "Z" + "" '[' "[" + "" '\\' "¥" + "" ']' "]" + "" '^' "^" + "" '_' "_" + "" '`' "‘" + "" 'a' "a" + "" 'b' "b" + "" 'c' "c" + "" 'd' "d" + "" 'e' "e" + "" 'f' "f" + "" 'g' "g" + "" 'h' "h" + "" 'i' "i" + "" 'j' "j" + "" 'k' "k" + "" 'l' "l" + "" 'm' "m" + "" 'n' "n" + "" 'o' "o" + "" 'p' "p" + "" 'q' "q" + "" 'r' "r" + "" 's' "s" + "" 't' "t" + "" 'u' "u" + "" 'v' "v" + "" 'w' "w" + "" 'x' "x" + "" 'y' "y" + "" 'z' "z" + "" '{' "{" + "" '|' "|" + "" '}' "}" + "" '~' "〜" diff -r 000000000000 -r 92745d501b9a client/README --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/client/README Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,21 @@ +This directory contains a simple client-side library for the kinput2 +protocol. + +* Files + README -- this file + convlib.c -- a simple client-side library + +You can find detailed description of kinput2 protocol in +../doc/protocol (written in Japanese). + +Although kinput2 protocol is simple and easy to implement, it is a +non-standard protocol, and there are few input servers which +understand it. So if you want to make your application general and +portable, maybe using this protocol is not a right way. + +Convlib.c is a client-side library for handling kinput2 protocol. It +is designed to be used with Xt library, so it is difficult for +applications which doesn't use Xt to make use of it. In such cases, +you should use XIM interface provided by Xlib, and still you can use +kinput2 as the input server via X Input Method Protocol or Ximp +protocol. diff -r 000000000000 -r 92745d501b9a client/convlib.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/client/convlib.c Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,1009 @@ +/* + * convlib2.c -- X11 $B%D!<%k%-%C%HJQ49F~NOMQ%i%$%V%i%j(B + * + * ishisone@sra.co.jp + */ + +/* + * Copyright (c) 1991 Software Research Associates, Inc. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Software Research Associates not be + * used in advertising or publicity pertaining to distribution of the + * software without specific, written prior permission. Software Research + * Associates makes no representations about the suitability of this software + * for any purpose. It is provided "as is" without express or implied + * warranty. + * + * Author: Makoto Ishisone, Software Research Associates, Inc., Japan + */ + +/* + * --$B%$%s%?!<%U%'%$%9(B-- + * + * $BMQ0U$5$l$F$$$k%U%!%s%/%7%g%s$O$C$F$$$J$$!#$7$+$7(B Xt $B%D!<%k%-%C%H$r(B + * $BMxMQ$9$k%W%m%0%i%`$J$i(B XIM $B$h$j$b$O$k$+$K4JC1$KAH$_9~$`$3$H$,$G$-$k$@(B + * $B$m$&!#(B + * + * int _beginConversionWithAttributes( + * Widget w, $BJQ49F~NO$r$7$?$$(B widget + * Atom catom, $B%;%l%/%7%g%s%"%H%`(B eg "_JAPANESE_CONVERSION" + * Atom tatom, $BJQ49%F%-%9%H%?%$%W(B eg "COMPOUND_TEXT" + * void (*inputproc)(), $BJQ49%F%-%9%HF~NO%3!<%k%P%C%/4X?t(B + * void (*startendproc)(), $BJQ493+;O(B / $B=*N;(B / $B%"%\!<%H(B $B%3!<%k%P%C%/4X?t(B + * XtPointer client_data, $B%3!<%k%P%C%/4X?t$KEO$5$l$k%G!<%?(B + * ArgList attrs, $BJQ49B0@-%j%9%H(B + * Cardinal nattrs $BB0@-%j%9%H$N9`L\?t(B + * ) + * + * $BJQ49$r3+;O$9$k!#$b$C$H@53N$K$$$&$H!"0z?t(B catom $B$K;XDj$5$l$?%;%l(B + * $B%/%7%g%s%"%H%`$N%*!<%J!<(B ($B$3$l$,JQ49%U%m%s%H%(%s%I!"Nc$($P(B + * kinput2 $B$G$"$k(B) $B$rC5$7!"JQ49$N%j%/%(%9%H$rAw$k!#F1;~$K0z?t(B attrs + * $B$G;XDj$5$l$kJQ49B0@-(B ($BNc$($P%+!<%=%k$N0LCV(B) $B$r%U%m%s%H%(%s%I$KDL(B + * $BCN$9$k!#JQ49B0@-$K$D$$$F$O8e$GJL$K@bL@$9$k!#%U%m%s%H%(%s%I$,B8:_(B + * $B$7$J$$;~$K$O(B -1 $B$r!"$=$l0J30$O(B 0 $B$rJV$9!#(B + * + * startendproc $B$OJQ49$N>uBV$NJQ2=$r%"%W%j%1!<%7%g%s$KCN$i$;$k$?$a(B + * $B$N%3!<%k%P%C%/$G$"$k!#$3$N%U%!%s%/%7%g%s$O$l(B + * 0: $B%U%m%s%H%(%s%I$,JQ49%j%/%(%9%H$r$N%(%s%3!<(B + * $B%G%#%s%0$r%5%]!<%H$9$k$+$I$&$+$O%U%m%s%H%(%s%I$N%$%s%W%j%a%s%F!<(B + * $B%7%g%s$K0MB8$9$k!#=>$C$F(B COMPOUNT_TEXT $B0J30$N%(%s%3!<%G%#%s%0$r(B + * $B;XDj$9$k$H!"$C$F(B XGetWindowProperty() $B$N@bL@$r;2>H$9$k$H(B + * $B3F%Q%i%a!<%?$N0UL#$,$O$C$-$j$o$+$k$@$m$&!#(B + * + * void _changeConversionAttributes( + * Widget w, + * Atom catom, $B%;%l%/%7%g%s%"%H%`(B eg "_JAPANESE_CONVERSION" + * ArgList attrs, $BJQ49B0@-%j%9%H(B + * Cardinal nattrs $BB0@-%j%9%H$N9`L\?t(B + * ) + * + * $BJQ49Cf$KJQ49B0@-$rJQ2=$5$;$k!#Nc$($P%+!<%=%k0LCV$,JQ$o$C$?$H$-$K(B + * $B$3$N%U%!%s%/%7%g%s$G$=$l$r%U%m%s%H%(%s%I$KCN$i$;$k$3$H$,$G$-$k!#(B + * + * void _endConversion( + * Widget w, + * Atom catom, $B%;%l%/%7%g%s%"%H%`(B eg "_JAPANESE_CONVERSION" + * Boolean throwaway $B$3$N8eMh$?JQ497k2L$ro!"JQ49$N=*N;$OJQ49%U%m%s%H%(%s%I$,9T$J$&$N(B + * $B$GFC$K%"%W%j%1!<%7%g%s$+$i$3$N%U%!%s%/%7%g%s$r;H$C$F6/@)E*$K=*N;(B + * $B$5$;$kI,MW$O$J$$!#(B + * $B0z?t(B throwaway $B$,(B True $B$@$H$3$N%U%!%s%/%7%g%s$ruBV$NJQ2=$bCN$k$3$H$,$G$-$J$$$N$G!"$G$-$k$@$1(B + * _beginConversionWithAttributes() $B$rMQ$$$k$N$,K>$^$7$$!#(B + * + * + * --$B%;%l%/%7%g%s%"%H%`(B-- + * + * _beginConversionWithAttributes() $B$J$I$K;XDj$9$k%;%l%/%7%g%s%"%H%`$O(B + * $BF~NO$7$?$$8@8l$K$h$C$F0[$J$j!"A0$K$J$C$F$$$k!#(B + * "_<$B8@8lL>(B>_CONVERSION" + * $BNc$($PF|K\8l$N>l9g$O(B "_JAPANESE_CONVERSION" $B$G$"$k!#(B + * + * + * --$BJQ49B0@-%j%9%H(B-- + * + * $BJQ49B0@-$O(B XtSetValues() $B$J$I$G;HMQ$5$l$k%j%9%H$HF1$87A(B (ArgList) $B$G$"$k!#(B + * $BB0@-$H$7$F;XDj$G$-$k$N$OH$7$F$[$7$$!#(B + * + * "inputStyle" : $BCM(B String + * $BF~NO%9%?%$%k$r;XDj$9$k!#CM$O(B + * "root" (root window style): $BJL%&%#%s%I%&$K$h$kJQ49(B + * "off" (off-the-spot style): $B;XDj$7$?JQ49NN0hFb$G$NJQ49(B + * "over" (over-the-spot style): $B$=$N>lJQ49(B + * $B$N$I$l$+$NJ8;zNs$r;XDj$9$k!#(B + * + * "focusWindow" : $BCM(B Window + * $BJQ49$r9T$J$&%&%#%s%I%&$r;XDj$9$k!#$3$l$,;XDj$5$l$?$J$+$C$?>l9g$K(B + * $B$O(B _beginConversionWithAttributes() $B$G;XDj$7$?(B Widget $B$N%&%#%s%I(B + * $B%&$,;H$o$l$k$N$GDL>o$O;XDj$7$J$/$F$h$$!#(B + * + * "spotX", "spotY" : $BCM(B Position + * $B%9%]%C%H%m%1!<%7%g%s$r;XDj$9$k!#$3$l$OF~NO%9%?%$%k$,(B + * over-the-spot $B$N;~$N$_M-8z$G$"$k!#J8;z$r=q$-;O$a$k0LCV$r;XDj$9$k(B + * $B$,!"(BspotY $B$O%Y!<%9%i%$%s$N0LCV$G$"$k$3$H$KCm0U!#(B + * spotX$B!"(BspotY $B$N$&$AJRJ}$@$1;XDj$7$F$bL58z!#(B + * + * "foreground", "background" : $BCM(B Pixel + * $BA07J?'!"GX7J?'$r;XDj$9$k!#$3$l$bJRJ}$@$1;XDj$7$F$bL58z!#(B + * + * "eventCaptureMethod" : $BCM(B String + * $B%U%m%s%H%(%s%I$,$I$N$h$&$KF~NO%$%Y%s%H$r$H$k$+$r;XDj$9$k!#(B + * "none" $B2?$b$7$J$$(B + * "inputOnly" InputOnly $B%&%#%s%I%&$K$h$k(B + * "focusSelect" $B%U%)!<%+%9%&%#%s%I%&$N%$%Y%s%H$rD>@\(B + * $B%;%l%/%H$9$k(B + * $B$G$"$k!#(B + * + * "$B2?$b$7$J$$(B" $B$r;XDj$7$?>l9g!"%"%W%j%1!<%7%g%s$OJQ49Cf$K%"%W%j%1!<(B + * $B%7%g%s$KMh$?%$%Y%s%H$r%U%m%s%H%(%s%I$KEO$7$F(B (XSendEvent() $B$r;H(B + * $B$&(B) $B$d$i$J$1$l$P$J$i$J$$!#$3$N%$%Y%s%H$N%U%)%o!<%I:n6H$O$3$N%i%$(B + * $B%V%i%j$G$O%5%]!<%H$7$F$$$J$$!#=>$C$F(B "$B2?$b$7$J$$(B" $B$r;XDj$9$k$3$H(B + * $B$O$"$^$j$*4+$a$7$J$$!#(B + * + * "$B%U%)!<%+%9%&%#%s%I%&$N%$%Y%s%H$rD>@\%;%l%/%H$9$k(B" $B>l9g!"%"%W%j(B + * $B%1!<%7%g%s$OJQ49Cf$O(B sendevent $B%U%i%0$NN)$C$F$$$J$$%-!<%$%Y%s%H(B + * $B$rL5;k$7$J$/$F$O$J$i$J$$!#(Bsendevent $B%U%i%0$NN)$C$?%-!<%$%Y%s%H$O(B + * $B%U%m%s%H%(%s%I$+$iLa$5$l$?%$%Y%s%H$G$"$k2DG=@-$,$"$j!"$3$l$OL5;k(B + * $B$7$J$/$F$bNI$$$,!"EvA3$N$3$H$J$,$i%;%-%e%j%F%#$K$O5$$r$D$1$J$/$F(B + * $B$O$J$i$J$$!#(B + * + * "InputOnly $B%&%#%s%I%&$K$h$k(B" $B$r;XDj$9$k$H%U%m%s%H%(%s%I$O%/%i%$(B + * $B%"%s%H$N%&%#%s%I%&(B ($B$3$l$O%U%)!<%+%9%&%#%s%I%&$G$O$J$/!"(B + * _beginConversionWithAttributes() $B$G;XDj$7$?(B Widget $B$N%&%#%s%I%&(B + * $B$G$"$k(B) $B$NA0$KF)L@$J%&%#%s%I%&$r:n$j!"$=$3$KMh$?%$%Y%s%H$r2#l9g%$%Y%s%H$O%U%m%s%H%(%s%I$,>!$C$FJ}K!$H(B + * $B$7$F$O$3$l$,0lHV4JC1$G$"$k!#$7$+$7$J$,$iNc$($P(B click-to-type $B7A(B + * $B<0$N%&%#%s%I%&%^%M!<%8%c$r;H$C$?$j$7$F%-!l9g$K$O$&$^$/$$$+$J$$!#(B + * + * "lineSpacing" : $BCM(B int + * $B9T4V3V$r;XDj$9$k!#%Y!<%9%i%$%s4V$N5wN%$r;XDj$9$k!#(B + * + * "clientArea" : $BCM(B XRectangle $B$X$N%]%$%s%?(B + * $BJQ49%F%-%9%H$NI=<($K;HMQ$9$kNN0h$r;XDj$9$k!#(B + * + * "statusArea" : $BCM(B XRectangle $B$X$N%]%$%s%?(B + * $B%b!<%II=<($K;HMQ$9$kNN0h$r;XDj$9$k!#(B + * + * "cursor" : $BCM(B Cursor + * $B;HMQ$9$k%+!<%=%k(B ($B%^%&%9%+!<%=%k$M(B) $B$r;XDj$9$k!#(B + * + * "fonts" : $BCM(B NULL $B%?!<%_%M!<%H$5$l$?(B XFontStruct * $B$NG[Ns(B + * $B;HMQ$9$k%U%)%s%H$r;XDj$9$k!#=gHV$O$I$&$G$b$h$$!#%U%m%s%H%(%s%IB&(B + * $B$GH=CG$9$k!#$?$@$7(B XLFD $B$K=>$o$J$$%U%)%s%H$r;XDj$5$l$k$H!"%U%m%s(B + * $B%H%(%s%I$G$=$N%-%c%i%/%?%;%C%H$,$o$+$i$:!"$=$N%U%)%s%H$,;H$o$l$J(B + * $B$$$3$H$,$"$k!#(B + * + * $B>e5-$NB0@-$N$&$A!"(BinputStyle $B$H(B eventCaptureMethod $B$OJQ49ESCf$G(B ($B$D$^$j(B + * _changeConversionAttributes() $B$G(B) $BJQ99$9$k$3$H$O$G$-$J$$!#(B + */ + +#ifndef lint +static char *rcsid = "$Id: convlib.c,v 1.13 1999/01/07 03:14:32 ishisone Exp $"; +#endif + +#include +#include +#include +#include +#include "ConvProto.h" + +typedef struct { + Display *display; + Atom profileAtom; /* "_CONVERSION_PROFILE" */ + Atom typeAtom; /* "_CONVERSION_ATTRIBUTE_TYPE" */ + Atom versionAtom; /* "PROTOCOL-2.0" */ + Atom reqAtom; /* "CONVERSION_REQUEST" */ + Atom notifyAtom; /* "CONVERSION_NOTIFY" */ + Atom endAtom; /* "CONVERSION_END" */ + Atom endReqAtom; /* "CONVERSION_END_REQUEST" */ + Atom attrAtom; /* "CONVERSION_ATTRIBUTE" */ + Atom attrNotifyAtom; /* "CONVERSION_ATTRIBUTE_NOTIFY" */ +} ConversionAtoms; + +typedef struct { + Atom convatom; + Window convowner; + Atom property; + void (*inputproc)(); + void (*startendproc)(); + XtPointer closure; +} ConversionContext; + +static XContext convertPrivContext; + +#if __STDC__ +/* function prototype */ +static void callStart(Widget, ConversionContext *, Window); +static void callFail(Widget, ConversionContext *); +static void callEnd(Widget, ConversionContext *); +static long getInputStyle(String); +static long getCaptureMethod(String); +static ConversionAtoms *getAtoms(Widget); +static ConversionContext *getConversionContext(Widget); +static void recvConvAck(Widget, XtPointer, XEvent *, Boolean *); +static void getConv(Widget, XtPointer, XEvent *, Boolean *); +static Boolean setConvAttrProp(Widget, ArgList, Cardinal, Atom); +static int makeAttrData(Widget, ArgList, Cardinal, unsigned long **); +static Boolean checkProtocols(Display *, Window, ConversionAtoms *); +#else +static void callStart(); +static void callFail(); +static void callEnd(); +static long getInputStyle(); +static long getCaptureMethod(); +static ConversionAtoms *getAtoms(); +static ConversionContext *getConversionContext(); +static void recvConvAck(); +static void getConv(); +static Boolean setConvAttrProp(); +static int makeAttrData(); +static Boolean checkProtocols(); +#endif + +static void +callStart(w, context, convwin) +Widget w; +ConversionContext *context; +Window convwin; +{ + if (context->startendproc != NULL) { + (*context->startendproc)(w, context->convatom, + 0, context->closure, convwin); + } +} + +static void +callFail(w, context) +Widget w; +ConversionContext *context; +{ + if (context->startendproc != NULL) { + (*context->startendproc)(w, context->convatom, + -1, context->closure, None); + } +} + +static void +callEnd(w, context) +Widget w; +ConversionContext *context; +{ + if (context->startendproc != NULL) { + (*context->startendproc)(w, context->convatom, + 1, context->closure, None); + } +} + +static long +getInputStyle(s) +String s; +{ + String p; + char buf[64]; + + (void)strcpy(buf, s); + for (p = buf; *p != '\0'; p++) { + if ('A' <= *p && *p <= 'Z') *p += 'a' - 'A'; + } + if (!strcmp(buf, "over")) return CONVARG_OVERTHESPOT; + if (!strcmp(buf, "off")) return CONVARG_OFFTHESPOT; + return CONVARG_ROOTWINDOW; +} + +static long +getCaptureMethod(s) +String s; +{ + String p; + char buf[64]; + + (void)strcpy(buf, s); + for (p = buf; *p != '\0'; p++) { + if ('A' <= *p && *p <= 'Z') *p += 'a' - 'A'; + } + if (!strcmp(buf, "none")) return CONVARG_NONE; + if (!strcmp(buf, "focusselect")) return CONVARG_SELECT_FOCUS_WINDOW; + return CONVARG_CREATE_INPUTONLY; +} + +static ConversionAtoms * +getAtoms(w) +Widget w; +{ + int i; + Display *disp = XtDisplay(w); + ConversionAtoms *cap; + static ConversionAtoms *convatomp; + static Cardinal ndisp = 0; +#define nalloc 2 + + /* + * $B%"%H%`$O%G%#%9%W%l%$$4$H$K0c$&$N$G!"(B + * $B%G%#%9%W%l%$$4$H$K:n$i$J$/$F$O$J$i$J$$(B + */ + + /* $B$9$G$K%"%H%`$,:n$i$l$F$$$k$+$I$&$+D4$Y$k(B */ + cap = convatomp; + for (i = 0; i < ndisp; i++, cap++) { + if (cap->display == disp) return cap; + } + + /* + * $B$^$@:n$i$l$F$$$J$$$N$G?7$7$/:n$k(B + */ + if (ndisp == 0) { + /* $B:G=i$J$N$G(B Context $B$bF1;~$K:n$k(B */ + convertPrivContext = XUniqueContext(); + convatomp = (ConversionAtoms *) + XtMalloc(sizeof(ConversionAtoms) * nalloc); + cap = convatomp; + } else if (ndisp % nalloc == 0) { + /* $B%5%$%:$rA}$d$9(B */ + convatomp = (ConversionAtoms *) + XtRealloc((char *)convatomp, + sizeof(ConversionAtoms) * (ndisp + nalloc)); + cap = convatomp + ndisp; + } else { + cap = convatomp + ndisp; + } + + /* $B%G%#%9%W%l%$$NEPO?(B */ + cap->display = disp; + + /* Atom $B$N:n@.(B */ + cap->profileAtom = XInternAtom(disp, CONVERSION_PROFILE, False); + cap->typeAtom = XInternAtom(disp, CONVERSION_ATTRIBUTE_TYPE, False); + cap->versionAtom = XInternAtom(disp, PROTOCOL_VERSION, False); + cap->reqAtom = XInternAtom(disp, "CONVERSION_REQUEST", False); + cap->notifyAtom = XInternAtom(disp, "CONVERSION_NOTIFY", False); + cap->endAtom = XInternAtom(disp, "CONVERSION_END", False); + cap->endReqAtom = XInternAtom(disp, "CONVERSION_END_REQUEST", False); + cap->attrAtom = XInternAtom(disp, "CONVERSION_ATTRIBUTE", False); + cap->attrNotifyAtom = XInternAtom(disp, "CONVERSION_ATTRIBUTE_NOTIFY", False); + + ndisp++; + + return cap; +} + +static ConversionContext * +getConversionContext(w) +Widget w; +{ + ConversionContext *context; + + if (XFindContext(XtDisplay(w), XtWindow(w), + convertPrivContext, (caddr_t *)&context)) { + /* error -- $BB?J,%3%s%F%-%9%H$,8+$D$+$i$J$+$C$?$?$a(B */ + return NULL; + } else { + return context; + } +} + +/* ARGSUSED */ +static void +recvConvAck(w, closure, ev, junk) +Widget w; +XtPointer closure; +XEvent *ev; +Boolean *junk; /* NOTUSED */ +{ + XClientMessageEvent *cev = &(ev->xclient); + ConversionAtoms *cap; + ConversionContext *context; + + if (ev->type != ClientMessage) return; + + cap = getAtoms(w); + context = getConversionContext(w); + + /* $B@5$7$$%$%Y%s%H$+$I$&$+%A%'%C%/$9$k(B */ + if (cev->window != XtWindow(w) || + cev->message_type != cap->notifyAtom || + cev->data.l[0] != context->convatom) { + return; + } + + /* + * $B$3$N%O%s%I%i$O$b$&MQ:Q$_$J$N$G30$9(B + */ + XtRemoveEventHandler(w, NoEventMask, True, recvConvAck, closure); + + if (cev->data.l[2] == None) { + XtWarning("selection request failed"); + XDeleteContext(XtDisplay(w), XtWindow(w), convertPrivContext); + callFail(w, context); + XtFree((char *)context); + return; + } + + callStart(w, context, (Window)cev->data.l[3]); + + /* + * PropertyNotify $B$H(B CONVERSION_END $BMQ$N%$%Y%s%H%O%s%I%i$r(B + * $BEPO?$9$k(B + */ + XtAddEventHandler(w, PropertyChangeMask, True, getConv, closure); + + /* $B%W%m%Q%F%#L>$r%9%H%"$9$k(B */ + context->property = cev->data.l[2]; +} + +/* ARGSUSED */ +static void +getConv(w, closure, ev, junk) +Widget w; +XtPointer closure; +XEvent *ev; +Boolean *junk; /* NOTUSED */ +{ + ConversionAtoms *cap; + ConversionContext *context; + + /* PropertyNotify $B$H(B ClientMessage $B0J30$OL5;k$9$k(B */ + if (ev->type != PropertyNotify && ev->type != ClientMessage) return; + + cap = getAtoms(w); + context = getConversionContext(w); + + if (ev->type == ClientMessage) { + XClientMessageEvent *cev = &(ev->xclient); + + /* + * $BK\Ev$KF~NO=*N;$N%$%Y%s%H$+$I$&$+%A%'%C%/$9$k(B + */ + if (cev->message_type == cap->endAtom && + cev->format == 32 && + cev->data.l[0] == context->convatom) { + /* $B%&%#%s%I%&$N%3%s%F%-%9%H$r:o=|$9$k(B */ + XDeleteContext(XtDisplay(w), XtWindow(w), + convertPrivContext); + /* $B%$%Y%s%H%O%s%I%i$r30$9(B */ + XtRemoveEventHandler(w, PropertyChangeMask, True, + getConv, closure); + callEnd(w, context); + XtFree((char *)context); + } + } else { /* PropertyNotify */ + XPropertyEvent *pev = &(ev->xproperty); + Atom proptype; + int propformat; + unsigned long propsize, rest; + unsigned char *propvalue; + + if (context->property == None) return; + + /* $B@5$7$$%$%Y%s%H$+$I$&$+$N%A%'%C%/(B */ + if (pev->window != XtWindow(w) || + pev->atom != context->property || + pev->state != PropertyNewValue) { + return; + } + + /* $B$b$7%3!<%k%P%C%/4X?t(B context->inputproc $B$,(B + * NULL $B$J$i$P%W%m%Q%F%#$r:o=|$9$k$@$1(B + */ + if (context->inputproc == NULL) { + XDeleteProperty(XtDisplay(w), XtWindow(w), context->property); + return; + } + + /* $B%W%m%Q%F%#$+$iJQ49J8;zNs$rproperty, + 0L, 100000L, True, AnyPropertyType, + &proptype, &propformat, &propsize, &rest, + &propvalue); + + /* $B%W%m%Q%F%#$N%?%$%W!&%U%)!<%^%C%H$N%A%'%C%/(B */ + if (proptype == None) { + /* $B%W%m%Q%F%#$,B8:_$7$J$+$C$?(B + * $B$3$l$OO"B3$7$F2?2s$b%W%m%Q%F%#$K%G!<%?$,(B + * $BF~$l$i$l$?;~!"0l2s$N(B GetWindowProperty $B$G(B + * $BJ#?t$N%G!<%?$r$H$C$F$7$^$C$?$"$H$K5/$-$k(B + * $B=>$C$F$3$l$O%(%i!<$G$O$J$$(B + */ + return; + } + + /* $B%3!<%k%P%C%/$r8F$V(B */ + (*context->inputproc)(w, context->convatom, + proptype, propformat, + propsize, propvalue, + context->closure); + } +} + +static Boolean +setConvAttrProp(w, attrs, nattrs, prop) +Widget w; +ArgList attrs; +Cardinal nattrs; +Atom prop; +{ + unsigned long *data; + int len; + + if ((len = makeAttrData(w, attrs, nattrs, &data)) > 0) { + XChangeProperty(XtDisplay(w), XtWindow(w), + prop, prop, 32, + PropModeReplace, (unsigned char *)data, len); + XtFree((char *)data); + return True; + } + return False; +} + +static int +makeAttrData(w, args, nargs, datap) +Widget w; +ArgList args; +Cardinal nargs; +unsigned long **datap; +{ + unsigned long *data; + Cardinal len; + Boolean spotx_specified = False, spoty_specified = False; + Boolean fore_specified = False, back_specified = False; + Pixel savedfg, savedbg; + Position savedx, savedy; + +#define ALLOC(n) \ + data = (unsigned long *)XtRealloc((char *)data, \ + sizeof(unsigned long)*(len+(n))) + + data = NULL; + len = 0; + while (nargs-- > 0) { + if (!strcmp(args->name, "spotX")) { + savedx = (Position)args->value; + spotx_specified = True; + } else if (!strcmp(args->name, "spotY")) { + savedy = (Position)args->value; + spoty_specified = True; + } else if (!strcmp(args->name, "foreground")) { + savedfg = (Pixel)args->value; + fore_specified = True; + } else if (!strcmp(args->name, "background")) { + savedbg = (Pixel)args->value; + back_specified = True; + } else if (!strcmp(args->name, "focusWindow")) { + Window win = (Window)args->value; + ALLOC(2); + data[len] = CONV_ATTR(CONVATTR_FOCUS_WINDOW, 1); + data[len + 1] = (unsigned long)win; + len += 2; + } else if (!strcmp(args->name, "inputStyle")) { + long style = getInputStyle((String)args->value); + ALLOC(2); + data[len] = CONV_ATTR(CONVATTR_INPUT_STYLE, 1); + data[len + 1] = style; + len += 2; + } else if (!strcmp(args->name, "eventCaptureMethod")) { + long method = getCaptureMethod((String)args->value); + ALLOC(2); + data[len] = CONV_ATTR(CONVATTR_EVENT_CAPTURE_METHOD, 1); + data[len + 1] = method; + len += 2; + } else if (!strcmp(args->name, "lineSpacing")) { + int spacing = (int)args->value; + ALLOC(2); + data[len] = CONV_ATTR(CONVATTR_LINE_SPACING, 1); + data[len + 1] = spacing; + len += 2; + } else if (!strcmp(args->name, "clientArea")) { + XRectangle *rectp = (XRectangle *)args->value; + ALLOC(3); + data[len] = CONV_ATTR(CONVATTR_CLIENT_AREA, 2); + data[len + 1] = (rectp->x << 16) | (rectp->y & 0xffff); + data[len + 2] = (rectp->width << 16) | (rectp->height & 0xffff); + len += 3; + } else if (!strcmp(args->name, "statusArea")) { + XRectangle *rectp = (XRectangle *)args->value; + ALLOC(3); + data[len] = CONV_ATTR(CONVATTR_STATUS_AREA, 2); + data[len + 1] = (rectp->x << 16) | (rectp->y & 0xffff); + data[len + 2] = (rectp->width << 16) | (rectp->height & 0xffff); + len += 3; + } else if (!strcmp(args->name, "cursor")) { + Cursor cursor = (Cursor)args->value; + ALLOC(2); + data[len] = CONV_ATTR(CONVATTR_CURSOR, 1); + data[len + 1] = cursor; + len += 2; + } else if (!strcmp(args->name, "fonts")) { + XFontStruct **fontp = (XFontStruct **)args->value; + int nfonts, nrealfonts; + int i; + + for (nfonts = 0; fontp[nfonts] != NULL; nfonts++) + ; + ALLOC(nfonts + 1); + nrealfonts = 0; + for (i = 0; i < nfonts; i++) { + unsigned long atom; + if (XGetFontProperty(fontp[i], XA_FONT, &atom)) { + data[len + ++nrealfonts] = atom; + } + } + data[len] = CONV_ATTR(CONVATTR_FONT_ATOMS, nrealfonts); + len += nrealfonts + 1; + } else { + String params[1]; + Cardinal num_params; + + params[0] = args->name; + XtAppWarningMsg(XtWidgetToApplicationContext(w), + "conversionError", "invalidResource", + "ConversionLibraryError", + "_beginConversionWithAttributes: unknown resource %s", + params, &num_params); + } + args++; + } + if (spotx_specified && spoty_specified) { + ALLOC(2); + data[len] = CONV_ATTR(CONVATTR_SPOT_LOCATION, 1); + data[len + 1] = (savedx << 16) | (savedy & 0xffff); + len += 2; + } + if (fore_specified && back_specified) { + ALLOC(3); + data[len] = CONV_ATTR(CONVATTR_COLOR, 2); + data[len + 1] = savedfg; + data[len + 2] = savedbg; + len += 3; + } + *datap = data; + return len; +#undef ALLOC +} + +static Boolean +checkProtocols(dpy, window, cap) +Display *dpy; +Window window; +ConversionAtoms *cap; +{ + Atom type; + int format; + unsigned long nitems; + unsigned long bytesafter; + unsigned long *data, *saveddata; + int err; + Boolean ret; + + data = NULL; + err = XGetWindowProperty(dpy, window, cap->profileAtom, + 0L, 100L, False, + cap->typeAtom, + &type, &format, &nitems, + &bytesafter, (unsigned char **)&data); + if (err) return False; + if (format != 32 || type != cap->typeAtom) { + if (data != NULL) XtFree((char *)data); + return False; + } + + ret = False; + saveddata = data; + while (nitems > 0) { + int code = CODE_OF_ATTR(*data); + int len = LENGTH_OF_ATTR(*data); + + data++; + nitems--; + if (nitems < len) break; + + switch (code) { + case CONVPROF_PROTOCOL_VERSION: + if (*data == cap->versionAtom) ret = True; + break; + case CONVPROF_SUPPORTED_STYLES: + break; /* XXX for now */ + default: + break; + } + data += len; + nitems -= len; + } + XtFree((char *)saveddata); + + return ret; +} + + +/* + * public functions + */ + +int +_beginConversionWithAttributes(w, catom, tatom, inputproc, startendproc, client_data, attrs, nattrs) +Widget w; +Atom catom; /* Selection Atom e.g. JAPANESE_CONVERSION */ +Atom tatom; /* Property Type Atom e.g. COMPOUND_TEXT */ +void (*inputproc)(); /* conversion text callback function */ +void (*startendproc)(); /* conversion start/end callback function */ +XtPointer client_data; /* client_data passed to callback function */ +ArgList attrs; /* attribute data */ +Cardinal nattrs; /* number of attr args */ +{ + Window owner; + XEvent event; + ConversionAtoms *cap; + ConversionContext *context; + Boolean anyattr; + + cap = getAtoms(w); + + /* $BJQ49%5!<%P$rC5$9(B */ + if ((owner = XGetSelectionOwner(XtDisplay(w), catom)) == None) { + /* $B$J$$(B + * $B$b$7$bJQ49Cf$@$C$?$iJQ49$rCf;_$9$k(B + */ + XtWarning("Conversion Server not found"); + if ((context = getConversionContext(w)) != NULL) { + /* $B%$%Y%s%H%O%s%I%i$r30$9(B */ + XtRemoveEventHandler(w, NoEventMask, True, recvConvAck, + (XtPointer)NULL); + XtRemoveEventHandler(w, PropertyChangeMask, True, getConv, + (XtPointer)NULL); + /* $B%&%#%s%I%&$N%3%s%F%-%9%H$r:o=|$9$k(B */ + XDeleteContext(XtDisplay(w), XtWindow(w), convertPrivContext); + callEnd(w, context); + XtFree((char *)context); + } + return -1; + } + + /* + * $B:#$9$G$KJQ49Cf$+$I$&$+D4$Y$k(B + * $BJQ49Cf$J$i2?$b$;$:$K%j%?!<%s$9$k!D$o$1$K$O$$$+$J$$(B + * $B$J$<$+$H$$$&$H!"JQ49%5!<%P$,2?$i$+$N;v>p$GESCf$G;`$s$@>l9g(B + * CONVERSION_END $B$,%/%i%$%"%s%H$KMh$J$$$3$H$,$"$k$+$i$G$"$k(B + * $B$=$3$G!"JQ49Cf$N>l9g$G$b(B SelectionOwner $B$rC5$7$F!"$=$l$,(B + * $B:G=i$K(B _beginConversion() $B$,8F$P$l$?;~$H(B WindowID $B$,F1$8$+(B + * $B$I$&$+3NG'$9$k(B + * $BK\Ev$O(B SelectionOwner $B$K$J$C$?;~4V$b%A%'%C%/$7$?$$$N$@$,(B + * ICCCM $B$K=R$Y$i$l$F$$$k$h$&$K!"(BGetSelectionOwner $B$G$O(B + * $B$=$l$,$o$+$i$J$$$N$G$"$-$i$a$k(B + */ + if ((context = getConversionContext(w)) != NULL) { + Window curOwner; + curOwner = (catom == context->convatom) ? owner : + XGetSelectionOwner(XtDisplay(w), context->convatom); + if (curOwner == context->convowner) { + /* $B2?$b$;$:$K%j%?!<%s(B */ + return 0; + } + /* SelectionOwner $B$,JQ$o$C$F$$$k(B + * $B$3$l$OESCf$GJQ49%5!<%P$,%/%i%C%7%e$7$?$K0c$$$J$$(B + * $B$H$$$&$3$H$G(B CONVERSION_END $B$,Mh$?;~$HF1$8$h$&$J(B + * $B=hM}$r$9$k(B + */ + /* $B%$%Y%s%H%O%s%I%i$r30$9(B + * CONVERSION_NOTIFY $B$N%$%Y%s%H$,Mh$k$^$G$O(B + * recvConvAck() $B$,%O%s%I%i$G!"$=$N8e$O(B + * getConv() $B$,%O%s%I%i$G$"$k(B + */ + XtRemoveEventHandler(w, NoEventMask, True, recvConvAck, + (XtPointer)NULL); + XtRemoveEventHandler(w, PropertyChangeMask, True, getConv, + (XtPointer)NULL); + /* $B%&%#%s%I%&$N%3%s%F%-%9%H$r:o=|$9$k(B */ + XDeleteContext(XtDisplay(w), XtWindow(w), convertPrivContext); + callEnd(w, context); + XtFree((char *)context); + } + + /* + * $B%5!<%P$+$i$N(B CONVERSION_NOTIFY $BMQ$N%$%Y%s%H%O%s%I%i$r(B + * $BEPO?$9$k(B + */ + XtAddEventHandler(w, NoEventMask, True, recvConvAck, (XtPointer)NULL); + + /* + * $B%3%s%F%-%9%H$r$D$/$C$FI,MW$J>pJs$rEPO?$9$k(B + */ + context = XtNew(ConversionContext); + context->convatom = catom; + context->convowner = owner; + context->property = None; /* $B$3$l$O(B CONVERSION_NOTIFY $B$,Mh$?;~$K(B + * $B@5$7$/@_Dj$5$l$k(B */ + context->inputproc = inputproc; + context->startendproc = startendproc; + context->closure = client_data; + XSaveContext(XtDisplay(w), XtWindow(w), + convertPrivContext, (caddr_t)context); + + /* + * $BJQ49B0@-%j%9%H$,;XDj$5$l$F$$$l$P%W%m%Q%F%#$K$=$l$rEPO?$9$k(B + */ + if (nattrs != 0 && attrs != NULL && + checkProtocols(XtDisplay(w), owner, cap)) { + anyattr = setConvAttrProp(w, attrs, nattrs, cap->attrAtom); + } + + /* + * ClientMessage $B%$%Y%s%H$r;H$C$FF|K\8lF~NO$r%j%/%(%9%H$9$k(B + */ + event.xclient.type = ClientMessage; + event.xclient.window = owner; + event.xclient.message_type = cap->reqAtom; + event.xclient.format = 32; + event.xclient.data.l[0] = catom; + event.xclient.data.l[1] = XtWindow(w); + event.xclient.data.l[2] = tatom; + /* $B7k2L$r%9%H%"$9$k%W%m%Q%F%#L>$O!"B?8@8l$rF1;~$K;HMQ$9$k$3$H$r(B + * $B9M$($F!"(Bselection atom $B$r;HMQ$9$k$3$H$K$9$k(B + */ + event.xclient.data.l[3] = catom; + event.xclient.data.l[4] = anyattr ? cap->attrAtom : None; + XSendEvent(XtDisplay(w), owner, False, NoEventMask, &event); + + return 0; +} + +/* this is provided for backward compatibility */ +void +_beginConversion(w, catom, tatom, inputproc, client_data) +Widget w; +Atom catom; /* Selection Atom e.g. JAPANESE_CONVERSION */ +Atom tatom; /* Property Type Atom e.g. COMPOUND_TEXT */ +void (*inputproc)(); /* conversion text callback function */ +XtPointer client_data; /* client_data passed to callback function */ +{ + (void)_beginConversionWithAttributes(w, catom, tatom, inputproc, + (void (*)())NULL, client_data, + (ArgList)NULL, 0); +} + +void +_changeConversionAttributes(w, catom, attrs, nattrs) +Widget w; +Atom catom; /* Selection Atom e.g. JAPANESE_CONVERSION */ +ArgList attrs; /* attribute data */ +Cardinal nattrs; /* number of attr args */ +{ + XEvent event; + ConversionAtoms *cap; + ConversionContext *context; + unsigned long *data; + int len; + + if (attrs == NULL || nattrs == 0) return; + + cap = getAtoms(w); + context = getConversionContext(w); + + if (context == NULL || (catom != None && catom != context->convatom)) { + return; + } + + if (XGetSelectionOwner(XtDisplay(w), context->convatom) != + context->convowner) { + /* $BJQ49%5!<%P$,0[$J$k!"$"$k$$$O$J$$(B */ + XtRemoveEventHandler(w, NoEventMask, True, recvConvAck, + (XtPointer)NULL); + XtRemoveEventHandler(w, PropertyChangeMask, True, getConv, + (XtPointer)NULL); + /* $B%&%#%s%I%&$N%3%s%F%-%9%H$r:o=|$9$k(B */ + XDeleteContext(XtDisplay(w), XtWindow(w), convertPrivContext); + callEnd(w, context); + XtFree((char *)context); + return; + } + + data = NULL; + if ((len = makeAttrData(w, attrs, nattrs, &data)) == 0) return; + + event.xclient.type = ClientMessage; + event.xclient.window = context->convowner; + event.xclient.message_type = cap->attrNotifyAtom; + event.xclient.format = 32; + event.xclient.data.l[0] = context->convatom; + event.xclient.data.l[1] = XtWindow(w); + if (len <= 3 && len == LENGTH_OF_ATTR(data[0]) + 1) { + int i; + /* $B%$%Y%s%H$NCf$K<}$^$k(B */ + for (i = 0; i < len; i++) { + event.xclient.data.l[2 + i] = data[i]; + } + } else { + XChangeProperty(XtDisplay(w), XtWindow(w), + cap->attrAtom, cap->attrAtom, 32, + PropModeReplace, (unsigned char *)data, len); + event.xclient.data.l[2] = CONV_ATTR(CONVATTR_INDIRECT, 1); + event.xclient.data.l[3] = cap->attrAtom; + } + + XSendEvent(XtDisplay(w), context->convowner, False, NoEventMask, &event); + + if (data != NULL) XtFree((char *)data); +} + +void +_endConversion(w, catom, throwaway) +Widget w; +Atom catom; /* Selection Atom */ +Boolean throwaway; +{ + XEvent event; + ConversionAtoms *cap; + ConversionContext *context; + + cap = getAtoms(w); + context = getConversionContext(w); + + if (context == NULL || (catom != None && catom != context->convatom)) { + return; + } + + if (XGetSelectionOwner(XtDisplay(w), context->convatom) != + context->convowner) { + /* $BJQ49%5!<%P$,0[$J$k!"$"$k$$$O$J$$(B */ + XtRemoveEventHandler(w, NoEventMask, True, recvConvAck, + (XtPointer)NULL); + XtRemoveEventHandler(w, PropertyChangeMask, True, getConv, + (XtPointer)NULL); + /* $B%&%#%s%I%&$N%3%s%F%-%9%H$r:o=|$9$k(B */ + XDeleteContext(XtDisplay(w), XtWindow(w), convertPrivContext); + /* $B%3!<%k%P%C%/$r8F$V(B */ + callEnd(w, context); + XtFree((char *)context); + return; + } + + if (throwaway) context->inputproc = NULL; + + event.xclient.type = ClientMessage; + event.xclient.window = context->convowner; + event.xclient.message_type = cap->endReqAtom; + event.xclient.format = 32; + event.xclient.data.l[0] = context->convatom; + event.xclient.data.l[1] = XtWindow(w); + + XSendEvent(XtDisplay(w), context->convowner, False, NoEventMask, &event); +} diff -r 000000000000 -r 92745d501b9a cmd/Imakefile --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cmd/Imakefile Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,49 @@ +#include "../Kinput2.conf" + + INCLUDES = -I../include -I.. + KI2LIB = ../lib/libKi2.a + IMLIB = ../lib/imlib/libim.a + +#ifdef UseWnn +#ifdef UseWnn6 +#ifdef StrlenNeeded + DEFW = -DUSE_WNN -DUSE_WNN6 -DNEED_Strlen +#else + DEFW = -DUSE_WNN -DUSE_WNN6 +#endif +#else +#ifdef StrlenNeeded + DEFW = -DUSE_WNN -DNEED_Strlen +#else + DEFW = -DUSE_WNN +#endif +#endif +#if HasLibCrypt + LIBW = $(WNNLIB) -lcrypt +#else + LIBW = $(WNNLIB) +#endif +#endif +#ifdef UseCanna + DEFI = -DUSE_CANNA + LIBI = $(CANNALIB) +#endif +#ifdef UseSj3 + DEFS = -DUSE_SJ3 + XSJ3CLIB = ../lib/Xsj3clib/libXsj3clib.a + LIBS = $(XSJ3CLIB) $(SJ3LIB) +#endif +#ifdef UseAtok + DEFS = -DUSE_ATOK + XATOKLIB = ../lib/Xatoklib/libXatoklib.a + LIBS = $(XATOKLIB) -L$(ATOKLIBDIR) $(ATOKLIB) +#endif + + DEPLIBS = $(KI2LIB) $(IMLIB) $(XSJ3CLIB) $(XATOKLIB) XawClientDepLibs + LOCAL_LIBRARIES = $(KI2LIB) $(IMLIB) $(LIBW) $(LIBI) $(LIBS) XawClientLibs + DEFINES = $(SIGNAL_DEFINES) $(DEFW) $(DEFI) $(DEFS) + SRCS = kinput2.c + OBJS = kinput2.o + +ComplexProgramTarget(kinput2) +InstallAppDefaults(Kinput2) diff -r 000000000000 -r 92745d501b9a cmd/Kinput2.ad --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cmd/Kinput2.ad Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,121 @@ +! $Id: Kinput2.ad,v 1.24 1999/04/12 09:21:26 ishisone Exp $ +! +! app-defaults file for kinput2 version 2.0 +! +!! +!! things you shouldn't change +!! +Kinput2.mappedWhenManaged: false +Kinput2.width: 1 +Kinput2.height: 1 +*converter.accelerators: : to-inputobj() +! AIX seems to need the following superfluous definition. +*ki2AppDefsLoaded: true +!! +!! title +!! +*SeparateConversion.title: Kana-Kanji Conversion +*selectionShell.title: Candidate Selection +*auxShell.title: Auxiliary Control +! if you're using mwm (Motif1.1), you can set kanji titles. +!*SeparateConversion.title: \033$(B$+$J4A;zJQ49 +!*SeparateConversion.titleEncoding: COMPOUND_TEXT +!*selectionShell.title: \033$(BA*Br%Q%M%k +!*selectionShell.titleEncoding: COMPOUND_TEXT +!! +!! fonts to be used by root-window type conversion widget and +!! candidate selection widget +!! +*Font: -*-fixed-medium-r-normal--14-*-*-*-c-*-iso8859-1 +*KanjiFont: -misc-fixed-medium-r-normal--14-*-*-*-c-*-jisx0208.1983-0 +*KanaFont: -*-fixed-medium-r-normal--14-*-*-*-c-*-jisx0201.1976-0 +!! +!! Wnn setup +!! +!*CcWnn.Jserver: "primary-jserver-host" +!*CcWnn.jserver2nd: "secondary-jserver-host-if-any" +*CcWnn.ccdef: ccdef.kinput2 +!*CcWnn.wnnEnvrc4: "wnenvrc-file-for-Wnn4" +!*CcWnn.wnnEnvrc6: "wnenvrc-file-for-Wnn6" +!! +!! Canna setup for version 2.x, 3.x +!! +!*Canna.Cannahost: "canna-host" +!*Canna.Cannafile: "canna-initialization-file" +!! +!! Sj3 setup +!*Sj3.sj3serv: "primary-sj3serv-host" +!*Sj3.sj3serv2: "secondary-sj3serv-host-if-any" +!! +!! candidate selection +!! +*selection.width: 500 +*selectionShell.allowShellResize: True +*selection.cursor: left_ptr +!! +!! input style dependent resources +!! +! over-the-spot type input +*OverTheSpotConversion.AutoSpotForwarding: true +*OverTheSpotConversion.ShrinkWindow: true +*OverTheSpotConversion.modeLocation: tracktext +!*OverTheSpotConversion.modeLocation: bottomleft +*OverTheSpotConversion*modeShell.input: false +*OverTheSpotConversion*modeShell.allowShellResize: true +*OverTheSpotConversion*text.borderWidth: 0 +*OverTheSpotConversion*modeShell.borderWidth: 2 +! off-the-spot type input +*OffTheSpotConversion.input: false +*OffTheSpotConversion*modeShell.borderWidth: 0 +*OffTheSpotConversion.text.borderWidth: 0 +! root-window type input +*SeparateConversion*form*vertDistance: 3 +*SeparateConversion*mode.left: chainleft +*SeparateConversion*mode.right: chainleft +*SeparateConversion*mode.top: chaintop +*SeparateConversion*mode.bottom: chaintop +*SeparateConversion*mode.width: 80 +*SeparateConversion*mode.height: 20 +*SeparateConversion*mode.resizable: true +*SeparateConversion*text.fromVert: mode +*SeparateConversion*text.left: chainleft +*SeparateConversion*text.right: chainright +*SeparateConversion*text.top: chaintop +*SeparateConversion*text.bottom: chainbottom +*SeparateConversion*text.width: 400 +*SeparateConversion*text.height: 100 +! status display string justification -- for over-the-spot and off-the-spot +! "left" seems appropriate for most applications. +*modeShell.mode.justify: left +!! +!! conversion protocol dependent resources +!! +! KinputProtocol +*KinputProtocol.BackwardCompatible: true +*KinputProtocol.XlcConversionStartKey: Shiftspace +! XimpProtocol +*XimpProtocol.ForceDefaultServer: true +! X Input Method Protocol +*IMProtocol.locales: ja_JP.SJIS, ja_JP.EUC, ja_JP, japanese, japan, ja +! common to XimpProtocol and IMProtocol +*defaultFontList: -misc-fixed-medium-r-normal--14-*-*-*-c-* +*ConversionStartKeys: \ + Shiftspace \n\ + CtrlKanji +!! +!! sending back unused keypress events +!! +*sendbackKeyPress: True +!! +!! title bar height of popup shells (candidate selection etc.) +!! +!*titlebarHeight: 24 +!! +!! a work around for buggy window managers +!! +! If you encounter a strange phenomenon where kinput2's mode display +! window is flickering and you cannot type in any text, try enabling +! the following resource. This phenomenon is caused by the incorrent +! focus management of your window manager, and this resource avoids +! it by making the window manager totally ignore the mode window. +!*OverTheSpotConversion.UseOverrideShellForMode: True diff -r 000000000000 -r 92745d501b9a cmd/kinput2.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cmd/kinput2.c Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,646 @@ +/* + * kinput2 + */ + +/* + * Copyright (C) 1991 by Software Research Associates, Inc. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Software Research Associates not be + * used in advertising or publicity pertaining to distribution of the + * software without specific, written prior permission. Software Research + * Associates makes no representations about the suitability of this software + * for any purpose. It is provided "as is" without express or implied + * warranty. + * + * Author: Makoto Ishisone, Software Research Associates, Inc., Japan + * ishisone@sra.co.jp + */ + +#ifndef lint +static char *rcsid = "$Id: kinput2.c,v 1.46 2002/01/06 15:13:38 ishisone Exp $"; +#endif + +#include +#include +#include +#include +#include +#include "patchlevel.h" +#include "AsyncErr.h" +#include "MyDispatch.h" +#include "IOECall.h" +#include "ConvMgr.h" +#include "KIProto.h" +#include "XimpProto.h" +#include "IMProto.h" + +#if !defined(USE_WNN) && !defined(USE_CANNA) && !defined(USE_SJ3) && !defined(USE_ATOK) +#define USE_WNN /* default */ +#endif + +#ifdef USE_WNN +#include "CcWnn.h" +#include "WcharDisp.h" +#endif +#ifdef USE_CANNA +#include "Canna.h" +#include "WcharDisp.h" +#endif +#ifdef USE_SJ3 +#include "Sj3.h" +#include "WcharDisp.h" +#endif +#ifdef USE_ATOK +#include "Atok.h" +#include "WcharDisp.h" +#endif + +#include "DebugPrint.h" + +int debug_all; + +/* application resource */ +typedef struct { + char *conversionEngine; + int debugLevel; + Boolean useKinputProtocol; + Boolean useXimpProtocol; + Boolean useXIMProtocol; + Boolean appdefs_loaded; +} AppResRec, *AppResP; + +static AppResRec appres; + +static XtResource app_resources[] = { + { "conversionEngine", "ConversionEngine", XtRString, sizeof(String), + XtOffset(AppResP, conversionEngine), XtRString, (XtPointer)"" }, + { "debugLevel", "DebugLevel", XtRInt, sizeof(int), + XtOffset(AppResP, debugLevel), XtRImmediate, (XtPointer)0 }, + { "useKinputProtocol", "UseKinputProtocol", XtRBoolean, sizeof(Boolean), + XtOffset(AppResP, useKinputProtocol), XtRImmediate, (XtPointer)True }, + { "useXimpProtocol", "UseXimpProtocol", XtRBoolean, sizeof(Boolean), + XtOffset(AppResP, useXimpProtocol), XtRImmediate, (XtPointer)True }, + { "useXIMProtocol", "UseXIMProtocol", XtRBoolean, sizeof(Boolean), + XtOffset(AppResP, useXIMProtocol), XtRImmediate, (XtPointer)True }, + { "ki2AppDefsLoaded", "Ki2AppDefsLoaded", XtRBoolean, sizeof(Boolean), + XtOffset(AppResP, appdefs_loaded), XtRImmediate, (XtPointer)True }, +}; + +static String fallback_resources[] = { + "*ki2AppDefsLoaded: false", + "Kinput2.mappedWhenManaged: false", + "Kinput2.width: 1", + "Kinput2.height: 1", + NULL, +}; + +static XrmOptionDescRec options[] = { + {"-bc", "*KinputProtocol.backwardCompatible", XrmoptionNoArg, "True"}, + {"-font", "*JpWcharDisplay.font", XrmoptionSepArg, NULL}, + {"-kanjifont", "*JpWcharDisplay.kanjiFont", XrmoptionSepArg, NULL}, + {"-kanafont", "*JpWcharDisplay.kanaFont", XrmoptionSepArg, NULL}, + {"-kinput", ".useKinputProtocol", XrmoptionNoArg, "on"}, + {"+kinput", ".useKinputProtocol", XrmoptionNoArg, "off"}, + {"-ximp", ".useXimpProtocol", XrmoptionNoArg, "on"}, + {"+ximp", ".useXimpProtocol", XrmoptionNoArg, "off"}, + {"-xim", ".useXIMProtocol", XrmoptionNoArg, "on"}, + {"+xim", ".useXIMProtocol", XrmoptionNoArg, "off"}, + {"-tbheight", "*ConversionControl.titlebarHeight", + XrmoptionSepArg, NULL}, +#ifdef DEBUG + {"-debug", ".debugLevel", XrmoptionNoArg, "1"}, + {"-trace", ".debugLevel", XrmoptionNoArg, "10"}, + {"-debuglevel", ".debugLevel", XrmoptionSepArg, NULL}, +#endif +#ifdef USE_WNN + {"-wnn", ".conversionEngine", XrmoptionNoArg, "wnn"}, + {"-jserver", "*CcWnn.jserver", XrmoptionSepArg, NULL}, + {"-ccdef", "*CcWnn.ccdef", XrmoptionSepArg, NULL}, + {"-wnnenvname", "*CcWnn.wnnEnvname", XrmoptionSepArg, NULL}, + {"-wnnenvrc4", "*CcWnn.wnnEnvrc4", XrmoptionSepArg, NULL}, + {"-wnnenvrc6", "*CcWnn.wnnEnvrc6", XrmoptionSepArg, NULL}, + {"-wnnenvrc", "*CcWnn.wnnEnvrc", XrmoptionSepArg, NULL}, +#endif +#ifdef USE_CANNA + {"-canna", ".conversionEngine", XrmoptionNoArg, "canna"}, + {"-cannaserver", "*Canna.cannahost", XrmoptionSepArg, NULL}, + {"-cs", "*Canna.cannahost", XrmoptionSepArg, NULL}, + {"-cannafile", "*Canna.cannafile", XrmoptionSepArg, NULL}, +#endif +#ifdef USE_SJ3 + {"-sj3", ".conversionEngine", XrmoptionNoArg, "sj3"}, + {"-sj3serv", "*Sj3.sj3serv", XrmoptionSepArg, NULL}, + {"-sj3serv2", "*Sj3.sj3serv2", XrmoptionSepArg, NULL}, + {"-sj3user", "*Sj3.sj3user", XrmoptionSepArg, NULL}, + {"-rcfile", "*Sj3.rcfile", XrmoptionSepArg, NULL}, + {"-sbfile", "*Sj3.sbfile", XrmoptionSepArg, NULL}, + {"-rkfile", "*Sj3.rkfile", XrmoptionSepArg, NULL}, + {"-hkfile", "*Sj3.hkfile", XrmoptionSepArg, NULL}, + {"-zhfile", "*Sj3.zhfile", XrmoptionSepArg, NULL}, + {"-sjrc", "*Sj3.rcfile", XrmoptionSepArg, NULL}, + {"-sjsb", "*Sj3.sbfile", XrmoptionSepArg, NULL}, + {"-sjrk", "*Sj3.rkfile", XrmoptionSepArg, NULL}, + {"-sjhk", "*Sj3.hkfile", XrmoptionSepArg, NULL}, + {"-sjzh", "*Sj3.zhfile", XrmoptionSepArg, NULL}, +#endif +#ifdef USE_ATOK + {"-atok", ".conversionEngine", XrmoptionNoArg, "atok"}, + {"-atokserver", "*Atok.server", XrmoptionSepArg, NULL}, + {"-as", "*Atok.server", XrmoptionSepArg, NULL}, + {"-atokport", "*Atok.port", XrmoptionSepArg, NULL}, + {"-atokconf", "*Atok.conf", XrmoptionSepArg, NULL}, + {"-atokstyle", "*Atok.style", XrmoptionSepArg, NULL}, +#endif +}; + +XtAppContext apc; +Widget toplevel; + +static int numProtocols; +static int (*DefaultErrorHandler)(); + +#if XtSpecificationRelease > 5 +static XtSignalId interrupt; +static void interruptCallback(); +#else +static void exitTimer(); +#endif + +static WidgetClass getInputObjClass(); +static int IgnoreBadWindow(); +#ifdef SIGNALRETURNSINT +static int scheduleExit(); +#else +static void scheduleExit(); +#endif +static void Destroyed(); +static void Exit(); +static void realExit(); +static void usage(); +static void print_version(); + +int +main(ac, av) +int ac; +char **av; +{ + Widget manager, protocol; + int i; + WidgetClass inputobjclass, displayobjclass; + Widget inputobj; + + toplevel = XtAppInitialize(&apc, "Kinput2", + options, XtNumber(options), + &ac, av, + fallback_resources, (ArgList)NULL, 0); + + /* check invalid argument */ + if (ac > 1) { + int do_usage = 0; + for (i = 1; i < ac; i++) { + if (!strcmp(av[i], "-version")) { + print_version(); + } else { + fprintf(stderr, "unknown argument: %s\n", av[i]); + do_usage = 1; + } + } + if (do_usage) usage(); + } + + /* initialize asynchronous error handler */ + XAEInit(); + + /* initialize I/O error callback handler */ + XIOEInit(); + + XtGetApplicationResources(toplevel, &appres, + app_resources, XtNumber(app_resources), + NULL, 0); + + /* + * If the application-specific class resource file + * (the "app-defaults" file) is not found, + * print a warning message. + */ + if (!appres.appdefs_loaded) { + fprintf(stderr, "Warning: Cannot load app-defaults file.\n"); + fprintf(stderr, " Kinput2 may not work properly without it.\n"); + fprintf(stderr, " Maybe kinput2 is not installed correctly,\n"); + fprintf(stderr, " or your file search path (specified by\n"); + fprintf(stderr, " environment variable 'XFILESEARCHPATH')\n"); + fprintf(stderr, " is wrong.\n"); + } + + /* set debug level */ + debug_all = appres.debugLevel; + +#ifdef RANDOM_ID + /* + * one nasty hack here: + * + * kinput clients often use server's window ID for the only key + * value to identify their conversion server (kinput), and they + * think it is dead and take appropriate action (eg connecting to + * the new server) when they notice the ID has changed. + * + * but it is likely that another kinput has the same resource ID + * base (because X servers always choose the smallest unused ID + * base for new clients). and if it is the same, so is the owner + * window ID, and the clients don't notice the change. + * + * to get rid of the problem, we add some small random offset to + * the resource ID so that every time we get different owner ID + * even if the resource ID base is the same. + * + * of course it heavily depends on the current implementaion of + * the resource ID allocation in Xlib, so I call it 'nasty'. + */ + XtDisplay(toplevel)->resource_id += getpid() % 1024; +#endif + + inputobjclass = getInputObjClass(); + + inputobj = XtCreateWidget("inputObj", inputobjclass, + toplevel, 0, 0); + XtRealizeWidget(inputobj); + ICRegisterTriggerKeys(inputobj); + /* + Destroying the `inputobj' is postponed until all the widgets + are realized in order to prevent duplicate initialization of + input object, that is, to prevent making connection twice to + input conversion server. + */ + + displayobjclass = jpWcharDisplayObjectClass; + + manager = XtVaCreateManagedWidget("convmanager", + conversionManagerWidgetClass, + toplevel, + XtNwidth, 1, + XtNheight, 1, + NULL); + + numProtocols = 0; + + if (appres.useKinputProtocol) { + protocol = XtVaCreateWidget("kinputprotocol", + kinputProtocolWidgetClass, + manager, + XtNlanguage, "JAPANESE", + XtNinputObjectClass, inputobjclass, + XtNdisplayObjectClass, displayobjclass, + XtNwidth, 1, + XtNheight, 1, + NULL); + XtAddCallback(protocol, XtNdestroyCallback, + Destroyed, (XtPointer)NULL); + numProtocols++; + } + + if (appres.useXimpProtocol) { + protocol = XtVaCreateWidget("ximpprotocol", + ximpProtocolWidgetClass, + manager, + XtNlocaleName, "ja_JP", + XtNinputObjectClass, inputobjclass, + XtNdisplayObjectClass, displayobjclass, + XtNwidth, 1, + XtNheight, 1, + NULL); + XtAddCallback(protocol, XtNdestroyCallback, + Destroyed, (XtPointer)NULL); + numProtocols++; + } + + if (appres.useXIMProtocol) { + protocol = XtVaCreateWidget("improtocol", + imProtocolWidgetClass, + manager, + XtNlanguage, "ja_JP", + XtNinputObjectClass, inputobjclass, + XtNdisplayObjectClass, displayobjclass, + XtNwidth, 1, + XtNheight, 1, + NULL); + XtAddCallback(protocol, XtNdestroyCallback, + Destroyed, (XtPointer)NULL); + numProtocols++; + } + + if (numProtocols == 0) { + fprintf(stderr, "no protocols activated\n"); + exit(1); + } + + /* set signal handler */ + if (signal(SIGINT, SIG_IGN) != SIG_IGN) signal(SIGINT, scheduleExit); +#if XtSpecificationRelease > 5 + interrupt = XtAppAddSignal(apc, interruptCallback, (XtPointer)NULL); +#endif + signal(SIGTERM, scheduleExit); +#ifdef USE_WNN + signal(SIGPIPE, SIG_IGN); +#endif + + /* set my error handler */ + DefaultErrorHandler = XAESetErrorHandler(IgnoreBadWindow); + + XtRealizeWidget(toplevel); + + XtDestroyWidget(inputobj); /* Don't move this before XtRealizeWidget() */ + + for (;;) { + XEvent event; + + XtAppNextEvent(apc, &event); + XtDispatchEvent(&event); + MyDispatchEvent(&event); /* additional dispatcher */ + } + /* NOTREACHED */ + + return 0; /* for lint */ +} + +static WidgetClass +getInputObjClass() +{ + WidgetClass class; + +#ifdef USE_WNN + if (!strcmp(appres.conversionEngine, "wnn")) { + return ccWnnObjectClass; + } +#endif +#ifdef USE_CANNA + if (!strcmp(appres.conversionEngine, "canna") || + !strcmp(appres.conversionEngine, "iroha")) { + return cannaObjectClass; + } +#endif +#ifdef USE_SJ3 + if (!strcmp(appres.conversionEngine, "sj3")) { + return sj3ObjectClass; + } +#endif +#ifdef USE_ATOK + if (!strcmp(appres.conversionEngine, "atok")) { + return atokObjectClass; + } +#endif + + /* set default input object */ +#ifdef USE_ATOK + class = atokObjectClass; +#endif +#ifdef USE_SJ3 + class = sj3ObjectClass; +#endif +#ifdef USE_CANNA + class = cannaObjectClass; +#endif +#ifdef USE_WNN + class = ccWnnObjectClass; +#endif + + return class; +} + +static int +IgnoreBadWindow(dpy, error) +Display *dpy; +XErrorEvent *error; +{ + /* + * BadWindow events will be sent if any of the active clients die + * during conversion. Although I select DestroyNotify event on the + * client windows to detect their destruction and take appropriate + * actions, and I'm careful when doing critical operations, but still + * there is a chance of getting unexpecting BadWindow error caused by + * client death. + * There are also chances of getting BadDrawable as well. + * So I set the error handler to ignore BadWindow/BadDrawable errors. + * Of course I'd better check if the resourceid field of the error + * event is the window ID of a client, but I'm too lazy to do that... + * P.S. We should ignore BadColor also.. + */ + if (error->error_code != BadWindow && + error->error_code != BadDrawable && + error->error_code != BadColor) { + /* invoke default error handler */ + (*DefaultErrorHandler)(dpy, error); + } + return 0; +} + +#ifdef SIGNALRETURNSINT +static int +#else +static void +#endif +scheduleExit() +{ +#if XtSpecificationRelease > 5 + XtNoticeSignal(interrupt); +#else + /* + * It is unwise to do complex operation (in this case, + * XtDestroyWidget) in a signal handler. + * So postpone the real work... + */ + XtAppAddTimeOut(apc, 1L, exitTimer, (XtPointer)NULL); +#endif +} + +#if XtSpecificationRelease > 5 +/* ARGSUSED */ +static void +interruptCallback(cldata, sigid) +XtPointer cldata; +XtSignalId *sigid; +{ + Exit(); +} +#else +/* ARGSUSED */ +static void +exitTimer(cldata, timerp) +XtPointer cldata; +XtIntervalId *timerp; +{ + Exit(); +} +#endif + +/* ARGSUSED */ +static void +Destroyed(w, client_data, call_data) +Widget w; +XtPointer client_data; +XtPointer call_data; +{ + static int cnt = 0; + + /* + * if all the protocol widgets are dead, kill myself. + */ + if (++cnt >= numProtocols) Exit(); +} + +static void +Exit() +{ + static int exiting = 0; + + TRACE(("Exit()\n")); + + if (exiting) return; + exiting = 1; + + /* + * Destroy all widgets. + */ + XtDestroyWidget(toplevel); + + /* + * Postpone calling exit() until next XtNextEvent(), + * in order to give each widget time to execute their + * destroy procedure. + */ + XtAppAddTimeOut(apc, 1L, realExit, (XtPointer)NULL); +} + +/* ARGSUSED */ +static void +realExit(cldata, timerp) +XtPointer cldata; +XtIntervalId *timerp; +{ + exit(0); +} + +static void +usage() +{ + char **p; + static char *syntaxtable[] = { +#ifdef USE_WNN + "-wnn", "use Wnn as the conversion engine", + "-jserver ", "specify jserver host", + "-ccdef ", "specify character conversion def. file", + "-wnnenvname ", "specify Wnn environment name", + "-wnnenvrc4 ", "specify Wnn environment file for Wnn4", + "-wnnenvrc6 ", "specify Wnn environment file for Wnn6", + "-wnnenvrc ", "specify Wnn environment file", +#endif +#ifdef USE_CANNA + "-canna", "use Canna (Iroha) as the conversion engine", + "{-cannaserver|-cs} [:n]", "specify cannaserver host", + "-cannafile ", "specify canna customize file", +#endif +#ifdef USE_SJ3 + "-sj3", "use SJ3 as the conversion engine", + "-sj3serv ", "specify first sj3serv host", + "-sj3serv2 ", "specify second sj3serv host", + "-sj3user ", "specify user name connect to sj3serv", + "{-rcfile|-sjrc} ", "specify resource definition file", + "{-sbfile|-sjsb} ", "specify symbol table file", + "{-rkfile|-sjrk} ", "specify roma-kana coversion definition file", + "{-hkfile|-sjhk} ", "specify hira-kata coversion definition file", + "{-zhfile|-sjzh} ", "specify zen/han coversion definition file", +#endif +#ifdef USE_ATOK + "-atok", "use ATOK as the conversion engine", + "{-atokserver|-as} ", "specify atok server host", + "-atokport ", "specify atok service port", + "-atokconf ", "specify atok customize file", + "-atokstyle ", "specify atok style file", +#endif + "-bc", "backward compatible mode", + "-font ", "ASCII font to be used", + "-kanjifont ", "KANJI font to be used", + "-kanafont ", "KANA font to be used", + "-/+kinput", "activate/deactivate kinput protocol family", + "-/+ximp", "activate/deactivate Ximp protocol", + "-/+xim", "activate/deactivate X Input Method protocol", + "-tbheight ", "specify pop-up shell's titlebar height", + "-background ", "background color", + "-foreground ", "foreground color", + "-rv", "reverse video mode", + "-display ", "specify display", + "-version", "print version information and exit", +#ifdef DEBUG + "-debug", "print debug messages (debug level 1)", + "-trace", "print trace messages (debug level 10)", + "-debuglevel ", "set debug level", +#endif + NULL, NULL, + }; + + fprintf(stderr, "options are:\n"); + for (p = syntaxtable; *p != NULL; p += 2) { + fprintf(stderr, " %-30s %s\n", *p, *(p + 1)); + } + exit(1); +} + +static void +print_version() +{ + char *p; + + printf("kinput2 %s ", KINPUT2_VERSION); + if (PATCHLEVEL > 0) printf("fix %d ", PATCHLEVEL); +#ifdef STATUS + printf("-%s- ", STATUS); +#endif + printf(" ("); + p = DATE + 7; /* skip '$Date: ' */ + while (*p != '\0' && *p != ' ') { + putchar(*p); /* print date */ + p++; + } + printf(")\n"); + + printf("\toptions: "); +#ifdef USE_WNN +#ifdef USE_WNN6 + printf("[Wnn6] "); +#else + printf("[Wnn] "); +#endif +#endif +#ifdef USE_CANNA + printf("[Canna2] "); +#endif +#ifdef USE_SJ3 + printf("[Sj3] "); +#endif +#ifdef USE_ATOK + printf("[Atok] "); +#endif +#ifdef DEBUG + printf("[DEBUG] "); +#endif + printf("\n"); + exit(0); +} + +#if defined(USE_WNN) && defined(NEED_Strlen) +/* + * Wnn/jlib/js.c should have this function... + */ +int +Strlen(s) +unsigned short *s; +{ + int n = 0; + + while (*s++) n++; + return n; +} +#endif diff -r 000000000000 -r 92745d501b9a cmd/kinput2.man --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cmd/kinput2.man Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,514 @@ +.\" $Id: kinput2.man,v 1.20 1999/09/13 08:40:31 ishisone Exp $ +.TH KINPUT2 1 "24 March 1999" "X Version 11" +.SH NAME +kinput2 \- kanji input server for X11 +.SH SYNOPSIS +\fBkinput2\fP [-options...] +.SH DESCRIPTION +.I Kinput2 +is an X window application to input Japanese text. +It acts as a front-end for other applications that want +kana-kanji conversion. +.PP +When invoked, after some initialization (which will take about a few to +30 seconds depending on your machine) \fIkinput2\fP waits quietly for a +Japanese text input request from another client (i.e. no windows +appear). +When \fIkinput2\fP receives a request, it pops up a window and +starts conversion process. It sends the converted text back to the +client when the text is fixed. +.PP +.I Kinput2 +has some big improvements over its predecessor, kinput, which +was contributed to X11R4. +.TP 8 +\fBOver-the-spot/On-the-spot Input\fP +These features enable conversion process to be done at cursor position, +avoiding unnecessary movement of eyes between cursor position and conversion +window. +.I Kinput2 +also supports root window style input and off-the-spot style input. +.TP 8 +\fBMultiple Protocol Support\fP +.I Kinput2 +supports several conversion protocols between front-end and +client. Supported protocols are: +.nf + kinput protocol + kinput2 protocol + Matsushita jinput protocol + Sony xlc protocol + XIMP protocol + X Input Method Protocol (X Consortium standard) +.fi +.TP 8 +\fBMultiple Conversion Engine Support\fP +.I Kinput2 +can use 4 different conversion engines, Wnn, Canna, Sj3 and Atok. +You can choose one at compilation time, or at run time. +.TP 8 +\fBKinput Compatibility\fP +.I Kinput2 +is fully upward-compatible with kinput, so applications which use +kinput as the front-end can also use \fIkinput2\fP. +In this case, the applications cannot take advantage of over-the-spot +conversion, though. +.SH OPTIONS +.I kinput2 +accepts all of the standard X Toolkit command line options. +The following options are accepted as well. +.TP 8 +\fB\-wnn\fP +This option specifies that Wnn jserver is used as the conversion engine. +.TP 8 +\fB\-jserver\fP +This option specifies the hostname of the jserver to be used for conversion. +.TP 8 +\fB\-ccdef\fP +This option specifies the input character conversion rule file. +.TP 8 +\fB\-wnnenvrc4\fP +This option specifies the Wnn convertion environment initialization +file (wnnenvrc) for Wnn version 4. +.TP 8 +\fB\-wnnenvrc6\fP +This option is similar to \-wnenvrc4, but for Wnn version 6. +.TP 8 +\fB\-canna\fP +This option specifies that Canna conversion server (irohaserver) is used as +the conversion engine. +.TP 8 +\fB\-cannaserver\fP +This option specifies the hostname of Canna conversion server. +.TP 8 +\fB\-cannafile\fP +This option specifies Canna conversion customization file. +.TP 8 +\fB\-sj3\fP +This option specifies that Sj3 conversion server (sj3serv) is used as +the conversion engine. +.TP 8 +\fB\-sj3serv\fP +This option specifies the hostname of the primary sj3 conversion server. +.TP 8 +\fB\-sj3serv2\fP +This option specifies the hostname of the secondary sj3 server. The secondary +server is used when \fIkinput2\fP cannot connect to the primary server. +.TP 8 +\fB\-atok\fP +This option specifies that Atok server is used as the conversion engine. +.TP 8 +\fB\-atokserver\fP +This option specifies the hostname of the atok server to be used for conversion. +.TP 8 +\fB\-font\fP \fIascii-font\fP +This option specifies the default font to be used for displaying ASCII text. +.TP 8 +\fB\-kanjifont\fP \fIkanji-font\fP +This option specifies the default font to be used for displaying Kanji text. +.TP 8 +\fB\-kanafont\fP \fIkana-font\fP +This option specifies the default font to be used for displaying Kana text. +.TP 8 +\fB\-/+kinput\fP +This option enables/disables use of kinput protocol family (i.e. +kinput protocol, kinput2 protocol, jinput protocol and xlc protocol). +.TP 8 +\fB\-/+ximp\fP +This option enables/disables use of XIMP protocol. +.TP 8 +\fB\-/+xim\fP +This option enables/disables use of X Input Method Protocol. +.TP 8 +\fB\-bc\fP +Kinput protocol, which is one of the communication protocols +\fIkinput2\fP supports, +uses X window's selection mechanism to notify other clients of +front-end's existence. +This option forces \fIkinput2\fP to use selection ``JAPANESE_CONVERSION'' +(which is not a standard selection name) as well as ``_JAPANESE_CONVERSION''. +This is for backward compatibility, since many of the applications that +connect with kinput still use this non-standard selection. +.TP 8 +\fB\-tbheight\P \fItitle-bar-height\fP +This option specifies the height (in pixels) of the titlebar +attached to popup shells such as candidate selection window. +.I Kinput2 +uses this value to compute the correct popup location of these windows. +.SH WIDGET TREE +Below is the widget hierarchy of \fIkinput2\fP. +.nf +.ta 0.5i 1.0i 1.5i 2.0i 2.5i 3.0i 3.5i 4.0i + Kinput2 kinput2 + ConversionManager convmanager + KinputProtocol kinputprotocol + XimpProtocol ximpprotocol + IMProtocol improtocol + SeparateConversion converter + CcWnn inputObj + Canna inputObj + Sj3 inputObj + JpWcharDisplay displayObj + Form form + ICLabel mode + JpWcharDisplay display + Canvas text + TransientShell selectionShell + CandidatePanel selection + JpWcharDisplay display + TransientShell auxShell + AuxPanel aux + JpWcharDisplay display + OffTheSpotConversion converter + CcWnn inputObj + Canna inputObj + Sj3 inputObj + JpWcharDisplay displayObj + AdoptedShell modeShell + ICLabel mode + JpWcharDisplay display + CanvasShell text + TransientShell selectionShell + CandidatePanel selection + JpWcharDisplay display + TransientShell auxShell + AuxPanel aux + JpWcharDisplay display + OverTheSpotConversion converter + CcWnn inputObj + Canna inputObj + Sj3 inputObj + JpWcharDisplay displayObj + TransientShell selectionShell + CandidatePanel selection + JpWcharDisplay display + TransientShell auxShell + AuxPanel aux + JpWcharDisplay display + AdoptedShell modeShell + ICLabel mode + JpWcharDisplay display + TransientShell modeShell + ICLabel mode + JpWcharDisplay display + CanvasShell text +.fi +.SH RESOURCES +There are too many resources to describe here, but you don't have to +know most of them. +So here is a brief description of resources which you might want to set. +.PP +\fBKinput2\fP application resource: +.RS 4 +.TP 4 +\fBconversionEngine\fP +This resource specifies which conversion engine to use. +You can specify one of ``wnn'', ``canna'', ``sj3'' or ``atok''. +.RE +.PP +.B ConversionControl +widget (which is a superclass +of SeparateConversion, OffTheSpotConversion and OverTheSpotConversion) +resource: +.RS 4 +.TP 4 +\fBsendbackKeyPress\fP +If this resource is ``true'', the KeyPress events intercepted but unused +by \fIkinput2\fP are sent back to the client when there is no conversion text. +Although this feature is convenient, it might confuse some clients +since none of corresponding KeyRelease events are sent. +Also, since the ``send_event'' flag of those events are true, some +clients do not accept events sent back by \fIkinput2\fP. +For example, kterm doesn't accept those events without specifying +.nf + KTerm*allowSendEvents: true +.fi +in a resource file. +.br +The default of \fBsendbackKeyPress\fP resource is \fBtrue\fP. +.TP 4 +\fBtitlebarHeight\fP +This resource specifies the height of a title bar which is attached +to various popup shell windows, such as candicate selection. +When computing the location of these windows, +.I kinput2 +uses this value to pop up them at correct position. +.br +The default is \fB0\P. +.RE +.PP +.B OverTheSpotConversion +widget resources: +.RS 4 +.TP 4 +\fBshrinkWindow\fP +If this resource is ``true'', the width of on-the-spot conversion window +shrinks according to the length of the text on it. Otherwise, +the window never shrinks. +If the performance of Xserver on window resizing is poor, +you may consider setting this resources to false. +The default is \fBtrue\fP. +.TP 4 +\fBmodeLocation\fP +This resource specifies the location of status widget in case of +over-the-spot type conversion. +Unless client specifies the location explicitly, the location of +the status widget is determined by this resource. +If the value of this resource is ``topleft'', the widget is placed at the +top left of the client window. You can also specify +``topright'', ``bottomleft'' and ``bottomright''. +If the value is ``tracktext'', the widget is placed just under the cursor +position, and moves according to the cursor. However, if the +region available for conversion is too small, status is placed at +the bottom left of the client area. +If the value is ``none'', the status widget will never appear. +.br +The default is ``tracktext''. +.TP 4 +\fBmodeBorderForeground\fP +If this resource is ``true'', the color of status widget is forced +to be same as the foreground color of the widget. +.br +The default is \fBfalse\fP. +.TP 4 +\fBuseOverrideShellForMode\fP +If this resource is ``true'', the status widget becomes an instance of +OverriddeShell, instead of the default TransientShell. +Turn this resource on if you encounter a strange phenomenon that +the status widget keeps flickering and you cannnot enter any text. +This is caused by (incorrect) focus management of your window manager, +and setting this resource will stop any window management for the widget. +The result is that the widget will be totally ignored by the window manager, +meaning you cannot move, resize, raise nor lower the widget. +.br +The default is \fBfalse\fP. +.RE +.PP +.B OnTheSpotConversion +widget resources: +.RS 4 +.TP 4 +\fBfeedbackAttributes\fP +This resource specifies the display attributes of preedit string when +on-the-spot input style is used. In on-the-spot style, it is a client's +responsibility to draw preedit string, and kinput2 sends some hints +on how it should be drawn, which is controled by this resource. +The value of this resource should be a comma-separated list of 4 elements, +and each element represents the drawing hint of specific type of string. +They represent the hints for not-yet-converted string, +for converted string, for converted string which belongs to the current +clause, for converted string belonging to the current sub-clause, in that +order. +Each element consists of zero or more drawing attributes, which are `R' +(reverse), `U' (underline), `H' (highlight), `P' (primary), `S' (secondary) +or `T' (tertiary). You should consult the Xlib document for the meaning +of these attributes (see the section about preedit draw callback). +The default is ``U,,R,H'', which is close to the drawing attributes used +by other input styles. +.RE +.PP +.B CcWnn +(conversion widget using Wnn) resources: +.RS 4 +.TP 4 +\fBjserver\fP +This resource specifies the hostname of the (primary) jserver to be used +for conversion. If not specified, value of environment variable ``JSERVER'' +is used. +.TP 4 +\fBjserver2nd\fP +This resource specifies the hostname of the secondary jserver, which is +used if the primary server is down. If not specified, \fIkinput2\fP doesn't +use secondary server. +.TP 4 +\fBwnnEnvrc4\fP +This resource specifies the filename of the Wnn conversion environment +initialization file. This file is used when the Wnn server (jserver) is +version 4. See documents of Wnn for the format of the file. +The default is \fB/usr/local/lib/wnn/wnnenvrc\fP. +.TP 4 +\fBwnnEnvrc6\fP +This resource also specifies the filename of the Wnn conversion environment +initialization file. This file is used when the Wnn server (jserver) is +version 6. See documents of Wnn for the format of the file. +.TP 4 +\fBwnnEnvrc\fP +This resource is provided for backward compatibility. +Use \fBwnnEnvrc4\fP or \fBwnnEnvrc6\fP instead. +.TP 4 +\fBccdef\fP +This resource specifies the input character conversion rule file. +The default is \fB/usr/lib/X11/ccdef/ccdef.kinput2\fP. +.RE +.PP +.B Canna +(conversion widget using Canna) resources: +.RS 4 +.TP 4 +\fBcannahost\fP +This resource specifies the hostname of the canna server to be used. +.TP 4 +\fBcannafile\fP +This resource specifies Canna conversion customization file. +.RE +.PP +.B Sj3 +(conversion widget using SJ3) resources: +.RS 4 +.TP 4 +\fBsj3serv\fP +This resource specifies the hostname of the (primary) sj3serv to be used +for conversion. If not specified, value of environment variable ``SJ3SERV'' +is used. +.TP 4 +\fBsj3serv2\fP +This resource specifies the hostname of the secondary sj3serv, which is +used if the primary server is down. +.TP 4 +\fBrcfile\fP +This resource specifies the filename of the Sj3 conversion customization +file. The default is \fB/usr/lib/X11/sj3def/sjrc\fP. +.TP 4 +\fBrkfile\fP +This resource specifies the Romaji-Kana conversion rule file. +The default is \fB/usr/lib/X11/sj3def/sjrk\fP. +.RE +.PP +.B Atok +(conversion widget using Atok) resources: +.RS 4 +.TP 4 +\fBserver\fP +This resource specifies the hostname of the atok server to be used +for conversion. +.TP 4 +\fBport\fP +This resource specifies the port number of the atok server. +.TP 4 +\fBconf\fP +This resource specifies the name of atok configuration file. +.TP 4 +\fBstyle\fP +This resource specifies the name of atok style file. +.RE +.PP +.B JpWcharDisplay +(widget for drawing Japanese text) resources: +.RS 4 +.TP 4 +\fBfont\fP, \fBkanjiFont\fP, \fBkanaFont\fP +These resource specifies the font to be used for displaying ASCII, +Kanji and Kana text, respectively. +Since \fIkinput2\fP changes fonts dynamically by client requests, +the fonts specified by these resources might not be used. +If not specified, the following fonts are used. +.nf + -*-fixed-medium-r-normal--14-*-*-*-c-*-iso8859-1 + -*-fixed-medium-r-normal--14-*-*-*-c-*-jisx0208.1983-0 + -*-fixed-medium-r-normal--14-*-*-*-c-*-jisx0201.1976-0 +.fi +.RE +.PP +.B KinputProtocol +(widget for handling kinput protocol family \- kinput, kinput2, +jinput and xlc protocol) resources: +.RS 4 +.TP 4 +\fBbackwardCompatible\fP +All of the protocols in kinput protocol family +use X window's selection mechanism to notify other clients of +front-end's existence. +If this resource is ``true'', \fIkinput2\fP uses selection ``JAPANESE_CONVERSION'' +(which is not a standard selection name) as well as ``_JAPANESE_CONVERSION''. +This is for backward compatibility, since many of the applications +using these protocols still use this non-standard selection. +.br +The default is \fBtrue\fP. +.TP 4 +\fBxlcConversionStartKey\fP +This resource specifies the key that starts the conversion. +The key is a hint for the clients using xlc protocol to determine when +they should request conversion to \fIkinput2\fP. +The syntax of the specification is a subset of the translation table syntax: +.nf + \fImodifier-names\fP\fIkeysym-name\fP +.fi +where modifier-names is a combination of \fBShift\fP, \fBLock\fP, \fBMeta\fP, +\fBAlt\fP and \fBMod[1-5]\fP. +.br +The default is \fBShiftspace\fP. +.RE +.PP +\fBXimpProtocol\fP and \fBIMProtocol\fP +(which handle XIMP protocol and X Input Method Protocol) resources: +.RS 4 +.TP 4 +\fBconversionStartKeys\fP +This resource specifies the keys that start the conversion. +The syntax of the specification is a subset of the translation table syntax: +.nf + \fImodifier-names\fP\fIkeysym-name\fP +.fi +where modifier-names is a combination of \fBCtrl\fP, \fBShift\fP, \fBLock\fP, +\fBMeta\fP, \fBAlt\fP and \fBMod[1-5]\fP. A '~' can precede each modifier +name, meaning the modifier must not be asserted. +For example, if the conversion start key is ``Kanji'' key with shift key +pressed and control key not pressed (other modifier keys may be pressed or +not), the specification is: +.nf + Shift ~CtrlKanji +.fi +Multiple keys can be specified by separating them with newlines. +.br +The default is as follows: +.nf + Shiftspace \en\e + CtrlKanji +.fi +.TP 4 +\fBdefaultFontList\fP +This resource specifies the default fonts to be used if the client +does not specify fonts to be used. +The default is \fB-*-fixed-medium-r-normal--14-*-*-*-c-*\fP. +.RE +.SH "CLIENT SETUP" +When using X Input Method Protocol, you have to specify the +name of the input server you want to use. +This can be done by setting ``\fBinputMethod\fP'' resource +or setting \fBXMODIFIERS\fP environment variable. +Since some clients don't regard inputMethod resource while other +clients ignore XMODIFIERS variable, so it is a good idea to set both of +them. +.PP +To use kinput2, you should add the following line to your +resource file (such as .Xresources or .Xdefaults): +.nf + *inputMethod: kinput2 +.fi +and, set XMODIFIERS to ``@im=kinput2''. +.nf + setenv XMODIFIERS "@im=kinput2"\ \ \ (for csh) + XMODIFIERS="@im=kinput2"; export XMODIFIERS\ \ \ (for sh) +.fi +.SH "SEE ALSO" +Wnn documents, Canna documents, Sj3 documents, +XIMP protocol specification, +The Input Method Protocol +.SH COPYRIGHT +.nf +Copyright 1988, 1989, 1990, 1991, 1992, 1994 Software Research Associates, Inc. +Copyright 1991 NEC Corporation, Tokyo, Japan. +Copyright 1991 Sony Corporation +Copyright 1998 MORIBE, Hideyuki +Copyright 1999 Kazuki YASUMATSU +Copyright 1999 Justsystem Corporation, Japan. +.fi +.SH AUTHORS +.nf +Makoto Ishisone, Software Research Associates, Inc. +Akira Kon, NEC Corporation +Naoshi Suzuki, Sony Corporation +MORIBE, Hideyuki +Kazuki YASUMATSU +Atsushi Irisawa +.fi diff -r 000000000000 -r 92745d501b9a doc/ccdef --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/doc/ccdef Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,803 @@ +*** $BF~NOJ8;zJQ49$N@_Dj(B *** + +[ $B$3$l$O(B kinput2 $B$GJQ49%7%9%F%`$K(B Wnn $B$r;HMQ$9$k;~$K;H$o$l$kJQ49%*%V%8%'%/(B ] +[ $B%H(B CcWnn $B$,;HMQ$7$F$$$k%m!<%^;z$+$JJQ49(B ($B$@$1$G$O$J$/!"JQ49$K;HMQ$9$k%-!<(B ] +[ $B$N%P%$%s%G%#%s%0$d$+$JF~NO$K$b;HMQ$5$l$k$N$G!VF~NOJ8;zJQ49!W$H8F$s$G$$$^(B ] +[ $B$9(B) $B$N%+%9%?%^%$%:J}K!$r2r@b$7$?$b$N$G$9!#O!XF~NOJ8;zJQ49$N@_Dj!Y$r$A$g$C$HJQ99$7$?$@$1$J(B ] +[ $B$N$G$b$7$+$9$k$HITE,Ev$J5-=R$,$"$k$+$bCN$l$^$;$s!#(B ] + + $B$3$3$G$O(B kinput2 $B$NJQ49%*%V%8%'%/%H$N0l$D(B CcWnn $B$,JQ49$K;HMQ$9$k%-!<$N(B + $B%P%$%s%G%#%s%0$d%m!<%^;z$+$JJQ49$J$I$r%+%9%?%^%$%:$9$k$N$KI,MW$JF~NOJ8(B + $B;zJQ49Dj5A%U%!%$%k$N=q$-J}$K$D$$$F@bL@$7$^$9!#$3$3$K=q$+$l$?J8>O$@$1$G(B + $B$O$o$+$j$K$/$$$N$G!"$G$-$l$P%G%U%)%k%H$NDj5A%U%!%$%k(B + (/usr/lib/X11/ccdef/ccdef.kinput2 $B$*$h$S$=$NCf$G%$%s%/%k!<%I$5$l$F$$$k(B + $B%U%!%$%k(B) $B$r8+$J$,$iFI$`$H$h$$$H;W$$$^$9!#$^$?!":G8e$K$A$g$C$H$7$?%+%9(B + $B%?%^%$%:$NNc$r>R2p$7$F$"$j$^$9!#(B + + +** $BF~NOJ8;zJQ49$N35MW(B + +$BF~NOJ8;zJQ49$N5!G=$K$O!"Bg$-$/J,$1$FR2p$7$^$7$g$&!#(B + +$B4pK\E*$K$O!"$"$i$+$8$a;XDj$5$l$?JQ49%k!<%k$N=89g$NCf$+$i!"(B + + $B!&F~NO%b!<%I(B + $B!&F~NO%3%s%F%-%9%H(B + $B!&F~NO%-!<(B + +$B$N#3$D$N>r7o$K%^%C%A$9$kJQ49%k!<%k$rA*$S!"$=$l$rE,MQ$9$k$3$H$GJQ49$,9T$J$o(B +$B$l$^$9!#(B + +$B!&F~NO%b!<%I(B + $B$3$l$ONc$($P!V%m!<%^;z$+$JJQ49%b!<%I!W$H$+!"!V%"%k%U%!%Y%C%HF~NO%b!<(B + $B%I!W$H$+$$$C$?$b$N$G$9!#J#?t$NF~NO%b!<%I$r;}$D$3$H$,$G$-!"%b!<%I$N(B + $B@ZBX$($OJQ49%k!<%k$K=q$+$l$?%U%!%s%/%7%g%s$G9T$J$$$^$9!#(B + +$B!&F~NO%3%s%F%-%9%H(B + $B$3$l$O$"$k%-!<$,2!$5$l$?;~$K!"$9$G$KF~NO$5$l$F$$$kJ8;zNs$N$3$H$G$9!#(B + kinput2 $B$G!"%"%s%@!<%i%$%s$D$-$GI=<($5$l$kL$JQ49ItJ,$NJ8;zNs$@$H;W(B + $B$($P$@$$$?$$$h$$$G$7$g$&!#@53N$K$$$&$HL$JQ49ItJ,$N%G!<%?$HF~NO%3%s(B + $B%F%-%9%H$N%G!<%?$O>/$70[$J$j$^$9!#F~NO%3%s%F%-%9%H$NJ}$O!"F~NO%b!<(B + $B%I$,JQ$o$C$?$j$9$k$H%/%j%"$5$l$^$9$7!":GBg(B16$BJ8;z$7$+J];}$5$l$^$;$s!#(B + +$B!&F~NO%-!<(B + $B$3$l$O2!$5$l$?%-!<$G$9!#JQ49%k!<%k$K(B + $B!&%-!<$N%"%9%-!JN,(B) ... + endmode + +($BDj5A%U%!%$%k$N>\$7$$=q$-J}$K$D$$$F$O$"$H$G@bL@$7$^$9(B) + +mode Romaji $B$H=q$+$l$?9T$+$i(B endmode $B$^$G$,$3$N%b!<%I(B (Romaji) $B$KBP$9$kJQ(B +$B49%k!<%k$G$9!#0lHV:G=i$N%k!<%k$O!"%3%s%F%-%9%H$,(B "k"$B!"%-!<%3!<%I$,(B 'a'$B!"JQ(B +$B49J8;zNs$,(B"$B$+(B" $B$G!"!V(B"k" $B$,$"$i$+$8$aF~NO$5$l$F$$$k;~$K(B 'a' $B$H$$$&%-!<$,2!(B +$B$5$l$?$i$=$l$r(B "$B$+(B" $B$H$$$&J8;zNs$KJQ49$9$k!W$H$$$&0UL#$G$9!#(B + +$B:#(B 'a' $B$H$$$&%-!<$,2!$5$l$?$H$7$^$7$g$&!#$b$7D>A0$K(B k $B$,F~NO$5$l$F$$$l$P0l(B +$BHV:G=i$N%k!<%k$K%^%C%A$7$F(B "$B$+(B" $B$H$$$&J8;zNs$KJQ49$5$l$FF~NO$5$l$^$9!#$b$7(B +k $B$,F~NO$5$l$F$$$J$1$l$P(B3$BHV$a$N%k!<%k$K%^%C%A$7$^$9!#(B($B6u$N%3%s%F%-%9%H$O2?(B +$B$K$G$b%^%C%A$7$^$9(B) $B$=$3$G$3$N>l9g$K$O(B "$B$"(B" $B$H$$$&J8;zNs$KJQ49$5$l$^$9!#(B + +$BF1MM$K(B '.' $B$H$$$&%-!<$,2!$5$l$k$H(B4$BHV$a$N%k!<%k$K%^%C%A$7$F(B "$B!#(B" $B$H$$$&J8;z(B +$BNs$KJQ49$5$l$FF~NO$5$l$k$H$H$b$K(B convert $B$H$$$&%U%!%s%/%7%g%s$,8F$P$l$^$9!#(B + +$B$3$N$h$&$K!"F~NOJ8;zJQ49$N4pK\E*$J%a%+%K%:%`$OHs>o$K4JC1$J$N$G$9$,!"/$7>\$7$/@bL@$7$^(B +$B$9!#$3$l$rM}2r$9$k$K$O(B X$B%&%#%s%I%&$K4X$9$k4pK\E*$JCN<1$,I,MW$G$7$g$&!#(B + +$B$^$:!"%-!<$,2!$5$l$k$H$=$l$KBP1~$9$k(B KeyPress $B%$%Y%s%H$,%5!<%P$+$iAw$i$l$^(B +$B$9!#(BCcWnn $B$O$+$J4A;zJQ495!G=$,(B ON $B$K$J$C$F$$$l$P$=$l$rF~NOJ8;zJQ49$N%b%8%e!<(B +$B%k$KEO$7$^$9!#(B + +$B8=:_$NF~NO%b!<%I$+$i!"E,MQ$9$Y$-JQ49%k!<%k%;%C%H$rA*$S!"EO$5$l$?%$%Y%s%H$H!"(B +$BF~NO%3%s%F%-%9%H$r$b$H$K%^%C%A$9$k%k!<%k$rC5$7$^$9!#(B + +$B%k!<%k$NC5:w$O0l$D$N%-!<$K$D$$$F#32s9T$J$o$l$^$9!#@h$[$I=R$Y$?$h$&$K!"JQ49(B +$B%k!<%k$K$O%-!<$r%"%9%-!$C$FDj5A%U%!%$%k$K=q$/(B +$B=gHV$r4V0c$($k$H;W$C$?DL$j$NJQ49$,9T$J$o$l$J$$$3$H$,$"$j$^$9!#(B + +$B%^%C%A$9$k%k!<%k$,$J$+$C$?>l9g!"$b$7JQ49%P%C%U%!$,6u(B ($B3NDj$5$l$F$$$J$$J8;z(B +$B$,$J$$(B) $B$G!"$+$D2!$5$l$?%-!<$,%3%s%H%m!<%k%3!<%I$@$C$?>l9g$K$O$=$N$^$^=PNO(B +$B$5$l!"$=$l0J30$N>l9g$OL5;k$5$l$^$9!#(B + +$B%^%C%A$9$k%k!<%k$,8+$D$+$k$H!"$=$l$K$7$?$,$C$FJQ49$,9T$J$o$l$^$9!#(B + +$B$^$:!"JQ49%P%C%U%!$*$h$SF~NO%3%s%F%-%9%H%G!<%?$+$iJQ49%k!<%k$K=q$+$l$F$$$k(B +$B%3%s%F%-%9%HJ8;zNs$,:o=|$5$l$^$9!#(B($B%k!<%k$,%^%C%A$7$F$$$k0J>e!"F~NO%3%s%F(B +$B%-%9%H$*$h$SJQ49%P%C%U%!$N:G8e$NItJ,$O%3%s%F%-%9%HJ8;zNs$HF1$8$O$:$G$9(B) + +$Bl9g$K$OF~NO%3%s%F%-%9%H%G!<(B +$B%?$OJQ497k2LJ8;zNs$N0lIt$GCV$-49$o$k$3$H$K$J$j$^$9(B) autofix $B$,;XDj$5$l$F$$(B +$B$k$H!"F~NO%3%s%F%-%9%H$,6u$N;~$KF~NO%3%s%F%-%9%H$X$NDI2C$,5/$3$k$H!"<+F03N(B +$BDj=hM}$,$J$5$l$^$9!#(B + +$BJQ49%k!<%k$K%U%!%s%/%7%g%s$,=q$$$F$"$l$P!"$=$l$,/$7J#(B +$B;($J=hM}$r9T$J$$$^$9!#$^$:F~NO%b!<%I$rJQ$($kA0$K!"(B EXITMODE $B$H$$$&2>A[E*$J(B +$B%-!<$GJQ49$,9T$J$o$l$^$9!#$=$N$"$HF~NO%b!<%I$rJQ99$7$F$+$i:#EY$O(B + ENTERMODE $B$H$$$&%-!<$GJQ49$,9T$J$o$l$^$9!#$3$NFs$D$N2>A[E*$J%-!<$NF~NO$K(B +$B$h$j!"%b!<%I$,JQ$o$k;~$NFCJL$JF0:n$rDj5A%U%!%$%k$K5-=R$9$k$3$H$,$G$-$^$9!#(B +$B:G8e$KF~NO%3%s%F%-%9%H$,%/%j%"$5$l$F!"F~NO%b!<%I$NJQ99$K$H$b$J$&=hM}$,40N;(B +$B$7$^$9!#(B + +$BF~NOJ8;zJQ49$O$3$N$h$&$K$7$F9T$J$o$l$^$9!#(B + + +** $BJQ49Dj5A%U%!%$%k$N=q$-J}(B + +$BJQ49$OF~NOJ8;zJQ49Dj5A%U%!%$%k$K=q$+$l$?%k!<%k$K$7$?$,$C$F9T$J$o$l$^$9!#$3(B +$B$3$G$O$=$NDj5A%U%!%$%k$N=q$-J}$r@bL@$7$^$9!#(B + +$B%U%!%$%k$N%U%)!<%^%C%H$N@bL@$K0\$kA0$K>/$7@bL@$7$F$*$/$3$H$,$"$j$^$9!#$^$:!"(B +$BDj5A%U%!%$%k$NCf$K$O4A;z$,=q$1$k$N$G$9$,!"4A;z%3!<%I$OI,$:(B EUC $B$G$J$1$l$P(B +$B$J$j$^$;$s!#$=$l$+$i!"(B'#' $B$G;O$^$k9T$O%3%a%s%H$G$9!#(Binclude $B9T$GB>$N%U%!%$(B +$B%k$r%$%s%/%k!<%I$9$k$3$H$,$G$-$^$9!#(B + + include '$B%U%!%$%kL>(B' + +$B%U%!%$%kL>$,AjBP%Q%9I=5-$G$"$l$P!"$=$N%5!<%A%Q%9$ODj5A%U%!%$%k$N$b$N$HF1$8(B +$B$G!"(B + + 1. $B%+%l%s%H%G%#%l%/%H%j(B + 2. $B4D6-JQ?t(B CC_DEF_PATH $B$K;XDj$5$l$?%G%#%l%/%H%j(B + 3. /usr/lib/X11/ccdef/ + +$B$N=g$K$J$j$^$9!#(B + +$B$G$O!"Dj5A%U%!%$%k$N%U%)!<%^%C%H$N@bL@$K0\$j$^$9!#Dj5A%U%!%$%k$O + <$B=i4|%b!<%I@k8@(B> + [<$B$=$NB>$N@k8@(B>] + <$B3F%b!<%I$NJQ49%k!<%k5-=R(B> + + +<$B%b!<%I@k8@(B> $B$K$O!";HMQ$9$kF~NO%b!<%IL>$r$"$i$+$8$a@k8@$7$F$*$-$^$9!#$9$Y(B +$B$F$N%b!<%I$O$3$3$G@k8@$7$F$*$+$J$J$1$l$P$J$j$^$;$s!#$3$l$OI,$:Dj5A%U%!%$%k(B +$B$N:G=i$K=q$+$l$F$$$J$1$l$P$J$j$^$;$s!#(B1> <$B%b!<%IL>(B2>... + $BNc(B) defmode Roma Ascii ZenkakuAscii + + +$B%b!<%IL>$K;H$($k$N$O%"%9%-! $B$N $B$,Mh$^$9!#$3$l$O:G=i$NF~NO%b!<%I$r(B +$B;XDj$9$k$b$N$G!"(B> + $BNc(B) initialmode Ascii + +$B$3$3$K;XDj$9$k%b!<%I$b!"(B<$B%b!<%I@k8@(B> $B$G@k8@$7$F$*$/I,MW$,$"$j$^$9!#(B + +<$B=i4|%b!<%I@k8@(B> $B$N$"$H(B ($B$h$j@53N$K$O(B <$B3F%b!<%I$NJQ49%k!<%k5-=R(B> $B$h$j(B +$BA0$NG$0U$N>l=j(B) $B$K$=$NB>$N@k8@$r=q$/$3$H$,$G$-$^$9!#$3$N@k8@$O>JN,2DG=(B +$B$G$9!#8=:_$N$H$3$m=q$/$3$H$N$G$-$k@k8@$O#2l9g!"F~NOJ8;z$H(B <$B3F%b!<%I$NJQ49%k!<%k5-=R(B> $B$K5-(B +$B=R$5$l$kF~NO%3%s%F%-%9%H$NHf3S;~$KBgJ8;z>.J8;z$,6hJL$5$l$^$;$s!#$7$+$7(B +$B$3$N@k8@$r2C$($k$3$H$K$h$jBgJ8;z>.J8;z$r6hJL$9$k$h$&$K$J$j$^$9!#$b$&$R(B +$B$H$D$O!"(B + + autofix + +$B$G$9!#$3$N@k8@$r$7$F$*$/$H!"F~NO%3%s%F%-%9%H$,6u$N;~$KF~NO%3%s%F%-%9%H(B +$B$X$NDI2C$,5/$3$k$H!"<+F03NDj=hM}$,$J$5$l$^$9!#$?$@$7!"%/%i%$%"%s%H$H(B +kinput2 $B$H$NDL?.$K(B XIM $B%W%m%H%3%k$r;HMQ$7$F$$$k>l9g!"(BXlib $B$N%P!<%8%g%s$K(B +$B$h$C$F$O(B autofix $B$r;XDj$9$k$HI=<($,$*$+$7$/$J$k$3$H$,$"$j$^$9!#(B + +<$B=i4|%b!<%I@k8@(B> $B$N$"$H$K$O!"$3$3$NF~NO%b!<%I$KBP$9$kJQ49%k!<%k$N5-=R$,$-(B +$B$^$9!#$"$k%b!<%I$KBP$9$k5-=R7A<0$O(B> <$B%W%m%s%W%HJ8;zNs(B> [ fallthrough <$B%b!<%IL>(B> ] + <$BJQ49%k!<%k(B1> + <$BJQ49%k!<%k(B2> + ... + endmode + +$B$3$N$h$&$K!"3F%b!<%I$N%k!<%k5-=R$O(B mode $B9T$G$O$8$^$j!"(Bendmode $B9T$G=*$j$^$9!#(B + +<$B%b!<%IL>(B> $B$O(B <$B%b!<%I@k8@(B> $B$G@k8@$7$?%b!<%IL>$G$9!#(B + +<$B%W%m%s%W%HJ8;zNs(B> $B$O%b!<%I$rI=$9!"%@%V%k%/%)!<%H$G0O$^$l$?J8;zNs$G$9!#(B<$B%W(B +$B%m%s%W%HJ8;zNs(B> $B$K$O4A;z$b;HMQ$G$-$^$9!#$3$l$O8=:_$NF~NO%b!<%I$rI=<($9$k$N(B +$B$K;HMQ$5$l$^$9!#(B + +[ fallthrough <$B%b!<%IL>(B> ] $B$H3g8L$G0O$^$l$F$$$k$N$O!">JN,2DG=$G$"$k$3$H$r(B +$B<($7$^$9!#$b$7$3$l$,=q$$$F$"$k>l9g!"JQ49$N:]$3$N%b!<%I$K%^%C%A$9$k%k!<%k$,(B +$B$J$+$C$?>l9g$K$O0zB3$-$3$3$K;XDj$7$?%b!<%I$N%k!<%k$,C5$5$l$^$9!#(B + +mode $B9T$KB3$$$FJQ49%k!<%k$N5-=R$,JB$S$^$9!#JQ49%k!<%k$ODj5A%U%!%$%k$K=q$+(B +$B$l$?=g=xDL$j$K%^%C%A%s%0$,D4$Y$i$l$^$9$N$GJQ49%k!<%k$r=q$/=gHV$O=EMW$G$9!#(B + + +** $BJQ49%k!<%k(B + +$B$3$NJQ49%k!<%k$O <$B%-!<(B> <$BJQ497k2LJ8;zNs(B> [ <$B%U%!%s%/%7%g%s(B>... ] + +<$B%3%s%F%-%9%HJ8;zNs(B> $B$O%@%V%k%/%)!<%H$G0O$^$l$?J8;zNs$G$9!#$"$k%k!<%k$,E,(B +$BMQ$5$l$k$?$a$K$O!"$3$N%3%s%F%-%9%HJ8;zNs$,8=:_$NF~NO%3%s%F%-%9%H$H%^%C%A$9(B +$B$kI,MW$,$"$j$^$9!#%^%C%A%s%0$O!"$3$N%3%s%F%-%9%HJ8;zNs$,F~NO%3%s%F%-%9%H$N(B +$B:G8e$NItJ,$H0lCW$9$k$+$I$&$+$GH=Dj$5$l$^$9!#Nc$($P$"$k%k!<%k$N%3%s%F%-%9%H(B +$BJ8;zNs$,(B"ky" $B$@$H$9$k$H!"F~NO%3%s%F%-%9%H$N:G8e$N#2J8;z$,(B "ky" $B$G$"$l$P%^%C(B +$B%A$7$^$9!#%3%s%F%-%9%HJ8;zNs$,6uJ8;zNs(B ("") $B$@$C$?>l9g$K$O!"F~NO%3%s%F%-%9(B +$B%H$,2?$G$"$C$F$b%^%C%A$7$^$9!#(B + +$B$3$NJ8;zNs$NCf$G$O(B '^' $B$H(B ' ' $B$N#2$D$NJ8;z$,FC $B$OF~NO$5$l$?%-!<$rI=$7$^$9!#$3$l$O(B X$B$N%-!<%$%Y%s%H!"%-%c%i%/%?%3!<(B +$B%I!"%a%?%-%c%i%/%?!"5?;w%-!<%3!<%I$N$$$:$l$+$r;XDj$7$^$9!#(B + +X$B$N%-!<%$%Y%s%H$O!"(B + + [$B%b%G%#%U%!%$%"(B-]Keysym$BL>(B + +$B$N$h$&$KI=5-$7$^$9!#%b%G%#%U%!%$%"$H$7$F$O(B + + shift + lock + control + mod1 + mod2 + mod3 + mod4 + mod5 + +$B$,;HMQ$G$-$^$9!#J#?t$N%b%G%#%U%!%$%"$r;XDj$9$k;~$K$O%O%$%U%s(B ' ' $B$G$D$J$.(B +$B$^$9!#(BKeysym$BL>$O(B X $B$GDj5A$5$l$F$$$k(B Keysym $B$NL>A0$G$9!#$3$l$O(B +/usr/include/X11/keysymdef.h $B$GDj5A$5$l$F$$$kL>A0$N$+$i@hF,$N(B 'XK_' $B$r$O(B 'Tab' $B$K$J$j$^$9!#JQ49%k!<%k$K=q$1$k(B X +$B$N%-!<%$%Y%s%H$NNc$H$7$F$Oe$NNc$G$O#2HV(B +$B$a$NNc$O%(%9%1!<%W(B (0x1e) $B$rI=$7!"#3HV$a$O%7%s%0%k%/%)!<%HJ8;z$rI=$7$F$$$^(B +$B$9!#(B + +$B%a%?%-%c%i%/%?$O $B$G;2>H$9$k$K$O(B +'&' $B$r;HMQ$7$^$9!#(B + +$B5?;w%-!<$K$O(B +$BA[E*$KF~NO$5$l$k%-!<$G$"$j!"(BEXITMODE $B$O$"$k%b!<%I$+$iH4$1$?;~$K2>A[E*$KF~(B +$BNO$5$l$k%-!<$G$9!#$3$l$i$O$"$k%b!<%I$K$O$$$C$?;~$dH4$1$?;~$KFCJL$NF0:n$r$5(B +$B$;$k$?$a$KMQ0U$5$l$F$$$^$9!#(BCcWnn $B$G$O$3$l$i$O(B JIS$B%3!<%IF~NO$N$?$a$K;HMQ$5(B +$B$l$F$$$^$9!#(B + +<$BJQ497k2LJ8;zNs(B> $B$O%@%V%k%/%)!<%H$G0O$^$l$?J8;zNs$G!"$=$NL>$NDL$j$=$NJQ49(B +$B%k!<%k$,E,MQ$5$l$?;~$NJQ497k2L$r;XDj$7$^$9!#$3$NJQ497k2L$OF~NO%3%s%F%-%9%H(B +$B$K$bF~$l$i$l$^$9!#$D$^$j!"F~NO%3%s%F%-%9%H$N$&$A!"(B<$B%3%s%F%-%9%HJ8;zNs(B> $B$H(B +$B%^%C%A$7$?ItJ,$,(B<$BJQ497k2LJ8;zNs(B> $B$KJQ$o$j$^$9!#Nc$($P!"F~NO%3%s%F%-%9%H$,(B +"...$B$P(Bk" $B$@$C$?;~$K(B + + "k" 'a' "$B$+(B" + +$B$H$$$&JQ49%k!<%k$,E,MQ$5$l$k$HF~NO%3%s%F%-%9%H$O(B "...$B$P$+(B" $B$KJQ$o$j$^$9!#(B + +<$BJQ497k2LJ8;zNs(B> $B$K$D$$$F$b$$$/$D$+$NFC $B$HF1MM$N0UL#$r;}$A$^$9!#(B'&' $B$O(B <$B%-!<(B> $B$NI=(B +$B$9%-%c%i%/%?$HCV$-49$($i$l$^$9!#$3$l$O(B <$B%-!<(B> $B$K%a%?%-%c%i%/%?$r;HMQ$7$?>l(B +$B9g$KJXMx$G$9!#Nc$($P(B 'a' $B$r2!$7$?;~$K(B + + "" @printable "&" + +$B$H$$$&%k!<%k$,E,MQ$5$l$k$H!"(B'&' $B$O(B 'a' $B$KCV$-49$($i$l$^$9!#$^$?!"(B'/' $B$OF~(B +$BNO%3%s%F%-%9%H$r%/%j%"$7$^$9!#(B + + "k" 'a' "$B$+(B/" + +$B$H$$$&%k!<%k$,E,MQ$5$l$k$H(B "$B$+(B" $B$H$$$&J8;zNs$KJQ49$5$l$^$9$,!"F~NO%3%s%F%-(B +$B%9%H$O%/%j%"$5$l$F$J$/$J$C$F$7$^$$$^$9!#(B'/' $B$rJ8;zNs$NESCf$KF~$l$k$3$H$b2D(B +$BG=$G$9!#$=$N>l9g$K$O(B '/' $B$N$"$H$NItJ,$@$1$,?7$7$$F~NO%3%s%F%-%9%H$K$J$j$^(B +$B$9!#(B + +<$B%U%!%s%/%7%g%s(B> $B$K$O!"l9g$K$O!"A0$+$i=g$K$KFC(B> + +$B%b!<%IL>$H$7$F(B PREV $B$r;XDj$9$k$H!"$=$ND>A0$NF~NO%b!<%I$KLa$k$3$H$,$G$-$^$9!#(B + +redo $B$O:FJQ49$r$5$;$k$?$a$K;H$$$^$9!#(B + + redo + +$B$H=q$/$H$b$&0lEY%^%C%A$9$k%k!<%k$rC5$7$K$$$-$^$9!#$?$@$7!"$=$NA0$K(B <$B%3%s%F(B +$B%-%9%HJ8;zNs(B> $B$,(B <$BJQ497k2LJ8;zNs(B> $B$GCV$-49$($i$l$F$$$k$N$G!":F$SF1$8%k!<%k(B +$B$,%^%C%A$9$k$H$O8B$j$^$;$s!#$3$N5!G=$rMxMQ$9$k;~$K$O!"L58B%k!<%W$K4Y$i$J$$(B +$B$h$&$K==J,5$$r$D$1$kI,MW$,$"$j$^$9!#0l1~(B redo $B$,(B 20$B2sO"B3$7$F8F$P$l$k$H%^%C(B +$B%A%s%0$K<:GT$9$k$h$&$K$J$C$F$O$$$^$9$,!#(B + +goto $B$H(B redo $B$N$"$H$K=q$+$l$?%U%!%s%/%7%g%s$O(B $B$l(B + + [$BL$JQ49(B] $B%+%l%s%HJ8@a$,L$JQ49$G$"$k;~$NF0:n(B + [$BJQ49:Q(B] $B%+%l%s%HJ8@a$,$9$G$KJQ49$5$l$F$$$k;~$NF0:n(B + [$B8uJdA*Br(B] $B%9%F!<%?%9%i%$%s$G$NF12;8lA*Br%b!<%I$G$NF0:n(B + [$B5-9fF~NO(B] $B5-9fF~NO%b!<%I$G$NF0:n(B + +$B$r<($7$F$$$^$9!#(B + + +$B%U%!%s%/%7%g%sL>(B $B5!G=(B +------------------------------------------------------------------------------ +convert [$BL$JQ49(B] $B%+%l%s%HJ8@a0J9_$rO"J8@aJQ49$9$k(B + [$BJQ49:Q(B] $B%+%l%s%HBgJ8@a$N8uJdA*Br%b!<%I$K$O$$$k(B + [$B8uJdA*Br(B] forward $B$HF1$8(B + [$B5-9fF~NO(B] $B%(%i!<(B ($B%Y%k$,LD$k(B) +------------------------------------------------------------------------------ +convert-or-fix1 [$BL$JQ49(B][$B8uJdA*Br(B][$B5-9fF~NO(B] convert $B$HF1$8(B + [$BJQ49:Q(B] $B:G=i$N0lJ8;z$@$1$,3NDj$5$l$k(B +------------------------------------------------------------------------------ +convert-or-space[$BL$JQ49(B][$BJQ49:Q(B] $BL$3NDjJ8;zNs$,$"$l$P(B convert $B$HF1$8!#(B + $B$J$1$l$P%9%Z!<%9$,A^F~!&3NDj$5$l$k(B + [$B8uJdA*Br(B][$B5-9fF~NO(B] convert $B$HF1$8(B +------------------------------------------------------------------------------ +convert-or-sendback[$BL$JQ49(B][$BJQ49:Q(B] $BL$3NDjJ8;zNs$,$"$l$P(B convert $B$HF1$8!#(B + $B$J$1$l$P(B send-back $B$HF1$8(B + [$B8uJdA*Br(B][$B5-9fF~NO(B] convert $B$HF1$8(B +------------------------------------------------------------------------------ +convert-s [$BL$JQ49(B] $B%+%l%s%HJ8@a0J9_$rO"J8@aJQ49$9$k(B + [$BJQ49:Q(B] $B%+%l%s%H>.J8@a$N8uJdA*Br%b!<%I$K$O$$$k(B + [$B8uJdA*Br(B] forward $B$HF1$8(B + [$B5-9fF~NO(B] $B%(%i!<(B ($B%Y%k$,LD$k(B) +------------------------------------------------------------------------------ +unconvert [$BJQ49:Q(B] $B%+%l%s%HBgJ8@a$rL5JQ49$N>uBV$KLa$9(B + [$BL$JQ49(B][$B8uJdA*Br(B][$B5-9fF~NO(B] $B%(%i!<(B ($B%Y%k$,LD$k(B) +------------------------------------------------------------------------------ +next [$BL$JQ49(B] $B%(%i!<(B ($B%Y%k$,LD$k(B) + [$BJQ49:Q(B] $B%+%l%s%HBgJ8@a$r.J8@a$r.J8@a$rA08uJd$GCV$-49$($k(B + [$B8uJdA*Br(B][$B5-9fF~NO(B] $BA0%Z!<%8$K0\F0$9$k(B +------------------------------------------------------------------------------ +forward [$BL$JQ49(B] $B%+!<%=%k$r#1J8;z?J$a$k(B + [$BJQ49:Q(B] $B%+%l%s%HJ8@a$r#1>.J8@aJ,8e$m$K0\F0$9$k(B + [$B8uJdA*Br(B][$B5-9fF~NO(B] $B.J8@aJ,A0$K0\F0$9$k(B + [$B8uJdA*Br(B][$B5-9fF~NO(B] $BA08uJd(B($B5-9f(B)$B$K0\F0$9$k(B +------------------------------------------------------------------------------ +move-top [$BL$JQ49(B][$BJQ49:Q(B] $B%+!<%=%k$*$h$S%+%l%s%HJ8@a$rJ8$N@hF,$K(B + $B0\F0$5$;$k(B + [$B8uJdA*Br(B][$B5-9fF~NO(B] $B8=:_%Z!<%8$N@hF,$N8uJd(B($B5-9f(B)$B$K0\F0$9$k(B +------------------------------------------------------------------------------ +move-bottom [$BL$JQ49(B][$BJQ49:Q(B] $B%+!<%=%k$*$h$S%+%l%s%HJ8@a$rJ8$N:G8e$K(B + $B0\F0$5$;$k(B + [$B8uJdA*Br(B][$B5-9fF~NO(B] $B8=:_%Z!<%8$N:G8e$N8uJd(B($B5-9f(B)$B$K0\F0$9$k(B +------------------------------------------------------------------------------ +clear [$BL$JQ49(B][$BJQ49:Q(B] $BF~NO$7$?J8$rA4$F:o=|$9$k(B + [$B8uJdA*Br(B] $BF~NO$7$?J8$rA4$F:o=|$7!"8uJdA*Br%b!<%I$+$iH4$1$k(B + [$B5-9fF~NO(B] $BF~NO$7$?J8$rA4$F:o=|$7!"5-9fF~NO%b!<%I$+$iH4$1$k(B +------------------------------------------------------------------------------ +expand [$BJQ49:Q(B] $B%+%l%s%HBgJ8@a$r0lJ8;z$N$P$7:FJQ49$9$k(B + [$BL$JQ49(B][$B8uJdA*Br(B][$B5-9fF~NO(B] $B%(%i!<(B ($B%Y%k$,LD$k(B) +------------------------------------------------------------------------------ +expand-s [$BJQ49:Q(B] $B%+%l%s%H>.J8@a$r0lJ8;z$N$P$7:FJQ49$9$k(B + [$BL$JQ49(B][$B8uJdA*Br(B][$B5-9fF~NO(B] $B%(%i!<(B ($B%Y%k$,LD$k(B) +------------------------------------------------------------------------------ +shrink [$BJQ49:Q(B] $B%+%l%s%HBgJ8@a$r0lJ8;z$A$B$a:FJQ49$9$k(B + [$BL$JQ49(B][$B8uJdA*Br(B][$B5-9fF~NO(B] $B%(%i!<(B ($B%Y%k$,LD$k(B) +------------------------------------------------------------------------------ +shrink-s [$BJQ49:Q(B] $B%+%l%s%H>.J8@a$r0lJ8;z$A$B$a:FJQ49$9$k(B + [$BL$JQ49(B][$B8uJdA*Br(B][$B5-9fF~NO(B] $B%(%i!<(B ($B%Y%k$,LD$k(B) +------------------------------------------------------------------------------ +expand-noconv [$BJQ49:Q(B] $B%+%l%s%HBgJ8@a$r0lJ8;z$N$P$9(B $B:FJQ49$O$7$J$$(B + ($B$d$C$F$_$k$H$o$+$j$^$9$,$3$l$O$"$^$j0UL#$,$"$j$^$;$s(B) + [$BL$JQ49(B][$B8uJdA*Br(B][$B5-9fF~NO(B] $B%(%i!<(B ($B%Y%k$,LD$k(B) +------------------------------------------------------------------------------ +expand-noconv-s [$BJQ49:Q(B] $B%+%l%s%H>.J8@a$r0lJ8;z$N$P$9(B $B:FJQ49$O$7$J$$(B + ($B$d$C$F$_$k$H$o$+$j$^$9$,$3$l$O$"$^$j0UL#$,$"$j$^$;$s(B) + [$BL$JQ49(B][$B8uJdA*Br(B][$B5-9fF~NO(B] $B%(%i!<(B ($B%Y%k$,LD$k(B) +------------------------------------------------------------------------------ +shrink-noconv [$BJQ49:Q(B] $B%+%l%s%HBgJ8@a$r0lJ8;z$A$B$a$k(B $B:FJQ49$O$7$J$$(B + ($B$d$C$F$_$k$H$o$+$j$^$9$,$3$l$O$"$^$j0UL#$,$"$j$^$;$s(B) + [$BL$JQ49(B][$B8uJdA*Br(B][$B5-9fF~NO(B] $B%(%i!<(B ($B%Y%k$,LD$k(B) +------------------------------------------------------------------------------ +shrink-noconv-s [$BJQ49:Q(B] $B%+%l%s%H>.J8@a$r0lJ8;z$A$B$a$k(B $B:FJQ49$O$7$J$$(B + ($B$d$C$F$_$k$H$o$+$j$^$9$,$3$l$O$"$^$j0UL#$,$"$j$^$;$s(B) + [$BL$JQ49(B][$B8uJdA*Br(B][$B5-9fF~NO(B] $B%(%i!<(B ($B%Y%k$,LD$k(B) +------------------------------------------------------------------------------ +fix [$BL$JQ49(B][$BJQ49:Q(B] $BJ8$r3NDj$9$k(B + [$B8uJdA*Br(B] $B8=:_%+!<%=%k$,$"$k8uJd$rA*Br$7$F$+$iJ8$r3NDj$9$k(B + [$B5-9fF~NO(B] $B8=:_%+!<%=%k$,$"$k5-9f$rA*Br$7$F$+$iJ8$r3NDj$9$k(B +------------------------------------------------------------------------------ +fix2 [$BL$JQ49(B][$BJQ49:Q(B][$B8uJdA*Br(B][$B5-9fF~NO(B] fix $B$HF1$8(B + (fix $B$O3NDj$9$kJ8;z$,$J$$;~$K3QJ8;z$K$9$k(B + [$B8uJdA*Br(B] $B%+%l%s%HJ8@a$rH>3QJ8;z$K$7!"8uJdA*Br%b!<%I$rH4$1$k(B + [$B5-9fF~NO(B] $B%(%i!<(B ($B%Y%k$,LD$k(B) +------------------------------------------------------------------------------ +to-zenkaku [$BL$JQ49(B][$BJQ49:Q(B] $B%+%l%s%HJ8@a$rA43QJ8;z$K$9$k(B + [$B8uJdA*Br(B] $B%+%l%s%HJ8@a$rA43QJ8;z$K$7!"8uJdA*Br%b!<%I$rH4$1$k(B + [$B5-9fF~NO(B] $B%(%i!<(B ($B%Y%k$,LD$k(B) +------------------------------------------------------------------------------ +to-hiragana [$BL$JQ49(B][$BJQ49:Q(B] $B%+%l%s%HJ8@a$r$R$i$,$J$K$9$k(B + [$B8uJdA*Br(B] $B%+%l%s%HJ8@a$r$R$i$,$J$K$7!"8uJdA*Br%b!<%I$rH4$1$k(B + [$B5-9fF~NO(B] $B%(%i!<(B ($B%Y%k$,LD$k(B) +------------------------------------------------------------------------------ +to-katakana [$BL$JQ49(B][$BJQ49:Q(B] $B%+%l%s%HJ8@a$r%+%?%+%J$K$9$k(B + [$B8uJdA*Br(B] $B%+%l%s%HJ8@a$r%+%?%+%J$K$7!"8uJdA*Br%b!<%I$rH4$1$k(B + [$B5-9fF~NO(B] $B%(%i!<(B ($B%Y%k$,LD$k(B) +------------------------------------------------------------------------------ +backspace [$BL$JQ49(B] $B%+!<%=%k$NA0$NJ8;z$r:o=|$9$k(B + [$BJQ49:Q(B] $B%+%l%s%HBgJ8@a$rL$JQ49>uBV$KLa$7$F$+$i%+!<%=%k$N(B + $BA0$NJ8;z$r:o=|$9$k(B + [$B8uJdA*Br(B] $B8uJdA*Br%b!<%I$rH4$1!"%+%l%s%HJ8@a$rL$JQ49>uBV$K(B + $BLa$7$F$+$i%+!<%=%k$NA0$NJ8;z$r:o=|$9$k(B + [$B5-9fF~NO(B] $B5-9fF~NO%b!<%I$+$iH4$1$k(B +------------------------------------------------------------------------------ +delete [$BL$JQ49(B] $B%+!<%=%k$N2<$NJ8;z$r:o=|$9$k(B + [$BJQ49:Q(B] $B%+%l%s%HBgJ8@a$rL$JQ49>uBV$KLa$7$F$+$i%+!<%=%k$N(B + $B2<$NJ8;z$r:o=|$9$k(B + [$B8uJdA*Br(B] $B8uJdA*Br%b!<%I$rH4$1!"%+%l%s%HBgJ8@a$rL$JQ49>uBV$K(B + $BLa$7$F$+$i%+!<%=%k$N2<$NJ8;z$r:o=|$9$k(B + [$B5-9fF~NO(B] $B5-9fF~NO%b!<%I$+$iH4$1$k(B +------------------------------------------------------------------------------ +kill-line [$BL$JQ49(B] $B%+!<%=%k$N2<$NJ8;z$H$=$l0J9_$r:o=|$9$k(B + [$BJQ49:Q(B] $B%+%l%s%HJ8@a$H$=$l0J9_$r:o=|$9$k(B + [$B8uJdA*Br(B] $B8uJdA*Br%b!<%I$+$iH4$1!"%+%l%s%HJ8@a0J9_$r:o=|$9$k(B + [$B5-9fF~NO(B] $B5-9fF~NO%b!<%I$+$iH4$1$k!"$=$l0J9_$r:o=|$9$k(B +------------------------------------------------------------------------------ +carriage-return [$BL$JQ49(B][$BJQ49:Q(B] $BJ8$r3NDj$7!"$=$N8e2~9TJ8;z$rA^F~$9$k(B + [$B8uJdA*Br(B][$B5-9fF~NO(B] $B8=:_%+!<%=%k$N$"$k8uJd(B($B5-9f(B)$B$rA*Br$9$k(B +------------------------------------------------------------------------------ +beep [$BL$JQ49(B][$BJQ49:Q(B][$B8uJdA*Br(B][$B5-9fF~NO(B] $B%Y%k$rLD$i$9(B +------------------------------------------------------------------------------ +jiscode-begin [$BL$JQ49(B][$BJQ49:Q(B] JIS$B%3!<%IF~NO%b!<%I$K$O$$$k(B + [$B8uJdA*Br(B][$B5-9fF~NO(B] $B%(%i!<(B ($B%Y%k$,LD$k(B) +------------------------------------------------------------------------------ +jiscode-end [$BL$JQ49(B][$BJQ49:Q(B] JIS$B%3!<%IF~NO%b!<%I$r$L$1$k(B + [$B8uJdA*Br(B][$B5-9fF~NO(B] $B%(%i!<(B ($B%Y%k$,LD$k(B) +------------------------------------------------------------------------------ +kutencode-begin [$BL$JQ49(B][$BJQ49:Q(B] $B6hE@%3!<%IF~NO%b!<%I$K$O$$$k(B + [$B8uJdA*Br(B][$B5-9fF~NO(B] $B%(%i!<(B ($B%Y%k$,LD$k(B) +------------------------------------------------------------------------------ +kutencode-end [$BL$JQ49(B][$BJQ49:Q(B] $B6hE@%3!<%IF~NO%b!<%I$r$L$1$k(B + [$B8uJdA*Br(B][$B5-9fF~NO(B] $B%(%i!<(B ($B%Y%k$,LD$k(B) +------------------------------------------------------------------------------ +symbol-input [$BL$JQ49(B][$BJQ49:Q(B] $B5-9fF~NO%b!<%I$K$O$$$k(B + [$B8uJdA*Br(B] $B%(%i!<(B ($B%Y%k$,LD$k(B) + [$B5-9fF~NO(B] $B5-9fF~NO%b!<%I$+$iH4$1$k(B +------------------------------------------------------------------------------ +send-back [$BL$JQ49(B][$BJQ49:Q(B][$B8uJdA*Br(B][$B5-9fF~NO(B] $B$3$N%U%!%s%/%7%g%s$r(B + $B%H%j%,!<$7$?%-!<%$%Y%s%H$r%"%W%j%1!<%7%g%s$KAw$jJV$9(B +------------------------------------------------------------------------------ +convert-move-top-or-sendback[$BL$JQ49(B] $BL$3NDjJ8;zNs$,$"$l$PL$JQ49$N@hF,J8(B + $B@a$rO"J8@aJQ49$9$k!#$J$1$l$P(B send-back $B$HF1$8(B + [$BJQ49:Q(B][$B8uJdA*Br(B][$B5-9fF~NO(B] convert-or-sendback $B$HF1$8(B +------------------------------------------------------------------------------ +convert-move-top-or-space[$BL$JQ49(B] $BL$3NDjJ8;zNs$,$"$l$PL$JQ49$N@hF,J8(B + $B@a$rO"J8@aJQ49$9$k!#$J$1$l$P%9%Z!<%9$,A^F~!&3NDj$5$l$k!#(B + ($BMW$9$k$K(B egg $B$G(B wnn $B$r;H$$(B space $B$r2!$7$?;~$N$h$&$K$J$k(B) + [$BJQ49:Q(B][$B8uJdA*Br(B][$B5-9fF~NO(B] convert-or-space $B$HF1$8(B +------------------------------------------------------------------------------ +clear-or-cancel [$BJQ49:Q(B][$B8uJdA*Br(B] $B8uJdA*Br%b!<%I$rH4$1F~NO$5$l$?J8;z(B + $BNs$rA4$F$R$i$,$J$K$b$I$7!"%+!<%=%k$rJ8$N:G8e$K0\F0$5$;$k(B + [$BL$JQ49(B][$B5-9fF~NO(B] clear $B$HF1$8(B +------------------------------------------------------------------------------ +backspace-or-cancel[$BJQ49:Q(B][$B8uJdA*Br(B] clear-or-cancel $B$HF1$8(B + [$BL$JQ49(B][$B5-9fF~NO(B] backspace $B$HF1$8(B +------------------------------------------------------------------------------ +delete-or-cancel[$BJQ49:Q(B][$B8uJdA*Br(B] clear-or-cancel $B$HF1$8(B + [$BL$JQ49(B][$B5-9fF~NO(B] delete $B$HF1$8(B +------------------------------------------------------------------------------ +convert-next-or-move-top-or-sendback[$BJQ49:Q(B] $B%+%l%s%HBgJ8@a$r.J8@a$N8uJdA*Br%b!<%I$K$O$$$j!"(Bgoto $B$HF1MM$K(B + $B$N?M$b;2>H$7$^$9$+$i!"$3$l$O(B +$B$=$N$^$^$K$7$F$*$$$?J}$,$h$$$G$7$g$&!#(B + +$B$=$3$G$^$:4D6-JQ?t(B CC_DEF_PATH $B$rDj5A$7$F!"Dj5A%U%!%$%k$N%5!<%A%Q%9$rJQ99(B +$B$7$^$9!#(B.cshrc $B$J$I$G(B + + setenv CC_DEF_PATH ~/ccdef + +$B$H@_Dj$9$k$H!"Dj5A%U%!%$%k$rC5$9$N$K(B ~/ccdef $B$H$$$&%G%#%l%/%H%j$,;H$o$l$^(B +$B$9!#(BCC_DEF_PATH $B$G;XDj$7$?%G%#%l%/%H%j$O%G%U%)%k%H$N%G%#%l%/%H%j$G$"$k(B +/usr/lib/X11/ccdef $B$h$j$b@h$KC5$5$l$^$9$N$G!"$3$3$K<+J,MQ$N(B rule.func $B$H$$(B +$B$&%U%!%$%k$r:n$l$P$$$$$o$1$G$9!#(B/usr/lib/X11/ccdef/rule.func $B$r(B +~/ccdef/rule.func $B$K%3%T!<$7$F$+$i$3$l$r%(%G%#%C%H$7$^$9!#%U%!%$%kCf$K(B + + "" '^J' "" convert + "" Kanji "" convert + +$B$H$$$&9T$,$"$j$^$9$+$i!"$3$l$r(B + + "" '^W' "" convert + +$B$KCV$-49$($l$P=*$j$G$9!#(B + +*** $B$+$JF~NO$X$NJQ99(B + +$B@\$+$J$rF~NO$9$k?M(B +$B$N$?$a$NJQ99$G$9!#(B + +$B%G%U%)%k%H$NDj5A%U%!%$%k$O%m!<%^;zF~NOMQ$K$J$C$F$$$F!"%m!<%^;z$+$JJQ49$O(B +Kana $B$H$$$&F~NO%b!<%I$G9T$J$o$l$k$h$&$K$J$C$F$$$^$9!#(B + + # $B%m!<%^;z(B + mode Kana "$B%m!<%^(B" fallthrough All + include 'rule.roma' + "" Tab "" goto Ascii + "" shift-Tab "" goto ZenkakuAscii + "n" EXITMODE "$B$s(B" + endmode + +$Be$,$j$G$9!#(B + +*** Emacs $BMQ$NJQ99(B + +$B%+%9%?%^%$%:$N:G8e$NNc$H$7$F!"(Bemacs $B$r;H$&;~$KJXMx$JJQ99$r>R2p$7$^$9!#(B + +$B$4B8CN$N$h$&$K!"(Bemacs $B$O%3%s%H%m!<%k%-!<$r6n;H$7$FJT=8$r9T$J$$$^$9!#%j%=!<(B +$B%9(BsendbackKeyPress $B$,(B True $B$K$J$C$F$$$l$P!"L$3NDj$NJ8;zNs$,$J$$>uBV$G$O$[(B +$B$H$s$I$N%3%s%H%m!<%k%-!<$O(B($B$=$N%-!<$,JQ49%U%!%s%/%7%g%s$K3d$jEv$F$i$l$F$$(B +$B$F$b(B) $B$=$N$^$^%"%W%j%1!<%7%g%s$KEO$5$l$^$9$N$G!"$+$J4A;zJQ49$,$G$-$kF~NO%b!<(B +$B%I$N$^$^(B emacs $B$K%3%^%s%I$rM?$($k$3$H$,$G$-$^$9!#$7$+$7Cf$K$O(B '^Xo' $B$J$I$N(B +$B$h$&$K#2%9%H%m!<%/$N%3%^%s%I$,$"$j!"$3$l$r%m!<%^;zF~NO%b!<%I$N$^$^F~NO$9$k(B +$B$H(B '^X' $B$O(B emacs $B$KEO$5$l$^$9$,!"(B'o' $B$O(B '$B$*(B' $B$KJQ49$5$l$F$7$^$$$^$9!#(B + +$B$3$l$G$OITJX$J$N$G!"(B'^X' $B$H(B '^[' $B$N$"$H$N#1J8;z$O$=$N$^$^%"%W%j%1!<%7%g%s(B +$B$KEO$5$l$k$h$&$KDj5A%U%!%$%k$r=$@5$7$F$_$^$9!#(B + +$B$H$O$$$C$F$b$3$l$O$+$J$j%H%j%C%-!<$JJ}K!$r;H$&I,MW$,$"$j$^$9!#(B + +$B$^$:(B /usr/lib/X11/ccdef/ccdef.kinput2 $B$r(B ~/ccdef $B$K%3%T!<$7$^$9!#$=$7$F(B $B?7(B +$B$?$K(B AsciiHack$B!"(BZenkakuAsciiHack $B$H(B KanaHack $B$N#3$D$N%b!<%I$rDI2C$7$^$9!#(B + + defmode Ascii <$BCfN,(B> Restricted AsciiHack ZenkakuAsciiHack KanaHack + +Ascii$B!"(BZenkakuAscii$B!"(BKana $B$N3F%b!<%I$K(B>Hack + "" '^X' "" goto <$B%b!<%IL>(B>Hack + +$B$?$@$7(B <$B%b!<%IL>(B> $B$K$O3F%b!<%IL>$,F~$j$^$9!#(B +$B(B> "<$B%W%m%s%W%HJ8;zNs(B>" + "" @ascii "" goto PREV + endmode + +$B$3$3$G=EMW$J$3$H$O!V(B<$B%W%m%s%W%HJ8;zNs(B> $B$K$O85$N%b!<%I(B (AsciiHack $B$J$i(B +Ascii)$B$N%W%m%s%W%HJ8;zNs$HF1$8$b$N$r;XDj$9$k!W$H$$$&$3$H$G$9!#(B + +$B$3$N$h$&$K$9$k$H0l1~(B '^X' $B$H(B '^[' $B$N$"$H$N#1J8;z$O$=$N$^$^%"%W%j%1!<%7%g%s(B +$B$KEO$5$l$k$h$&$K$J$j$^$9!#$?$@$"$^$j$K$b%H%j%C%-!<$JJ}K!$J$N$G!"$J$<$=$&$J(B +$B$k$N$+$O(B ($B$A$g$C$HCQ$:$+$7$/$F(B) $B$3$3$G$O@bL@$7$^$;$s!#(B + +*** Mule $B$d(B Emacs $B$N(B Egg $B$K9g$o$;$?%-!<%P%$%s%G%#%s%0(B + +$BIaCJ(B Mule $B$d(B Emacs $B$G(B Egg $B$rMxMQ$7$FF|K\8lF~NO$r9T$J$C$F$$$kJ}$O!"(B +kinput2 $B$KIUB0$9$k(B ccdef.kinput2.egg $B$rMxMQ$9$k$H!"(Bkinput2 $B$G$b$[$\F1(B +$BEy$N%-!<%P%$%s%G%#%s%0$r$H(B +$B$N%$%s%?!<%U%'%$%9$rDj5A$9$k$?$a$KB8:_$9$k%a%?(B widget $B$G$9!#(B + +* CcWnn object +InputConv $B%*%V%8%'%/%H$N%5%V%/%i%9$G!"F~NOJ8;zJQ49$K(B cconv$B!"$+$J4A;zJQ49(B +$B$K(B Wnn $B$r;HMQ$7$FJQ49$r9T$J$$$^$9!#(B + +* ConvDisplay object +$BJ8;zNs$NI=<($r9T$J$&%*%V%8%'%/%H$G$9!#(BInputConv $B$HF1$8$/%a%?(B widget $B$J$N(B +$B$G(BCreate $B$7$F$O$$$1$^$;$s!#(Bkinput2 $B$G$OJ8;zNs$NI=<($O$9$Y$F$3$N(B +ConvDisplay$B$N%5%V%/%i%9$N%*%V%8%'%/%H$K$h$C$F9T$J$o$l$^$9!#(B + +* WcharDisplay object +ConvDisplay $B%*%V%8%'%/%H$N%5%V%/%i%9$G!"(Bwchar $B7?$NJ8;zNs%G!<%?$rI=<($7$^(B +$B$9!#(BCcWnn $B$HAH$_9g$o$;$k$HJQ49%F%-%9%H$r@5$7$/I=<($G$-$^$9!#(B + +* CandidatePanel widget +$B8uJdA*BrMQ$N(B widget $B$G$9!#(BAthena $B$N(B List widget $B$_$?$$$J$b$N$G$9$,!"J8;z(B +$BNs$N%G!<%?7?$,(B ICString $B7?$G$"$k$H$3$m$,0[$J$j$^$9!#(B + +* Canvas widget +$B0lHLE*$J$*3(=q$-(B widget $B$G$9!#(BCore $B$K(B expose $B$H(B resize $B$N%3!<%k%P%C%/$r(B +$B$D$1$?$@$1$N(B widget$B!#(Bkinput2 $B$K8B$i$:$$$m$$$m;H$($k$G$7$g$&!#(B +SeparateConversion $B$N%F%-%9%HI=<($K;H$o$l$F$$$^$9!#(B + +* ICLabel widget +$B%b!<%II=<(MQ$N%i%Y%k(B widget $B$G$9!#(BAthena $B$N(B Label widget $B$_$?$$$J$b$N$G(B +$B$9$,J8;zNs$,(B ICString $B7?$K$J$C$F$$$k$H$3$m$,0c$$$^$9!#(B + +* AdoptedShell widget +$B0l8+$?$@$N%7%'%k(B widget $B$N$h$&$K8+$($^$9$,!"lJQ49(B) $B%?(B +$B%$%W$NJQ49$re$N$"$kNN0h$rJQ49@lMQNN(B +$B0h$H$7$F;HMQ$9$kF~NOJ}K!$G$9!#(B + +* SeparateConversion widget +OffTheSpotConversion $B$N%5%V%/%i%9$G!"(Bkinput$B$N$h$&$K(B $BJQ49@lMQ$NJL%&%#%s%I(B +$B%&$r$D$/$C$F$=$3$GF~NO$r9T$J$&%?%$%W$NJQ49$re0L8_49@-$r;}(B +$B$A$^$9$,!"$=$NB>$K$b(B kinput $B%W%m%H%3%k$+$iGI@8$7$?%W%m%H%3%k$,B8:_$7$^$9!#(B +$B$I$l$b7k9=;w$F$$$k$N$G$=$l$i$9$Y$F$r07$&(B widget $B$K$7$^$7$?!#$3$N(B widget +$B$O8=:_!"(B + + + kinput $B%W%m%H%3%k(B + + kinput2 $B%W%m%H%3%k(B + + jinput $B%W%m%H%3%k(B + + xlc $B%W%m%H%3%k(B + +$B$r%5%]!<%H$7$F$$$^$9!#(Bjinput $B%W%m%H%3%k$O>>2<$N%U%m%s%H%(%s%I(B jinput $B$,(B +$B;HMQ$9$k%W%m%H%3%k!"(Bxlc $B$O%=%K!<$N%U%m%s%H%(%s%I(B sjx $B$,;HMQ$9$k%W%m%H%3(B +$B%k$G!"$H$b$K(B kinput $B%W%m%H%3%k$N>e0L8_49$G$9!#(B + +* XimpProtocol widget +$B$3$l$b(B KinputProtocol $B$HF1$8$/(B kinput2 $B$H%/%i%$%"%s%H$H$N4V$NDL?.$r(B +$BC4Ev$9$k(B widget $B$G$9!#$3$N(B widget $B$,07$&$N$O(B XIMP $B$H$$$&%W%m%H%3%k$G!"(B +$B$3$l$OIY;NDL$d%=%K! ASCII -> double-width ASCII -> Romaji + If it is pressed with shift key, it changes the mode in reverse + order. + Note that ^I doesn't work. + +^H deletes the character before the text cursor. If the current + clause is converted, this puts it back into unconverted state + before deletion. + +Delete deletes the character at the text cursor. If the current clause + is converted, this puts it back into unconverted state before + deletion. + +^U erases all text. + + +* Conversion + +^J or Kanji + These keys do multiple clause conversion from the current clause + onwards. + If the current clause is already converted, a window is popped up, + all the candidates for the current clause will be shown in the + window, and then go into the candidate selection mode. + +^G puts the current clause back into unconverted state. + +^N or Down arrow + These keys substitute the current clause for the next candidate of + the clause. In candidate selection mode and symbol input mode, + this key moves the cursor down by one. + + +^P or Up arrow + These keys substitute the current clause for the previous + candidate of the clause. In candidate selection mode and symbol + input mode, this key moves the cursor up by one. + +^L fixes the converted text, then sends it to the client. + +^M fixes the converted text, then sends it to the client followed by + a newline. + In candidate selection mode or symbol selection mode, it selects a + candidate or symbol, then goes back to normal mode. + + +* Moving Cursor/Changing Current Clause + +^F or Right arrow + These keys move the text cursor forward. If the text is already + converted, the cursor moves forward a clause, otherwise a + character. + In the candidate selection mode or symbol input mode, these keys + move the cursor to the next candidate. + +^B or Left arrow + These keys move the text cursor backward. If the text is already + converted, the cursor moves backward a clause, otherwise a + character. + In the candidate selection mode or symbol input mode, these keys + move the cursor to the previous candidate. + +^A moves the text cursor to the beginning of the text. It moves the + cursor to the left most candidate in candidate selection mode or + symbol input mode. + +^E moves the text cursor to the end of the text. It moves the cursor + to the right most candidate in candidate selection mode or symbol + input mode. + + +* Expanding/Shrinking Clauses + +shift-Right arrow + expands the current clause by one character, then re-converts it. + +shift-Left arrow + shrinks the current clause by one character, then re-converts it. + + +* Katakana <-> Hiragana Conversion + +F1 or mod1-1 + These keys convert the current clause into Katakana. + +F2 or mod1-2 + These keys convert the current large clause into Hiragana. + + +* Miscellany + +shift-Escape + changes the current mode to symbol input mode. Symbols defined in + JIS X0208 (Kanji character set) are displayed in the pop up + window. You can move the cursor and select a symbol with carriage + return. + +F5 or mod1-5 + changes the current mode to JIS code input mode. The text typed + in is interpreted as a hexadecimal number representing a code of a + Kanji defined in JIS X0208, and converted the corresponding Kanji + character. + To exit from the mode, type this key again. + +F6 or mod1-6 + changes the current mode to JIS Kuten code input mode. The text + typed in is interpreted as a decimal number representing a 'ku' + number and a 'ten' number of a Kanji, and converted the + corresponding Kanji character. diff -r 000000000000 -r 92745d501b9a doc/defkeys.wnn --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/doc/defkeys.wnn Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,89 @@ +** kinput2 $B$N%G%U%)%k%H%-!<%P%$%s%G%#%s%0(B ** + +$BJQ49%7%9%F%`$H$7$F!V$+$s$J!W$^$?$O(B SJ3 $B$rA*Br$7$?;~$N%m!<%^;z$+$JJQ49!&JQ(B +$B49%-!<%P%$%s%G%#%s%0$J$I$O!V$+$s$J!W$^$?$O(B SJ3 $B$N%I%-%e%a%s%H$r8fMw2<$5$$!#(B + +$B$3$3$G$O(B Wnn $B$rA*Br$7$?;~$N%G%U%)%k%H$N%-!<%P%$%s%G%#%s%0$K$D$$$F@bL@$7$^(B +$B$9!#(B + + +* $BJQ493+;O(B / $B=*N;(B + +$BJQ493+;O$N%-!<$H$$$&$b$N$OFC$K7h$^$C$F$$$^$;$s!#$3$l$O(B kinput2 $B$G$O$J$/!"(B +$B%"%W%j%1!<%7%g%s$G@_Dj$9$k$b$N$@$+$i$G$9!#$G$9$+$i$3$l$O%"%W%j%1!<%7%g%s$K(B +$B$h$C$F;XDjJ}K!$,0c$$$^$9!#(Bkterm $B$G$"$l$P!"%j%=!<%9%U%!%$%k$K(B + + *vt100*translations: #override CtrlShift_R: begin-conversion() + +$B$J$I$H=q$/$3$H$K$h$C$FJQ99$G$-$^$9!#(B + +$B$3$l$KBP$7$F=*N;$N%-!<$O%U%m%s%H%(%s%I$G@_Dj$7$^$9(B ($B$3$3$,$A$g$C$H5$;}$A0-(B +$B$$$H$3$m$J$N$G$9$,(B)$B!#%G%U%)%k%H$G$O!"(B + + $B%3%s%H%m!<%k(B + $B4A;z(B ($BJQ49(B) + $B%7%U%H(B + $B%9%Z!<%9(B + +$B$G=*N;$9$k$h$&$K$J$C$F$$$^$9!#(B + + +* $BF~NO%b!<%I$N@ZBX$((B + +$BJQ493+;O;~$NF~NO%b!<%I$O%m!<%^;z%b!<%I$K$J$C$F$$$^$9!#$D$^$j!"%m!<%^;z$GF~(B +$BNO$9$k$H$+$J$KJQ49$5$l$^$9!#%b!<%I$rJQ$($k$K$O%?%V%-!<$r2!$7$^$9!#(B + $B%m!<%^;z(B $B"*(B $B%"%9%-!<(B $B"*(B $BA43Q%"%9%-!<(B $B"*(B $B:F$S%m!<%^;z(B +$B$H$$$&$h$&$K%b!<%I$,JQ2=$7$^$9!#%7%U%H%-!<$r2!$7$J$,$i%?%V$r2!$9$H5U=g$KJQ(B +$B2=$7$^$9!#(B($BCm0U(B: $B%?%V%-!<$H(B ^I $B$O0c$$$^$9!#(B^I $B$G$O%b!<%IJQ99$G$-$^$;$s(B) + + +* $B%m!<%^;zF~NO(B + +$B%m!<%^;zF~NO$O0lHLE*$J5-=R$r$[$\C5n(B) $B$G$9!#(B + + +* JIS $B%3!<%I(B / $B6hE@%3!<%IF~NO(B + +F5 ($B$^$?$O%a%?%-!<$r2!$7$J$,$i(B 5 $B$N%-!<(B) $B$r2!$9$H(B JIS $B%3!<%IF~NO%b!<%I$K$J(B +$B$j$^$9!#F1MM$K(B F6 ($B$^$?$O%a%?(B-6) $B$G6hE@%3!<%IF~NO%b!<%I$K$J$j$^$9!#:F$S(B F5 +$B$"$k$$$O(B F6 $B$r2!$9$H85$NF~NO%b!<%I$KLa$j$^$9!#(B + + +* $B5-9fF~NO(B + +$B%7%U%H%-!<$r2!$7$J$,$i%(%9%1!<%W%-!<$r2!$9$H5-9f0lMw$,I=<($5$l$^$9!#(B^F ^B +^N ^P ($B$^$?$O%+!<%=%k%-!<$N(B $B"*"+"-",(B) $B$G%+!<%=%k$,F0$-!"%j%?!<%s%-!<$GA*Br(B +$B$5$l$^$9!#$^$?!"%^%&%9$GA*Br$9$k$3$H$b$G$-$^$9!#(B + + +* $BJQ49(B + +$B4A;z%-!<(B ($BJQ49%-!<(B) $B$^$?$O(B ^J $B$GJQ49$7$^$9!#:FEYJQ49$9$k$H8uJd0lMw%b!<%I$K(B +$B$J$j$^$9!#(B^N $B$H(B ^P $B$G$=$l$>$luBV$KLa$7$^$9!#(B + + +* $B%+!<%=%k!&J8@a0\F0(B + +^F $B$H(B ^B $B$G%+!<%=%k!&%+%l%s%HJ8@a$,0\F0$7$^$9!#8=:_CmL\$7$F$$$kJ8@a$,L$JQ(B +$B49>uBV$J$i%+!<%=%k$,0lJ8;zJ,0\F0$7!"JQ49>uBV$J$iJ8@aC10L$G0\F0$7$^$9!#%+!<(B +$B%=%k%-!<$N"*$H"+$bF1$8F/$-$r$7$^$9!#(B^A $B$H(B ^E $B$O$=$l$>$l:G=i$H:G8e$NJ8@a$K(B +$B0\F0$7$^$9!#(B + + +* $BJ8@a=L$a!&?-$P$7(B + +$B%7%U%H(B-$B"+(B ($B%7%U%H%-!<$r2!$7$J$,$i%+!<%=%k%-!<"+$r2!$9(B) $B$GJ8@a$ND9$5$,=L$_(B +$B$^$9!#F1MM$K%7%U%H(B-$B"*$G?-$S$^$9!#(B + + +* $B3NDj(B + +^L $B$G3NDj$7$^$9!#%j%?!<%s%-!<$r2!$9$H3NDj$7$?8e%-%c%j%C%8%j%?!<%s$,F~$j$^(B +$B$9!#(B + + +* $B%+%?%+%J!&$R$i$,$JJQ49(B + +F1 ($B$^$?$O%a%?(B-1) $B$G%+%l%s%HJ8@a$,%+%?%+%J$K$J$j$^$9!#(BF2 ($B$^$?$O%a%?(B-2) $B$G(B +$B$R$i$,$J$K$J$j$^$9!#(BF3 ($B$^$?$O%a%?(B-3) $B$GH>3Q$K$J$j!"(BF4 ($B$^$?$O%a%?(B-4) $B$GA4(B +$B3Q$K$J$j$^$9!#(B diff -r 000000000000 -r 92745d501b9a doc/problems --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/doc/problems Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,30 @@ +** $B8=:_$o$+$C$F$$$kLdBjE@(B ** + +* $B8uJd0lMwI=<($N%&%#%s%I%&$,>C$($:$K;D$k$3$H$,$"$k(B + $B$3$l$O%&%#%s%I%&%^%M!<%8%c$,(B twm $B$N;~$@$15/$3$j!"(Bmwm $B$J$I$G$O5/$-(B + $B$J$$$h$&$J$N$G(B twm $B$NLdBj$@$H;W$o$l$^$9!#$b$7!"(Btwm $B0J30$N%&%#%s%I(B + $B%&%^%M!<%8%c$r;H$C$F$$$F$3$N>I>u$,=P$?;~$K$OLB$o$:%l%]!<%H$rAw$C$F(B + $B2<$5$$!#2sHrJ}K!$H$7$F$O!"8uJd0lMwI=<($r=P$7$?;~$K$O$f$C$/$jA`:n$9(B + $B$k!"$H$$$&$N$,M-8z$@$H;W$$$^$9!#(B + +* $BJL%&%#%s%I%&$K$h$kJQ49$G!"3NDj$9$k$H(B core dump $B$9$k$3$H$,$"$k$i$7$$(B + $B$3$l$K$D$$$F$O>\:Y$,0l@ZITL@$G$7$+$b$3$A$i$G$O5/$-$J$$$N$G:#$N$H$3(B + $B$m2?$b$G$-$J$$>uBV$G$9!#$b$7$3$N8=>]$K$V$AEv$?$C$?J}$O$<$R%l%]!<%H(B + $B$r$*4j$$$7$^$9!#(B + +* $B$=$N>lJQ49$G;H$o$l$k%U%)%s%H$,%/%i%$%"%s%H$N;H$C$F$$$k%U%)%s%H$H0[$J$k(B + $B%/%i%$%"%s%H$G$A$c$s$H%U%)%s%H>pJs$rAw$C$F$$$k$N$K0[$J$k%U%)%s%H(B + ($BB?J,(B JpWcharDisplay $B%*%V%8%'%/%H$K@_Dj$5$l$?%G%U%)%k%H%U%)%s%H(B)$B$,(B + $B;H$o$l$k$3$H$,$"$j$^$9!#$3$l$OB?J,$=$N%U%)%s%H$,(B XLFD $B$K=>$C$F$$$J(B + $B$$$?$a$H;W$o$l$^$9!#(Bkinput2 $B$O;XDj$5$l$?%U%)%s%H$N%W%m%Q%F%#$rD4$Y(B + $B$F%-%c%i%/%?%;%C%H$rH=CG$7!";HMQ$9$k$h$&$K$J$C$F$$$k$N$G$9$,!"(BXLFD + $B$K=>$C$F$$$J$$%U%)%s%H$@$H$3$N%-%c%i%/%?%;%C%H$N>pJs$,F~$C$F$*$i$:!"(B + kinput2 $B$,$I$l$,4A;z$N%U%)%s%H$G$I$l$,%"%9%-!<$N%U%)%s%H$+$o$+$i$J(B + $B$$$?$a$G$9!#(B + $B$3$l0J30$N>l9g$K!"$=$N>lJQ49$G;H$o$l$k%U%)%s%H$,%/%i%$%"%s%H$N;XDj$H(B + $B0[$J$k$H$$$&8=>]$,5/$-$^$7$?$i!"%l%]!<%H$r$*4j$$$7$^$9!#(B + +* $B$=$NB>(B + XIMP $B%W%m%H%3%k$N%5%]!<%H$O$3$N%j%j!<%9$ND>A0$K:n$C$?$b$N$J$N$G$^(B + $B$@%P%0$,$"$k$+$b$7$l$^$;$s!#%P%0$G$O$J$$$+$H$$$&8=>]$,=P$^$7$?$i%l(B + $B%]!<%H$r$*4j$$$7$^$9!#(B diff -r 000000000000 -r 92745d501b9a doc/protocol --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/doc/protocol Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,536 @@ +$Id: protocol,v 1.2 1998/07/21 08:51:24 ishisone Exp $ + +** kinput2 $B%W%m%H%3%k(B ** + + +*$B$O$8$a$K(B + + kinput2 $B%W%m%H%3%k$O%*%j%8%J%k$N(B kinput $B$,;HMQ$7$F$$$?%W%m%H%3%k(B (kinput +$B%W%m%H%3%k$H8F$V(B) $B$KBP$7$F>e0L8_49@-$r;}$D!#(B + + kinput $B%W%m%H%3%k$G$OJQ493+;O$N%j%/%(%9%H;~$K%*%W%7%g%s$H$7$F%W%m%Q%F%#(B +$BL>$r;XDj$G$-$k$h$&$K$J$C$F$$$?!#$3$l$O>-Mh$N3HD%$N$?$a$KMQ0U$5$l$?$b$N$G$"(B +$B$j!"%W%m%H%3%k%9%Z%C%/$G$O$3$3$K(B None $B$r;XDj$9$k$h$&$K=q$+$l$F$$$?$,!">-Mh(B +$B$O$3$3$K$"$k%G!<%?$,F~$C$?%W%m%Q%F%#L>$r;XDj$7!"%/%i%$%"%s%H$+$iJQ49%5!<%P(B +$B$KBP$7$FJQ49$NB0@-$J$I$r;XDj$9$k$3$H$rA@$C$?$b$N$G$"$C$?!#(B + + kinput2 $B%W%m%H%3%k$G$O$3$N3HD%%G!<%?$N7A<0$rDj5A$7!"$+$D(B kinput $B%W%m%H%3(B +$B%k$re$,$k$H!"JQ49%5!<%P$HF1$8%G%#%9%W%l%$$r6&M-$9$kB>$N%/%i(B +$B%$%"%s%H$KBP$7$F!"JQ49%5!<%S%9$rDs6!$9$k$3$H$r@k8@$9$k!#$3$l$K$O%;%l%/%7%g(B +$B%s$N%a%+%K%:%`$r;HMQ$9$k!#$D$^$j!"JQ49%5!<%P$OF~NO8@8lKh$K7h$a$i$l$?$"$k%;(B +$B%l%/%7%g%s$N%*!<%J!<$H$J$k!#0l$D$N%G%#%9%W%l%$$GF1$8%;%l%/%7%g%sL>$KBP$7$F(B +$BJ#?t$N%*!<%J!<$OB8:_$G$-$J$$$?$a!"JQ49%5!<%P$O3F8@8l$K$D$$$F0l$D$:$D$7$+B8(B +$B:_$G$-$J$$!#(B + + $BJQ49%5!<%P$O%;%l%/%7%g%s$N%*!<%J!<$H$J$k$HF1;~$K!"%5%]!<%H$9$kF~NO%9%?%$(B +$B%k$J$I$N>pJs$r%*!<%J!<%&%#%s%I%&$N%W%m%Q%F%#$K3JG<$9$k!#(B + + $B$"$k8@8l$NJQ49%5!<%S%9$r$9$kF~NO%9%?%$%k$d!";HMQ$9(B +$B$k%U%)%s%H$J$I$5$^$6$^$JB0@-$,=q$+$l$?%W%m%Q%F%#L>$,4^$^$l$F$$$k!#JQ49%5!<(B +$B%P$O!"$3$N%$%Y%s%H$rl9g$K$O(B ClientMessage $B%$%Y%s%H$rMxMQ$7$F$=$l$rJQ49%5!<%P$KEA$($k$3$H$,(B +$B$G$-$k!#(B + + $B0l$DLdBj$H$J$k$N$OJQ49%5!<%P$NF~NO%$%Y%s%H$Ne$K(B InputOnly $B%&%#%s%I%&$r:n$j!"$=$N%&%#%s%I%&$GF~NO%$%Y%s%H$r(B +$B!VEp$`!WJ}K!$G$"$k!#%/%i%$%"%s%H$K$H$C$F$O$3$l$,0lHV=hM}$,3Z(B ($B<+J,$G$O2?$b(B +$B$7$J$/$F$b$h$$(B) $B$,!"%U%)!<%+%9$N4X78$G!"JQ49%5!<%P$K%-!<%$%Y%s%H$,Mh$J$$$3(B +$B$H$,$"$k!#(B + + $Bl9g%$%Y%s%H$OJQ49%5!<%P(B +$B$H%/%i%$%"%s%H$NN>J}$KAw$i$l$k$N$G!"$3$NJ}<0$rA*Br$7$?%/%i%$%"%s%H$O!"JQ49(B +$BCf$OF~NO$5$l$?%$%Y%s%H$rL5;k$7$J$/$F$O$J$i$J$$!#(B + + 3$BHVL\$O2?$b$7$J$$!"$H$$$&J}K!$G!"$D$^$j$3$l$OJQ49Cf$O%/%i%$%"%s%H$O%U%)!<(B +$B%+%9%&%#%s%I%&$KMh$?%-!<%$%Y%s%H$r$9$Y$FJQ49%5!<%P$K(B SendEvent $B$GAw$k!"$H(B +$B$$$&$3$H$G$"$k!#(B + + $BJQ49%5!<%P$OJQ49$5$l$?J8;zNs$rE,59%/%i%$%"%s%H$KAw$k$3$H$,$G$-$k!#$3$l$O(B +$B%/%i%$%"%s%H$N%&%#%s%I%&$N%W%m%Q%F%#$KJ8;zNs$r=q$-9~$`$3$H$Gl9g$bJQ49%5!<%P$OJQ49$,=*N;$7(B +$B$?$3$H$r%/%i%$%"%s%H$KCN$i$;$k!#(B + + +* $B%W%m%H%3%k>\@b(B + + $B35MW$K0zB3$-$3$3$G$O(B kinput2 $B%W%m%H%3%k$K$D$$$F(B kinput $B%W%m%H%3%k$HHf$Y(B +$B$J$,$i2r@b$7$F$$$/!#(B + +* $BJQ49%5!<%P%9%?!<%H%"%C%W(B + +** $B%;%l%/%7%g%s(B + + $BJQ49%5!<%P$O!"%/%i%$%"%s%H$KBP$7$FJQ49%5!<%S%9$rDs6!$9$k$3$H$r<($9$?$a$K(B +$B%;%l%/%7%g%s%*!<%J!<$H$J$k!#$3$l$O(B kinput $B%W%m%H%3%k$HA4$/F1$8$@$,!"%;%l%/(B +$B%7%g%s%"%H%`$H$7$F$O(B "_CONVERSION" $B$G$O$J$/!"@5<0$KEPO?$5$l$?%;(B +$B%l%/%7%g%sL>$G$"$k(B "__CONVERSION" ($BF|K\8l$G$"$l$P(B +"_JAPANESE_CONVERSION") $B$r;HMQ$9$k$3$H$K$9$k!#$?$@$7%P%C%/%o!<%I%3%s%Q%A%S(B +$B%j%F%#$N$?$a!"%*%j%8%J%k(B kinput $B$,;HMQ$7$F$$$?%;%l%/%7%g%sL>$r;H$&$3$H$bG'(B +$B$a$i$l$k!#(B + + $BJQ49%5!<%P$O(B SetSelectionOwner $B$rMxMQ$7$F%;%l%/%7%g%s%*!<%J!<$K$J$k!#(B + + SetSelectionOwner + selection: "__CONVERSION" + owner: $BJQ49%5!<%P$N%&%#%s%I%&(BID + time: timestamp $B$^$?$O(B CurrentTime + +$B%/%i%$%"%s%H$O(B GetSelectionOwner $B$K$h$j!"JQ49%5!<%P$NB8:_$H%&%#%s%I%&(BID $B$r(B +$BCN$k$3$H$,$G$-$k!#(B + + GetSelectionOwner + selection: "__CONVERSION" + => + owner: $BJQ49%5!<%P$N%&%#%s%I%&(BID + + +*** SelectionClear $B%$%Y%s%H$N07$$$K$D$$$F(B + + $B$b$7JQ49%5!<%P$,%;%l%/%7%g%s%*!<%J!<$K$J$C$?8e(B SelectionClear $B%$%Y%s%H$r(B +$BpJs$,=q$+$l$?%W%m%Q%F%#(B +$B$rCV$/$3$H$K$9$k!#(B + + ChangeProperty + window: $B%;%l%/%7%g%s$N%*!<%J!<%&%#%s%I%&(B + property: Atom "_CONVERSION_PROFILE" + type: Atom "_CONVERSION_ATTRIBUTE_TYPE" + format: 32 + mode: Replace + data: $B8e=R(B + + $B$3$l$rJQ49%W%m%U%!%$%k$H8F$V$3$H$K$9$k!#JQ49%W%m%U%!%$%k$,B8:_$9$k$+$I$&(B +$B$+$G!"%/%i%$%"%s%H$OJQ49%5!<%P$,(B kinput2 $B%W%m%H%3%k$r%5%]!<%H$7$F$$$k$N$+!"(B +$B$=$l$H$b(B kinput $B$N%W%m%H%3%k$7$+%5%]!<%H$7$F$$$J$$$N$+$rCN$k$3$H$,$G$-$k!#(B + + $B%/%i%$%"%s%H$O(B GetProperty $B$r;HMQ$7$F$3$N%G!<%?$rFI$_=P$9$3$H$,$G$-$k!#(B + + GetProperty + window: $B%;%l%/%7%g%s$N%*!<%J!<%&%#%s%I%&(B + property: Atom "_CONVERSION_PROFILE" + type: Atom "_CONVERSION_ATTRIBUTE_TYPE" + format: 32 + delete: False + +$BJQ49%W%m%U%!%$%k$N%U%)!<%^%C%H$,(B 32 $B$G$"$k$3$H$+$i$b$o$+$k$h$&$K!"$3$N%W%m(B +$B%Q%F%#$NFbMF$O(B 32bit $BCM$NG[Ns$G$"$k!#JQ49%W%m%U%!%$%k$K4^$^$l$k3F!9$N>pJs(B +$B$O!">pJs$Ne0L(B 16bit $B$,$=$N>pJs$NpJs$O$r<($9!#%G!<%?$K$O(B + $B%W%m%H%3%k$N%P!<%8%g%sL>$=$N$b$N$G$O$J$/!"$=$l$r%"%H%`2=$7$?CM$,F~(B + $B$k!#$3$N%I%-%e%a%s%H$O(B "PROTOCOL-2.0" $B$H$$$&%P!<%8%g%s$K$D$$$F5-=R(B + $B$7$F$$$k!#(B + + + Supported Styles (code = 2, length = 1) + $BJQ49%5!<%P$,%5%]!<%H$7$F$$$kF~NO%9%?%$%k$r<($9!#Dj5A$5$l$F$$$kF~NO(B + $B%9%?%$%k$O$r%"%H%`2=$7$?CM$,F~$k!#J#?t$N3HD%$rF~$l$k$3$H$,$G$-$k!#(B + + + Extension Data (code = 4, length = N) + $B3HD%FCM-$N%W%m%U%!%$%k%G!<%?$r<($9!#=>$C$F$3$3$G%G!<%?$NFbMF$K$D$$(B + $B$F5-=R$9$k$3$H$O$G$-$J$$$,!"$?$@0l$D7h$^$C$F$$$k$3$H$O%G!<%?$N@hF,(B + $B$O$=$N3HD%L>$r%"%H%`2=$7$?CM$G$J$1$l$P$J$i$J$$$H$$$&$3$H$@$1$G$"$k!#(B + $B;D$j$N%G!<%?$NFbMF$O40A4$K3F3HD%$N<+M3$G$"$j!"$3$3$G$O5,Dj$7$J$$!#(B + + $B%/%i%$%"%s%HB&$NL5MQ$N:.Mp$rKI$0$?$a!"(BProtocol Version $B$H(B Supported +Styles$B$N9`L\$OI,$:$J$1$l$P$J$i$J$$!#$^$?!"(BExtension Data $B0J30$O%W%m%U%!%$(B +$B%k%G!<%?$NCf$KF1$8%3!<%I$N%G!<%?$,J#?t$"$C$F$O$J$i$J$$!#(B + + +* $BJQ49$N%j%/%(%9%H(B + + $BJQ49$N%j%/%(%9%H$NJ}K!$O%*%j%8%J%k$N%W%m%H%3%k$HF1$8$G$"$k!#$D$^$j!"%/%i(B +$B%$%"%s%H$O$^$:(B XGetSelectionOwner() $B$r;HMQ$7$FJQ49%5!<%P$rC5$9!#8+$D$+$l$P(B +$B%*!<%J!<%&%#%s%I%&$KBP$7$FJQ493+;O$r%j%/%(%9%H$9$k%$%Y%s%H$rAw$k!#(B + + SendEvent + destination: $B%;%l%/%7%g%s%*!<%J!<%&%#%s%I%&(B + propergate: False + event-mask: NoEventMask + event: ClientMessage + window: $B%;%l%/%7%g%s%*!<%J!<(B + type: Atom "CONVERSION_REQUEST" + format: 32 + data: + l[0]: $B%;%l%/%7%g%s%"%H%`(B + l[1]: $B%/%i%$%"%s%H%&%#%s%I%&(BID + l[2]: $BJQ49%F%-%9%H$N%(%s%3!<%G%#%s%0%"%H%`(B + l[3]: $BJQ49%F%-%9%HMQ%W%m%Q%F%#(B or None + l[4]: $B%W%m%Q%F%#L>$+(B None + + data.l[0] $B$O%;%l%/%7%g%s%"%H%`$rF~$l$k!#(Bdata.l[1] $B$O%/%i%$%"%s%H%&%#%s%I(B +$B%&(BID $B$G$"$k!#%/%i%$%"%s%H%&%#%s%I%&$OJQ49%5!<%P$,3FJQ49%;%C%7%g%s$r6hJL$9(B +$B$k$N$K;H$o$l$k!#$3$l$OF10l$N%/%i%$%"%s%H%&%#%s%I%&$GJ#?t$NJQ49$rF1;~$K9T$J(B +$B$&$3$H$,$G$-$J$$$3$H$r0UL#$9$k!#(B + + data.l[2] $B$K$O!"JQ497k2LJ8;zNs$N%(%s%3!<%G%#%s%0$H$7$F%/%i%$%"%s%H$N4uK>(B +$B$9$k%(%s%3!<%G%#%s%0$N%"%H%`$rF~$l$k!#Nc$($P(B COMPOUND_TEXT $B$G$"$k!#JQ49J8(B +$B;zNs$O%W%m%Q%F%#$G%/%i%$%"%s%H$KAw$i$l$k$N$G!"$3$N%(%s%3!<%G%#%s%0$H$$$&$N(B +$B$O$7$?>l9g$K$O!"$=$N%(%s%3!<%G%#%s%0$GJ8;zNs$,JV$5$l$k$3$H$,J]>Z$5(B +$B$l$k!#(B + + data.l[3] $B$K$OJQ497k2LJ8;zNs$rF~$l$k%W%m%Q%F%#L>$r;XDj$9$k!#JQ497k2L$O(B +data.l[1] $B$G;XDj$7$?%&%#%s%I%&$N!"(Bdata.l[3] $B$G;XDj$5$l$k%W%m%Q%F%#$KAw$i$l(B +$B$k!#$b$7%W%m%Q%F%#L>$H$7$F(B None $B$r;XDj$7$?>l9g!"%W%m%Q%F%#L>$OJQ49%5!<%P$K(B +$B$h$C$F7hDj$5$l$k!#(B + + kinput $B%W%m%H%3%k$H0[$J$kE@$O(B data.l[4] $B$G$"$k!#%*%j%8%J%k$G$O$3$3$K$O(B +None $B$r;XDj$9$k$3$H$K$J$C$F$$$?!#JQ49%5!<%P$O!"$b$7$3$3$,(B None $B$G$"$l$P%/(B +$B%i%$%"%s%H$,(B kinput $B%W%m%H%3%k$r;HMQ$9$k$b$N$H$7$F07$&!#(BNone $B$G$J$1$l$P!"(B +$B$3$l$OJQ49B0@-$N$O$$$C$F$$$k%W%m%Q%F%#L>$G$"$k!#$3$l$O%/%i%$%"%s%H%&%#%s%I(B +$B%&(B (data.l[1] $B$K;XDj$7$?$b$N(B) $B$N%W%m%Q%F%#$G!"%?%$%W$OJQ49%W%m%U%!%$%k$HF1(B +$B$8$/(B "_CONVERSION_ATTRIBUTE_TYPE" $B$G$"$k!#=>$C$F$3$NJQ49B0@-%W%m%Q%F%#$N9=(B +$BB$$bJQ49%W%m%U%!%$%k%W%m%Q%F%#$HF1$8$G!"(B1 $B%o!<%I$N%X%C%@$H$=$l$KB3$/(B 0 $B%o!<(B +$B%I0J>e$N%G!<%?$H$+$i$J$k!#JQ49%5!<%P$O(B GetProperty $B$rMQ$$$F$3$NJQ49B0@-$r(B +$BFI$_=P$9!#(B + + GetProperty + window: $B%/%i%$%"%s%H%&%#%s%I%&(B + property: "CONVERSION_REQUEST" $B$G;XDj$5$l$?%W%m%Q%F%#(B + type: Atom "_CONVERSION_ATTRIBUTE_TYPE" + format: 32 + delete: False + + +* $BJQ49B0@-(B + + $BJQ49%W%m%U%!%$%k$HF1$8$/!"JQ49B0@-%W%m%Q%F%#$b3F!9$N>pJs$O!">pJs$Ne0L(B 16bit $B$,B0@-%3!<%I$rI=$7!"2<0L(B 16bit $B$OB3(B +$B$/%G!<%?$N%o!<%I?t(B (32bit $BC10L(B) $B$rI=$9!#(B + + $BB0@-%3!<%I$H$7$F(B 0 $B$+$i(B 65535 $B$^$G$NCM$,;HMQ$G$-$k$,!"$3$l$r$,F~$C$F$*$j!"$=$N%W%m(B + $B%Q%F%#$K=>$C$FB0@-$r@_Dj$9$k!#;XDj$7$?%W%m%Q%F%#$O%/%i%$%"%s%H%&%#(B + $B%s%I%&$N%W%m%Q%F%#$G$J$1$l$P$J$i$J$$!#(BCONVERSION_ATTRIBUTE$B%$%Y%s%H(B + ($B8e=R(B) $B$GJ#?t$NB0@-%G!<%?$r@_Dj$7$?$$;~$d!"%$%Y%s%H$KB0@-%G!<%?$,(B + $BF~$j@Z$i$J$$;~$K;HMQ$9$k!#(B + + + Focus Window (code = 2, length = 1) + $B%U%)!<%+%9%&%#%s%I%&$r;XDj$9$k!#%G!<%?$K$O%U%)!<%+%9%&%#%s%I%&$N%&%#(B + $B%s%I%&(BID $B$,F~$k!#$3$NB0@-$,;XDj$5$l$J$+$C$?;~$O%/%i%$%"%s%H%&%#%s(B + $B%I%&$,%U%)!<%+%9%&%#%s%I%&$H$J$k!#(B + + + Spot Location (code = 3, length = 1) + $B%9%]%C%H%m%1!<%7%g%s$r;XDj$9$k!#%Y!<%9%i%$%s$N3+;OE@$G;XDj$9$k!#%G!<(B + $B%?$N>e0L(B 16bit $B$,(B x $B:BI8!"2<0L(B 16bit $B$,(B y $B:BI8$G$"$k!#$3$NB0@-$O(B + over-the-spot style $B$NJQ49$N;~$7$+0UL#$r;}$?$J$$!#(B + + + Client Area (code = 4, length = 2) + $BJQ49%F%-%9%HI=<(NN0h$r;XDj$9$k!#%G!<%?$O(B 32bit 2$B%o!<%I$+$i$J$j!":G(B + $B=i$N%o!<%I$N>e0L(B 16bit / $B2<0L(B 16bit $B$,NN0h$N:8>e$N(B x / y $B:BI8!"e0L(B 16bit / $B2<0L(B 16bit $B$,NN0h$NI}$H9b$5$rI=$9!#%G%U%)%k(B + $B%H$O%U%)!<%+%9%&%#%s%I%&A4BN$G$"$k!#(B + + + Status Area (code = 5, length = 2) + $B%9%F!<%?%9I=<(NN0h$r;XDj$9$k!#%G!<%?$N%U%)!<%^%C%H$OA0$HF1$8!#(B + + + Colormap (code = 6, length = 1) + $B%+%i!<%^%C%W$r;XDj$9$k!#%G!<%?$K$O%+%i!<%^%C%W(BID $B$,F~$k!#%G%U%)%k(B + $B%H$O%9%/%j!<%s$N%G%U%)%k%H%+%i!<%^%C%W$G$"$k!#(B + + + Color (code = 7, length = 2) + $B%U%)%"%0%i%&%s%I$H%P%C%/%0%i%&%s%I$N%T%/%;%kCM$r;XDj$9$k!#%G!<%?$O(B + 2$B%o!<%I$+$i$J$j!":G=i$N%o!<%I$,%U%)%"%0%i%&%s%I$N%T%/%;%kCM!"l9g!"(B + $BJQ49%5!<%P$OE,Ev$JCM$r;HMQ$9$k!#(B + + + Background Pixmap (code = 8, length = 1) + $B%P%C%/%0%i%&%s%I$N(B Pixmap $B$r;XDj$9$k!#%G!<%?$K$O(B Pixmap ID $B$,F~$k!#(B + + + Line Spacing (code = 9, length = 1) + $B9T4V$r;XDj$9$k!#%Y!<%9%i%$%s4V$N5wN%$G;XDj$9$k!#;XDj$5$l$J$+$C$?>l(B + $B9g!"JQ49%5!<%P$O$r%"%H%`2=$7$?$b$N$K$J$C$F$$$k(B) $B$N%j%9(B + $B%H$r;XDj$9$k!#%j%9%HCf$N=gHV$OG$0U$G$"$k!#JQ49%5!<%P$OM?$($i$l$?%U%)(B + $B%s%H$N%W%m%Q%F%#$+$i%-%c%i%/%?%;%C%H$rD4$Y!"I,MW$J$b$N$rMxMQ$9$k$+(B + $B$i$G$"$k!#;XDj$5$l$J$+$C$?>l9g!"JQ49%5!<%P$OE,Ev$J%U%)%s%H$r;HMQ$9(B + $B$k!#(B + + + Cursor (code = 11, length = 1) + $B%+!<%=%k$r;XDj$9$k!#%G!<%?$K$O%+!<%=%k(B ID $B$,F~$k!#;XDj$5$l$J$+$C$?(B + $B>l9g!"JQ49%5!<%P$OE,Ev$J%+!<%=%k$r;HMQ$9$k!#(B + +$B0J9_$OJQ493+;O;~$K$7$+;XDj$G$-$J$$B0@-$G$"$k!#(B + + + Input Style (code = 128, length = 1) + $BF~NOJ}K!$r;XDj$9$k!#CM$O(B + root window style: 1 + off-the-spot style: 2 + over-the-spot style: 4 + $B$N$I$l$+$G$J$1$l$P$J$i$:!"JQ49%W%m%U%!%$%k$N(B Supported Styles $B$KF~$C(B + $B$F$$$k%9%?%$%k$G$J$1$l$P$J$i$J$$!#$3$NB0@-$,;XDj$5$l$J$+$C$?;~$N%G(B + $B%U%)%k%H$O(B Root Window Style $B$G$"$k!#(B + + + Event Capture Method (code = 129, length = 1) + $B%/%i%$%"%s%H%&%#%s%I%&$+$i$N%$%Y%s%H$N$l%G!<%?$K;XDj$9$kCM$O(B + $B$J$K$b$7$J$$(B: 0 + InputOnly $B%&%#%s%I%&$K$h$kJ}K!(B: 1 + $B%U%)!<%+%9%&%#%s%I%&$r%;%l%/%H(B: 2 + $B$G$"$k!#%G%U%)%k%H$O(B InputOnly $B%&%#%s%I%&$K$h$kJ}K!$G$"$k!#(B + + + Use Extension (code = 130, length = N) + $B$3$NB0@-@_Dj$G;HMQ$5$l$k3HD%$r;XDj$9$k!#$3$3$G;XDj$9$k3HD%$O%5!<%P(B + $B$,%5%]!<%H$7$F$$$k$b$N!"$D$^$j%W%m%U%!%$%k%G!<%?Cf$N(BSupported + Extensions $B$K=q$+$l$?3HD%$G$J$1$l$P$J$i$J$$!#$^$?!"$3$N@_Dj$O;HMQ(B + $B$9$k3HD%B0@-%3!<%I$,B0@-%G!<%?Cf$K8=$l$kA0$K$J$1$l$P$J$i$J$$!#(B + + +* $BJQ493+;O$NDLCN(B + + $BJQ49$N%j%/%(%9%H$rl9g$K$O$=$l$,$=$N$^$^F~$j!"(B +None $B$r;XDj$7$?>l9g$K$OJQ49%5!<%P$OE,Ev$J%W%m%Q%F%#$rA*$s$G$=$l$rF~$l$k!#(B + + $B$b$7!"$J$s$i$+$NM}M3$GJQ49%5!<%P$,$=$N%/%i%$%"%s%H$N$?$a$NJQ49%5!<%S%9$r(B +$BDs6!$G$-$J$$>l9g$K$O(B data.l[2] $B$K$O(B None $B$rF~$l$k!#(B + + data.l[3] $B$OC$7$?$jFbMF$rJQ99$7$?$j$7$F$h$$!#(B + + +* $BJQ49B0@-$NJQ99(B + + $BJQ493+;O$,DLCN$5$l$?8e!"JQ49$,=*N;$9$k$^$G$N4V$KJQ49B0@-$NJQ2=$,5/$3$C$?(B +$B>l9g!"%/%i%$%"%s%H$O$=$l$rJQ49%5!<%P$KEA$($k$3$H$,$G$-$k!#(B + + $B%/%i%$%"%s%H$OJQ49%5!<%P$K(B ClientMessage $B%$%Y%s%H$rAw$k$3$H$GJQ49B0@-$N(B +$BJQ2=$rDLCN$9$k!#(B + + SendEvent + destination: $B%;%l%/%7%g%s%*!<%J!<%&%#%s%I%&(B + propergate: False + event-mask: NoEventMask + event: ClientMessage + window: $B%;%l%/%7%g%s%*!<%J!<%&%#%s%I%&(B + type: Atom "CONVERSION_ATTRIBUTE_NOTIFY" + format: 32 + data: + l[0]: $B%;%l%/%7%g%s%"%H%`(B + l[1]: $B%/%i%$%"%s%H%&%#%s%I%&(BID + l[2]-l[4]: $BB0@-%G!<%?(B + + data.l[2] $B$+$i(B data.l[4] $B$KJQ99$5$l$?B0@-%G!<%?$rF~$l$k!#B0@-%G!<%?$N7A(B +$B<0$OJQ49B0@-$N%W%m%Q%F%#$N7A<0$HA4$/F1$8$G$"$k!#$?$@$78+$l$P$o$+$k$h$&$K%$(B +$B%Y%s%H$KF~$l$i$l$kB0@-%G!<%?$NBg$-$5$O:GBg(B3$B%o!<%I$G$"$k!#=>$C$FJQ99$5$l$?(B +$BB0@-%G!<%?$,$3$l$h$jBg$-$$$H$+!"JQ99$5$l$?B0@-%G!<%?$,J#?t$"$k$H$-(B ($B$3$N>l(B +$B9g$K$O$3$N%$%Y%s%H$rJ#?t2sAw$C$F$b$$$$$N$@$,(B) $B$K$OB0@-%G!<%?$O%W%m%Q%F%#$K(B +$BF~$l!"(BIndirect Attribute $B$N5!G=$r;H$C$F$=$N%W%m%Q%F%#$r;XDj$9$l$P$h$$!#(B + + +* $BJQ49J8;zNs$NAw?.(B + + $B3NDj$5$l$?JQ49J8;zNs$O!"?o;~JQ49%5!<%P$+$i%/%i%$%"%s%H$K%W%m%Q%F%#$r;HMQ(B +$B$7$FAw$i$l$k!#(B + + ChangeProperty + window: $B%/%i%$%"%s%H%&%#%s%I%&(B + property: "CONVERSION_NOTIFY" $B$G;XDj$7$?%W%m%Q%F%#(B + type: "CONVERSION_NOTIFY" $B$G;XDj$7$?%(%s%3!<%G%#%s%0(B + format: $B%(%s%3!<%G%#%s%0$K$h$k(B + mode: Append + data: $BJQ49J8;zNs(B + + $B%/%i%$%"%s%H$O$"$i$+$8$a%/%i%$%"%s%H%&%#%s%I%&$N(B PropertyNotify $B%$%Y%s%H(B +$B$r%;%l%/%H$7$F$*$-!"%W%m%Q%F%#$,JQ99$5$l$?$iJQ497k2L$rJ}$r4^$s$G$$$F$b$h$$!#(B + + $B$I$A$i$N%?%$%W$N3HD%$r$9$k$K$7$F$b$^$:$=$N3HD%$KL>A0$r$D$1$J$/$F$O$J$i$J(B +$B$$!#$=$7$F$=$N3HD%$r$rF~$l!"%/%i%$%"%s%H$KBP$7$F$=$N3HD%$rl9g!"?7$?$K3HD%B0@-%3!<%I$r7h$a$J$/$F$O$J$i$J$$!#$3$N%3!<%I(B +$B$K$D$$$F$O$=$N%3!<%I$NHO0O$,(B 256 $B$+$i(B 65535 $B$G$J$1$l$P$J$i$J$$$H$$$&$3$H$r(B +$B=|$-!"$3$N%W%m%H%3%k$G$O0l@Z5,Dj$7$J$$!#3HD%%3!<%I$O$3$NHO0O$G>!l9g!"J#?t$N3HD%$G;H$&%3!<%I$,=EJ#$9$k$3$H$,9M$((B +$B$i$l$k!#$7$+$7$3$N;vBV$rHr$1$kl9g$K$O$=$NFs$D$N3HD%$OF1;~$K;H$($J$$$@$1$N(B +$B$3$H$G$"$k!#(B + + $B$3$N$h$&$JIT9,$J;vBV$rHr$1$k$?$a$K!"3HD%$r$7$?$i$=$N3HD%L>$H$=$N3HD%$N>\(B +$B:Y$rH/I=$9$k$N$,$h$$$@$m$&$H;W$o$l$k$,!"$I$3$K$I$&H/I=$9$k$+$J$I$N>\:Y$OL@(B +$B$i$+$K%W%m%H%3%k$G5,Dj$9$Y$-$b$N$G$O$J$$$N$G$3$3$K$O=q$+$J$$!#$@$$$?$$$3$N(B +$B%W%m%H%3%k$r3HD%$7$h$&$J$I$H$$$&$b$N$O$[$H$s$I$$$J$$$G$"$m$&$,!#(B diff -r 000000000000 -r 92745d501b9a doc/resources --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/doc/resources Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,355 @@ +** kinput2 $B$G;H$o$l$k(B widget $B$NR2p$7$^$9!#$?(B +$B$@$7%f!<%6$,%j%=!<%9%U%!%$%k$G;XDj$G$-$J$$(B / $B;XDj$7$F$b0UL#$,$J$$$b$N$K$D$$(B +$B$F$O>JN,$7$^$7$?!#%j%=!<%9%U%!%$%k$r=q$/;~$K$O%*%s%i%$%s%^%K%e%"%k$K5-:\$5$l(B +$B$F$$$k(B widget $B%D%j!<$b;29M$K$7$F2<$5$$!#(B + +$B$J$*!"$3$3$K5-=R$5$l$F$$$k%G%U%)%k%HCM$O(B widget $B$N%G%U%)%k%H$G$9!#%"%W%j%1!<(B +$B%7%g%s%j%=!<%9%U%!%$%k(B Kinput $B$K$h$C$FJQ99$5$l$F$$$k$b$N$b$"$k$N$GCm0U$7$F2<(B +$B$5$$!#(B + + +* CcWnn +$BJQ49%*%V%8%'%/%H(B CcWnn $B$N%j%=!<%9$K$O$r;XDj$7$^$9!#$3$N%j%=!<%9(B + $B$,;XDj$5$l$F$$$J$1$l$P4D6-JQ?t(B JSERVER $B$NCM$,MQ$$$i$l$^$9!#(B + ++ jserver2nd ($B%/%i%9(B Jserver) + $B%;%+%s%@%jJQ49%5!<%P$N%[%9%HL>$r;XDj$7$^$9!#%;%+%s%@%j%5!<%P$O%W%i%$(B + $B%^%j%5!<%P$H@\B3$G$-$J$+$C$?;~!"$*$h$SJQ49$NESCf$G%W%i%$%^%j%5!<%P$,(B + $B;`$s$G$7$^$C$?;~$K;H$o$l$^$9!#$3$N%j%=!<%9$,;XDj$5$l$F$$$J$1$l$P%;%+(B + $B%s%@%j%5!<%P$O;H$o$l$^$;$s!#(B + ++ wnnEnvname ($B%/%i%9(B WnnEnvname) + $BJQ49$K;HMQ$9$k4D6-L>$r;XDj$7$^$9!#%G%U%)%k%H$G$O%f!<%6L>$r4D6-L>$H$7(B + $B$F;HMQ$7$^$9$N$GFC$K;XDj$9$kI,MW$O$"$j$^$;$s$,!"$_$s$J$G0l$D$N4D6-$r(B + $B6&M-$7$?$j$7$?$$;~$K;H$($^$9!#(B + ++ wnnEnvrc ($B%/%i%9(B WnnEnvrc) + $BJQ494D6-@_Dj%U%!%$%k$r;XDj$7$^$9!#%G%U%)%k%H$G$O4D6-JQ?t(B WNNENVRC $B$,(B + $B@_Dj$5$l$F$$$l$P$=$l$r;H$$!"$=$&$G$J$1$l$P%G%U%)%k%H(B (Wnn $B$N%3%s%U%$(B + $B%.%e%l!<%7%g%s$K$h$C$F0[$J$j$^$9$,IaDL$O(B /usr/local/lib/wnn/wnnenvrc) + $B$,;H$o$l$^$9!#(B + ++ wnnOverrideEnv ($B%/%i%9(B WnnOverrideEnv) + $B%5!<%P$KF1$8L>A0$N4D6-$,$"$C$?;~$K=i4|2=$N=hM}$r9T$J$&$+$I$&$+$r;XDj(B + $B$9$k$?$a$N%j%=!<%9$G$9!#(Btrue $B$G$"$l$P=i4|2=$N=hM}$rI,$:9T$J$$$^$9!#(B + false $B$J$i9T$J$$$^$;$s!#%G%U%)%k%H$O(B false $B$G$9!#(B + ++ ccdef ($B%/%i%9(B Ccdef) + $BF~NOJ8;zJQ49%k!<%kDj5A%U%!%$%k$r;XDj$7$^$9!#$3$N%j%=!<%9$,;XDj$5$l$J(B + $B$+$C$?>l9g$K$O$^$:4D6-JQ?t(B CC_DEF $B$,@_Dj$5$l$F$$$l$P$=$l$,;H$o$l$^$9!#(B + $B$J$1$l$P(B ccdef.kinput $B$,;HMQ$5$l$^$9!#$3$N%U%!%$%k$N%5!<%A%Q%9$O4D6-(B + $BJQ?t(B CC_DEF_PATH $B$G;XDj$9$k$3$H$,$G$-$^$9!#$?$@$7%j%=!<%9$G$O%5!<%A(B + $B%Q%9$r;XDj$9$k$3$H$O$G$-$^$;$s!#(B + ++ saveInterval ($B%/%i%9(B SaveInterval) + $B<-=q$HIQEY%U%!%$%k$r%;!<%V$9$k%?%$%_%s%0$r;XDj$7$^$9!#%;!<%V$O%*%V%8%'(B + $B%/%H$,(B Destroy $B$5$l$k$H$-$K9T$J$o$l$^$9$,!"$3$N%j%=!<%9$K$h$j!"JQ49(B + $B$NESCf$G$b%;!<%V$5$l$k$h$&$K$J$j$^$9!#%;!<%V$O3NDj$N;~$K9T$J$o$l!"$3(B + $B$N%j%=!<%9$G;XDj$7$?2s?t$4$H$K0l2s%;!<%V$5$l$^$9!#Nc$($P(B100$B$r;XDj$9(B + $B$k$H(B100$B2s3NDj$9$k$4$H$K0l2s<-=q!&IQEY$N%;!<%V$,9T$J$o$l$^$9!#$3$N%j(B + $B%=!<%9$K(B 0 $B$r;XDj$9$k$H3NDj;~$N%;!<%V$O9T$J$o$l$^$;$s!#%G%U%)%k%H$O(B + 0 $B$G$9!#(B + + +* Iroha +$BJQ49%*%V%8%'%/%H$G$"$k(B Iroha $B$N%j%=!<%9$K$O$r;XDj$7$^$9!#(B + ++ irohafile ($B%/%i%9(B Irohafile) + $B$+$s$J$NJQ49@_Dj%U%!%$%k$r;XDj$7$^$9!#(B + + +* Sj3 +$BJQ49%*%V%8%'%/%H(B Sj3 $B$N%j%=!<%9$K$O$r;XDj$7$^$9!#$3$N%j%=!<%9(B + $B$,;XDj$5$l$F$$$J$1$l$P4D6-JQ?t(B Sj3SERV $B$NCM$,MQ$$$i$l$^$9!#(B + $B4D6-JQ?t(B Sj3SERV $B$b;XDj$5$l$F$$$J$1$l$P(B localhost $B$K$J$j$^$9!#(B + ++ sj3serv2 ($B%/%i%9(B Sj3serv2) + $B%;%+%s%@%jJQ49%5!<%P$N%[%9%HL>$r;XDj$7$^$9!#%;%+%s%@%j%5!<%P$O5/F0;~(B + $B$d:F@\B3;~$K%W%i%$%^%j%5!<%P$H@\B3$G$-$J$+$C$?;~$K;H$o$l$^$9!#$3$N(B + $B%j%=!<%9$,;XDj$5$l$F$$$J$1$l$P4D6-JQ?t(B Sj3SERV2 $B$NCM$,MQ$$$i$l$^$9!#(B + $B4D6-JQ?t(B Sj3SERV $B$b;XDj$5$l$F$$$J$1$l$P(B localhost $B$K$J$j$^$9!#(B + ++ sj3user ($B%/%i%9(B Sj3user) + $B5/F0;~$d:F@\B3;~$KJQ49%5!<%P$H@\B3;~$9$k:]$K%*!<%W%s$9$k%f!<%6<-=q$N(B + $BL>A0$r;XDj$7$^$9!#$3$N%j%=!<%9$,;XDj$5$l$F$$$J$1$l$P(B kinput2 $B$r5/F0(B + $B$7$?%f!<%6L>$N%f!<%6<-=q$r%*!<%W%s$7$^$9!#(B + ++ rcfile ($B%/%i%9(B Rcfile) + $BJQ49$K;HMQ$9$k%Q%i%a!<%?$d%-!<%P%$%s%I$N@_Dj%U%!%$%k$r;XDj$7$^$9!#$3$N(B + $B%j%=!<%9$,;XDj$5$l$F$$$J$1$l$P4D6-JQ?t(B SJRC $B$NCM$,MQ$$$i$l$^$9!#4D6-(B + $BJQ?t$N@_Dj$b$J$1$l$P(B kinput2 $B$r5/F0$7$?%f!<%6$N%[!<%`%G%#%l%/%H%j$K$"(B + $B$k(B .sjrc $B$H$$$&%U%!%$%k!"(B/usr/lib/X11/sj3def/sjrc $B$N=g$G%5!<%A$7$^$9!#(B + ++ rkfile ($B%/%i%9(B Rkfile) + $B%m!<%^;z$+$JJQ49$NJQ49%F!<%V%k$N@_Dj%U%!%$%k$r;XDj$7$^$9!#$3$N%j%=!<%9(B + $B$,;XDj$5$l$F$$$J$1$l$P4D6-JQ?t(B SJRK $B$NCM$,MQ$$$i$l$^$9!#4D6-JQ?t$N@_Dj(B + $B$b$J$1$l$P(B kinput2 $B$r5/F0$7$?%f!<%6$N%[!<%`%G%#%l%/%H%j$K$"$k(B .sjrk + $B$H$$$&%U%!%$%k!"(B/usr/lib/X11/sj3def/sjrk $B$N=g$G%5!<%A$7$^$9!#(B + ++ hkfile ($B%/%i%9(B Hkfile) + $B$R$i$,$J"N%+%?%+%J$NJQ49$NJQ49%F!<%V%k$N@_Dj%U%!%$%k$r;XDj$7$^$9!#$3$N(B + $B%j%=!<%9$,;XDj$5$l$F$$$J$1$l$P4D6-JQ?t(B SJHK $B$NCM$,MQ$$$i$l$^$9!#4D6-JQ(B + $B?t$N@_Dj$b$J$1$l$P(B kinput2 $B$r5/F0$7$?%f!<%6$N%[!<%`%G%#%l%/%H%j$K$"$k(B + .sjhk $B$H$$$&%U%!%$%k!"(B/usr/lib/X11/sj3def/sjhk $B$N=g$G%5!<%A$7$^$9!#(B + ++ hkfile ($B%/%i%9(B Hkfile) + $BA43QJ8;z"NH>3QJ8;z$NJQ49$NJQ49%F!<%V%k$N@_Dj%U%!%$%k$r;XDj$7$^$9!#$3$N(B + $B%j%=!<%9$,;XDj$5$l$F$$$J$1$l$P4D6-JQ?t(B SJZH $B$NCM$,MQ$$$i$l$^$9!#4D6-JQ(B + $B?t$N@_Dj$b$J$1$l$P(B kinput2 $B$r5/F0$7$?%f!<%6$N%[!<%`%G%#%l%/%H%j$K$"$k(B + .sjzh $B$H$$$&%U%!%$%k!"(B/usr/lib/X11/sj3def/sjzh $B$N=g$G%5!<%A$7$^$9!#(B + ++ sbfile ($B%/%i%9(B Sbfile) + $B5-9fF~NO;~$KI=<($9$kJ8;z%3!<%I0lMw$N@_Dj%U%!%$%k$r;XDj$7$^$9!#$3$N%j(B + $B%=!<%9$,;XDj$5$l$F$$$J$1$l$P4D6-JQ?t(B SJSB $B$NCM$,MQ$$$i$l$^$9!#4D6-JQ?t(B + $B$N@_Dj$b$J$1$l$P(B kinput2 $B$r5/F0$7$?%f!<%6$N%[!<%`%G%#%l%/%H%j$K$"$k(B + .sjsb $B$H$$$&%U%!%$%k!"(B/usr/lib/X11/sj3def/sjsb $B$N=g$G%5!<%A$7$^$9!#(B + + +* ConvDisplay +$BIA2h%*%V%8%'%/%H(B WcharDisplay $B$N%9!<%Q!<%/%i%9$G$"$k(B ConvDisplay $B$N%j%=!<%9(B +$B$K$Ou$r%S%C%H%^%C%W$G;XDj$7$^$9!#%j%=!<%9$K$O%S%C(B + $B%H%^%C%W%U%!%$%kL>$r;XDj$7$^$9!#(B + ++ hotX, hotY ($B%/%i%9(B HotX, HotY) + cursorBitmap $B$G;XDj$7$?%$%s%5!<%H%+!<%=%k$N%[%C%H%9%]%C%H$r;XDj$7$^(B + $B$9!#%+!<%=%k$O%[%C%H%9%]%C%H$,%Y!<%9%i%$%s>e3Q$+$J%U%)%s%H$r;XDj$7$^$9!#(Bfont $B$HF1$8$/!"F~NO%9%?%$(B + $B%k$K$h$C$F$O%/%i%$%"%s%H$K$h$k%U%)%s%H$N;XDj$,;H$o$l$k$N$GI,$:$7$b$3(B + $B$N%j%=!<%9$G;XDj$7$?%U%)%s%H$,;H$o$l$k$H$O8B$j$^$;$s!#(B + $B$3$N%j%=!<%9$G;XDj$9$k%U%)%s%H$N%-%c%i%/%?%;%C%H$O(B "JISX0201.1976-0" + $B$G$J$1$l$P$J$j$^$;$s!#(B + $B%G%U%)%k%H$O(B "-Misc-Fixed-Medium-R-*--14-*-*-*-C-*-JISX0201.1976-0" + $B$G$9!#(B + ++ fontMapping ($B%/%i%9(B FontMapping) + $BJ8;zNs$r=q$/;~$K!"(Bfont, kanjiFont, kanaFont $B$G;XDj$7$?%U%)%s%H$N(B GL + ($B:8H>J,(B MSB $B$,Mn$A$F$$$kNN0h(B) GR ($B1&H>J,(B MSB $B$,N)$C$F$$$kNN0h(B) $B$N$I(B + $B$A$i$r;HMQ$9$k$+$r;XDj$7$^$9!#;XDjJ}K!$O(B + + *fontMapping: GL,GL,GR + + $B$N$h$&$K=q$-$^$9!#%G%U%)%k%H$O(B GL,GL,GR $B$G$9$,!"(BkanjiFont $B$K(B EUC $B%(%s(B + $B%3!<%G%#%s%0$N%U%)%s%H(B ($BNc$($P(B *-JISX0208.1983-1) $B$r;XDj$7$?>l9g$K$O(B + + *fontMapping: GL,GR,GR + + $B$K$7$F2<$5$$!#(B + + +* KinputProtocol +kinput $B%U%!%_%j!<%W%m%H%3%kMQ$N%W%m%H%3%k%I%i%$%P(B KinputProtocol $B$N%j%=!<%9(B +$B$K$Ol9g(B) $B$@$1$G$O$J$/!"(Bkinput $B$,;H(B + $BMQ$7$F$$$?(B "JAPANESE_CONVERSION" $B$bF1;~$K;H$($k$h$&$K$7$^$9!#(Bkinput + $B$rMQ$$$FF|K\8lF~NO$r9T$J$C$F$$$?%"%W%j%1!<%7%g%s$K$O(B + "JAPANESE_CONVERSIN" $B$rMQ$$$F$$$k$b$N$,B?$$$N$G$=$N$h$&$J%"%W%j%1!<(B + $B%7%g%s$r;HMQ$9$k2DG=@-$,$"$k>l9g$K$O$3$N%j%=!<%9$r(B true $B$K$7$F$*$$$?(B + $BJ}$,$h$$$G$7$g$&!#%G%U%)%k%H$O(B false $B$K$J$C$F$$$^$9!#(B + ++ xlcConversionStartKey ($B%/%i%9(B XlcConversionStartKey) + xlc $B%W%m%H%3%k$G$OJQ493+;O$K;H$o$l$k%-!<$r%U%m%s%H%(%s%I$+$i%"(B + $B%W%j%1!<%7%g%s$K65$($k$3$H$,$G$-$^$9!#$3$N%j%=!<%9$K$O$3$N%-!<(B + $B$r5-=R$7$^$9!#%j%=!<%9$O%D!<%k%-%C%H$N%H%i%s%9%l!<%7%g%s%^%M!<(B + $B%8%c$N5-=RIw$K!"Kanji + + "" $B$NA0$K=q$1$k$N$O%b%G%#%U%!%$%"$G!"$3$l$O" $B$N8e$K=q$+$l$k$N$O(B Keysym $BL>$G$9!#(B + + +* XimpProtocol +XIMP $B%W%m%H%3%kMQ$N%W%m%H%3%k%I%i%$%P(B XimpProtocol $B$N%j%=!<%9$K$OJ}(B + $B$N%;%l%/%7%g%s$r;HMQ$7$FJQ49%5!<%S%9$N3+;O$r@k8@$7$^$9!#(B + ++ conversionStartKeys ($B%/%i%9(B ConversionStartKeys) + XIMP $B%W%m%H%3%k$K$O!"%/%i%$%"%s%H$KBP$7$FJQ49$N3+;O$*$h$S=*N;$K;HMQ(B + $B$9$k%-!<$r65$($k5!G=$,$"$j$^$9!#$3$N%j%=!<%9$O$=$N%-!<$r;XDj$9$k$?$a(B + $B$N$b$N$G$9!#$?$@$7IaDL$O;XDj$5$l$?%-!<$OJQ49=*N;$K$O;HMQ$5$l$^$;$s!#(B + $BJQ49=*N;$N%-!<$O3FJQ49%*%V%8%'%/%H$G;XDj$9$k%-!<$,;H$o$l$^$9!#(B + $B%j%=!<%9$O%D!<%k%-%C%H$N%H%i%s%9%l!<%7%g%s%^%M!<%8%c$N5-=RIw$K!"Kanji \n\ + Ctrl ~ShiftF1 + + $B$3$N$h$&$KJ#?t$N%-!<$r%-!<$O2~9T%3!<%I$G6h@Z$k$3$H$G;XDj$G$-$^$9!#(B + $B3F%-!<$N5-=RJ}K!$O(B xlcConversionStartKey $B$H$[$\F1$8$G$9$,!"%b%G%#%U%!(B + $B%$%"$NA0$K(B '~' $B$r$D$1$k$3$H$G!"$=$N%b%G%#%U%!%$%"$r2!$7$F$O$J$i$J$$(B + $B$3$H$r<($9$3$H$,$G$-$^$9!#(B + ++ defaultFontList ($B%/%i%9(B FontList) + XIMP $B$K=>$&%/%i%$%"%s%H$,!"JQ49$K;HMQ$9$k%U%)%s%H$r;XDj$7$J$+$C$?;~(B + $B$K;H$o$l$k%U%)%s%H$G$9!#K\Mh!"%/%i%$%"%s%H$,;XDj$7$J$+$C$?>l9g$K$OIA(B + $B2h%*%V%8%'%/%H$N%G%U%)%k%H%U%)%s%H$,;H$o$l$^$9$,!"(BXIMP $B$K$O!"%G%U%)(B + $B%k%H$N%j%=!<%9CM$r%/%i%$%"%s%H$K65$($k5!G=$,$"$j!"$=$l$OIA2h%*%V%8%'(B + $B%/%H$+$i$OCN$k$3$H$,$G$-$J$$$N$G$A$g$C$HJQ$G$9$,$3$N(B widget $B$N%j%=!<(B + $B%9$H$7$F;XDj$9$k$h$&$K$7$^$7$?!#(B + $B;XDj$O(B R5 $B$N(B FontSet $B$N5-=RJ}K!$HF1$8$G$9!#(B + + +* CandidatePanel +$B8uJd0lMwA*Br$KMQ$$$i$l$k(B CandidatePanel $B$N%j%=!<%9$K$Oe2<$N8uJd4V$N%9%Z!<%9$r%T%/%;%kC10L$G;XDj$7$^$9!#%G%U%)%k%H$O(B 4 $B$G(B + $B$9!#(B + ++ defaultWidth ($B%/%i%9(B DefaultWidth) + $B%Q%M%k$NBg$-$5$O8uJd?t$K1~$8$FJQ2=$7$^$9$,!"FC$KI}$N;XDj$,$J$$;~$K(B + $B%G%U%)%k%H$G;H$o$l$kI}$r;XDj$7$^$9!#%G%U%)%k%H$O(B 400 $B$G$9!#(B + + +* ConversionControl +OverTheSpotConversion/OffTheSpotConversion/SeparateConversion $B6&DL$N%9!<%Q!<(B +$B%/%i%9$G$"$k(B ConversionControl $B$N%j%=!<%9$K$O$N%"%W%j%1!<%7%g%s$+$iAw$i$l$?%$%Y%s%H$rL5;k$9$k$h$&$K$J$C$F$$$k(B + $B$b$N$b$"$j$^$9$N$GCm0U$7$F2<$5$$!#Nc$($P(B kterm $B$O%j%=!<%9$G(B + *allowSendEvents: true + $B$r;XDj$7$J$$$H$;$C$+$/Aw$C$?%$%Y%s%H$OL5;k$5$l$^$9!#$^$?!"%W%m%H%3%k(B + $B$K$h$C$F$O$3$Nl9g$K$O$3$N%j%=!<%9;XDj$O0UL#$r;}$A$^$;$s!#(B + + +* OverTheSpotConversion +$B$=$N>lJQ49F~NO$rl=j$+$i(B + $B=q$-;O$a$^$9!#%G%U%)%k%H$O(B false $B$G$9!#(B + ++ modeLocation ($B%/%i%9(B ModeLocation) + $BF~NO%b!<%I$NI=<(0LCV$r;XDj$7$^$9!#%/%i%$%"%s%H$+$i0LCV$N;XDj$,$"$l$P(B + $B$=$l$K=>$$$^$9$,!"$J$1$l$P$3$N%j%=!<%9$K$h$C$F7h$a$i$l$^$9!#(B + TopLeft: $B%/%i%$%"%s%H%&%#%s%I%&$N:8>e$KI=<((B + TopRight: $B%/%i%$%"%s%H%&%#%s%I%&$N1&>e$KI=<((B + BottomLeft: $B%/%i%$%"%s%H%&%#%s%I%&$N:82<$KI=<((B + BottomRight: $B%/%i%$%"%s%H%&%#%s%I%&$N1&2<$KI=<((B + TrackText: $BJQ49Cf$NJ8;zNs$ND>2<$KI=<((B + TrackText $B$r;XDj$7$?>l9g!"F~NO$K$D$l$F%b!<%I$NI=<(0LCV$b0\F0$7$^$9!#(B + $B%G%U%)%k%H$O(B BottomLeft $B$G$9!#(B + ++ shrinkWindow ($B%/%i%9(B ShrinkWindow) + $B$=$N>lJQ49$O%/%i%$%"%s%H$N%&%#%s%I%&$N>e$KJQ49J8;zNs$N=q$+$l$?%&%#%s(B + $B%I%&$r$*$/$3$H$K$h$C$Fl9g!"DL>o$O$=$l$K$7$?$,$C(B + $B$FF~NO%b!<%I$O;XDj0LCV$KI=<($5$l$^$9!#$7$+$7$3$N%j%=!<%9$r(B true $B$K$9(B + $B$k$H$=$N;XDj$rL5;k$7!">o$K(B modeLocation $B$G;XDj$5$l$k0LCV$KI=<($5$l$k(B + $B$h$&$K$J$j$^$9!#(B + + +* OffTheSpotConversion +off-the-spot $B%?%$%W$NF~NO$rMh$N(B kinput $B$N$h$&$J!"JL%&%#%s%I%&$K$h$kF~NO$re2<$N%9%Z!<%9$r%T%/%;%kC10L$G;XDj$7$^$9!#%G%U%)%k%H$O(B 1 + $B$G$9!#(B + ++ justify ($B%/%i%9(B Justify) + $BDL>o$OI=<(J8;zNs$K9g$o$;$F%i%Y%k$NBg$-$5$,JQ2=$7$^$9$,!"%i%Y%k$NBg$-(B + $B$5$,8GDj$@$C$?;~$KJ8;zNs$r$I$N0LCV$K=q$/$+$r;XDj$7$^$9!#(B + left: $B:8$h$;(B + center: $BCf1{(B + right: $B1&$h$;(B + $B>e2<$O>o$KCf1{$K=q$+$l$k$h$&$K$J$C$F$*$j!"%j%=!<%9$GJQ$($k$3$H$O$G$-(B + $B$^$;$s!#%G%U%)%k%H$O(B center $B$G$9!#(B diff -r 000000000000 -r 92745d501b9a doc/sj3def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/doc/sj3def Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,2449 @@ +$Id: sj3def,v 2.5 1998/07/21 08:51:27 ishisone Exp $ + +[ $B$3$N%I%-%e%a%s%H$O(B kinput2 $B$GJQ49%7%9%F%`$K(B sj3 $B$r;HMQ$9$k;~$K;H$o$l$k(B ] +[ Sj3Object($B%/%i%9L>(B Sj3) $B$r;HMQ$7$?>l9g$N%m!<%^;z$+$JJQ49!"$=$NB>(B ] +[ $B3FA`:n%-!<$N%+%9%?%^%$%:$NJ}K!$K$D$$$F5-=R$7$F$$$^$9!#(B ] + +*** $BF~NOJ8;zJQ49$N@_Dj(B *** + + $B$3$3$G$O(B kinput2 $B$NJQ49%*%V%8%'%/%H$N0l$D(B Sj3Object $B$,JQ49$K;HMQ$9$k(B + $B%-!e!"BgJ8@a!?>.J8@aJQ49$O%5%]!<%H$7$F$$$^$;$s(B) + + $B$^$?!":G8e$K(B Canna $B$H(B sjx $B$N%f!<%6!&%$%s%?!<%U%'!<%9$r(B + $B%(%_%e%l!<%H$9$kNc$r>R2p$7$F$"$j$^$9!#(B + + $B3F9`$G$NCm0UE@$O!V!|!W$KB3$1$F5-=R$7$F$^$9!#(B + +<$BL\ + <1> Sj3Object $B$NFCD'(B + <2> Sj3Object $B$N%b!<%I(B + <3> $B3F%+%9%?%^%$%:MQ%U%!%$%k$N>l=j$H%U%)!<%^%C%H(B + <4> sjrc $B%U%!%$%k$K$h$k%f!<%6!&%$%s%?!<%U%'!<%9$N%+%9%?%$%^%$%:(B + <5> $BJQ49%5!<%P(B(sj3serv) $B$N%[%9%HL>$N7hDj(B + <6> $B<-=qEPO?!?Ku>C%b!<%I$NF0:n(B + <7> $BF~NOJ8;zJQ49$N35MW(B(sjrk$B!"(Bsjhk$B!"(Bsjzh $B%U%!%$%k$N%+%9%?%^%$%:(B) + <8> $B@)8B;v9`(B + <9> $B:#8e$N2]Bj(B + <10> $B%P%0$r8+$D$1$?$i!D(B + <$BIUO?(B1> Canna $B$N%f!<%6!&%$%s%?!<%U%'!<%9$r%(%_%e%l!<%H$9$kJ}K!(B + <$BIUO?(B2> sjx $B$N%f!<%6!&%$%s%?!<%U%'!<%9$r%(%_%e%l!<%H$9$kJ}K!(B + +<1> Sj3Object $B$NFCD'(B + + 1. Sj3Object $B$G$O$+$J4A;zJQ49%5!<%P$K(B sj3serv (X11R5 $B$N(B contribute $B$K(B + $B4^$^$l$F$$$^$9(B) $B$r;HMQ$7$^$9!#JQ49%5!<%P$OK|0l$NJQ49%5!<%P%@%&%s;~(B + $B$N$?$a$K%;%+%s%I%5!<%P$,;XDj2DG=$G$9!#JQ49%5!<%P$N;XDj$K$D$$$F$O(B + $B$3$N%I%-%e%a%s%H$N(B <5> $B$r!":F@\B3$NJ}K!$K$D$$$F$O(B + <4>[1] $B$N(B recconect $B$N9`$r;2>H$7$F$/$@$5$$!#(B + + 2. Sj3Object $B$G$OJQ49J8;zNsA`:n$K(B sj3lib $B$N>e0L%i%$%V%i%j(B Xsj3clib $B$r(B + $B;HMQ$7$^$9(B(lib/Xsj3clib/*)$B!#(B + + 3. $B$+$J%-!<%\!<%I$G$J$$%-!<%\!<%I$G$b5?;wE*$J$+$J%m%C%/!&%-!<$N(B + $B%-![1] $B$N(B kana $B$N9`;2>H!K$r@_Dj$9$k$3$H$K$h$C$F(B + $B$+$JF~NO$H$N%H%0%k$,2DG=$G$9!#(B + + 4. $BF~NOJ8;zNs$N#5$D$NJQ49>uBV!J(B<2>$B$N(B[3]$B;2>H!K$K$h$C$F(B + $BF1$8%-!$N%"%W%j%1!<%7%g%s$H$N%P%C%F%#%s%0$rMF0W$KHr$1$k$3$H$,$G$-$^$9!#(B + + 5. $B$+$J4AJQ49$N%f!<%6!&%$%s%?!<%U%'!<%9$b%&%#%s%I%&!&%^%M!<%8%c(B + $BJB$K%+%9%?%^%$%:$G$-$k$h$&$K$9$Y$-$@$H$$$&%]%j%7!<$K=>$$!"(B + sjrc $B%U%!%$%k$r;HMQ$7$?%+%9%?%$%^%$%:$,Hs>o$K9-HO0O$KEO$C$F(B + $B9T$&$3$H$,$G$-$k$h$&$K$7$^$7$?!#%f!<%6!&%$%s%?!<%U%'!<%9$K(B + $B$D$$$F$O(B CcWnn$B!"(Bsjx$B!"(BCanna $BEyB?$/$N$+$J4A;zJQ49%7%9%F%`$N(B + $BJ8;zNsA`:n$r%(%_%e%l!<%H$9$k$3$H$,2DG=$G$9!#(B + $B$b$A$m$s<+J,9%$_$N%f!<%6!&%$%s%?!<%U%'!<%9$K(B + $B%A%e!<%s%"%C%W$7$F;HMQ$9$k$3$H$b2DG=$G$9!#(B + + 6. $B%j%=!<%9!?%-!e0L8_49@-$r0];}$7$F$$$^$9!#(B + $B$^$?!"%U%!%s%/%7%g%sL>$K$D$$$F$O(B + CcWnn $B$H$b$J$k$Y$/F10l$K$J$k$h$&$K$7$F$"$j$^$9!#(B + sjrc $B%U%!%$%k$N7A<0$K$D$$$F$O$3$N%I%-%e%a%s%H$N(B <3> $B$r!"(B + $B $B$r;2>H$7$F$/$@$5$$!#(B + + 7. $B%3!<%IF~NO$G$O(B Shift-JIS$B!"F|K\8l(BEUC$B!"(BJIS$B!"6hE@%3!<%I(B + $B$N#43Q%+%?%+%J!"(B + $BA43Q%"%k%U%!%Y%C%H!"H>3Q%"%k%U%!%Y%C%H$N#53Q!?A43Q!"1Q>.J8;z!?1QBgJ8;z$r2C$($?J8;zl9g$O(B + $B%(%i!<$K$J$j$^$9!#(B + + 8. $B%+%9%?%$%^%$%:J}K!$,H=$j$d$9$$$h$&$K%m!<%^;z!?$+$JJQ49(B(sjrk)$B!"(B + $BH>3Q!?A43QJQ49(B(sjzh)$B$d$R$i$,$J!?%+%?%+%JJQ49(B(sjhk)$B$NJQ495,B'$N(B + $B%+%9%?%^%$%:%U%!%$%k$O$=$l$>$lJL$K$7$^$7$?!#BgJ8;z!?>.J8;zJQ49(B + $B0J30$O$3$l$i$N%+%9%?%^%$%:$K$h$C$FI}$N9-$$%+%9%?%$%^%$%:$,2DG=$G$9!#(B + $B$3$l$i$N%U%!%$%k$N7A<0$K$D$$$F$O$3$N%I%-%e%a%s%H$N(B <3> $B$r!"(B + $B $B$r;2>H$7$F$/$@$5$$!#(B + + 9. $BF~NO8e!?$+$J4A;zJQ498e$NJ8;zNs$NJT=8J}K!$O(B CcWnn $B$N%f!<%6(B + $B%$%s%?!<%U%'!<%9$r:NMQ$7$F$$$^$9!#!J$3$N$?$a(B sjx $B$d(B Canna $B$N(B + $BF0:n$N%(%_%e%l!<%HMQ$N(B sjrc $B$r;HMQ$7$F$bJT=8J}K!$O(B + CcWnn $B$HF1MM$K$J$j$^$9!K(B + + 10. $BD>A0$K3NDj$7$?J8;zNs$r:FEY8F$S=P$95!G=!J(Bsj2/sj3/sjx $B$N5!G=(B + :<4>[1] $B$N(B saihenkan $B$N9`;2>H!K$,$"$j!"F1MM$NJQ49$r2?EY$b(B + $B9T$&:]$KJXMx$G$9!#(B + + 11. $B3F Sj3Object $B$N%b!<%I(B + + $B%b!<%I$N35G0$K$O0J2<$N#3o(B JIS $B%-!<%\!<%I$N$h$&$J(B + $B$+$JG[Ns$N%-!<%\!<%I$G2DG=$G$9$,!"(BSj3Object $B$G$O(B + $B$+$J%m%C%/%-!<$N$J$$$h$&$J%-!<%\!<%I$G$b5?;wE*$J(B + $B$+$J%m%C%/%-!J}$rF1;~$K3Q%+%?%+%J(B + 4. $BA43Q%"%k%U%!%Y%C%H(B + 5. $BH>3Q%"%k%U%!%Y%C%H(B + + $B$N#5$D$N6hJL$,$G$-$^$9!#(BSj3Object $B$G$O$3$l$r!VJ8;z@\F~NO$9$kJ8;z$7$F$$$k(B or $B%+!<%=%k$N$"$k!K(B + $BJ8@a$NI=<($5$l$F$$$kJ8;ze5-$N#5$D$NJ8;z$K0J2<$NI=<(J8;z3Q%b!<%I(B + 8. $BBgJ8;z%"%k%U%!%Y%C%H%b!<%I(B + 9. $B>.J8;z%"%k%U%!%Y%C%H%b!<%I(B + + $B!|F~NOJ8;zl9g$O%b!<%II=<($,JQ$o$j$^$9$,!"(B + $BI=<(J8;zl9g$O%b!<%II=<($OJQ$o$j$^$;$s!#(B + $B!|F~NOJ8;ze5-$N(B 4. $BA43Q%"%k%U%!%Y%C%H!"(B5. $BH>3Q%"%k%U%!%Y%C%H$N(B + $B;~$O$+$JF~NO$O$G$-$^$;$s!#(B + $B!|%3!<%IF~NO!?5-9fA*BrF~NO$K$h$C$FF~NO$5$l$?>l9g!"I=<(J8;zuBV$K$h$C$F6hJL$9$kJ}K!$G!"(BSj3Object $B$G$O(B + + 1. NoInputMode $BF~NOJ8;z$,B8:_$7$J$$>uBV(B + 2. InputMode $B%+%l%s%HJ8@a$,L$JQ49$N>uBV(B + 3. ConvedMode $B%+%l%s%HJ8@a$,$+$J4A;zJQ498e$N>uBV(B + 4. SelectMode $BJQ498uJd0lMwA*BrCf$d5-9f!?IJ;lA*BrCf$N>uBV(B + 5. DictMode $B<-=qEPO?!"<-=qEPO?Ku>CCf$N>uBV(B + + $B$N#5$D$N6hJL$,$G$-$^$9!#(BSj3Object $B$G$O$3$l$r!VJQ49%b!<%I!W(B + $B$H8F$V$3$H$K$7$^$9!#$=$l$>$l(B NoInputMode $B$H(B InputMode $B$O(B CcWnn + $B$G$N(B[$BL$JQ49(B]$B!"(BConvedMode $B$O(B CcWnn $B$G$N(B[$BJQ49:Q(B]$B!"(BSelectMode $B$O(B + [$B8uJdA*Br(B] $B$H(B [$B5-9fF~NO(B] $B$KBP1~$9$k$H9M$($l$PNI$$$G$7$g$&!#(B + + InputMode $B$N!VL$JQ49$N>uBV!W$H$$$&$N$H!"!VJ8;zF~NO$,2DG=$J(B + $B>uBV!W$H$$$&$N$O0[$J$k$N$GCm0U$,I,MW$G$9!#(B + + NoInputMode $B$+$iJ8;zF~NO$K$h$C$F(B InputMode $B$K$J$k>l9g$O(B + $B>o$K!VJ8;zF~NO$,2DG=$J>uBV!W$G$9$,!"0lEY$+$J4A;zJQ49(B + $B$7$?8e$N3FJ8@a$O%+%l%s%HJ8@a$N$H$-J8@aA4BN$,(B + $BH?E>$7$FJ8;zF~NO$G$-$J$$>uBV$K$J$j$^$9!#(B + + $BNc$($P!"J8;zNs0l3gJQ498e$K8e=R$NJ8;zNsA`:n(B + $B%U%!%s%/%7%g%s$N(B unconvert(muhen) $B$r(B + $B8F$S=P$7$?;~$K$O!VL$JQ49$N>uBV!W(B(InputMode) $B$K$O(B + $B$K$J$j$^$9$,!"8e=R$N%j%=!<%9(B .MoveBySegment $B$,(B on.on $B$G(B + InputMode $B$G$N0\F0C10L$,J8@aC10L$G$"$C$?$j$9$k>l9g!"(B + $B%+%l%s%HJ8@a$OH?E>$7$?$^$^$G!VJ8;zF~NO$,2DG=$J>uBV!W(B + $B$K$O$J$j$^$;$s!#(B + + $B$3$N$h$&$J>l9g!"%U%!%s%/%7%g%s$N(B edit $B$r8F$S=P$9$+!"(B + .FlushInConversion $B$d(B .FlushSelectConversion $B$G(B "edit" + $B$r;XDj$7!"%+%l%s%HJ8@a$NH?E>>uBV$r2r=|$9$kI,MW$,$"$j$^$9!#(B + + $B$?$@$7!"(B.MoveBySegment $B$,(B off.on $B$d(B off.off $B$G(B + InputMode $B$G$N0\F0C10L$,J8;zC10L$N$H$-$O(B unconvert(muhen) + $B$G$bH?E>>uBV$r2r=|$7!VJ8;zF~NO$,2DG=$J>uBV!W(B + $B$K$J$j$^$9!#(B + +<3> $B3F%+%9%?%^%$%:MQ%U%!%$%k$N>l=j$H%U%)!<%^%C%H(B + + Xsj3clib $B$N%+%9%?%^%$%:MQ$K$O0J2<$N#53Q!?A43QJQ49%+%9%?%^%$%:MQ(B + [4] sjsb $B5-9fA*Br0lMwI=<($N%+%9%?%^%$%:MQ(B + [5] sjrc $BJ8@a!?JQ49A`:n$N%-!(B + $B%f!<%6!&%$%s%?!<%U%'!<%9%+%9%?%^%$%:MQ(B + + $B0J2<$=$l$>$l$N%+%9%?%^%$%:MQ%U%!%$%k$K$D$$$F@bL@$7$^$9!#(B + $B3F%U%!%$%k$KB?%P%$%HJ8;z$r5-=R$9$k%(%s%H%j$,$"$k>l9g!"(B + locale $B$N(B LC_CTYPE $B$,(B "ja_JP.SJIS" $B$d(B "js_JP.mscode" $B$N>l9g(B + Shift-JIS $B$H$7$F!"(B"ja_JP.jis8" $B$N>l9g$O(B 8bit-JIS $B$H$7$F!"(B + "ja_JP.jis7" $B$N>l9g$OH>3Q%+%?%+%J$r(B SO/SI $B$G;X<($9$k(B 7bit-JIS + $B$H$$$F!"$=$l0J30$N$H$-$O(B EUC $B$H$7$FFI$_9~$_$^$9!#(B + + LC_CTYPE $B$,(B "ja_JP.SJIS/js_JP.mscode" $B$G$J$/!"(BShift-JIS $B$H$7$F(B + $BFI$_9~$_$?$$$H$-!"(B"ja_JP.jis8" $B$G$J$/!"(B 8bit-JIS $B$H$7$F(B + $BFI$_9~$_$?$$$H$-!"(B"ja_JP.jis7" $B$G$J$/!"(B 7bit-JIS $B$H$7$F(B + $BFI$_9~$_$?$$$H$-$O!"$=$l$>$l(B include/Xsj3clib.h $B$G(B + FORCE_SJIS/FORCE_JIS8/FORCE_JIS7 $B$r(B define $B$7$F%3%s%Q%$%k(B + $B$9$l$PI,$:$=$l$>$l$N%3!<%I$H$7$F$H$7$FFI$_9~$^$l$^$9!#(B + + $B$^$?!"3F%U%!%$%k$N%5!<%A$5$l$kM%@h=g0L$O0J2<$N$h$&$K$J$j$^$9!#(B + sjrc $B%U%!%$%k0J30$O(B kinput2 $B5/F0;~$K$N$_$KFI$_9~$^$l$^$9!#(B + + (1) $B%*%W%7%g%s(B -{rk,hk,zh,sb,rc}file $B$KB3$/%U%!%$%kL>(B + (2) $B%j%=!<%9%U%!%$%k(B($B%j%=!<%9%U%!%$%k$N%5!<%A=g$O(B Xtoolkit $B$N(B + $B%^%K%e%"%k$r8+$F$/$@$5$$(B)$B$G(B *Sj3.{rk,hk,zh,sb,rc}file $B$K(B + $B;XDj$5$l$k%U%!%$%k(B + (3) $B4D6-JQ?t(B SJ{RK,HK,ZH,SB,RC} $B$K;XDj$5$l$k%U%!%$%k(B + (4) $B%[!<%`%G%#%l%/%H%j$ND>2<$N(B .sj{rk,hk,zh,sb,rc} $B$H$$$&(B + $BL>>N$N%U%!%$%k(B + (5) /usr/lib/X11/sj3def $B$N2<$N(B sj{rk,hk,zh,sb,rc} $B$H$$$&(B + $BL>>N$N%U%!%$%k(B + + $B$?$@$7!"%j%=!<%9%U%!%$%k$d%*%W%7%g%s$K;XDj$7$?>l9g$O!"(B + $B;XDj$5$l$?%U%!%$%k$,B8:_$7$J$$$H%(%i!<$G=*N;$7$^$9!#(B + + $B3F%U%!%$%kCf$N3F%(%s%H%j$N6h@Z$j$O?eJ?%?%V%3!<%I(B(0x09)$B$+(B + space(0x20) $B$K$J$j$^$9!#$=$l$>$l$N%(%s%H%jCf$K(B space(0x20)$B!"(B + '\'(0x5c)$B!"(B'#'(0x23) '.'(0x2e) $B$r4^$`>l9g$O(B '\' + $B$G%(%9%1!<%W$9$kI,MW$,$"$j$^$9!#(B + $B3F%U%!%$%k$K(B '#' $B$,4^$^$l$k>l9g!"$=$N9T$N0J9_$N5-=R$O(B + $B%3%a%s%H$H$_$J$5$l$^$9!#(B + + $BDL>o%+%9%?%$%^%$%:$KIQHK$K;HMQ$5$l$k$N$O(B sjrc $B%U%!%$%k$@$1(B + $B$G$7$g$&!#$$$m$$$m$J$+$J4A;zJQ49%7%9%F%`$N%f!<%6!&%$%s%?!<%U%'!<%9$r(B + $B%(%_%e%l!<%H$9$k:]$b(B sjrc $B%U%!%$%k$N%+%9%?%$%^%$%:$@$1$G:Q$`>l9g$,(B + $BB?$$$H;W$$$^$9!#(B + + $B0J2<$K$=$l$>$l$N%U%!%$%k$N%(%s%H%j$N5-=RJ}K!$K$D$$$F@bL@$7$^$9!#(B + + [1] sjrk $B%m!<%^;z!?$+$JJQ49%+%9%?%^%$%:MQ(B + + $B3F9T$K$O0J2<$N#3$D$N%(%s%H%j$r5-=R$7$^$9!#(B + + [in_roma] [out_kana] [out_roma] + + [in_roma] $B%m!<%^;zF~NO;~$NJQ4985$N%m!<%^;z!J(BASCII $B%-%c%i%/%?%;%C%H(B + $B$N$&$A(B 0x00$B!A(B0x1f $B$H(B 0x7f $B$r=|$$$?J8;z!K$r;XDj$7$^$9!#(B + [out_kana] $BJQ49;~$NA43QJ8;zNs$r;XDj$7$^$9!#(B + [out_roma] $BJQ498e$KJQ49%P%C%U%!$K;D$7!"JN,2DG=$G$9!#(B + + <$BNc(B> + kya $B$-$c(B + + $B>e5-$NNc$O!V(Bkya$B!W$HF~NO$7$?$H$-$K!V$-$c!W$KJQ49$5$l$k5,B'$r(B + $B5-=R$7$?Nc$G$9!#(B + + [2] sjhk $B$R$i$,$J!?%+%?%+%JJQ49%+%9%?%^%$%:MQ(B + + $B3F9T$K$O0J2<$N#4$D$N%(%s%H%j$r5-=R$7$^$9!#(B + + [zhira] [zkata] [hkata] [ascii] + + [zhira] $BA43Q$R$i$,$J$r#1J8;z;XDj$7$^$9(B + [zkata] $BBP1~$9$kA43Q%+%?%+%J$r#1J8;z;XDj$7$^$9(B + [hkata] $BBP1~$9$kH>3Q%+%?%+%J(B($B#2J8;z0JFb(B)$B$r5-=R$7$^$9!#(B + [ascii] $B$+$J%-!<%\!<%I$G$J$$%-!<%\!<%I$G$+$JF~NO$r2DG=$K$9$k$?$a(B + $B$N%(%s%H%j$G$9!#$+$J%-!<%\!<%I$GBP1~$9$k%-!<$N(B + $B%"%9%-!3Q$G;XDj$7$^$9!#(B + + <$BNc(B> + $B$.(B $B%.(B $B%-!+(B g[ + $B",(B($BK\Ev$OH>3Q(B) + SJIS/JIS8: 0xb7,0xde + EUC: 0x8e,0xb7,0x8e,0xde + $B>e5-$NNc$O%b!<%IJQ49$G!V$.!W$rA43Q%+%?%+%J$KJQ49$7$?$H$-$O!V%.!W(B + $B$K!"H>3Q%+%?%+%J$KJQ49$7$?$H$-$O!V%-!+!W$KJQ49$7!"(B + $B$+$JF~NO$G$O!V%-!+!W$HF~NO$7$?>l9g$^$?$O5?;wE*$J(B + $B2>L>%m%C%/$N>uBV$G!V(Bg[$B!W$HF~NO$7$?$H$-$K!V$.!W$KJQ49$9$k(B + $B5,B'$r5-=R$7$?Nc$G$9!#(B + + [3] sjzh $BH>3QA43QJQ49%+%9%?%^%$%:MQ(B + + $B3F9T$K$O0J2<$N#4$D$N%(%s%H%j$r5-=R$7$^$9!#(B + + [halpha] [zalpha] [zkana] [hkana] + + [halpha] $BH>3Q%"%9%-!3QByE@(B(0xde)$B!?H>ByE@(B(0xdf) + $B$ONc30$H$7$FG'$a$i$l$k!K(B + [zalpha] $BBP1~$9$kA43Q%"%9%-!3Q%+%?%+%J$r#1J8;z;XDj$7$^$9(B + + <$BNc(B> + [ $B!N(B $B!V(B $B!V(B + $B",(B($BK\Ev$OH>3Q(B) + SJIS/JIS8: 0xa2 + EUC: 0x8e,0xa2 + $B>e5-$NNc$O%b!<%IJQ49$G(B "$B!V(B" $B$rH>3Q%"%k%U%!%Y%C%H$KJQ49$7$?$H$-$O(B + "[" $B$K!"A43QH>3Q%"%k%U%!%Y%C%H$KJQ49$7$?$H$-$O(B "$B!N(B" $B$K!"(B + $BH>3Q%+%?%+%J$KJQ49$7$?$H$-$O(B "$B!V(B" $B$KJQ49$9$k5,B'$r(B + $B5-=R$7$?Nc$G$9!#(B + + [4] sjsb $B5-9fA*Br0lMwI=<($N%+%9%?%^%$%:MQ(B + + $B3F9T$K$O$?$@#1$D$N%(%s%H%j$r5-=R$7$^$9!#(B + + [data] $B5-9fA*Br;~$KI=<($7$?$$A43QJ8;z$r#1J8;z;XDj$7$^$9(B + + <$BNc(B> + $B!z(B + + $B>e5-$NNc$O5-9fA*Br$r3+;O$9$k%-!<(B + (sjrc $B$G(B "ki2key.symbol" $B$K%P%$%s%I$5$F$$$k%-!<(B($B8e=R(B))$B$G(B + $B5-9fA*BrI=<($r$7$?$H$-$K!V!z!W$rI=<($9$kNc$G$9!#(B + + [5] sjrc $BJ8@a!?JQ49A`:n$N%-!(B + $B%f!<%6!&%$%s%?!<%U%'!<%9$N%+%9%?%^%$%:MQ(B + + $B3F9T$K$O0J2<$N#2$D!J0J>e!K$N%(%s%H%j$r5-=R$7$^$9!#(B + + [key0].[key1] [value0] [value1] [value2]$B!D!D!D!D(B + + [key?] $B%+%9%?%^%$%:$7$?$$MWAG(B(keyword)$B$r;XDj$7$^$9!#(B + $B:G=i$N(B keyword $B$KB3$1$F!V(B.$B!W(B(0x2e)$B$G6h@Z$C$FBh#2$N(B + keyword $B$r;XDj$G$-$^$9!#$3$N%(%s%H%j$O$9$Y$F(B + $B%3%s%H%m!<%k%3!<%I$r=|$/H>3Q(B ASCII $BJ8;z$G5-=R$5$l$F(B + $B$$$kI,MW$,$"$j$^$9!#(B + [value?] $B%+%9%?%^%$%:FbMF(B(value)$B$r;XDj$7$^$9!#:G=i$N(B + value $B$KB3$1$F!V(B.$B!W(B(0x2e)$B$d(B space$B!"(Btab $B$G6h@Z$C$F(B + $B:GBg(B 10$B8D$^$G;XDj$G$-$^$9!#(B + + <$BNc(B> + .guide.hiragana $B%m!<%^(B + + $B>e5-$NNc$OF~NOJ8;ze5-$NNc$OF~NOJ8;zl9g$d(B inlude key (<4>[3] 51. $B;2>H(B) + $B$K$h$C$F%M%9%H$r9T$C$?>l9g$O8e$K;XDj$5$l$?$b$N$,M-8z$K$J$j$^$9!#(B + +<4> sjrc $B%U%!%$%k$K$h$k%f!<%6!&%$%s%?!<%U%'!<%9$N%+%9%?%$%^%$%:(B + + [1] $BJQ49A`:n$N%-!uBV$K$h$C$F0[$J$k%U%!%s%/%7%g%s$r(B + $BF1$8%-!e0L8_49@-$r0];}$7$F$$$^$9!#(B + + Xsj3clib $B$r;HMQ$7$?(B kinput2 $B$N(B sj3 $BHG$G$O(B sj2/sj3/sjx $B$H$O0[$J$k(B + $B%-!e$7$F$$$^$9!#(B + format $B$O0J2<$N$h$&$K#4$D$N%(%s%H%j(B(2 keyword + 3 value)$B$+$i$J$j!"(B + $B:G8e$N(B [InputSame] $B$N%U%#!<%k%I$O>JN,2DG=$G$9!#(B + + .ki2key.[$B%U%!%s%/%7%g%sL>(B] [$BJQ49(B Mode/Modifier] [KeySym] [InputSame] + + (1) $B#2HVL\$N(B keyword[$B%U%!%s%/%7%g%sL>(B] $B$N%U%#!<%k%I$N;XDj(B + + $B%U%!%s%/%7%g%sL>$K$O(B[$BJQ49(B Mode/Modifier]$B$N%U%#!<%k%I$G;XDj$9$k(B + $BF~NO$5$l$k%-!$7$F$$$k!"$b$7$/$O8=:_%F%-%9%H(B + $B%+!<%=%k$N$"$kJ8@a$r;X$7$^$9!#!K(B + + $B;XDj$G$-$k%U%!%s%/%7%g%s$H$=$l$N3FJQ49%b!<%I$G$NF0:n$O(B + $B0J2<$K@bL@$9$k$H$*$j$G$9!#(Bsource $BCf$N(B lib/Xsj3lib/func.c + $B$N%3%a%s%H$b;29M$K$9$k$H$h$$$G$7$g$&!#(B + +------------------------------------------------------------------------------ +henkan [InputMode] $BF~NO%P%C%U%!$NJ8;zNs$r0l3gJQ49$7!"(BConvedMode $B$K$7$^$9(B + [ConvedMode] $B%+%l%s%HJQ498uJd$N0lMw$rI=<($7$F!"(BSelectMode $B$K$7$^$9(B + [NoInputMode/SelectMode/DictMode] $B%(%i!<$G$"$k$3$H$r(B + $BL@<($9$k$?$a%Y%k$rLD$i$7$^$9(B + $B!|(B [InputMode] $B$N;~$KJQ49$5$l$kJ8@a$O8e=R$N(B .HenkanSegment $B$N(B + $B;XDj$G7h$^$j$^$9(B + $B!|(B [InputMode] $B$N;~$KJQ498e$KCmL\$9$kJ8@a$O8e=R$N(B + .BeginConversionLast $B$N;XDj$G7h$^$j$^$9(B + $B!|(B [InputMode] $B$N;~$K%+%l%s%H$NJ8@aCf$K$R$i$,$J0J30$NJ8;zl9g!"(B + $B%+%l%s%HJ8@a$NJ8;z8e(B .BeginConversionLast $B$,(B none $B$G%+!<%=%k0LCV(B + $B$,:G8e$K$"$C$FCmL\$9$kJ8@a$,$J$$$H$-$O!"<+F0E*$K#1$DA0$NJ8@a$K(B + $B0\F0$7$F$+$iF0:n$r3+;O$7$^$9!#(B + $B!|%b!<%II=<($rJQ99$9$k$+$I$&$+$O8e=R$N(B .DisplayModeChange + $B$N;XDj$G7h$^$j$^$9(B +------------------------------------------------------------------------------ +convert "henkan" $B$HF1$8$G$9(B +------------------------------------------------------------------------------ +muhen [NoInputMode] $BL5;k$7$^$9(B + [InputMode/ConvedMode] $B$+$J4A;zJQ49A0$N>uBV$KLa$7!"(BInputMode $B$K$7$^$9(B + [SelectMode] $B8uJd0lMw$r%]%C%W%@%&%s$7!"$+$J4A;zJQ49A0$N>uBV$KLa$7!"(B + InputMode $B$K$7$^$9(B + [DictMode] $BFI$_F~NO%&%#%s%I%&$r$r%]%C%W%@%&%s$7!"$+$J4A;zJQ49A0$N(B + $B>uBV$KLa$7!"(BInputMode $B$K$7$^$9(B + $B!|(B .MoveBySegment $B$N;XDj$,(B InputMode $B$KBP$7$F(B on $B$N;~$O(B + InputMode $B$KLa$7$F$b$=$N$^$^%+%l%s%HJ8@a$K$O(B + $BJ8;zF~NO2DG=$K$J$j$^$;$s!#$3$N$H$-$KDL>o$NJ8;zF~NO$N(B + $B%-!<$r2!$7$?$H$-$NF0:n$O8e=R$N(B .FlushInConversion $B$N(B + $B;XDj$G7h$^$j$^$9(B + $B!|L5JQ49>uBV$K$5$l$kJ8@a$O8e=R$N(B .MuhenkanSegment $B$N;XDj$G7h$^$j$^$9(B + $B!|L5JQ498e$N%F%-%9%H%+!<%=%k$N0LCV$O(B .MuhenkanCursorLast $B$N;XDj$G(B + $B7h$^$j$^$9(B + $B!|%b!<%II=<($rJQ99$9$k$+$I$&$+$O8e=R$N(B .DisplayModeChange + $B$N;XDj$G7h$^$j$^$9(B +------------------------------------------------------------------------------ +unconvert "muhen" $B$HF1$8$G$9(B +------------------------------------------------------------------------------ +kettei [NoInputMode] $BL5;k$7$^$9(B + [InputMode/ConvedMode] $BJQ49Cf$NJ8;zNs$r3NDj$7$^$9(B + [DictMode] $BF~NO$7$?FI$_$dEPO?!?Ku>C$9$kJ8@a$ND9$5$r3NDj$7!"(B + $B$^$?$O3NG'$N>l9g$OA`:n$rB39T$7$^$9(B + [SelectMode] $BA*BrCf(B($BH?E>$7$F$$$k(B)$B$NJ8;zNs$rA*Br$7$FJ8$r3NDj$7$^$9(B + $B$?$@$7IJ;lA*Br$N>l9g$O(B select $B$HF1$8$G$9(B + $B!|$$$:$l$N>l9g$b3NDj8e$O(B NoInputMode $B$K$J$j$^$9(B + $B!|%b!<%II=<($rJQ99$9$k$+$I$&$+$O8e=R$N(B .DisplayModeChange + $B$N;XDj$G7h$^$j$^$9(B +------------------------------------------------------------------------------ +flush "kettei" $B$HF1$8$G$9(B +------------------------------------------------------------------------------ +fix "kettei" $B$HF1$8$G$9(B +------------------------------------------------------------------------------ +return [NoInputMode] $B2~9T$7$^$9(B + [InputMode] $BJQ49Cf$NJ8;zNs$r3NDj$7!"8=:_$N%+!<%=%k0LCV$G2~9T$7$^$9(B + [ConvedMode] $BJQ49Cf$NJ8;zNs$r3NDj$7!"8=:_CmL\$7$F$$$kJ8@a$N8e$G(B + $B2~9T$7$^$9(B + [SelectMode] $B8uJdA*BrCf$N$H$-$OA*BrCf(B($BH?E>$7$F$$$k(B)$B$NJ8;zNs$rA*Br$7$F(B + ConvedMode $B$KLa$j$^$9(B $B5-9fA*BrCf$N;~$OA*BrCf$N5-9f$r(B + $BA*Br$7$F(B InputMode $B$KLa$j$^$9(B $BIJ;lA*BrCf$N;~$OA*BrCf$N(B + $BIJ;l$rA*Br$7$F(B DictMode$B!J3NG'%b!<%I!K$KLa$j$^$9(B + [DictMode] $BHO0OA*Br!?FI$_F~NO;~$OHO0O!?FI$_$r3NDj$7$^$9(B + $B$^$?$N3NG';~$N>l9g$OA`:n$rB39T$7$^$9(B + $B!|(B[InputMode/ConvedMode] $B$G$O3NDj8e$O(B NoInputMode $B$K$J$j$^$9(B + $B!|%b!<%II=<($rJQ99$9$k$+$I$&$+$O8e=R$N(B .DisplayModeChange + $B$N;XDj$G7h$^$j$^$9(B +------------------------------------------------------------------------------ +halpha [NoInputMode/InputMode/ConvedMode/DictMode] $BJ8;z3Q%"%k%U%!%Y%C%H$K$7$^$9(B + [SelectMode] $B%(%i!<$G$"$k$3$H$rL@<($9$k$?$a%Y%k$rLD$i$7$^$9(B + $B!|8=:_$NF~NOJ8;zl9g$O%b!<%II=<($,JQ$o$j$^$9(B + $B!|F~NOJ8;zl9g$O%b!<%II=<($,JQ$o$j$^$9(B + $B!|F~NOJ8;z3Q%+%?%+%J$K$7$^$9(B + [SelectMode] $B%(%i!<$G$"$k$3$H$rL@<($9$k$?$a%Y%k$rLD$i$7$^$9(B + $B!|8=:_$NF~NOJ8;zl9g$O%b!<%II=<($,JQ$o$j$^$9(B + $B!|F~NOJ8;zl9g$O%b!<%II=<($,JQ$o$j$^$9(B + $B!|F~NOJ8;zl9g$O%b!<%II=<($,JQ$o$j$^$9(B + $B!|F~NOJ8;z3Q%"%k%U%!%Y%C%H$K$7$^$9!J5U%m!<%^;z$+$JJQ49$r$7$^$9!K(B + [SelectMode] $B%(%i!<$G$"$k$3$H$rL@<($9$k$?$a%Y%k$rLD$i$7$^$9(B +------------------------------------------------------------------------------ +tozalpha[NoInputMode/InputMode/ConvedMode/DictMode] $B8e=R$N(B + .ModeConversion $B$N;XDj$K4X78$J$/I=<(J8;z3Q%+%?%+%J$K$7$^$9(B + $B!J%m!<%^;z$+$JJQ49$r$7$^$9!K(B + [SelectMode] $B%(%i!<$G$"$k$3$H$rL@<($9$k$?$a%Y%k$rLD$i$7$^$9(B +------------------------------------------------------------------------------ +tozkatakana[NoInputMode/InputMode/ConvedMode/DictMode] $B8e=R$N(B + .ModeConversion $B$N;XDj$K4X78$J$/I=<(J8;z.J8;z$K$7$^$9(B + [SelectMode] $B%(%i!<$G$"$k$3$H$rL@<($9$k$?$a%Y%k$rLD$i$7$^$9(B +------------------------------------------------------------------------------ +sjis [NoInputMode/InputMode/ConvedMode/DictMode] $BF~NO%b!<%I$r(B + Shift-JIS $B%3!<%IF~NO$K$7!"%b!<%II=<($rJQ$($^$9(B + [SelectMode] $B%(%i!<$G$"$k$3$H$rL@<($9$k$?$a%Y%k$rLD$i$7$^$9(B + $B!|F~NO%3!<%I$rJQ99$7$?$H$-$K3NDj$9$k$+$I$&$+$O(B + $B8e=R$N(B .FlushAfterConversion $B$N;XDj$G7h$^$j$^$9(B +------------------------------------------------------------------------------ +euc [NoInputMode/InputMode/ConvedMode/DictMode] $BF~NO%b!<%I$r(B + EUC $B%3!<%IF~NO$K$7!"%b!<%II=<($rJQ$($^$9(B + [SelectMode] $B%(%i!<$G$"$k$3$H$rL@<($9$k$?$a%Y%k$rLD$i$7$^$9(B + $B!|F~NO%3!<%I$rJQ99$7$?$H$-$K3NDj$9$k$+$I$&$+$O(B + $B8e=R$N(B .FlushAfterConversion $B$N;XDj$G7h$^$j$^$9(B +------------------------------------------------------------------------------ +jis [NoInputMode/InputMode/ConvedMode/DictMode] $BF~NO%b!<%I$r(B + JIS $B%3!<%IF~NO$K$7!"%b!<%II=<($rJQ$($^$9(B + [SelectMode] $B%(%i!<$G$"$k$3$H$rL@<($9$k$?$a%Y%k$rLD$i$7$^$9(B + $B!|F~NO%3!<%I$rJQ99$7$?$H$-$K3NDj$9$k$+$I$&$+$O(B + $B8e=R$N(B .FlushAfterConversion $B$N;XDj$G7h$^$j$^$9(B +------------------------------------------------------------------------------ +kuten [NoInputMode/InputMode/ConvedMode/DictMode] $BF~NO%b!<%I$r(B + $B6hE@%3!<%IF~NO$K$7!"%b!<%II=<($rJQ$($^$9(B + [SelectMode] $B%(%i!<$G$"$k$3$H$rL@<($9$k$?$a%Y%k$rLD$i$7$^$9(B + $B!|F~NO%3!<%I$rJQ99$7$?$H$-$K3NDj$9$k$+$I$&$+$O(B + $B8e=R$N(B .FlushAfterConversion $B$N;XDj$G7h$^$j$^$9(B +------------------------------------------------------------------------------ +code [NoInputMode/InputMode/ConvedMode/DictMode] $B%m!<%^;z!?$+$JF~NO(B + $B%b!<%I$N;~$O=i4|%3!<%IF~NO$N%b!<%I$K$7!"%3!<%IF~NO%b!<%I(B + $B$N;~$OF~NO$9$k%3!<%I$r(B RoolDown $B$7!"%b!<%II=<($rJQ$($^$9(B + [SelectMode] $B%(%i!<$G$"$k$3$H$rL@<($9$k$?$a%Y%k$rLD$i$7$^$9(B + $B!|=i4|%3!<%IF~NO$N%3!<%I$HF~NO%3!<%I$N(B RoolDown $B$9$k=gHV$O(B + $B8e=R$N(B .DefaultCode $B$N;XDj$G7h$^$j$^$9(B + $B!|F~NO%3!<%I$rJQ99$7$?$H$-$K3NDj$9$k$+$I$&$+$O(B + $B8e=R$N(B .FlushAfterConversion $B$N;XDj$G7h$^$j$^$9(B +------------------------------------------------------------------------------ +modedown[NoInputMode/InputMode/ConvedMode/DictMode] $BF~NOJ8;zl9g$O%b!<%II=<($rJQ$($^$9(B + [SelectMode] $B%(%i!<$G$"$k$3$H$rL@<($9$k$?$a%Y%k$rLD$i$7$^$9(B + $B!|8=:_$NF~NOJ8;zl9g$O%b!<%II=<($rJQ$($^$9(B + [SelectMode] $B%(%i!<$G$"$k$3$H$rL@<($9$k$?$a%Y%k$rLD$i$7$^$9(B + $B!|8=:_$NF~NOJ8;zuBV$r4^$`!K$O$R$i$,$J$K$7!"(B + $B$R$i$,$J$N$H$-$OA43Q%+%?%+%J$K$7!"A43Q%+%?%+%J$N;~$O(B + $B8e=R$N(B .MuhenkanInEdit $B$G;XDj$5$l$F$$$kJ8;z$7$F$$$k!KJ8@a$^$?$O%F%-%9%H(B + $B%+!<%=%k$r#1$D8e$m$NJ8@a!?J8;z$K0\F0$7$^$9(B + [SelectMode] $B8=:_A*BrCf$NJQ498uJd(B($B5-9f!?IJ;l(B)$B$r#1$D1&$N$b$N$K0\$7$^$9(B + [DictMode] $BH?E>$7$F$$$kJ8@a$,#1$D$@$1$N;~!"%+%l%s%H!JH?E>$7$F$$$k!K(B + $BJ8@a$r#1$D8e$K0\$7!"J#?t$NJ8@a$,A*Br!JH?E>!K$5$l$F$$$k$H$-$O(B + $B%(%i!<$G$"$k$3$H$rL@<($9$k$?$a%Y%k$rLD$i$7$^$9(B + $B!|(B [InputMode/ConvedMode] $B$G$N0\F0C10L$rJ8@aC10L$K$9$k$+J8;zC10L$K(B + $B$9$k$+$O8e=R$N(B .MoveBySegment $B$N;XDj$G7h$^$j$^$9(B + $B!|(B $BJ8@aC10L$G0\F0$9$k>l9g!"0\F0$G$-$k:G8e$NJ8@a$N0LCV$O(B + $B8e=R$N(B .BeginConversionLast $B$G7h$^$j$^$9(B + $B!|(B $B%+%l%s%HJ8@a!?%+!<%=%k$N$"$kJ8;z$,:G8e$NJ8@a!?J8;z$N;~(B + $B:G=i$NJ8@a!?J8;z$X0\F0$9$k$+$I$&$+$O8e=R$N(B + .MoveLoop $B$N;XDj$G7h$^$j$^$9(B +------------------------------------------------------------------------------ +right "forward" $B$HF1$8$G$9(B +------------------------------------------------------------------------------ +backward[NoInputMode] $BL5;k$7$^$9(B + [InputMode/ConvedMode] $B%+%l%s%H!JH?E>$7$F$$$k!KJ8@a$^$?$O%F%-%9%H(B + $B%+!<%=%k$r#1$DA0$N$NJ8@a!?J8;z$K0\F0$7$^$9(B + [SelectMode] $B8=:_A*BrCf$N8uJd(B($B5-9f!?IJ;l(B)$B$r#1$D:8$N$b$N$K0\$7$^$9(B + [DictMode] $BH?E>$7$F$$$kJ8@a$,#1$D$@$1$N;~!"%+%l%s%H!JH?E>$7$F$$$k!K(B + $BJ8@a$r#1$DA0$K0\$7!"J#?t$NJ8@a$,A*Br!JH?E>!K$5$l$F$$$k$H$-$O(B + $B%(%i!<$G$"$k$3$H$rL@<($9$k$?$a%Y%k$rLD$i$7$^$9(B + $B!|(B [InputMode/ConvedMode] $B$G$N0\F0C10L$rJ8@aC10L$K$9$k$+J8;zC10L$K(B + $B$9$k$+$O8e=R$N(B .MoveBySegment $B$N;XDj$G7h$^$j$^$9(B + $B!|(B $B%+%l%s%HJ8@a!?%+!<%=%k$N$"$kJ8;z$,:G=i$NJ8@a!?J8;z$N;~(B + $B:G8e$NJ8@a!?J8;z$X0\F0$9$k$+$I$&$+$O8e=R$N(B + .MoveLoop $B$N;XDj$G7h$^$j$^$9(B +------------------------------------------------------------------------------ +left "backward" $B$HF1$8$G$9(B +------------------------------------------------------------------------------ +top [NoInputMode] $BL5;k$7$^$9(B + [InputMode/ConvedMode] $B%+%l%s%H!JH?E>$7$F$$$k!KJ8@a$rJQ49Cf$NJ8;zNs(B + $B$N0lHV:G=i$NJ8@a$K0\F0$9$k$+!"%F%-%9%H%+!<%=%k$r8=J8@a$N(B + $B:G=i$NJ8;z$K0\F0$7$^$9(B + [SelectMode] $B8=:_A*BrCf$N8uJd(B($B5-9f!?IJ;l(B)$B$rA*BrI=<($N9T$N0lHV:G=i$K(B + $B0\F0$7$^$9(B + [DictMode] $BH?E>$7$F$$$kJ8@a$,#1$D$@$1$N;~!"%+%l%s%H!JH?E>$7$F$$$k!K(B + $BJ8@a$rJ8;zNs$N0lHV:G=i$NJ8@a$K0\F0$7!"J#?t$NJ8@a$,A*Br(B + $B!JH?E>!K$5$l$F$$$k$H$-$O%(%i!<$G$"$k$3$H$rL@<($9$k$?$a%Y%k(B + $B$rLD$i$7$^$9(B + $B!|(B [InputMode/ConvedMode] $B$G$N0\F0C10L$rJ8@aC10L$K$9$k$+J8;zC10L$K(B + $B$9$k$+$O8e=R$N(B .JumpbySegment $B$N;XDj$G7h$^$j$^$9(B +------------------------------------------------------------------------------ +end [NoInputMode] $BL5;k$7$^$9(B + [InputMode/ConvedMode] $B%+%l%s%H!JH?E>$7$F$$$k!KJ8@a$rJQ49Cf$NJ8;zNs(B + $B$N0lHV:G8e$NJ8@a$K0\F0$9$k$+!"%F%-%9%H%+!<%=%k$r8=J8@a$N(B + $B:G8e$NJ8;z$N8e$m$K0\F0$7$^$9(B + [SelectMode] $B8=:_A*BrCf$N8uJd(B($B5-9f!?IJ;l(B)$B$rA*BrI=<($N9T$N0lHV:G8e$K(B + $B0\F0$7$^$9(B + [DictMode] $BH?E>$7$F$$$kJ8@a$,#1$D$@$1$N;~!"%+%l%s%H!JH?E>$7$F$$$k!K(B + $BJ8@a$rJ8;zNs$N0lHV:G8e$NJ8@a$K0\F0$7!"J#?t$NJ8@a$,A*Br!JH?E>!K(B + $B$5$l$F$$$k$H$-$O%(%i!<$G$"$k$3$H$rL@<($9$k$?$a%Y%k$rLD$i$7$^$9(B + $B!|(B [InputMode/ConvedMode] $B$G$N0\F0C10L$rJ8@aC10L$K$9$k$+J8;zC10L$K(B + $B$9$k$+$O8e=R$N(B .JumpbySegment $B$N;XDj$G7h$^$j$^$9(B + $B!|(B $BJ8@aC10L$G0\F0$9$k>l9g!"0\F0$G$-$k:G8e$NJ8@a$N0LCV$O(B + $B8e=R$N(B .BeginConversionLast $B$G7h$^$j$^$9(B +------------------------------------------------------------------------------ +bottom "end" $B$HF1$8$G$9(B +------------------------------------------------------------------------------ +up [NoInputMode/InputMode/ConvedMode/DictMode] $B%(%i!<$G$"$k$3$H$r(B + $BL@<($9$k$?$a%Y%k$rLD$i$7$^$9(B + [SelectMode] $B8=:_A*BrCf$N8uJd(B($B5-9f(B)$B$r#1$D>e$N$b$N$K0\$7$^$9(B +------------------------------------------------------------------------------ +down [NoInputMode/InputMode/ConvedMode/DictMode] $B%(%i!<$G$"$k$3$H$r(B + $BL@<($9$k$?$a%Y%k$rLD$i$7$^$9(B + [SelectMode] $B8=:_A*BrCf$N8uJd(B($B5-9f(B)$B$r#1$D2<$N$b$N$K0\$7$^$9(B +------------------------------------------------------------------------------ +first [ConvedMode] $BJQ49:Q$_$NJ8@a$NFbMF$r0lHV:G=i$N8uJd$N$b$N$K(B + $BCV$-49$($^$9!JJQ498uJd3X=,$OJ8@a0\F0Ey$N:]$K9T$o$l$^$9!K(B + [SelectMode] $B8=:_A*BrCf$N8uJd(B($B5-9f!?IJ;l(B)$B$r8=:_I=<($5$l$F$$$J$$$b$N(B + $B$b4^$a:G=i$N$b$N$K0\F0$7$^$9(B + [NoInputMode/InputMode/DictMode] $B%(%i!<$G$"$k$3$H$rL@<($9$k$?$a(B + $B%Y%k$rLD$i$7$^$9(B +------------------------------------------------------------------------------ +last [ConvedMode] $BJQ49:Q$_$NJ8@a$NFbMF$r0lHV:G8e$N8uJd$N$b$N$K(B + $BCV$-49$($^$9!JJQ498uJd3X=,$OJ8@a0\F0Ey$N:]$K9T$o$l$^$9!K(B + [SelectMode] $B8=:_A*BrCf$N8uJd(B($B5-9f!?IJ;l(B)$B$r8=:_I=<($5$l$F$$$J$$$b$N(B + $B$b4^$a:G8e$N$b$N$K0\F0$7$^$9(B + [NoInputMode/InputMode/DictMode] $B%(%i!<$G$"$k$3$H$rL@<($9$k$?$a(B + $B%Y%k$rLD$i$7$^$9(B +------------------------------------------------------------------------------ +nextp [NoInputMode/InputMode/ConvedMode/DictMode] $B%(%i!<$G$"$k$3$H$r(B + $BL@<($9$k$?$a%Y%k$rLD$i$7$^$9(B + [SelectMode] $B8=:_A*BrCf$N8uJd(B($B5-9f!?IJ;l(B)$B$rA*BrI=<($r$7$F$$$k(B)$B$NJ8;zNs$rA*Br$7$F(B + ConvedMode $B$KLa$j$^$9(B $B5-9fA*BrCf$N;~$OA*BrCf$N5-9f$r(B + $BA*Br$7$F(B InputMode $B$KLa$j$^$9(B $BIJ;lA*BrCf$N;~$OA*BrCf$N(B + $BIJ;l$rA*Br$7$F(B DictMode$B!J3NG'%b!<%I!K$KLa$j$^$9(B(return $B$HF1$8(B) +------------------------------------------------------------------------------ +cancel [NoInputMode] $BL5;k$7$^$9(B + [InputMode/ConvedMode] $B8=:_JQ49Cf!"$NJ8;zNs$r%-%c%s%;%k$7!"(B + NoInputMode $B$K$7$^$9(B + [SelectMode] $B8uJdA*BrCf$N$H$-$O8uJdA*Br!JJQ99!KF0:n$r9T$o$:$K(B + ConvedMode $B$KLa$j$^$9(B $B5-9fA*BrCf$N;~$OA*BrCf$N5-9f$r(B + $BA*Br$;$:$K(B NoInputMode $B$^$?$O(B InputMode $B$KLa$j$^$9(B + $BIJ;lA*BrCf$N;~$O(B DictMode($BFI$_F~NO!?HO0OA*Br!K$KLa$j$^$9(B + [DictMode] $BFI$_F~NO!?HO0OA*Br;~$OF~NOCf$NJ8;z$r%-%c%s%;%k$7!"(B + ConvedMode $B$K$7$^$9(B + $B3NG'%b!<$G$G$OFI$_F~NO!?HO0OA*Br$N;~E@$KLa$j$^$9(B +------------------------------------------------------------------------------ +kakucyou[NoInputMode/SelectMode] $B%(%i!<$G$"$k$3$H$rL@<($9$k$?$a(B + $B%Y%k$rLD$i$7$^$9(B + [InputMode/ConvedMode] $B%+%l%s%HJ8@a$r#1J8;z?-$P$7$^$9(B + [DictMode] $B8=:_H?E>$7$F$$$k:G8e$NJ8@a$H$5$;!"A*Br$7$^$9(B + $B!|3HD%ItJ,$NI=<(J8;z$7$F$$$k:G8e$NJ8@a72$N$&$A$H:G8e$N$NJ8@a$N(B + $BH?E>$r2r>C$7$^$9(B $BH?E>$7$F$$$kJ8@a$,$R$H$D$7$+$J$$$H$-$O(B + $B%Y%k$rLD$i$7$^$9(B + $B!|=L>.ItJ,$NI=<(J8;z.ItJ,$rl9g!"8=J8@a$rA0J8@a$H9gJ;$9$k$+$I$&$+$O(B + $B8e=R$N(B .ShrinkAll $B$N;XDj$K$h$C$F7h$^$j$^$9(B +------------------------------------------------------------------------------ +shrink "syukusyou" $B$HF1$8$G$9(B +------------------------------------------------------------------------------ +backspace[NoInputMode] $BL5;k$7$^$9(B + [InputMode/ConvedMode] $B%F%-%9%H%+!<%=%k$N$"$k0LCV$ND>A0$N#1J8;z$+!"(B + $B%+%l%s%H!JH?E>$7$F$$$k!KJ8@a$ND>A0$NJ8@a$r>C5n$7$^$9(B + [SelectMode] $BA*BrF0:n$r$;$:$KA*BrI=<($r%]%C%W%@%&%s$7$F(B + $BJQ498uJdA*Br$N$H$-$O(B ConvedMode $B$K!"5-9fA*Br$N$H$-$O(B NoInputMode + $B$+(B InputMode $B$K!"IJ;lA*Br$N$H$-$O(B DictMode($BFI$_F~NO%b!<%I(B)$B$KLa$j!"(B + $B$=$l$>$l$N%b!<%I$G$NF0:n$r9T$$$^$9(B + [DictMode] $BHO0O;XDj!?FI$_F~NO;~$K$OF~NO$5$l$?FI$_J8;zNs(B + $B$N:G8e$NJ8;z$r#1J8;z$r>C5n$7!"$=$l0J30$N%b!<%I$N$H$-$O!"(B + $BL5;k$7$^$9(B + $B!|(B [InputMode/ConvedMode] $B$G$N>C5nC10L$rJ8@aC10L$K$9$k$+J8;zC10L$K(B + $B$9$k$+$O8e=R$N(B .DeleteBySegment $B$N;XDj$G7h$^$j$^$9(B + $B!|(B .DeleteBySegment off $B$N$H$-$GJQ49:Q$_$N>l9g$OL5JQ49>uBV$K(B + $BLa$7$?$&$($GJ8;zC10L$G>C5n$7$^$9$,!"$3$N$H$-L5JQ49>uBV$K(B + $BLa$9HO0O$O8e=R$N(B .DeleteChangeSegment $B$N;XDj$G7h$^$j$^$9(B + $B!|(B $B8uJdA*Br$G$N>uBV(B[SelectMode]$B$G8e=R$N(B .SelectBackSpaceMove $B$,(B + on $B$N;~$OD>A0$NJ8@a$G$O$J$/!"%+%l%s%HJ8@a$KBP$7$F(B + backspace $B$NF0:n$r3+;O$7$^$9(B +------------------------------------------------------------------------------ +delete [NoInputMode] $BL5;k$7$^$9(B + [InputMode/ConvedMode] $B%F%-%9%H%+!<%=%k$N$"$k0LCV$N#1J8;z$+(B + $B%+%l%s%H!JH?E>$7$F$$$k!KJ8@a$r>C5n$7$^$9(B + [SelectMode] $BA*BrF0:n$r$;$:$KA*BrI=<($r%]%C%W%@%&%s$7$F(B + $BJQ498uJdA*Br$N$H$-$O(B ConvedMode $B$K!"5-9fA*Br$N$H$-$O(B NoInputMode + $B$+(B InputMode $B$K!"IJ;lA*Br$N$H$-$O(B DictMode($BFI$_F~NO%b!<%I(B)$B$KLa$j!"(B + $B$=$l$>$l$N%b!<%I$G$NF0:n$r9T$$$^$9(B + [DictMode] $BL5;k$7$^$9(B + $B!|(B [InputMode/ConvedMode] $B$G$N>C5nC10L$rJ8@aC10L$K$9$k$+J8;zC10L$K(B + $B$9$k$+$O8e=R$N(B .DeleteBySegment $B$N;XDj$G7h$^$j$^$9(B + $B!|(B .DeleteBySegment off $B$N$H$-$G(B ConvedMode $B$N>l9g$OL5JQ49>uBV$K(B + $BLa$7$?$&$($GJ8;zC10L$G>C5n$7$^$9$,!"$3$N$H$-L5JQ49>uBV$K(B + $BLa$9HO0O$O8e=R$N(B .DeleteChangeSegment $B$N;XDj$G7h$^$j$^$9(B + $B$?$@$7!"(B.MuhenkanCursorLast $B$N;XDj$K$O0MB8$;$:!"%+!<%=%k0LCV$O(B + $B>o$KL5JQ49>uBV$KLa$5$l$?J8;zNs$N@hF,$K$J$j$^$9!#(B + $B!|(B $B>C5n$7$?J8@a$,:G8e$NJ8@a$@$C$?$H$-$K%+%l%s%HJ8@a$r0\F0$9$k$+(B + $B$I$&$+$O8e=R$N(B .DeleteLastMove $B$N;XDj$G7h$^$j$^$9(B +------------------------------------------------------------------------------ +delafter[NoInputMode/DictMode] $BL5;k$7$^$9(B + [InputMode/ConvedMode] $B%F%-%9%H%+!<%=%k$N$"$k0LCV$+$i8e$m$N(B + $B%+%l%s%HJ8@a!"$^$?$O%+%l%s%HJ8@a$r4^$a$?$=$l0J9_$NJQ49Cf$N(B + $BJ8;zNs$r>C5n$7$^$9(B + [SelectMode] $BA*BrF0:n$r$;$:$KA*BrI=<($r%]%C%W%@%&%s$7$F(B + $BJQ498uJdA*Br$N$H$-$O(B ConvedMode $B$K!"5-9fA*Br$N$H$-$O(B NoInputMode + $B$+(B InputMode $B$K!"IJ;lA*Br$N$H$-$O(B DictMode($BFI$_F~NO%b!<%I(B)$B$KLa$j!"(B + $B$=$l$>$l$N%b!<%I$G$NF0:n$r9T$$$^$9(B + $B!|(B $B>C5n$9$kHO0O$r%+%l%s%HJ8@a0J9_A4$F$NJ8;zNs$K$9$k$+!"(B + $B%+%l%s%HJ8@aCf$N%F%-%9%H%+!<%=%k$h$j$"$H$NItJ,$K(B + $B$9$k$+$O8e=R$N(B .KillBySegment $B$N;XDj$G7h$^$j$^$9(B + $B!|(B $BJ8@aC10L$G:G8e$NJ8@a$r>C5n$7$?8e$K%+%l%s%HJ8@a$r(B + $B#1$DA0$K0\F0$9$k$+$I$&$+$O8e=R$N(B .DeleteLastMove $B$N;XDj(B + $B$G7h$^$j$^$9(B +------------------------------------------------------------------------------ +start [NoInputMode/InputMode/ConvedMode] $BJQ49$r=*N;$7$^$9(B + [SelectMode] $BA*BrCf(B($BH?E>$7$F$$$k(B)$B$NJ8;zNs$rA*Br$7$FJQ49$r=*N;$7$^$9(B + [DictMode] $BHO0O!?FI$_7hDjCf$O<-=qEPO?!?Ku>C$r2r>C$7$FJQ49$r=*N;$7$^$9(B + $B!|JQ49=*N;;~$KJQ49Cf$NJ8;zNs$r3NDj$9$k$+$I$&$+$O8e=R$N(B + .FlushEndConversion $B$N;XDj$G7h$^$j$^$9(B + $B!|%b!<%II=<($rJQ99$9$k$+$I$&$+$O8e=R$N(B .DisplayModeChange + $B$N;XDj$G7h$^$j$^$9(B +------------------------------------------------------------------------------ +reconnect[InputMode/ConvedMode/SelectMode/DictMode] $B8=:_JQ49Cf!"(B + first server $B$+(B second server $B$+$I$A$i$+$K:F@\B32DG=$J$i$P(B + $B:F@\B3$7!"(BNoInputMode $B$K$7$^$9(B + $B:F@\B3$K<:GT$7$?>l9g(B kinput2 $B$r=*N;$7$^$9(B + $B!|%b!<%II=<($rJQ99$9$k$+$I$&$+$O8e=R$N(B .DisplayModeChange + $B$N;XDj$G7h$^$j$^$9(B +------------------------------------------------------------------------------ +saihenkan[InputMode/ConvedMode/SelectMode/DictMode] $B%(%i!<$G$"$k$3$H$r(B + $BL@<($9$k$?$a%Y%k$rLD$i$7$^$9(B + [NoInputMode] $BD>A0$K3NDj$7$?J8;zNs$r:FEY8F$S=P$7$FJT=82DG=$K(B + $B$7$^$9(B $B;w$?$h$&$JJQ49$r2?EY$b9T$C$?$j!"$J$s$i$+$N860x$G(B + $BJQ49%5!<%P$,%@%&%s$7$?$H$-$K:F@\B3A0$KJQ49Cf$@$C$?J8;zNs$r(B + $B8F$S=P$9$N$K$OJXMx$J5!G=$G$9(B + $B!|:FEYJQ49J8;zNs$r8F$S=P$9:]$KCmL\$9$kJ8@a$N0LCV$O8e=R$N(B + .BeginConversionLast $B$N;XDj$G7h$^$j$^$9(B +------------------------------------------------------------------------------ +reconvert "saihenkan" $B$HF1$8$G$9(B +------------------------------------------------------------------------------ +edit [NoInputMode] $BL5;k$7$^$9(B + [InputMode/ConvedMode] $B%+%l%s%HJ8@a$r$+$J4A;zJQ49A0$N>uBV$KLa$7!"(B + InputMode $B$K$7!"(B + [SelectMode] $B8uJd0lMw$r%]%C%W%@%&%s$7!"%+%l%s%HJ8@a$r(B + $B$+$J4A;zJQ49A0$N>uBV$KLa$7!"(BInputMode $B$K$7$^$9(B + [DictMode] $BFI$_F~NO%&%#%s%I%&$r$r%]%C%W%@%&%s$7!"%+%l%s%HJ8@a$r(B + $B$+$J4A;zJQ49A0$N>uBV$KLa$7!"(BInputMode $B$K$7$^$9(B + $B!|(Bmuhen/unconvert $B$H0[$J$kE@$O(B .MuhenkanSegment $B$N;XDj(B + $B$K4X78$J$/>o$K%+%l%s%HJ8@a#1J8@a$N$_$+$J4A;zJQ49A0(B + $B$N>uBV$KLa$7!"99$K(B .MoveBySegment $B$N;XDj$,(B InputMode $B$KBP$7$F(B + on $B$N;~$G$bJ8;zF~NO2DG=$K$9$kE@$G$9!#(B + $B!|L5JQ498e$N%F%-%9%H%+!<%=%k$N0LCV$O(B .EditCursorLast $B$N;XDj$G(B + $B7h$^$j$^$9(B + $B!|%b!<%II=<($rJQ99$9$k$+$I$&$+$O8e=R$N(B .DisplayModeChange + $B$N;XDj$G7h$^$j$^$9(B +------------------------------------------------------------------------------ +toroku [InputMode/ConvedMode] $B<-=qEPO?$r3+;O$7!"(BDictMode $B$K$7$^$9(B + [NoInputMode/SelectMode/DictMode] $B%(%i!<$G$"$k$3$H$r(B + $BL@<($9$k$?$a%Y%k$rLD$i$7$^$9(B + $B!|%b!<%II=<($rJQ99$9$k$+$I$&$+$O8e=R$N(B .DisplayModeChange + $B$N;XDj$G7h$^$j$^$9(B +------------------------------------------------------------------------------ +register "toroku" $B$HF1$8$G$9(B +------------------------------------------------------------------------------ +syoukyo [InputMode/ConvedMode] $B<-=q$+$i$NKu>C$r3+;O$7!"(BDictMode $B$K$7$^$9(B + [NoInputMode/SelectMode/DictMode] $B%(%i!<$G$"$k$3$H$r(B + $BL@<($9$k$?$a%Y%k$rLD$i$7$^$9(B + $B!|%b!<%II=<($rJQ99$9$k$+$I$&$+$O8e=R$N(B .DisplayModeChange + $B$N;XDj$G7h$^$j$^$9(B +------------------------------------------------------------------------------ +eliminate "syoukyo" $B$HF1$8$G$9(B +------------------------------------------------------------------------------ +symbol [NoInputMode/InputMode/ConvedMode] $B5-9fA*Br$r3+;O$7!"(B + SelectMode $B$K$7$^$9(B + [SelectMode/DictMode] $B%(%i!<$G$"$k$3$H$rL@<($9$k$?$a%Y%k$rLD$i$7$^$9(B + $B!|5-9fA*Br3+;O;~$KJQ49Cf$NJ8;zNs$r3NDj$9$k$+$I$&$+$O8e=R$N(B + .FlushInConverion $B$N;XDj$G7h$^$j$^$9(B + $B!|(BConvedMode $B$N>l9g!"A*Br3+;O;~$K3NDj$9$k$+!"L5JQ49>uBV$K$9$k$+!"(B + $B?7$?$JJ8@a$H$7$FF~NO$9$k$+$I$&$+$O(B FlushInConversion $B$N;XDj$G(B + $B$G7h$^$j$^$9(B +------------------------------------------------------------------------------ +quote [NoInputMode/InputMode/ConvedMode/SelectMode/DictMode] + $Br7o$KF~NO$7$^$9(B + $B!|DL>o$O%3%s%m!<%k%3!<%I$OJQ49J8;zNs$KF~NO$5$l$^$;$s$,!"(B + $B$3$N>l9g$Or7o$K(B + $BF~NO$r5v$7$^$9(B + $B!|$l!"8uJdA*Br$N>l9g$O(B + ConvedMode $B$K5-9fA*Br$N$H$-$O(B NoInputMode/InputMode $B$K(B + $BIJ;lA*Br$N>l9g$O(B DictMode $B$KLa$j!"$=$l$>$l$NJQ49%b!<%I$N$H$-$N(B + $BF0:n$r$7$^$9!#(B + $B!|ItJ,3NDj$9$kA0$KL5JQ49>uBV$K$K$9$k$+!"$^$?!"L5JQ49>uBV$K$K$9$k(B + $BNN0h$O8e=R$N(B .FlushChangeSegment $B$N;XDj$G7h$^$j$^$9(B + $B!|L5JQ498e$N%F%-%9%H%+!<%=%k$N0LCV$O(B .FlushCursorLast $B$N;XDj$G(B + $B7h$^$j$^$9(B + $B!|%b!<%II=<($rJQ99$9$k$+$I$&$+$O8e=R$N(B .DisplayModeChange + $B$N;XDj$G7h$^$j$^$9(B +------------------------------------------------------------------------------ +bell [NoInputMode/InputMode/ConvedMode/SelectMode/DictMode] + $B%Y%k$rLD$i$7$^$9(B +------------------------------------------------------------------------------ +kana [NoInputMode/InputMode/ConvedMode/SelectMode/DictMode] + $B$+$J%-!<%\!<%IF~NO$H%"%9%-!<%-!<%\!<%IF~NO$r%H%0%k$7$^$9(B + $B!J5?;w$+$J%m%C%/%-!<$H$7$F;HMQ$9$k%-!e=q$-$9$k7A$G(B + ($BFbIt%G%U%)%k%H$K$K$O:F=i4|2=$7$J$$(B) key table + $B$d%+%9%?%$%^%$%:MQ$N%U%i%0$r:F@_Dj$7$^$9!#(B + $B!|:FFI$_9~$_;~$KJQ49Cf$NJ8;zNs$r3NDj$9$k$+$I$&$+$O8e=R$N(B + .FlushEndConversion $B$N;XDj$G7h$^$j$^$9(B + $B!|%b!<%II=<($rJQ99$9$k$+$I$&$+$O8e=R$N(B .DisplayModeChange + $B$N;XDj$G7h$^$j$^$9(B + $B!|%U%!%s%/%7%g%sl9g$=$N%P%$%s%I$r(B + $B%-!$l(B '|' $B$G(B + OR $B$r.J8;z$G!"(B[$BJQ49(B Mode] $B$OBgJ8;z$+$i;O$^$k(B + $BH>3Q%"%k%U%!%Y%C%HJ8;zNs$G;XDj$7$^$9(B + [$BJQ49(B Mode] $B$N;XDjJ}K!$O(B kinput2 sj3 $BHG$N=i4|%P!<%8%g%s$H$O(B + $Be0L8_49@-$O0];}$7$F$$$^$9!#(B + + $BNc(B (Control Key $B$H(B Shift Key $B$,F1;~$K2!$5$lJQ49%b!<%I$,(B + InputMode $B$N$H$-$K(B KeySym $BL>$,(B 'd' $B$N%-!<$,2!$5$l$k$H(B + $B%U%!%s%/%7%g%s(B "toroku" $B$N5!G=$r8F$S=P$9(B + + .ki2key.toroku c|s|I d + .ki2key.toroku control|shift|Input d + + [$BJQ49(B Mode/Modifier] $B$K(B '|' $B$G6h@Z$C$F(B + $B;XDj$G$-$k$b$N$H$=$N0UL#$O0J2<$N$H$*$j$G$9(B + $B;XDj$O:G=i$N#1J8;z$7$+8+$J$$$N$G#1J8;z$K>JN,2DG=$G$9!#(B + $B!J:G=i$N#1J8;z$,(B 'm' $B$N$H$-$O:G8e$N#1J8;z$b$_$^$9!K(B + $B$?$@$7!"BgJ8;z!?>.J8;z$N6hJL$O=EMW$G$9!#(B + + none $BF1;~$K%b%G%#%U%!%$%"%-!<$,$J$K$b2!$5$l$J$$$H$-(B + shift Shift-Key $B$,F1;~$K2!$5$l$?$H$-(B + control Control-Key $B$,F1;~$K2!$5$l$?$H$-(B + mod Mod1-Key (Meta-Key) $B$,F1;~$K2!$5$l$?$H$-(B + lock Lock-Key $B$,F1;~$K2!$5$l$?$H$-(B + mod1 Mod1-Key (Meta-Key) $B$,F1;~$K2!$5$l$?$H$-(B + mod2 Mod2-Key $B$,F1;~$K2!$5$l$?$H$-(B + mod3 Mod3-Key $B$,F1;~$K2!$5$l$?$H$-(B + mod4 Mod4-Key $B$,F1;~$K2!$5$l$?$H$-(B + mod5 Mod5-Key $B$,F1;~$K2!$5$l$?$H$-(B + kana $B$+$J%m%C%/;~$K(B Mode_switch $B$N%-!<$,(B + $B%b%G%#%U%!%$%"$H$7$F%;%C%H$5$l$F$$$k$H$-(B + + NoInput $BJQ49%b!<%I$,(B NoInputMode $B$N;~(B + Input $BJQ49%b!<%I$,(B InputMode $B$N;~(B + Conved $BJQ49%b!<%I$,(B ConvedMode $B$N;~(B + Select $BJQ49%b!<%I$,(B SelectMode $B$N;~(B + Dict $BJQ49%b!<%I$,(B DictMode $B$N;~(B + Output $BJQ49%b!<%I$,(B ConvedMode $B$+(B SelectMode $B$N;~(B ('C|S' $B$HF1$8(B) + Flush $BJQ49%b!<%I$,(B InputMode $B$+(B ConvedMode $B$N;~(B ('I|C' $B$HF1$8(B) + All $B$9$Y$F$NJQ49%b!<%I$N;~(B ('N|I|C|S|D' $B$HF1$8(B) + + $B$?$@$7!"(B[$BJQ49(B Mode/Modifier] $B$N%(%s%H%j$,!"(Bnone$B!"(Bshift$B!"(Bcontrol$B!"(B + mod1$B!"(Block$B!"$NAH9g$;$@$1$G=q$+$l$F$$$k$H$-$O$=$NA`:n$O$9$Y$F$N(B + $BJQ49%b!<%I$N;~$KM-8z$K$J$j$^$9(B( 'All' $B$,(B OR $B$G;XDj$5$l$?$N$H(B + $BF1$8$K$J$k(B) + + [KeySym] $B$N%U%#!<%k%I$K$O(B KeySym $BL>$r;XDj$7$^$9!#(B + $B4V0c$C$?(B keysym $B$r;XDj$9$k$H(B function $B$K(B "ignore" $B$r(B + $B;XDj$9$k$N$HF1$8$K$J$j$^$9!#(B + KeySym $BL>$O(B XKeysymToString(3X11) $B$N%j%?!<%sCM!"(B + xmodmap -pk $B$NI=<(Ey$+$iF@$k$3$H$,$G$-$^$9!#(B + + (3) [InputSame] $B%U%#!<%k%I$N;XDj$N$7$+$?(B + + $B$3$N%U%#!<%k%I$O>JN,2DG=$G!"J8;zF~NO2DG=$J(B + $B%-!l9g$NF0:n;XDj$N(B + $B%j%=!<%9$H$7$F$O8e=R$N(B .InputSameTime $B$b$"$j$^$9$,!"(B + .InputSameTime $B$,A4$F$N%-!l9g$O$3$N%U%#!<%k%I$N;XDj$,M%@h$5$l$^$9!#(B + + $B;XDj$G$-$kCM$H$=$N0UL#$O0J2<$N$H$*$j$G$9!#(B + + on $BJ8;zF~NO$rF1;~$K9T$$$^$9!#(B + off $B%U%!%s%/%7%g%s$NA`:n$N$_l9g!"(B + .ki2key.convert F period on + + .InputSameTime $B$N;XDj$K4X78$J$/!V(B.$B!W$NF~NO$HF1;~$K(B + $B!V!#!W$KJQ49$5$l!"JQ49Cf$NJ8;zNs$KBP$7$F(B convert $B$N(B + $B%U%!%s%/%7%g%s$,e=q$-$9$l$P(B kinput2 $B$G$O(B + $B;HMQ$;$:!"%"%W%j%1!<%7%g%s$K%$%Y%s%H$rEO$9$h$&$K$b$G$-$^$9!#(B + + KeySym $B$H(B Modifier $B%-!<$NAH9g$;$,F1$8$G!"F10l$NJQ49%b!<%I$G(B + $BM-8z$K$J$k$h$&$K;XDj$7$?%-!l9g$O8e$K(B + $B5-=R$5$l$?$b$N$,M-8z$K$J$j$^$9!#(B + +[Function] [Modifier/$BJQ49(B Mode] [Keysym] + +.ki2key.henkan F Select +.ki2key.convert F Select +.ki2key.muhen s|C Cancel +.ki2key.unconvert s|C Cancel +.ki2key.fix F|D Execute +.ki2key.kettei F KP_Enter +.ki2key.flush F Escape +.ki2key.return A Return +.ki2key.halpha A F6 +.ki2key.zalpha A F7 +.ki2key.hkatakana A F8 +.ki2key.zkatakana A F9 +.ki2key.hiragana A F10 +.ki2key.tohalpha s|F F16 +.ki2key.tozalpha s|F F17 +.ki2key.tohkatakana s|F F18 +.ki2key.tozkatakana s|F F19 +.ki2key.tohiragana s|F F20 +.ki2key.zenkaku F F4 +.ki2key.hankaku F F3 +.ki2key.toupper c|F u +.ki2key.tolower c|F l +.ki2key.sjis s|N|F F15 +.ki2key.euc s|N|F F14 +.ki2key.jis s|N|F F13 +.ki2key.kuten s|N|F F12 +.ki2key.code N|F F5 +.ki2key.modedown A Tab +.ki2key.toggle A Tab +.ki2key.modeup s|A Tab +.ki2key.toggleback s|A Tab +.ki2key.nextmode c|F Tab +.ki2key.prevmode s|c|F Tab +.ki2key.muhenkan N|F Cancel +.ki2key.right A Right +.ki2key.forward A Right +.ki2key.left A Left +.ki2key.backward A Left +.ki2key.top c|F|D a +.ki2key.end c|F|D e +.ki2key.bottom c|F|D e +.ki2key.up S Up +.ki2key.down S Down +.ki2key.first c|O Up +.ki2key.last c|O Down +.ki2key.nextp S Select +.ki2key.prevp S Cancel +.ki2key.wrap s|C Down +.ki2key.next s|C Down +.ki2key.wrapback s|C Up +.ki2key.prev s|C Up +.ki2key.select S Execute +.ki2key.cancel S|D Escape +.ki2key.cancel s|F Cancel +.ki2key.kakucyou F|D Up +.ki2key.expand F|D Up +.ki2key.syukusyou F|D Down +.ki2key.shrink F|D Down +.ki2key.backspace F|S|D BackSpace +.ki2key.delete F|S|D Delete +.ki2key.delafter c|F k +.ki2key.start s|A Kanji +.ki2key.reconnect m|s|A Kanji +.ki2key.saihenkan c|N Select +.ki2key.reconvert c|N Select +.ki2key.edit m|C Select +.ki2key.toroku C F1 +.ki2key.register C F1 +.ki2key.syoukyo C F2 +.ki2key.eliminate C F2 +.ki2key.symbol s|N|F Escape +.ki2key.quote c|N|F q + + [2] $B%b!<%II=<(J8;zNs$N%+%9%?%^%$%:J}K!(B + + $B%b!<%II=<(J8;zNs$N%+%9%?%^%$%:(B + $B$O(B sjrc $B%U%!%$%k$G9T$$$^$9!#(B + format $B$O0J2<$N$h$&$K(B $B#1$D$N%(%s%H%j(B(keyword + 1 value) + $B$+$i$J$j$^$9!#(B + + .guide.[$B%b!<%IL>(B] [$B%b!<%II=<(J8;zNs(B] + + (1) [$B%b!<%IL>(B] $B$K;XDj$G$-$k$b$N(B + + $B%b!<%IL>;XDj$G$-$k$b$N$K$O0J2<$N$b$N$,$"$j$^$9(B + hiragana$B!A(Bsyoukyo $B$h$j8e$N$b$N$O(B Xsj3clib $B$G5!G=3HD%$5$l$?$b$N$G$9!#(B + +------------------------------------------------------------------------------ +hiragana $B%m!<%^;zF~NO!?$+$JF~NO%b!<%I$GF~NOJ8;z3Q%+%?%+%J$N$H$-$K(B + $BI=<($9$kJ8;zNs$r;XDj;~$K;XDj$7$^$9(B +------------------------------------------------------------------------------ +zalpha $B%m!<%^;zF~NO%b!<%I$GF~NOJ8;z3Q%"%k%U%!%Y%C%H$N$H$-$K(B + $BI=<($9$kJ8;zNs$r;XDj;~$K;XDj$7$^$9(B +------------------------------------------------------------------------------ +sjis $B%3!<%IF~NO%b!<%I$G(B Shift-JIS $BF~NO$N;~$KI=<($9$kJ8;zNs$r(B + $B;XDj$7$^$9(B +------------------------------------------------------------------------------ +jis $B%3!<%IF~NO%b!<%I$G(B JIS $BF~NO$N;~$KI=<($9$kJ8;zNs$r(B + $B;XDj$7$^$9(B +------------------------------------------------------------------------------ +euc $B%3!<%IF~NO%b!<%I$G(B EUC $BF~NO$N;~$KI=<($9$kJ8;zNs$r(B + $B;XDj$7$^$9(B +------------------------------------------------------------------------------ +kuten $B%3!<%IF~NO%b!<%I$G6hE@%3!<%IF~NO$N;~$KI=<($9$kJ8;zNs$r(B + $B;XDj$7$^$9(B +------------------------------------------------------------------------------ +toroku $B<-=qEPO?$N;~$KI=<($9$kJ8;zNs$r;XDj$7$^$9(B + $B!|EPO?;~$K%b!<%II=<($rJQ99$9$k$+$I$&$+$O8e=R$N(B .DisplayModeChange + $B$N;XDj$G$G7h$^$j$^$9(B +------------------------------------------------------------------------------ +register toroku $B$HF1$8$G$9(B +------------------------------------------------------------------------------ +syoukyo $B<-=qEPO?Ku>C$N;~$KI=<($9$kJ8;zNs$r;XDj$7$^$9(B + $B!|Ku>C;~$K%b!<%II=<($rJQ99$9$k$+$I$&$+$O8e=R$N(B .DisplayModeChange + $B$N;XDj$G$G7h$^$j$^$9(B +------------------------------------------------------------------------------ +eliminate syoukyo $B$HF1$8$G$9(B +------------------------------------------------------------------------------ +kanji $BA4$F$NJ8@a$NJQ49%b!<%I$,(B ConvedMode $B$N$H$-$KI=<($9$kJ8;zNs$r(B + $B;XDj$7$^$9(B + $B!|JQ49;~$K%b!<%II=<($rJQ99$9$k$+$I$&$+$O8e=R$N(B .DisplayModeChange + $B$N;XDj$G$G7h$^$j$^$9(B +------------------------------------------------------------------------------ +edit $BJQ49Cf$NJ8;zNs$KJQ49%b!<%I$,(B InputMode/ConvedMode $BAPJ}$N(B + $BJ8@a$,$"$k$H$-$KI=<($9$kJ8;zNs$r;XDj$7$^$9(B + $B!|%b!<%II=<($rJQ99$9$k$+$I$&$+$O8e=R$N(B .DisplayModeChange + $B$N;XDj$G$G7h$^$j$^$9(B +------------------------------------------------------------------------------ +candidate $BJQ49%b!<%I$,(B SelectMode $B$G8uJdA*Br$N$H$-$K$KI=<($9$kJ8;zNs$r(B + $B;XDj$7$^$9(B + $B!|%b!<%II=<($rJQ99$9$k$+$I$&$+$O8e=R$N(B .DisplayModeChange + $B$N;XDj$G$G7h$^$j$^$9(B +------------------------------------------------------------------------------ +symbol $BJQ49%b!<%I$,(B SelectMode $B$G5-9fA*Br$N$H$-$K$KI=<($9$kJ8;zNs$r(B + $B;XDj$7$^$9(B + $B!|%b!<%II=<($rJQ99$9$k$+$I$&$+$O8e=R$N(B .DisplayModeChange + $B$N;XDj$G$G7h$^$j$^$9(B +------------------------------------------------------------------------------ +hinsi $BJQ49%b!<%I$,(B SelectMode $B$GIJ;lA*Br$N$H$-$K$KI=<($9$kJ8;zNs$r(B + $B;XDj$7$^$9(B + $B!|%b!<%II=<($rJQ99$9$k$+$I$&$+$O8e=R$N(B .DisplayModeChange + $B$N;XDj$G$G7h$^$j$^$9(B +------------------------------------------------------------------------------ +quote $B%U%!%s%/%7%g%s$N(B quote $B$r8F$S=P$7$F0zMQJ8;zNs$NA^F~$r(B + $B9T$&$H$-$K$KI=<($9$kJ8;zNs$r;XDj$7$^$9(B + $B!|%b!<%II=<($rJQ99$9$k$+$I$&$+$O8e=R$N(B .DisplayModeChange + $B$N;XDj$G$G7h$^$j$^$9(B +------------------------------------------------------------------------------ + + 2. [$B%b!<%II=<(J8;zNs(B] $B$K;XDj$G$-$k$b$N(B + + [$B%b!<%II=<(J8;zNs(B] $B$K$OA43QJ8;z!?H>3QJ8;z$NN>J}$r;XDj$G$-$^$9$,!"(B + $B;XDj$G$-$k%3!<%I$K$D$$$F$OA0>O(B(<3> $B$N(B [5])$B$N5-=R$r$4Mw$/$@$5$$!#(B + + 3. $B%G%U%)%k%H$N%b!<%II=<(J8;zNs$N;XDj(B + + $B%G%U%)%k%H$NI=<(J8;zNs$N;XDj$O0J2<$N$h$&$K$J$C$F$$$^$9!#(B + +.guide.hiragana $B$+$J(B +.guide.zkatakana $BA4%+%J(B +.guide.hkatakana $BH>%+%J(B +.guide.zalpha ABC +.guide.halpha $B#A#B#C(B +.guide.sjis Shift-JIS +.guide.jis $B#J#I#S(B +.guide.euc $B#E#U#C(B +.guide.kuten $B6hE@(B +.guide.toroku $BEPO?(B +.guide.syoukyo $B>C5n(B +.guide.kanji $B4A;z(B +.guide.edit $BJT=8(B +.guide.candidate $B0lMw(B +.guide.symbol $B5-9f(B +.guide.hinsi $BIJ;l(B +.guide.quote $B0zMQ(B + + [3] $B$=$NB>$N3F!"MM!9$J%f!<%6!&%$%s%?!<%U%'!<%9$r(B + $BA*$Y$k$h$&$K(B sjrc $B%U%!%$%k$G%+%9%?%^%$%:$9$k$3$H$,$G$-$^$9!#(B + $B$=$l$>$l$N%j%=!<%9$O0J2<$N$b$N$KJ,$1$i$l$^$9!#(B + + (1) sj2/sjx/sj3 $B$H6&DL$N%j%=!<%9(B(3. 4. 5. 7. 8. 9, 10. 11.) + (2) sj2/sjx/sj3 $B$K$"$k%j%=!<%9$N2r!?%3!<%IL>(B].[$BJ8;z
    !?%3!<%IL>(B].$B!E(B +[default value] hiragana.zkatakana.hkatakana.zalpha.halpha.sjis.euc.jis.kuten + + modedown(toggle)/modeup(toggleback) $B%U%!%s%/%7%g%s!J(B<4>[1]$B;2>H!K(B + $B$G$NF~NOJ8;z$O(B hiragana/zkatakana/hkatakana/ + zalpha/halpha/sjis/jis/euc/kuten $B$N#9$D$G$9!#(B + sj2/sj3/sjx $B$H$N8_49@-$N$?$a!"$O(B unbuff/buffer/direct $B$b(B + $B;XDj$G$-$^$9$,L5;k$5$l$^$9!#(B + + 2. $B%3!<%IF~NO$NJQ99=g$r;XDj$9$k(B + +[format] .DefaultCode [$B%3!<%IL>(B].[$B%3!<%IL>(B]$B!E(B +[default value] sjis.euc.jis.kuten + + code $B%U%!%s%/%7%g%s$N5!G=$r8F$S=P$7$?$H$-$N(B + $BF~NO%3!<%I$NJQ99=g$r;XDj$7$^$9!#(B + $B;XDj$G$-$k%3!<%I$O(B sjis/jis/euc/kuten $B$G$9!#(B + + 3. NoInputMode/InputMode $B$G%U%!%s%/%7%g%s(B muhenkan $B$r8F$S=P$7$?(B + $B>l9g$KF~NOJ8;z(B] +[default value] halpha + + $BJQ49%b!<%I$,(B NoInputMode/InputMode $B$G%U%!%s%/%7%g%s(B muhenkan + $B$r8F$S=P$7$?;~$KF~NOJ8;z(B] +[default value] halpha + + $BJQ49%b!<%I$,(B ConvedMode $B$G%U%!%s%/%7%g%s(B muhenkan $B$r8F$S=P$7$?$H$-(B + $B$KI=<(J8;z;XDj(B + +[format] .sj3serv [$B%[%9%HL>(B] +[default value] NULL(localhost) + + first $BJQ49%5!<%P$H$7$F@\B3$9$k%5!<%P$N%[%9%HL>$r;XDj$7$^$9!#(B + $B$3$l$O(B kinput2 $B$N%*%W%7%g%s!J%j%=!<%9!K$G$b;XDj$G$-$^$9!#(B + (sj3 $B%3%^%s%I$H$N8_49@-$N$?$a(B .server $B$G$bF1$8$G$9(B) + + 10. $BJQ49J8;zNs$,$"$k>uBV$G%"%W%j%1!<%7%g%s$KEO$9%3%s%H%m!<%k%3!<%I$N;XDj(B + +[format] .SetNormal +[default value] NULL + + $BJQ49$r3NDj8e!"JQ49$r=*N;$7!";XDj$5$l$?%3%s%H%m!<%k%3!<%I$r(B + $B%/%i%$%"%s%H$KD>@\EO$7$^$9!#$3$N%j%=!<%9$NF0:n$O(B + $B8e=R$N(B .ControlSameTime $B$r(B on $B$K$7$F!"$3$3$G;XDj$9$k(B + $BJ8;z$N(B KeySym $B$rJQ49=*N;$K3d$jEv$F!"$J$*$+$D!"(B + $B8e=R$N(B .FlushEndConversion $B$,(B on $B$N>l9g$HEy2A$G$9!#(B + + 11. $B;XDj$5$l$?%3%s%H%m!<%k%3!<%I$HD>8e$KF~NO$5$l$?J8;z$r(B + $B%"%W%j%1!<%7%g%s$KEO$9;XDj(B + +[format] .ThroughNext +[default value] NULL + + $BJQ49$r3NDj$7!";XDj$5$l$?%3%s%H%m!<%k%3!<%I$H(B + $BD>8e$N#1J8;z$r%/%i%$%"%s%H$KD>@\EO$7$^$9!#(B + $B;XDj$5$l$F$$$k%3%s%H%m!<%k%3!<%I$rH/@8$9$k%-!;XDj(B + +[format] .sj3serv2 [$B%[%9%HL>(B] +[default value] NULL(localhost) + + second $BJQ49%5!<%P$H$7$F@\B3$9$k(B sj3serv $B$N%[%9%HL>$r;XDj$7$^$9!#(B + $B$3$l$O(B kinput2 $B$N%*%W%7%g%s!J%j%=!<%9!K$G$b;XDj$G$-$^$9!#(B + + 13. $B%"%k%U%!%Y%C%H$rBgJ8;z$KJQ49$9$k$+(B + +[format] .AlphabetConversion [on/off] +[default value] off + + $B%m!<%^;z$+$JJQ49;~$N%"%k%U%!%Y%C%H$rA43Q$KJQ49$9$k$+(B + $B$r(B on/off $B$G;XDj$7$^$9!#$3$N;XDj$OI=<(J8;zl9g$b(B + $BM-8z$G$9!#$?$@$7!"(Bsj3 $B$G$O<-=q$N@-eFI$_$,A43Q$NJ}$,(B + $B8uJd$rA*Br$G$-$^$9!#(B(Wnn $B$H5U!'Nc$($P!V#1!W$KBP$7$F$O8uJd(B + $B$,$$$/$D$+$"$j$^$9$,!"!V(B1$B!W$K$O$"$j$^$;$s(B) + + $BNc$($P(B NEWS-OS $B$N(B sj2/sj3/sjx $B$NF0:n$O(B on$B!"(B + CcWnn/Canna $B$NF0:n$O(B off $B$G$9!#(B(Canna $B$G$O?t;z$K8B$C$F(B + $BA43Q$KJQ49$7$^$9$,!"$3$l$O(B sjrk $B%U%!%$%k$G%+%9%?%$%^%$%:2DG=$G$9!#(B + + 14. $BJ8;z>C5n;~$NF0:n!JJQ49ESCf$N%m!<%^;z$rI=<($9$k$+!K(B + +[format] .BackDisplay [on/off] +[default value] off + + InputMode $B$G$NJ8;z>C5n;~$KD>A0$KF~NO$7$?%m!<%^;z$+$JJQ49:Q$N(B + $BJ8;z$NJQ49ESCf$N%"%k%U%!%Y%C%H$rI=<($9$k$+$I$&$+(B + $B$r(B on/off $B$G;XDj$7$^$9!#(B + $BNc$($P(B NEWS-OS $B$N(B sj3 $B$NF0:n$O(B on$B!"(BCcWnn/Canna $B$NF0:n$O(B off $B$G$9!#(B + sjx $B$G$OJQ49%P%C%U%!$K$"$k$9$Y$F$NJ8;z$K$D$$$F>C5n;~$K(B + $BJQ49ESCf$N%"%k%U%!%Y%C%H$rI=<($7$^$9$,!"$3$NJ}K!$O(B + $B:#2s$O%5%]!<%H$r8+Aw$j$^$7$?!#(B + + 15. $B0l3gJQ49;~$KCmL\$9$k%;%0%a%s%H$N0LCV$N;XDj(B + +[format] .BeginConversionLast [on/off/none] +[default value] on + + $B%U%!%s%/%7%g%s(B henkan(convert) $B$N5!G=$r8F$S=P$7$F0l3gJQ49$r(B + $B9T$C$?$H$-$K$I$NJ8@a$r%+%l%s%H(B($BH?E>$7$?(B)$BJ8@a(B + $B$K$9$k$+$r;XDj$7$^$9!#(Bon $B$N;~$O:G8e$NJ8@a$r(B off $B$N;~$O(B + $B:G=i$NJ8@a$r%+%l%s%H(B($BH?E>$7$?(B)$BJ8@a$K$7$^$9!#(B + none $B$N;~$O$I$NJ8@a$b%+%l%s%H$K$;$:!"99$KuBV$K$7!"J8@a0\F0$N%U%!%s%/%7%g%s(B + (forward/backward/end $BEy(B)$B$r8F$S=P$7$?$H$-$K(B + $B$3$N>uBV$r:G8e$NJ8@a$H$7$F07$$$^$9!#(B + $BNc$($P(B NEWS-OS $B$N(B sj3 $B$NF0:n$O(B on$B!"(BCcWnn $B$NF0:n$O(B none$B!"(B + Canna $B$NF0:n$O(B off $B$G$9!#(B + + 16. $BJ8@a3HD%;~$N3HD%ItJ,$NI=<(J8;z.;~$N=L>.ItJ,$NI=<(J8;z.(B + $B$r9T$C$?$H$-$K=L>.$7$?ItJ,$r.;~$N=L>.ItJ,$N$+$J4A;zJQ49F0:n$N;XDj(B + +[format] .ShrinkKnajiConversion [on/off].[on/off] +[default value] off.on + + $B%U%!%s%/%7%g%s(B syukusyou(shrink) $B$N5!G=$r8F$S=P$7$FJ8@a=L>.(B + $B$r9T$C$?$H$-$K%+%l%s%HJ8@a$H.;~$K#1J8;z$7$+$J$$$H$-$NF0:n$N;XDj(B + +[format] .ShrinkAll [on/off] +[default value] off + + $B%U%!%s%/%7%g%s(B syukusyou(shrink) $B$N5!G=$r8F$S=P$7$FJ8@a=L>.;~(B + $B$K%+%l%s%HJ8@a$,#1J8;z$7$+$J$$$H$-$NF0:n$r;XDj$7$^$9!#(B + on $B$N;~$O%+%l%s%HJ8@a$HA0J8@a$H$r9gBN$7$F%+%l%s%HJ8@a$r(B + $BA0J8@a$K0\$7$^$9!JA0J8@a$,$J$$$H$-$O%Y%k$rLD$i$7$^$9!K!#(B + off $B$N;~$O%Y%k$rLD$i$7$F$=$l0J>eJ8@a$r=L>.$G$-$^$;$s!#(B + + 21. ConvedMode $B$GJ8;zF~NO$N%-!<$r2!$7$?$H$-$NF0:n$N;XDj(B + +[format] .FlushInConversion [on/off/none/edit] +[default value] on + + ConvedMode $B$GJ8;zF~NO$N%-!<$,2!$5$l$?$H$-!"(B + $B$^$?!"5-9fA*Br$G%U%!%s%/%7%g%s(B + Select/Return/fix(kettei.flush) $B$NA`:n$,9T$o$l$?$H$-!"(B + $B$b$7$/$O(B InputMode $B$N;~$G(B .MoveBySegment $B$N;XDj$,(B InputMode + $B$KBP$7$FJ8@aC10L$K0\F0$9$k$h$&$K;XDj$5$l$F$$$F!"(B + $BJ8;zF~NO$N%-!<$,2!$5$l$?$H$-!"(B + $BJQ49Cf$NJ8;zNs$r3NDj$9$k$+$I$&$+$r;XDj$7$^$9!#(B + + on $B$N;~$OJQ49Cf$NJ8;zNs$r3NDj$7$F?7$?$JJ8;zNs$N(B + $BF~NO$K0\$j$^$9!#(Boff $B$N;~$O:G8e$NJ8@a$NuBV(B(InputMode)$B$K$7$F(B .EditCursorLast $B$G;XDj$5$l$?(B + $B%+!<%=%k0LCV$KJ8;zF~NO$7$^$9!#(B + $BNc$($P(B NEWS-OS $B$N(B sj2/sj3/sjx $B$d(B Canna $B$NF0:n$O(B on$B!"(B + CcWnn $B$NF0:n$O(B off $B$G$9!#(B + + 22. SelectMode $B!J8uJdA*Br!K$GJ8;zF~NO$N%-!<$r2!$7$?$H$-$NF0:n$N;XDj(B + +[format] .FlushSelectConversion [on/off/none/edit] +[default value] none + + SelectMode$B!J8uJdA*Br!K$GJ8;zF~NO$N%-!<$,2!$5$l$?$H$-!"(B + $BJQ49Cf$NJ8;zNs$r3NDj$9$k$+$I$&$+$r;XDj$7$^$9!#(B + on $B$N;~$OA*BrF0:n$r$7$FJQ49Cf$NJ8;zNs$r3NDj$7$F?7$?$JJ8;zNs$N(B + $BF~NO$K0\$j$^$9!#(Boff $B$N;~$OA*BrF0:n$r$7$F:G8e$NJ8@a$NuBV(B(InputMode)$B$K$7$F(B + .EditCursorLast $B$G;XDj$5$l$?(B + $B%+!<%=%k0LCV$KJ8;zF~NO$7$^$9!#$?$@$7!"5-9fA*Br$N$H$-$O(B + $B$3$N;XDj$K4X78$J$/L5;k$7!"IJ;lA*Br$N$H$-$OFI$_F~NO$KLa$j$^$9!#(B + $BNc$($P(B NEWS-OS $B$N(B sj2/sj3/sjx $B$NF0:n$O(B none$B!"(B + Canna $B$NF0:n$O(B on$B!"(BCcWnn $B$NF0:n$O(B off $B$G$9!#(B + + 23. $BJQ49=*N;A`:n;~$N3NDjF0:n$N;XDj(B + +[format] .FlushEndConversion [on/off] +[default value] on + + $BJQ49J8;zNs$,$"$k>uBV$G%U%!%s%/%7%g%s(B start $B$d(B sjrc$B!"(B + kill $B$,8F$S=P$5$l$?$H$-$KJQ49Cf$NJ8;zNs$r(B + $B3NDj$9$k$+$I$&$+$r;XDj$7$^$9!#(B + on $B$N;~$OJQ49Cf$NJ8;zNs$r3NDj$7$F$+$i3F%U%!%s%/%7%g%s$N(B + $B5!G=$,uBV$K$9$kJ8@a$N;XDj(B + +[format] .MuhenkanSegment [one/all/after] +[default value] one + + ConvedMode $B$G%U%!%s%/%7%g%s(B muhen(unconvert)$B$,8F$P$l$?$H$-$K(B + $BJQ49Cf$NJ8;zNsCf$N$I$NJ8@a$rL5JQ49>uBV$K$9$k$+$r;XDj$7$^$9!#(B + one $B$N;~$O%+%l%s%HJ8@a!J8=:_H?E>$7$F$$$kJ8@a!K$r!"(Ball $B$N;~$O(B + $BJQ49Cf$NA4$F$NJ8@a$r!"(Bafter $B$N;~$O%+%l%s%HJ8@a4^$`%+%l%s%HJ8@a0J9_(B + $BJ8@a$rL5JQ49>uBV$K$7$^$9!#(B + $BNc$($P(B Canna $B$NJT=83+;O;~$d(B CcWnn $B$NF0:n$O(B one$B!"(B + Canna $B$N(B BS$B%-!<$NF0:n$O(B all $B$G$9!#(B + + 26. $BJ8;z>C5n;~$KL5JQ49>uBV$K$9$kJ8@a$N;XDj(B + +[format] .DeleteChangeSegment [one/all/after] +[default value] one + + ConvedMode $B$N$H$-$G(B DeleteBySegment$B!J8e=R!K$,(B off + $B$N$H$-(B backspace/delete $B$N%U%!%s%/%7%g%s$r8F$S=P$7$?$H$-$K(B + $BJQ49Cf$NJ8;zNs$N$I$NJ8@a$rL5JQ49>uBV(B(InputMode)$B$KLa$9$+$r;XDj$7$^$9!#(B + one $B$N;~$O%+%l%s%HJ8@a!J8=:_H?E>$7$F$$$kJ8@a!K$r!"(Ball $B$N;~$O(B + $BJQ49Cf$NA4$F$NJ8@a$r!"(Bafter $B$N;~$O%+%l%s%HJ8@a4^$`%+%l%s%HJ8@a0J9_(B + $BJ8@a$rL5JQ49>uBV$K$7$^$9!#(B + $BNc$($P(B CcWnn $B$NF0:n$O(B one$B!"(BCanna $B$NF0:n$O(B all $B$G$9!#(B + + 27. $BItJ,3NDj;~$KL5JQ49>uBV$K$9$kJ8@a$N;XDj(B + +[format] .FlushChangeSegment [one/all/off] +[default value] one + + flushbefore $B$N%U%!%s%/%7%g%s$r8F$S=P$7$?$H$-$K(B + $B%+%l%s%HJ8@a$b$7$/$O$=$l0J9_$NJ8@a$rL5JQ49>uBV(B(InputMode)$B$K(B + $BLa$9$+$r;XDj$7$^$9!#(B + one $B$N;~$O%+%l%s%HJ8@a!J8=:_H?E>$7$F$$$kJ8@a!K$r!"(Ball $B$N;~$O(B + $B%+%l%s%HJ8@a0J9_$NA4$F$NJ8@a$r!"J8@a$rL5JQ49>uBV$K$7$F$+$i(B + $BItJ,3NDj$NF0:n$r9T$$$^$9!#(Ball $B$r;XDj$7$?$H$-$O(B + mobebyseg $B$,(B InputMode $B$G(B on $B$N;~$G$bJ8;zF~NO2DG=$J(B + $B>uBV!JF~NO3+;O;~$HF1$8!K$K$7$^$9!#(B + off $B$N;~$O%+%l%s%HJ8@a$NL5JU46EYM+$5$O$7$^$;$s$,!"(B + $B%+%l%s%HJ8@a$,J8;zF~NO2DG=$J!JH?E>$7$F$$$J$$!K>uBV$G(B + $B%F%-%9%H%+!<%=%k$,J8@a$NC<$K$J$$$H$-$K%F%-%9%H%+!<%=%k(B + $B$h$jA0$NItJ,$r3NDj$7$^$9!#(B + + $BNc$($P(B Canna $B$NF0:n$O(B all $B$G$9!#(B + + 28. $BJ8;z(B] [on/off].[on/off].[on/off] +[default value] hiragana off.on.off +[default value] zkatakana off.on.off +[default value] hkatakana off.on.off +[default value] halpha off.on.off +[default value] zalpha off.on.off + + hiragana$B!"(Bzkatakana$B!"(Bhkatakana$B!"(Bhalpha$B!"(Bzalpha$B!"(Bmodedown(toggle)$B!"(B + modeup(toggleback) $B$N#7$D$NJ8;z(B]$B$K;XDj$G$-$k$N$O(B hiragana/zkatakana/hkatakana/halpha/zalpha + /rolldown/rollup $B$N#7$D$G!"$=$l$>$l$N%U%!%s%/%7%g%s$NF0:n(B + $B$KBP1~$7$^$9!#(B + + value $B$NBh#1%U%#!<%k%I$K$O(B InputMode $B$N;~$NF0:n$r(B + $BBh#2%U%#!<%k%I$K$O(B ConvedMode $B$N;~$NF0:n$r;XDj$7$^$9!#(B + $BBh#3%U%#!<%k%I$K$O(B NoInputMode $B$N;~$NF0:n$r;XDj$7$^$9!#(B + + $B$3$l$i$N%U%#!<%k%I$,(B on $B$N;~$OI=<(J8;zl9g$O2?$b$7$^$;$s!#(B + $BNc$($P(B NEWS-OS $B$N(B sj2/sj3/sjx $B$NF0:n$d(B Canna $B$NF0:n$O(B + $B%G%U%)%k%H$HF1$8$G$9$,!"(BCcWnn $B$G$O(B + + hiragana on.on.on + zkatakana on.on.on + + $B$K$J$j$^$9!#(B + + 29. $B%+%l%s%HJ8@a$d%F%-%9%H%+!<%=%k$rA08e$K0\F0$9$k(B + $B%U%!%s%/%7%g%s$,8F$P$l$?$H$-$N0\F0C10L;XDj(B + +[format] .MoveBySegment [on/off].[on/off] +[default value] off.on + + $BJQ49J8;zNs$KBP$7$F0lEY(B henkan(convert) $B$N%U%!%s%/%7%g%s$,8F$P$l$?8e!"(B + forward(right)$B!"(Bbackward(left) $B$N%+%l%s%HJ8@a!"%F%-%9%H%+!<%=%k(B + $B$rA08e$K0\F0$9$k%U%!%s%/%7%g%s$,8F$P$l$?$H$-$K(B + $BJ8@aC10L$G0\F0$9$k$+!"J8;zC10L$G0\F0$9$k$+$r;XDj$7$^$9!#(B + + value $B$NBh#1%U%#!<%k%I$K$O(B InputMode $B$N;~$NF0:n$r(B + $BBh#2%U%#!<%k%I$K$O(B ConvedMode $B$N;~$NF0:n$r;XDj$7$^$9!#(B + $B$3$l$i$N%U%#!<%k%I$,(B on $B$N;~$OJ8@aC10L$G!"(B + off $B$N;~$OJ8;zC10L$G0\F0$7$^$9!#(B + + $B0\F0@h$,(B ConvedMode($BJQ49:Q$_J8@a(B)$B$GJ8;zC10L$K0\F0$9$k$h$&$K(B + $B;XDj$5$l$?>l9g!"$=$NJ8@a$rL5JQ49$N>uBV$K$7$F0\F0$7$^$9!#(B + henkan(convert) $B$N%U%!%s%/%7%g%s$,8F$P$l$k0JA0$O(B + $B$3$N%j%=!<%9$N;XDj$K4X78$J$/J8;zC10L$K0\F0$7$^$9!#(B + + $BNc$($P(B NEWS-OS $B$N(B sj2/sj3/sjx $B$NF0:n$O(B on.on $B$G$9$,!"(B + CcWnn $B$d(B Canna $B$NF0:n$O%G%U%)%k%H$HF1$8$G$9!#(B + + 30. $B%+%l%s%HJ8@a$d%F%-%9%H%+!<%=%k$rA08e$K0\F0$9$k(B + $B%U%!%s%/%7%g%s$,8F$P$l$?$H$-$N%k!<%W;XDj(B + +[format] .MoveLoop [on/off] +[default value] off + + MoveBySegment $B$,(B on $B$N;~$G%+%l%s%HJ8@a$,:G8e$NJ8@a$N$H$-!"(B + MoveBySegment $B$,(B off $B$N;~$G%F%-%9%H%+!<%=%k$,J8@a$N(B + $B:G8e$K$"$k$H$-$K(B forward(right) $B$N%U%!%s%/%7%g%s$,8F$P$l$?(B + $B;~$NF0:n!"5U$K(B + MoveBySegment $B$,(B on $B$N;~$G%+%l%s%HJ8@a$,:G=i$NJ8@a$N$H$-!"(B + MoveBySegment $B$,(B off $B$N;~$G%F%-%9%H%+!<%=%k$,J8@a$N(B + $B:G=i$K$"$k$H$-$K(B backward(left) $B$N$N%U%!%s%/%7%g%s$,8F$P$l$?(B + $B;~$NF0:n$r;XDj$7$^$9!#(B + + on $B$N$H$-$O!"$=$l$>$l:G=i$NJ8@a!?J8@a$N:G=i$K!":G8e$NJ8@a(B + $B!?J8@a$N:G8e$K0\F0$7$^$9!#(B + off $B$N;~$OL5;k$7$^$9!#(B + + $B:G8e$NJ8@a$H$7$F07$&J8@a$NDj5A$O(B .BeginConversionLast $B$N(B + $B;XDj$K0MB8$7$^$9!#(B + $BNc$($P(B NEWS-OS $B$N(B sj2/sj3/sjx $B$NF0:n$d(B CcWnn $B$NF0:n$O(B off $B$G$9$,!"(B + Canna $B$NF0:n$O(B on $B$G$9!#(B + + 31. $B%+%l%s%HJ8@a$d%F%-%9%H%+!<%=%k$r:G=i$^$?$O:G8e$K$K0\F0$9$k(B + $B%U%!%s%/%7%g%s$,8F$P$l$?$H$-$N0\F0C10L;XDj(B + +[format] .JumpBySegment [on/off].[on/off] +[default value] off.on + + $BJQ49J8;zNs$KBP$7$F0lEY(B henkan(convert) $B$N%U%!%s%/%7%g%s$,8F$P$l$?8e!"(B + top$B!"(Bend(bottom) $B$N%+%l%s%HJ8@a$rJQ49J8;zNs$N:G=i$"$k$$$O:G8e(B + $B$NJ8@a$K!"%F%-%9%H%+!<%=%k$r%+%l%s%HJ8@a$N:G=i$"$k$$$O:G8e$NJ8;z$K(B + $B0\F0$9$k%U%!%s%/%7%g%s%U%!%s%/%7%g%s$,8F$P$l$?$H$-$K(B + $BJ8@aC10L$G0\F0$9$k$+!"J8;zC10L$G0\F0$9$k$+$r;XDj$7$^$9!#(B + + value $B$NBh#1%U%#!<%k%I$K$O(B InputMode $B$N;~$NF0:n$r(B + $BBh#2%U%#!<%k%I$K$O(B ConvedMode $B$N;~$NF0:n$r;XDj$7$^$9!#(B + $B$3$l$i$N%U%#!<%k%I$,(B on $B$N;~$OJ8@aC10L$G!"(B + off $B$N;~$OJ8;zC10L$G0\F0$7$^$9!#(B + + henkan(convert) $B$N%U%!%s%/%7%g%s$,8F$P$l$k0JA0$O(B + $B$3$N%j%=!<%9$N;XDj$K4X78$J$/J8;zC10L$K0\F0$7$^$9!#(B + $B:G8e$NJ8@a$H$7$F07$&J8@a$NDj5A$O(B .BeginConversionLast $B$N(B + $B;XDj$K0MB8$7$^$9!#(B + + $BNc$($P(B CcWnn $B$NF0:n$O(B on.on $B$G$9$,(B Canna $B$NF0:n$O(B + $B%G%U%)%k%H$HF1$8$G$9!#(B + + 32. $BJ8;z!?J8@a>C5n$N%U%!%s%/%7%g%s$,8F$P$l$?$H$-$N>C5nC10L;XDj(B + +[format] .DeleteBySegment [on/off].[on/off] +[default value] off.on + + $BJQ49J8;zNs$KBP$7$F0lEY(B henkan(convert) $B$N%U%!%s%/%7%g%s$,8F$P$l$?8e!"(B + delete$B!"(Bbackspace $B$NJ8;z!?J8@a>C5n$N%U%!%s%/%7%g%s$,8F$P$l$?$H$-$K(B + $BJ8@aC10L$G>C5n$9$k$+!"J8;zC10L$G>C5n$9$k$+$r;XDj$7$^$9!#(B + + value $B$NBh#1%U%#!<%k%I$K$O(B InputMode $B$N;~$NF0:n$r(B + $BBh#2%U%#!<%k%I$K$O(B ConvedMode $B$N;~$NF0:n$r;XDj$7$^$9!#(B + $B$3$l$i$N%U%#!<%k%I$,(B on $B$N;~$OJ8@aC10L$G!"(B + off $B$N;~$OJ8;zC10L$G>C5n$7$^$9!#(B + + $B>C5n$9$kJ8@a$,(B ConvedMode($BJQ49:Q$_J8@a(B)$B$GJ8;zC10L$K>C5n$9$k$h$&$K(B + $B;XDj$5$l$?>l9g!"A0=R$N(B .DeleteChangeSegment $B$N;XDj$K=>$C$F(B + $B$=$NJ8@a$rL5JQ49$N>uBV$K$7$F>C5n$7$^$9!#(B + $B:G=i$K(B henkan(convert) $B$N%U%!%s%/%7%g%s$,8F$P$l$k0JA0$d(B + $B0lEY(B edit $B$,8F$P$l$FJT=8Cf$N!VJ8;zF~NO2DG=$J>uBV!W$N(B + $BJ8@a!J%+%l%s%H$N$H$-$K2<@~$,0z$+$l$?>uBV!K$KBP$7$F$O(B + $B$3$N%j%=!<%9$N;XDj$K4X78$J$/J8;zC10L$K>C5n$7$^$9!#(B + + $BNc$($P(B NEWS-OS $B$N(B sj2/sj3/sjx $B$NF0:n$O(B on.on$B!"(B + Canna $B$NF0:n$O%G%U%)%k%HF1$8!"(BCcWnn $B$NF0:n$O(B off.off $B$G$9!#(B + + 33. $BJ8;z!?J8@a>C5n$N%U%!%s%/%7%g%s$,8F$P$l$?$H$-$N>C5nC10L;XDj(B + +[format] .KillBySegment [on/off].[on/off] +[default value] off.on + + delafter $B$N%U%!%s%/%7%g%s$,8F$P$l$?$H$-$K(B + $BJ8@aC10L$G!J%+%l%s%HJ8@a0J9_$NA4$F$NJ8@a$r!K>C5n$9$k$+!"(B + $BJ8;zC10L$G!J%+%l%s%HJ8@aFb$N%+!<%=%k0LCV0J9_$NJ8;zNs>C5n$9$k$+(B + $B$r;XDj$7$^$9!#(B + + value $B$NBh#1%U%#!<%k%I$K$O(B InputMode $B$N;~$NF0:n$r(B + $BBh#2%U%#!<%k%I$K$O(B ConvedMode $B$N;~$NF0:n$r;XDj$7$^$9!#(B + $B$3$l$i$N%U%#!<%k%I$,(B on $B$N;~$OJ8@aC10L$G!"(B + off $B$N;~$OJ8;zC10L$G>C5n$7$^$9!#(B + + $BJ8;zF~NO2DG=$J>uBV!JH?E>$7$F$$$J$$!K$G(B on $B$N;~$O(B + $B%F%-%9%H%+!<%=%k0J9_$NJ8;zNs$rA4$F>C5n$7!"(Boff $B$N;~$O(B + $B%F%-%9%H%+!<%=%k0J9_$N%+%l%s%HJ8@aFb$NJ8;zNs$r(B + $B>C5n$7$^$9!#J8;zF~NO2DG=$G$J$$>uBV$G(B on $B$N;~$O(B + $B%+%l%s%H%+!<%=%k$r4^$`0J9_$NJ8;zNs$rA4$F>C5n$7!"(B + off $B$N;~$O%+%l%s%HJ8@a$r>C5n$7$^$9!#(B + + $BNc$($P!"(BCanna $B$NF0:n$O%G%U%)%k%HF1$8$G$9!#(B + + 34. $BL5JQ49>uBV$K$9$k%U%!%s%/%7%g%s(B(muhen/unconvert)$B$,8F$P$l$?$H$-(B + $B$N%F%-%9%H%+!<%=%k0LCV;XDj(B + +[format] .MuhenkanCursorLast [on/off] +[default value] off + + muhen(unconvert)$B$N%U%!%s%/%7%g%s$,8F$P$l$?$H$-$K%F%-%9%H%+!<%=%k$N(B + $B0LCV$r;XDj$7$^$9!#(Bon $B$N;~$OL5JQ49>uBV$K$7$?J8;zNs$N:G8e$K!"(B + off $B$N;~$OL5JQ49>uBV$K$7$?J8;zNs$N:G=i$K%F%-%9%H%+!<%=%k$,(B + $B0\F0$7$^$9!#Nc$($P(B + CcWnn $B$NF0:n$O%G%U%)%k%H$HF1$8$G$9$,!"(BCanna $B$NF0:n$O(B on $B$G$9!#(B + + 35. $BJT=83+;O$N%U%!%s%/%7%g%s(B(edit)$B$,8F$P$l$?$H$-$N%F%-%9%H(B + $B%+!<%=%k0LCV;XDj(B + +[format] .EditCursorLast [on/off] +[default value] off + + edit $B$N%U%!%s%/%7%g%s$,8F$P$l$?$H$-$K%F%-%9%H%+!<%=%k$N(B + $B0LCV$r;XDj$7$^$9!#(Bon $B$N;~$OL5JQ49>uBV$K$7$?J8;zNs$N:G8e$K!"(B + off $B$N;~$OJ8;zF~NO2DG=$K$7$?>uBV$NJ8;zNs$N:G=i$K%F%-%9%H%+!<%=%k$,(B + $B0\F0$7$^$9!#Nc$($P(B + CcWnn $B$d(B Canna $B$NF0:n$O%G%U%)%k%H$HF1$8$G$9!#(B + + 36. $BItJ,3NDj$9$k%U%!%s%/%7%g%s$,8F$P$l$?$H$-$KL5JQ49>uBV$K$9$k$H$-$N(B + $B%F%-%9%H%+!<%=%k0LCV;XDj(B + +[format] .FlushCursorLast [on/off] +[default value] off + + flushbefore $B$N%U%!%s%/%7%g%s$,8F$P$l$F!"A0=R$N(B + .FlushChangeSegment $B$,(B off $B$G$J$$$H$-$N%F%-%9%H%+!<%=%k$N(B + $B0LCV$r;XDj$7$^$9!#(Bon $B$N;~$OL5JQ49>uBV$K$7$?J8;zNs$N:G8e$K!"(B + off $B$N;~$OL5JQ49>uBV$K$7$?J8;zNs$N:G=i$K%F%-%9%H%+!<%=%k$,(B + $B0\F0$7$^$9!#Nc$($P(B Canna $B$NF0:n$O%G%U%)%k%H$HF1$8$G$9!#(B + + 37. ConvedMode $B$NJ8@a$NI=<(J}K!;XDj(B + +[format] .ConvertedUnderLine [on/off] +[default value] on + + ConvedMode $B$NJ8@a$G%+%l%s%HJ8@a$G$J$$J8@a$NI=<($K(B + $B2<@~$r0z$/$+$I$&$+$r;XDj$7$^$9!#(Bon $B$N;~$O2<@~$r0z$-!"(B + off $B$N;~$O2<@~$r0z$-$^$;$s!#%+%l%s%HJ8@a$N;~$O(B + $B$3$N%j%=!<%9$N;XDj$K4X78$J$/H?E>I=<($5$l$^$9!#(B + $BNc$($P(B NEWS-OS $B$N(B sj2/sj3/sjx $B$d(B Canna $B$NF0:n$O(B on + $B$G$9$,!"(BCcWnn $B$NF0:n$O(B off $B$G$9!#(B + + 38. $BJQ49%b!<%IJQ99;~$N%b!<%II=<(JQ99;XDj(B + +[format] .DisplayModeChange [on/off] +[default value] off + + $BJQ49Cf$NJ8;zNs$NJQ49%b!<%I$NJQ2=$K$h$C$F%b!<%II=<($r(B + $BJQ99$9$k$+$I$&$+$r;XDj$7$^$9!#(Bon $B$N>l9g0J2<$N$h$&$K(B + $B%b!<%II=<($rJQ99$7$^$9!#(B + + $BJQ49Cf$NJ8;zNsCf$NJ8@a$,A4$FL$JQ49$N;~!'F~NOJ8;zJ}$NJ8@a$,$"$k$H$-!'(B .guide.edit $B$N;XDj(B + $B8uJdA*BrCf$N$H$-!'(B .guide.candidate $B$N;XDj(B + $B5-9fA*BrCf$N$H$-!'(B .guide.symbol $B$N;XDj(B + $BIJ;lA*BrCf$N$H$-!'(B .guide.hinsi $B$N;XDj(B + $B<-=qEPO?Cf$N$H$-!'(B .guide.toroku $B$N;XDj(B + $B<-=qKu>CCf$N$H$-!'(B .guide.syoukyo $B$N;XDj(B + $B0zMQJ8;zF~NOCf$N$H$-!'(B .guide.quote $B$N;XDj(B + + off $B$N$H$-$OJQ49%b!<%I$NJQ2=$K4X78$J$/(B + $B>o$K8=:_$NF~NOJ8;zC5n$7$?$H$-$N%+%l%s%HJ8@a0\F0;XDj(B + +[format] .DeleteLastMove [on/off] +[default value] on + + backspace $B$d(B delete $B$NJ8;z>C5n$N%U%!%s%/%7%g%s$G(B + $BA0=R$N(B .DeleteBySegment $B$GJ8@aC10L$G>C5n$9$k$h$&$K;XDj$5$l$F$$$k(B + $B>l9g$K>C5n$9$kJ8@a$,JQ49Cf$NJ8;zNs$N1&C<$NJ8@a$N$H$-!"(B + $B%+%l%s%HJ8@a$r#1$DA0$NJ8@a$K!J>C5nA`:n8e$N1&C<$NJ8@a$K!K0\F0$9$k$+!"(B + $B$I$&$+$r;XDj$7$^$9!#(B + on $B$N;~$O%+%l%s%HJ8@a#1$DA0$K$r0\F0$7$^$9!#(B + off $B$N;~$O0\F0$7$^$;$s!#(B + + $BNc$($P(B NEWS-OS $B$N(B sj2/sj3/sjx $B$NF0:n$O(B on + $B$G$9$,!"(BCcWnn $B$NF0:n$O(B off $B$G$9!#(B + + 40. $B$+$J%-!<%\!<%I$G$J$$%-!<%\!<%I$G$+$JF~NO$r$9$k5!G=$N=i4|;XDj(B + +[format] .KanaInputOnly [on/off] +[default value] off + + $B$+$J%-!<%\!<%I$G$J$$%-!<%\!<%I$G$+$JF~NO$r$9$k5!G=$r(B + $BJQ493+;O;~$K(B on $B$K$9$k$+$I$&$+$r;XDj$7$^$9!#(B + $B$3$N5!G=$O(B kana $B$N%U%!%s%/%7%g%s$K;XDj$5$l$?5!G=$G(B + $B%H%0%k$G$-$^$9!#(Boff $B$N;~$OJQ493+;O;~$K$O$3$N5!G=$r;HMQ$7$J$$$h$&$K(B + $B$7$^$9!#(B + + 41. $BJ8;zF~NOF0:n$HF1;~$K%U%!%s%/%7%g%s$N5!G=$re=R$N(B .InputSameTime $B$,(B on $B$N;~$K99$K%3%s%H%m!<%kF~NO$H$7$F(B + $BM-8z$J%-!(B].[$BJ8;z
      (B].$B!E(B +[default value] hiragana.zkatakana.hkatakana.zalpha.halpha.\ + hankaku.zenkaku.upper.lower + + modedown(toggle)/modeup(toggleback) $B5Z$S(B nextmode/prevmode + $B%U%!%s%/%7%g%s!J(B<4>[1]$B;2>H!K$G$NI=<(J8;z$O(B hiragana/zkatakana/hkatakana/ + zalpha/halpha/hankaku/zenkaku/upper/lower $B$N#9$D$G$9!#(B + + 44. $B8uJdA*Br$NA0$K$R$i$,$J$K$7$F:FEY$+$J4A;zJQ49$r$9$k$+$r;XDj$9$k(B + +[format] .BeforeSelectConversion [on/off] +[default value] on + + $BJQ49:Q$NJ8@a(B(ConvedMode)$B$KBP$7$F(B convert(henkan) $B%U%!%s%/%7%g%s(B + $B$,8F$S=P$5$l$?$H$-$KI=<(J8;zl9g$K(B + $B0lEY$R$i$,$J$KJQ49$7$?$b$N$r$+$J4A;zJQ49$7!"l9g!"<-=q$N@-e(B on $B$K$7$?>l9g$NJ}$,(B + $BM-8z$H;W$o$l$^$9!#(B + + 45. $B$+$J4A;zJQ49$NA0$KJ8;zl9g$K0lEY$R$i$,$J$KJQ49$7$7$F$+$i$+$J4A;zJQ49(B + $B$9$k$+$I$&$+$r;XDj$7$^$9!#(B + + on $B$N;~$O$R$i$,$J$KJQ49$7$F$+$i$+$J4A;zJQ49$7$^$9$,!"(B + off $B$N;~$O%+%l%s%HJ8@aCf$K$R$i$,$J$G$J$$J8;z$,$"$C$?>l9g$G$b(B + $B$=$N$^$^$+$J4A;zJQ49$r3+;O$7$^$9!#(B + + $BNc$($P(B NEWS-OS $B$N(B sj2/sj3/sjx$B!"(BCcWnn $B$d(B Canna $B$NF0:n$O(B off $B$G$9!#(B + + 46. $B:G8e$NJ8;z$,%m!<%^$+$JJQ49%F!<%V%k$KF1$8FI$_$KBP$7$FJ#?t$N(B + $B%m!<%^;z$,EPO?$5$l$F$$$k$h$&$JJ8;z$N>l9g!"$G$-$k8B$j(B + $BF~NOJ8;zl9g(B + ($BNc(B $B!V$s!W$N!V(Bn$B!W$H!V(Bnn$B!W(B)$B!"0lEY%+%l%s%HJ8@a$NJ8;zl9g!"$G$-$k8B$j(B + $BF~NOJ8;z.$5$$$H$-!"$^$?$O(B + $BF1$8;~$O$9$0$K8uJd0lMw$rI=<($7$^$9!#(B + + $BNc$($P(B NEWS-OS $B$N(B sj2/sj3/sjx$B!"(BCcWnn $B$NF0:n$O(B 0 $B$G$9!#(B + + 48. $B8uJdA*Br$N$H$-$K(B backspace $B$NF0:n$r$9$kBP>]$NJ8@a$r;XDj$9$k(B + +[format] .SelectBackSpaceMove [on/off] +[default value] off + + $B8uJdA*Br$N>uBV(B(SelectMode)$B$KBP$7$F(B backspace $B$N%U%!%s%/%7%g%s(B + $B$,8F$S=P$5$l$?$H$-8uJdA*Br$rH4$1$?$"$H!"D>A0$NJ8@a$r>C5n(B + ($BL5JQ498e>C5n(B)$B$rC5n(B($BL5JQ498e>C5n(B)$B$rC5n(B($BL5JQ498e>C5n(B)$B$rA0$NJ8@a$KBP$7$F>C5n(B($BL5JQ498e>C5n(B)$B$ro$K$R$i$,$J!?A43Q%+%?%+%J$rI=<($9$k$+;XDj$9$k(B + +[format] .CandidatePadding [on/off] +[default value] off + + $B8uJdA*BrI=<((B(convert)$B$^$?$O!"(Bnext/prev $BEy$GI=<($5$l$k8uJdI=<($G(B + $BI,$:!"$R$i$,$J$HA43Q%+%?%+%J$N8uJd$rI=<($9$k$+$I$&$+$r;XDj$7$^$9!#(B + + on $B$N;~$O(B sj3serv $B$NJV$9JQ498uJd0J30$KI,$:!"$R$i$,$J$H(B + $BA43Q%+%?%+%J$N8uJd$r:G8e$KI=<($7$^$9!#$3$N:G8e$N(B + $B#2$D$O(B sj3 $B$N3X=,5!G=$H$OL54X78$G!"C;J8@aJQ49$G(B + $B#1EYA*Br$5$l$F$bl9g!"8=J8@a$r(B + $B#2EYJ8;z$NJ8;zl9g$O(B -rcfile $B%*%W%7%g%sEy$G(B + $B;XDj$7$?JQ493+;O;~$HF1$8%U%!%$%k$rFI$_9~$_$^$9!#(B + + 51. sjrc $B7A<0$N@_Dj%U%!%$%k$r%M%9%H$7$FFI$_9~$`;XDj(B + +[format] .Include [path] +[default value] $B$J$7(B + + $BJL$N(B sjrc $B7A<0$N%U%!%$%k$r$=$N;~E@$GFI$_9~$`>l9g$K(B + $B%U%!%$%kL>$r;XDj$7$^$9!#B>$N%U%!%s%/%7%g%s$HF1MM!"(B + $BF10l$N(B sjrc $B%U%!%$%kFb$K$$$/$D$b;XDj2DG=$G!"%M%9%H$O(B + $B%G%U%)%k%H$G(B 10$B2s$^$G2DG=$G$9!#AjBP%Q%9$G;XDj$7$?>l9g$O(B + + [1] $B%+%l%s%H%G%#%l%/%H%j(B + [2] SJ3DEFPATH $B$G;XDj$7$?%G%#%l%/%H%j(B + ($B%G%U%)%k%H$O(B /usr/lib/X11/sj3def) + + $B$N=g$K%5!<%A$7!";XDj$,$J$$>l9g$d%U%!%$%k$,(B + $B%*!<%W%s$G$-$J$$>l9g$O%(%i!<$K$J$j$^$9!#(B + +<5> $BJQ49%5!<%P(B(sj3serv) $B$N%[%9%HL>$N7hDj(B + + first $BJQ49%5!<%P$N%[%9%HL>$O0J2<$NM%@hEY$G7hDj$5$l$^$9!#(B + + [1] sjrc $B$N(B .sj3serv $B$N;XDj(B(<4>[3]$B;2>H(B) + [2] $B%*%W%7%g%s(B -sj3serv $B$KB3$/%[%9%HL>(B + [3] $B%j%=!<%9%U%!%$%k$N(B *Sj3.sj3serv $B%j%=!<%9$K;XDj$5$l$?CM(B + [4] $B4D6-JQ?t(B SJ3SERV $B$NCM(B + [5] NULL ($B$D$^$j(B localhost) + + second $BJQ49%5!<%P$N%[%9%HL>$O0J2<$NM%@hEY$G7hDj$5$l$^$9!#(B + + [1] sjrc $B$N(B .sj3serv2 $B$N;XDj(B(<4>[3]$B;2>H(B) + [2] $B%*%W%7%g%s(B -sj3serv2 $B$KB3$/%[%9%HL>(B + [3] $B%j%=!<%9%U%!%$%k$N(B *Sj3.sj3serv2 $B%j%=!<%9$K;XDj$5$l$?CM(B + [4] $B4D6-JQ?t(B SJ3SERV2 $B$NCM(B + [5] NULL ($B$D$^$j(B localhost) + +<6> $B<-=qEPO?!?Ku>C%b!<%I$NF0:n(B + + kinput2 $B$N(B sj3 $BHG$G$O%$%s%?!<%i%/%F%#%V$J(B + $B<-=qEPO?!?Ku>C$G$-$^$9!#<-=qEPO?!?Ku>C$K$O!VFI$_!W$NF~NO(B + $BEPO?$9$k4A;zJ8;zNs$NA*Br!"IJ;l$NA*Br!"3NG'!"C(B + $B$H0lO"$NF0:n$,I,MW$K$J$j$^$9$N$G!"B>$NJQ49%b!<%I$N$h$&$K(B + $B0lEY$NA`:n$K$h$C$F$R$H$D$NF0:n$,C5n;~$NF0:n$NN.$l$O$=$l$>$l0J2<$N$h$&$K$J$j$^$9(B + + [1] $B<-=qEPO?;~(B + + 1. ConvedMode + $B"-(B(ConvedMode: toroku/register $B$K;XDj$5$l$?%-!$B@)8B;v9`(B $B$N9`;2>H(B)$B$7$?>l9g$O(B + $BEPO?A`:n7k2LI=<(%b!<%I$KHt$S$^$9(B) + $B"-(B(DictMode: kettei/flush/return $B$K;XDj$5$l$?%-!l9g$O$=$N;]$rI=<($7$^$9!#(B + (DictMode: cancel $B$K;XDj$5$l$?%-!uBV$KLa$j$^$9!#(B + $B"-(B(DictMode: kettei/flush/return $B$K;XDj$5$l$?%-!C5n;~(B + + 1. ConvedMode + $B"-(B(ConvedMode: syoukyo/eliminate $B$K;XDj$5$l$?%-!C5n$9$k4A;zJ8;zNs$NHO0OA*Br!"(BInputMode $B$H(B + $BF1MM$NA`:n$GFI$_J8;zNs$,F~NO$G$-!"(Bcancel $B$NA`:n$G(B + ConvedMode $B$KLa$j$^$9(B kettei/flush/return $B$K;XDj$5$l$?(B + $B%-!H(B)$B$7$?>l9g$O(B + $BEPO?A`:n7k2LI=<(%b!<%I$KHt$S$^$9(B) + $B"-(B(DictMode: kettei/flush/return $B$K;XDj$5$l$?%-!C5nA`:n$r9T$&$+:G=*3NG'$r9T$$$^$9!#(B + (DictMode: cancel $B$K;XDj$5$l$?%-!C5nF0:n$r9T$$$^$9(B + $B"-(B(DictMode: kettei/flush/return $B$K;XDj$5$l$?%-!C5nA`:n7k2LI=<(%b!<%I(B + $B>C5nF0:n$r9T$C$?7k2L$rI=<($7$^$9!#%(%i!<$G>C5n$G$-$J$+$C$?(B + $B>l9g$O$=$N;]$rI=<($7$^$9!#(B + (DictMode: cancel $B$K;XDj$5$l$?%-!C5n3+;OA0$N(B ConvedMode $B$N>uBV$KLa$j$^$9!#(B + $B"-(B(DictMode: kettei/flush/return $B$K;XDj$5$l$?%-!C5n$N0lO"$NN.$l$O0J>e$N$h$&$K$J$j$^$9!#(B + $B4JC1$K8@$($P<-=qEPO?!?>C5n$NJQ49%b!<%I$O(B + $B$=$N0lO"$NN.$l$K1h$C$F(B + $B!z(B $BHO0O;XDj!?FI$_F~NO%b!<%I(B + $B!J!z(B $BIJ;lA*Br%b!<%I!K(B + $B!z(B $B3NG'%b!<%I(B + $B!z(B $BA`:n7k2LI=<(%b!<%I(B + $B$KJ,$1$k$3$H$,$G$-!"EPO?$N>l9g$K$O3NG'%b!<%I$NA0$K(B + SelectMode $B$NIJ;lA*Br%b!<%I$,M>7W$KF~$k$3$H$K$J$j$^$9!#(B + + $B<-=qEPO?!?>C5n;~$N%a%C%;!<%8$OIJ;lA*Br$NItJ,0J30$O(B + CandidatePanel $B$G$O$J$/!"(BAuxPanel $B$r;HMQ$7$^$9!#(B + + $B!v<-=qEPO?;~$NCm0U;v9`!v(B + + (1) $BEPO?!?>C5n;~$NFI$_J8;zNs$O:GBg$G$b(B 31 $BJ8;z$^$G$G$9!#(B + $B$=$l0J>e$N$H$-$OEPO?F0:n$,=PMh$^$;$s!#(B + $B$^$?!"BP1~$9$k4A;zJ8;zNs$O:GBg$G$b(B 32 $BJ8;z$^$G$G$9!#(B + + (2) $BFI$_J8;zNs$K;HMQ$G$-$k$b$N$O0J2<$N$b$N$K8B$i$l$^$9!#(B + + $B!$@$B$E$G$I$P$S$V$Y$\$Q$T$W$Z$](B + $B$!$#$%$'$)$C$c$e$g$n%t%u%v(B + + $B$?$@$70J2<$NJ8;z$OFI$_J8;zNs$N@hF,$H$J$k$3$H$,=PMh$^$;$s!#(B + + $B!<$r$s$!$#$%$'$)$C$c$e$g$n%u%v(B + + $B$J$*!"BP1~$9$k4A;zJ8;zNs$K$OH>3QJ8;z$b;XDj$G$-$^$9!#(B + + (3) $BF0;l$d7AMF;l$rEPO?$9$k>l9g$OEPO?$7$h$&$H$9$kF0;l$N(B + $B!V8l44ItJ,!W$NFI$_$H4A;zJ8;zNs$rM?$($kI,MW$,$"$j$^$9!#(B + $BNc$($P!V%1%A$k!W$H$$$&F0;l$rEPO?$7$?$$>l9g$K$OFI$_$K(B + $B!V$1$A!W!"BP1~$9$kJQ49:Q$_J8;zNs$K!V%1%A!W!"IJ;l$K(B + $B!V%i9T8^CJF0;l!W$r;XDj$7$^$9!#$^$?!"!V%d%P$$!W$H$$$&(B + $B7AMF;l$rEPO?$7$?$$>l9g$OFI$_$K!V$d$P!W!"BP1~$9$k(B + $BJQ49:Q$_J8;zNs$K!V%d%P!W!"IJ;l$K!V7AMF;l!W$r;XDj$7$^$9!#(B + + (4) $B>C5n;~$O0lEY$K$R$H$D$N=O8l(B<->$BIJ;l(B $B$NAH9g$;$7$+>C5n$7$^$;$s!#(B + $B$R$H$D$N=O8l$,J#?t$NIJ;l$GEPO?$5$l$F$$$k$H$-$O!"(B[2]4. $B>C5nA`:n(B + $B7k2LI=<(%b!<%I(B $B$G(B cancel $B$K%P%$%s%I$5$l$?%-!<$G$^$?(B + [2]2. $BHO0O;XDj!?FI$_F~NO%b!<%I$KLa$C$F>C5nF0:n$r7+$jJV$7(B + $B9T$C$F$/$@$5$$!#(B + +<7> $BF~NOJ8;zJQ49$N35MW(B + + Xsj3clib $B$G$OJ8;zF~NO$O#5@\(B + $BF~NO$G$-$^$9$,!"$3$N#5@\F~NO$9$k:]$N(B + $BJQ495,B'$K$D$$$F@bL@$7$^$9!#(B + + $BJ8;zF~NO;~$N%-!$lA4$/0[$J$k=hM}$,$5$l$^$9!#(B + + [1] Latin1 $B$N(B keysym $B$N$H$-$OF~NOJ8;z3QJ8;zNs$KBP$7$F(B + $B$=$l$>$l0J2<$N=hM}$r9T$$$^$9!#(B + + (1) $BF~NOJ8;z$C$F%m!<%^$+$JJQ49$7$?7k2L$rI=<($7$^$9!#(B + + (2) $BF~NOJ8;z$C$F%m!<%^$+$JJQ49$7$?7k2L$r(B + sjhk $B%U%!%$%k$N#1NsL\(B([zhira])$B$H#2NsL\$N(B([zkata])$B$N(B + $BJQ495,B'$K=>$C$FJQ49$7!"I=<($7$^$9!#(B + + (3) $BF~NOJ8;z3Q%+%?%+%J!W(B($B%G%U%)%k%H$N(B sjrc $B$G$OL$;HMQ(B)$B$N$H$-(B + sjrk $B%U%!%$%k$N5-=R$K=>$C$F%m!<%^$+$JJQ49$7$?7k2L$r(B + $B$R$i$,$J$N$H$-$O(B sjhk $B%U%!%$%k$N#1NsL\(B([zhira])$B$H#3NsL\$N(B([hkata])$B$N(B + $BJQ495,B'!"A43Q%+%?%+%J$H$-$O(B sjhk $B%U%!%$%k$N#2NsL\(B + ([zkata])$B$H#3NsL\(B([hkata])$B$NJQ495,B'$K=>$C$FJQ49$7!"(B + $B$=$N$$$:$l$G$b$J$$$H$-$O(B sjzh $B%U%!%$%k$N#3NsL\(B([zkana]) + $B$H#4NsL\(B([hkana])$B$NJQ495,B'$K=>$C$FJQ49$7!"I=<($7$^$9!#(B + + (4) $BF~NOJ8;z3Q%"%k%U%!%Y%C%H!W(B + ($B%G%U%)%k%H$N(B sjrc $B$N%b!<%II=<($G$O!V(BABC$B!W(B) + $B$N$H$-F~NO$5$l$?%"%9%-!$C$FJQ49$7!"I=<($7$^$9!#(B + + $BNc$($P!"%G%U%)%k%H$N(B sjrk $B%U%!%$%k$K$O!V(B.$B!W$KBP1~$7$F(B + $B!V!#!W$,$"$k$N$G!"F~NOJ8;zl9g(B(keysym $B$,(B period $B$GF~NOJ8;zl9g(B)$B$N(B + $BI=<(7k2L$rJQ$($k$K$O(B sjrk $B$r%+%9%?%^%$%:$7$^$9!#(B + + $B$?$@$7!"(BLatin1 $B$N(B keysym $B$G$b5?;w$+$JF~NO5!G=$,(B on $B$K$J$C$F$$$k$H$-(B + (<5>[3]40. $B$N(B .KanaInputOnly$B!"(B<5>[1]$B$N(B "kana" $B$N9`;2>H(B)$B$O(B + $BNc30$G!"F~NO$5$l$?%"%9%-!3Q%+%?%+%J$KJQ49$7!"(B + $B0J9_8e$K@bL@$9$k(B [2] $B$NF0:n$r9T$$$^$9!#(B + + $B$^$?!"(B.AlphabetConversion on $B$N;~$OF~NOJ8;z$C$FJQ49$7!"I=<($7$^$9!#(B + + [2] Katakana $B$N(B keysym $B$N$H$-$OF~NOJ8;z3QJ8;zNs$KBP$7$F(B + $B$=$l$>$l0J2<$N=hM}$r9T$$$^$9!#(B + (CcWnn $B$G$O(B XLookupString $B$G8+$F$$$k$N$G2?$bI=<($5$l$J$$(B) + + (1) $BF~NOJ8;z3Q%+%?%+%J$r(B .AlphabetConversion off $B$N;~$O(B + sjhk $B%U%!%$%k$N#3NsL\(B([hkata])$B$H#1NsL\(B([zhira])$B$NJQ495,B'$K=>$C$F(B + $BJQ49$7!"I=<($7$^$9!#(B.AlphabetConversion on $B$N;~$O$3$l$G(B + $BJQ49$7$-$l$J$+$C$?$b$N$r(B sjzh $B%U%!%$%k$N#4NsL\(B([hkana])$B$H(B + $B#3NsL\(B([zkana])$B$NJQ495,B'$K=>$C$FJQ49$7!"I=<($7$^$9!#(B + + (2) $BF~NOJ8;z3Q%+%?%+%J$r(B .AlphabetConversion off $B$N;~$O(B + sjhk $B%U%!%$%k$N#3NsL\(B([hkata])$B$H#2NsL\(B([zkata])$B$NJQ495,B'$K=>$C$F(B + $BJQ49$7!"I=<($7$^$9!#(B.AlphabetConversion on $B$N;~$O$3$l$G(B + $BJQ49$7$-$l$J$+$C$?$b$N$r(B sjzh $B%U%!%$%k$N#4NsL\(B([hkana])$B$H(B + $B#3NsL\(B([zkana])$B$NJQ495,B'$K=>$C$FJQ49$7!"I=<($7$^$9!#(B + + (3) $BF~NOJ8;z3Q%+%?%+%J!W$N$H$-(B + $BF~NO$5$l$?H>3Q%+%?%+%J$r$=$N$^$^I=<($7$^$9!#(B + + (4) $BF~NOJ8;z3Q%"%k%U%!%Y%C%H!W$N$H$-(B + $B%Y%k$rLD$i$7$F2?$bF~NO$5$l$^$;$s!#$?$@$7!"5?;w$+$JF~NO5!G=$,(B + on $B$N>l9g$OF~NO$5$l$?J8;z$rH>3Q%+%?%+%J$K$;$:!"$=$N$^$^(B + $B%"%9%-!l9g$OF~NO$5$l$?J8;z$rH>3Q%+%?%+%J$K$;$:!"$=$N$^$^(B + $B%"%9%-!$C$FJQ49$7!"I=<($7$^$9!#(B + ($B3Q$N$D$b$j(B) $B$K$OBP1~$7$F#1NsL\(B([zhira]$B!K$KA43Q$N!V!#!W$,$"$k$N$G!"(B + $BF~NOJ8;z3Q$N(B + $B!V!#!W(B(keysym $B$,(B kana_fullstop) $B$rF~NO$9$k$HA43Q$N!V!#!W$H$7$F(B + $BI=<($5$l$^$9!#$h$C$F!"$3$N>l9g(B(keysym $B$,(B kana_fullstop $B$G(B + $BF~NOJ8;zl9g(B)$B$NI=<(7k2L$rJQ$($k$K$O(B sjhk $B%U%!%$%k(B + $B$r%+%9%?%^%$%:$7$^$9!#(B + +<8> $B@)8B;v9`(B + + Xsj3clib(sj3lib) $B$K$O0J2<$N$h$&$J@)8B;v9`$,$"$j$^$9!#(B + + 1. InputMode $B$GJQ49BP>]$NJ8@a$NFI$_J8;zNs$N9g7W$,(B 480bytes + $B$rD6$($k$H$-(B($BH>3Q%+%?%+%J!?H>3Q(B ASCII $BJ8;z$O(B + 1byte/1$BJ8;z!"$=$l0J30$O(B 2byte/1$BJ8;z(B $B$H$7$F49;;(B)$B$O(B + $B$+$J"*4A;zJQ49$K$h$C$F(B ConvedMode $B$K$O0\$l$^$;$s!#(B + $B$?$@$7!"$=$N$^$^3NDj$9$k$3$H$O2DG=$G$9!#(B + +<9> $B:#8e$N2]Bj(B + +1. Xsj3clib $B$N$+$J4A;zJQ49%5!<%P$K(B sj3serv $B0J30$b%5%]!<%H$7$F!"(B + $B$R$H$D$NF~NO%5!<%P$GF1;~$KJ#?t$N$+$J4A;zJQ49%7%9%F%`(B + $B$H@\B3$7$?$j!"F0E*$K@Z$jBX$($i$l$k$h$&$K$9$k(B +2. $B%m!<%^;z$+$JJQ49$GESCf$N(B Preedit $BCf$KBgJ8;z>.J8;z$,:.:_$7$F$b(B + CcWnn $B$N$h$&$K:G8e$NJl2;$NBg>.$@$1$G$R$i$,$J!?%+%?%+%J$K(B + $BJQ49$G$-$k$h$&$K$9$k(B +3. $B%3!<%I0l3gJQ49!"%3!<%II=<($X$NJQ49$r%5%]!<%H$9$k(B +4. $B#1$D$N%-!$NJQ49%7%9%F%`$N%f!<%6!&%$%s%?!<%U%'!<%9$b%(%_%e%l!<%H(B + $B$G$-$k$h$&$K$9$k!#(B +6. $B%3%s%H%m!<%k%3!<%I$N%"%W%j%1!<%7%g%s$X$N $B%P%0$r8+$D$1$?$i!D(B + +$B%P%0$r8+$D$1$?$i!"$^$?!"$=$NB>$J$I$O(B kinput2@sra.co.jp +$B08$K%l%]!<%H$7$F$/$@$5$$!#$^$?!"$3$s$J$+$J4A;zJQ49%7%9%F%`(B +(PC $B>e$N%"%W%j%1!<%7%g%sEy$r4^$`(B)$B$r%(%_%e%l!<%H$9$k(B sjrc $B%U%!%$%k$r(B +$B:n$C$?$h!"$H$+$3$s$J5!G=$,B-$j$J$$!"$H$$$&>pJs$r4?7^$7$^$9!#(B + +<$BIUO?(B1> Canna $B$N%f!<%6!&%$%s%?!<%U%'!<%9$r%(%_%e%l!<%H$9$kJ}K!(B + +sj3def/ $B$K(B Canna $B$N%f!<%6%$%s%?!<%U%'!<%9$r(B +$B%(%_%e%l!<%H$9$k(B sjrc/sjrk $B%U%!%$%k$,$"$j$^$9$N$G4JC1$K(B Canna $B$N(B +$B%f!<%6!&%$%s%?!<%U%'!<%9$G(B sj3serv $B$r;HMQ$G$-$^$9!#(B +$B0J2<$NuBV$K$7$?$H$-!"%+%l%s%H$N(B + $B0LCV$rH?E>$G$O$J$/!"%F%-%9%H%+!<%=%k$GI=$7$^$9!#(B + $B%F%-%9%H%+!<%=%k$OJ8;zNs$N0lHVA0$K$"$k$H7k9=8+$K$/$$$G$9!#(B +3. $B5-9fF~NO$O(B AuxPanel $B$G$J$/!"(BCandidatePanel $B$NA*BrJ}<0$G$9!#(B +4. $BJ8@aJT=8J}K!$O(B CcWnn $B$NJ}<0$G$9!#(B +5. $BJ8;z.$O(B Meta-Ctrl-o/Meta-Ctrl-i + $B$K3d$jIU$1$F$$$^$9!#J8;z$7$^$;$s!#(B +6. $BF1;~$KJ#?t$NJ8@a$GJT=8!"J8;z.$,$G$-$F$7$^$$$^$9!#(B +7. $B<-=qEPO?!?:o=|$O(B ConvedMode $B$N(B Help/Shift-Help $B$K3d$jIU$1$F$$$^$9!#(B +8. Canna $B$G$O$+$J4A;zJQ49$7$?$H$-$K$I$NI=<(J8;z3Q?t;z$O(B + $BI,$:A43Q?t;z$KJQ49$7$^$9$,!"(Bsj3 $B$G$O86B'$H$7$FJQ498uJd$NFI$_$KH>3Q$O(B + $B sjx $B$N%f!<%6!&%$%s%?!<%U%'!<%9$r%(%_%e%l!<%H$9$kJ}K!(B + +sj3def/ $B$K(B sjx $B$N%f!<%6!&%$%s%?!<%U%'!<%9$r(B +$B%(%_%e%l!<%H$9$k(B sjrc/sjrk $B%U%!%$%k$,$"$j$^$9$N$G4JC1$K(B sjx $B$N(B +$B%f!<%6!&%$%s%?!<%U%'!<%9$G(B sj3serv $B$r;HMQ$G$-$^$9!#(B +$B0J2<$N 1 1 0 0 8.00 ] +} if +/ch-data exch def +currentfont /BitMaps get ch-code ch-data put +currentfont /Encoding get ch-code +dup s3 cvs cvn +put +} bind def +/BP { +/SaveImage save def +xoffset yoffset translate +72 72 +landscape { +exch translate +90 rotate +}{ +paperheight exch sub translate +} ifelse +72 Resolution div dup neg scale +0 0 moveto +} bind def +/EP { +showpage +SaveImage restore +} bind def +/START { +/Resolution exch def +} bind def +/END /end load def +/l /lineto load def +/p /moveto load def +/r { +0 rmoveto +} def +/s /show load def +/ru { +/dy exch neg def +/dx exch def +/x currentpoint /y exch def def +newpath x y moveto +dx 0 rlineto +0 dy rlineto +dx neg 0 rlineto +closepath fill +x y moveto +} bind def +/@SpecialDefaults { +/hsi paperwidth inch def +/vsi paperheight inch def +/hof 0 def +/vof 0 def +/hsc 1 def +/vsc 1 def +/rotat 0 def +/CLIP false def +/BBOX false def +/EPSF false def +} bind def +/@hsize {/hsi exch def /CLIP true def} bind def +/@vsize {/vsi exch def /CLIP true def} bind def +/@hoffset {/hof exch def} bind def +/@voffset {/vof exch def} bind def +/@hscale {/hsc exch def} bind def +/@vscale {/vsc exch def} bind def +/@rotation {/rotat exch def} bind def +/@bbox { +/ury exch def +/urx exch def +/lly exch def +/llx exch def +/BBOX true def +} bind def +/@epsf { +/hsi 0 def +/vsi 0 def +/EPSF true def +} bind def +/@setclipper { +CLIP { +newpath 0 0 moveto hsi 0 rlineto 0 vsi rlineto hsi neg 0 rlineto +closepath clip +} if +} bind def +/@beginspecial { +/SpecialSave save def +currentpoint transform initgraphics itransform translate +dup scale +landscape {90 rotate} if +@SpecialDefaults +@MacSetUp +} bind def +/@setspecial { +hof vof translate +EPSF BBOX and { +hsi 0 eq { +vsi 0 eq { +hsc vsc +}{ +vsi ury lly sub div dup +}ifelse +}{ +vsi 0 eq { +hsi urx llx sub div dup +}{ +hsi urx llx sub div vsi ury lly sub div +} ifelse +} ifelse +scale +llx neg ury neg translate +newpath +llx lly moveto +urx llx sub 0 rlineto +0 ury lly sub rlineto +llx urx sub 0 rlineto +closepath clip +newpath +}{ +@setclipper hsc vsc scale rotat rotate +} ifelse +end +/letter {} def /note {} def /legal {} def /11x17 +/b4 {} def /b5 {} def /a5 {} def /a4 {} def /a3 {} def +/showpage {} def /copypage {} def /erasepage {} def +} bind def +/@MacSetUp { +userdict /md known { +userdict /md get type /dicttype eq { +/MacDrwgs true def +md /txpose known { +md /txpose {pxs pys neg scale} put +} if +md /cp known { +md /cp {pop pop pm restore} put +} if +} if +} if +} bind def +/@push { +/SpecialSave save def +currentpoint translate +dup scale +newpath +} bind def +/@pop { +SpecialSave restore +} bind def +/@pn +/setlinewidth load +def +/@pt { +moveto currentpoint currentlinewidth 2 div 0 360 arc fill +} bind def +/@ln { +moveto lineto stroke +} bind def +/@ar { +matrix currentmatrix +7 -2 roll moveto +currentpoint translate +newpath +5 -2 roll scale +0 0 1 6 -2 roll arc +setmatrix +} bind def +/@wh {1 setgray} bind def +/@sh {0.75 setgray} bind def +/@bk {0 setgray} bind def +/@RGB {setrgbcolor} bind def +/@HSB {sethsbcolor} bind def +/@CMYK {setcmykcolor} bind def +end +/@endspecial { +clear +TeXDict begin +SpecialSave restore +} bind def +systemdict /setpacking known { +savepacking setpacking +} if +%%EndFile +%%EndProlog +%%BeginSetup +%%PaperSize: A4 +%%Feature: *ManualFeed False +%%Feature: *Resolution 300 +TeXDict begin +@landscape +@large +@a4 +%%BeginFile: /usr/local/lib/tex/dvi2ps-1.7j/ASCII-LW-fix.ps +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%% Following procedures are used to define new japanese font which has +%%% correct metrics. +%%% Added by T.Kakiuchi (kakiuchi@sy6.isl.mei.co.JP) 89/5/19 +%%% Copyright (c) Matsushita Electric Industrial Co.,Ltd. 1990 +%%% +% If the packed-array facility is available, this program sets the +% array-packing mode. +systemdict /setpacking known { + /savepacking currentpacking def + true setpacking +} if +% Procedure to make a new font which has new metrics. + +/Set-New-Metrics % [New-FNam][FNam][Metrics-array] +{/Set-Metrics exch def % [New-FNam][FNam] Set-Metrix=[Metrix-Array] + findfont % [New-FNam][FDic] + /OrigCompFont exch def % [New-FNam] OrigCompFont=[FDic] + /NewCompFontName exch def % NewCompFontName=[New-FNam] + + % Create new composite font. + OrigCompFont dup % [FDic][FDic] + length dict % [FDic][dict] + /NewCompFont exch def % [FDic] NewCompFont=[dict] + {1 index % [FDic][key][value][key] + /FID ne % [FDic][key][value][T/F] + 2 index /UniqueID ne and % [FDic][key][value][T/F] + {NewCompFont 3 1 roll put} % if TRUE NewCompFont <- {key,value} + {pop pop} + ifelse + } forall % + + OrigCompFont /FDepVector get % [FDepVector] + dup length array % [FDepVector][array] + copy % [array] (=[FDepVector]) + /NewFDepVector exch def % NewFDepVector=[arrray] + NewCompFont /FDepVector + NewFDepVector put % [NewCompFont] <- {/FDepVector, NewFDepVector} + + Set-Metrics % [code,NewBaseFontName,Metrics-Array] + {dup 0 get /Code exch def % set Code + dup 1 get + /NewBaseFontName exch def % set NewBaseFontName + 2 get /Metric-Array exch def % set Metrics-Array + + % Extract base font and its index to FDepVector. + /Index + OrigCompFont + /Encoding get + Code get def + + /OrigBaseFont NewFDepVector Index get def + + % Set Metric-Dictionary + Metric-Array length dict + /Metric-Dict exch def + Metric-Dict begin Metric-Array {exec def} forall end + + % Create new base font. + OrigBaseFont dup % [OrgFont][OrgFont] + length 3 add % [OrgFont][1+current size] + dict % [OrgFont][dict] + /NewBaseFont exch def % [OrgFont] /NewBaseFont=[dict] + {1 index % [OrgFont][key][value][key] + /FID ne % [OrgFont][key][value][T/F] + 2 index /UniqueID ne and % [OrgFont][key][value][T/F] + {NewBaseFont % [OrgFont][key][value][NewBaseFont] + 3 1 roll % [OrgFont][NewBaseFont][key][value] + put} % [OrgFont] + {pop pop} + ifelse + } forall + + NewBaseFont /Kusumi-Metrics Metric-Dict put + + NewBaseFont /Metrics + Metric-Array dup length dict begin + { exec dup 1 1000.0 put def } forall + currentdict end put + + NewBaseFont % [OrgFont][NewBaseFont] + /CDevProc + {currentfont /Kusumi-Metrics + % w0x w0y llx lly urx ury w1x w1y vx vy code font /Kusumi- + 2 copy known + {get % w0x w0y llx lly urx ury w1x w1y vx vy code metrics + exch 2 copy known + { + get % w0x w0y llx lly urx ury w1x w1y vx vy array + dup 0 get % w0x w0y llx lly urx ury w1x w1y vx vy array new-llx + exch 1 get % w0x w0y llx lly urx ury w1x w1y vx vy new-llx new-lly + dup % w0x w0y llx lly urx ury w1x w1y vx vy new-llx new-lly new-lly + 8 -1 roll % w0x w0y llx lly urx w1x w1y vx vy new-llx new-lly new-lly ury + 10 -1 roll % w0x w0y llx urx w1x w1y vx vy new-llx new-lly new-lly ury lly + sub add % w0x w0y llx urx w1x w1y vx vy new-llx new-lly new-ury + 7 1 roll % w0x w0y llx urx new-ury w1x w1y vx vy new-llx new-lly + 8 1 roll % w0x w0y llx new-lly urx new-ury w1x w1y vx vy new-llx + dup % w0x w0y llx new-lly urx new-ury w1x w1y vx vy new-llx new-llx + 8 -1 roll % w0x w0y llx new-lly new-ury w1x w1y vx vy new-llx new-llx urx + 10 -1 roll % w0x w0y new-lly new-ury w1x w1y vx vy new-llx new-llx urx llx + sub add % w0x w0y new-lly new-ury w1x w1y vx vy new-llx new-urx + 7 1 roll % w0x w0y new-lly new-urx new-ury w1x w1y vx vy new-llx + 8 1 roll % w0x w0y new-llx new-lly new-urx new-ury w1x w1y vx vy + } { pop pop } ifelse + } { pop pop pop } ifelse + } put + + % Regist to FDepVector + NewFDepVector Index NewBaseFontName NewBaseFont definefont put + + } forall + + NewCompFontName NewCompFont + definefont pop % Define [NewCompFont] as [NewCompFontName] +} +bind def + +% Definition of new metrics for /Ryumin-Light-H +/Ryumin-Metrics +[ +[33/Ryumin-Light-H-33[ +{/c22 [127.507 -74.3191]} +{/c23 [102.007 -75.2261]} +{/c24 [103.833 -142.045]} +{/c25 [106.833 -21.8191]} +{/c26 [106.333 290.856]} +{/c27 [105.323 -22.3191]} +{/c28 [101.333 -88.2392]} +{/c29 [50.4616 -50.9548]} +{/c2A [111.833 -50.9548]} +{/c2B [56.3327 584.077]} +{/c2C [81.7527 620.896]} +{/c2D [73.195 622.713]} +{/c2E [73.1949 622.713]} +{/c2F [86.4865 695.803]} +{/c30 [106.905 649.984]} +{/c33 [123.507 285.037]} +{/c35 [124.507 236.947]} +{/c36 [154.717 247.806]} +{/c37 [145.717 141.902]} +{/c39 [35.7169 42.2182]} +{/c3E [51.8327 339.356]} +{/c42 [79.8026 -76.5983]} +{/c43 [153.333 -76.5983]} +{/c46 [101.833 534.532]} +{/c47 [101.333 510.442]} +{/c48 [95.6039 553.532]} +{/c49 [95.824 547.532]} +{/c4A [137.007 -116.598]} +{/c4B [137.007 -116.598]} +{/c4C [120.007 -116.598]} +{/c4D [120.007 -116.598]} +{/c4E [132.007 -101.817]} +{/c4F [131.507 -101.817]} +{/c50 [192.016 -121.598]} +{/c51 [192.017 -121.598]} +{/c52 [99.5065 -1.64352]} +{/c53 [99.5065 -1.64352]} +{/c54 [52.5065 -122.598]} +{/c55 [52.5065 -122.598]} +{/c56 [87.0065 -95.4706]} +{/c57 [87.0065 -101.817]} +{/c58 [104.457 -101.817]} +{/c59 [104.456 -101.817]} +{/c5A [122.007 -116.598]} +{/c5B [122.007 -116.598]} +{/c68 [12.747 88.0878]} +{/c69 [33.1968 -90.7713]} +{/c6A [53.6868 -66.46]} +{/c6B [129.961 597.806]} +{/c6C [154.132 592.713]} +{/c6D [73.5612 592.713]} +{/c70 [147.722 -99.2739]} +{/c71 [162.717 -119.0]} +{/c72 [45.6719 -25.4548]} +{/c78 [36.5515 -98.3165]} +]] +[36/Ryumin-Light-H-36[ +{/c21 [83.9483 -17.5452]} +{/c23 [76.1769 22.4495]} +{/c25 [184.155 -73.3244]} +{/c26 [241.525 -88.5079]} +{/c27 [97.2168 -29.5]} +{/c29 [82.2642 -19.8191]} +{/c2F [295.128 -52.5983]} +{/c30 [154.133 -78.1888]} +{/c31 [105.385 -66.101]} +{/c32 [65.1122 -64.1009]} +{/c39 [76.6303 -70.8296]} +{/c3A [51.3751 -79.2765]} +{/c43 [67.7751 29.6356]} +{/c63 [75.9087 -25.5052]} +{/c65 [90.2671 -20.4574]} +{/c67 [149.762 -22.0]} +{/c6A [273.126 -74.5131]} +{/c6E [77.4092 -20.0079]} +]] +[37/Ryumin-Light-H-37[ +{/c21 [107.237 -10.5557]} +{/c22 [140.608 -10.694]} +{/c23 [138.672 -21.8696]} +{/c24 [186.108 -23.5983]} +{/c25 [122.757 10.173]} +{/c26 [162.618 -18.9653]} +{/c27 [57.7171 46.4069]} +{/c29 [108.717 5.18086]} +{/c2A [134.608 -18.8644]} +{/c2F [187.108 -13.3749]} +{/c30 [99.7332 -13.3749]} +{/c31 [115.108 -38.1461]} +{/c32 [61.9606 -40.6461]} +{/c35 [83.0882 -28.101]} +{/c36 [51.291 -27.6009]} +{/c3D [164.236 1.72083]} +{/c3E [72.1387 -3.5531]} +{/c3F [192.108 6.21558]} +{/c40 [110.209 -19.3749]} +{/c41 [97.8211 -5.50787]} +{/c42 [59.748 -30.0983]} +{/c43 [117.717 -1.05572]} +{/c44 [162.608 -4.77917]} +{/c45 [91.8148 -6.10358]} +{/c46 [123.608 -16.1914]} +{/c47 [67.1082 -16.1914]} +{/c48 [277.108 -19.0983]} +{/c49 [202.688 -19.0983]} +{/c4A [116.233 -22.1461]} +{/c4E [197.608 20.8565]} +{/c55 [168.068 9.80597]} +{/c56 [84.1834 -2.28442]} +{/c57 [89.1683 -21.694]} +{/c5F [258.608 7.7634]} +{/c61 [191.608 34.9443]} +{/c63 [80.217 -31.7792]} +{/c64 [109.108 -13.2418]} +{/c65 [49.507 53.3165]} +{/c67 [152.293 46.8617]} +{/c69 [178.108 -18.1461]} +{/c6A [239.098 -22.1435]} +{/c6E [126.697 -17.1461]} +{/c6F [163.078 -7.6488]} +{/c72 [193.323 1.49213]} +{/c75 [124.712 16.4921]} +{/c76 [83.6869 -21.5079]} +]] +] def + +% Definition of new metrics for /GothicBBB-Medium-H +/Gothic-Metrics +[ +[33/GothicBBB-Medium-H-33[ +{/c22 [129.507 -72.8191]} +{/c23 [98.9866 -92.2713]} +{/c24 [105.833 -114.729]} +{/c25 [102.833 -1.72871]} +{/c26 [102.833 311.447]} +{/c27 [104.333 47.9522]} +{/c28 [104.333 -68.9574]} +{/c29 [81.9568 -5.86435]} +{/c2A [132.288 -5.86435]} +{/c2B [62.8327 601.122]} +{/c2C [78.8429 605.851]} +{/c2D [55.8326 747.529]} +{/c2E [55.8327 747.529]} +{/c2F [102.506 765.029]} +{/c30 [110.507 728.484]} +{/c33 [76.5065 192.356]} +{/c35 [67.0065 168.356]} +{/c36 [133.717 168.673]} +{/c37 [148.717 167.947]} +{/c39 [14.7171 44.9443]} +{/c3E [-13.1673 338.402]} +{/c42 [76.8826 -93.6435]} +{/c43 [149.333 -93.6435]} +{/c46 [104.333 531.761]} +{/c47 [104.833 521.303]} +{/c48 [56.0265 531.761]} +{/c49 [56.9765 520.303]} +{/c4A [136.007 -97.0983]} +{/c4B [136.007 -97.0983]} +{/c4C [120.007 -92.5531]} +{/c4D [120.007 -92.5531]} +{/c4E [132.507 -91.2261]} +{/c4F [132.507 -91.2261]} +{/c50 [178.072 -108.0]} +{/c51 [177.982 -108.0]} +{/c52 [97.5065 -122.598]} +{/c53 [97.5065 -122.598]} +{/c54 [58.5065 -101.598]} +{/c55 [58.5065 -101.598]} +{/c56 [93.5065 -115.471]} +{/c57 [94.0065 -92.7261]} +{/c58 [107.037 -76.2261]} +{/c59 [107.036 -76.2261]} +{/c5A [121.007 -99.0983]} +{/c5B [121.007 -99.0983]} +{/c68 [5.70184 53.4974]} +{/c69 [20.1768 1.63565]} +{/c6A [43.6568 -67.96]} +{/c6B [138.987 645.032]} +{/c6C [157.007 631.803]} +{/c6D [75.5065 631.303]} +{/c70 [109.182 -97.3643]} +{/c71 [130.717 -87.9548]} +{/c72 [101.717 -23.4548]} +{/c78 [11.5265 -72.6356]} +]] +[36/GothicBBB-Medium-H-36[ +{/c21 [86.707 -70.0]} +{/c23 [58.2168 -27.0]} +{/c25 [155.272 -56.8722]} +{/c26 [207.583 -61.9653]} +{/c27 [97.2418 -48.5904]} +{/c29 [51.7468 10.6809]} +{/c2F [256.108 -51.5531]} +{/c30 [154.608 -51.5531]} +{/c31 [128.098 -43.1461]} +{/c32 [69.0981 -43.1461]} +{/c39 [93.5732 -52.8218]} +{/c3A [70.6131 -76.9122]} +{/c43 [51.2172 -38.8722]} +{/c63 [52.2169 -55.1861]} +{/c65 [84.167 -70.2287]} +{/c67 [106.287 -48.5904]} +{/c6A [211.098 -46.6887]} +{/c6E [71.752 -48.4627]} +]] +[37/GothicBBB-Medium-H-37[ +{/c21 [47.2171 -61.1914]} +{/c22 [82.6082 -2.01312]} +{/c23 [102.766 -49.96]} +{/c24 [148.446 -30.0983]} +{/c25 [104.207 -69.2818]} +{/c26 [149.118 -53.2844]} +{/c27 [74.2168 -4.90957]} +{/c29 [72.2168 -46.5452]} +{/c2A [111.608 -31.9548]} +{/c2F [135.608 -35.194]} +{/c30 [91.1081 -35.194]} +{/c31 [77.6081 -46.9653]} +{/c32 [48.6081 -71.0557]} +{/c35 [87.1181 -22.0557]} +{/c36 [52.1181 -22.0557]} +{/c3D [123.059 5.81125]} +{/c3E [83.6081 -25.4174]} +{/c3F [144.608 -29.2844]} +{/c40 [76.6081 -29.7844]} +{/c41 [97.6082 -16.9174]} +{/c42 [55.1081 -15.9174]} +{/c43 [84.5454 -66.6861]} +{/c44 [117.481 2.85648]} +{/c45 [72.1081 -21.4174]} +{/c46 [96.6082 -30.827]} +{/c47 [49.6081 -34.827]} +{/c48 [262.608 -4.5531]} +{/c49 [209.108 -19.5531]} +{/c4A [75.6082 -41.6461]} +{/c4E [163.334 25.9017]} +{/c55 [140.608 5.48688]} +{/c56 [91.1081 -15.6036]} +{/c57 [64.6481 -15.6036]} +{/c5F [215.108 -45.5983]} +{/c61 [188.976 18.9017]} +{/c63 [67.7169 -53.5052]} +{/c64 [96.6081 -28.0983]} +{/c65 [41.7168 5.63565]} +{/c67 [113.717 -50.9096]} +{/c69 [129.108 -22.6461]} +{/c6A [225.578 -27.5983]} +{/c6E [96.2168 -42.5105]} +{/c6F [135.608 -40.5131]} +{/c72 [165.608 -33.327]} +{/c75 [110.257 -69.1435]} +{/c76 [63.2168 -52.9627]} +]] +] def +systemdict /setpacking known { + savepacking setpacking +} if +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%EndFile +300 START +1.000 120 /f31 NF +f31 SF +[<7F1FC0FF1FE07F1FC01C07001C07001C07001FFF000FFE000FFE000E0E000E0E00071C00071C00071C00071C00071C000318 + 0003B80003B80003B80001B00001B00001F00001F00000E000> 24 25 -1 0 21.793] 65 D +[<01F00007FC000FFE001F0F003C0700380380700380700380F00000E00000E00000E00000E00000E00000E00000E00000F000 + 007003807003803803803C07801F0F800FFF8007FB8001F180> 24 25 -2 0 21.793] 67 D +[<7FFFE0FFFFE07FFFE01C00E01C00E01C00E01C00E01C00E01C00001C1C001C1C001FFC001FFC001FFC001C1C001C1C001C00 + 001C00001C01C01C01C01C01C01C01C07FFFC0FFFFC07FFFC0> 24 25 -1 0 21.793] 69 D +[<7F07E0FF8FF07F07E01C03801C07001C07001C0E001C0E001C1C001E1C001F38001FF8001FF0001DF0001CE0001CF0001C78 + 001C3C001C1C001C0E001C0F001C07807F0FE0FF8FF07F0FE0> 24 25 0 0 21.793] 75 D +[ 24 25 -1 0 21.793] 76 D +[<7F0F00FF9F007F1F001C17001C37001C37001C37001C77001C77001C67001C67001CE7001CE7001CE7001CC7001CC7001DC7 + 001DC7001D87001D87001D87001D07007F1FC0FF3FE07E1FC0> 24 25 -1 0 21.793] 78 D +[<1FFC003FFE007FFF00780F00F00780F00780E00380E00380E00380E00380E00380E00380E00380E00380E00380E00380E003 + 80E00380E00380E00380F00780780F007FFF003FFE001FFC00> 24 25 -2 0 21.793] 79 D +[ 24 25 -2 0 21.793] 83 D +[<07FC000FFE0007FC0000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E0 + 0000E000E0E0E0E0E0E0E0E0E0E0E0E0FFFFE0FFFFE07FFFE0> 24 25 -1 0 21.793] 84 D +[<00E00001F00001F00001B00003B80003B80003B800031800071C00071C00071C00071C00060C000E0E000E0E000E0E000E0E + 001C07001C07001C07001C0700380380FE0FE0FF1FE0FE0FE0> 24 25 -1 0 21.793] 86 D +[<0F83E03FE7E07FFFE0783E00E00E00E00E00E00E00700E003E0E001FFE0003FE00000E00000E00300E00783C007FF8003FF0 + 001FE000> 24 18 -2 0 21.793] 97 D +[<03F00FF81FFC3E0E78077007F000E000E000E000E000E0007000780C3C1E1FFE0FFC03F8> 16 18 -3 0 21.793] 99 D +[<07C7E00FE7F01FFFE03C1F00700F00700F00E00700E00700E00700E00700E00700E00700700700780F003C1F001FFF000FF7 + 0003C700000700000700000700000700003F00007F00003F00> 24 25 -1 0 21.793] 100 D +[<03F00FFC1FFE3C0F78077007E000E000FFFFFFFFFFFFE0077007780E3C1E1FFC0FF803E0> 16 18 -3 0 21.793] 101 D +[<03F8000FFE003FFF807C07C07001C0E000E0E000E0E000E0E000E07803C03FFF801FFF001FFC001800003800001BE0001FF0 + 000FF8001C1C00380E00380E00380E00380E00380E001C1CC00FFFE007F7E003E3C0> 24 28 -1 10 21.793] 103 D +[<7FC7F0FFE7F87FC7F00E03800E03800E03800E03800E03800E03800E03800E03800E03800E03800F03800F87800FFF000EFE + 000E3C000E00000E00000E00000E00007E0000FE00007E0000> 24 25 0 0 21.793] 104 D +[<7FFFFFFF7FFF01C001C001C001C001C001C001C001C001C001C001C001C07FC07FC07FC00000000000000000018003C003C0 + 0180> 16 26 -3 0 21.793] 105 D +[<3F807FC0FFE0F0F0607000380038003800380038003800380038003800380038003800380038003800380038003800381FF8 + 1FF81FF800000000000000000030007800780030> 16 35 -2 9 21.793] 106 D +[ 24 25 -2 0 21.793] 108 D +[ 24 18 0 0 21.793] 109 D +[<7FC7F0FFE7F87FC7F00E03800E03800E03800E03800E03800E03800E03800E03800E03800E03800F03800F87807FFF00FEFE + 007E3C00> 24 18 0 0 21.793] 110 D +[<03E0000FF8001FFC003C1E00780F00700700F00780E00380E00380E00380E00380E00380700700780F003C1E001FFC000FF8 + 0003E000> 24 18 -2 0 21.793] 111 D +[<7FC000FFE0007FC0000E00000E00000E00000E00000E00000E00000E3C000EFF000FFF800F83C00F01E00E00E00E00700E00 + 700E00700E00700E00700E00700E00E00F00E00F83C07FFF80FEFF007E3E00> 24 27 0 9 21.793] 112 D +[ 24 18 -1 0 21.793] 114 D +[ 16 18 -3 0 21.793] 115 D +[<00F80001FC0003FE00078700070380070380070380070100070000070000070000070000070000070000070000FFFF00FFFF + 007FFF00070000070000070000070000030000> 24 23 -1 0 21.793] 116 D +[<03E3F007FBF80FFFF00E0F800E03800E03800E03800E03800E03800E03800E03800E03800E03800E03800E03807E1F80FE3F + 807E1F80> 24 18 0 0 21.793] 117 D +[<00E00001F00001F00003B80003B80003B800071C00071C00071C00071C000E0E000E0E000E0E001E0F001C07007F1FC0FF1F + E07F1FC0> 24 18 -1 0 21.793] 118 D +[<0F1E000F1E000F1E001DB7001DB7001DB7001DB70019B30019F30019F30038E380380380380380380380380380FF1FE0FFBF + E0FF1FE0> 24 18 -1 0 21.793] 119 D +[<03E0000FF8001FFC001E3C003C1E00780F00700700700700F00780E00380E00380E00380E00380E00380E00380E00380E003 + 80700700700700780F00380E001E3C001FFC000FF80003E000> 24 25 -2 0 21.793] 48 D +[<7FF87FFC7FF8038003800380038003800380038003800380038003800380038003807380FF807F800F800780038003800180> 16 25 -4 0 21.793] 49 D +[<7FFF80FFFF807FFF803803801E03800F000003800001C00000E000007000003800001C00000E000007000007000003800003 + 80600380F00380F00780E00700783E003FFC001FF80007E000> 24 25 -2 0 21.793] 50 D +[<07E0001FF8003FFC00781E00E00700F00380600380000380000380000300000700001E0007FC0007F00007FC00003E00000E + 00000700000700300700780700781E003FFC001FF80007E000> 24 25 -2 0 21.793] 51 D +[<01C00001C00001C00001C00071C700F9CF807FFF001FFC0007F00007F0001FFC007FFF00F9CF8071C70001C00001C00001C0 + 0001C000> 24 18 -2 -4 21.793] 42 D +[<70F8F8F870> 8 5 -8 0 21.793] 46 D +[<70F8F8F870000000000000000070F8F8F870> 8 18 -8 0 21.793] 58 D +[ 16 32 -8 3 21.793] 91 D +[<4010F078FDF83FE00F800300> 16 6 -4 -19 21.793] 94 D +1.000 123 /f32 NF +f32 SF +[ 32 29 -1 0 27.673] 65 D +[ 24 29 -4 0 27.673] 66 D +[<003F8000FFF003C0780780180F00081E00003C00003C0000780000780000780000F00000F00000F00000F00000F00000F000 + 00F00000F00000F000007800007800007800003C00003C00001E00000F000007803003C0F000FFF0003FC0> 24 31 -3 1 26.520] 67 D +[ 24 29 -4 0 24.791] 69 D +[ 24 29 -4 0 23.638] 70 D +[<003F8001FFF003C0F80780380F00381E00383C00383C0038780038780038780038F00038F007F8F007F8F00000F00000F000 + 00F00000F00000F000007800007800007800003C00003C00001E00000F001807803803C0F801FFF0003F80> 24 31 -3 1 27.673] 71 D +[ 24 29 -4 0 29.403] 72 D +[ 8 29 -4 0 11.531] 73 D +[<1F807FE0FFF0E0F0C07800780078007800780078007800780078007800780078007800780078007800780078007800780078 + 00780078007800780078> 16 30 -2 1 19.602] 74 D +[ 16 29 -4 0 22.485] 76 D +[ 24 29 -4 0 29.403] 78 D +[<003F000001FFE00003FFF00007C0F8000F807C001F003E003E001F003C000F007C000F807800078078000780F80007C0F000 + 03C0F00003C0F00003C0F00003C0F00003C0F00003C0F00003C0F00003C07800078078000780780007803C000F003E001F00 + 1E001E000F807C0007C0F80003FFF00001FFE000003F0000> 32 31 -2 1 30.556] 79 D +[ 24 29 -4 0 26.520] 80 D +[<00000F8000001F0000003E0000003C00003F780001FFF80003FFF00007C1F8000F83FC001E03DE003E079F003C0F0F00780E + 07807800078078000780F00003C0F00003C0F00003C0F00003C0F00003C0F00003C0F00003C0F00003C0F00003C078000780 + 78000780780007803C000F003E001F001F003E000F807C0007C0F80003FFF00001FFE000003F0000> 32 35 -2 5 30.556] 81 D +[<07F0001FFC007C0E00F00700E00380C001800001C00001C00001C00001C00003C00003C0000780001F8001FF0007FE001FFC + 003FE0007F0000780000F00000E00000E00000E00000E000006000007003003807001C0F000FFE0003F800> 24 31 -2 1 23.061] 83 D +[<001E0000001E0000001E0000001E0000001E0000001E0000001E0000001E0000001E0000001E0000001E0000001E0000001E + 0000001E0000001E0000001E0000001E0000001E0000001E0000001E0000001E0000001E0000001E0000001E0000001E0000 + 001E0000001E0000FFFFFF80FFFFFF80> 32 29 -1 0 28.250] 84 D +[<01F80007FE000F07801E03803C01C07800E07800E0F00070F00070F00070F00070F00070F00070F00070F00070F00070F000 + 70F00070F00070F00070F00070F00070F00070F00070F00070F00070F00070F00070F00070F00070> 24 30 -4 1 28.538] 85 D +[<001C0000003E0000003E0000007B0000007300000073000000F3800000F1800001E1C00001E1C00001E0C00003C0E00003C0 + E00003C0600007807000078070000F0038000F0038000F0038001E001C001E001C003E000E003C000E003C000E0078000700 + 7800070078000700F0000380F0000380> 32 29 -1 0 27.673] 86 D +[<3F1C7FDC7FFCF07CE01CE01CE01C781C3FFC0FFC00FC001C001C401C70387FF83FF00FC0> 16 18 -2 0 19.948] 97 D +[ 16 29 -3 0 21.447] 98 D +[<07E00FF81FFC3C1C70047000E000E000E000E000E000E000700070043C1C1FFC0FF807E0> 16 18 -2 0 18.449] 99 D +[<0F8E1FEE3FFE7C3E701EF00EE00EE00EE00EE00EE00EE00E700E700E7C3E3FFE1FEE0F8E000E000E000E000E000E000E000E + 000E000E000E000E> 16 29 -2 0 21.447] 100 D +[<07E01FF83FFC3C1C70047000E000E000E000FFFCFFFCFFFC601C701878783FF01FE007C0> 16 18 -2 0 18.449] 101 D +[<0E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E00FFE0FFE00E000E000E000E000E000E000E00 + 070003FC01FC00FC> 16 29 0 0 12.684] 102 D +[<07F8001FFE003FFF007C0F80F003C0E001C0E001C0E001C07007803FFF801FFF001FFC003800003800003BC0001FF0001FF8 + 001C3800381C00381C00381C00381C00381C001C38001FFFC00FFFC003C3C0> 24 27 -1 9 20.755] 103 D +[ 16 29 -3 0 21.447] 104 D +[<70707070707070707070707070707070707000000000000000F0F0F0F0> 8 29 -2 0 9.916] 105 D +[<3E00FF00FF80C3C001C001C001C001C001C001C001C001C001C001C001C001C001C001C001C001C001C001C001C001C001C0 + 01C0000000000000000000000000000003C003C003C003C0> 16 37 3 8 11.069] 106 D +[ 16 29 -3 0 20.294] 107 D +[ 8 29 -3 0 9.916] 108 D +[ 32 18 -3 0 32.977] 109 D +[ 16 18 -3 0 21.447] 110 D +[<03F0000FFC001FFE003C0F00780780700380F003C0E001C0E001C0E001C0E001C0E001C07003807807803C0F001FFE000FFC + 0003F000> 24 18 -1 0 20.755] 111 D +[ 16 26 -3 8 21.447] 112 D +[<000E000E000E000E000E000E000E000E0F8E1FEE3FFE7C3E701EF00EE00EE00EE00EE00EE00EE00E700E781E7C3E3FFE1FEE + 078E> 16 26 -2 8 21.447] 113 D +[ 16 18 -3 0 14.183] 114 D +[<1FC07FE0FFF0F07880380038003800F01FE03FC07F00F000E000E000F0307FF03FF01FC0> 16 18 -1 0 15.912] 115 D +[<07C00FF01FF01C201C001C001C001C001C001C001C001C001C001C001C001C00FFE0FFE01C001C001C001C001C001C00> 16 24 -1 0 14.990] 116 D +[<3F1C7FDCFFFCE07CE01CE01CE01CE01CE01CE01CE01CE01CE01CE01CE01CE01CE01CE01C> 16 18 -3 0 21.447] 117 D +[<03C003C007E0076006600E700E701C381C381C38381C381C381C700E700E7006E007E007> 16 18 -1 0 19.141] 118 D +[<078070000F80F8000F80F8000D80D8001DC1DC001DC1DC001CC1CC0018E18C0038E38E0038E38E0038E38E00707307007077 + 07007077070070370300E03E0380E03E0380E03E0380> 32 18 -1 0 28.365] 119 D +[ 24 18 0 0 19.141] 120 D +[ 16 26 -1 8 19.141] 121 D +[ 16 18 -1 0 18.045] 122 D +[<07E00FF01FF83C3C381C700E700E700EE007E007E007E007E007E007E007E007E007E007E007E007E007700E700E700E381C + 3C3C1FF80FF003C0> 16 29 -2 1 20.755] 48 D +[ 16 28 -4 0 20.755] 49 D +[ 16 28 -2 0 20.755] 50 D +[<07E01FF0383C601CC01E800F800F000F000F000F000F001E001C003C07F007E007F00078003C001C001E001E401E401EE01E + 701C38381FF007E0> 16 29 -2 1 20.755] 51 D +[<001C00001C00001C00001C00001C00001C00001C00FFFFC0FFFFC0F01C00701C00781C00381C003C1C001C1C000E1C000E1C + 00071C00071C00039C00039C00019C0001DC0000DC00005C00007C00003C00> 24 27 -1 0 20.755] 52 D +[<0FC01FF03878603CC01E401E000F000F000F000F000F000F780F781E7C1E7E3C7FF87FF073E0700070007000700070007000 + 70007FFE7FFE> 16 28 -2 1 20.755] 53 D +[<03E00FF01C38381C300E700E70077007E007E007E007E007E007F007F00EF81EFC3CEFFCE7F871F070007000380038001C00 + 0E00070403FC00F8> 16 29 -2 1 20.755] 54 D +[<0F803FC070F020300018001C000C000E000E0F861FE73FF73C3F781F700FE00FE007E007E007E007E007E006E00E700E700C + 381C1C380FF003C0> 16 29 -2 1 20.755] 57 D +[ 8 8 -4 -21 11.531] 39 D +[<00E001C0038007000E000E001C001C003800380038007000700070007000E000E000E000E000E000E000E000E000E000E000 + E000E00070007000700070003800380038001C001C000E000E000700038001C000E0> 16 42 -2 11 16.143] 40 D +[ 16 42 -2 11 16.143] 41 D +[ 8 8 -4 5 11.531] 44 D +[ 8 3 -4 0 11.531] 46 D +[ 16 41 -2 10 20.755] 47 D +[ 8 41 -3 10 11.992] 91 D +[ 8 41 0 10 11.992] 93 D +[<0E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C0FFF1 + C0FFF1C00E00000E00000E00000E00000E00000E00000E000007000007F00003F1C001F1C00001C0> 24 30 0 0 22.254] 12 D +[ 16 2 0 -8 13.837] 45 D +1.000 118 /f50 NF +f50 SF +[ 32 35 -1 0 32.228] 88 D +[<01FC0007FF800FFFC01F03C03C0040780000780000780000F00000F00000F00000F00000F00000F000007000007800007800 + 003C01801F03800FFF8007FF0001FC00> 24 22 -2 0 21.677] 99 D +[<01F80007FF000FFF801F07803C0080780000780000700000F00000F00000F00000FFFFC0FFFFC0FFFFC0F001C07803807803 + 803C07803E0F001FFE0007FC0003F000> 24 22 -2 0 21.677] 101 D +[<1F007FC0FFE0E3E080F000F000F000F000F000F000F000F000F000F000F000F000F000F000F000F000F000F000F000F000F0 + 00F000F000F000F000F000F000F000000000000000000000000000000000000000F000F000F000F0> 16 45 3 10 12.828] 106 D +[<01FC0007FF000FFF801F07C03E03E07C01F07800F07800F0F00078F00078F00078F00078F00078F000787000707800F07800 + F03C01E01F07C00FFF8007FF0001FC00> 24 22 -1 0 24.387] 111 D +[ 16 22 -4 0 16.575] 114 D +[<0FF03FFCFFFEF81EC00F000F000F000F001F01FE0FFC1FF83FF03F007C007800780078063C0E3FFE1FFC07F0> 16 22 -1 0 18.697] 115 D +[<1F0F7FCF7FFFF83FF01FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00F> 16 22 -4 0 25.021] 117 D +[<007000E001C003C0078007000F000E001E001C003C003C00380078007800780078007000F000F000F000F000F000F000F000 + F000F000F000F000F000F000F0007000780078007800780038003C003C001C001E000E000F000700078003C001C000E00070> 16 50 -3 13 18.968] 40 D +[ 16 50 -3 13 18.968] 41 D +[ 8 4 -5 0 13.548] 46 D +/F0 /GothicBBB-Medium-H 37.999 -37.999 LWJF +/F1 /GothicBBB-Medium-H 45.999 -45.999 LWJF +%%EndSetup + +%%Page: 1 1 +BP +F1 SF +284 105 p (%-!<%P%$%s%I)s +83 125 p 678 4 ru +F0 SF +384 164 p (JQ49)s +83 183 p 678 2 ru +108 222 p (JQ49%b!<%I)s +f32 SF +9 r (ON/OFF)s +50 r (Shift-SP)s +-2 r (A)s +-1 r (CE)s +F0 SF +108 278 p (JQ49)s +f32 SF +9 r (/)s +F0 SF +10 r (8uJd0lMw)s +f32 SF +140 r (Ctrl-J)s +F0 SF +108 333 p (C$7)s +f32 SF +180 r (Ctrl-G)s +83 633 p 678 4 ru +F0 SF +308 672 p (%+!<%=%k0\\F0)s +83 690 p 678 2 ru +108 729 p (J8;z>C5n)s +f32 SF +256 r (Ctrl-H)s +F0 SF +108 785 p (>e)s +f32 SF +370 r (Ctrl-P)s +F0 SF +108 841 p (2<)s +f32 SF +370 r (Ctrl-N)s +F0 SF +108 897 p (A0)s +f32 SF +370 r (Ctrl-F)s +F0 SF +108 952 p (8e)s +f32 SF +370 r (Ctrl-B)s +F0 SF +108 1008 p (9TF,)s +f32 SF +332 r (Ctrl-A)s +F0 SF +108 1064 p (9TKv)s +f32 SF +332 r (Ctrl-E)s +F0 SF +108 1120 p (F~NOC$7)s +f32 SF +218 r (Ctrl-U)s +83 1140 p 678 4 ru +F0 SF +327 1179 p (F~NO%b!<%I)s +83 1197 p 678 2 ru +108 1237 p (5-9fF~NO)s +f32 SF +256 r (Ctrl-Q/F10)s +108 1292 p (JIS)s +F0 SF +9 r (%3!<%IF~NO)s +f32 SF +155 r (F5)s +F0 SF +108 1348 p (6hE@F~NO)s +f32 SF +256 r (F6)s +F0 SF +108 1404 p (%b!<%I@ZBX$\()s +f32 SF +180 r (F9)s +83 1424 p 678 4 ru +F0 SF +327 1463 p (J8;z3Q%+%?%+%J$X)s +f32 SF +142 r (F3)s +F0 SF +108 1688 p (A43Q$X)s +f32 SF +294 r (F4)s +83 1708 p 678 4 ru +F0 SF +384 1747 p (<-=q)s +83 1766 p 678 2 ru +108 1805 p (<-=qEPO?)s +f32 SF +256 r (Ctrl-T)s +F0 SF +108 1861 p (:o=|)s +f32 SF +332 r (Ctrl-V)s +83 1881 p 678 4 ru +F0 SF +108 1920 p (%b!<%I$+$i$NC&=P)s +f32 SF +104 r (ESC)s +83 1940 p 678 4 ru +F1 SF +1184 105 p (%m!<%^;z$+$JJQ49)s +892 125 p 951 4 ru +979 181 p 2 56 ru +F0 SF +1005 164 p ($")s +65 r ($$)s +188 r ($&)s +134 r ($\()s +157 r ($*)s +892 183 p 951 2 ru +917 222 p ($")s +979 239 p 2 56 ru +f32 SF +1005 222 p (a)s +83 r (i)s +216 r (u)s +151 r (e)s +176 r (o)s +F0 SF +917 307 p ($+)s +979 294 p 2 56 ru +f32 SF +1005 278 p (ka)s +63 r (ki/kyi)s +125 r (ku/qu)s +67 r (ke)s +156 r (ko)s +979 350 p 2 56 ru +1005 333 p (ca)s +65 r (ci)s +197 r (cu)s +133 r (ce)s +157 r (co)s +F0 SF +917 389 p ($5)s +979 406 p 2 56 ru +f32 SF +1005 389 p (sa)s +67 r (si/shi)s +132 r (su)s +135 r (se)s +160 r (so)s +F0 SF +917 445 p ($?)s +979 462 p 2 56 ru +f32 SF +1005 445 p (ta)s +68 r (ti/tsyi/chi)s +50 r (tu/tsu)s +63 r (te)s +161 r (to)s +F0 SF +917 501 p ($J)s +979 518 p 2 56 ru +f32 SF +1005 501 p (na)s +62 r (ni)s +194 r (nu)s +130 r (ne)s +154 r (no)s +F0 SF +917 557 p ($O)s +979 573 p 2 56 ru +f32 SF +1005 557 p (ha)s +62 r (hi)s +194 r (hu/fu)s +75 r (he)s +154 r (ho)s +F0 SF +917 612 p ($Q)s +979 629 p 2 56 ru +f32 SF +1005 612 p (pa)s +62 r (pi)s +194 r (pu)s +130 r (p)s +1 r (e)s +153 r (p)s +1 r (o)s +F0 SF +917 668 p ($^)s +979 685 p 2 56 ru +f32 SF +1005 668 p (ma)s +50 r (mi)s +183 r (mu)s +118 r (me)s +143 r (mo)s +F0 SF +917 724 p ($d)s +979 741 p 2 56 ru +f32 SF +1005 724 p (ya)s +64 r (yi)s +197 r (yu)s +131 r (ye\()s +F0 SF +($$$')s +f32 SF +(\))s +49 r (yo)s +F0 SF +917 810 p ($i)s +979 797 p 2 56 ru +f32 SF +1005 780 p (ra)s +69 r (ri)s +202 r (ru)s +136 r (re)s +162 r (ro)s +979 852 p 2 56 ru +1005 836 p (la)s +73 r (li)s +206 r (lu)s +141 r (le)s +166 r (lo)s +F0 SF +917 891 p ($o)s +979 908 p 2 56 ru +f32 SF +1005 891 p (wa)s +55 r (wi\()s +F0 SF +($p)s +f32 SF +(\))s +117 r (wu)s +123 r (w)s +-1 r (e\()s +F0 SF +($q)s +f32 SF +(\))s +78 r (wo\()s +F0 SF +($r)s +f32 SF +(\))s +892 910 p 951 2 ru +F0 SF +917 949 p ($,)s +979 966 p 2 56 ru +f32 SF +1005 949 p (ga)s +62 r (gi)s +196 r (gu)s +130 r (ge)s +155 r (go)s +F0 SF +917 1005 p ($6)s +979 1021 p 2 56 ru +f32 SF +1005 1005 p (za)s +65 r (zi/ji)s +156 r (zu)s +133 r (ze)s +158 r (zo)s +F0 SF +917 1060 p ($@)s +979 1077 p 2 56 ru +f32 SF +1005 1060 p (da)s +62 r (di)s +194 r (du/dsu)s +50 r (de)s +155 r (do)s +F0 SF +917 1116 p ($P)s +979 1133 p 2 56 ru +f32 SF +1005 1116 p (ba)s +62 r (bi)s +194 r (bu)s +130 r (b)s +1 r (e)s +153 r (b)s +1 r (o)s +892 1136 p 951 4 ru +F0 SF +917 1231 p ("\()s +14 r (%+%?%+%J$OBgJ8;z$GF~NO)s +1976 125 p 694 4 ru +2063 181 p 2 56 ru +2089 164 p ($c)s +92 r ($#)s +74 r ($e)s +85 r ($')s +82 r ($g)s +1976 183 p 694 2 ru +2001 222 p ($-)s +2063 239 p 2 56 ru +f32 SF +2089 222 p (ky)s +-1 r (a)s +184 r (kyu)s +62 r (kye)s +61 r (kyo)s +F0 SF +2001 278 p ($.)s +2063 294 p 2 56 ru +f32 SF +2089 278 p (gy)s +-1 r (a)s +71 r (gyi)s +62 r (gyu)s +62 r (gye)s +61 r (gyo)s +F0 SF +2001 333 p ($/)s +2063 350 p 2 56 ru +f32 SF +2089 333 p (qy)s +-1 r (a)s +71 r (qyi)s +61 r (qyu)s +61 r (qye)s +61 r (qy)s +-1 r (o)s +F0 SF +2001 419 p ($7)s +2063 406 p 2 56 ru +f32 SF +2089 389 p (sy)s +-1 r (a)s +76 r (shi)s +65 r (syu)s +67 r (sy)s +-1 r (e)s +66 r (syo)s +2063 462 p 2 56 ru +2089 445 p (sha)s +185 r (shu)s +64 r (she)s +64 r (sho)s +F0 SF +2001 558 p ($8)s +2063 518 p 2 56 ru +f32 SF +2089 501 p (zy)s +-1 r (a)s +74 r (zyi)s +65 r (zyu)s +65 r (zy)s +-1 r (e)s +64 r (zyo)s +2063 573 p 2 56 ru +2089 557 p (ja)s +211 r (ju)s +91 r (je)s +90 r (jo)s +2063 629 p 2 56 ru +2089 612 p (jy)s +-1 r (a)s +81 r (jyi)s +72 r (jyu)s +71 r (jye)s +71 r (jyo)s +F0 SF +2001 668 p ($9)s +2063 685 p 2 56 ru +f32 SF +2219 668 p (swi)s +181 r (swe)s +F0 SF +2001 724 p ($F)s +2063 741 p 2 56 ru +f32 SF +2089 724 p (tha)s +74 r (thi)s +65 r (thu)s +66 r (the)s +64 r (tho)s +F0 SF +2001 865 p ($A)s +2063 797 p 2 56 ru +f32 SF +2089 780 p (t)s +-1 r (y)s +-1 r (a)s +78 r (tyi)s +68 r (tyu)s +68 r (ty)s +-2 r (e)s +68 r (ty)s +-1 r (o)s +2063 852 p 2 56 ru +2089 836 p (tsy)s +-1 r (a)s +173 r (tsyu)s +52 r (tsye)s +51 r (tsyo)s +2063 908 p 2 56 ru +2089 891 p (cha)s +182 r (chu)s +62 r (che)s +61 r (cho)s +2063 964 p 2 56 ru +2089 947 p (cy)s +-1 r (a)s +185 r (cyu)s +65 r (cyo)s +61 r (cya)s +F0 SF +2001 1003 p ($B)s +2063 1020 p 2 56 ru +f32 SF +2089 1003 p (dy)s +-1 r (a)s +71 r (dyi)s +61 r (dyu)s +61 r (dye)s +61 r (dy)s +-1 r (o)s +F0 SF +2001 1059 p ($G)s +2063 1075 p 2 56 ru +f32 SF +2089 1059 p (dha)s +-1 r (y)s +49 r (dhi)s +59 r (dhu)s +59 r (dhe)s +58 r (dho)s +F0 SF +2001 1115 p ($I)s +2063 1131 p 2 56 ru +f32 SF +2089 1115 p (dw)s +-1 r (a)s +61 r (dwi)s +53 r (dwu)s +52 r (dwe)s +51 r (dw)s +-1 r (o)s +F0 SF +2001 1170 p ($K)s +2063 1187 p 2 56 ru +f32 SF +2089 1170 p (ny)s +-1 r (a)s +71 r (nyi)s +61 r (nyu)s +61 r (nye)s +61 r (ny)s +-1 r (o)s +F0 SF +2001 1226 p ($R)s +2063 1243 p 2 56 ru +f32 SF +2089 1226 p (hy)s +-1 r (a)s +71 r (hyi)s +61 r (hyu)s +61 r (hye)s +61 r (hy)s +-1 r (o)s +F0 SF +2001 1282 p ($S)s +2063 1299 p 2 56 ru +f32 SF +2089 1282 p (b)s +-1 r (y)s +-1 r (a)s +72 r (byi)s +61 r (byu)s +61 r (by)s +-1 r (e)s +62 r (b)s +-1 r (y)s +-1 r (o)s +F0 SF +2001 1338 p ($T)s +2063 1354 p 2 56 ru +f32 SF +2089 1338 p (p)s +-1 r (y)s +-1 r (a)s +72 r (pyi)s +61 r (pyu)s +61 r (py)s +-1 r (e)s +62 r (p)s +-1 r (y)s +-1 r (o)s +F0 SF +2001 1393 p ($U)s +2063 1410 p 2 56 ru +f32 SF +2089 1393 p (hw)s +-1 r (a)s +61 r (hwi)s +176 r (hwe)s +51 r (hwo)s +F0 SF +2001 1449 p ($_)s +2063 1466 p 2 56 ru +f32 SF +2089 1449 p (my)s +-1 r (a)s +59 r (myi)s +50 r (myu)s +50 r (mye)s +48 r (myo)s +F0 SF +2001 1535 p ($j)s +2063 1522 p 2 56 ru +f32 SF +2089 1505 p (ry)s +-1 r (a)s +78 r (ryi)s +69 r (ryu)s +68 r (rye)s +68 r (ry)s +-1 r (o)s +2063 1578 p 2 56 ru +2089 1561 p (ly)s +-1 r (a)s +82 r (lyi)s +73 r (lyu)s +73 r (lye)s +72 r (ly)s +-1 r (o)s +F0 SF +2001 1617 p (%t)s +2063 1633 p 2 56 ru +f32 SF +2574 1617 p (vy)s +-1 r (o)s +1976 1637 p 694 4 ru +EP + +%%Page: 2 2 +BP +108 105 p 676 4 ru +195 161 p 2 56 ru +F0 SF +221 144 p ($n)s +81 r ($#)s +72 r ($%)s +83 r ($')s +80 r ($\))s +108 163 p 676 2 ru +133 202 p ($&)s +195 218 p 2 56 ru +f32 SF +221 202 p (wha)s +49 r (whi)s +50 r (whu)s +50 r (whe)s +50 r (who)s +F0 SF +133 257 p ($/)s +195 274 p 2 56 ru +f32 SF +221 257 p (qw)s +-1 r (a)s +50 r (qwi)s +50 r (qwu)s +50 r (qwe)s +50 r (qwo)s +F0 SF +133 313 p ($U)s +195 330 p 2 56 ru +f32 SF +221 313 p (fw)s +-1 r (a)s +59 r (fwi)s +59 r (fwu)s +58 r (fwe)s +59 r (fwo)s +F0 SF +133 369 p (%t)s +195 386 p 2 56 ru +f32 SF +221 369 p (vy)s +-1 r (a)s +62 r (vyi)s +61 r (vyu)s +62 r (vy)s +-1 r (e)s +108 389 p 676 4 ru +108 484 p 670 4 ru +195 540 p 2 56 ru +F0 SF +221 523 p ($!)s +79 r ($#)s +71 r ($%)s +83 r ($')s +78 r ($\))s +108 542 p 670 2 ru +133 610 p ($/)s +195 597 p 2 56 ru +f32 SF +221 581 p (kw)s +-1 r (a)s +50 r (kwi)s +50 r (kwu)s +50 r (kwe)s +49 r (kwo)s +195 653 p 2 56 ru +221 636 p (qa)s +76 r (qi)s +198 r (qe)s +76 r (qo)s +F0 SF +133 692 p ($0)s +195 709 p 2 56 ru +f32 SF +221 692 p (gw)s +-1 r (a)s +49 r (gwi)s +50 r (gwu)s +50 r (gwe)s +49 r (gw)s +-1 r (o)s +F0 SF +133 748 p ($D)s +195 765 p 2 56 ru +f32 SF +221 748 p (tsa)s +175 r (tsu)s +68 r (tse)s +67 r (tso)s +F0 SF +133 804 p ($H)s +195 820 p 2 56 ru +f32 SF +221 804 p (t)s +-1 r (w)s +-1 r (a)s +56 r (twi)s +56 r (t)s +-1 r (wu)s +56 r (tw)s +-1 r (e)s +56 r (t)s +-1 r (w)s +-1 r (o)s +F0 SF +133 860 p ($U)s +195 876 p 2 56 ru +f32 SF +221 860 p (fa)s +85 r (\014)s +207 r (fe)s +85 r (fo)s +F0 SF +133 915 p (%t)s +195 932 p 2 56 ru +f32 SF +221 915 p (va)s +307 r (ve)s +79 r (vo)s +108 936 p 670 4 ru +108 1030 p 615 4 ru +195 1086 p 2 56 ru +F0 SF +221 1070 p ($!)s +68 r ($#)s +61 r ($%)s +71 r ($')s +67 r ($\))s +108 1088 p 615 2 ru +133 1127 p ($!)s +195 1144 p 2 56 ru +f32 SF +221 1127 p (xa)s +67 r (xi)s +69 r (xu)s +69 r (xu)s +65 r (xo)s +F0 SF +133 1183 p ($c)s +195 1199 p 2 56 ru +f32 SF +221 1183 p (xy)s +-1 r (a)s +49 r (xyi)s +50 r (xyu)s +50 r (xye)s +49 r (xy)s +-1 r (o)s +108 1203 p 615 4 ru +921 105 p 274 4 ru +F0 SF +946 144 p ($s)s +1008 161 p 2 56 ru +f32 SF +1034 144 p (nn/n')s +F0 SF +946 200 p ($C)s +1008 217 p 2 56 ru +f32 SF +1034 200 p (xtu/xtu)s +F0 SF +946 256 p ($n)s +1008 272 p 2 56 ru +f32 SF +1034 256 p (xw)s +-1 r (a)s +F0 SF +946 312 p ($p)s +1008 328 p 2 56 ru +f32 SF +1034 312 p (xwi)s +F0 SF +946 367 p ($q)s +1008 384 p 2 56 ru +f32 SF +1034 367 p (xw)s +-1 r (e)s +F0 SF +946 423 p ($r)s +1008 440 p 2 56 ru +f32 SF +1034 423 p (xw)s +-1 r (o)s +F0 SF +946 479 p (%u)s +1008 496 p 2 56 ru +f32 SF +1034 479 p (xk)s +-1 r (a/xca)s +F0 SF +946 535 p (%v)s +1008 551 p 2 56 ru +f32 SF +1034 535 p (xk)s +-1 r (e)s +921 555 p 274 4 ru +921 650 p 450 4 ru +F0 SF +946 689 p (!<)s +f32 SF +50 r (\()s +F0 SF +(D92;)s +f32 SF +(\))s +1280 706 p 2 56 ru +1306 689 p (-)s +946 745 p (-)s +74 r (\()s +F0 SF +(%O%$%U%s)s +f32 SF +(\))s +1280 761 p 2 56 ru +1306 745 p (x-)s +F0 SF +946 800 p (!")s +f32 SF +50 r (\()s +F0 SF +(FIE@)s +f32 SF +(\))s +1280 817 p 2 56 ru +1306 800 p (,)s +946 856 p (,)s +76 r (\()s +F0 SF +(%+%s%^)s +f32 SF +(\))s +1280 873 p 2 56 ru +1306 856 p (x,)s +F0 SF +946 912 p (!#)s +f32 SF +50 r (\()s +F0 SF +(6gE@)s +f32 SF +(\))s +1280 929 p 2 56 ru +1306 912 p (.)s +946 968 p (.)s +76 r (\()s +F0 SF +(%T%j%*%I)s +f32 SF +(\))s +1280 985 p 2 56 ru +1306 968 p (x.)s +F0 SF +946 1024 p (!V)s +f32 SF +50 r (\()s +F0 SF +($+$.$+$C$3)s +f32 SF +(\))s +1280 1040 p 2 56 ru +1306 1024 p (x[)s +F0 SF +946 1079 p (!W)s +f32 SF +50 r (\()s +F0 SF +($+$.$+$C$3)s +f32 SF +(\))s +1280 1096 p 2 56 ru +1306 1079 p (x])s +F0 SF +946 1135 p (!&)s +f32 SF +50 r (\()s +F0 SF +($J$+$0$m)s +f32 SF +(\))s +1280 1152 p 2 56 ru +1306 1135 p (x/)s +921 1155 p 450 4 ru +F1 SF +1853 105 p (%j%=!<%9)s +f50 SF +16 r (\(.Xresources\))s +f31 SF +1532 161 p (KTerm*VT100*AllowSendEvents:true)s +F0 SF +1664 217 p ($+$J4A;zJQ49%b!<%I$G$b%+!<%=%k$,0\\F0$9$k)s +f31 SF +1532 328 p (Kinput2*OverTheSpotConversion.modeLocation:topright)s +F0 SF +1664 384 p (%b!<%II=<\($r%&%#%s%I%&$N1&>e$K=P$9)s +f31 SF +1532 496 p (Kinput2*Sj3.sj3serv:sj3host1)s +1532 551 p (Kinput2*Sj3.sj3serv2:sj3host2)s +F0 SF +1664 607 p ($+$J4A;zJQ49%5!<%P$N;XDj)s +F1 SF +1828 719 p (@_Dj%U%!%$%k)s +f50 SF +16 r (\(.sjrc\))s +f31 SF +1532 775 p (.sj3serv)s +22 r (localhost)s +F0 SF +1664 830 p (:G=i$K@\\B3$r;n$_$k)s +f32 SF +14 r (sj3serv)s +F0 SF +14 r ($N%[%9%HL>)s +f31 SF +1532 942 p (.sj3serv2)s +22 r (localhost)s +f32 SF +1664 998 p (2)s +F0 SF +9 r (HVL\\$K@\\B3$r;n$_$k)s +f32 SF +14 r (sj3serv)s +F0 SF +14 r ($N%[%9%HL>)s +f31 SF +1532 1109 p (.SetNormal)s +22 r (^[)s +F0 SF +1664 1165 p (JQ49Cf$NJ8;zNs$r3NDj$7!";XDj$5$l$?%3%s%H%m!<%k)s +1664 1221 p (%3!<%I$r%"%W%j%1!<%7%g%s$KEO$7$^$9)s +f32 SF +9 r (\(vi)s +F0 SF +10 r ($GJXMx)s +f32 SF +(\))s +EP +%%Trailer +%%Pages: 2 +END +%%EOF diff -r 000000000000 -r 92745d501b9a doc/sj3guide.tex --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/doc/sj3guide.tex Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,260 @@ +\documentstyle[landscape,a4j]{j-article} +\pagestyle{empty} +\def\baselinestretch{0.8} +\textheight=20cm +\raggedbottom +\makeatletter +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% -*- latex -*- +% +% MULTIROW.STY +% Modified multirow.sty (author unknown) from mailserv@ymir.claremont.edu +% +% by Michinori Kawasaki (michi-k@ascii.co.jp) +% Thu Sep 3 1992 +% +% usage: \multirow{N}[STRUTt]{WIDTH}[STRUTb]{TEXT} +% N number of rows +% STRUTt additional space (m*\bigstrut) between the above line and TEXT +% WIDTH width of column +% STRUTb pullup TEXT +% TEXT entry of column +% see EXAMPLE below '\endinput' +% +% You can define dimension '\bigstrut' and parameter '\multirowsetup' +% +\newdimen\bigstrut \bigstrut=.5zh +\def\multirowsetup{\raggedright} +% +\def\multirow#1{\relax\@ifnextchar [{\@multirow{#1}}{\@multirow{#1}[0]}} +\def\@multirow#1[#2]#3{\@ifnextchar [{\@xmultirow{#1}[#2]{#3}}% + {\@xmultirow{#1}[#2]{#3}[0pt]}} +\def\@xmultirow#1[#2]#3[#4]#5{\@tempcnta=#1% + \@tempdima\@tempcnta\ht\@arstrutbox + \advance\@tempdima\@tempcnta\dp\@arstrutbox + \advance\@tempdima#2\bigstrut + \setbox0\hbox{\vtop to \@tempdima{\hsize#3\@parboxrestore + \vfill \multirowsetup #5\par\vfill}}% + \ht0\z@\dp0\z@ + \@tempdima\ht\@arstrutbox \ifnum#2>0 \advance\@tempdima\bigstrut \fi + \advance\@tempdima#4 \raise\@tempdima\box0 } +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\makeatother + +\begin{document} + +\sf\dg + +\begin{tabular}[t]{ll} +\multicolumn{2}{c}{\large\sf\dg $B%-!<%P%$%s%I(B} \\ +\noalign{\hrule height 0.3mm} +\multicolumn{2}{c}{$BJQ49(B} \\ +\hline +$BJQ49%b!<%I(BON/OFF & Shift-SPACE \\ +$BJQ49(B/$B8uJd0lMw(B & Ctrl-J \\ +$BC$7(B & Ctrl-G \\ +\noalign{\hrule height 0.3mm} +\multicolumn{2}{c}{$B%+!<%=%k0\F0(B} \\ +\hline +$BJ8;z>C5n(B & Ctrl-H \\ +$B>e(B & Ctrl-P \\ +$B2<(B & Ctrl-N \\ +$BA0(B & Ctrl-F \\ +$B8e(B & Ctrl-B \\ +$B9TF,(B & Ctrl-A \\ +$B9TKv(B & Ctrl-E \\ +$BF~NOC$7(B & Ctrl-U \\ +\noalign{\hrule height 0.3mm} +\multicolumn{2}{c}{$BF~NO%b!<%I(B} \\ +\hline +$B5-9fF~NO(B & Ctrl-Q/F10 \\ +JIS$B%3!<%IF~NO(B & F5 \\ +$B6hE@F~NO(B & F6 \\ +$B%b!<%I@ZBX$((B & F9 \\ +\noalign{\hrule height 0.3mm} +\multicolumn{2}{c}{$BJ8;z3Q%+%?%+%J$X(B & F3 \\ +$BA43Q$X(B & F4 \\ +\noalign{\hrule height 0.3mm} +\multicolumn{2}{c}{$B<-=q(B} \\ +\hline +$B<-=qEPO?(B & Ctrl-T \\ +$B:o=|(B & Ctrl-V \\ +\noalign{\hrule height 0.3mm} +$B%b!<%I$+$i$NC&=P(B & ESC \\ +\noalign{\hrule height 0.3mm} +\end{tabular} +\hspace{1cm} +\begin{tabular}[t]{l|lllll} +\multicolumn{6}{c}{\large\sf\dg $B%m!<%^;z$+$JJQ49(B} \\ +\noalign{\hrule height 0.3mm} + & $B$"(B & $B$$(B & $B$&(B & $B$((B & $B$*(B \\ +\hline +$B$"(B & a & i & u & e & o \\ +\multirow{2}{1zw}{$B$+(B} + & ka & ki/kyi & ku/qu & ke & ko \\ + & ca & ci & cu & ce & co \\ +$B$5(B & sa & si/shi & su & se & so \\ +$B$?(B & ta & ti/tsyi/chi & tu/tsu& te & to \\ +$B$J(B & na & ni & nu & ne & no \\ +$B$O(B & ha & hi & hu/fu & he & ho \\ +$B$Q(B & pa & pi & pu & pe & po \\ +$B$^(B & ma & mi & mu & me & mo \\ +$B$d(B & ya & yi & yu & ye($B$$$'(B)&yo \\ +\multirow{2}{1zw}{$B$i(B} + & ra & ri & ru & re & ro \\ + & la & li & lu & le & lo \\ +$B$o(B & wa & wi($B$p(B) & wu & we($B$q(B)& wo($B$r(B) \\ +\hline +$B$,(B & ga & gi & gu & ge & go \\ +$B$6(B & za & zi/ji & zu & ze & zo \\ +$B$@(B & da & di & du/dsu& de & do \\ +$B$P(B & ba & bi & bu & be & bo \\ +\noalign{\hrule height 0.3mm} +\multicolumn{6}{l}{ } \\ +\multicolumn{6}{l}{$B"((B $B%+%?%+%J$OBgJ8;z$GF~NO(B} \\ +\end{tabular} +\hspace{1cm} +\begin{tabular}[t]{l|lllll} +\multicolumn{6}{c}{\large\sf\dg\mbox{ }} \\ +\noalign{\hrule height 0.3mm} + & $B$c(B & $B$#(B & $B$e(B & $B$'(B & $B$g(B \\ +\hline +$B$-(B & kya & & kyu & kye & kyo \\ +$B$.(B & gya & gyi & gyu & gye & gyo \\ +$B$/(B & qya & qyi & qyu & qye & qyo \\ +\multirow{2}{1zw}{$B$7(B} + & sya & shi & syu & sye & syo \\ + & sha & & shu & she & sho \\ +\multirow{3}{1zw}{$B$8(B} + & zya & zyi & zyu & zye & zyo \\ + & ja & & ju & je & jo \\ + & jya & jyi & jyu & jye & jyo \\ +$B$9(B & & swi & & swe & \\ +$B$F(B & tha & thi & thu & the & tho \\ +\multirow{4}{1zw}{$B$A(B} + & tya & tyi & tyu & tye & tyo \\ + & tsya & & tsyu & tsye & tsyo \\ + & cha & & chu & che & cho \\ + & cya & & cyu & cyo & cya \\ +$B$B(B & dya & dyi & dyu & dye & dyo \\ +$B$G(B & dhay & dhi & dhu & dhe & dho \\ +$B$I(B & dwa & dwi & dwu & dwe & dwo \\ +$B$K(B & nya & nyi & nyu & nye & nyo \\ +$B$R(B & hya & hyi & hyu & hye & hyo \\ +$B$S(B & bya & byi & byu & bye & byo \\ +$B$T(B & pya & pyi & pyu & pye & pyo \\ +$B$U(B & hwa & hwi & & hwe & hwo \\ +$B$_(B & mya & myi & myu & mye & myo \\ +\multirow{2}{1zw}{$B$j(B} + & rya & ryi & ryu & rye & ryo \\ + & lya & lyi & lyu & lye & lyo \\ +$B%t(B & & & & & vyo \\ +\noalign{\hrule height 0.3mm} +\end{tabular} + +\clearpage + +\begin{tabular}[t]{l} +\begin{tabular}[t]{l|lllll} +\noalign{\hrule height 0.3mm} + & $B$n(B & $B$#(B & $B$%(B & $B$'(B & $B$)(B \\ +\hline +$B$&(B & wha & whi & whu & whe & who \\ +$B$/(B & qwa & qwi & qwu & qwe & qwo \\ +$B$U(B & fwa & fwi & fwu & fwe & fwo \\ +$B%t(B & vya & vyi & vyu & vye & \\ +\noalign{\hrule height 0.3mm} +\end{tabular} \\ + \\ +\begin{tabular}[t]{l|lllll} +\noalign{\hrule height 0.3mm} + & $B$!(B & $B$#(B & $B$%(B & $B$'(B & $B$)(B \\ +\hline +\multirow{2}{1zw}{$B$/(B} + & kwa & kwi & kwu & kwe & kwo \\ + & qa & qi & & qe & qo \\ +$B$0(B & gwa & gwi & gwu & gwe & gwo \\ +$B$D(B & tsa & & tsu & tse & tso \\ +$B$H(B & twa & twi & twu & twe & two \\ +$B$U(B & fa & fi & & fe & fo \\ +$B%t(B & va & & & ve & vo \\ +\noalign{\hrule height 0.3mm} +\end{tabular} \\ + \\ +\begin{tabular}[t]{l|lllll} +\noalign{\hrule height 0.3mm} + & $B$!(B & $B$#(B & $B$%(B & $B$'(B & $B$)(B \\ +\hline +$B$!(B & xa & xi & xu & xu & xo \\ +$B$c(B & xya & xyi & xyu & xye & xyo \\ +\noalign{\hrule height 0.3mm} +\end{tabular} +\end{tabular} +\hspace{0.5cm} +\begin{tabular}[t]{l} +\begin{tabular}[t]{l|l} +\noalign{\hrule height 0.3mm} +$B$s(B & nn/n' \\ +$B$C(B & xtu/xtu \\ +$B$n(B & xwa \\ +$B$p(B & xwi \\ +$B$q(B & xwe \\ +$B$r(B & xwo \\ +$B%u(B & xka/xca \\ +$B%v(B & xke \\ +\noalign{\hrule height 0.3mm} +\end{tabular} \\ + \\ +\begin{tabular}[t]{ll|l} +\noalign{\hrule height 0.3mm} +$B!<(B & ($BD92;(B) & - \\ +- & ($B%O%$%U%s(B) & x- \\ +$B!"(B & ($BFIE@(B) & , \\ +, & ($B%+%s%^(B) & x, \\ +$B!#(B & ($B6gE@(B) & . \\ +. & ($B%T%j%*%I(B) & x. \\ +$B!V(B & ($B$+$.$+$C$3(B) & x[ \\ +$B!W(B & ($B$+$.$+$C$3(B) & x] \\ +$B!&(B & ($B$J$+$0$m(B) & x/ \\ +\noalign{\hrule height 0.3mm} +\end{tabular} +\end{tabular} +\hspace{0.5cm} +\begin{tabular}[t]{l} +\begin{tabular}[t]{l} +\multicolumn{1}{c}{\large\sf\dg $B%j%=!<%9(B (.Xresources)} \\ +\verb+KTerm*VT100*AllowSendEvents:true+ \\ +\hspace*{1cm} $B$+$J4A;zJQ49%b!<%I$G$b%+!<%=%k$,0\F0$9$k(B \\ + \\ +\verb+Kinput2*OverTheSpotConversion.modeLocation:topright+ \\ +\hspace*{1cm} $B%b!<%II=<($r%&%#%s%I%&$N1&>e$K=P$9(B \\ + \\ +\verb+Kinput2*Sj3.sj3serv:sj3host1+ \\ +\verb+Kinput2*Sj3.sj3serv2:sj3host2+ \\ +\hspace*{1cm} $B$+$J4A;zJQ49%5!<%P$N;XDj(B \\ +\end{tabular} \\ + \\ +\begin{tabular}[t]{l} +\multicolumn{1}{c}{\large\sf\dg $B@_Dj%U%!%$%k(B (.sjrc)} \\ +\verb+.sj3serv localhost+ \\ +\hspace*{1cm} $B:G=i$K@\B3$r;n$_$k(B sj3serv $B$N%[%9%HL>(B \\ + \\ +\verb+.sj3serv2 localhost+ \\ +\hspace*{1cm} 2$BHVL\$K@\B3$r;n$_$k(B sj3serv $B$N%[%9%HL>(B \\ + \\ +\verb+.SetNormal ^[+ \\ +\hspace*{1cm} $BJQ49Cf$NJ8;zNs$r3NDj$7!";XDj$5$l$?%3%s%H%m!<%k(B \\ +\hspace*{1cm} $B%3!<%I$r%"%W%j%1!<%7%g%s$KEO$7$^$9(B(vi$B$GJXMx(B) \\ +\end{tabular} +\end{tabular} +\end{document} + diff -r 000000000000 -r 92745d501b9a include/AdoptedShP.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/AdoptedShP.h Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,53 @@ +/* $Id: AdoptedShP.h,v 1.3 1991/03/22 11:41:38 ishisone Rel $ */ +/* + * Copyright (c) 1990 Software Research Associates, Inc. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Software Research Associates not be + * used in advertising or publicity pertaining to distribution of the + * software without specific, written prior permission. Software Research + * Associates makes no representations about the suitability of this software + * for any purpose. It is provided "as is" without express or implied + * warranty. + * + * Author: Makoto Ishisone, Software Research Associates, Inc., Japan + */ + +#ifndef _AdoptedShellP_h +#define _AdoptedShellP_h + +#include +#include "AdoptedShe.h" + +typedef struct { + int empty; +} AdoptedShellClassPart; + +typedef struct _AdoptedShellClassRec { + CoreClassPart core_class; + CompositeClassPart composite_class; + ShellClassPart shell_class; + OverrideShellClassPart override_shell_class; + AdoptedShellClassPart adoptedshell_class; +} AdoptedShellClassRec; + +extern AdoptedShellClassRec adoptedShellClassRec; + +typedef struct { + Window parent; + Boolean disable_geometry; /* disable geometry management */ + /* private */ + Boolean colormap_specified; +} AdoptedShellPart; + +typedef struct _AdoptedShellRec { + CorePart core; + CompositePart composite; + ShellPart shell; + OverrideShellPart override; + AdoptedShellPart adoptedshell; +} AdoptedShellRec; +#endif diff -r 000000000000 -r 92745d501b9a include/AdoptedShe.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/AdoptedShe.h Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,33 @@ +/* $Id: AdoptedShe.h,v 1.1 1990/11/09 11:16:51 ishisone Rel $ */ +/* + * Copyright (c) 1990 Software Research Associates, Inc. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Software Research Associates not be + * used in advertising or publicity pertaining to distribution of the + * software without specific, written prior permission. Software Research + * Associates makes no representations about the suitability of this software + * for any purpose. It is provided "as is" without express or implied + * warranty. + * + * Author: Makoto Ishisone, Software Research Associates, Inc., Japan + */ + +#ifndef _AdoptedShell_h +#define _AdoptedShell_h + +/* AdoptedShell widget public header file */ + +#define XtNparentWindow "parentWindow" +#define XtCParentWindow "ParentWindow" +#define XtNdisableGeometryManagement "disableGeometryManagement" +#define XtCDisableGeometryManagement "DisableGeometryManagement" + +typedef struct _AdoptedShellClassRec *AdoptedShellWidgetClass; +typedef struct _AdoptedShellRec *AdoptedShellWidget; + +extern WidgetClass adoptedShellWidgetClass; +#endif diff -r 000000000000 -r 92745d501b9a include/AsyncErr.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/AsyncErr.h Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,120 @@ +/* $Id: AsyncErr.h,v 1.2 1994/05/16 09:07:20 ishisone Rel $ */ +/* + * Copyright (C) 1992, 1994 Software Research Associates, Inc. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Software Research Associates not be + * used in advertising or publicity pertaining to distribution of the + * software without specific, written prior permission. Software Research + * Associates makes no representations about the suitability of this software + * for any purpose. It is provided "as is" without express or implied + * warranty. + * + * Author: Makoto Ishisone, Software Research Associates, Inc., Japan + */ + +#ifndef _AsyncErr_h +#define _AsyncErr_h + +/* + * X asyncronous error handler + * + * This library provides asyncronous error handler mechanism. + * It enables setting error handlers for particular requests + * without using XSync(). + */ + +/* + * XAEHandle -- an opaque type used as a 'handle' in this library + */ +typedef struct fe_errdesc_ *XAEHandle; + +/* + * XAEHandler -- an error handler for the async error handler mechanism + * This function takes an error event and dispatches it to + * the appropriate async error handler. + * To enable async error handler mechanism, set this function as + * the global error handler using XSetErrorHandler, or just call + * XAEInit, which does the same thing. + */ +extern int XAEHandler( +#if NeedFunctionPrototypes + Display *dpy, + XErrorEvent *eev +#endif +); + +/* + * XAESetErrorHandler -- XSetErrorHandler replacement + * In order to set the global error handler, this function + * should be used instead of XSetErrorHandler when using + * async error handler mechanism. + */ +extern XErrorHandler XAESetErrorHandler( +#if NeedFunctionPrototypes + XErrorHandler handler +#endif +); + +/* + * XAEInit -- async error handler mechanism initializer + */ +extern void XAEInit( +#if NeedFunctionPrototypes + void +#endif +); + +/* + * XAESet -- set an async error handler + * XAEUnset -- unset handler set by XAEOpen + * These function set and unset the specified async error handler. + * Errors due to the requests issued between calls of XAESet and the + * corresponding XAEUnset are handled by the handler. + */ +extern XAEHandle XAESet( +#if NeedFunctionPrototypes + Display *dpy, + int (*handler)(), /* error handler to be called */ + void (*destroy)(), /* destroy hook (for freeing cldata etc.) */ + XPointer client_data +#endif +); + +extern void XAEUnset( +#if NeedFunctionPrototypes + XAEHandle handle /* handle returned previous XAESet() call */ +#endif +); + +/* + * XAESetIgnoreErrors -- ignore all errors + * This is a convenient function for setting an error handler that + * ignores all the errors. It is equivalent to + * XAESet(dpy, ignore_error_handler, NULL, NULL) + * where ignore_error_handler is an error handler that simply + * ignores all kind of errors. + */ +extern XAEHandle XAESetIgnoreErrors( +#if NeedFunctionPrototypes + Display *dpy +#endif +); + +extern XAEHandle XAESetRecordErrors( +#if NeedFunctionPrototypes + Display *dpy, + unsigned long *errorbitsp +#endif +); + + +/* + * Replace XSetErrorHandler with XAESetErrorHandler + */ +#define XSetErrorHandler XAESetErrorHandler + +#endif /* _AsyncErr_h */ diff -r 000000000000 -r 92745d501b9a include/Atok.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/Atok.h Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,50 @@ +/* $Id: Atok.h,v 1.1 1999/08/13 06:26:59 ishisone Exp $ */ +/* + * Copyright 1999 Justsystem Corporation, Japan. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, + * provided that the above copyright notice appear in all copies and that + * both that copyright notice and this permission notice appear in + * supporting documentation, and that the name of Justsystem Corporation + * not be used in advertising or publicity pertaining to distribution + * of the software without specific, written prior permission. Justsystem + * Corporation makes no representations about the suitability of this + * software for any purpose. It is provided "as is" without express + * or implied warranty. + * + * Author: Atsushi Irisawa + */ + +#ifndef _Atok_h +#define _Atok_h + +#include "InputConv.h" + +/* + Atok new resources: + + name class type default access + ---------------------------------------------------------------------------- + server Server String *1 CG + conffile Conffile String *2 CG + + note: *1) if not specified, use value of an environment variable "ATOKHOST" + *2) if not specified, use value of an environment variable "ATOKCONF" +*/ + +#define XtNAtokServer "server" +#define XtCAtokServer "Server" +#define XtNConfFile "conf" +#define XtCConfFile "Conf" +#define XtNStyleFile "style" +#define XtCStyleFile "StyleFile" +#define XtNPort "port" +#define XtCPort "Port" + +typedef struct _AtokClassRec *AtokObjectClass; +typedef struct _AtokRec *AtokObject; + +extern WidgetClass atokObjectClass; + +#endif /* _Atok_h */ diff -r 000000000000 -r 92745d501b9a include/AtokP.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/AtokP.h Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,112 @@ +/* $Id: AtokP.h,v 1.1 1999/08/13 06:26:59 ishisone Exp $ */ +/* + * Copyright 1999 Justsystem Corporation, Japan. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, + * provided that the above copyright notice appear in all copies and that + * both that copyright notice and this permission notice appear in + * supporting documentation, and that the name of Justsystem Corporation + * not be used in advertising or publicity pertaining to distribution + * of the software without specific, written prior permission. Justsystem + * Corporation makes no representations about the suitability of this + * software for any purpose. It is provided "as is" without express + * or implied warranty. + * + * Author: Atsushi Irisawa + */ + +#ifndef _AtokP_h +#define _AtokP_h + +#include "InputConvP.h" + +#include "WStr.h" +#include "Atok.h" +#include "Xatoklib.h" + +typedef struct { + int foo; +} AtokClassPart; + +typedef struct _AtokClassRec { + ObjectClassPart object_class; + InputConvClassPart inputConv_class; + AtokClassPart atok_class; +} AtokClassRec; + +#define ATOK_NSEGMENTS 20 /* $BJ8@a$N:GBg?t(B ???? */ + +#define NBR_OF_PART 3 +#if 0 +typedef struct { + /* $BI=<($O(B $BA4It(B($B:GBg(B)$B$G#3$D$N%Q!<%H$K$J$k!#(B */ + ICString ics[NBR_OF_PART]; + wchar *gline[NBR_OF_PART]; + int glsize[NBR_OF_PART]; + int gllen[NBR_OF_PART]; + /* $B%-!CLG$7$?$3$H$rDLCN$9$k!#(B + */ +extern void APanelEnd( +#if NeedFunctionPrototypes + Widget /* w */ +#endif +); + +extern void APanelSetList(), APanelSetCurrent(), APanelMoveCurrent(); + +#endif diff -r 000000000000 -r 92745d501b9a include/AuxPanelP.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/AuxPanelP.h Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,97 @@ +/* $Id: AuxPanelP.h,v 1.7 1993/09/08 01:38:20 ishisone Rel $ */ +/* + * Copyright (c) 1990 Software Research Associates, Inc. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Software Research Associates not be + * used in advertising or publicity pertaining to distribution of the + * software without specific, written prior permission. Software Research + * Associates makes no representations about the suitability of this software + * for any purpose. It is provided "as is" without express or implied + * warranty. + * + * Author: Makoto Ishisone, Software Research Associates, Inc., Japan + */ + +/* Copyright 1991 NEC Corporation, Tokyo, Japan. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, + * provided that the above copyright notice appear in all copies and that + * both that copyright notice and this permission notice appear in + * supporting documentation, and that the name of NEC Corporation + * not be used in advertising or publicity pertaining to distribution + * of the software without specific, written prior permission. NEC + * Corporation makes no representations about the suitability of this + * software for any purpose. It is provided "as is" without express + * or implied warranty. + * + * NEC CORPORATION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN + * NO EVENT SHALL NEC CORPORATION BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF + * USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR + * OTHER TORTUOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + * + * Author: Akira Kon, NEC Corporation. (kon@d1.bs2.mt.nec.co.jp) + */ + +#ifndef _AuxPanelP_h +#define _AuxPanelP_h + +#include +#include "AuxPanel.h" + +typedef struct { + int empty; +} AuxPanelClassPart; + +typedef struct _AuxPanelClassRec { + CoreClassPart super_class; + CompositeClassPart composite_class; + AuxPanelClassPart auxpanel_class; +} AuxPanelClassRec; + +extern AuxPanelClassRec auxpanelClassRec; + +typedef struct { + ICString seg; /* $B%;%0%a%s%H(B */ + short redrawpos; /* $B=q$-D>$7$,I,MW$JJ8;z$N3+;O0LCV(B + * (-1 $B$J$i=q$-D>$9I,MW$J$7(B) + */ + Cardinal width; /* $BI=<(I}(B */ +} DisplaySegment; + +typedef struct { + /* resources */ + Pixel foreground; + Dimension defaultwidth; + Dimension hspace; + Dimension vspace; + Cursor cursor; + XtCallbackList callback; + /* private state */ + Widget displayobj; /* actually, this is the only child */ + GC invgc; + int fontheight; + /* int ascent; */ + int maxwidth; /* $B%"%$%F%`$N:GBgD9(B */ + int ncolumns; + int nrows; + + DisplaySegment *dispauxsegments; + Cardinal numauxsegments; + Cardinal dispauxsegmentsize; +} AuxPanelPart; + +typedef struct _AuxPanelRec { + CorePart core; + CompositePart composite; + AuxPanelPart cpanel; +} AuxPanelRec; + +#endif diff -r 000000000000 -r 92745d501b9a include/CachedAtom.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/CachedAtom.h Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,47 @@ +/* $Id: CachedAtom.h,v 1.5 1999/01/07 03:06:20 ishisone Exp $ */ +/* + * Copyright (c) 1991 Software Research Associates, Inc. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Software Research Associates not be + * used in advertising or publicity pertaining to distribution of the + * software without specific, written prior permission. Software Research + * Associates makes no representations about the suitability of this software + * for any purpose. It is provided "as is" without express or implied + * warranty. + * + * Author: Makoto Ishisone, Software Research Associates, Inc., Japan + */ + +#ifndef _CachedAtom_h +#define _CachedAtom_h + +/* + * Atom CachedInternAtom(Display *dpy, String name, Bool only_if_exists) + * String CachedGetAtomName(Display *dpy, Atom atom) + * $B$=$l$>$l(B XInternAtom(), XGetAtomName() $B$H$[$\F1$8!#(B + * $B%-%c%C%7%s%0$r9T$J$&$H$3$m$,0c$&!#(B(R5 $B$N(B XInternAtom() $B$O(B + * $B%-%c%C%7%e$9$k$,(B XGetAtomName() $B$O$7$J$$(B) + * $B$^$?!"(BCachedGetAtomName() $B$,JV$9J8;zNs$O6&M-$5$l$F$$$k$N$G(B + * free() $B$7$F$O$J$i$J$$!#(B + */ + +extern Atom CachedInternAtom( +#if NeedFunctionPrototypes + Display * /* dpy */, + String /* name */, + Bool /* only_if_exists */ +#endif +); + +extern String CachedGetAtomName( +#if NeedFunctionPrototypes + Display * /* dpy */, + Atom /* atom */ +#endif +); + +#endif diff -r 000000000000 -r 92745d501b9a include/CachedFont.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/CachedFont.h Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,85 @@ +/* $Id: CachedFont.h,v 1.3 1999/01/07 03:06:20 ishisone Exp $ */ +/* + * Copyright (c) 1991 Software Research Associates, Inc. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Software Research Associates not be + * used in advertising or publicity pertaining to distribution of the + * software without specific, written prior permission. Software Research + * Associates makes no representations about the suitability of this software + * for any purpose. It is provided "as is" without express or implied + * warranty. + * + * Author: Makoto Ishisone, Software Research Associates, Inc., Japan + */ + +#ifndef _CachedFont_h +#define _CachedFont_h + +/* + * XFontStruct *CachedLoadQueryFontByName(Display *dpy, String name) + * XLoadQueryFont() $B$H$[$\F1$8$@$,!";XDj$5$l$?%U%)%s%H$,(B + * $B$9$G$K%*!<%W%s$5$l$F$$$l$P$=$l$rJV$9!#(B + */ +extern XFontStruct *CachedLoadQueryFontByName( +#if NeedFunctionPrototypes + Display * /* dpy */, + String /* name */ +#endif +); + +/* + * XFontStruct *CachedLoadQueryFontByProp(Display *dpy, Atom atom) + * CachedLoadQueryFontByName() $B$H$[$\F1$8$@$,!"%U%)%s%HL>$G$O$J$/!"(B + * $B$=$l$r%"%H%`$K$7$?$b$N(B ($B$D$^$j%U%)%s%H$N(B "FONT" $B%W%m%Q%F%#$NCM(B) + * $B$G;XDj$9$k!#(B + * $B$3$l$O$3$N%"%H%`$NCM(B ($B$*$h$S$3$N%"%H%`$KBP1~$9$kJ8;zNs$G$"$k@5<0$J(B + * $B%U%)%s%HL>(B) $B$,M#0l%U%)%s%H$NpJs$r%-%c%C%7%e$7$F$$$k(B + * $B4X78>e!";XDj$5$l$?%U%)%s%H$X$N;2>H$,$"$k8B$j%U%)%s%H$O(B + * $B%/%m!<%:$5$l$J$$!#(B + * $B$^$?!"%U%)%s%H>pJs(B (XFontStruct $BFb$N>pJs$N$&$A!"(Bfid $B$r=|$/$b$N(B) + * $B$O$?$H$(%U%)%s%H$X$N;2>H$,$J$/$J$C$F$bJ];}$5$l$k!#%U%)%s%H9=B$BN(B + * $B$b$=$N$^$^J];}$5$l$k$N$G!"$$$C$?$s(B CachedFreeFont() $B$7$?%U%)%s%H$r(B + * CachedLoadFontByFontStruct() $B$G:F$S%m!<%I$9$k$3$H$b$G$-$k!#(B + */ +extern void CachedFreeFont( +#if NeedFunctionPrototypes + Display * /* dpy */, + XFontStruct * /* font */ +#endif +); + +#endif diff -r 000000000000 -r 92745d501b9a include/CandPanel.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/CandPanel.h Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,114 @@ +/* $Id: CandPanel.h,v 1.5 1999/01/07 03:06:20 ishisone Exp $ */ +/* + * Copyright (c) 1990 Software Research Associates, Inc. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Software Research Associates not be + * used in advertising or publicity pertaining to distribution of the + * software without specific, written prior permission. Software Research + * Associates makes no representations about the suitability of this software + * for any purpose. It is provided "as is" without express or implied + * warranty. + * + * Author: Makoto Ishisone, Software Research Associates, Inc., Japan + */ + +#ifndef _CandidatePanel_h +#define _CandidatePanel_h + +#include "ICtypes.h" + +/* + CandidatePanel new resources: + + name class type default access + ---------------------------------------------------------------------------- + foreground Foreground Pixel default CSG + horizontalSpacing Spacing Dimension 6 CSG + verticalSpacing Spacing Dimension 4 CSG + list List Pointer NULL CSG + numStrings NumStrings Int 0 CSG + defaultWidth DefaultWidth Dimension 400 CSG + currentItem CurrentItem Int 0 CSG + cursor Cursor Cursor parent CSG + callback Callback Callback -- + + CandidatePanel widget $B$K$O$9$N$G(B + * $B;R(B widget (ConvDisplayObject) $B$N%U%)%s%H$J$I$N%j%=!<%9$rJQ$($?;~$K$O(B + * CPanelSetList(w, NULL, 0, 0, 0); + * $B$r +#include "CandPanel.h" + +typedef struct { + int empty; +} CandidatePanelClassPart; + +typedef struct _CandidatePanelClassRec { + CoreClassPart super_class; + CompositeClassPart composite_class; + CandidatePanelClassPart candidatepanel_class; +} CandidatePanelClassRec; + +extern CandidatePanelClassRec candidatepanelClassRec; + +typedef struct { + /* resources */ + Pixel foreground; + Dimension defaultwidth; + Dimension hspace; + Dimension vspace; + ICString *list; + int nstrings; + int current; /* $B%+%l%s%H$N%"%$%F%`HV9f(B */ + Cursor cursor; + XtCallbackList callback; + /* private state */ + Widget displayobj; /* actually, this is the only child */ + GC invgc; + int fontheight; + /* int ascent; */ + int maxwidth; /* $B%"%$%F%`$N:GBgD9(B */ + int ncolumns; + int nrows; +} CandidatePanelPart; + +typedef struct _CandidatePanelRec { + CorePart core; + CompositePart composite; + CandidatePanelPart cpanel; +} CandidatePanelRec; + +#endif diff -r 000000000000 -r 92745d501b9a include/Canna.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/Canna.h Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,73 @@ +/* $Id: Canna.h,v 1.2 1994/09/21 04:56:56 kon Exp $ */ +/* + * Copyright (c) 1990 Software Research Associates, Inc. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Software Research Associates not be + * used in advertising or publicity pertaining to distribution of the + * software without specific, written prior permission. Software Research + * Associates makes no representations about the suitability of this software + * for any purpose. It is provided "as is" without express or implied + * warranty. + * + * Author: Makoto Ishisone, Software Research Associates, Inc., Japan + */ + +/* Copyright 1991 NEC Corporation, Tokyo, Japan. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, + * provided that the above copyright notice appear in all copies and that + * both that copyright notice and this permission notice appear in + * supporting documentation, and that the name of NEC Corporation + * not be used in advertising or publicity pertaining to distribution + * of the software without specific, written prior permission. NEC + * Corporation makes no representations about the suitability of this + * software for any purpose. It is provided "as is" without express + * or implied warranty. + * + * NEC CORPORATION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN + * NO EVENT SHALL NEC CORPORATION BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF + * USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR + * OTHER TORTUOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + * + * Author: Akira Kon, NEC Corporation. (kon@d1.bs2.mt.nec.co.jp) + */ + +#ifndef _Canna_h +#define _Canna_h + +#include "InputConv.h" + +/* + Canna new resources: + + name class type default access + ---------------------------------------------------------------------------- + cannahost Cannahost String *1 CG + cannafile Cannafile String *2 CG + + note: *1) if not specified, use value of an environment variable "CANNAHOST" + *2) if not specified, use value of an environment variable "CANNAFILE" +*/ + +#define XtNcannahost "cannahost" +#define XtCCannahost "Cannahost" +#define XtNcannafile "cannafile" +#define XtCCannafile "Cannafile" +#define XtNsendReturnByString "sendReturnByString" +#define XtCSendReturnByString "SendReturnByString" + +typedef struct _CannaClassRec *CannaObjectClass; +typedef struct _CannaRec *CannaObject; + +extern WidgetClass cannaObjectClass; + +#endif /* _Canna_h */ + diff -r 000000000000 -r 92745d501b9a include/CannaP.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/CannaP.h Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,111 @@ +/* $Id: CannaP.h,v 1.2 1994/09/21 04:57:02 kon Exp $ */ +/* + * Copyright (c) 1990 Software Research Associates, Inc. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Software Research Associates not be + * used in advertising or publicity pertaining to distribution of the + * software without specific, written prior permission. Software Research + * Associates makes no representations about the suitability of this software + * for any purpose. It is provided "as is" without express or implied + * warranty. + * + * Author: Makoto Ishisone, Software Research Associates, Inc., Japan + */ + +/* Copyright 1991 NEC Corporation, Tokyo, Japan. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, + * provided that the above copyright notice appear in all copies and that + * both that copyright notice and this permission notice appear in + * supporting documentation, and that the name of NEC Corporation + * not be used in advertising or publicity pertaining to distribution + * of the software without specific, written prior permission. NEC + * Corporation makes no representations about the suitability of this + * software for any purpose. It is provided "as is" without express + * or implied warranty. + * + * NEC CORPORATION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN + * NO EVENT SHALL NEC CORPORATION BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF + * USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR + * OTHER TORTUOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + * + * Author: Akira Kon, NEC Corporation. (kon@d1.bs2.mt.nec.co.jp) + */ + + +#ifndef _CannaP_h +#define _CannaP_h + +#include "InputConvP.h" + +#include "WStr.h" +#include "Canna.h" + +typedef struct { + int foo; +} CannaClassPart; + +typedef struct _CannaClassRec { + ObjectClassPart object_class; + InputConvClassPart inputConv_class; + CannaClassPart canna_class; +} CannaClassRec; + +#define NConvertedSegments 3 + +typedef struct { + wchar *str[NConvertedSegments + 3]; + int size[NConvertedSegments + 3]; + int len[NConvertedSegments + 3]; + int offset; + int curseg; + int nseg; + int candstat; /* $B8uJd0lMw9T$N>uBV!#0J2<$r8+$h(B */ + ICString ics[3]; + wchar *gline[3]; + int glsize[3], gllen[3]; + int curgseg, ngseg; + wchar *curmode; + int modesize, modelen; +} iBuf; + +#define CANNA_GLINE_Empty 0 +#define CANNA_GLINE_Start 1 +#define CANNA_GLINE_End 2 +#define CANNA_GLINE_Change 3 + +typedef struct { + /* resources */ + String cannahost; + String cannafile; + Boolean sendReturnByString; + /* private data */ + iBuf *ibuf; + Boolean textchanged; /* $BJQ49%F%-%9%H$,JQ$o$C$?$+(B */ + Boolean selectionending;/* $BA*Br%b!<%I$r=*N;$7$h$&$H$7$F$$$k$+(B */ + ICString *symbollist; + int numsymbols; + int cursymbol; /* $B5-9fA*Br;~!"8=:_A*Br$5$l$F$$$k5-9f(B */ + ICString *candlist; + int candlistsize; + int numcand; /* $BA*Br%b!<%I$N;~!"8uJd?t(B */ + int curcand; /* $B8uJdA*Br;~!"8=:_A*Br$5$l$F$$$k8uJd(B */ + int *cur_addr; /* $B8uJdA*Br;~8uJdHV9f$rF~$l$k%"%I%l%9(B */ + Boolean lastTextLengthIsZero; +} CannaPart; + +typedef struct _CannaRec { + ObjectPart object; + InputConvPart inputConv; + CannaPart canna; +} CannaRec; + +#endif diff -r 000000000000 -r 92745d501b9a include/Canvas.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/Canvas.h Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,32 @@ +/* $Id: Canvas.h,v 1.1 1990/12/11 10:39:40 ishisone Rel $ */ +/* + * Copyright (c) 1990 Software Research Associates, Inc. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Software Research Associates not be + * used in advertising or publicity pertaining to distribution of the + * software without specific, written prior permission. Software Research + * Associates makes no representations about the suitability of this software + * for any purpose. It is provided "as is" without express or implied + * warranty. + * + * Author: Makoto Ishisone, Software Research Associates, Inc., Japan + */ + +#ifndef _Canvas_h +#define _Canvas_h + +/* Canvas widget public header file */ + +#define XtNexposeCallback "exposeCallback" +#define XtNresizeCallback "resizeCallback" + +typedef struct _CanvasClassRec* CanvasWidgetClass; +typedef struct _CanvasRec* CanvasWidget; + +extern WidgetClass canvasWidgetClass; + +#endif diff -r 000000000000 -r 92745d501b9a include/CanvasP.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/CanvasP.h Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,46 @@ +/* $Id: CanvasP.h,v 1.1 1990/12/11 10:39:25 ishisone Rel $ */ +/* + * Copyright (c) 1990 Software Research Associates, Inc. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Software Research Associates not be + * used in advertising or publicity pertaining to distribution of the + * software without specific, written prior permission. Software Research + * Associates makes no representations about the suitability of this software + * for any purpose. It is provided "as is" without express or implied + * warranty. + * + * Author: Makoto Ishisone, Software Research Associates, Inc., Japan + */ + +#ifndef _CanvasP_h +#define _CanvasP_h + +#include +#include "Canvas.h" + +typedef struct { + int empty; +} CanvasClassPart; + +typedef struct _CanvasClassRec { + CoreClassPart core_class; + CanvasClassPart canvas_class; +} CanvasClassRec; + +extern CanvasClassRec canvasClassRec; + +typedef struct { + XtCallbackList exposecallback; + XtCallbackList resizecallback; +} CanvasPart; + +typedef struct _CanvasRec { + CorePart core; + CanvasPart canvas; +} CanvasRec; + +#endif diff -r 000000000000 -r 92745d501b9a include/CanvasSheP.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/CanvasSheP.h Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,54 @@ +/* $Id: CanvasSheP.h,v 1.3 1991/03/22 13:15:11 ishisone Rel $ */ +/* + * Copyright (c) 1990 Software Research Associates, Inc. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Software Research Associates not be + * used in advertising or publicity pertaining to distribution of the + * software without specific, written prior permission. Software Research + * Associates makes no representations about the suitability of this software + * for any purpose. It is provided "as is" without express or implied + * warranty. + * + * Author: Makoto Ishisone, Software Research Associates, Inc., Japan + */ + +#ifndef _CanvasShellP_h +#define _CanvasShellP_h + +#include "AdoptedShP.h" +#include "CanvasShel.h" + +typedef struct { + int empty; +} CanvasShellClassPart; + +typedef struct _CanvasShellClassRec { + CoreClassPart core_class; + CompositeClassPart composite_class; + ShellClassPart shell_class; + OverrideShellClassPart override_shell_class; + AdoptedShellClassPart adoptedshell_class; + CanvasShellClassPart canvasshell_class; +} CanvasShellClassRec; + +extern CanvasShellClassRec canvasShellClassRec; + +typedef struct { + Cursor cursor; + XtCallbackList exposecallback; + XtCallbackList resizecallback; +} CanvasShellPart; + +typedef struct _CanvasShellRec { + CorePart core; + CompositePart composite; + ShellPart shell; + OverrideShellPart override; + AdoptedShellPart adoptedshell; + CanvasShellPart canvasshell; +} CanvasShellRec; +#endif diff -r 000000000000 -r 92745d501b9a include/CanvasShel.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/CanvasShel.h Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,35 @@ +/* $Id: CanvasShel.h,v 1.3 1991/03/22 13:14:56 ishisone Rel $ */ +/* + * Copyright (c) 1990 Software Research Associates, Inc. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Software Research Associates not be + * used in advertising or publicity pertaining to distribution of the + * software without specific, written prior permission. Software Research + * Associates makes no representations about the suitability of this software + * for any purpose. It is provided "as is" without express or implied + * warranty. + * + * Author: Makoto Ishisone, Software Research Associates, Inc., Japan + */ + +#ifndef _CanvasShell_h +#define _CanvasShell_h + +/* CanvasShell widget public header file */ + +#include "AdoptedShe.h" + +#define XtNcursor "cursor" +#define XtNexposeCallback "exposeCallback" +#define XtNresizeCallback "resizeCallback" + +typedef struct _CanvasShellClassRec* CanvasShellWidgetClass; +typedef struct _CanvasShellRec* CanvasShellWidget; + +extern WidgetClass canvasShellWidgetClass; + +#endif diff -r 000000000000 -r 92745d501b9a include/CcWnn.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/CcWnn.h Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,88 @@ +/* $Id: CcWnn.h,v 1.7 1999/04/12 08:53:38 ishisone Exp $ */ +/* + * Copyright (c) 1990 Software Research Associates, Inc. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Software Research Associates not be + * used in advertising or publicity pertaining to distribution of the + * software without specific, written prior permission. Software Research + * Associates makes no representations about the suitability of this software + * for any purpose. It is provided "as is" without express or implied + * warranty. + * + * Author: Makoto Ishisone, Software Research Associates, Inc., Japan + */ + +#ifndef _CcWnn_h +#define _CcWnn_h + +#include "InputConv.h" + +/* + CcWnn new resources: + + name class type default access + ---------------------------------------------------------------------------- + confirmFunc Function Pointer NULL CG + confirmData ConfirmData Ponter NULL CG + jserver Jserver String *1 CG + jserver2nd Jserver String NULL CG + wnnEnvName WnnEnvName String *2 CG + wnnEnvrc WnnEnvrc String *3 CG + wnnEnvrc4 WnnEnvrc String *6 CG + wnnEnvrc6 WnnEnvrc String *6 CG + wnnOverrideEnv WnnOverrideEnv Boolean False CG + wnnEnv WnnEnv WnnEnv *4 CG + ccdef Ccdef String "ccdef.kinput" CG + ccRule CcRule CcRule *4 CG + saveInterval SaveInterval Int 0 (*5) CG + + note: *1) if not specified, use value of an environment variable "JSERVER" + *2) if not specified, use user's loginname + *3) if not specified, use value of an environment variable "WNNENVRC" + *4) if not specified, create internally + *5) 0 means files are never saved + *6) if not specified, defaults to wnnEnvrc +*/ + +#define XtNconfirmFunc "confirmFunc" +#define XtNconfirmData "confirmData" +#define XtCConfirmData "ConfirmData" +#define XtNjserver "jserver" +#define XtNjserver2nd "jserver2nd" +#define XtCJserver "Jserver" +#define XtNwnnEnvname "wnnEnvname" +#define XtCWnnEnvname "WnnEnvname" +#define XtNwnnEnvrc "wnnEnvrc" +#define XtNwnnEnvrc4 "wnnEnvrc4" +#define XtNwnnEnvrc6 "wnnEnvrc6" +#define XtCWnnEnvrc "WnnEnvrc" +#define XtNwnnOverrideEnv "wnnOverrideEnv" +#define XtCWnnOverrideEnv "WnnOverrideEnv" +#define XtNccdef "ccdef" +#define XtCCcdef "Ccdef" +#define XtNwnnEnv "wnnEnv" +#define XtCWnnEnv "WnnEnv" +#define XtRWnnEnv "WnnEnv" +#define XtNccRule "ccRule" +#define XtCCcRule "CcRule" +#define XtRCcRule "CcRule" +#define XtNsaveInterval "saveInterval" +#define XtCSaveInterval "SaveInterval" + +#define DEF_CCDEF_FILE "ccdef.kinput" /* for backward compatibility */ + +#define CCWNN_REGISTER_ATOM "_KI2_WNN_REG" +#define CCWNN_YOMI_ATOM "_KI2_WNN_YOMI" +#define CCWNN_KANJI_ATOM "_KI2_WNN_KANJI" + +typedef struct _CcWnnClassRec *CcWnnObjectClass; +typedef struct _CcWnnRec *CcWnnObject; + +extern WidgetClass ccWnnObjectClass; + +#endif /* _CcWnn_h */ + diff -r 000000000000 -r 92745d501b9a include/CcWnnP.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/CcWnnP.h Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,96 @@ +/* $Id: CcWnnP.h,v 1.16 1999/04/12 08:53:38 ishisone Exp $ */ +/* + * Copyright (c) 1990 Software Research Associates, Inc. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Software Research Associates not be + * used in advertising or publicity pertaining to distribution of the + * software without specific, written prior permission. Software Research + * Associates makes no representations about the suitability of this software + * for any purpose. It is provided "as is" without express or implied + * warranty. + * + * Author: Makoto Ishisone, Software Research Associates, Inc., Japan + */ + +#ifndef _CcWnnP_h +#define _CcWnnP_h + +#include "InputConvP.h" + +#undef wchar +#include "WStr.h" +#include "CcWnn.h" +#include "wnnlib.h" +#include "cconv.h" + +typedef struct { + int foo; +} CcWnnClassPart; + +typedef struct _CcWnnClassRec { + ObjectClassPart object_class; + InputConvClassPart inputConv_class; + CcWnnClassPart ccWnn_class; +} CcWnnClassRec; + +typedef enum { + normal_state, + selection_s_state, /* $B>.J8@a8uJdA*Br%b!<%I(B */ + selection_l_state, /* $BBgJ8@a8uJdA*Br%b!<%I(B */ + symbol_state /* $B5-9fF~NO%b!<%I(B */ +} CcWnnState; + +typedef struct { + /* resources */ + int (*confirmfunc)(); + XtPointer confirmdata; + String jservername; + String jservername2; /* secondary jserver */ + String wnnenvname; + String wnnenvrcfile; + String wnnenvrcfile4; /* rcfile for Wnn4 */ + String wnnenvrcfile6; /* rcfile for Wnn6 */ + Boolean wnnoverrideenv; + String ccdeffile; + struct wnn_buf *wnnbuf; + ccRule ccrule; + int saveinterval; + /* private data */ + ccBuf ccbuf; + jcConvBuf *jcbuf; + Boolean createrule; /* ccrule $B$r<+J,$G:n$C$?$+30$+$iM?$($i$l$?$+(B */ + Boolean createenv; /* wnnenv $B$r<+J,$G:n$C$?$+30$+$iM?$($i$l$?$+(B */ + CcWnnState state; /* $BJQ49$NFbIt>uBV(B */ + Boolean textchanged; /* $BJQ49%F%-%9%H$,JQ$o$C$?$+(B */ + Boolean selectionending;/* $BA*Br%b!<%I$r=*N;$7$h$&$H$7$F$$$k$+(B */ + Boolean sendbackevent; /* $B%$%Y%s%H$rAw$jJV$9$+(B */ + Boolean fixperformed; /* $B3NDj=hM}$,9T$o$l$?$+(B */ + ICString *symbollist; + int numsymbols; + int cursymbol; /* $B5-9fA*Br%b!<%I$N;~!"8=:_A*Br$5$l$F$$$k5-9f(B */ + ICString *candlist; + int candlistsize; + wchar *strdata; + int strdatasize; + int numcand; /* $BA*Br%b!<%I$N;~!"8uJd?t(B */ + int curcand; /* $B8uJdA*Br%b!<%I$N;~!"8=:_A*Br$5$l$F$$$k8uJd(B */ + int fixcount; + enum {JIS_MODE, KUTEN_MODE, OTHERS} inputmode; + wchar *pendingdata; + int cont; /* $B8eB3$N%3%^%s%I$r + +#define XtNinputObject "inputObject" +#define XtCInputObject "InputObject" +#define XtNinputObjectClass "inputObjectClass" +#define XtCInputObjectClass "InputObjectClass" +#define XtNdisplayObjectClass "displayObjectClass" +#define XtCDisplayObjectClass "DisplayObjectClass" +#define XtNselectionWidgetClass "selectionWidgetClass" +#define XtCSelectionWidgetClass "SelectionWidgetClass" +#define XtNauxWidgetClass "auxWidgetClass" +#define XtCAuxWidgetClass "AuxWidgetClass" + +#define XtNclientWindow "clientWindow" +#define XtNfocusWindow "focusWindow" + +#define XtNcursor "cursor" + +#define XtNeventSelectMethod "eventSelectMethod" +#define XtCEventSelectMethod "EventSelectMethod" + +#define XtNtextEncoding "textEncoding" +#define XtCTextEncoding "TextEncoding" + +#define XtNtextCallback "textCallback" +#define XtNnewTextCallback "newTextCallback" +#define XtNendCallback "endCallback" +#define XtNunusedEventCallback "unusedEventCallback" + +#define XtNsendbackKeyPress "sendbackKeyPress" +#define XtCSendbackEvent "SendbackEvent" + +#define XtNtitlebarHeight "titlebarHeight" +#define XtCTitlebarHeight "TitlebarHeight" + +typedef enum { + ESMethodNone, /* do nothing */ + ESMethodInputOnly, /* creates a Input-Only window on clientwindow + * and select event on it + */ + ESMethodSelectFocus /* selects event on fucuswindow */ +} EventSelectMethod; + +typedef struct { + Atom encoding; /* text encoding e.g. COMPOUND_TEXT */ + int format; /* text format (8/16/32) */ + int length; /* text length */ + XtPointer text; /* text data */ +} CCTextCallbackArg; + +typedef struct _ConversionControlClassRec* ConversionControlWidgetClass; +typedef struct _ConversionControlRec* ConversionControlWidget; + +extern WidgetClass conversionControlWidgetClass; + + +/* + * public functions (and their argument type) + */ + +#define CASpotLocation 0x1L +#define CAFocusWindow 0x2L +#define CAClientArea 0x4L +#define CAStatusArea 0x8L +#define CAColormap 0x10L +#define CAColor 0x20L +#define CABackgroundPixmap 0x40L +#define CALineSpacing 0x80L +#define CAFonts 0x100L +#define CACursor 0x200L +#define CAStatusFonts 0x400L + +typedef struct { + Position spotx, spoty; + Window focuswindow; + XRectangle clientarea; + XRectangle statusarea; + Colormap colormap; + Pixel foreground, background; + Pixmap background_pixmap; + Dimension linespacing; + XFontStruct **fonts; /* an array of pointers to (XFontStruct), + * NOT a pointer to an array of (XFontStruct) + */ + Cardinal num_fonts; + XFontStruct **status_fonts; /* ditto */ + Cardinal num_status_fonts; + Cursor cursor; +} ConversionAttributes; + +extern void CControlStartConversion( +#if NeedFunctionPrototypes + Widget /* w */, + Window /* clientwindow */, + unsigned long /* valuemask */, + ConversionAttributes * /* value */ +#endif +); + +extern void CControlChangeAttributes( +#if NeedFunctionPrototypes + Widget /* w */, + unsigned long /* valuemask */, + ConversionAttributes * /* value */ +#endif +); + +extern void CControlChangeFocus( +#if NeedFunctionPrototypes + Widget /* w */, + int /* set (non-zero: set, zero: unset) */ +#endif +); + +extern void CControlEndConversion( +#if NeedFunctionPrototypes + Widget /* w */ +#endif +); + +#endif diff -r 000000000000 -r 92745d501b9a include/ConvCtrlP.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/ConvCtrlP.h Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,153 @@ +/* $Id: ConvCtrlP.h,v 1.20 1999/05/06 09:07:53 ishisone Exp $ */ +/* + * Copyright (c) 1990 Software Research Associates, Inc. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Software Research Associates not be + * used in advertising or publicity pertaining to distribution of the + * software without specific, written prior permission. Software Research + * Associates makes no representations about the suitability of this software + * for any purpose. It is provided "as is" without express or implied + * warranty. + * + * Author: Makoto Ishisone, Software Research Associates, Inc., Japan + */ + +#ifndef _ConversionControlP_h +#define _ConversionControlP_h + +#include +#include "ConvCtrl.h" +#include "ICtypes.h" + +#define XtREventSelectMethod "EventSelectMethod" + +/* + * generic conversion control widget data structure + */ + +typedef struct { + void (*Startup)(); + void (*Finish)(); + void (*ChangeAttributes)(); + void (*ChangeFocus)(); + void (*TextChange)(); + void (*Fix)(); + void (*ModeChange)(); + void (*SelectionControl)(); + void (*AuxControl)(); +} ConversionControlClassPart; + +typedef struct _ConversionControlClassRec { + CoreClassPart core_class; + CompositeClassPart composite_class; + ShellClassPart shell_class; + WMShellClassPart wm_shell_class; + VendorShellClassPart vendor_shell_class; + TransientShellClassPart transient_shell_class; + ConversionControlClassPart conversionControl_class; +} ConversionControlClassRec; + +extern ConversionControlClassRec conversionControlClassRec; + +typedef struct { + /* resources */ + Widget inputobj; + WidgetClass inputobjclass; + WidgetClass displayobjclass; + WidgetClass selectionwidgetclass; + Window clientwindow; /* READ ONLY RESOURCE */ + Window focuswindow; /* READ ONLY RESOURCE */ + Cursor cursor; + EventSelectMethod eventselectmethod; + Atom textencoding; + XtCallbackList textcallback; + XtCallbackList newtextcallback; + XtCallbackList endcallback; + XtCallbackList unusedeventcallback; + Boolean sendbackKeyPress; /* whether unused keypress events are + * sent back to the focus window or not + */ + Dimension titlebarheight; /* height of a titlebar attached to + * popup shells (mode/selection/aux) + */ + /* private state */ + Boolean active; /* Am I active (i.e. doing conversion) now? */ + Boolean notext; /* true iff there is no convertion text */ + Window oldclientwindow; /* the last client window */ + Position client_rootx; /* client window position */ + Position client_rooty; + XWindowAttributes client_attr; /* client window attributes */ + XWindowAttributes focus_attr; /* focus window attributes */ + Window probewindow; /* window for event interception */ + Boolean createinputobj; + Boolean eventused; + Boolean endnotify; /* endNotify callback is called */ +} ConversionControlPart; + +typedef struct _ConversionControlRec { + CorePart core; + CompositePart composite; + ShellPart shell; + WMShellPart wm; + VendorShellPart vendor; + TransientShellPart transient; + ConversionControlPart ccontrol; +} ConversionControlRec; + +#define XtInheritStartup (void(*)())_XtInherit +#define XtInheritFinish (void(*)())_XtInherit +#define XtInheritChangeAttributes (void(*)())_XtInherit +#define XtInheritChangeFocus (void(*)())_XtInherit +#define XtInheritTextChange (void(*)())_XtInherit +#define XtInheritFix (void(*)())_XtInherit +#define XtInheritModeChange (void(*)())_XtInherit +#define XtInheritSelectionControl (void(*)())_XtInherit +#define XtInheritAuxControl (void(*)())_XtInherit + +/* + * ConversionControlClass methods: + * + * void (*Startup)(Widget w, unsigned long mask, ConversionAttributes *attrs) + * called from CControlStartCoversion() at conversion startup. + * all the attributes specified in attrs and client window ID are + * guaranteed to be valid (ie you don't have to check their validity). + * + * void (*Finish)(Widget w) + * called from CControlEndConversion() at conversion finish. + * also called when the client window is destroyed, so take care + * of XErrors, namely BadWindow. + * + * void (*ChangeAttributes)(Widget w, unsigned long mask, + * ConversionAttributes *attrs) + * called from CControlChangeAttributes when conversion attributes + * are changed. like Startup, all the attributes are guaranteed to + * be valid. + * + * void (*ChangeFocus)(Widget w, int set) + * called from CControlChangeFocus at focus change. argument 'set' + * indicates the new focus state. if it is non-zero, focus is set, + * if it is zero, focus is unset. + * + * void (*TextChange)(Widget w) + * called when converting text has changed. + * + * void (*Fix)(Widget w, CCTextCallbackArg *arg) + * called when the text has been fixed. + * + * void (*ModeChange)(Widget w) + * called when input mode has changed. + * + * void (*SelectionControl)(Widget w, ICSelectionControlArg *arg) + * called to control candidate slection. + * see InputConv.h for type ICSelectionControlArg. + * + * void (*AuxControl)(Widget w, ICAuxControlArg *arg) + * called to control auxiliary area. + * see InputConv.h for type ICAuxControlArg. + */ + +#endif diff -r 000000000000 -r 92745d501b9a include/ConvDisp.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/ConvDisp.h Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,183 @@ +/* $Id: ConvDisp.h,v 1.9 1999/01/07 03:06:21 ishisone Exp $ */ +/* + * Copyright (c) 1990 Software Research Associates, Inc. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Software Research Associates not be + * used in advertising or publicity pertaining to distribution of the + * software without specific, written prior permission. Software Research + * Associates makes no representations about the suitability of this software + * for any purpose. It is provided "as is" without express or implied + * warranty. + * + * Author: Makoto Ishisone, Software Research Associates, Inc., Japan + */ + +#ifndef _ConvDisplay_h +#define _ConvDisplay_h + +#include +#include "ICtypes.h" + +/* + ConvDisplay new resources: + + name class type default access + ---------------------------------------------------------------------------- + foreground Foreground Pixel DefaultForeground CSG + background Background Pixel DefaultBackground CSG + cursorBitmap CursorBitmap Bitmap *1 CSG + hotX HotX Position 3 CSG + hotY HotY Position 2 CSG + + note: *1) default is a small caret + +*/ + +#define XtNcursorBitmap "cursorBitmap" +#define XtCCursorBitmap "CursorBitmap" +#define XtNhotX "hotX" +#define XtNhotY "hotY" +#define XtCHotX "HotX" +#define XtCHotY "HotY" + +typedef struct _ConvDisplayClassRec *ConvDisplayObjectClass; +typedef struct _ConvDisplayRec *ConvDisplayObject; + +extern WidgetClass convDisplayObjectClass; + +/* + * public interface functions + */ + +/* + * int CDStringWidth(Widget object, ICString *str, int start, int end) + * $B;XDj$5$l$?J8;zNs$N(B start $BJ8;zL\$+$i(B end - 1 $BJ8;zL\$^$G$N(B + * $BI}(B ($BC10L$O%T%/%;%k(B) $B$rJV$9(B + * end $B$,Ii$N;~$OJ8;zNs$N:G8e$^$G$rI=$9(B + */ +extern int CDStringWidth( +#if NeedFunctionPrototypes + Widget /* object */, + ICString * /* str */, + int /* start */, + int /* end */ +#endif +); + +/* + * int CDLineHeight(Widget object, Position *ascentp) + * $B9T$N9b$5(B ($BC10L$O%T%/%;%k(B) $B$rJV$9(B + * ascentp $B$,(B NULL $B$G$J$$;~$K$O(B ascent $B$,JV$5$l$k(B + */ +extern int CDLineHeight( +#if NeedFunctionPrototypes + Widget /* object */, + Position * /* ascentp */ +#endif +); + +/* + * void CDDrawString(Widget object, Widget canvas, ICString *str, + * int start, int end, int x, int y) + * canvas $B$G;XDj$5$l$k(B widget $B$N:BI8(B (x, y) $B$+$i!";XDj$5$l$?(B + * $BJ8;zNs$N(B start $BJ8;zL\$+$i(B end - 1 $BJ8;zL\$^$G$r=q$/(B + * end $B$,Ii$N;~$OJ8;zNs$N:G8e$^$G$rI=$9(B + * $B$?$@$7!"(B(x, y) $B$OJ8;zNs$N:8>e$N:BI8$G$"$k(B + */ +extern void CDDrawString( +#if NeedFunctionPrototypes + Widget /* object */, + Widget /* canvas */, + ICString * /* str */, + int /* start */, + int /* end */, + int /* x */, + int /* y */ +#endif +); + +/* + * int CDMaxChar(Widget object, ICString *str, int start, int width) + * $B;XDj$5$l$?J8;zNs$N(B start $BJ8;zL\$+$i!"%T%/%;%kI}(B width $B$K(B + * $BF~$kJ8;z?t$rJV$9(B + */ +extern int CDMaxChar( +#if NeedFunctionPrototypes + Widget /* object */, + ICString * /* str */, + int /* start */, + int /* end */ +#endif +); + +/* + * void CDDrawCursor(Widget object, Widget canvas, int x, int y, int on) + * canvas $B$G;XDj$5$l$k(B widget $B$N:BI8(B (x, y) $B$K%$%s%5!<%H%+!<%=%k$r(B + * $BI=<($9$k(B + * on $B$,(B False $B$N;~$K$O%+!<%=%k$r>C$9(B + * $B;XDj$9$k(B y $B:BI8$K$O%U%)%s%H$N%Y!<%9%i%$%s$r;XDj$9$k(B + */ +extern void CDDrawCursor( +#if NeedFunctionPrototypes + Widget /* object */, + Widget /* canvas */, + int /* x */, + int /* y */, + int /* on */ +#endif +); + +/* + * void CDGetCursorBounds(Widget object, XRectangle *bounds) + * $BI=<($5$l$k%+!<%=%k$NI=<(NN0h$r(B bounds $B$KJV$9(B + * $B:BI8(B (x, y) $B$K%+!<%=%k$r=q$$$?;~$NI=<(NN0h$O(B + * (x + bounds->x, y + bounds->y): $B:8>e:BI8(B + * (bounds->width, bounds->height): $BNN0h$NBg$-$5(B + * $B$K$J$k(B + */ +extern void CDGetCursorBounds( +#if NeedFunctionPrototypes + Widget /* object */, + XRectangle * /* bounds */ +#endif +); + + +/* + * void CDSetFonts(Widget object, XFontStruct **fontset, Cardinal num_fonts) + * (note: fontset is an array of (XFontStruct *).) + * $BIA2h$K(B fontset $B$G;XDj$5$l$k%U%)%s%H$r;HMQ$9$k$h$&$K@_Dj$9$k(B + * $B%*%V%8%'%/%H$O(B fontset $B$NCf$+$i<+J,$N;HMQ$9$k%-%c%i%/%?%;%C%H$N(B + * $B%U%)%s%H$rA*$s$G@_Dj$9$k(B + * $B$b$7!"I,MW$J%-%c%i%/%?%;%C%H$N%U%)%s%H$,$J$1$l$PE,Ev$J%U%)%s%H$r(B + * $B@_Dj$9$k(B + * $B$3$l$OB>$N%-%c%i%/%?%;%C%H$N%U%)%s%H$K9g$o$;$FA*$V$N$,$h$$$H(B + * $B;W$o$l$k$,!"%G%U%)%k%H%U%)%s%H$G4V$K9g$o$;$F$b$h$$(B + * $B$b$7(B num_fonts $B$,(B 0 $B$G$"$l$P3F%*%V%8%'%/%H$N%G%U%)%k%H%U%)%s%H$r(B + * $B;HMQ$9$k$h$&$K@_Dj$5$l$k(B + */ +extern void CDSetFonts( +#if NeedFunctionPrototypes + Widget /* object */, + XFontStruct ** /* fontset */, + Cardinal /* num_fonts */ +#endif +); + +/* + * void CDSetBlockCursor(Widget object, XRectangle *shape) + * shape $B$G;XDj$5$l$k%V%m%C%/%+!<%=%k$r@_Dj$9$k(B + * shape $B$N;XDj$O(B CDGetCursorBounds() $B$N(B bounds $B$HF1$8$G$"$k(B + */ +extern void CDSetBlockCursor( +#if NeedFunctionPrototypes + Widget /* object */, + XRectangle * /* shape */ +#endif +); + +#endif /* _ConvDisplay_h */ diff -r 000000000000 -r 92745d501b9a include/ConvDispP.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/ConvDispP.h Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,88 @@ +/* $Id: ConvDispP.h,v 1.7 1991/09/17 10:04:46 ishisone Rel $ */ +/* + * Copyright (c) 1990 Software Research Associates, Inc. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Software Research Associates not be + * used in advertising or publicity pertaining to distribution of the + * software without specific, written prior permission. Software Research + * Associates makes no representations about the suitability of this software + * for any purpose. It is provided "as is" without express or implied + * warranty. + * + * Author: Makoto Ishisone, Software Research Associates, Inc., Japan + */ + +#ifndef _ConvDisplayP_h +#define _ConvDisplayP_h + +#include +#include "ConvDisp.h" + +typedef struct { + int (*StringWidth)(); + int (*LineHeight)(); + void (*DrawString)(); + int (*MaxChar)(); + void (*DrawCursor)(); + void (*GetCursorBounds)(); + void (*SetFonts)(); +} ConvDisplayClassPart; + +typedef struct _ConvDisplayClassRec { + ObjectClassPart object_class; + ConvDisplayClassPart convDisplay_class; +} ConvDisplayClassRec; + +typedef struct { + /* resources */ + Pixel foreground; + Pixel background; + Pixmap cursor; /* really a bitmap */ + Position hotx; + Position hoty; + /* private */ + Boolean cursorcreated; + XRectangle cursorbounds; + GC cursorgc; + Boolean cursorvisible; +} ConvDisplayPart; + +typedef struct _ConvDisplayRec { + ObjectPart object; + ConvDisplayPart convDisplay; +} ConvDisplayRec; + +extern ConvDisplayClassRec convDisplayClassRec; + +#define XtInheritStringWidth (int(*)())_XtInherit +#define XtInheritLineHeight (int(*)())_XtInherit +#define XtInheritDrawString (void(*)())_XtInherit +#define XtInheritMaxChar (int(*)())_XtInherit +#define XtInheritDrawCursor (void(*)())_XtInherit +#define XtInheritGetCursorBounds (void(*)())_XtInherit +#define XtInheritSetFonts (void(*)())_XtInherit + + +/* semi-public function */ + +typedef struct { + Atom registry; /* ex) "ISO8859", "JISX0208.1983" */ + Atom encoding; /* ex) "0", "1" */ + XFontStruct *font; /* return value */ +} FontSpec; + +extern int _CDPickupFonts( +#if NeedFunctionPrototypes + Widget /* widget */, + FontSpec * /* spec */, + Cardinal /* num_specs */, + XFontStruct ** /* fonts */, + Cardinal /* num_fonts */ +#endif +); + +#endif diff -r 000000000000 -r 92745d501b9a include/ConvMgr.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/ConvMgr.h Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,77 @@ +/* $Id: ConvMgr.h,v 1.5 1991/04/18 16:59:00 ishisone Rel $ */ +/* + * Copyright (c) 1990 Software Research Associates, Inc. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Software Research Associates not be + * used in advertising or publicity pertaining to distribution of the + * software without specific, written prior permission. Software Research + * Associates makes no representations about the suitability of this software + * for any purpose. It is provided "as is" without express or implied + * warranty. + * + * Author: Makoto Ishisone, Software Research Associates, Inc., Japan + */ + +#ifndef _ConversionManager_h +#define _ConversionManager_h + +typedef struct _ConversionManagerClassRec* ConversionManagerWidgetClass; +typedef struct _ConversionManagerRec* ConversionManagerWidget; + +extern WidgetClass conversionManagerWidgetClass; + +/* + * (semi)public functions + * + * these functions are for the protocol widgets + */ + +/* + * void CMGetConverter() + * returns a widget of the specified class that is on the + * same screen as the client window. + * first it searches its internal cache and if unused one found, + * take and returns it. otherwise make a new one and returns it. + */ +extern Widget CMGetConverter( +#if NeedFunctionPrototypes + Widget /* w */, + Window /* client */, + WidgetClass /* converterclass */, + WidgetClass /* inputobjclass */, + WidgetClass /* displayobjclass */ +#endif +); + +/* + * void CMPrepareConverter() + * make a new converter widget of the specified class on the + * specified screen, add it to the internal cache for later use. + */ +extern void CMPrepareConverter( +#if NeedFunctionPrototypes + Widget /* w */, + Screen * /* screen */, + WidgetClass /* converterclass */, + WidgetClass /* inputobjclass */, + WidgetClass /* displayobjclass */ +#endif +); + +/* + * void CMReleaseConverter() + * mark specified converter widget as unused, and enter it + * to the cache. + */ +extern void CMReleaseConverter( +#if NeedFunctionPrototypes + Widget /* w */, + Widget /* converter */ +#endif +); + +#endif diff -r 000000000000 -r 92745d501b9a include/ConvMgrP.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/ConvMgrP.h Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,64 @@ +/* $Id: ConvMgrP.h,v 1.4 1991/04/18 16:59:16 ishisone Rel $ */ +/* + * Copyright (c) 1990 Software Research Associates, Inc. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Software Research Associates not be + * used in advertising or publicity pertaining to distribution of the + * software without specific, written prior permission. Software Research + * Associates makes no representations about the suitability of this software + * for any purpose. It is provided "as is" without express or implied + * warranty. + * + * Author: Makoto Ishisone, Software Research Associates, Inc., Japan + */ + +#ifndef _ConversionManagerP_h +#define _ConversionManagerP_h + +#include +#include "ConvMgr.h" + +typedef struct { + int empty; +} ConversionManagerClassPart; + +typedef struct _ConversionManagerClassRec { + CoreClassPart core_class; + CompositeClassPart composite_class; + ConversionManagerClassPart conversionmanager_class; +} ConversionManagerClassRec; + +extern ConversionManagerClassRec conversionmanagerClassRec; + +typedef struct _convlist_ { + Boolean busy; + WidgetClass converterclass; + WidgetClass inputobjclass; + WidgetClass displayobjclass; + Widget converter; + Screen *screen; + struct _convlist_ *next; +} ConverterRec; + +typedef struct _inputobjlist_ { + WidgetClass inputobjclass; + Widget inputobj; + struct _inputobjlist_ *next; +} InputObjRec; + +typedef struct { + /* private state */ + ConverterRec *converterlist; + InputObjRec *inputobjlist; +} ConversionManagerPart; + +typedef struct _ConversionManagerRec { + CorePart core; + CompositePart composite; + ConversionManagerPart convmgr; +} ConversionManagerRec; +#endif diff -r 000000000000 -r 92745d501b9a include/ConvProto.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/ConvProto.h Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,321 @@ +/* $Id: ConvProto.h,v 1.6 1999/01/07 03:06:22 ishisone Exp $ */ +/* + * Copyright (c) 1991 Software Research Associates, Inc. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Software Research Associates not be + * used in advertising or publicity pertaining to distribution of the + * software without specific, written prior permission. Software Research + * Associates makes no representations about the suitability of this software + * for any purpose. It is provided "as is" without express or implied + * warranty. + * + * Author: Makoto Ishisone, Software Research Associates, Inc., Japan + */ + +#ifndef _ConvProto_h +#define _ConvProto_h + +/* $BJQ49%5!<%P$N%W%m%U%!%$%k$,F~$k%W%m%Q%F%#L>(B */ +#define CONVERSION_PROFILE "_CONVERSION_PROFILE" + +/* $BJQ49%5!<%P$N%W%m%U%!%$%k$N%W%m%Q%F%#$HJQ49B0@-$N%W%m%Q%F%#$N%?%$%W(B */ +#define CONVERSION_ATTRIBUTE_TYPE "_CONVERSION_ATTRIBUTE_TYPE" + +/* $B%W%m%H%3%k%P!<%8%g%sL>(B */ +#define PROTOCOL_VERSION "PROTOCOL-2.0" + +#define CONV_ATTR(code,len) ((unsigned long)((code)<<16)+(len)) + +#define UPPER16U(data) (((data)>>16)&0xffff) +#define UPPER16S(data) ((short)(((data)>>16)&0xffff)) +#define LOWER16U(data) ((data)&0xffff) +#define LOWER16S(data) ((short)((data)&0xffff)) + +#define CODE_OF_ATTR(head) UPPER16U(head) +#define LENGTH_OF_ATTR(head) LOWER16U(head) + +/* + * Conversion Profile Codes + */ + +#define CONVPROF_PROTOCOL_VERSION 1 +#define CONVPROF_SUPPORTED_STYLES 2 +#define CONVPROF_SUPPORTED_EXTENSIONS 3 +#define CONVPROF_EXTENSION_DATA 4 + +/* + * Standard Conversion Attribute Codes (0-255) + */ + +/* 0-127: can be specified at any time (startup and during conversion) */ +#define CONVATTR_NONE 0 +#define CONVATTR_INDIRECT 1 +#define CONVATTR_FOCUS_WINDOW 2 +#define CONVATTR_SPOT_LOCATION 3 +#define CONVATTR_CLIENT_AREA 4 +#define CONVATTR_STATUS_AREA 5 +#define CONVATTR_COLORMAP 6 +#define CONVATTR_COLOR 7 +#define CONVATTR_BACKGROUND_PIXMAP 8 +#define CONVATTR_LINE_SPACING 9 +#define CONVATTR_FONT_ATOMS 10 +#define CONVATTR_CURSOR 11 + +/* 128-255: can be specified only at startup time */ +#define CONVATTR_INPUT_STYLE 128 +#define CONVATTR_EVENT_CAPTURE_METHOD 129 +#define CONVATTR_USE_EXTENSION 255 + +/* argument for CONVATTR_INPUT_STYLE and CONVPROP_SUPPORTED_STYLES */ +#define CONVARG_ROOTWINDOW 1L +#define CONVARG_OFFTHESPOT 2L +#define CONVARG_OVERTHESPOT 4L + +/* argument for CONVATTR_EVENT_CAPTURE_METHOD */ +#define CONVARG_NONE 0L +#define CONVARG_CREATE_INPUTONLY 1L +#define CONVARG_SELECT_FOCUS_WINDOW 2L + +/* + * $B%W%m%U%!%$%k%G!<%?(B / $BJQ49B0@-%G!<%?$NI=8=J}K!(B + * + * $BJQ49%5!<%P$NFC@-$rI=$9%W%m%U%!%$%k%G!<%?$H!"JQ49$K4X$9$kB0@-$r;XDj$9(B + * $B$kJQ49B0@-%G!<%?$O6&DL$N%U%)!<%^%C%H$rMQ$$$k!#(B + * + * $B8D!9$N%G!<%?$O(B 32bit$BCM$NG[Ns$GI=8=$5$l$k!#:G=i$N(B 1$B%o!<%I$O%X%C%@$G!"(B + * $B$=$l$K(B 0$B%o!<%I0J>e$N%G!<%?$,B3$/!#%X%C%@$N>e0L(B 16bit $B$O$=$N%W%m%U%!%$(B + * $B%k(B / $BJQ49B0@-$N%3!<%I$rI=$7!"2<0L(B 16 bit $B$OB3$/%G!<%?$N%o!<%I?t(B + * (32bit $BC10L(B) $B$rI=$9!#(B + * + * +----------------+----------------+ + * | Code (16bit) | Length (16bit) | + * +----------------+----------------+ + * | Data0 | + * +---------------------------------+ + * | ..... | + * +---------------------------------+ + * | DataN | + * +---------------------------------+ + * + * $B!H(B) $B$rMQ$$$F$"$i$+(B + * $B$8$a@k8@$9$kI,MW$,$"$k!#(B + * + * $BB0@-%G!<%?$N;XDjJ}K!$K$O!"JQ493+;O;~$K;XDj$9$kJ}K!$H!"JQ49Cf$K;XDj$9(B + * $B$kJ}K!$N(B 2$BDL$j$,$"$k$,!"B0@-%3!<%I$K$h$C$F$OJQ493+;O;~$K$7$+;XDj$G$-(B + * $B$J$$$b$N$,$"$k!#$=$3$G!"(B0-255 $B$NI8=`%3!<%I$N$&$A!"(B0 $B$+$i(B 127 $B$^$G$OJQ(B + * $B493+;O;~$G$bJQ49Cf$G$b;XDj$G$-$k$b$N!"(B128 $B$+$i(B 255 $B$^$G$OJQ493+;O;~$K(B + * $B$7$+;XDj$G$-$J$$$b$N!"$KJ,$1$F$"$k!#3HD%%3!<%I$K$D$$$F$OFC$K$3$N$h$&(B + * $B$J6hJL$ODj$a$J$$!#(B + * + * $B$3$N%W%m%H%3%k$GDj5A$5$l$kB0@-%3!<%I$O$C$FB0@-$r@_Dj$9$k!#(BCONVERSION_ATTRIBUTE + * $B%$%Y%s%H$GJ#?t$NB0@-%G!<%?$r@_Dj$7$?$$;~$d!"%$%Y%s%H$KB0@-%G!<%?$,(B + * $BF~$j@Z$i$J$$;~$K;HMQ$9$k!#(B + * + * Focus Window: + * code: 2 + * data-length: 1 + * data[0]: + * CARD32: focus window (Window) + * + * $B%U%)!<%+%9%&%#%s%I%&$r;XDj$9$k!#(B + * + * Spot Location: + * data-length: 1 + * data[0]: + * INT16(upper 16bit): X + * INT16(lower 16bit): Y + * + * $B%9%]%C%H%m%1!<%7%g%s$r;XDj$9$k!#%Y!<%9%i%$%s$N3+;OE@$G;XDj$9$k!#(B + * + * Client Area: + * data-length: 2 + * data[0]: + * INT16(upper 16bit): X + * INT16(lower 16bit): Y + * data[1]: + * CARD16(upper 16bit): Width + * CARD16(lower 16bit): Height + * + * $BJQ49%F%-%9%HI=<(NN0h$r;XDj$9$k!#(B + * + * Status Area: + * data-length: 2 + * data[0]: + * INT16(upper 16bit): X + * INT16(lower 16bit): Y + * data[1]: + * CARD16(upper 16bit): Width + * CARD16(lower 16bit): Height + * + * $B%9%F!<%?%9I=<(NN0h$r;XDj$9$k!#(B + * + * Colormap: + * data-length: 1 + * data[0]: + * CARD32: colormap (XID) + * + * $B%+%i!<%^%C%W(B ID $B$r;XDj$9$k!#(B + * + * Color: + * data-length: 2 + * data[0]: + * CARD32: foreground pixel + * data[1]: + * CARD32: background pixel + * + * $B%U%)%"%0%i%&%s%I$H%P%C%/%0%i%&%s%I$N%T%/%;%kCM$r;XDj$9$k!#(B + * + * Background Pixmap: + * data-length: 1 + * data[0]: + * CARD32: background pixmap (Pixmap) + * + * $B%P%C%/%0%i%&%s%I$N(B Pixmap ID $B$r;XDj$9$k!#(B + * + * Line Spacing: + * data-length: 1 + * data[0]: + * CARD32: line spacing + * + * $B9T4V$r;XDj$9$k!#%Y!<%9%i%$%s4V$N5wN%$G;XDj$9$k!#(B + * + * Font Atoms: + * data-length: N (>0) + * data[0]: + * CARD32: font atom 1 (Atom) + * ... + * data[N-1]: + * CARD32: font atom N (Atom) + * + * $B;HMQ$9$k%U%)%s%H$N(B "FONT" $B%"%H%`$N%j%9%H$r;XDj$9$k!#(B + * + * Cursor: + * data-length: 1 + * data[0]: + * CARD32: cursor (Cursor) + * + * $B%+!<%=%k(B ID $B$r;XDj$9$k!#(B + * + * -- $BJQ493+;O;~$N$_;XDj$G$-$k$b$N(B -- + * + * Input Style: + * data-length: 1 + * data[0]: + * CARD32: input style + * + * $BF~NOJ}K!$r;XDj$9$k!#(B + * $B%G%U%)%k%H$O(B Root Window Style $B$G$"$k!#(B + * + * Event Capture Method: + * data-length: 1 + * data[0]: + * CARD32: event capture method + * + * $B%/%i%$%"%s%H%&%#%s%I%&$+$i$N%$%Y%s%H$N$NJ}K!$H$7$F$O!"(B + * $B%U%)!<%+%9%&%#%s%I%&(B ($B%U%)!<%+%9%&%#%s%I%&$,;XDj$5$l$F$$$J$1$l$P(B + * $B%/%i%$%"%s%H%&%#%s%I%&(B) $B$N%-!<%$%Y%s%H$rD>@\%;%l%/%H$9$k(B ($B$3$N>l(B + * $B9g!"JQ49Cf$O%/%i%$%"%s%H$O%-!<%$%Y%s%H$rL5;k$7$J$/$F$O$J$i$J$$(B) + * $B$b$N$H!"2?$b$7$J$$!"$D$^$jJQ49Cf$N%/%i%$%"%s%H$O%-!<%$%Y%s%H$r%U(B + * $B%m%s%H%(%s%I$K(B SendEvent $B$7$J$/$F$O$J$i$J$$!"$H$$$&J}K!$,$"$k!#(B + * + * Use Extension: + * data-length: N + * data[0]: + * CARD32: extension atom 1 (Atom) + * ... + * data[N-1]: + * CARD32: extension atom N (Atom) + * + * $B$3$NB0@-@_Dj$G;HMQ$5$l$k3HD%$r;XDj$9$k!#$3$3$G;XDj$9$k3HD%$O%5!<(B + * $B%P$,%5%]!<%H$7$F$$$k$b$N!"$D$^$j%W%m%U%!%$%k%G!<%?Cf$N(BSupported + * Extensions $B$K=q$+$l$?3HD%$G$J$1$l$P$J$i$J$$!#(B + */ + +#endif diff -r 000000000000 -r 92745d501b9a include/DebugPrint.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/DebugPrint.h Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,32 @@ +/* $Id: DebugPrint.h,v 1.5 1994/05/16 08:34:19 ishisone Rel $ */ + +#ifdef DEBUG +extern int debug_all; + +#ifdef DEBUG_VAR +int DEBUG_VAR = 0; +#else /* DEBUG_VAR */ +#ifdef EXT_DEBUG_VAR +extern int EXT_DEBUG_VAR; +#define DEBUG_VAR EXT_DEBUG_VAR +#else /* EXT_DEBUG_VAR */ +#define DEBUG_VAR 0 +#endif /* EXT_DEBUG_VAR */ +#endif /* DEBUG_VAR */ + +#define DEBUG_CONDITION (debug_all || DEBUG_VAR) +#define DDEBUG_CONDITION(l) (debug_all >= (l) || DEBUG_VAR >= (l)) +#define DPRINT(args) { if (DEBUG_CONDITION) printf args; } +#define DDPRINT(level, args) \ + { if (DDEBUG_CONDITION(level)) printf args; } +#define TRACE(args) DDPRINT(10, args) + +#else /* !DEBUG */ + +#define DEBUG_CONDITION 0 +#define DDEBUG_CONDITION(l) 0 +#define DPRINT(args) +#define DDPRINT(level, args) +#define TRACE(args) + +#endif diff -r 000000000000 -r 92745d501b9a include/FontBank.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/FontBank.h Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,53 @@ +/* $Id: FontBank.h,v 1.2 1994/05/12 09:13:24 ishisone Rel $ */ +/* + * Copyright (c) 1991, 1994 Software Research Associates, Inc. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Software Research Associates not be + * used in advertising or publicity pertaining to distribution of the + * software without specific, written prior permission. Software Research + * Associates makes no representations about the suitability of this software + * for any purpose. It is provided "as is" without express or implied + * warranty. + * + * Author: Makoto Ishisone, Software Research Associates, Inc., Japan + */ + +#ifndef _FontBank_h +#define _FontBank_h + +typedef struct _fb_rec_ *FontBank; /* opaque */ + +extern FontBank FontBankCreate( +#if NeedFunctionPrototypes + Display * /* dpy */, + char * /* language */ +#endif +); + +extern void FontBankDestroy( +#if NeedFunctionPrototypes + FontBank /* bank */ +#endif +); + +extern XFontStruct ** FontBankGet( +#if NeedFunctionPrototypes + FontBank /* bank */, + char * /* fontset_base_names */, + int * /* num_fontsp */ +#endif +); + +extern void FontBankFreeFonts( +#if NeedFunctionPrototypes + FontBank /* bank */, + XFontStruct ** /* fonts */, + int /* num_fonts */ +#endif +); + +#endif /* _FontBank_h */ diff -r 000000000000 -r 92745d501b9a include/ICLabel.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/ICLabel.h Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,47 @@ +/* $Id: ICLabel.h,v 1.3 1991/03/22 17:46:57 ishisone Rel $ */ +/* + * Copyright (c) 1990 Software Research Associates, Inc. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Software Research Associates not be + * used in advertising or publicity pertaining to distribution of the + * software without specific, written prior permission. Software Research + * Associates makes no representations about the suitability of this software + * for any purpose. It is provided "as is" without express or implied + * warranty. + * + * Author: Makoto Ishisone, Software Research Associates, Inc., Japan + */ + +#ifndef _ICLabel_h +#define _ICLabel_h + +/* ICLabel widget public header file */ +#include "ICtypes.h" + +#define XtNcursor "cursor" +#define XtCSpacing "Spacing" +#define XtNhorizontalSpacing "horizontalSpacing" +#define XtNverticalSpacing "verticalSpacing" + +typedef struct _ICLabelClassRec* ICLabelWidgetClass; +typedef struct _ICLabelRec* ICLabelWidget; + +extern WidgetClass icLabelWidgetClass; + +/* + * public function: + * void ICLRecomputeSize(Widget widget) + * recompute size and make resize request. + * useful when changing child (convDisplayObject) attributes + */ +extern void ICLRecomputeSize( +#if NeedFunctionPrototypes + Widget /* widget */ +#endif +); + +#endif diff -r 000000000000 -r 92745d501b9a include/ICLabelP.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/ICLabelP.h Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,56 @@ +/* $Id: ICLabelP.h,v 1.4 1991/03/22 17:46:42 ishisone Rel $ */ +/* + * Copyright (c) 1990 Software Research Associates, Inc. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Software Research Associates not be + * used in advertising or publicity pertaining to distribution of the + * software without specific, written prior permission. Software Research + * Associates makes no representations about the suitability of this software + * for any purpose. It is provided "as is" without express or implied + * warranty. + * + * Author: Makoto Ishisone, Software Research Associates, Inc., Japan + */ + +#ifndef _ICLabelP_h +#define _ICLabelP_h + +#include +#include "ICLabel.h" + +typedef struct { + int empty; +} ICLabelClassPart; + +typedef struct _ICLabelClassRec { + CoreClassPart core_class; + CompositeClassPart composite_class; + ICLabelClassPart iclabel_class; +} ICLabelClassRec; + +extern ICLabelClassRec icLabelClassRec; + +typedef struct { + /* resources */ + Dimension hspace; + Dimension vspace; + ICString *label; + XtJustify justify; + Cursor cursor; + /* private state */ + Widget displayobj; + Dimension width; + Dimension fontheight; +} ICLabelPart; + +typedef struct _ICLabelRec { + CorePart core; + CompositePart composite; + ICLabelPart iclabel; +} ICLabelRec; + +#endif diff -r 000000000000 -r 92745d501b9a include/ICtypes.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/ICtypes.h Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,64 @@ +/* $Id: ICtypes.h,v 1.3 1999/01/07 03:06:22 ishisone Exp $ */ +/* + * Copyright (c) 1990 Software Research Associates, Inc. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Software Research Associates not be + * used in advertising or publicity pertaining to distribution of the + * software without specific, written prior permission. Software Research + * Associates makes no representations about the suitability of this software + * for any purpose. It is provided "as is" without express or implied + * warranty. + * + * Author: Makoto Ishisone, Software Research Associates, Inc., Japan + */ + +#ifndef _ICtypes_h +#define _ICtypes_h + +/* + * $B%"%H%j%S%e!<%H$D$-J8;zNs7?(B -- ICString + * nbytes $B$O!"(BICString $B$N(B data $B$N%G!<%?7?$rCN$i$J$/$F$b(B + * $B%3%T!<$G$-$k$h$&$K$D$1$F$"$k(B + */ + +typedef struct { + unsigned short nchars; /* data $B$NJ8;z?t(B */ + unsigned short nbytes; /* data $B$N%P%$%H?t(B */ + char *data; /* $BJ8;zNs(B ($B%(%s%3!<%G%#%s%0$O%/%i%90MB8(B) */ + int attr; /* $BJ8;zNs$NB0@-(B */ +} ICString; + + +/* + * ICString.attr $B$NCM(B + */ + +/* 1. $BJ8;zNs$,JQ49ESCf$N%F%-%9%H%;%0%a%s%H$rI=$7$F$$$k;~(B + * ($B2<5-$NCM$N(B bitwise-or) + */ +#define ICAttrNotConverted 0 /* $B$^$@JQ49$5$l$F$$$J$$%;%0%a%s%H(B */ +#define ICAttrConverted 1 /* $BJQ49:Q$_%;%0%a%s%H(B */ +#define ICAttrCurrentSegment 2 /* $B8=:_CmL\$7$F$$$k%;%0%a%s%H(B */ +#define ICAttrCurrentSubSegment 4 /* $B8=:_CmL\$7$F$$$k%5%V%;%0%a%s%H(B */ + +/* 2. $B$=$l0J30!"Nc$($P8=:_$NF~NO%b!<%I$J$I$rI=$7$F$$$k;~(B ($B>o$K$3$NCM(B) */ +#define ICAttrNormalString (-1) + + +/* $BA*Br$N0\F0J}8~(B */ +#define ICMoveLeft 1 +#define ICMoveRight 2 +#define ICMoveUp 3 +#define ICMoveDown 4 +#define ICMoveLeftMost 5 +#define ICMoveRightMost 6 +#define ICMoveNextPage 7 +#define ICMovePrevPage 8 +#define ICMoveFirst 9 +#define ICMoveLast 10 + +#endif /* _ICtypes_h */ diff -r 000000000000 -r 92745d501b9a include/IMProto.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/IMProto.h Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,70 @@ +/* $Id: IMProto.h,v 1.3 1994/05/31 07:54:39 ishisone Rel $ */ +/* + * Copyright (c) 1994 Software Research Associates, Inc. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Software Research Associates not be + * used in advertising or publicity pertaining to distribution of the + * software without specific, written prior permission. Software Research + * Associates makes no representations about the suitability of this software + * for any purpose. It is provided "as is" without express or implied + * warranty. + * + * Author: Makoto Ishisone, Software Research Associates, Inc., Japan + */ + +#ifndef _IMProtocol_h +#define _IMProtocol_h + +#include "ICtypes.h" + +/* + IMProtocol new resources: + + name class type default access + ---------------------------------------------------------------------------- + serverName ServerName String "kinput2" CG + language Language String NULL CG + locales Locales String NULL CG + inputObjectClass Class Pointer NULL CG + displayObjectClass Class Pointer NULL CG + defaultFontList FontList String NULL CG + foreground Foreground Pixel DefaultForeground + CG + transports Transports String "tcp,unix,x" CG +*/ + +#define XtNserverName "serverName" +#define XtCServerName "ServerName" + +#define XtNlanguage "language" +#define XtCLanguage "Language" + +#define XtNlocales "locales" +#define XtCLocales "Locales" + +#define XtNinputObjectClass "inputObjectClass" +#define XtNdisplayObjectClass "displayObjectClass" +#define XtCClass "Class" + +#define XtNdefaultFontList "defaultFontList" +#define XtCFontList "FontList" + +#define XtNconversionStartKeys "conversionStartKeys" +#define XtCConversionStartKeys "ConversionStartKeys" + +#define XtNstatusWidth "statusWidth" +#define XtCStatusWidth "StatusWidth" + +#define XtNtransports "transports" +#define XtCTransports "Transports" + +typedef struct _IMProtocolClassRec* IMProtocolWidgetClass; +typedef struct _IMProtocolRec* IMProtocolWidget; + +extern WidgetClass imProtocolWidgetClass; + +#endif /* _IMProtocol_h */ diff -r 000000000000 -r 92745d501b9a include/IMProtoP.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/IMProtoP.h Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,115 @@ +/* $Id: IMProtoP.h,v 1.6 1995/05/17 09:15:02 ishisone Exp $ */ +/* + * Copyright (c) 1994 Software Research Associates, Inc. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Software Research Associates not be + * used in advertising or publicity pertaining to distribution of the + * software without specific, written prior permission. Software Research + * Associates makes no representations about the suitability of this software + * for any purpose. It is provided "as is" without express or implied + * warranty. + * + * Author: Makoto Ishisone, Software Research Associates, Inc., Japan + */ + +#ifndef _IMProtocolP_h +#define _IMProtocolP_h + +#include "IMProto.h" +#include "im.h" +#include "FontBank.h" +#include "ConvCtrl.h" +#include "IOECall.h" + +typedef struct { + int dummy; +} IMProtocolClassPart; + +typedef struct _IMProtocolClassRec { + CoreClassPart core_class; + IMProtocolClassPart imProtocol_class; +} IMProtocolClassRec; + +extern IMProtocolClassRec imProtocolClassRec; + + +typedef struct { + /* resources */ + String server_name; + + /* + * It is not difficult to handle multiple languages in a + * protocol widget, but we've determined not to do so + * for simplicity (at least for now). + */ + String language; + String locales; + WidgetClass input_object_class; + WidgetClass display_object_class; + String default_fontlist; /* default font list to be used */ + + Pixel foreground; /* default fg pixel */ + String conversion_start_keys; /* conversion start/end keys */ + Dimension status_width; /* default width of status area */ + String transport_list; /* transports to be used */ + + /* private state */ + Boolean use_tcp_transport; + Boolean use_unix_transport; + Boolean use_x_transport; + int tcp_port; /* TCP port number */ + int tcp_sock; /* TCP socket descriptor */ + XtInputId tcp_id; + String unix_path; /* Unix domain socket pathname */ + int unix_sock; /* Unix domain socket descriptor */ + XtInputId unix_id; + Boolean no_more_connections; + IMConnection *connection_list; + IMConverter converter; + long last_imid; + long last_icid; + IMIM *im_hash[IM_HASH_SIZE]; + IMIC *ic_hash[IC_HASH_SIZE]; + IMConnection *scheduler_queue; + IMTriggerKey *trigger_keys; /* conversion start trigger keys */ + int num_trigger_keys; + FontBank font_bank; + XFontStruct **default_fonts; + int num_default_fonts; + XIOEHandle ioe_handle; + + /* atoms */ + Atom xim_xconnect; /* "_XIM_XCONNECT" */ + Atom xim_protocol; /* "_XIM_PROTOCOL" */ + Atom xim_moredata; /* "_XIM_MOREDATA" */ + Atom ctext_atom; /* "COMPOUND_TEXT" */ + Atom locales_atom; /* "LOCALES" */ + Atom transport_atom; /* "TRANSPORT" */ + Atom ki2comm_atom; /* "_KINPUT2_COMM" */ + Atom server_atom; /* atom stored in XIM_SERVERS prop. */ +} IMProtocolPart; + +typedef struct _IMProtocolRec { + CorePart core; + IMProtocolPart imp; +} IMProtocolRec; + +#define IM_IMHASH(w) (((IMProtocolWidget)(w))->imp.im_hash) +#define IM_ICHASH(w) (((IMProtocolWidget)(w))->imp.ic_hash) +#define IM_LASTIMID(w) (((IMProtocolWidget)(w))->imp.last_imid) +#define IM_LASTICID(w) (((IMProtocolWidget)(w))->imp.last_icid) +#define IM_QUEUE(w) (((IMProtocolWidget)(w))->imp.scheduler_queue) + +#define ATOM_CTEXT(w) (((IMProtocolWidget)(w))->imp.ctext_atom) +#define ATOM_LOCALES(w) (((IMProtocolWidget)(w))->imp.locales_atom) +#define ATOM_TRANSPORT(w) (((IMProtocolWidget)(w))->imp.transport_atom) +#define ATOM_KI2COMM(w) (((IMProtocolWidget)(w))->imp.ki2comm_atom) +#define ATOM_XCONNECT(w) (((IMProtocolWidget)(w))->imp.xim_xconnect) +#define ATOM_PROTOCOL(w) (((IMProtocolWidget)(w))->imp.xim_protocol) +#define ATOM_MOREDATA(w) (((IMProtocolWidget)(w))->imp.xim_moredata) + +#endif diff -r 000000000000 -r 92745d501b9a include/IOECall.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/IOECall.h Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,50 @@ +/* $Id: IOECall.h,v 1.1 1994/11/22 01:13:01 ishisone Exp $ */ +/* + * Copyright (C) 1994 Software Research Associates, Inc. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Software Research Associates not be + * used in advertising or publicity pertaining to distribution of the + * software without specific, written prior permission. Software Research + * Associates makes no representations about the suitability of this software + * for any purpose. It is provided "as is" without express or implied + * warranty. + * + * Author: Makoto Ishisone, Software Research Associates, Inc., Japan + */ + +#ifndef _IOECall_h +#define _IOECall_h + +/* + * X I/O error callback handler + */ + +/* + * XIOEHandle -- an opaque type used as a 'handle' in this library + */ +typedef struct ioe_cb_desc_ *XIOEHandle; + +extern void XIOEInit( +#if NeedFunctionPrototypes + void +#endif +); + +extern XIOEHandle XIOESet( +#if NeedFunctionPrototypes + void (*)(), + XPointer +#endif +); + +extern void XIOEUnset( +#if NeedFunctionPrototypes + XIOEHandle handle +#endif +); + +#endif /* _IOECall_h */ diff -r 000000000000 -r 92745d501b9a include/InputConv.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/InputConv.h Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,411 @@ +/* $Id: InputConv.h,v 1.20 1999/01/13 08:41:54 ishisone Exp $ */ +/* + * Copyright (c) 1990 Software Research Associates, Inc. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Software Research Associates not be + * used in advertising or publicity pertaining to distribution of the + * software without specific, written prior permission. Software Research + * Associates makes no representations about the suitability of this software + * for any purpose. It is provided "as is" without express or implied + * warranty. + * + * Author: Makoto Ishisone, Software Research Associates, Inc., Japan + */ + +#ifndef _InputConv_h +#define _InputConv_h + +#include "ICtypes.h" +#include + +/* + InputConv new resources: + + name class type default access + ---------------------------------------------------------------------------- + selectionControl Callback Callback NULL C + textChangeNotify Callback Callback NULL C + modeChangeNotify Callback Callback NULL C + endNotify Callback Callback NULL C + fixNotify Callback Callback NULL C + auxControl Callback Callback NULL C + displayObjectClass Class Pointer NULL CG +*/ + +/* new resources */ +#define XtNselectionControl "selectionControl" +#define XtNtextChangeNotify "textChangeNotify" +#define XtNmodeChangeNotify "modeChangeNotify" +#define XtNfixNotify "fixNotify" +#define XtNendNotify "endNotify" +#define XtNauxControl "auxControl" +#define XtNdisplayObjectClass "displayObjectClass" +#define XtCClass "Class" + +typedef struct _InputConvClassRec *InputConvObjectClass; +typedef struct _InputConvRec *InputConvObject; + +extern WidgetClass inputConvObjectClass; + + +/* + * XtNselectionControl $B%3!<%k%P%C%/$N(B call_data $B9=B$BN(B + */ + +typedef struct { + + int command; /* $B%3%^%s%I(B + * Start: $B9`L\A*Br3+;O%j%/%(%9%H(B + * End: $B9`L\A*Br=*N;%j%/%(%9%H(B + * Set: $B%+%l%s%H9`L\@_Dj%j%/%(%9%H(B + * Move: $B%+%l%s%H9`L\0\F0%j%/%(%9%H(B + * Get: $B%+%l%s%H9`L\l9g$O%3!<%k%P%C%/4X?tB&$G8=:_$N(B + * $B%+%l%s%H8uJdHV9f$rBeF~$9$k(B + * ($B%+%l%s%H$,$J$1$l$P(B -1 $B$rBeF~$9$k(B) + */ + + int dir; /* ICSelectionMove $B$N;~(B */ + } u; + +} ICSelectionControlArg; + + +/* + * ICCompareSegment $B$GJV$5$l$kCM(B + */ + +#define ICSame 0 /* $BA4$/F1$8(B */ +#define ICAttrChanged 1 /* attr $B$N$_0[$J$k(B */ +#define ICStringChanged 2 /* data $B$,0[$J$k(B */ + /* attribute $B$H(B data $B$H$b$K0[$J$l$P(B + * (ICAttrChanged | ICStringChanged) $B$,JV$k(B + */ + + +/* + * XtNauxControl $B%3!<%k%P%C%/$N(B call_data $B9=B$BN(B + */ + +typedef struct { + + int command; /* $B%3%^%s%I(B + * Start: $B9`L\A*Br3+;O%j%/%(%9%H(B + * End: $B9`L\A*Br=*N;%j%/%(%9%H(B + * Change: $B%+%l%s%H9`L\@_Dj%j%/%(%9%H(B + */ +#define ICAuxStart 1 +#define ICAuxEnd 2 +#define ICAuxChange 3 + +} ICAuxControlArg; + +/* + * GetTriggerKeys $B$K;H$o$l$k(B keys $B$N$?$a$N9=B$BN(B + */ + +typedef struct { + KeySym keysym; + long modifiers; + long modifiermask; +} ICTriggerKey; + +/* + * $B%Q%V%j%C%/%$%s%?!<%U%'%$%9%U%!%s%/%7%g%s(B + */ + +/* + * Boolean ICSupportMultipleObjects(WidgetClass objectclass) + * $B;XDj$5$l$?%*%V%8%'%/%H%/%i%9$+$iJ#?t$N%$%s%9%?%s%9$,@8@.$G$-$k$+(B + * $B$I$&$+$rJV$9(B + * True $B$J$i2DG=$@$7!"(BFalse $B$J$i$?$@0l$D$N%$%s%9%?%s%9$7$+@8@.$G$-$J$$(B + * $B0z?t$,(B Widget $B$G$O$J$/(B WidgetClass $B$G$"$k$3$H$KCm0U(B + */ +extern Boolean ICSupportMultipleObjects( +#if NeedFunctionPrototypes + WidgetClass /* objectclass */ +#endif +); + +/* + * int ICInputEvent(Widget ojbect, XEvent *event) + * $B%*%V%8%'%/%H$KF~NO%$%Y%s%H$rM?$($k(B + * $B%(%i!<$,5/$3$C$?>l9g$O(B -1 $B$,JV$k(B + * $B%(%i!<$G$J$1$l$P(B 0 $B$+(B 1 $B$,JV$k(B + * $BDL>o$O(B 0 $B$,JV$k$,!"$b$7(B 1 $B$,JV$C$F$-$?$i!"$=$l$O$G$-$k$J$i$P(B + * $B$=$NF~NO%$%Y%s%H$r%"%W%j%1!<%7%g%s$KAw$jJV$7$?J}$,$h$$$H$$$&(B + * $B%*%V%8%'%/%H$+$i$N%R%s%H$G$"$k(B + */ +extern int ICInputEvent( +#if NeedFunctionPrototypes + Widget /* object */, + XEvent * /* event */ +#endif +); + +/* + * ICString *ICGetMode(Widget object) + * $B8=:_$NF~NO%b!<%I$r(B ICString $B$N7A<0$GJV$9(B + * $B%G!<%?$O(B InputConvObject $B$N$b$N$J$N$G>!!!/$J$/$H$b(B COMPOUND_TEXT $B%(%s%3!<%G%#%s%0$O(B + * $B%5%]!<%H$7$J$/$F$O$J$i$J$$(B + * format $B$K$O(B 8/16/32 $B$N$$$:$l$+!"(Blength $B$O(B string $B$N%(%l%a%s%H?t$,(B + * $B$=$l$>$lJV$5$l$k(B + * $B%F%-%9%H$NNN0h$O(B malloc $B$5$l$F$$$k$N$G$3$N4X?t$r8F$s$@B&$G(B + * free $B$7$J$1$l$P$J$i$J$$(B + * $BJQ49%F%-%9%H$,$J$$;~$d%(%i!<$N>l9g$K$O(B -1$B!"$=$&$G$J$1$l$P(B 0 $B$,(B + * $B4X?t$NCM$H$7$FJV$5$l$k(B + * + * $B$3$N4X?t$O(B XtNfixNotify $B%3!<%k%P%C%/$NCf$G;H$o$l$k$3$H$rA[Dj$7$F$$$k(B + */ +extern int ICGetConvertedString( +#if NeedFunctionPrototypes + Widget /* object */, + Atom * /* encoding */, + int * /* format */, + int * /* length */, + XtPointer * /* string */ +#endif +); + +/* + * int ICClearConversion(Widget object) + * $B6/@)E*$K(B ($BJQ49ESCf$G$"$C$F$b(B) $BJQ49%F%-%9%H$r%/%j%"$9$k(B + * $B2?$i$+$NM}M3$G%/%j%"$G$-$J$+$C$?;~$K$O(B -1$B!"$=$&$G$J$1$l$P(B 0 $B$,(B + * $BJV$5$l$k(B + */ +extern int ICClearConversion( +#if NeedFunctionPrototypes + Widget /* object */ +#endif +); + +/* + * ICString *ICGetAuxSegments(Widget object, Cardinal *n, + * Cardinal *ns, Cardinal *nc) + * AUX$BNN0h$N%;%0%a%s%H$rJV$9!#(B + * $B;XDj$5$l$?%;%0%a%s%H$,B8:_$7$J$1$l$P(B NULL $B$rJV$9(B + * $B%G!<%?$O(B InputConvObject $B$N$b$N$J$N$G>!$l(B n, ns, nc $B$K$FJV$k!#(B + */ +extern ICString *ICGetAuxSegments( +#if NeedFunctionPrototypes + Widget /* object */, + Cardinal * /* n */, + Cardinal * /* ns */, + Cardinal * /* nc */ +#endif +); + +/* + * int ICRegisterTriggerKeys(Widget object) + * $B;XDj$5$l$?%*%V%8%'%/%H$NF|K\8lF~NO3+;O%-!<$r/$J$/$H$b(B COMPOUND_TEXT $B%(%s%3!<%G%#%s%0$O(B + * $B%5%]!<%H$7$J$/$F$O$J$i$J$$(B + * format $B$K$O(B 8/16/32 $B$N$$$:$l$+!"(Blength $B$O(B string $B$N%(%l%a%s%H?t$,(B + * $B$=$l$>$lJV$5$l$k(B + * $B%F%-%9%H$NNN0h$O(B malloc $B$5$l$F$$$k$N$G$3$N4X?t$r8F$s$@B&$G(B + * free $B$7$J$1$l$P$J$i$J$$(B + * $BJQ49%F%-%9%H$,$J$$;~$d%(%i!<$N>l9g$K$O(B -1$B!"$=$&$G$J$1$l$P(B 0 $B$,(B + * $B4X?t$NCM$H$7$FJV$5$l$k(B + */ +extern int ICGetPreeditString( +#if NeedFunctionPrototypes + Widget /* object */, + int /* segn */, + int /* offset */, + Atom * /* encoding */, + int * /* format */, + int * /* length */, + XtPointer * /* string */ +#endif +); + +/* + * int ICGetStatusString(Widget object, Atom *encoding, int *format, + * int *length, XtPointer *string, int *nchars) + * $B%9%F!<%?%9%F%-%9%H$r(B string $B$KJV$9(B + * encoding $B$K$O!"%F%-%9%H$N%(%s%3!<%G%#%s%0$r;XDj$7$F$*$/(B + * $B$?$@$7$3$l$OC1$J$k%j%/%(%9%H$G$"$C$F!"JQ49%*%V%8%'%/%H$O(B + * $BJL$N%(%s%3!<%G%#%s%0$GJV$7$F$b$h$$(B + * encoding $B$K$O/$J$/$H$b(B COMPOUND_TEXT $B%(%s%3!<%G%#%s%0$O(B + * $B%5%]!<%H$7$J$/$F$O$J$i$J$$(B + * format $B$K$O(B 8/16/32 $B$N$$$:$l$+!"(Blength $B$O(B string $B$N%(%l%a%s%H?t$,(B + * $B$=$l$>$lJV$5$l$k(B + * nchars $B$K$O(B string $B$NJ8;z?t$,JV$5$l$k(B + * $B%F%-%9%H$NNN0h$O(B malloc $B$5$l$F$$$k$N$G$3$N4X?t$r8F$s$@B&$G(B + * free $B$7$J$1$l$P$J$i$J$$(B + * $BJQ49%F%-%9%H$,$J$$;~$d%(%i!<$N>l9g$K$O(B -1$B!"$=$&$G$J$1$l$P(B 0 $B$,(B + * $B4X?t$NCM$H$7$FJV$5$l$k(B + */ +extern int ICGetStatusString( +#if NeedFunctionPrototypes + Widget /* object */, + Atom * /* encoding */, + int * /* format */, + int * /* length */, + XtPointer * /* string */, + int * /* nchars */ +#endif +); + +#endif /* _InputConv_h */ diff -r 000000000000 -r 92745d501b9a include/InputConvP.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/InputConvP.h Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,85 @@ +/* $Id: InputConvP.h,v 1.15 1999/01/13 08:41:55 ishisone Exp $ */ +/* + * Copyright (c) 1990 Software Research Associates, Inc. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Software Research Associates not be + * used in advertising or publicity pertaining to distribution of the + * software without specific, written prior permission. Software Research + * Associates makes no representations about the suitability of this software + * for any purpose. It is provided "as is" without express or implied + * warranty. + * + * Author: Makoto Ishisone, Software Research Associates, Inc., Japan + */ + +#ifndef _InputConvP_h +#define _InputConvP_h + +#include +#include "InputConv.h" + +typedef struct { + int (*InputEvent)(); + ICString *(*GetMode)(); + int (*CursorPos)(); + int (*NumSegments)(); + ICString *(*GetSegment)(); + int (*CompareSegment)(); + ICString *(*GetItemList)(); + int (*SelectItem)(); + int (*GetConvertedString)(); + int (*ClearConversion)(); + ICString *(*GetAuxSegments)(); + Boolean SupportMultipleObjects; + int (*GetTriggerKeys)(); + int num_trigger_keys; + ICTriggerKey *trigger_keys; + int (*GetPreeditString)(); + int (*GetStatusString)(); + /* private state */ + Boolean NoMoreObjects; +} InputConvClassPart; + +typedef struct _InputConvClassRec { + ObjectClassPart object_class; + InputConvClassPart inputConv_class; +} InputConvClassRec; + +extern InputConvClassRec inputConvClassRec; + +typedef struct { + /* resources */ + XtCallbackList selectioncallback; + XtCallbackList modechangecallback; + XtCallbackList textchangecallback; + XtCallbackList endcallback; + XtCallbackList fixcallback; + XtCallbackList auxcallback; + WidgetClass displayObjClass; +} InputConvPart; + +typedef struct _InputConvRec { + ObjectPart object; + InputConvPart inputConv; +} InputConvRec; + +#define XtInheritInputEvent (int(*)())_XtInherit +#define XtInheritGetMode (ICString*(*)())_XtInherit +#define XtInheritCursorPos (int(*)())_XtInherit +#define XtInheritNumSegments (int(*)())_XtInherit +#define XtInheritGetSegment (ICString*(*)())_XtInherit +#define XtInheritCompareSegment (int(*)())_XtInherit +#define XtInheritGetItemList (ICString*(*)())_XtInherit +#define XtInheritSelectItem (int(*)())_XtInherit +#define XtInheritGetConvertedString (int(*)())_XtInherit +#define XtInheritClearConversion (int(*)())_XtInherit +#define XtInheritGetAuxSegments (ICString*(*)())_XtInherit +#define XtInheritGetTriggerKeys (int(*)())_XtInherit +#define XtInheritGetPreeditString (int(*)())_XtInherit +#define XtInheritGetStatusString (int(*)())_XtInherit + +#endif diff -r 000000000000 -r 92745d501b9a include/KIFontSet.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/KIFontSet.h Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,63 @@ +/* $Id: KIFontSet.h,v 1.2 1991/09/23 04:10:34 ishisone Rel $ */ +/* + * Copyright (c) 1991 Software Research Associates, Inc. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Software Research Associates not be + * used in advertising or publicity pertaining to distribution of the + * software without specific, written prior permission. Software Research + * Associates makes no representations about the suitability of this software + * for any purpose. It is provided "as is" without express or implied + * warranty. + * + * Author: Makoto Ishisone, Software Research Associates, Inc., Japan + */ + +#ifndef _KIFontSet_h +#define _KIFontSet_h + +typedef struct { + String pattern; /* must be in lower case + * ex) "iso8859-*", "jisx0208.1983-0" + */ + XtPointer cldata; +} KICharSetSpec; + +typedef struct { + KICharSetSpec *specs; /* first spec is the most preferrable + * charset. + */ + Cardinal num_specs; +} KICharSet; + +typedef struct { + XFontStruct *font; + String charset; /* matched KICharSetSpec's pattern */ + XtPointer cldata; /* matched KICharSetSpec's cldata */ +} KICharSetFont; + +/* + * int ExtractFontsFromFontSet(Display *dpy, String fontset_string, + * KICharSet *charsets, KICharSetFont *result, + * Cardinal num_charsets) + * + * gets appropriate fonts for each of give charsets from fontset_string. + * fontset_string is similar to base_font_name_list in XCreateFontSet(). + * returns number of matched fonts. + * + * note) use CachedFreeFont() to free fonts obtained by this function. + */ +extern int ExtractFontsFromFontSet( +#if NeedFunctionPrototypes + Display * /* dpy */, + String /* fontset_string */, + KICharSet * /* charsets */, + KICharSetFont * /* result (must be allocated by the caller) */, + Cardinal /* num_charsets */ +#endif +); + +#endif diff -r 000000000000 -r 92745d501b9a include/KIProto.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/KIProto.h Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,55 @@ +/* $Id: KIProto.h,v 1.3 1991/08/22 06:01:57 ishisone Rel $ */ +/* + * Copyright (c) 1990 Software Research Associates, Inc. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Software Research Associates not be + * used in advertising or publicity pertaining to distribution of the + * software without specific, written prior permission. Software Research + * Associates makes no representations about the suitability of this software + * for any purpose. It is provided "as is" without express or implied + * warranty. + * + * Author: Makoto Ishisone, Software Research Associates, Inc., Japan + */ + +#ifndef _KinputProtocol_h +#define _KinputProtocol_h + +#include "ICtypes.h" + +/* + KinputProtocol new resources: + + name class type default access + ---------------------------------------------------------------------------- + language Language String NULL CG + inputObjectClass Class Pointer NULL CG + displayObjectClass Class Pointer NULL CG + backwardCompatible BackwardCompatible Boolean False CG + xlcConversionStartKey XlcConversionStartKey String NULL CG + +*/ + +#define XtNlanguage "language" +#define XtCLanguage "Language" + +#define XtNinputObjectClass "inputObjectClass" +#define XtNdisplayObjectClass "displayObjectClass" +#define XtCClass "Class" + +#define XtNbackwardCompatible "backwardCompatible" +#define XtCBackwardCompatible "BackwardCompatible" + +#define XtNxlcConversionStartKey "xlcConversionStartKey" +#define XtCXlcConversionStartKey "XlcConversionStartKey" + +typedef struct _KinputProtocolClassRec* KinputProtocolWidgetClass; +typedef struct _KinputProtocolRec* KinputProtocolWidget; + +extern WidgetClass kinputProtocolWidgetClass; + +#endif diff -r 000000000000 -r 92745d501b9a include/KIProtoP.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/KIProtoP.h Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,121 @@ +/* $Id: KIProtoP.h,v 1.12 1993/09/16 02:45:33 ishisone Rel $ */ +/* + * Copyright (c) 1991 Software Research Associates, Inc. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Software Research Associates not be + * used in advertising or publicity pertaining to distribution of the + * software without specific, written prior permission. Software Research + * Associates makes no representations about the suitability of this software + * for any purpose. It is provided "as is" without express or implied + * warranty. + * + * Author: Makoto Ishisone, Software Research Associates, Inc., Japan + */ + +#ifndef _KinputProtocolP_h +#define _KinputProtocolP_h + +#include "KIProto.h" +#include "ConvCtrl.h" + +typedef struct { + int empty; +} KinputProtocolClassPart; + +typedef struct _KinputProtocolClassRec { + CoreClassPart core_class; + KinputProtocolClassPart kinputprotocol_class; +} KinputProtocolClassRec; + +extern KinputProtocolClassRec kinputProtocolClassRec; + +typedef enum { + unresolved_protocol, + kinput1_protocol, /* old kinput protocol */ + kinput2_protocol, /* new kinput protocol */ + jinput_protocol, /* Matsushita's jinput protocol */ + xlc_protocol /* Sony's xlc protocol */ +} KinputProtocol; + +typedef enum { + offthespot_style, + overthespot_style, + separate_style +} ConversionStyle; + +typedef struct { + int state; +#define JINPUT_MULTI_COLOR 1 +#define JINPUT_MULTI_FONT 2 + Position rawspotx, rawspoty; +} JinputData; + +typedef struct _convclient_ { + KinputProtocol protocol; + ConversionStyle style; + Widget protocolwidget; /* protocol widget */ + Widget conversion; /* conversion widget */ + Window reqwin; /* conversion requestor window */ + Atom selection; /* selection atom */ + Atom target; /* type of converted string */ + Atom property; /* property to store converted string */ + EventSelectMethod esm; + unsigned long attrmask; + unsigned long validattrmask; + ConversionAttributes attrs; + XtPointer data; /* protocol dependent data */ + void (*start_proc)();/* protocol dependent proc. routines */ + void (*detach_proc)(); + void (*fix_proc)(); + void (*end_proc)(); + void (*free_resources)(); + struct _convclient_ *next; +} ConvClient; + +typedef struct { + /* resources */ + String language; + WidgetClass inputObjClass; + WidgetClass displayObjClass; + Boolean backward_compatible; + String xlcstartkey; + /* private state */ + ConvClient *clients; + Position defaultascent; + /* atoms -- common */ + Atom convAtom; /* __CONVERSION */ + Atom oldConvAtom; /* _CONVERSION (obsolete) */ + Atom ctextAtom; /* COMPOUND_TEXT */ + Atom convStringAtom; /* CONVERSION_STRING */ + Atom convNotifyAtom; /* CONVERSION_NOTIFY */ + Atom convEndAtom; /* CONVERSION_END */ + /* atoms -- kinput2 specific */ +#ifdef notdef + Atom convInitializeAtom; /* CONVERSION_INITIALIZE */ +#endif + Atom convAttributeAtom; /* CONVERSION_ATTRIBUTE */ + /* atoms -- jinput specific (whew!) */ + Atom convVersionAtom; /* CONVERSION_VERSION */ + Atom convInitialTypeAtom; /* CONVERSION_INITIAL_TYPE */ + Atom convOpenNotifyAtom; /* CONVERSION_OPEN_NOTIFY */ + Atom convXYRequestAtom; /* CONVERSION_XY_REQUEST */ + Atom convFontsRequestAtom; /* CONVERSION_FONTS_REQUEST */ + Atom convColorRequestAtom; /* CONVERSION_COLOR_REQUEST */ + Atom convCloseNotifyAtom; /* CONVERSION_CLOSE_NOTIFY */ + /* atoms -- xlc specific */ + Atom xlcStatusAtom; /* _XLC_STATUS */ + Atom xlcOnTheSpotAtom; /* _XLC_ON_THE_SPOT */ + Atom xlcBcModifierAtom; /* _XLC_BC_MODIFIER */ + Atom xlcBcKeycodeAtom; /* _XLC_BC_KEYCODE */ +} KinputProtocolPart; + +typedef struct _KinputProtocolRec { + CorePart core; + KinputProtocolPart kinput; +} KinputProtocolRec; + +#endif diff -r 000000000000 -r 92745d501b9a include/LocalAlloc.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/LocalAlloc.h Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,24 @@ +/* $Id: LocalAlloc.h,v 1.2 1991/01/22 11:53:28 ishisone Rel $ */ + +/* + * (fast) local allocator macro + * + * if you use gcc, don't worry. + * if you use cc and have reliable alloca(), define HAVE_ALLOCA. + */ + +#ifdef __GNUC__ +#define LOCAL_ALLOC(x) __builtin_alloca((unsigned int)(x)) +#define LOCAL_FREE(x) +#else +#ifdef HAVE_ALLOCA +#ifdef INCLUDE_ALLOCA_H +#include +#endif +#define LOCAL_ALLOC(x) alloca((unsigned int)(x)) +#define LOCAL_FREE(x) +#else +#define LOCAL_ALLOC(x) malloc((unsigned int)(x)) +#define LOCAL_FREE(x) free((char *)(x)) +#endif /* HAVE_ALLOCA */ +#endif /* __GNUC__ */ diff -r 000000000000 -r 92745d501b9a include/MyDispatch.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/MyDispatch.h Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,39 @@ +/* $Id: MyDispatch.h,v 1.3 1991/02/06 10:54:31 ishisone Rel $ */ + +/* + * a simple event dispatch library for non-widget windows + */ + +extern void MyDispatchEvent( +#if NeedFunctionPrototypes + XEvent * /* event */ +#endif +); + +extern void MyAddEventHandler( +#if NeedFunctionPrototypes + Display * /* dpy */, + Window /* window */, + int /* type */, + unsigned long /* mask */, + void (*)() /* func */, + XtPointer /* data */ +#endif +); + +extern void MyRemoveEventHandler( +#if NeedFunctionPrototypes + Display * /* dpy */, + Window /* window */, + int /* type */, + void (*)() /* func */, + XtPointer /* data */ +#endif +); + +extern void MyRemoveAllEventHandler( +#if NeedFunctionPrototypes + Display * /* dpy */, + Window /* window */ +#endif +); diff -r 000000000000 -r 92745d501b9a include/OffConv.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/OffConv.h Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,38 @@ +/* $Id: OffConv.h,v 1.4 1991/08/20 09:22:15 ishisone Rel $ */ +/* + * Copyright (c) 1990 Software Research Associates, Inc. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Software Research Associates not be + * used in advertising or publicity pertaining to distribution of the + * software without specific, written prior permission. Software Research + * Associates makes no representations about the suitability of this software + * for any purpose. It is provided "as is" without express or implied + * warranty. + * + * Author: Makoto Ishisone, Software Research Associates, Inc., Japan + */ + +#ifndef _OffTheSpotConversion_h +#define _OffTheSpotConversion_h + +/* OffTheSpotConversion widget public header file */ + +#include "ConvCtrl.h" + +#define XtNleftMargin "leftMargin" +#define XtNrightMargin "rightMargin" + +typedef struct _OffTheSpotConversionClassRec* OffTheSpotConversionWidgetClass; +typedef struct _OffTheSpotConversionRec* OffTheSpotConversionWidget; + +typedef struct _SeparateConversionClassRec* SeparateConversionWidgetClass; +typedef struct _SeparateConversionRec* SeparateConversionWidget; + +extern WidgetClass offTheSpotConversionWidgetClass; +extern WidgetClass separateConversionWidgetClass; + +#endif diff -r 000000000000 -r 92745d501b9a include/OffConvP.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/OffConvP.h Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,144 @@ +/* $Id: OffConvP.h,v 1.7 1999/01/07 03:06:23 ishisone Exp $ */ +/* + * Copyright (c) 1990 Software Research Associates, Inc. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Software Research Associates not be + * used in advertising or publicity pertaining to distribution of the + * software without specific, written prior permission. Software Research + * Associates makes no representations about the suitability of this software + * for any purpose. It is provided "as is" without express or implied + * warranty. + * + * Author: Makoto Ishisone, Software Research Associates, Inc., Japan + */ + +#ifndef _OffTheSpotConversionP_h +#define _OffTheSpotConversionP_h + +#include "ConvCtrlP.h" +#include "OffConv.h" + +typedef struct { + Position x, y; +} DisplayLocation; + +typedef struct _fragment_ { + unsigned short from; /* $BI=<(3+;OJ8;z0LCV(B */ + unsigned short nchars; /* $BI=<(J8;z?t(B */ + XRectangle region; /* $BI=<(NN0h(B */ + struct _fragment_ *next; /* $B$7$,I,MW$JJ8;z$N3+;O0LCV(B + * (-1 $B$J$i=q$-D>$9I,MW$J$7(B) + */ + DisplayFragment *fragments; /* $BI=<(%U%i%0%a%s%H(B */ +} DisplaySegment; + + +/* + * off-the-spot conversion control widget data structure + */ + +typedef struct { + int empty; +} OffTheSpotConversionClassPart; + +typedef struct _OffTheSpotConversionClassRec { + CoreClassPart core_class; + CompositeClassPart composite_class; + ShellClassPart shell_class; + WMShellClassPart wm_shell_class; + VendorShellClassPart vendor_shell_class; + TransientShellClassPart transient_shell_class; + ConversionControlClassPart conversionControl_class; + OffTheSpotConversionClassPart offTheSpotConversion_class; +} OffTheSpotConversionClassRec; + +extern OffTheSpotConversionClassRec offTheSpotConversionClassRec; + +typedef struct { + /* resources */ + Dimension leftmargin; + Dimension rightmargin; + /* private state */ + Widget displayobj; + Widget selectionshell; + Widget selectionwidget; + Widget formwidget; + Widget modewidget; + Widget modeshell; + Widget modedisplayobj; + Widget canvaswidget; + DisplayLocation cursorlocation; + Boolean cursorvisible; + DisplaySegment *dispsegments; + Cardinal numsegments; + Cardinal dispsegmentsize; + ICString *candlist; + Cardinal numcands; + Boolean selectionpoppedup; + Dimension lineheight; + Position ascent; + Widget auxshell; + Widget auxwidget; + Boolean auxpoppedup; +} OffTheSpotConversionPart; + +typedef struct _OffTheSpotConversionRec { + CorePart core; + CompositePart composite; + ShellPart shell; + WMShellPart wm; + VendorShellPart vendor; + TransientShellPart transient; + ConversionControlPart ccontrol; + OffTheSpotConversionPart offthespot; +} OffTheSpotConversionRec; + + +/* + * separate conversion control widget data structure + */ + +typedef struct { + int empty; +} SeparateConversionClassPart; + +typedef struct _SeparateConversionClassRec { + CoreClassPart core_class; + CompositeClassPart composite_class; + ShellClassPart shell_class; + WMShellClassPart wm_shell_class; + VendorShellClassPart vendor_shell_class; + TransientShellClassPart transient_shell_class; + ConversionControlClassPart conversionControl_class; + OffTheSpotConversionClassPart offTheSpotConversion_class; + SeparateConversionClassPart separateConversion_class; +} SeparateConversionClassRec; + +extern SeparateConversionClassRec separateConversionClassRec; + +typedef struct { + Widget formwidget; +} SeparateConversionPart; + +typedef struct _SeparateConversionRec { + CorePart core; + CompositePart composite; + ShellPart shell; + WMShellPart wm; + VendorShellPart vendor; + TransientShellPart transient; + ConversionControlPart ccontrol; + OffTheSpotConversionPart offthespot; + SeparateConversionPart separate; +} SeparateConversionRec; + +#endif diff -r 000000000000 -r 92745d501b9a include/OnConv.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/OnConv.h Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,57 @@ +/* $Id: OnConv.h,v 10.6 1999/05/18 08:53:18 ishisone Exp $ */ +/* + * Copyright (c) 1990 Software Research Associates, Inc. + * Copyright (c) 1999 Kazuki YASUMATSU + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Software Research Associates not be + * used in adntising or publicity pertaining to distribution of the + * software without specific, written prior permission. Software Research + * Associates makes no representations about the suitability of this software + * for any purpose. It is provided "as is" without express or implied + * warranty. + * + * Author: Makoto Ishisone, Software Research Associates, Inc., Japan + * Author: Kazuki YASUMATSU (Kazuki.Yasumatsu@fujixerox.co.jp) + */ + + +#ifndef _OnTheSpotConversion_h +#define _OnTheSpotConversion_h + +/* OnTheSpotConversion widget public header file */ + +#include "ConvCtrl.h" + +#define XtNpreeditStartCallback "preeditStartCallback" +#define XtNpreeditDoneCallback "preeditDoneCallback" +#define XtNpreeditDrawCallback "preeditDrawCallback" +#define XtNpreeditCaretCallback "preeditCaretCallback" +#define XtNstatusStartCallback "statusStartCallback" +#define XtNstatusDoneCallback "statusDoneCallback" +#define XtNstatusDrawCallback "statusDrawCallback" +#define XtNfeedbackAttributes "feedbackAttributes" +#define XtCFeedbackAttributes "FeedbackAttributes" + +typedef struct { + int caret; /* cursor offset within pre-edit string */ + int chg_first; /* starting change position */ + int chg_length; /* length of the change in character count */ + Atom encoding; /* text encoding e.g. COMPOUND_TEXT */ + int format; /* text format (8/16/32) */ + int text_length; /* text length */ + XtPointer text; /* text data */ + int attrs_length; /* attributes length */ + unsigned long *attrs; /* attributes of the text */ +} OCCPreeditDrawArg; + +typedef struct _OnTheSpotConversionClassRec* OnTheSpotConversionWidgetClass; +typedef struct _OnTheSpotConversionRec* OnTheSpotConversionWidget; + +extern WidgetClass onTheSpotConversionWidgetClass; + +#endif + diff -r 000000000000 -r 92745d501b9a include/OnConvP.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/OnConvP.h Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,101 @@ +/* $Id: OnConvP.h,v 10.5 1999/05/18 08:53:19 ishisone Exp $ */ +/* + * Copyright (c) 1990 Software Research Associates, Inc. + * Copyright (c) 1999 Kazuki YASUMATSU + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Software Research Associates not be + * used in advertising or publicity pertaining to distribution of the + * software without specific, written prior permission. Software Research + * Associates makes no representations about the suitability of this software + * for any purpose. It is provided "as is" without express or implied + * warranty. + * + * Author: Makoto Ishisone, Software Research Associates, Inc., Japan + * Author: Kazuki YASUMATSU (Kazuki.Yasumatsu@fujixerox.co.jp) + */ + + +#ifndef _OnTheSpotConversionP_h +#define _OnTheSpotConversionP_h + +#include "ConvCtrlP.h" +#include "OnConv.h" + +#define XtRFeedbackAttributes "FeedbackAttributes" + +typedef struct { + ICString seg; /* $B%;%0%a%s%H(B */ +} DisplaySegment; + +typedef struct { + unsigned long feedbacks[4]; +#define FEEDBACK_NOCONV 0 /* for non-converted segment */ +#define FEEDBACK_CONV 1 /* converted but not current */ +#define FEEDBACK_CURRENT 2 /* converted and current */ +#define FEEDBACK_CURRENTSUB 3 /* converted and current subsegment */ +} FeedbackAttributes; + +/* + * on-the-spot conversion control widget data structure + */ + +typedef struct { + int empty; +} OnTheSpotConversionClassPart; + +typedef struct _OnTheSpotConversionClassRec { + CoreClassPart core_class; + CompositeClassPart composite_class; + ShellClassPart shell_class; + WMShellClassPart wm_shell_class; + VendorShellClassPart vendor_shell_class; + TransientShellClassPart transient_shell_class; + ConversionControlClassPart conversionControl_class; + OnTheSpotConversionClassPart onTheSpotConversion_class; +} OnTheSpotConversionClassRec; + +extern OnTheSpotConversionClassRec onTheSpotConversionClassRec; + +typedef struct { + /* resources */ + XtCallbackList preeditstartcallback; + XtCallbackList preeditdonecallback; + XtCallbackList preeditdrawcallback; + XtCallbackList preeditcaretcallback; + XtCallbackList statusstartcallback; + XtCallbackList statusdonecallback; + XtCallbackList statusdrawcallback; + FeedbackAttributes feedbackattrs; + /* private state */ + Widget selectionshell; + Widget selectionwidget; + Widget auxshell; + Widget auxwidget; + DisplaySegment *dispsegments; + Cardinal numsegments; + Cardinal dispsegmentsize; + ICString *candlist; + Cardinal numcands; + Boolean selectionpoppedup; + Boolean auxpoppedup; + Cardinal lastcaret; + Boolean fixnotify; +} OnTheSpotConversionPart; + +typedef struct _OnTheSpotConversionRec { + CorePart core; + CompositePart composite; + ShellPart shell; + WMShellPart wm; + VendorShellPart vendor; + TransientShellPart transient; + ConversionControlPart ccontrol; + OnTheSpotConversionPart onthespot; +} OnTheSpotConversionRec; + +#endif + diff -r 000000000000 -r 92745d501b9a include/OverConv.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/OverConv.h Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,57 @@ +/* $Id: OverConv.h,v 1.8 1999/02/04 08:59:14 ishisone Exp $ */ +/* + * Copyright (c) 1990 Software Research Associates, Inc. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Software Research Associates not be + * used in advertising or publicity pertaining to distribution of the + * software without specific, written prior permission. Software Research + * Associates makes no representations about the suitability of this software + * for any purpose. It is provided "as is" without express or implied + * warranty. + * + * Author: Makoto Ishisone, Software Research Associates, Inc., Japan + */ + +#ifndef _OverTheSpotConversion_h +#define _OverTheSpotConversion_h + +/* OverTheSpotConversion widget public header file */ + +#include "ConvCtrl.h" + +#define XtNspotX "spotX" +#define XtNspotY "spotY" +#define XtNautoSpotForwarding "autoSpotForwarding" +#define XtCAutoSpotForwarding "AutoSpotForwarding" +#define XtNlineSpacing "lineSpacing" +#define XtCLineSpacing "LineSpacing" +#define XtNmodeLocation "modeLocation" +#define XtCModeLocation "ModeLocation" +#define XtNshrinkWindow "shrinkWindow" +#define XtCShrinkWindow "ShrinkWindow" +#define XtNignoreStatusAreaSpec "ignoreStatusAreaSpec" +#define XtCIgnoreStatusAreaSpec "IgnoreStatusAreaSpec" +#define XtNmodeBorderForeground "modeBorderForeground" +#define XtCModeBorderForeground "ModeBorderForeground" +#define XtNuseOverrideShellForMode "useOverrideShellForMode" +#define XtCUseOverrideShellForMode "UseOverrideShellForMode" + +typedef enum { + ModeTopLeft, /* top-left of the client window */ + ModeTopRight, /* top-right */ + ModeBottomLeft, /* bottom-left */ + ModeBottomRight, /* bottom-right */ + ModeTrackText, /* tracks text-in-conversion */ + ModeNone /* not displeyed */ +} ModeLocation; + +typedef struct _OverTheSpotConversionClassRec* OverTheSpotConversionWidgetClass; +typedef struct _OverTheSpotConversionRec* OverTheSpotConversionWidget; + +extern WidgetClass overTheSpotConversionWidgetClass; + +#endif diff -r 000000000000 -r 92745d501b9a include/OverConvP.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/OverConvP.h Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,143 @@ +/* $Id: OverConvP.h,v 1.18 1999/02/04 08:59:14 ishisone Exp $ */ +/* + * Copyright (c) 1990 Software Research Associates, Inc. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Software Research Associates not be + * used in advertising or publicity pertaining to distribution of the + * software without specific, written prior permission. Software Research + * Associates makes no representations about the suitability of this software + * for any purpose. It is provided "as is" without express or implied + * warranty. + * + * Author: Makoto Ishisone, Software Research Associates, Inc., Japan + */ + +#ifndef _OverTheSpotConversionP_h +#define _OverTheSpotConversionP_h + +#include "ConvCtrlP.h" +#include "OverConv.h" + +#define XtRModeLocation "ModeLocation" + +typedef struct _canvasrec_ { + Widget canvas; + Position x, y; + Position maxx, maxy; /* for canvas reconfiguration */ + Boolean shouldpopup; + Boolean poppedup; + struct _canvasrec_ *next; +} TextCanvas; + +typedef struct { + TextCanvas *canvas; + Position x, y; +} DisplayLocation; + +typedef struct _fragment_ { + unsigned short from; /* $BI=<(3+;OJ8;z0LCV(B */ + unsigned short nchars; /* $BI=<(J8;z?t(B */ + TextCanvas *canvas; /* $BI=<($9$k%-%c%s%P%9(B ($B?F(B widget $B$H$O8B$i$J$$(B) */ + XRectangle region; /* $BI=<(NN0h(B */ + struct _fragment_ *next; /* $B$7$,I,MW$JJ8;z$N3+;O0LCV(B + * (-1 $B$J$i=q$-D>$9I,MW$J$7(B) + */ + DisplayFragment *fragments; /* $BI=<(%U%i%0%a%s%H(B */ +} DisplaySegment; + + +/* + * over-the-spot conversion control widget data structure + */ + +typedef struct { + int empty; +} OverTheSpotConversionClassPart; + +typedef struct _OverTheSpotConversionClassRec { + CoreClassPart core_class; + CompositeClassPart composite_class; + ShellClassPart shell_class; + WMShellClassPart wm_shell_class; + VendorShellClassPart vendor_shell_class; + TransientShellClassPart transient_shell_class; + ConversionControlClassPart conversionControl_class; + OverTheSpotConversionClassPart overTheSpotConversion_class; +} OverTheSpotConversionClassRec; + +extern OverTheSpotConversionClassRec overTheSpotConversionClassRec; + +typedef struct { + /* resources */ + Position spotx, spoty; + Boolean spotforwarding; + Dimension linespacing; + XRectangle clientarea; + ModeLocation modelocation; + Boolean shrinkwindow; + Boolean ignorestatusarea; + Boolean borderforeground; /* force the border color to be same + * as foreground color + */ + Boolean useoverride; /* use overrideShell widget for the + * mode displaying shell, instead + * of the default transient shell + */ + /* private state */ + Atom wm_state; /* WM_STATE atom */ + Widget displayobj; + Widget selectionshell; + Widget selectionwidget; + Widget selectiondisplayobj; + Widget auxshell; + Widget auxwidget; + Widget auxdisplayobj; + Widget modeshell; + Widget modewidget; + Widget modedisplayobj; + Boolean modelocationspecified; + Widget modeshell_fix, modewidget_fix, modedisplayobj_fix; + Widget modeshell_float, modewidget_float, modedisplayobj_float; + Colormap colormap; + Pixel background; + Cursor canvascursor; + Position focusoffsetx; + Position focusoffsety; + TextCanvas *canvaslist; + TextCanvas *overflowcanvas; + Position overflowoffset; + DisplayLocation cursorlocation; + Boolean cursorvisible; + DisplaySegment *dispsegments; + Cardinal numsegments; + Cardinal dispsegmentsize; + ICString *candlist; + Cardinal numcands; + Boolean selectionpoppedup; + Boolean auxpoppedup; + Position ascent; + Dimension lineheight; + Dimension saved_bw; +} OverTheSpotConversionPart; + +typedef struct _OverTheSpotConversionRec { + CorePart core; + CompositePart composite; + ShellPart shell; + WMShellPart wm; + VendorShellPart vendor; + TransientShellPart transient; + ConversionControlPart ccontrol; + OverTheSpotConversionPart overthespot; +} OverTheSpotConversionRec; + +#endif diff -r 000000000000 -r 92745d501b9a include/ParseKey.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/ParseKey.h Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,31 @@ +/* $Id: ParseKey.h,v 1.1 1994/05/16 05:42:45 ishisone Rel $ */ +/* + * Copyright (c) 1991, 1994 Software Research Associates, Inc. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Software Research Associates not be + * used in advertising or publicity pertaining to distribution of the + * software without specific, written prior permission. Software Research + * Associates makes no representations about the suitability of this software + * for any purpose. It is provided "as is" without express or implied + * warranty. + * + * Author: Makoto Ishisone, Software Research Associates, Inc., Japan + */ + +#ifndef _ParseKey_h +#define _ParseKey_h + +extern int ParseKeyEvent( +#if NeedFunctionPrototypes + String /* s */, + KeySym * /* keysymp */, + long * /* modp */, + long * /* chkmodp */ +#endif +); + +#endif /* _ParseKey_h */ diff -r 000000000000 -r 92745d501b9a include/Sj3.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/Sj3.h Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,97 @@ +/* $Id: Sj3.h,v 2.1 1992/06/09 03:55:37 nao Exp $ */ +/* + * Copyright (c) 1990 Software Research Associates, Inc. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Software Research Associates not be + * used in advertising or publicity pertaining to distribution of the + * software without specific, written prior permission. Software Research + * Associates makes no representations about the suitability of this software + * for any purpose. It is provided "as is" without express or implied + * warranty. + * + * Author: Makoto Ishisone, Software Research Associates, Inc., Japan + */ + +/* + * Copyright 1991 Sony Corporation + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Sony not be used in advertising or + * publicity pertaining to distribution of the software without specific, + * written prior permission. Sony makes no representations about the + * suitability of this software for any purpose. It is provided "as is" + * without express or implied warranty. + * + * SONY DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL SONY + * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ +/* + * Author: Naoshi Suzuki, SONY Corporation. (nao@sm.sony.co.jp) + */ + +#ifndef _Sj3_h +#define _Sj3_h + +#include "InputConv.h" + +/* + Sj3 new resources: + + name class type default access + ---------------------------------------------------------------------------- + sj3serv Sj3serv String *1 CG + sj3serv2 Sj3serv2 String *2 CG + sj3user Sj3user String *3 CG + rkfile Rkfile String *4 CG + sbfile Sbfile String *5 CG + rcfile Rcfile String *6 CG + hkfile Hkfile String *7 CG + zhfile Zhfile String *8 CG + + note: *1) if not specified, use value of an environment variable "SJ3SERV" + if not specified an environment "SJ3SERV", read from sjrc file + *2) if not specified, use value of an environment variable "SJ3SERV2" + if not specified an environment "SJ3SERV2", read from sjrc file + *3) if not specified, use value of login name + *4) if not specified, use value of an environment variable "SJRK" + *5) if not specified, use value of an environment variable "SJSB" + *6) if not specified, use value of an environment variable "SJRC" + *7) if not specified, use value of an environment variable "SJHK" + *8) if not specified, use value of an environment variable "SJZH" +*/ + +#define XtNsj3serv "sj3serv" +#define XtCSj3serv "Sj3serv" +#define XtNsj3serv2 "sj3serv2" +#define XtCSj3serv2 "Sj3serv2" +#define XtNsj3user "sj3user" +#define XtCSj3user "Sj3user" +#define XtNrcfile "rcfile" +#define XtCRcfile "Rcfile" +#define XtNsbfile "sbfile" +#define XtCSbfile "Sbfile" +#define XtNrkfile "rkfile" +#define XtCRkfile "Rkfile" +#define XtNhkfile "hkfile" +#define XtCHkfile "Hkfile" +#define XtNzhfile "zhfile" +#define XtCZhfile "Zhfile" + +typedef struct _Sj3ClassRec *Sj3ObjectClass; +typedef struct _Sj3Rec *Sj3Object; + +extern WidgetClass sj3ObjectClass; + +#endif /* _Sj3_h */ + diff -r 000000000000 -r 92745d501b9a include/Sj3P.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/Sj3P.h Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,100 @@ +/* $Id: Sj3P.h,v 2.0 1992/02/09 17:56:19 nao Exp $ */ +/* + * Copyright (c) 1990 Software Research Associates, Inc. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Software Research Associates not be + * used in advertising or publicity pertaining to distribution of the + * software without specific, written prior permission. Software Research + * Associates makes no representations about the suitability of this software + * for any purpose. It is provided "as is" without express or implied + * warranty. + * + * Author: Makoto Ishisone, Software Research Associates, Inc., Japan + */ + +/* + * Copyright 1991 Sony Corporation + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Sony not be used in advertising or + * publicity pertaining to distribution of the software without specific, + * written prior permission. Sony makes no representations about the + * suitability of this software for any purpose. It is provided "as is" + * without express or implied warranty. + * + * SONY DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL SONY + * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ +/* + * Author: Naoshi Suzuki, SONY Corporation. (nao@sm.sony.co.jp) + */ + +#ifndef _Sj3P_h +#define _Sj3P_h + +#include "InputConvP.h" + +#include "Sj3.h" +#include "Xsj3clib.h" + +typedef struct { + int foo; +} Sj3ClassPart; + +typedef struct _Sj3ClassRec { + ObjectClassPart object_class; + InputConvClassPart inputConv_class; + Sj3ClassPart sj3_class; +} Sj3ClassRec; + +typedef enum { + normal_state, + candidate_state, + symbol_state, + hinsi_state +} Sj3State; + +typedef struct { + + /* resources */ + String sj3serv; + String sj3serv2; + String sj3user; + String rcfile; + String rkfile; + String hkfile; + String zhfile; + String sbfile; + + /* private data */ + Xsj3cBuf sj3buf; + Sj3State state; + ICString *candlist; + int candlistsize; + int numcand; + int curcand; + ICString *symbollist; + int cursymbol; + ICString *hinsilist; + int curhinsi; + Boolean selectionending; +} Sj3Part; + +typedef struct _Sj3Rec { + ObjectPart object; + InputConvPart inputConv; + Sj3Part sj3; +} Sj3Rec; + +#endif diff -r 000000000000 -r 92745d501b9a include/WStr.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/WStr.h Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,81 @@ +/* + * WStr.h -- header file for Wide-Character String Library + */ + +/* + * Copyright (c) 1989 Software Research Associates, Inc. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Software Research Associates not be + * used in advertising or publicity pertaining to distribution of the + * software without specific, written prior permission. Software Research + * Associates makes no representations about the suitability of this software + * for any purpose. It is provided "as is" without express or implied + * warranty. + * + * Author: Makoto Ishisone, Software Research Associates, Inc., Japan + * ishisone@sra.co.jp + */ + +/* $Id: WStr.h,v 2.1 1991/09/23 05:32:48 ishisone Rel $ */ + +#ifndef _WStr_h +#define _WStr_h + +#ifndef WCHAR_DEFINED +#define WCHAR_DEFINED +typedef unsigned short wchar; +#endif + +/* for backward compatibility... */ +#define convWStoLatin1 convJWStoLatin1 +#define convLatin1toWS convLatin1toJWS +#define convWStoJIS convJWStoJIS +#define convJIStoWS convJIStoJWS +#define convWStoEUC convJWStoEUC +#define convEUCtoWS convEUCtoJWS +#define convWStoSJIS convJWStoSJIS +#define convSJIStoWS convSJIStoJWS + +#if __STDC__ == 1 +extern int convJWStoLatin1(wchar *, unsigned char *); +extern int convLatin1toJWS(unsigned char *, wchar *); +extern int convJWStoJIS(wchar *, unsigned char *); +extern int convJIStoJWS(unsigned char *, wchar *); +extern int convJWStoEUC(wchar *, unsigned char *); +extern int convEUCtoJWS(unsigned char *, wchar *); +extern int convJWStoSJIS(wchar *, unsigned char *); +extern int convSJIStoJWS(unsigned char *, wchar *); +extern wchar *wstrcat(wchar *, wchar *); +extern wchar *wstrncat(wchar *, wchar *, int); +extern int wstrcmp(wchar *, wchar *); +extern int wstrncmp(wchar *, wchar *, int); +extern wchar *wstrcpy(wchar *, wchar *); +extern wchar *wstrncpy(wchar *, wchar *, int); +extern int wstrlen(wchar *); +extern wchar *windex(wchar *, wchar); +extern wchar *wrindex(wchar *, wchar); +#else +extern int convJWStoLatin1(); +extern int convLatin1toJWS(); +extern int convJWStoJIS(); +extern int convJIStoJWS(); +extern int convJWStoEUC(); +extern int convEUCtoJWS(); +extern int convJWStoSJIS(); +extern int convSJIStoJWS(); +extern wchar *wstrcat(); +extern wchar *wstrncat(); +extern int wstrcmp(); +extern int wstrncmp(); +extern wchar *wstrcpy(); +extern wchar *wstrncpy(); +extern int wstrlen(); +extern wchar *windex(); +extern wchar *wrindex(); +#endif + +#endif diff -r 000000000000 -r 92745d501b9a include/WcharDisp.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/WcharDisp.h Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,88 @@ +/* $Id: WcharDisp.h,v 1.4 1991/09/17 10:08:27 ishisone Rel $ */ +/* + * Copyright (c) 1990 Software Research Associates, Inc. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Software Research Associates not be + * used in advertising or publicity pertaining to distribution of the + * software without specific, written prior permission. Software Research + * Associates makes no representations about the suitability of this software + * for any purpose. It is provided "as is" without express or implied + * warranty. + * + * Author: Makoto Ishisone, Software Research Associates, Inc., Japan + */ + +#ifndef _WcharDisplay_h +#define _WcharDisplay_h + +/* WcharDisplay and JpWcharDisplay object public header file */ + +/* + WcharDisplay new resources: + + name class type default access + ---------------------------------------------------------------------------- + fontG0 Font FontStruct XtDefaultFont CSG + fontG1 Font FontStruct NULL CSG + fontG2 Font FontStruct NULL CSG + fontG3 Font FontStruct NULL CSG + fontMapping FontMapping FontMappng GL/GL/GL/GL CSG + + + JpWcharDisplay new resources: + + name class type default access note + ---------------------------------------------------------------------------- + font Font FontStruct *1 CSG *4 + kanjiFont KanjiFont FontStruct *2 CSG *5 + kanaFont KanaFont FontStruct *3 CSG *6 + + *1) "-Misc-Fixed-Medium-R-*--14-*-*-*-C-*-ISO8859-1" + *2) "-Misc-Fixed-Medium-R-*--14-*-*-*-C-*-JISX0208.1983-0" + *3) "-Misc-Fixed-Medium-R-*--14-*-*-*-C-*-JISX0201.1976-0" + + note: *4) this resource overrides superclass's fontG0 resource + *5) this resource overrides superclass's fontG1 resource + *6) this resource overrides superclass's fontG2 resource + + + JpWcharDisplay override resource: + + name class type default access note + ---------------------------------------------------------------------------- + fontMapping FontMapping FontMappng GL/GL/GR/GL CSG + +*/ + +#include "ConvDisp.h" +#include "WStr.h" + +#define XtNfontG0 "fontG0" +#define XtNfontG1 "fontG1" +#define XtNfontG2 "fontG2" +#define XtNfontG3 "fontG3" + +#define XtNfontMapping "fontMapping" +#define XtCFontMapping "FontMapping" + +#define XtNkanjiFont "kanjiFont" +#define XtCKanjiFont "KanjiFont" +#define XtNkanaFont "kanaFont" +#define XtCKanaFont "KanaFont" + +typedef struct _WcharDisplayClassRec *WcharDisplayObjectClass; +typedef struct _WcharDisplayRec *WcharDisplayObject; + +extern WidgetClass wcharDisplayObjectClass; + +typedef struct _JpWcharDisplayClassRec *JpWcharDisplayObjectClass; +typedef struct _JpWcharDisplayRec *JpWcharDisplayObject; + +extern WidgetClass jpWcharDisplayObjectClass; + +#endif /* _WcharDisplay_h */ + diff -r 000000000000 -r 92745d501b9a include/WcharDispP.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/WcharDispP.h Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,111 @@ +/* $Id: WcharDispP.h,v 1.6 1991/09/17 10:08:59 ishisone Rel $ */ +/* + * Copyright (c) 1990 Software Research Associates, Inc. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Software Research Associates not be + * used in advertising or publicity pertaining to distribution of the + * software without specific, written prior permission. Software Research + * Associates makes no representations about the suitability of this software + * for any purpose. It is provided "as is" without express or implied + * warranty. + * + * Author: Makoto Ishisone, Software Research Associates, Inc., Japan + */ + +#ifndef _WcharDisplayP_h +#define _WcharDisplayP_h + +#include "ConvDispP.h" +#include "WcharDisp.h" +#include "XWStr.h" + + +#define XtRFontMapping "FontMapping" + +typedef struct { + String charset; /* - ex) "JIX0208.1983-0" */ + int flag; +#define G0LCharSet (1<<0) /* font for G0 chars. use GL */ +#define G0RCharSet (1<<1) /* font for G0 chars. use GR */ +#define G1LCharSet (1<<2) +#define G1RCharSet (1<<3) +#define G2LCharSet (1<<4) +#define G2RCharSet (1<<5) +#define G3LCharSet (1<<6) +#define G3RCharSet (1<<7) +} WDCharSet; + +typedef struct { + WDCharSet *charset_specs; + Cardinal num_specs; +} WcharDisplayClassPart; + +typedef struct _WcharDisplayClassRec { + ObjectClassPart object_class; + ConvDisplayClassPart convDisplay_class; + WcharDisplayClassPart wcharDisplay_class; +} WcharDisplayClassRec; + +typedef struct { + Boolean grmapping[4]; +} FontMapping; + +typedef struct { + /* resources */ + XFontStruct *defaultfonts[4]; /* default fonts */ + FontMapping defaultmapping; /* use GR or not */ + /* private state */ + WDCharSet *charset_specs; /* same as the one in class structure. + * just for convenience + */ + FontSpec *fontspecs; + Cardinal num_specs; + XFontStruct *fonts[4]; /* fonts now in use */ + Boolean grmapping[4]; + Pixmap stipple; /* Stipple Bitmap */ + XWSGC gcset_normal; + XWSGC gcset_rev; + GC gc_normal; + GC gc_stipple; + int fontheight; + int ascent; +} WcharDisplayPart; + +typedef struct _WcharDisplayRec { + ObjectPart object; + ConvDisplayPart convDisplay; + WcharDisplayPart wcharDisplay; +} WcharDisplayRec; + +extern WcharDisplayClassRec wcharDisplayClassRec; + + +typedef struct { + int empry; +} JpWcharDisplayClassPart; + +typedef struct _JpWcharDisplayClassRec { + ObjectClassPart object_class; + ConvDisplayClassPart convDisplay_class; + WcharDisplayClassPart wcharDisplay_class; + JpWcharDisplayClassPart jpWcharDisplay_class; +} JpWcharDisplayClassRec; + +typedef struct { + int empty; +} JpWcharDisplayPart; + +typedef struct _JpWcharDisplayRec { + ObjectPart object; + ConvDisplayPart convDisplay; + WcharDisplayPart wcharDisplay; + JpWcharDisplayPart jpWcharDisplay; +} JpWcharDisplayRec; + +extern JpWcharDisplayClassRec jpWcharDisplayClassRec; + +#endif diff -r 000000000000 -r 92745d501b9a include/XIMProto.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/XIMProto.h Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,301 @@ +/* @(#)XIMProto.h 2.1 91/07/03 11:28:53 FUJITSU LIMITED. */ +/****************************************************************** + + Copyright 1991, by FUJITSU LIMITED. + Copyright 1991, by Sun Microsystems, Inc. + +Permission to use, copy, modify, distribute, and sell this software +and its documentation for any purpose is hereby granted without fee, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the name of FUJITSU LIMITED or Sun +Microsystems, Inc. not be used in advertising or publicity pertaining +to distribution of the software without specific, written prior +permission. FUJITSU LIMITED and Sun Microsystems, Inc. make no +representations about the suitability of this software for any +purpose. It is provided "as is" without express or implied warranty. + +FUJITSU LIMITED AND SUN MICROSYSTEMS, INC. DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL FUJITSU LIMITED AND SUN +MICROSYSTEMS, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR +CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF +USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. + +Author: Takashi Fujiwara FUJITSU LIMITED + fujiwara@a80.tech.yk.fujitsu.co.jp + Hideki Hiura (hhiura@Sun.COM) + Sun Microsystems, Inc. +******************************************************************/ + +/* Ximp Protocol Version */ +#define XIMP_PROTOCOL_VERSION "XIMP.3.5" + +/* Input Context ID */ +typedef unsigned long ICID; + +/* ClientMessage No. */ + +/* client <=> frontend */ +#define XIMP_KEYPRESS 1 + +/* client => frontend */ +/* Base Protocol */ +#define XIMP_CREATE 2 +#define XIMP_DESTROY 3 +#define XIMP_BEGIN 4 +#define XIMP_END 5 +#define XIMP_SETFOCUS 6 +#define XIMP_UNSETFOCUS 7 +#define XIMP_CHANGE 8 +#define XIMP_MOVE 9 +#define XIMP_RESET 10 +#define XIMP_SETVALUE 11 +#define XIMP_GETVALUE 12 + +/* Callback Protocol */ +#define XIMP_PREEDITSTART_RETURN 20 +#define XIMP_PREEDITCARET_RETURN 21 + +/* frontend => client */ +/* Base Protocol */ +#define XIMP_CREATE_RETURN 2 +#define XIMP_CONVERSION_BEGIN 30 +#define XIMP_PROCESS_BEGIN 30 +#define XIMP_CONVERSION_END 31 +#define XIMP_PROCESS_END 31 +#define XIMP_READPROP 32 +#define XIMP_GETVALUE_RETURN 33 +#define XIMP_RESET_RETURN 34 + +/* Callback Protocol */ +#define XIMP_GEOMETRY 40 +#define XIMP_PREEDITSTART 41 +#define XIMP_PREEDITDONE 42 +#define XIMP_PREEDITDRAW 43 +#define XIMP_PREEDITDRAW_CM 44 +#define XIMP_PREEDITCARET 45 +#define XIMP_STATUSSTART 46 +#define XIMP_STATUSDONE 47 +#define XIMP_STATUSDRAW 48 +#define XIMP_STATUSDRAW_CM 49 + +/* Extension Protocol */ +#define XIMP_EXTENSION 90 + +/* frontend = ERROR => client */ +#define XIMP_ERROR 99 + +/* Error Notify from IM Server */ +/* Detail Error Number */ +#define XIMP_NoError 0 /* No Error */ +#define XIMP_BadAlloc 1 /* Memeory Alloc Fail */ +#define XIMP_BadStyle 2 /* Unspported Input Style */ +#define XIMP_BadClientWindow 3 /* Invalid Client Window */ +#define XIMP_BadFocusWindow 4 /* Invalid Focus Window */ +#define XIMP_BadArea 5 /* Invalid Area */ +#define XIMP_BadSpotLocation 6 /* SpotLocation Out Of Range */ +#define XIMP_BadColormap 7 /* Invalid Colormap ID */ +#define XIMP_BadAtom 8 /* Invalid Atom ID */ +#define XIMP_BadPixel 9 /* Invalid Pixel Value */ +#define XIMP_BadPixmap 10 /* Invalid Pixmap Value */ +#define XIMP_BadName 11 /* Invalid Font Name */ +#define XIMP_BadCursor 12 /* Invalid Cursor ID */ +#define XIMP_BadProtocol 13 /* Invalid Protocol ID */ +#define XIMP_BadProperty 14 /* Invalid Property Name */ +#define XIMP_BadPropertyType 15 /* Invalid Property Type */ + +/* Property Name */ +#define _XIMP_PROTOCOL "_XIMP_PROTOCOL" +#define _XIMP_BASE "_XIMP_" /* Root Window + * _XIP_ */ + +/* IMS Window Property Name */ +#define _XIMP_VERSION "_XIMP_VERSION" +#define _XIMP_STYLE "_XIMP_STYLE" +#define _XIMP_KEYS "_XIMP_KEYS" +#define _XIMP_SERVERNAME "_XIMP_SERVERNAME" +#define _XIMP_SERVERVERSION "_XIMP_SERVERVERSION" +#define _XIMP_EXTENSIONS "_XIMP_EXTENSIONS" +#define _XIMP_PREEDITMAXSIZE "_XIMP_PREEDITMAXSIZE" +#define _XIMP_VENDORNAME "_XIMP_VENDORNAME" + +/* Client Window Property Name */ +#define _XIMP_LIBVERSION "_XIMP_VERSION" +#define _XIMP_FOCUS "_XIMP_FOCUS" +#define _XIMP_PREEDIT "_XIMP_PREEDIT" +#define _XIMP_STATUS "_XIMP_STATUS" +#define _XIMP_PREEDITFONT "_XIMP_PREEDITFONT" +#define _XIMP_STATUSFONT "_XIMP_STATUSFONT" + +#define _XIMP_CTEXT "_XIMP_CTEXT" + +/* CallBack Property Name */ + +#define _XIMP_PREEDIT_DRAW_DATA "_XIMP_PREEDIT_DRAW_DATA" + +#define _XIMP_FEEDBACKS "_XIMP_FEEDBACKS" +#define _XIMP_PREEDITDRAWLENGTH "_XIMP_PREEDITDRAWLENGTH" +#define _XIMP_PREEDITDRAWSTRING "_XIMP_PREEDITDRAWSTRING" +#define _XIMP_PREEDITDRAWFEEDBACK "_XIMP_PREEDITDRAWFEEDBACK" + +/* CallBack Property Name / Type X11R5 */ +#define _XIMP_EXT_XIMP_CHOICE_START_REQ "_XIMP_EXT_XIMP_CHOICE_START_REQ" +#define _XIMP_EXT_XIMP_CHOICE_START_REP "_XIMP_EXT_XIMP_CHOICE_START_REP" +#define _XIMP_EXT_XIMP_CHOICE_DRAW_REQ "_XIMP_EXT_XIMP_CHOICE_DRAW_REQ" +#define _XIMP_EXT_XIMP_CHOICE_PROC_REQ "_XIMP_EXT_XIMP_CHOICE_PROC_REQ" +#define _XIMP_EXT_XIMP_CHOICE_PROC_REP "_XIMP_EXT_XIMP_CHOICE_PROC_REP" +#define _XIMP_EXT_XIMP_LOOKUPCHOICES "_XIMP_EXT_XIMP_LOOKUPCHOICES" + +/* Lookup choise REQ and REP X11R5 */ +#define LOOKUP_CHOICES_BEGIN 0 +#define LOOKUP_CHOICES_START_REQ 1 +#define LOOKUP_CHOICES_START_REP 2 +#define LOOKUP_CHOICES_PROCESS_REQ 3 +#define LOOKUP_CHOICES_PROCESS_REP 4 +#define LOOKUP_CHOICES_DRAW_REQ 5 +#define LOOKUP_CHOICES_DONE_REQ 6 + +/* mask (XIMP_CREATE, XIMP_SETVALUE, XIMP_GETVALUE) */ +#define XIMP_FOCUS_WIN_MASK (1L << 0) +#define XIMP_PRE_AREA_MASK (1L << 1) +#define XIMP_PRE_FG_MASK (1L << 2) +#define XIMP_PRE_BG_MASK (1L << 3) +#define XIMP_PRE_COLORMAP_MASK (1L << 4) +#define XIMP_PRE_BGPIXMAP_MASK (1L << 5) +#define XIMP_PRE_LINESP_MASK (1L << 6) +#define XIMP_PRE_CURSOR_MASK (1L << 7) +#define XIMP_PRE_AREANEED_MASK (1L << 8) +#define XIMP_PRE_SPOTL_MASK (1L << 9) +#define XIMP_STS_AREA_MASK (1L << 10) +#define XIMP_STS_FG_MASK (1L << 11) +#define XIMP_STS_BG_MASK (1L << 12) +#define XIMP_STS_COLORMAP_MASK (1L << 13) +#define XIMP_STS_BGPIXMAP_MASK (1L << 14) +#define XIMP_STS_LINESP_MASK (1L << 15) +#define XIMP_STS_CURSOR_MASK (1L << 16) +#define XIMP_STS_AREANEED_MASK (1L << 17) +#define XIMP_STS_WINDOW_MASK (1L << 18) +#define XIMP_PRE_FONT_MASK (1L << 19) +#define XIMP_STS_FONT_MASK (1L << 20) + +/* FRONTEND or BACKEND MODE */ +#define XIMP_FRONTEND 0 +#define XIMP_BACKEND 1 + +/** XIMP_PREEDITDRAW_CM status value + * post Ximp 3.4 protocol maybe compliant. + * XIMP status flag will may contain the supplementary infomations to + * reassemble the XIMPreeditDrawCallbackStruct. + * +-----------------------------------------+ + * 0 | XIMP_PREEDITDRAW_CM | + * +-----------------------------------------+ + * 4 | ICID | + * +-------------------+---------------------+ + * 8 |PreeditDrawCBStatus| caret | + * +-------------------+---------------------+ + * 12| chg_first | chg_length | + * +-------------------+---------------------+ + * 16| feedback | + * +-----------------------------------------+ + * PreeditDrawCBStatus: + * 0x0001 no_text: if 1, string == NULL (no following client message.) + * 0x0002 no_feedback: if 1 feedback == NULL + * 0x0004 feedbacks_via_property: if 1 , feedback field is property atom# + **/ + +#define XIMP_PDCBSTATUS_NOTEXT 0x0001 +#define XIMP_PDCBSTATUS_NOFEEDBACK 0x0002 +#define XIMP_PDCBSTATUS_FEEDBACKS_VIA_PROP 0x0004 + +/* _XIMP_KEYS struct */ + +typedef struct { + unsigned long modifier; + unsigned long modifier_mask; + KeySym keysym; +} Ximp_Key; + +typedef struct { + unsigned short count_keys; + Ximp_Key *keys_list; +} Ximp_KeyList; + +typedef struct _Ximp_Area { + long x; + long y; + long width; + long height; +} Ximp_AreaRec; + +typedef struct _Ximp_Point { + long x; + long y; +} Ximp_PointRec; + +typedef struct _Ximp_Size { + long width; + long height; +} Ximp_SizeRec; + +/* kana-kanji conversion window attributes */ + +#define XIMP_PREEDIT_MAX_LONG 14 +#define XIMP_PREEDIT_MAX_CHAR 56 + +typedef struct _Ximp_Preedit { + Ximp_AreaRec Area; + unsigned long Foreground; + unsigned long Background; + Colormap Colormap; + Pixmap Bg_Pixmap; + long LineSpacing; + Cursor Cursor; + Ximp_SizeRec AreaNeeded; + Ximp_PointRec SpotLocation; +} Ximp_PreeditPropRec; + +#define XIMP_STATUS_MAX_LONG 13 +#define XIMP_STATUS_MAX_CHAR 52 + +typedef struct _Ximp_Status { + Ximp_AreaRec Area; + unsigned long Foreground; + unsigned long Background; + Colormap Colormap; + Pixmap Bg_Pixmap; + long LineSpacing; + Cursor Cursor; + Ximp_SizeRec AreaNeeded; + Window window; +} Ximp_StatusPropRec; + +/* for CallBack */ +typedef struct _Ximp_PreeditDrawDataPropRec { + long caret; + long chg_first; + long chg_length; +} Ximp_PreeditDrawDataPropRec, *Ximp_PreeditDrawDataProp; + +/* for Commit, PreEditDraw, StatusDraw 03/07/12 X11R5 */ +typedef struct _Ximp_CommitPropRec { + unsigned long icid; + char size; + char ctext[11]; +} Ximp_CommitPropRec, Ximp_PreEditDrawCallbackPropRec, + Ximp_StatusDrawCallbackPropRec; + +/* for PreEditDraw 03/07/16 X11R5 */ +typedef struct { + short chg_first; + short chg_length; +} Ximp_slong; + +typedef union { + Ximp_slong slong; + long l; +} Ximp_uslong; + + diff -r 000000000000 -r 92745d501b9a include/XWStr.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/XWStr.h Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,80 @@ +/* + * XWStr.h -- header file for X Wide-Character String Library + */ + +/* + * Copyright (c) 1989 Software Research Associates, Inc. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Software Research Associates not be + * used in advertising or publicity pertaining to distribution of the + * software without specific, written prior permission. Software Research + * Associates makes no representations about the suitability of this software + * for any purpose. It is provided "as is" without express or implied + * warranty. + * + * Author: Makoto Ishisone, Software Research Associates, Inc., Japan + * ishisone@sra.co.jp + */ + +/* $Id: XWStr.h,v 2.2 1991/09/23 05:33:08 ishisone Rel $ */ + +#ifndef _XWStr_h +#define _XWStr_h + +#include "WStr.h" + +typedef struct { + GC gc; + XFontStruct *font; + int flag; +} FontEnt; + +typedef struct { + FontEnt fe[4]; +} XWSGCSet; + +typedef XWSGCSet *XWSGC; + +/* XWSGCSet.flag */ +#define TWOB 1 /* 2-byte character set */ +#define FONTQUERY 2 /* XQueryFont()'ed by this library */ +#define GCCREAT 4 /* XtGetGC()'ed by this library */ +#define GRMAPPING 8 /* use GR */ + +#define GSET(c) ((c) & 0x8000 ? ((c) & 0x80 ? 1 : 3) : ((c) & 0x80 ? 2 : 0)) + +#if __STDC__ == 1 +/* function prototype */ +extern XWSGC XWSSetGCSet(Display *, GC, GC, GC, GC); +#ifdef _XtIntrinsic_h +extern XWSGC XtWSGetGCSet(Widget, unsigned long, XGCValues *, + XFontStruct *, XFontStruct *, + XFontStruct *, XFontStruct *); +extern void XtWSReleaseGCSet(Widget, XWSGC); +#endif +extern void XWSSetMapping(XWSGC, int, int, int, int); +extern void XtWSDestroyGCSet(XWSGC); +extern int XWSDrawString(Display *, Drawable, XWSGC, int, int, wchar *, int); +extern int XWSDrawImageString(Display *, Drawable, XWSGC, + int, int, wchar *, int); +extern void XWSFontHeight(XWSGC, wchar *, int, int *, int *); +extern int XWSTextWidth(XWSGC, wchar *, int); +extern void XWSTextExtents(XWSGC, wchar *, int, int *, int *, XCharStruct *); +#else +extern XWSGC XWSSetGCSet(); +extern XWSGC XtWSGetGCSet(); +extern void XtWSDestroyGCSet(); +extern void XtWSReleaseGCSet(); +extern void XWSSetMapping(); +extern int XWSDrawString(); +extern int XWSDrawImageString(); +extern void XWSFontHeight(); +extern int XWSTextWidth(); +extern void XWSTextExtents(); +#endif + +#endif diff -r 000000000000 -r 92745d501b9a include/Xatoklib.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/Xatoklib.h Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,282 @@ +/* + * Copyright 1999 Justsystem Corporation, Japan. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, + * provided that the above copyright notice appear in all copies and that + * both that copyright notice and this permission notice appear in + * supporting documentation, and that the name of Justsystem Corporation + * not be used in advertising or publicity pertaining to distribution + * of the software without specific, written prior permission. Justsystem + * Corporation makes no representations about the suitability of this + * software for any purpose. It is provided "as is" without express + * or implied warranty. + * + * Author: Atsushi Irisawa + */ + +#ifndef _xatoklib_h_ +#define _xatoklib_h_ + +#include +#include +#include +#include + +/* #include /* for BUFSIZ? */ +#ifdef BUFSIZ +#undef BUFSIZ +#endif +#define BUFSIZ 1024 + +/* #define CAND_PAGE */ +#ifdef CAND_PAGE +#undef CAND_PAGE +#endif + +#define CAND_ROWS (9) +#define CAND_COLS (1) +#include "WStr.h" + +typedef struct { + int length; + int size; + wchar *string; + int offset; +} _XatokSegment; + +typedef enum { + OP_NONE = 0, + OP_NEXT, + OP_PREV, + OP_FIRST, + OP_LAST, + OP_SELECT, + OP_CANCEL, + OP_SPEC +} _opType; + +typedef struct _menuItem MenuItem; +typedef struct _menu MenuAux; +typedef struct _menuItem { + WORD key; + int mode; + _opType op; + MenuAux *child; + char *numStr; + char *itemStr; +} menuItem; + +typedef struct _menu { + int mode; + int cur; + int (*startProc)(); + int (*defaultProc)(); + int (*endProc)(); + int (*stringProc) (); + char *str; + MenuAux *parent; + menuItem *items; + int nitems; +} menuAux; + +typedef enum { + M_NOKEYCONV = 0, /* $B%-!<%9%k!<(B */ + M_KEYCONV = (1L<<0), /* $BJQ49Cf(B */ + M_AUX = (1L<<1), /* AUX WINDOW $BC18lEPO?(B */ + M_CAND = (1L<<2), /* $B8uJdI=<(Cf(B */ + M_SYSLINE = (1L<<3), /* $B%7%9%F%`9T(B */ + M_WDEL = (1L<<4) /* $BC18l:o=|(B */ +} opMode; + +typedef enum { + W_WORD = (1L<<0), /* $BC18l(B */ + W_YOMI = (1L<<1), /* $B$h$_F~NOCf(B */ + W_HINSHI = (1L<<2), /* $BIJ;lA*BrCf(B */ + W_YORN = (1L<<3), /* $B=hM}3NG'(B */ + W_RESULT = (1L<<4) /* $B7k2LI=<((B */ +} wordMode; + +typedef enum { + M_TOP, /* AUX $B%H%C%W%a%K%e!<(B */ + M_WORDREG, /* $BC18lEPO?(B */ + M_CODE, /* AUX CODE $B%a%K%e!<(B */ + M_CODESJ, /* $B%3!<%IF~NO(B SJIS */ + M_CODEEUC, /* $B%3!<%IF~NO(B EUC */ + M_CODEJIS, /* $B%3!<%IF~NO(B JIS */ + M_CODEKUTEN, /* $B%3!<%IF~NO6hE@(B */ + M_KIGOU, /* AUX $B5-9fF~NO%a%K%e!<(B */ + M_NKIGOU, /* 10 */ + M_SKIGOU, + M_DICUTIL, /* AUX $B<-=q%a%K%e!<(B */ + M_WORD, /* AUX $BC18lEPO?(B */ + M_WORDR, + M_WORDD +} menuMode; + +typedef struct { + WCHAR name[64]; + int length; + WORD modeKANDSP; /* IME_PRV_SETKANDSP 1 - 4 + 1 : $BJ?2>L>(B + 2 : $BA43Q%+%?%+%J(B + 3 : $BA43QL5JQ49(B + 4 : $BH>3Q%+%?%+%J(B + 5 : $BH>3QL5JQ49(B + */ + WORD modeHEN; /* IME_PRV_SETHENMODE + 0 : $BO"J8@a(B + 1 : $BJ#J8@a(B + 2 : $B<+F0(B + */ + WORD modeGAKU; /* IME_PRV_GAKMODE + 0 : $B3X=,(BOFF + 1 : $B3X=,(BON + 2 : $B%a%b%j!<3X=,(B + */ + WORD modeKOTE; /* IME_SETKOTEMODE + 0 : $B8GDjF~NO2r=|(B + 1 : $B$R$i$,$J8GDj(B + 2 : $BA43Q%+%?%+%J8GDj(B + 3 : $BA43QL5JQ498GDj(B + 4 : $BH>3Q%+%?%+%J8GDj(B + 5 : $BH>3QL5JQ498GDj(B + */ + WORD modeOKURI; /* IME_PRV_SETOKURIMODE + 0 : $BK\B'(B + 1 : $BAw$k(B + 2 : $B>J$/(B + 3 : $BA4$F(B + */ + WORD modeROT; /* IME_PRV_SETROTMODEF + 1 : $B4A;zF~NO(B + 2 : $BH>3QF~NO(B + 3 : $B%3!<%IF~NO(B + 4 : $B5-9fF~NO(B + */ + /*int changes;*/ +} _XatokMode; + +#define WORD_HYOKI_MAX 64 +#define WORD_YOMI_MAX 32 + +/* #define NBR_OF_PART (3) */ +#define ATOK_NSEG (3) + +typedef struct { + /* $B%5!<%P$H$N@\B3>pJs(B */ + int sock; /* $B%5!<%P(B */ + int clntid; /* $B%;%C%7%g%s(B */ + int ctxtid; /* ID */ + /* $B%;%0%a%s%H$N4IM}(B */ + _XatokSegment segments[ATOK_NSEG+3]; /* $BL$3NDjJ8;zNs$N%;%0%a%s%H(B */ + int nbr_of_seg; /* $B;HMQ$7$F$$$k%;%0%a%s%H?t(B */ + int cur_seg; /* $B8=:_$N%;%0%a%s%H(B */ + int offset; + + /* $B8=:_$NF~NO%b!<%I$N4IM}(B */ + _XatokMode mode; /* $B%b!<%II=<(J8;zNs(B */ + opMode convStatus; /* M_XXXX $B$r;2>H(B */ + opMode oldStatus; /* M_XXXX $B$r;2>H(B */ + int candStatus; /* 0 : + 1 : $B8uJdI=<(3+;O(B + 2 : $B8uJdI=<(Cf(B + */ + menuAux *menuAux; + menuAux *curAux; + int menuStatus; + + wchar wbuf[BUFSIZ*4]; /* $B3NDjJ8;zNsMQ$N%P%C%U%!(B */ + char wrbuf[BUFSIZ*4]; /* $B3NDjJ8;zNsFI$_MQ$N%P%C%U%!(B */ + int wlen; /* $B3NDjJ8;zNs$ND9$5(B */ + + /* $BJQ49CfJ8;zNsI=<(MQ%G!<%?NN0h(B */ + wchar echoStr[BUFSIZ*2]; /* $BJQ49CfMQJ8;zNs(B */ + int echoLen; /* $BJQ49CfJ8;zNs$ND9$5(B */ + int revPos; /* $BH?E>$r3+;O$9$k%]%8%7%g%s(B */ + int revLen; /* $BH?E>J8;zNs$ND9$5(B */ + + /* AUX $B%&%#%s%I%&$NI=<(J8;zNs$N%G!<%?NN0h(B */ + wchar aux_echoStr[BUFSIZ*2]; + int aux_echoLen; + int aux_revPos; + int aux_revLen; /* $BH?E>J8;zNs$ND9$5(B */ + int aux_isopened; + + /* + * $BC18lEPO?$N$?$a$N%G!<%?(B + * $BC18l(B $BFI$_!"I=5-!"IJ;l>pJs!"IJ;lAm?t!"<-=q>pJs(B + */ + int wordStatus; + wchar word_str[66+1]; + wchar word_yomi[66+1]; + int word_strLen; + int word_yomiLen; + wordMode word_mode; /* 0 : $BI=5-F~NOCf(B + 1 : $BFI$_F~NOCf(B + 2 : $BIJ;lA*BrCf(B + 3 : $B<-=qA*BrCf(B + */ + int word_hinshi; + int hinsiNum; + ATOKDEHINSTR *hinsiPtr; + int dicNum; + char **dicPtr; + + /* $B8uJdJ8;zNs$NNN0h(B */ + int kohoNum; /* $B8uJd$N?t(B */ + int kohoNum2; + int kohoPos; /* $BA*Br$5$l$F$$$k8uJdHV9f(B */ + int kohoSize; /* $B8uJd%G!<%?MQ%P%C%U%!%5%$%:(B */ + int kohoStrLen; /* $Be(B */ + XKEY_DOWN = (1L<<6), /* $B2<(B */ + XKEY_FIRST = (1L<<7), /* $B@hF,(B */ + XKEY_LAST = (1L<<8), /* $B:G8e(B */ + XKEY_PREVP = (1L<<9), /* $BA0%Z!<%8(B */ + XKEY_NEXTP = (1L<<10), /* $B */ + Atom selAtom2; /* _XIMP_@. */ + Atom ctextAtom; /* COMPOUND_TEXT */ + Atom ximpVersionAtom; /* _XIMP_VERSION */ + Atom ximpStyleAtom; /* _XIMP_STYLE */ + Atom ximpKeysAtom; /* _XIMP_KEYS */ + Atom ximpServerNameAtom; /* _XIMP_SERVERNAME */ + Atom ximpServerVersionAtom; /* _XIMP_SERVERVERSION */ + Atom ximpVendorNameAtom; /* _XIMP_VENDORNAME */ + Atom ximpExtensionsAtom; /* _XIMP_EXTENSIONS */ + Atom ximpProtocolAtom; /* _XIMP_PROTOCOL */ + Atom ximpFocusAtom; /* _XIMP_FOCUS */ + Atom ximpPreeditAtom; /* _XIMP_PREEDIT */ + Atom ximpStatusAtom; /* _XIMP_STATUS */ + Atom ximpPreeditFontAtom; /* _XIMP_PREEDITFONT */ + Atom ximpStatusFontAtom; /* _XIMP_STATUSFONT */ + Atom ximpExtXimpBackFrontAtom; /* _XIMP_EXT_XIMP_BACK_FRONT */ + Atom ximpPreeditDrawDataAtom; /* _XIMP_PREEDIT_DRAW_DATA */ + Atom ximpFeedbacksAtom; /* _XIMP_FEEDBACKS */ +} XimpProtocolPart; + +typedef struct _XimpProtocolRec { + CorePart core; + XimpProtocolPart ximp; +} XimpProtocolRec; + +#endif diff -r 000000000000 -r 92745d501b9a include/Xsj3clib.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/Xsj3clib.h Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,459 @@ +/* $Id: Xsj3clib.h,v 2.2 1993/09/02 14:59:45 nao Exp $ */ + +/* + * Author: Naoshi Suzuki, SONY Corporation. (nao@sm.sony.co.jp) + */ + +#ifndef _Xsj3clib_h +#define _Xsj3clib_h + +#include "sj3lib.h" +#include + +/* #define FORCE_SJIS */ +/* #define FORCE_JIS7 */ +/* #define FORCE_JIS8 */ + +/* + * define for default conversion definition file + * and resource file + */ +#ifndef SJ3DEFPATH +#define SJ3DEFPATH "/usr/lib/X11/sj3def/" +#endif + +/* + * define for default include nesting limit + */ +#ifndef SJRC_INCLUDE_MAX +#define SJRC_INCLUDE_MAX 10 +#endif + +#define DEF_SJRC_FILE "sjrc" +#define DEF_SJRK_FILE "sjrk" +#define DEF_SJHK_FILE "sjhk" +#define DEF_SJZH_FILE "sjzh" +#define DEF_SJSB_FILE "sjsb" + +/* + * Kana-Kanji conversion control key event define + */ +#define KEY_NULL (0L) +#define KEY_HENKAN_START (1L<<0) +#define KEY_HENKAN_END (1L<<1) +#define KEY_MODE_CHANGE (1L<<2) +#define KEY_TEXT_CHANGE (1L<<3) +#define KEY_TEXT_FIXED (1L<<4) +#define KEY_TEXT_FLUSH (1L<<5) +#define KEY_CAND_START (1L<<6) +#define KEY_SYMBOL_START (1L<<7) +#define KEY_HINSI_START (1L<<8) +#define KEY_SELECT_END (1L<<9) +#define KEY_SELECT_ABORT (1L<<10) +#define KEY_SELECT_RIGHT (1L<<11) +#define KEY_SELECT_LEFT (1L<<12) +#define KEY_SELECT_UP (1L<<13) +#define KEY_SELECT_DOWN (1L<<14) +#define KEY_SELECT_FIRST (1L<<15) +#define KEY_SELECT_LAST (1L<<16) +#define KEY_SELECT_NEXTP (1L<<17) +#define KEY_SELECT_PREVP (1L<<18) +#define KEY_SELECT_RIGHTMOST (1L<<19) +#define KEY_SELECT_LEFTMOST (1L<<20) +#define KEY_RECONNECT (1L<<21) +#define KEY_BELL (1L<<22) +#define KEY_DICT_START (1L<<23) +#define KEY_DICT_CHANGE (1L<<24) +#define KEY_DICT_REGISTER (1L<<25) +#define KEY_DICT_CLEAR (1L<<26) +#define KEY_DICT_END (1L<<27) +#define KEY_CONTROL (1L<<28) +#define KEY_FUNC (1L<<29) + +#define KEY_TEXT_CLEAR (KEY_TEXT_CHANGE|KEY_TEXT_FIXED) +#define KEY_CHANGE (KEY_HENKAN_END|KEY_MODE_CHANGE \ + |KEY_TEXT_CHANGE|KEY_TEXT_FIXED) +#define KEY_SELECT (KEY_CAND_START|KEY_SYMBOL_START|KEY_SELECT_END \ + |KEY_SELECT_ABORT|KEY_SELECT_RIGHT|KEY_SELECT_LEFT \ + |KEY_SELECT_UP|KEY_SELECT_DOWN|KEY_SELECT_FIRST \ + |KEY_SELECT_LAST|KEY_SELECT_NEXTP|KEY_SELECT_PREVP \ + |KEY_SELECT_LEFTMOST|KEY_SELECT_RIGHTMOST|KEY_HINSI_START) +#define KEY_DICT (KEY_DICT_START|KEY_DICT_REGISTER|KEY_DICT_CLEAR \ + |KEY_DICT_CHANGE|KEY_DICT_END) + +#ifndef WCHAR_DEFINED +#define WCHAR_DEFINED +#undef wchar +#ifdef WCHAR_LONG +typedef unsigned long wchar; +#else +typedef unsigned short wchar; +#endif +#endif + +/* + * define for server status + */ +#define CONNECT_OK 0 +#define CONNECT_FAIL -1 + +/* + * define for locale + */ +#define JP_SJIS 0 +#define JP_EUC 1 +#define JP_JIS8 2 +#define JP_JIS7 3 +#define JP_OTHER -1 + +/* + * define for buffer size + */ +#define YBUFSIZ 32 +#define RBUFSIZ 16 +#define CANDBUFSIZ 128 +#define KANABUFSIZ 256 +#define KANJIBUFSIZ 512 +#define BUNBUFSIZ 256 + +/* + * define for attribute of segment + */ +#define SEG_REVERSED 0 +#define SEG_UNDER_LINE 1 +#define SEG_NORMAL 2 + +typedef unsigned long Xsj3csMode; +typedef unsigned long Xsj3ccMode; +typedef unsigned long Xsj3cdMode; +typedef unsigned long Xsj3cFlag; +typedef unsigned long Xsj3cEvent; + +#define MODE_HIRA 0 +#define MODE_ZKATA 1 +#define MODE_HKATA 2 +#define MODE_HALPHA 3 +#define MODE_ZALPHA 4 + +#define MODE_SJIS 5 +#define MODE_EUC 6 +#define MODE_JIS 7 +#define MODE_KUTEN 8 + +#define MODE_TOROKU 9 +#define MODE_SYOUKYO 10 +#define MODE_KANJI 11 +#define MODE_EDIT 12 +#define MODE_CAND 13 +#define MODE_SYMBOL 14 +#define MODE_HINSI 15 +#define MODE_QUOTE 16 + +#define MODE_ROLLDOWN 5 +#define MODE_ROLLUP 6 + +#define MODE_HANKAKU 5 +#define MODE_ZENKAKU 6 +#define MODE_UPPER 7 +#define MODE_LOWER 8 + +#define MODE_CONV_NUM 7 /* HIRA-ZALPHA,ROLLDOWN,ROLLUP */ +#define MODE_INROT_NUM 9 /* HIRA-ZALPHA,SJIS-KUTEN */ +#define MODE_OUTROT_NUM 9 /* HIRA-ZALPHA,HANKAKU-LOWER */ +#define MODE_CODE_NUM 4 /* SJIS-KUTEN */ +#define MODE_STR_NUM 17 /* HIRA-ZALPHA,SJIS-KUTEN,TOROKU-HINSI */ + +/* + * Roma-Kana Conversion Table Structure + */ +typedef struct sj3rktable { + unsigned char *roma; + unsigned char *yomi; + unsigned char *str; + int rlen; + int ylen; + struct sj3rktable *next; +} Xsj3cRKTable; + +/* + * Hiragana-Katakana Conversion Table Structure + */ +typedef struct sj3hktable { + unsigned char *hira; + unsigned char *zkata; + unsigned char *hkata; + unsigned char *halpha; + int hlen; + struct sj3hktable *next; +} Xsj3cHKTable; + +/* + * Zenkaku-Hankaku Conversion Table Structure + */ +typedef struct sj3zhtable { + unsigned char *halpha; + unsigned char *zalpha; + unsigned char *zkana; + unsigned char *hkata; + struct sj3zhtable *next; +} Xsj3cZHTable; + +/* + * Data Structure + */ +typedef struct _Xsj3cData { + int len; /* Length of data */ + wchar *data; +} Xsj3cDataRec, *Xsj3cData; + +typedef Xsj3cDataRec Xsj3cSymbolRec; +typedef Xsj3cData Xsj3cSymbol; +typedef Xsj3cDataRec Xsj3cHinsiRec; +typedef Xsj3cData Xsj3cHinsi; + +/* + * Candidate Structure + */ +typedef struct _Xsj3cCand { + int len; /* Length of candidate */ + wchar data[CANDBUFSIZ]; /* Candidate string */ + SJ3_STUDYREC dcid; /* ID for studying */ +} Xsj3cCandRec, *Xsj3cCand; + +/* + * Dictionary Massage Data Structure + */ +typedef struct _Xsj3cDictMsg { + int len; /* Length of data */ + wchar *data; + int attr; /* attribute of data */ +} Xsj3cDictMsgRec, *Xsj3cDictMsg; + +/* + * Key Table Structure + */ +typedef struct sj3keytable { + char *keyword; + KeySym ksym; + Xsj3ccMode modmask; + Xsj3cEvent (*func)(); + Xsj3cFlag inputsame; + struct sj3keytable *prev; + struct sj3keytable *next; +} Xsj3cKeyTable; + +/* + * Segment structure + */ +typedef struct _Xsj3cSeg { + int value; /* Result value of pre-edit conversion */ + unsigned char *str; /* Pre-edit strings buffer */ + unsigned char *sp; /* Current pointer of pre-edit strings */ + wchar *yomi; /* Yomi characters buffer */ + wchar *disp; /* Display/Kanji characters buffer */ + unsigned char *oldstr; /* Old pre-edit strings buffer */ + int oldlen; /* Length old Roma-Kana conversion unit */ + int n_roma; /* Romaji/Code counter of pre-edit */ + int n_kana; /* Kana counter of pre-edit strings */ + int size; /* Size of yomi/disp character buffer */ + int cur; /* Current cursor position */ + int num; /* Length of yomi characters */ + int dnum; /* Length of display characters */ + Xsj3csMode cursegmode; /* Character kind of yomi characters */ + Xsj3cFlag status; /* Conversion status (noconv or conved) */ + Xsj3cFlag change; /* Flag, Need to study or not */ + Xsj3cFlag edit; /* Flag, Available to edit or not */ + SJ3_STUDYREC dcid; /* ID for studying */ +} Xsj3cSegRec, *Xsj3cSeg; + +/* + * Dictionary Data Structure + */ +typedef struct _Xsj3cDictData { + Xsj3cSeg seg; /* Yomi Segment buffer */ + Xsj3cDictMsg msg; /* Message buffers */ + Xsj3cdMode mode; /* Registration or elimination */ + Xsj3cdMode status; /* Current status */ + int value; /* Result value of operation */ + int n_dict; /* Expanded segment counter */ +} Xsj3cDictDataRec, *Xsj3cDictData; + +/* + * Buffer for Sj3 Object + */ +typedef struct _Xsj3cBuf { + int server; /* Current conversion server */ + Xsj3ccMode convmode; /* Current conversion mode */ + + /* Converting string data */ + Xsj3cSeg *input; /* Segment buffers for input */ + Xsj3cSeg *backup; /* Segment buffers for backup */ + Xsj3cSeg current; /* Segment buffer of current input */ + int curseg; /* Current segment number */ + int segnum; /* Total segment number */ + int backsegnum; /* Old total segment number */ + int convedsegnum; /* Total converted segment number */ + + /* Current character mode data */ + Xsj3csMode inputmode; /* Current input character kind */ + Xsj3csMode dispmode; /* Current display character kind */ + + /* Data for handling dictionary (DictMode) */ + Xsj3cDictData dict; /* Data for DictMode */ + + /* Data for selection (SelectMode) */ + Xsj3cCand candidate; /* Candidate strings */ + Xsj3cSymbol symbol; /* Symbol strings */ + Xsj3cHinsi hinsi; /* Hinsi strings */ + int candnum; /* Total candidate number */ + int curcand; /* Current candidate number */ + int cursymbol; /* Current symbol number */ + int curhinsi; /* Current hinsi number */ + Xsj3ccMode selectstatus; /* Status of SelectMode */ + int n_select; /* Counter for candidates to SelectMode */ + int candseg; /* Segment number of current candidate */ + + /* Conversion tables */ + Xsj3cRKTable *rktable; /* Roma-kana conversion table */ + Xsj3cHKTable *hktable; /* Hiragana-Katakana conversion table */ + Xsj3cZHTable *zhtable; /* Hankaku-Zenkaku conversion table */ + + /* Other data for conversion */ + unsigned char *rkdouble; /* Roma-kana double conversion data */ + unsigned char *plosive; /* Roma-kana plosive conversion data */ + + /* Next sjrc file to read */ + char *rcfile; + + /* Common resource in sjrc file (Common with sj2/sj3/sjx) */ + Xsj3cKeyTable *key; /* Key-function conversion table */ + /* Custom-flag (.key .sjxkey .ki2key) */ + Xsj3csMode inmoderot[MODE_INROT_NUM];/* Input character mode */ + /* Custom-flag (.InitialMode) */ + int inmoderotnum; /* Total input character mode number */ + Xsj3csMode outmoderot[MODE_OUTROT_NUM];/* Output character mode */ + /* Custom-flag (.PrintMode) */ + int outmoderotnum; /* Total output character mode number */ + Xsj3csMode defcode[MODE_CODE_NUM]; /* Input code rotation */ + /* Custom-flag (.DefaultCode) */ + int coderotnum; /* Total input code rotation number */ + Xsj3csMode muhenmode; /* Character kind after unconverting */ + /* Custom-flag (.MuhenkanMode) */ + Xsj3csMode togglemode; /* Character kind by toggling */ + /* Custom-flag (.MuhenkanInEdit) */ + Xsj3cFlag dotoggle; /* Custom-flag (.MuhenkanToggle) */ + Xsj3cFlag throughflg; /* Trough character flag */ + wchar *modestr[MODE_STR_NUM]; /* Character mode strings */ + /* Custom-flag (.guide.[mode]) */ + int modelen[MODE_STR_NUM]; /* Length of mode strings */ + Xsj3cFlag gakusyuu; /* Custom-flag (.bstudy) */ + Xsj3cFlag rkbell; /* Custom-flag (.rkerrbell) */ + Xsj3cFlag flushaconv; /* Custom-flag (.FlushAfterConversion) */ + char *sj3serv; /* First sj3serv hostname */ + /* Custom-flag (.server) */ + unsigned char *setnormal; /* Custom-flag (.SetNormal) */ + unsigned char *throughnext; /* Custom-flag (.ThroughNext) */ + + /* Original resource (Not exists in sj2/sj3/sjx) */ + char *sj3serv2; /* Second sj3serv hostname */ + /* Custom-flag (.server2) */ + Xsj3cFlag flushiconv; /* Custom-flag (.FlushInConversion) */ + Xsj3cFlag flushsconv; /* Custom-flag (.FlushSelectConversion) */ + Xsj3cFlag flusheconv; /* Custom-flag (.FlushEndConversion) */ + Xsj3cFlag alphaconv; /* Custom-flag (.AlphabetConversion) */ + Xsj3cFlag backdisplay; /* Custom-flag (.BackDisplay) */ + Xsj3cFlag beginlastseg; /* Custom-flag (.BeginConversionLast) */ + Xsj3cFlag expandmconv; /* Custom-flag (.ExpandModeConversion) */ + Xsj3cFlag shrinkmconv; /* Custom-flag (.ShrinkModeConversion) */ + Xsj3cFlag expandkconv; /* Custom-flag (.ExpandKanjiConversion) */ + Xsj3cFlag shrinkkconv; /* Custom-flag (.ShrinkKanjiConversion) */ + Xsj3cFlag shrinkall; /* Custom-flag (.ShrinkAll) */ + Xsj3cFlag henkanseg; /* Custom-flag (.HenkanSegment) */ + Xsj3cFlag muhenseg; /* Custom-flag (.MuhenkanSegment) */ + Xsj3cFlag delchange; /* Custom-flag (.DeleteChangeSegment) */ + Xsj3cFlag flushchange; /* Custom-flag (.FlushChangeSegment) */ + Xsj3cFlag modeconv[MODE_CONV_NUM];/* Custom-flag (.ModeConversion)*/ + Xsj3cFlag moveloop; /* Custom-flag (.MoveLoop) */ + Xsj3cFlag movebyseg; /* Custom-flag (.MoveBySegment) */ + Xsj3cFlag jumpbyseg; /* Custom-flag (.JumpBySegment) */ + Xsj3cFlag delbyseg; /* Custom-flag (.DeleteBySegment) */ + Xsj3cFlag killbyseg; /* Custom-flag (.KillBySegment) */ + Xsj3cFlag muhencurlast; /* Custom-flag (.MuhenkanCursorLast) */ + Xsj3cFlag editcurlast; /* Custom-flag (.EditCursorLast) */ + Xsj3cFlag flushcurlast; /* Custom-flag (.FlushCursorLast) */ + Xsj3cFlag convedunderline;/* Custom-flag (.ConvertedUnderLine) */ + Xsj3cFlag dispmodechange; /* Custom-flag (.DisplayModeChange) */ + Xsj3cFlag dellastmove; /* Custom-flag (.DeleteLastMove) */ + Xsj3cFlag kanaonly; /* Custom-flag (.KanaInputOnly) */ + Xsj3cFlag inputsame; /* Custom-flag (.InputSameTime) */ + Xsj3cFlag cntrlsame; /* Custom-flag (.ControlSameTime) */ + Xsj3cFlag selectconv; /* Custom-flag (.BeforeSelectConversion)*/ + Xsj3cFlag beforeconv; /* Custom-flag (.BeforeConversion) */ + Xsj3cFlag lastdoubleconv; /* Custom-flag (.LastDoubleConversion) */ + int selectcount; /* Custom-flag (.BeforeSelectCount) */ + Xsj3cFlag selectback; /* Custom-flag (.SelectBackSpaceCurrent)*/ + Xsj3cFlag candpadding; /* Custom-flag (.CandidatePadding) */ + +} Xsj3cBufRec, *Xsj3cBuf; + +/* Key event handling */ +extern unsigned char *Xsj3cGetPreeditArea(); +extern Xsj3cEvent Xsj3cKeyConv(); + +/* Setting up environment */ +extern void Xsj3cSetInLang(); +extern void Xsj3cSetOutLang(); +extern void Xsj3cSetKanaMod(); + +/* Connection to language conversion server handling */ +extern int Xsj3cOpen(); +extern void Xsj3cClose(); +extern void Xsj3cConnect(); + +/* Operation of buffers */ +extern Xsj3cBuf Xsj3cCreateBuffer(); +extern void Xsj3cFreeBuffer(); +extern void Xsj3cClearBuffer(); +extern void Xsj3cFlushBuffer(); +extern void Xsj3cFixBuffer(); + +/* Getting data to draw or send to other */ +extern int Xsj3cGetSegNum(); +extern int Xsj3cGetPosition(); +extern wchar *Xsj3cGetSeg(); +extern wchar *Xsj3cGetModeStr(); +extern wchar *Xsj3cGetConvertedStr(); +extern int Xsj3cGetConvertedLength(); + +/* Operartion of candidate data */ +extern int Xsj3cGetCandidateNum(); +extern Xsj3cCand Xsj3cGetCandidates(); +extern wchar *Xsj3cGetCandidate(); +extern int Xsj3cSetCandidate(); +extern void Xsj3cEndCandidate(); + +/* Operartion of symbol data */ +extern int Xsj3cGetSymbolNum(); +extern Xsj3cSymbol Xsj3cGetSymbols(); +extern wchar *Xsj3cGetSymbol(); +extern int Xsj3cSetSymbol(); +extern void Xsj3cEndSymbol(); + +/* Operartion of hinsi data */ +extern int Xsj3cGetHinsiNum(); +extern Xsj3cHinsi Xsj3cGetHinsis(); +extern wchar *Xsj3cGetHinsi(); +extern int Xsj3cSetHinsi(); +extern void Xsj3cEndHinsi(); + +/* Operartion of dictionary data */ +extern int Xsj3cGetDictMsgNum(); +extern Xsj3cDictMsg Xsj3cGetDictMsgs(); +extern wchar *Xsj3cGetDictMsg(); +extern void Xsj3cDictRegister(); +extern void Xsj3cDictClear(); +extern void Xsj3cEndDict(); + +extern void Xsj3cInitializeTables(); + +#endif /* _Xsj3clib_h */ diff -r 000000000000 -r 92745d501b9a include/cconv.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/cconv.h Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,74 @@ +/* $Id: cconv.h,v 10.2 1998/12/28 07:33:30 ishisone Exp $ */ +/* + * cconv.h -- header file for cconv library + * version 10.1 + */ + +/* + * Copyright (c) 1988 Software Research Associates, Inc. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Software Research Associates not be + * used in advertising or publicity pertaining to distribution of the + * software without specific, written prior permission. Software Research + * Associates makes no representations about the suitability of this software + * for any purpose. It is provided "as is" without express or implied + * warranty. + * + * Author: Makoto Ishisone, Software Research Associates, Inc., Japan + * ishisone@sra.co.jp + */ + +#ifndef WCHAR_DEFINED +#define WCHAR_DEFINED +typedef unsigned short wchar; +#endif + +typedef struct _ccRule *ccRule; +typedef struct _ccBuf *ccBuf; + +/* CCDEFPATH -- default ccdef file directory */ +#ifndef CCDEFPATH +#define CCDEFPATH "/usr/lib/X11/ccdef/" +#endif + +#ifdef __STDC__ +extern ccRule ccParseRule(char *, void (*)()); +extern ccBuf ccCreateBuf(ccRule, int, char *[], int, void (*)(), void (*)(), + void (*)(), int (*)(), void (*)(), void (*)(), + caddr_t); +extern void ccFreeRule(ccRule); +extern void ccDestroyBuf(ccBuf); +extern int ccConvchar(ccBuf, XKeyPressedEvent *); +extern int ccGetMode(ccBuf); +extern wchar *ccGetModePrompt(ccBuf); +extern ccRule ccGetRule(ccBuf); +extern void ccContextAppend(ccBuf, int); +extern void ccContextDelete(ccBuf); +extern void ccContextClear(ccBuf); +extern void ccContextSet(ccBuf, wchar *); +extern void ccContextGet(ccBuf, wchar *); + +extern ccBuf ccInit(char *, int, void (*)(), void (*)(), void (*)(), + int (*)(), void (*)(), char **, int); +extern void ccTerminate(ccBuf); +#else +extern ccRule ccParseRule(); +extern ccBuf ccCreateBuf(); +extern void ccFreeRule(); +extern void ccDestroyBuf(); +extern int ccConvchar(); +extern int ccGetMode(); +extern wchar *ccGetModePrompt(); +extern ccRule ccGetRule(); +extern void ccContextAppend(); +extern void ccContextDelete(); +extern void ccContextClear(); +extern void ccContextSet(); +extern void ccContextGet(); +extern ccBuf ccInit(); +extern void ccTerminate(); +#endif diff -r 000000000000 -r 92745d501b9a include/wnnlib.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/wnnlib.h Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,176 @@ +/* $Id: wnnlib.h,v 10.8 1999/05/25 06:21:10 ishisone Exp $ */ + +/* + * wnnlib.h -- wnnlib $BMQ%X%C%@%U%!%$%k(B (Wnn Version4/6 $BBP1~HG(B) + * version 5.0 + * ishisone@sra.co.jp + */ + +/* + * Copyright (c) 1989 Software Research Associates, Inc. + * Copyright (c) 1998 MORIBE, Hideyuki + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Software Research Associates not be + * used in advertising or publicity pertaining to distribution of the + * software without specific, written prior permission. Software Research + * Associates makes no representations about the suitability of this software + * for any purpose. It is provided "as is" without express or implied + * warranty. + * + * Author: Makoto Ishisone, Software Research Associates, Inc., Japan + * MORIBE, Hideyuki + */ + +#ifndef _wnnlib_h +#define _wnnlib_h + +#include +#include +#include + +#ifndef WCHAR_DEFINED +#define WCHAR_DEFINED +#undef wchar +typedef unsigned short wchar; +#endif + + +/* $BDj?t(B */ +#define JC_FORWARD 1 +#define JC_BACKWARD 0 +#define JC_NEXT 0 +#define JC_PREV 1 +#define JC_HIRAGANA 0 +#define JC_KATAKANA 1 + +/* $B%(%i!]J8@a$,$^$@JQ49$5$l$F$$$J$$(B */ +#define JE_CANTDELETE 4 /* $B%P%C%U%!$N@hF,$NA0!"$"$k$$$O(B + * $B:G8e$N.J8@a$N>pJs(B */ +typedef struct { + wchar *kanap; /* $BFI$_J8;zNs(B */ + wchar *dispp; /* $BI=<(J8;zNs(B */ + char conv; /* $BJQ49:Q$_$+(B */ + /* 0: $BL$JQ49(B 1: $BJQ49:Q(B -1: $B$G5?;wJQ49(B */ + char ltop; /* $BBgJ8@a$N@hF,$+(B? */ +} jcClause; + + +/* $B:n6H0h(B */ +typedef struct { + /* public member */ + int nClause; /* $BJ8@a?t(B */ + int curClause; /* $B%+%l%s%HJ8@aHV9f(B */ + int curLCStart; /* $B%+%l%s%HBgJ8@a3+;OJ8@aHV9f(B */ + int curLCEnd; /* $B%+%l%s%HBgJ8@a=*N;J8@aHV9f(B */ + wchar *kanaBuf; /* $B$+$J%P%C%U%!(B */ + wchar *kanaEnd; + wchar *displayBuf; /* $B%G%#%9%W%l%$%P%C%U%!(B */ + wchar *displayEnd; + jcClause *clauseInfo; /* $BJ8@a>pJs(B */ + struct wnn_buf *wnn; + /* private member */ + int fixed; /* $B3NDj$5$l$?$+$I$&$+(B */ + wchar *dot; /* $B%I%C%H$N0LCV(B */ + int candKind; /* $BBgJ8@a$NA48uJd$+>.J8@a$N8uJd$+$r(B + $BI=$9%U%i%0(B */ + int candClause; /* $BA48uJd$r$H$C$F$$$kJ8@aHV9f(B */ + int candClauseEnd; /* $BBgJ8@a$NA48uJd$N;~!"=*N;J8@aHV9f(B */ + int bufferSize; /* kanaBuf/displayBuf $B$NBg$-$5(B */ + int clauseSize; /* clauseInfo $B$NBg$-$5(B */ +} jcConvBuf; + +#ifdef __STDC__ +extern struct wnn_buf *jcOpen(char *server, char *envname, + int override, char *rcfile, + void (*error)(), int (*confirm)(), + int timeout); +extern struct wnn_buf *jcOpen2(char *server, char *envname, + int override, char *rcfile4, char *rcfile6, + void (*error)(), int (*confirm)(), + int timeout); +extern int jcClose(struct wnn_buf *wnn); +extern int jcIsConnect(struct wnn_buf *wnn); +extern jcConvBuf *jcCreateBuffer(struct wnn_buf *wnn, + int clause, int buffersize); +extern int jcDestroyBuffer(jcConvBuf *buf, int savedic); +extern int jcClear(jcConvBuf *buf); +extern int jcInsertChar(jcConvBuf *buf, int c); +extern int jcDeleteChar(jcConvBuf *buf, int prev); +extern int jcKillLine(jcConvBuf *buf); +extern int jcConvert(jcConvBuf *buf, int small, int tan, int jump); +extern int jcUnconvert(jcConvBuf *buf); +extern int jcCancel(jcConvBuf *buf); +extern int jcExpand(jcConvBuf *buf, int small, int convf); +extern int jcShrink(jcConvBuf *buf, int small, int convf); +extern int jcKana(jcConvBuf *buf, int small, int kind); +extern int jcFix(jcConvBuf *buf); +extern int jcFix1(jcConvBuf *buf); +extern int jcNext(jcConvBuf *buf, int small, int prev); +extern int jcCandidateInfo(jcConvBuf *buf, int small, + int *ncandp, int *curcandp); +extern int jcGetCandidate(jcConvBuf *buf, int n, wchar *candstr); +extern int jcSelect(jcConvBuf *buf, int n); +extern int jcDotOffset(jcConvBuf *buf); +extern int jcIsConverted(jcConvBuf *buf, int cl); +extern int jcMove(jcConvBuf *buf, int small, int dir); +extern int jcTop(jcConvBuf *buf); +extern int jcBottom(jcConvBuf *buf); +extern int jcChangeClause(jcConvBuf *buf, wchar *str); +extern int jcSaveDic(jcConvBuf *buf); +#else +extern struct wnn_buf *jcOpen(); +extern struct wnn_buf *jcOpen2(); +extern int jcClose(); +extern int jcIsConnect(); +extern jcConvBuf *jcCreateBuffer(); +extern int jcDestroyBuffer(); +extern int jcClear(); +extern int jcInsertChar(); +extern int jcDeleteChar(); +extern int jcKillLine(); +extern int jcConvert(); +extern int jcUnconvert(); +extern int jcCancel(); +extern int jcExpand(); +extern int jcShrink(); +extern int jcKana(); +extern int jcFix(); +extern int jcNext(); +extern int jcCandidateInfo(); +extern int jcGetCandidate(); +extern int jcSelect(); +extern int jcDotOffset(); +extern int jcIsConverted(); +extern int jcMove(); +extern int jcTop(); +extern int jcBottom(); +extern int jcChangeClause(); +extern int jcSaveDic(); +#endif + +#endif /* _wnnlib_h */ diff -r 000000000000 -r 92745d501b9a lib/AdoptedShe.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/AdoptedShe.c Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,196 @@ +#ifndef lint +static char *rcsid = "$Id: AdoptedShe.c,v 1.6 1991/09/23 04:03:31 ishisone Rel $"; +#endif +/* + * Copyright (c) 1990 Software Research Associates, Inc. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Software Research Associates not be + * used in advertising or publicity pertaining to distribution of the + * software without specific, written prior permission. Software Research + * Associates makes no representations about the suitability of this software + * for any purpose. It is provided "as is" without express or implied + * warranty. + * + * Author: Makoto Ishisone, Software Research Associates, Inc., Japan + */ + +#include +#include +#include "AdoptedShP.h" + +static XtResource resources[] = { +#define offset(field) XtOffset(AdoptedShellWidget, adoptedshell.field) + { XtNparentWindow, XtCParentWindow, XtRWindow, sizeof(Window), + offset(parent), XtRImmediate, None }, + { XtNdisableGeometryManagement, XtCDisableGeometryManagement, + XtRBoolean, sizeof(Boolean), + offset(disable_geometry), XtRString, "False" }, +#undef offset +}; + +static void Initialize(); +static void Realize(); +static Boolean SetValues(); +static XtGeometryResult GeometryManager(); + +static void GetParentInfo(); + +AdoptedShellClassRec adoptedShellClassRec = { + { /* core fields */ + /* superclass */ (WidgetClass) &overrideShellClassRec, + /* class_name */ "AdoptedShell", + /* widget_size */ sizeof(AdoptedShellRec), + /* class_initialize */ NULL, + /* class_part_initialize */ NULL, + /* class_inited */ FALSE, + /* initialize */ Initialize, + /* initialize_hook */ NULL, + /* realize */ Realize, + /* actions */ NULL, + /* num_actions */ 0, + /* resources */ resources, + /* num_resources */ XtNumber(resources), + /* xrm_class */ NULLQUARK, + /* compress_motion */ TRUE, + /* compress_exposure */ TRUE, + /* compress_enterleave */ TRUE, + /* visible_interest */ FALSE, + /* destroy */ NULL, + /* resize */ XtInheritResize, + /* expose */ XtInheritExpose, + /* set_values */ SetValues, + /* set_values_hook */ NULL, + /* set_values_almost */ XtInheritSetValuesAlmost, + /* get_values_hook */ NULL, + /* accept_focus */ NULL, + /* version */ XtVersion, + /* callback_private */ NULL, + /* tm_table */ NULL, + /* query_geometry */ XtInheritQueryGeometry, + /* display_accelerator */ XtInheritDisplayAccelerator, + /* extension */ NULL + }, + { /* Composite */ + /* geometry_manager */ GeometryManager, + /* change_managed */ XtInheritChangeManaged, + /* insert_child */ XtInheritInsertChild, + /* delete_child */ XtInheritDeleteChild, + /* extension */ NULL + }, + { /* shell fields */ + /* extension */ NULL + }, + { /* overrideShell fields */ + /* extension */ NULL + }, + { /* AdoptedShell fields */ + /* empty */ 0 + } +}; + +WidgetClass adoptedShellWidgetClass = (WidgetClass)&adoptedShellClassRec; + +/* ARGSUSED */ +static void +Initialize(req, new, args, num_args) +Widget req; +Widget new; +ArgList args; +Cardinal *num_args; +{ + AdoptedShellWidget asw = (AdoptedShellWidget)new; + Cardinal i; + + asw->adoptedshell.colormap_specified = False; + for (i = 0; i < *num_args; i++) { + if (!strcmp(args[i].name, XtNcolormap)) { + asw->adoptedshell.colormap_specified = True; + break; + } + } +} + +static void +Realize(w, maskp, attr) +Widget w; +XtValueMask *maskp; +XSetWindowAttributes *attr; +{ + AdoptedShellWidget asw = (AdoptedShellWidget)w; + Window savedroot; + + if (asw->adoptedshell.parent == None) { + asw->adoptedshell.parent = w->core.screen->root; + } else { + GetParentInfo(asw); + } + asw->adoptedshell.colormap_specified = False; + + /* cheat the super-class's realize function */ + savedroot = w->core.screen->root; + w->core.screen->root = asw->adoptedshell.parent; + + /* call super class's realize function */ + (*adoptedShellWidgetClass->core_class.superclass->core_class.realize)(w, maskp, attr); + + /* restore savedroot */ + w->core.screen->root = savedroot; +} + +/* ARGSUSED */ +static Boolean +SetValues(cur, req, new, args, num_args) +Widget cur; +Widget req; +Widget new; +ArgList args; +Cardinal *num_args; +{ + AdoptedShellWidget asw = (AdoptedShellWidget)new; + AdoptedShellWidget old = (AdoptedShellWidget)cur; + + if (asw->adoptedshell.parent != old->adoptedshell.parent) { + if (XtIsRealized(new)) { + XtAppError(XtWidgetToApplicationContext(new), + "AdoptedShell: can't change parent window after realization"); + } + } + if (asw->core.colormap != old->core.colormap && !XtIsRealized(new)) { + asw->adoptedshell.colormap_specified = True; + } + return False; +} + +static XtGeometryResult +GeometryManager(w, reqp, repp) +Widget w; +XtWidgetGeometry *reqp; +XtWidgetGeometry *repp; +{ + AdoptedShellWidget asw = (AdoptedShellWidget)XtParent(w); + ShellWidgetClass super; + + if (asw->adoptedshell.disable_geometry) return XtGeometryYes; + + super = (ShellWidgetClass)(adoptedShellWidgetClass->core_class.superclass); + return (*super->composite_class.geometry_manager)(w, reqp, repp); +} + +static void +GetParentInfo(w) +AdoptedShellWidget w; +{ + Window parent = w->adoptedshell.parent; + XWindowAttributes attr; + + (void)XGetWindowAttributes(XtDisplay((Widget)w), parent, &attr); + w->core.screen = attr.screen; + if (!w->adoptedshell.colormap_specified) w->core.colormap = attr.colormap; + /* may be I should honor user-specified visual, etc. */ + w->core.depth = attr.depth; + w->shell.visual = attr.visual; +} diff -r 000000000000 -r 92745d501b9a lib/Atok.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/Atok.c Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,1851 @@ +/* + * Copyright (c) 1990 Software Research Associates, Inc. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Software Research Associates not be + * used in advertising or publicity pertaining to distribution of the + * software without specific, written prior permission. Software Research + * Associates makes no representations about the suitability of this software + * for any purpose. It is provided "as is" without express or implied + * warranty. + * + * Author: Makoto Ishisone, Software Research Associates, Inc., Japan + */ + +/* Copyright 1991 NEC Corporation, Tokyo, Japan. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, + * provided that the above copyright notice appear in all copies and that + * both that copyright notice and this permission notice appear in + * supporting documentation, and that the name of NEC Corporation + * not be used in advertising or publicity pertaining to distribution + * of the software without specific, written prior permission. NEC + * Corporation makes no representations about the suitability of this + * software for any purpose. It is provided "as is" without express + * or implied warranty. + * + * NEC CORPORATION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN + * NO EVENT SHALL NEC CORPORATION BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF + * USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR + * OTHER TORTUOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + * + * Author: Akira Kon, NEC Corporation. (kon@d1.bs2.mt.nec.co.jp) + */ + +/* + * Copyright 1999 Justsystem Corporation, Japan. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, + * provided that the above copyright notice appear in all copies and that + * both that copyright notice and this permission notice appear in + * supporting documentation, and that the name of Justsystem Corporation + * not be used in advertising or publicity pertaining to distribution + * of the software without specific, written prior permission. Justsystem + * Corporation makes no representations about the suitability of this + * software for any purpose. It is provided "as is" without express + * or implied warranty. + * + * Author: Atsushi Irisawa + */ + +#ifndef lint +static char *rcsid = "$Id: Atok.c,v 1.3 1999/08/24 08:59:35 ishisone Exp $"; +#endif + +#include +#include +#include +#define XK_KATAKANA +#include +#if XtSpecificationRelease > 4 +#include +#endif +#include "AtokP.h" +#include "key_def.h" +#include "DebugPrint.h" + +#define _WCHAR_T +#define wchar_t wchar + +#ifdef SVR4 +#define bzero(p, l) memset(p, 0, l) +#else +#if defined(SYSV) || defined(USG) +#define OVERLAP_BCOPY +extern char *memset(); +#define bzero(p, l) memset(p, 0, l) +#endif +#endif + +static XtResource resources[] = { +#define offset(field) XtOffset(AtokObject, atok.field) + { XtNAtokServer, XtCAtokServer, XtRString, sizeof(String), + offset(atokserver), XtRString, NULL }, + { XtNConfFile, XtCConfFile, XtRString, sizeof(String), + offset(conffile), XtRString, NULL }, + { XtNStyleFile, XtCStyleFile, XtRString, sizeof(String), + offset(stylefile), XtRString, NULL }, + { XtNPort, XtCPort, XtRString, sizeof(String), + offset(port), XtRString, NULL }, +#undef offset +}; + +static void ClassInitialize(); +static void Initialize(); +static void Destroy(); +static Boolean SetValues(); +static int InputEvent(); +static ICString *GetMode(); +static int CursorPos(); +static int NumSegments(); +static ICString *GetSegment(); +static int CompareSegment(); +static ICString *GetItemList(); +static int SelectItem(); +static int ConvertedString(); +static int ClearConversion(); +static ICString *GetAuxSegments(); +static int PreeditString(); +static int StatusString(); + +AtokClassRec atokClassRec = { + { /* object fields */ + /* superclass */ (WidgetClass) &inputConvClassRec, + /* class_name */ "Atok", + /* widget_size */ sizeof(AtokRec), + /* class_initialize */ ClassInitialize, + /* class_part_initialize */ NULL, + /* class_inited */ FALSE, + /* initialize */ Initialize, + /* initialize_hook */ NULL, + /* obj1 */ NULL, + /* obj2 */ NULL, + /* obj3 */ 0, + /* resources */ resources, + /* num_resources */ XtNumber(resources), + /* xrm_class */ NULLQUARK, + /* obj4 */ FALSE, + /* obj5 */ FALSE, + /* obj6 */ FALSE, + /* obj7 */ FALSE, + /* destroy */ Destroy, + /* obj8 */ NULL, + /* obj9 */ NULL, + /* set_values */ SetValues, + /* set_values_hook */ NULL, + /* obj10 */ NULL, + /* get_values_hook */ NULL, + /* obj11 */ NULL, + /* version */ XtVersion, + /* callback_private */ NULL, + /* obj12 */ NULL, + /* obj13 */ NULL, + /* obj14 */ NULL, + /* extension */ NULL + }, + { /* inputConv fields */ + /* InputEvent */ InputEvent, + /* GetMode */ GetMode, + /* CursorPos */ CursorPos, + /* NumSegments */ NumSegments, + /* GetSegment */ GetSegment, + /* CompareSegment */ CompareSegment, + /* GetItemList */ GetItemList, + /* SelectItem */ SelectItem, + /* GetConvertedString */ ConvertedString, + /* ClearConversion */ ClearConversion, + /* GetAuxSegments */ GetAuxSegments, + /* SupportMultipleObjects */ True, + /* GetTriggerKeys */ XtInheritGetTriggerKeys, + /* num_trigger_keys */ 0, + /* trigger_keys */ NULL, + /* GetPreeditString */ PreeditString, + /* GetStatusString */ StatusString, + /* NoMoreObjects */ False, + }, + { /* atok fields */ + /* foo */ 0, + } +}; + +WidgetClass atokObjectClass = (WidgetClass)&atokClassRec; + +static int bell(); +static void fix(); +static void fixProcForAtok(); +static void convend(); + +static void addObject(); +static void deleteObject(); + +static void atokDisplay(); +static int atokCandDisplay(); +static int atokAuxDisplay(); + +static void moveLeft(); +static void moveRight(); +static void setSelection(); +static void moveSelection(); +static void querySelection(); +static void endSelection(); +static void insertSelection(); +static int allocCandList(); +static int changeTextForAtok(); +static int changeTextForAtokAUX(); +static void startSelection(); +static int makeCandList(); + +static void copyInWchar(); + +static Display *displaybell = (Display *)0; + +static int clientID = -1; +static int nAtokContexts = 0; +static int ceSock = -1; + + +static void +ClassInitialize() +{ + DPRINT(( "ATOK Class Initialize\n" )); + TRACE(("AtokObjectClass initialized\n")); + /* $B2?$b$7$J$$(B */ +} + +/* ARGSUSED */ +static void +Initialize(req, new, args, num_args) +Widget req; +Widget new; +ArgList args; +Cardinal *num_args; +{ + AtokObject obj = (AtokObject)new; + AtokObject objX = (AtokObject)req; + int sock; + menuAux *orgMenuAux; + char buf[256]; + int isConnect = 1; + int i; + + bzero((char *)&obj->atok, sizeof(obj->atok)); + + obj->atok.textchanged = False; + obj->atok.nbr_of_cand = 0; + obj->atok.cand_lists_ics = NULL; + obj->atok.cur_cand = 0; + + for (i = 0; i < NBR_OF_PART; i++) { + obj->atok.aux_ics[i].data = (char *)NULL; + obj->atok.aux_ics[i].nchars = 0; + obj->atok.aux_ics[i].nbytes = 0; + obj->atok.aux_length[i] = 0; + obj->atok.aux_size[i] = 0; + } + + if (objX->atok.atokserver) + obj->atok.atokserver = objX->atok.atokserver; + if (objX->atok.port) + obj->atok.port = objX->atok.port; + if (objX->atok.conffile) + obj->atok.conffile = objX->atok.conffile; + + /* $BF~NO%P%C%U%!$r:n@.$9$k!#(B*/ + obj->atok.comm = (_XatokRecPtr)XtMalloc(sizeof(_XatokRec)); + bzero((char *)obj->atok.comm, sizeof(_XatokRec)); + obj->atok.comm->echoLen = 0; + /* obj->atok.sock = ceSock; */ + + if (!nAtokContexts) { + ceSock = atokConnect(obj->atok.atokserver, + obj->atok.port, + obj->atok.conffile, + obj->atok.stylefile, + /* + obj->atok.conffile ? + obj->atok.conffile : "atok12.conf", + obj->atok.stylefile ? + obj->atok.stylefile : "atok12.sty", + */ + obj->atok.comm); + if (ceSock < 0) { + XtAppWarning(XtWidgetToApplicationContext((Widget)obj), + "Cannot connect to ATOK server"); + /* exit(0); */ + XtFree((char *)obj->atok.comm); + obj->atok.comm = (_XatokRecPtr)NULL; + return; + } + isConnect = 0; + obj->atok.comm->sock = ceSock; + clientID = obj->atok.comm->NETrqst.clntid; + } + + obj->atok.comm->sock = ceSock; + + addObject(obj, ceSock, clientID, isConnect); + + orgMenuAux = getMenuInstance(); + obj->atok.comm->menuAux = auxMenuCopy(orgMenuAux); + obj->atok.comm->curAux = obj->atok.comm->menuAux; + XtCallCallbackList((Widget) obj, obj->inputConv.modechangecallback, + (XtPointer)NULL); + nAtokContexts++; +} + +static void +Destroy(w) +Widget w; +{ + AtokObject obj = (AtokObject)w; + + if (obj->atok.comm) XtFree((char *)obj->atok.comm); + deleteObject(obj); +} + +/* ARGSUSED */ +static Boolean SetValues(cur, req, wid, args, num_args) +Widget cur; +Widget req; +Widget wid; +ArgList args; +Cardinal *num_args; +{ + AtokObject old = (AtokObject)cur; + AtokObject new = (AtokObject)wid; + + return False; +} + + +static int +XKanaLookup(event_struct, buffer_return, bytes_buffer, + keysym, status_return) +XKeyEvent *event_struct; +char *buffer_return; +int bytes_buffer; +KeySym *keysym; +XComposeStatus *status_return; +{ + int res; + res = XLookupString(event_struct, buffer_return, bytes_buffer, + keysym, status_return); + if (!res && XK_overline <= *keysym && *keysym <= XK_semivoicedsound) { + buffer_return[0] = (unsigned long)(*keysym) & 0xff; + res = 1; + } + return res; +} + + +/* + * Kinput2 API Functions + */ + +static int +InputEvent(w, event) +Widget w; +XEvent *event; +{ + AtokObject obj = (AtokObject)w; + wchar wbuf[BUFSIZ*4]; /* $B3NDjJ8;zNs$N%P%C%U%!(B */ + int wlen; /* $B3NDjJ8;zNs$ND9$5(B */ + unsigned char kbuf[BUFSIZ]; /* $B%-!type != KeyPress /*&& event->type != KeyRelease*/) return 0; + + obj->atok.textchanged = False; + + /* + * AtokServer $B$,(B $B:F5/F0$5$l$?$P$"$$$J$I!"%3%M%/%7%g%s$,$-$l$F$$$k>l9g$,(B + * $B$"$k$N$G(B $B:FEY%3%M%/%7%g%s$rD%$C$F$_$k!#(B + */ + if (obj->atok.comm == NULL) { + /* return -1; /* $B@\B3$G$-$F$$$J$$$H$-$O!"%(%i!<$rJV$9(B */ + return 1; /* $B@\B3$G$-$F$$$J$$$H$-$O!"L5;k$9$k(B */ + } + + /* X $B$N%-!<%$%Y%s%H$rl9g$OL5;k$9$k(B */ + if (nbytes == 0 && ks & 0xff00 == 0) return 1; + + /* $B%Y%k$rLD$i$9%G%#%9%W%l%$$N@_Dj(B */ + displaybell = XtDisplayOfObject((Widget)obj); + + /* + * $B8uJd%&%#%s%I%&$,(BACTIVE $B$K$J$C$F$$$?>l9g$N8uJd$N0\F0$O(B + * Kinput2 $B$h$j(B Callback $B$,8F$S=P$5$l$:!"A*Br$5$l$F$$$kHV9f$,(B + * $Batok.comm->convStatus & M_CAND) { + querySelection(obj); + } + + /* + * $B%-!l9g$K$O!"%j%?!<%s$H$7$F!"$=$NJ8;zNs$ND9$5$,(B + * $BJV$C$F$/$k!#(B + * $B$3$l0J9_$N=hM}$O(B $B2hLL$KI=<($9$k$?$a$NJ*$G$"$k!#(B + */ + wlen = XatokEventControl(obj->atok.comm, event, ks, kbuf, nbytes, + &aajcode, &kanjiStatus, &enableStatus, + &changeStatus, &elseEvent); + + if (!aajcode) { + /* Can't convertsion to AAJ CODE */ + return 0; + } + + if (obj->atok.comm->convStatus == M_NOKEYCONV) { + convend(obj); + return 0; + } + + /* + * $B$3$3$+$i2<$O(B kanjiStatus $B$G;XDj$5$l$F$$$k%b!<%I$N=hM}$r(B + * $B9T$$!"2hLL$KI=<($9$k!#(B + * $B8uJd0lMw!"!"<-=q!"3NDj$J$I$K2r$l$k!#(B + * + * $BDL>o$N%-!l9g(B + * $B8uJd0lMwI=<(Cf$N>l9g(B + * $B<-=q%f!<%F%#%j%F%#!l9g(B + */ + switch(kanjiStatus) { + case KRS_UNCHANGED: /* $B%9%k!<3NDj(B */ + isThrue = 1 ; + obj->atok.comm->wlen = 0 ; + obj->atok.comm->wbuf[0] = aajcode ; + break; + case KRS_BACKSPACE: + case KRS_SOFTBACKSPACE: + case KRS_SOFTCARRIAGERETURN: + case KRS_EXTTANGO_OPEN: + default: + break; + } + status = 0; + if (enableStatus) { + if (elseEvent & EVENTB_BEEP) { + bell(); + } + /* $B%b!<%I$NJQ99$,$"$C$?(B */ + if (changeStatus & ATCHANGEB_MODESTR) { + XtCallCallbackList((Widget)obj, obj->inputConv.modechangecallback, + (XtPointer)NULL); + } + if (changeStatus & ATCHANGEB_RESULTSTR) { + /* do nothing */ + } + if (changeStatus & ATCHANGEB_COMPSTR) { + /* do nothing */ + } + /* $BC$7$F$+$i(B + * AuxDisplay()$B$r8F$S=P$9I,MW$,$"$k!#(B + */ + status = auxSyslineCtrl(obj->atok.comm, + changeStatus & ATCHANGEB_RESULTSTR); + atokAuxDisplay(obj, M_SYSLINE); + /* + if (!status) { + DPRINT(("SYSLINE END\n")); + return 0; + } + */ + } + } + /* + * $B$3$3$+$i2<$O(B $BI=<($N%3%s%H%m!<%k(B + * $BF~NO$5$l$?%-!<$K$h$j=hM}$rJ,$1$F$$$k!#(B + */ + if (obj->atok.comm->convStatus & M_CAND) { + status = atokCandDisplay(obj, (int)aajcode); + if (status < 1) { + return 0; + } + } + /* else */ + if (obj->atok.comm->convStatus & M_AUX) { + status = atokAuxDisplay(obj, obj->atok.comm->convStatus); + if (status < 1) { + return; + } + } + else if (obj->atok.comm->convStatus & M_SYSLINE && !status) { + status = auxSyslineCtrl(obj->atok.comm, + changeStatus & ATCHANGEB_RESULTSTR); + atokAuxDisplay(obj, obj->atok.comm->convStatus); + if (!status) { + return 0; + } + } + else if (kanjiStatus == XKEY_DICT) { + /* $B<-=q%f!<%F%#%j%F%#!$N>l9g$N%-!atok.comm->convStatus & M_KEYCONV) { + atokDisplay(obj, &kanjiStatus); + } + + return isThrue; +} + +static ICString * +GetMode(w) +Widget w; +{ + AtokObject obj = (AtokObject)w; + _XatokRecPtr acomm = obj->atok.comm; + int len; + static ICString icstr; + + if (acomm == NULL) return NULL; /* Not connected */ + + icstr.data = (char *)XatokGetModeStr(acomm, &len); + icstr.nchars = len; + icstr.nbytes = icstr.nchars * sizeof(wchar); + icstr.attr = ICAttrNormalString; + + return &icstr; +} + +static int +CursorPos(w, nsegp, ncharp) +Widget w; +Cardinal *nsegp; +Cardinal *ncharp; +{ + AtokObject obj = (AtokObject)w; + _XatokRecPtr acomm = obj->atok.comm; + + if (acomm == NULL) return 0; /* Not connected */ + + return XatokGetSegmentPosition(acomm, nsegp, ncharp); +} + +static int +NumSegments(w) +Widget w; +{ + AtokObject obj = (AtokObject)w; + _XatokRecPtr acomm = obj->atok.comm; + + if (acomm == NULL) return 0; /* Not connected */ + + return XatokGetSegmentNumber(acomm); +} + +static ICString * +GetSegment(w, n) +Widget w; +Cardinal n; +{ + AtokObject obj = (AtokObject)w; + _XatokRecPtr acomm = obj->atok.comm; + int len; + int attr; + static ICString seg; + + if (acomm == NULL) return NULL; /* Not connected */ + + seg.data = (char *)XatokGetSegmentRec(acomm, n, &len, &attr); + seg.nchars = len; + seg.nbytes = seg.nchars * sizeof(wchar); + seg.attr = attr; + + return &seg; +} + +/* ARGSUSED */ +static int +CompareSegment(w, seg1, seg2, n) +Widget w; +ICString *seg1; +ICString *seg2; +Cardinal *n; +{ + wchar *p, *q; + int len, nsame; + int result = 0; + + if (seg1->attr != seg2->attr) result |= ICAttrChanged; + + len = seg1->nchars > seg2->nchars ? seg2->nchars : seg1->nchars; + nsame = 0; + p = (wchar *)seg1->data; + q = (wchar *)seg2->data; + while (nsame < len && *p++ == *q++) nsame++; + + if (nsame != len || len != seg1->nchars || len != seg2->nchars) + result |= ICStringChanged; + + if (n) *n = nsame; + + return result; +} + +static ICString * +GetItemList(w, n) +Widget w; +Cardinal *n; +{ + AtokObject obj = (AtokObject)w; + +#ifdef CAND_PAGE + *n = (CAND_ROWS * CAND_COLS) + 1; /* +1 $B$O(B $B8uJd?t(B */ +#else + *n = obj->atok.nbr_of_cand; +#endif /* CAND_PAGE */ + + return obj->atok.cand_lists_ics; +} + +static int +SelectItem(w, n) +Widget w; +int n; +{ + AtokObject obj = (AtokObject)w; + _XatokRecPtr acomm = obj->atok.comm; + int changed = FALSE; + int status = 0; + + if (acomm == NULL) return -1; /* Not connected */ + + if (n >= 0) obj->atok.selected_cand = n; + + /* ATOK $B$N3NDj(BFUNC$B$r8F$S=P$9!#(B */ + if (changed) { + XtCallCallbackList((Widget)obj, obj->inputConv.fixcallback, + (XtPointer)NULL); + /* ATOK $B$N%P%C%U%!$b(BFLUSH$B$9$k!#(B */ + XtCallCallbackList((Widget)obj, obj->inputConv.textchangecallback, + (XtPointer)NULL); + } + + return status; +} + +static int +ConvertedString(w, encoding, format, length, string) +Widget w; +Atom *encoding; +int *format; +int *length; +XtPointer *string; +{ + AtokObject obj = (AtokObject)w; + _XatokRecPtr acomm = obj->atok.comm; + wchar *wbuf, *wp; + int len, wlen; + extern int convJWStoCT(); + + if (acomm == NULL || acomm->nbr_of_seg == 0 || acomm->offset == 0) + return -1; + + wlen = acomm->segments[acomm->offset -1].length; + wbuf = acomm->segments[acomm->offset -1].string; + + /* + * Atok $B%*%V%8%'%/%H$O(B COMPOUND_TEXT $B%(%s%3!<%G%#%s%0$7$+%5%]!<%H$7$J$$(B + * COMPOUND_TEXT $B$KJQ49$9$k(B + */ + *encoding = XA_COMPOUND_TEXT( XtDisplayOfObject(( Widget )obj )); + *format = 8; + + /* COMPOUND_TEXT $B$O(B \r $B$,Aw$l$J$$$N$G(B \n $B$KJQ49$7$F$*$/(B */ + for (wp = wbuf; *wp != 0; wp++ ) { + if (*wp == '\r') *wp = '\n'; + } + + *length = len = convJWStoCT(wbuf, (unsigned char *)NULL, 0); + *string = XtMalloc(len + 1); + (void)convJWStoCT(wbuf, (unsigned char *)*string, 0); + + XatokShiftLeftAll(acomm); + + return 0; +} + +static int +ClearConversion(w) +Widget w; +{ + AtokObject obj = (AtokObject)w; + _XatokRecPtr acomm = obj->atok.comm; + + if (acomm == NULL) return -1; /* Not connected */ + + XatokClearBuffer(acomm); + XtCallCallbackList((Widget)obj, obj->inputConv.textchangecallback, + (XtPointer)NULL); + return 0; +} + +static ICString * +GetAuxSegments(w, n, ns, nc) +Widget w; +Cardinal *n, *ns, *nc; +{ + AtokObject obj = (AtokObject)w; + Cardinal nseg, nchar; + + if (obj->atok.comm == NULL) return NULL; /* Not connected */ + + if (n) { + *n = obj->atok.aux_nseg; + } + + if (obj->atok.aux_curseg < obj->atok.aux_nseg) { + nseg = obj->atok.aux_curseg; + nchar = 0; + } + else { + nseg = 0; + nchar = obj->atok.aux_length[0]; + } + if (ns) { + *ns = nseg; + } + if (nc) { + *nc = nchar; + } + + return obj->atok.aux_ics; +} + +/* ARGSUSED */ +static int +PreeditString(w, segn, offset, encoding, format, length, string) +Widget w; +int segn; +int offset; +Atom *encoding; +int *format; +int *length; +XtPointer *string; +{ + AtokObject obj = (AtokObject)w; + _XatokRecPtr acomm = obj->atok.comm; + int i; + wchar *wbuf, *wp; + int len, wlen; + extern int convJWStoCT(); + + if (acomm == NULL) return -1; + if (segn < acomm->nbr_of_seg && offset >= acomm->segments[segn].length) { + /* $B%;%0%a%s%H$N:G8e(B */ + ++segn; + offset = 0; + } + if (segn >= acomm->nbr_of_seg || offset >= acomm->segments[segn].length) { + /* $B:o=|$5$l$?(B */ + *encoding = XA_COMPOUND_TEXT(XtDisplayOfObject(w)); + *format = 8; + *length = 0; + *string = (XtPointer)XtMalloc(1); + return 0; + } + + wlen = 0; + for (i = segn; i < acomm->nbr_of_seg; i++) { + wlen += acomm->segments[i].length; + } + wlen -= offset; + + wp = wbuf = (wchar *)XtMalloc((wlen + 1) * sizeof(wchar)); + len = acomm->segments[segn].length - offset; + (void)bcopy((char *)(acomm->segments[segn].string + offset), + (char *)wp, + sizeof(wchar) * len); + wp += len; + for (i = segn + 1; i < acomm->nbr_of_seg; i++) { + len = acomm->segments[i].length; + (void)bcopy((char *)acomm->segments[i].string, + (char *)wp, + sizeof(wchar) * len); + wp += len; + } + wbuf[wlen] = 0; + + /* + * Atok $B%*%V%8%'%/%H$O(B COMPOUND_TEXT $B%(%s%3!<%G%#%s%0$7$+%5%]!<%H$7$J$$(B + * COMPOUND_TEXT $B$KJQ49$9$k(B + */ + *encoding = XA_COMPOUND_TEXT(XtDisplayOfObject((Widget)obj)); + *format = 8; + + /* COMPOUND_TEXT $B$O(B \r $B$,Aw$l$J$$$N$G(B \n $B$KJQ49$7$F$*$/(B */ + for (wp = wbuf; *wp != 0; wp++) { + if (*wp == '\r') *wp = '\n'; + } + + *length = len = convJWStoCT(wbuf, (unsigned char *)NULL, 0); + *string = (XtPointer)XtMalloc(len + 1); + (void)convJWStoCT(wbuf, (unsigned char *)*string, 0); + + /* wbuf $B$r(B free $B$7$F$*$/(B */ + XtFree((char *)wbuf); + + return 0; +} + +/* ARGSUSED */ +static int +StatusString(w, encoding, format, length, string, nchars) +Widget w; +Atom *encoding; +int *format; +int *length; +XtPointer *string; +int *nchars; +{ + ICString *seg; + wchar *wbuf, *wp; + int len, wlen; + extern int convJWStoCT(); + + seg = GetMode(w); + if (seg == NULL) { + *length = *nchars = 0; + return -1; + } + + wlen = seg->nchars; + if (wlen <= 0) { + *length = *nchars = 0; + return -1; + } + + /* + * data $B$KF~$C$F$$$kJQ49%F%-%9%H$O(B null $B%?!<%_%M!<%H$5$l$F$$$J$$$+$b(B + * $B$7$l$J$$$N$G!"$^$:%3%T!<$7$F(B null $B%?!<%_%M!<%H$9$k(B + */ + wbuf = (wchar *)XtMalloc((wlen + 1) * sizeof(wchar)); + (void)bcopy(seg->data, (char *)wbuf, sizeof(wchar) * wlen); + wbuf[wlen] = 0; + + /* + * Canna $B%*%V%8%'%/%H$O(B COMPOUND_TEXT $B%(%s%3!<%G%#%s%0$7$+%5%]!<%H$7$J$$(B + * COMPOUND_TEXT $B$KJQ49$9$k(B + */ + *encoding = XA_COMPOUND_TEXT(XtDisplayOfObject(w)); + *format = 8; + + /* COMPOUND_TEXT $B$O(B \r $B$,Aw$l$J$$$N$G(B \n $B$KJQ49$7$F$*$/(B */ + for (wp = wbuf; *wp != 0; wp++) { + if (*wp == '\r') *wp = '\n'; + } + + *length = len = convJWStoCT(wbuf, (unsigned char *)NULL, 0); + *string = XtMalloc(len + 1); + (void)convJWStoCT(wbuf, (unsigned char *)*string, 0); + *nchars = seg->nchars; + + /* wbuf $B$r(B free $B$7$F$*$/(B */ + XtFree((char *)wbuf); + + return 0; +} + +/* + * Private FUNCTIONS + */ + +static int +bell() +{ + if (displaybell) { + XBell(displaybell, 0); + } + return 0; +} + +static void +fix(obj) +AtokObject obj; +{ + /* $B3NDj$N=hM}(B */ + XtCallCallbackList((Widget)obj, obj->inputConv.fixcallback, + (XtPointer)NULL); /* $B!)!)!)(B */ +} + +static void +fixProcForAtok(obj, fixedstr, fixedlen) +AtokObject obj; +wchar *fixedstr; +int fixedlen; +{ + int offset; + int i; + + offset = obj->atok.comm->offset; + + if (offset < ATOK_NSEG) { + XatokShiftRight(obj->atok.comm); + offset = obj->atok.comm->offset; + } + else { + XatokShiftLeft(obj->atok.comm); + } + copyInWchar(fixedstr, fixedlen, + &(obj->atok.comm->segments[offset-1].string), + &(obj->atok.comm->segments[offset-1].size), + &(obj->atok.comm->segments[offset-1].length)); +} + +/* + * $BJQ49=*N;(B + */ +static void +convend(obj) +AtokObject obj; +{ + XtCallCallbackList((Widget)obj, obj->inputConv.endcallback, + (XtPointer)NULL); +} + +/* + * keeping list of objects + */ +typedef struct _oblist_ { + AtokObject obj; + struct _oblist_ *next; +} ObjRec; + +static ObjRec *ObjList = NULL; + +static void +addObject(obj, sock, clntid, isConnect) +AtokObject obj; +int sock; +int clntid; +int isConnect; +{ + ObjRec *objp = XtNew(ObjRec); + _XatokRecPtr acomm; + char buf[256]; + + objp->obj = obj; + objp->next = ObjList; + ObjList = objp; + + acomm = objp->obj->atok.comm; + /* bzero(acomm, sizeof(_XatokRecPtr)); */ + + acomm->convStatus = M_KEYCONV; /* $B4A;zJQ49(B ON $B$N%b!<%I$K@_Dj(B */ + /* acomm->mode.dsp = 1; /* $B%5!<%P$+$isock, + clntid, objp->obj->atok.comm + /* + &objp->obj->atok.comm->NETrqst, + &objp->obj->atok.comm->NETrslt); + */ + ); + } +} + +static void +deleteObject(obj) +AtokObject obj; +{ + ObjRec *objp, *objp0; + + for (objp0 = NULL, objp = ObjList; + objp != NULL; + objp0 = objp, objp = objp->next) { + if (objp->obj == obj) { + if (objp0 == NULL) { + ObjList = objp->next; + } else { + objp0->next = objp->next; + } + XtFree((char *)objp); + return; + } + } +} + +static void +atokDisplay(obj, kstat) +AtokObject obj; +int *kstat; +{ + wchar *wbuf = obj->atok.comm->wbuf; + int len = obj->atok.comm->wlen; + + /* + * len > 0 $B$N;~$O!"(B atokClntEvent $B$GJQ49$r9T$C$?7k2L!"(B + * $B3NDjJ8;zNs$,$"$k;~$G$"$k!#(B + */ + if (len > 0) { + /* + XtCallCallbackList((Widget)obj, obj->inputConv.fixcallback, + (XtPointer)NULL); + */ + fixProcForAtok(obj, wbuf, len); + fix(obj); + } + changeTextForAtok(obj, kstat); + + /* + * $BI=<($9$kFbMF(B($B%F%-%9%H(B)$B$,JQ$o$C$F$$$?>l9g$K$O!"I=<($7$J$*$9!#(B + */ + if ( obj->atok.textchanged ) { + XtCallCallbackList((Widget)obj, obj->inputConv.textchangecallback, + (XtPointer)NULL); + obj->atok.textchanged = False; + } +} + +static int +atokCandDisplay(obj, aajcode) +AtokObject obj; +int aajcode; +{ + int status = 0; + + /* + * $B8uJd%&%$%s%I%&I=<(;~$N%-!atok.cur_cand = -1; + break; + case CTR_DEL: /* 616 */ + case EESC: + case FUNC_CNV_CANCL: /* 1999/06/30 */ + endSelection(obj, TRUE, TRUE); + obj->atok.cur_cand = -1; + status = 1; + break; + case 0: + default: + break; + } + return status; +} + +static int +atokAuxDisplay(obj, op) +AtokObject obj; +opMode op; +{ + ICAuxControlArg arg; + int status = 1; + + switch (obj->atok.comm->menuStatus) { + case ICAuxEnd : + if (obj->atok.comm->convStatus & op) { + obj->atok.comm->convStatus ^= op; + } + obj->atok.comm->convStatus |= M_KEYCONV; + status = 0; + case ICAuxStart : + case ICAuxChange : + arg.command = obj->atok.comm->menuStatus; + break; + default : + return -1; + } + if (arg.command != ICAuxEnd) { + changeTextForAtokAUX(&obj->atok); + } + + XtCallCallbackList((Widget)obj, obj->inputConv.auxcallback, + (XtPointer)&arg); + + return status; +} + +/* + * Utils + */ +/* + * $B8uJd0lMwI=<($N4X?t74(B + */ +/* + * $B40(B + */ +static void +moveLeft(obj, cand_page) +AtokObject obj; +int cand_page; +{ + _XatokRecPtr comm; + int pgMax; + int move = TRUE; + ICSelectionControlArg arg; + int kohoNum; + + if (!cand_page) { + moveSelection(obj, ICMoveLeft); + return; + } + comm = obj->atok.comm; + + querySelection(obj); + pgMax = comm->kohoMax; + + if (comm->kohoPos == 0) { + /* + * $B:G8e$N%Z!<%8$rI=<($7$F$$$k!#(B + */ + if (comm->kohoCurPage + 1 == comm->kohoPageNbr) { + /* + * $B:G8e$N%Z!<%8$@$,!":G=i$N%Z!<%8$G$"$k(B + * $B$7$?$,$C$FJQ99$9$k%Z!<%8$O$J$$!#(B + */ + if (comm->kohoCurPage == 0) { + move = TRUE; + } + else { + comm->kohoCurPage--; + move = FALSE; + } + } + else if (comm->kohoCurPage == 0) { + comm->kohoCurPage = comm->kohoPageNbr - 1; + move = FALSE; + } + else { + comm->kohoCurPage--; + move = FALSE; + } + } + + if (move == FALSE) { + endSelection(obj, FALSE, FALSE); + kohoNum = comm->kohoNum2 > (comm->kohoCurPage + 1) * pgMax ? + pgMax - 1 : comm->kohoNum2 - (comm->kohoCurPage * pgMax) - 1; + makeCandList(obj, obj->atok.cand_lists_ics, pgMax, pgMax + 1, + comm->kohoCurPage, kohoNum, 1); + return; + } + + moveSelection(obj, ICMoveLeft); +} + +static void +moveRight(obj, cand_page) +AtokObject obj; +int cand_page; +{ + _XatokRecPtr comm; + int pgMax; + int move = TRUE; + int kohoNum; + ICSelectionControlArg arg; + + if (!cand_page) { + moveSelection(obj, ICMoveRight); + return; + } + comm = obj->atok.comm; + + querySelection(obj); + /* pgMax = CAND_COLS * CAND_ROWS; */ + pgMax = comm->kohoMax; + + if (comm->kohoPos == pgMax - 1) { + if (comm->kohoNum2 > (comm->kohoCurPage + 1) * pgMax) { + comm->kohoCurPage++; + } + else { + comm->kohoCurPage = 0; + } + move = FALSE; + comm->kohoPos = 0; + } + else if (comm->kohoPos == comm->kohoNum2 - (comm->kohoCurPage * pgMax) - 1) + { + /* if (comm->kohoCurPage != 0) move = FALSE; */ + comm->kohoCurPage = 0; + move = FALSE; + comm->kohoPos = 0; + } + if (move == FALSE) { + endSelection(obj, FALSE, FALSE); + makeCandList(obj, obj->atok.cand_lists_ics, pgMax, pgMax + 1, + comm->kohoCurPage, 0, 1); + comm->kohoPos = 0; + return; + + } + + moveSelection( obj, ICMoveRight ); +} + +static void +setSelection(obj, kohoNum) +AtokObject obj; +int kohoNum; +{ + ICSelectionControlArg arg; + + /* Set current candidate */ + arg.command = ICSelectionSet; + arg.u.current_item = kohoNum; /* $B8uJd(BNO$B$r@_Dj$9$k;v(B */ + XtCallCallbackList((Widget)obj, obj->inputConv.selectioncallback, + (XtPointer)&arg); +} + +static void +moveSelection(obj, dir) +AtokObject obj; +int dir; +{ + ICSelectionControlArg arg; + + arg.command = ICSelectionMove; + arg.u.dir = dir; + XtCallCallbackList((Widget)obj, obj->inputConv.selectioncallback, + (XtPointer)&arg); + querySelection(obj); +} + +static void +querySelection(obj) +AtokObject obj; +{ + ICSelectionControlArg arg; + arg.command = ICSelectionGet; + arg.u.current_item = -1; + XtCallCallbackList((Widget)obj, obj->inputConv.selectioncallback, + (XtPointer)&arg); + + obj->atok.selected_cand = arg.u.current_item; + obj->atok.comm->kohoPos = arg.u.current_item; +} + +static void +endSelection(obj, isabort, modeChange) +AtokObject obj; +int isabort; +int modeChange; +{ + ICSelectionControlArg arg; + int selected; + + if (modeChange) { + obj->atok.comm->convStatus ^= M_CAND; + } + arg.command = ICSelectionEnd; + arg.u.current_item = -1; + XtCallCallbackList((Widget)obj, obj->inputConv.selectioncallback, + (XtPointer)&arg); + + if (!isabort && (selected = arg.u.current_item) >= 0) { + insertSelection(obj, selected); + } +} + +static void +insertSelection(obj, selected) +AtokObject obj; +int selected; +{ + obj->atok.cur_cand = selected; + obj->atok.comm->kohoPos = selected; + + /* + * ATOK CE $B$KA*Br$5$l$?$3$H$rDLCN$9$kI,MW$"$j(B + * API$B$,2r$je(B $B3NJ]$5$l$F$$$k>l9g$K$O2?$b$7$J$$!#(B + */ + if (nbr <= obj->atok.cand_list_size) { + return nbr; + } + + /* + * $B$^$@(B $B3NJ]$5$l$F$$$J$$;~$K$O!"?75,$K!"4{$K(B + * $B3NJ]$5$l$F$$$kNN0h$r9-$2$?$$;~$K$O(B realloc $B$9$k!#(B + */ + if (obj->atok.cand_list_size == 0) { + p = (ICString *)XtMalloc(nbr * sizeof(ICString)); + } + else { + p = (ICString *)XtRealloc((char *)obj->atok.cand_lists_ics, + nbr * sizeof(ICString)); + } + obj->atok.cand_lists_ics = p; + obj->atok.cand_list_size = nbr; + *cur = 0; + + return nbr; +} + +/* + * $B%-!atok.comm; + int remain; + int offset = acomm->offset; + int len = acomm->echoLen; + int i; + wchar *wp; + + if (len == 0) { + acomm->cur_seg = offset; + acomm->nbr_of_seg = offset; + acomm->segments[offset+0].length + = acomm->segments[offset+1].length + = acomm->segments[offset+2].length = 0; + if (*kstat == XKEY_FIX) { + obj->atok.textchanged = TRUE; + } + obj->atok.textchanged = TRUE; + } + else if (len > 0) { + /* $B%-!l9g(B */ + acomm->segments[offset+1].length + = acomm->segments[offset+2].length = 0; + if (acomm->revLen > 0) { + if ( acomm->revPos == 0 ) { + remain = acomm->echoLen - acomm->revLen; + /* + * REVERSE : + * REVERSE : NORMAL + * $BH?E>I=<($,#1%;%0%a%s%HL\$N>l9g$K$O(B + * str[0] $B$KJ8;z$rB-$9(B + */ + copyInWchar(acomm->echoStr, acomm->revLen, + &(acomm->segments[offset+0].string), + &(acomm->segments[offset+0].size), + &(acomm->segments[offset+0].length)); + acomm->cur_seg = offset; + acomm->nbr_of_seg = offset + 1; + /* + * $B#2%;%0%a%s%HL\$,B8:_$9$k>l9g$K$O!"(B + * $B#2%;%0%a%s%HL\$b@_Dj$9$k!#(B + */ + if (remain) { + copyInWchar(acomm->echoStr + acomm->revLen, remain, + &(acomm->segments[offset+1].string), + &(acomm->segments[offset+1].size), + &(acomm->segments[offset+1].length)); + acomm->nbr_of_seg = offset+2; + } + } + else { + /* + * NORMAL : REVERSE + * NORAML : REVERSE : NORMAL + * + * $B$3$3$K$/$k$H$-$O(B $B#2HVL\0J9_$J$N$G(B str0, + * str1 $B$O@dBP$KB8:_$9$k!#(B + * $BH?E>I=<($,$"$j!"3n$D#1%;%0%a%s%H$,%N!<%^%k(B + * $BI=<($H$$$&;v$O#2%;%0%a%s%HL\$,H?E>I=<($G(B + * $B$"$k!#(B + */ + remain = acomm->echoLen - acomm->revPos - acomm->revLen; + copyInWchar(acomm->echoStr, acomm->revPos, + &(acomm->segments[offset+0].string), + &(acomm->segments[offset+0].size), + &(acomm->segments[offset+0].length)); + copyInWchar(acomm->echoStr + acomm->revPos, acomm->revLen, + &(acomm->segments[offset+1].string), + &(acomm->segments[offset+1].size), + &(acomm->segments[offset+1].length)); + acomm->cur_seg = offset+1; + acomm->nbr_of_seg = offset+2; + /* + * NORMAL : REVERSE : NORMAL $B$N>l9g(B + */ + if (remain){ + copyInWchar(acomm->echoStr + acomm->revPos + acomm->revLen, + remain, + &(acomm->segments[offset+2].string), + &(acomm->segments[offset+2].size), + &(acomm->segments[offset+2].length)); + acomm->nbr_of_seg = offset+3; + } + } + } + else { + /* + * NORMAL $BI=<((BONLY + */ + copyInWchar(acomm->echoStr, acomm->echoLen, + &(acomm->segments[offset+0].string), + &(acomm->segments[offset+0].size), + &(acomm->segments[offset+0].length)); + acomm->segments[1].length = acomm->segments[2].length = 0; + acomm->nbr_of_seg = offset+1; + acomm->cur_seg = offset+1; + } + obj->atok.textchanged = TRUE; + } +} + +static int +changeTextForAtokAUX(obj) +AtokPart *obj; +{ + int remain; + int len; + int i; + _XatokRecPtr acomm = obj->comm; + + /* + * $B$3$3$G(B AUX $B$KI=<($9$kJ8;z$r:n@.$9$k!#(B + */ + if (obj->comm->convStatus & M_SYSLINE) { + auxSyslineString(acomm, acomm->curAux, + acomm->aux_echoStr, &acomm->aux_echoLen, + &acomm->aux_revLen, &acomm->aux_revPos); + } + else { + auxMenuString(acomm, acomm->curAux, + acomm->aux_echoStr, &acomm->aux_echoLen, + &acomm->aux_revLen, &acomm->aux_revPos); + } + /* + * $BI=<($9$kJ8;z$,$J$$>l9g$O%j%?!<%s$9$k!#(B + */ + if ( acomm->aux_echoLen == 0 ) { + obj->aux_curseg = 0; + obj->aux_nseg = 0; + obj->aux_length[0] = obj->aux_length[1] = obj->aux_length[2] = 0; + return 0; + } + obj->aux_length[1] = obj->aux_length[2] = 0; + if (acomm->aux_revLen > 0) { + if (acomm->aux_revPos == 0) { + remain = acomm->aux_echoLen - acomm->aux_revLen; + copyInWchar(acomm->aux_echoStr, acomm->aux_revLen, + &obj->aux_string[0], + &obj->aux_size[0], + &obj->aux_length[0]); + obj->aux_curseg = 0; + obj->aux_nseg = 1; + /* + * $B#2%;%0%a%s%HL\$,B8:_$9$k>l9g$K$O!"(B + * $B#2%;%0%a%s%HL\$b@_Dj$9$k!#(B + */ + if (remain) { + copyInWchar(acomm->aux_echoStr + acomm->aux_revLen, remain, + &obj->aux_string[1], + &obj->aux_size[1], + &obj->aux_length[1]); + obj->aux_nseg = 2; + } + } + else { + /* + * NORMAL : REVERSE + * NORAML : REVERSE : NORMAL + * + * $B$3$3$K$/$k$H$-$O(B $B#2HVL\0J9_$J$N$G(B str0, + * str1 $B$O@dBP$KB8:_$9$k!#(B + * $BH?E>I=<($,$"$j!"3n$D#1%;%0%a%s%H$,%N!<%^%k(B + * $BI=<($H$$$&;v$O#2%;%0%a%s%HL\$,H?E>I=<($G(B + * $B$"$k!#(B + */ + remain = acomm->aux_echoLen - acomm->aux_revPos - acomm->aux_revLen; + copyInWchar(acomm->aux_echoStr, acomm->aux_revPos, + &obj->aux_string[0], + &obj->aux_size[0], + &obj->aux_length[0]); + copyInWchar(acomm->aux_echoStr + acomm->aux_revPos, + acomm->aux_revLen, + &obj->aux_string[1], + &obj->aux_size[1], + &obj->aux_length[1]); + obj->aux_curseg = 1; + obj->aux_nseg = 2; + /* + * NORMAL : REVERSE : NORMAL $B$N>l9g(B + */ + if (remain) { + copyInWchar(acomm->aux_echoStr + acomm->aux_revPos + + acomm->aux_revLen, + remain, + &obj->aux_string[2], + &obj->aux_size[2], + &obj->aux_length[2] ); + obj->aux_nseg = 3; + } + } + } + else { + /* + * NORMAL $BI=<((BONLY + */ + copyInWchar(acomm->aux_echoStr, acomm->aux_echoLen, + &obj->aux_string[0], + &obj->aux_size[0], + &obj->aux_length[0]); + obj->aux_length[1] = obj->aux_length[1] = 0; + obj->aux_nseg = 1; + obj->aux_curseg = 1; + } + + for (i = 0; i < obj->aux_nseg; i++) { + obj->aux_ics[i].data = (char *)obj->aux_string[i]; + obj->aux_ics[i].nchars = obj->aux_length[i]; + obj->aux_ics[i].nbytes = obj->aux_length[i] * sizeof(wchar); + obj->aux_ics[i].attr = ICAttrConverted; + } + if (obj->aux_curseg < obj->aux_nseg) { + obj->aux_ics[obj->aux_curseg].attr |= ICAttrCurrentSegment; + } + return obj->aux_nseg; +} + +/* + * $B8uJdJ8;zNs4X78$N%=!<%9(B + */ + +/* Page */ +/* + * [$B4X?tL>(B] + * () + * [$BI=Bj(B] + * + * [$B8F=P7A<0(B] + * + * [$B0z?t(B] + * $B7?(B : $BL>(B $B>N(B : IO : $B@b(B $BL@(B + * + * + * [$BJV$jCM(B] + * + * [$B;HMQ4X?t(B] + * + * [$B5!G=(B] + * Event $B$,H/@8$7$F!"(B CE$B$h$j(B $B8uJd%j%9%H$,atok.comm; + ICString *icsp; + int i, n; + int pgMax; + int oldSize; + + n = obj->atok.nbr_of_cand = comm->kohoNum2; + if (cand_page) { + pgMax = CAND_COLS * CAND_ROWS; + } + else { + pgMax = n; + } + comm->kohoMax = pgMax; + + comm->kohoPageNbr = (comm->kohoNum2 + pgMax - 1) / pgMax; + comm->kohoCurPage = 0; /* $B%Z!<%8$O#0$+$i;O$^$k!#(B*/ + /* comm->kohoPos = 1; /* ATOKCE $B$N%j%?!<%s$r@_Dj(B */ + + /* + * $B$^$:$O(B $B8uJd$r@_Dj$9$k(BICSString $B$N%a%b%j!<$r3NJ]$7$F!"(B + * $B=i4|2=$9$k!#(B + */ + oldSize = obj->atok.cand_list_size; + if (cand_page) { + /* + * $B8uJdI=<($N:GBg?t$,7h$^$C$F$$$k>l9g$O!"(B + * $B8uJd$N$?$a$N(BICS $B$,l9g$7$+$J$$(B + */ + n = pgMax + 1; /* +1 $B$O8uJdHV9fI=<(MQ(B */ + if (obj->atok.cand_list_size == 0) { + icsp = (ICString *)XtMalloc(n * sizeof(ICString)); + obj->atok.cand_list_size = n; + obj->atok.cand_lists_ics = icsp; + } + } + else { + if (obj->atok.cand_list_size == 0) { + icsp = (ICString *)XtMalloc(n * sizeof(ICString)); + obj->atok.cand_list_size = n; + obj->atok.cand_lists_ics = icsp; + } + else if (obj->atok.cand_list_size < n) { + icsp = (ICString *)XtRealloc((char *)obj->atok.cand_lists_ics, + n * sizeof(ICString)); + obj->atok.cand_list_size = n; + obj->atok.cand_lists_ics = icsp; + } + else { + icsp = obj->atok.cand_lists_ics; + } + } + + /* + * $Batok.cand_lists_ics; +#ifdef CAND_PAGE + makeCandList(obj, icsp, pgMax, n, comm->kohoPos / pgMax, comm->kohoPos, 1); +#else + makeCandList(obj, icsp, pgMax, n, comm->kohoPos / pgMax, comm->kohoPos, 0); +#endif +} + +static int +makeCandList(obj, icsp, pgMax, icsNum, page, kohoNum, cand_page) +AtokObject obj; +ICString *icsp; /* $BI=<(MQ%G!<%?(B */ +int pgMax; /* $B#1%Z!<%8$N:GBg?t(B */ +int icsNum; +int page; /* $BI=<($9$k%Z!<%8(B */ +int kohoNum; +int cand_page; +{ + _XatokRecPtr comm = obj->atok.comm; + int i, j, n; + int len, ksize, klen; + int bytes, chars; + int es; + unsigned char *ep; + wchar wbuf[BUFSIZ]; + char euc[BUFSIZ]; + int stNbr; + int maxCand = 0; + ICSelectionControlArg arg; + ICString *ticsp = icsp; /* $BI=<(MQ%G!<%?(B */ + + for (i = 0; i < icsNum; i++, ticsp++) { + /* if (i < oldSize) continue; */ + ticsp->nbytes = (unsigned short)0; + ticsp->nchars = (unsigned short)0; + ticsp->data = (char *)0; + ticsp->attr = 0; + } + stNbr = page * pgMax; + + ksize = 0; + for(i = 0; i < stNbr; i++) { + ksize += comm->kohoLenPtr[i]; + } + if (cand_page) { + n = comm->kohoNum2 - stNbr > pgMax ? pgMax : comm->kohoNum2 - stNbr; + } + else { + n = pgMax; + } + for (j = 0; j < n; j++) { + bzero(euc, sizeof(euc)); + klen = comm->kohoLenPtr[i]; + es = klen * 3; + ep = (unsigned char *)XtMalloc(es); + bzero(ep, es); + ucs2euc(&comm->kohoStrPtr[ksize], klen, ep, es, 0x0000a2ae); + es = strlen(ep); + ksize += klen; +#ifdef CAND_PAGE + sprintf(euc, "%2d %s", j + 1, ep); +#else + strcpy(euc, ep); +#endif + es = strlen(euc); + es = euc2wcs(euc, es, wbuf); + XtFree((char *)ep); + + bytes = (int)icsp->nbytes; + chars = (int)icsp->nchars; + copyInWchar(wbuf, es, (wchar **)&(icsp->data), &bytes, &chars); + icsp->nbytes = (unsigned short)bytes; + icsp->nchars = (unsigned short)chars; + if (chars > maxCand) { + maxCand = chars; + } + icsp->attr = ICAttrNormalString; + icsp++; + i++; + } + for(; j < pgMax; j++) { + icsp->nbytes = (unsigned short)0; + icsp->nchars = (unsigned short)0; + icsp->attr = ICAttrNormalString; + icsp->data = (char *)0; + icsp++; + } + if (cand_page) { +#if SHOW_PAGE + sprintf(euc, "%d/%d", page * pgMax + 1, comm->kohoNum2); +#else + sprintf(euc, "Page %d/%d", page + 1, + (comm->kohoNum2 + pgMax - 1) / pgMax); +#endif + es = strlen(euc); + es = euc2wcs(euc, es, wbuf); + bytes = (int)icsp->nbytes; + chars = (int)icsp->nchars; + copyInWchar(wbuf, es, ( wchar ** )&( icsp->data ), &bytes, &chars); + + icsp->nbytes = (unsigned short)bytes; + icsp->nchars = (unsigned short)chars; + icsp->attr = ICAttrNormalString; + } + + comm->kohoCurPage = page; + + arg.command = ICSelectionStart; + arg.u.selection_kind = ICSelectionCandidates; + XtCallCallbackList((Widget)obj, obj->inputConv.selectioncallback, + (XtPointer)&arg); + + /* Set current candidate */ + arg.command = ICSelectionSet; + arg.u.current_item = kohoNum; /* $B8uJd(BNO$B$r@_Dj$9$k;v(B */ + XtCallCallbackList((Widget)obj, obj->inputConv.selectioncallback, + (XtPointer)&arg); + + return page; +} + + +/* + copyInWchar -- wchar $B$r%3%T!<$9$k!#(B + + ws, wlen $B$G<($5$l$?(B wchar $BJ8;zNs$r(B wsbuf $B$N%]%$%s%H@h$N%P%C%U%!$K3J(B + $BG<$9$k!#(Bwsbuf $B$N%5%$%:$O(B wssize $B$N%]%$%s%H@h$K3JG<$5$l$F$$$kCM$G;X(B + $BDj$5$l$k$,!"$=$l$G$O>.$5$$;~$O(B copyInWchar $BFb$G(B XtRealloc $B$5$l!"?7(B + $B$?$K%"%m%1!<%H$5$l$?%P%C%U%!$,(B wsbuf $B$N%]%$%s%H@h$K3JG<$5$l$k!#$^$?!"(B + $B%P%C%U%!$N?7$?$J%5%$%:$,(B wssize $B$N%]%$%s%H@h$K3JG<$5$l$k!#F@$i$l$?(B + $BJ8;z?t$,(Bwslen $B$N%]%$%s%H@h$K3JG<$5$l$k!#(B +*/ +static void +copyInWchar(ws, wlen, wsbuf, wssize, wslen) +wchar *ws; +int wlen; +wchar **wsbuf; +int *wssize; +int *wslen; +{ + int i; + + if (*wssize == 0) { + *wsbuf = (wchar *)XtMalloc((wlen + 1) * sizeof(wchar)); + *wssize = wlen + 1; + } + if (wlen + 1 > *wssize) { + *wsbuf = (wchar *)XtRealloc((char *)*wsbuf, (wlen + 1) * sizeof(wchar)); + *wssize = wlen + 1; + } + *wslen = wlen; + (void)bcopy(ws, *wsbuf, wlen * sizeof(wchar)); + *(*wsbuf + wlen) = (wchar)0; +} +/* Atok.c */ diff -r 000000000000 -r 92745d501b9a lib/AuxPanel.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/AuxPanel.c Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,606 @@ +#ifndef lint +static char *rcsid = "$Id: AuxPanel.c,v 1.23 1994/09/01 06:33:41 ishisone Exp $"; +#endif +/* + * Copyright (c) 1990 Software Research Associates, Inc. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Software Research Associates not be + * used in advertising or publicity pertaining to distribution of the + * software without specific, written prior permission. Software Research + * Associates makes no representations about the suitability of this software + * for any purpose. It is provided "as is" without express or implied + * warranty. + * + * Author: Makoto Ishisone, Software Research Associates, Inc., Japan + */ + +/* Copyright 1991 NEC Corporation, Tokyo, Japan. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, + * provided that the above copyright notice appear in all copies and that + * both that copyright notice and this permission notice appear in + * supporting documentation, and that the name of NEC Corporation + * not be used in advertising or publicity pertaining to distribution + * of the software without specific, written prior permission. NEC + * Corporation makes no representations about the suitability of this + * software for any purpose. It is provided "as is" without express + * or implied warranty. + * + * NEC CORPORATION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN + * NO EVENT SHALL NEC CORPORATION BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF + * USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR + * OTHER TORTUOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + * + * Author: Akira Kon, NEC Corporation. (kon@d1.bs2.mt.nec.co.jp) + */ + +/* + $BLdBjE@(B + $B!&J8;zIA2h$,A4It=q$-D>$7=hM}$K$J$C$F$$$k!#(B + $B!&$@$l$b(B Destroy $B$r8F$s$G$/$l$J$$$N$G$A$g$C$H$4$_$,;D$k!#(B + */ + +#include +#include +#if XtSpecificationRelease > 4 +#include +#endif +#include "AuxPanelP.h" +#include "ConvDisp.h" +#include "WStr.h" + +#define DEBUG_VAR debug_AuxPanel +#include "DebugPrint.h" + +static XtResource resources[] = { +#define offset(field) XtOffset(AuxPanelWidget, cpanel.field) + { XtNforeground, XtCForeground, XtRPixel, sizeof(Pixel), + offset(foreground), XtRString, XtDefaultForeground }, + { XtNhorizontalSpacing, XtCSpacing, XtRDimension, sizeof(Dimension), + offset(hspace), XtRString, "6" }, + { XtNverticalSpacing, XtCSpacing, XtRDimension, sizeof(Dimension), + offset(vspace), XtRString, "4" }, + { XtNdefaultWidth, XtCDefaultWidth, XtRDimension, sizeof(Dimension), + offset(defaultwidth), XtRString, "400" }, + { XtNcursor, XtCCursor, XtRCursor, sizeof(Cursor), + offset(cursor), XtRImmediate, (XtPointer)None }, + { XtNcallback, XtCCallback, XtRCallback, sizeof(XtPointer), + offset(callback), XtRCallback, NULL }, +#undef offset +}; + +static void Initialize(), Destroy(); +static void Realize(); +static void Redisplay(); +static void Resize(); +static Boolean SetValues(); +static XtGeometryResult QueryGeometry(); +static void InsertChild(); + +static void GetInvGC(); +static void ComputeSize(); +static void Layout(); + +static void freeDisplaySegments(); +static void UpdateAuxDisplay(); + +static CompositeClassExtensionRec CompositeExtension = { + /* next_extension */ NULL, + /* record_type */ NULLQUARK, + /* version */ XtCompositeExtensionVersion, + /* record_size */ sizeof(CompositeClassExtensionRec), + /* accept_objects */ True, +}; + +AuxPanelClassRec auxPanelClassRec = { + { /* core fields */ + /* superclass */ (WidgetClass) &compositeClassRec, + /* class_name */ "AuxPanel", + /* widget_size */ sizeof(AuxPanelRec), + /* class_initialize */ NULL, + /* class_part_initialize */ NULL, + /* class_inited */ FALSE, + /* initialize */ Initialize, + /* initialize_hook */ NULL, + /* realize */ Realize, + /* actions */ NULL, + /* num_actions */ 0, + /* resources */ resources, + /* num_resources */ XtNumber(resources), + /* xrm_class */ NULLQUARK, + /* compress_motion */ TRUE, + /* compress_exposure */ TRUE, + /* compress_enterleave */ TRUE, + /* visible_interest */ FALSE, + /* destroy */ Destroy, + /* resize */ Resize, + /* expose */ Redisplay, + /* set_values */ SetValues, + /* set_values_hook */ NULL, + /* set_values_almost */ XtInheritSetValuesAlmost, + /* get_values_hook */ NULL, + /* accept_focus */ NULL, + /* version */ XtVersion, + /* callback_private */ NULL, + /* tm_table */ NULL, + /* query_geometry */ QueryGeometry, + /* display_accelerator */ XtInheritDisplayAccelerator, + /* extension */ NULL + }, + { /* composite fields */ + /* geometry_manager */ NULL, + /* change_managed */ NULL, + /* insert_child */ InsertChild, + /* delete_child */ XtInheritDeleteChild, + /* extension */ (XtPointer)&CompositeExtension, + }, + { /* auxpanel fields */ + /* empty */ 0 + } +}; + +WidgetClass auxPanelWidgetClass = (WidgetClass)&auxPanelClassRec; + +/* ARGSUSED */ +static void +Initialize(req, new, args, num_args) +Widget req; +Widget new; +ArgList args; +Cardinal *num_args; +{ + AuxPanelWidget cpw = (AuxPanelWidget)new; + + TRACE(("AuxPanel:Initialize()\n")); + + cpw->cpanel.displayobj = NULL; + cpw->cpanel.dispauxsegments = NULL; + cpw->cpanel.dispauxsegmentsize = 0; + cpw->cpanel.numauxsegments = 0; + GetInvGC(cpw); +} + +static void +Destroy(w) +Widget w; +{ + AuxPanelWidget cpw = (AuxPanelWidget)w; + + TRACE(("AuxPanel:Destroy()\n")); + + freeDisplaySegments(cpw); + if (cpw->cpanel.invgc != NULL) XtReleaseGC(w, cpw->cpanel.invgc); +} + +static void +Realize(w, mask, value) +Widget w; +XtValueMask *mask; +XSetWindowAttributes *value; +{ + AuxPanelWidget cpw = (AuxPanelWidget)w; + CompositeWidgetClass super = (CompositeWidgetClass)XtClass(w)->core_class.superclass; + String params[1]; + Cardinal num_params; + + TRACE(("AuxPanel:Realize()\n")); + + if (cpw->cpanel.displayobj == NULL) { + params[0] = XtClass(w)->core_class.class_name; + num_params = 1; + XtAppErrorMsg(XtWidgetToApplicationContext(w), + "childError", "number", "WidgetError", + "%s: has no child (ConvDisplayObject)", + params, &num_params); + } + + if (cpw->cpanel.cursor != None) { + *mask |= CWCursor; + value->cursor = cpw->cpanel.cursor; + } + + (*super->core_class.realize)(w, mask, value); +} + +/* ARGSUSED */ +static void +Redisplay(w, ev, region) +Widget w; +XEvent *ev; +Region region; +{ + AuxPanelWidget cpw = (AuxPanelWidget)w; + XExposeEvent *event = (XExposeEvent *)ev; + DisplaySegment *dseg; + int cheight, hspace, vspace; + int x, i; + + TRACE(("AuxPanel:Redisplay()\n")); + + cheight = cpw->cpanel.fontheight; + hspace = cpw->cpanel.hspace; + vspace = cpw->cpanel.vspace; + + if (event->y + event->height < vspace / 2 + || cheight + vspace / 2 < event->y) + return; + + for (i = 0, x = hspace / 2, dseg = cpw->cpanel.dispauxsegments; + i < cpw->cpanel.numauxsegments ; i++, dseg++) { + if (x < event->x + event->width && event->x < x + dseg->width) { + dseg->redrawpos = 0; + } + else { + dseg->redrawpos = -1; /* $B=q$-D>$9I,MW$,$J$$(B */ + } + x += dseg->width; + } + + UpdateAuxDisplay(cpw); +} + +static void +Resize(w) +Widget w; +{ + AuxPanelWidget cpw = (AuxPanelWidget)w; + + TRACE(("AuxPanel:Resize()\n")); + + Layout(cpw, True, True); +} + +/* ARGSUSED */ +static Boolean +SetValues(cur, req, wid, args, num_args) +Widget cur; +Widget req; +Widget wid; +ArgList args; +Cardinal *num_args; +{ + AuxPanelWidget old = (AuxPanelWidget)cur; + AuxPanelWidget new = (AuxPanelWidget)wid; + Boolean redisplay = False; + + TRACE(("AuxPanel:SetValues()\n")); + + if (new->cpanel.displayobj == NULL) return False; + + if (new->cpanel.foreground != old->cpanel.foreground || + new->core.background_pixel != old->core.background_pixel) { + XtVaSetValues(new->cpanel.displayobj, + XtNforeground, new->cpanel.foreground, + XtNbackground, new->core.background_pixel, + NULL); + redisplay = True; + } + + if (new->cpanel.numauxsegments > 0 || + new->cpanel.hspace != old->cpanel.hspace || + new->cpanel.vspace != old->cpanel.vspace || + new->cpanel.defaultwidth != old->cpanel.defaultwidth) { + Layout(new, True, True); + redisplay = True; + } + + if (new->cpanel.cursor != old->cpanel.cursor && XtIsRealized(wid)) { + XDefineCursor(XtDisplay(wid), XtWindow(wid), new->cpanel.cursor); + } + + return redisplay; +} + +static XtGeometryResult +QueryGeometry(w, req, ret) +Widget w; +XtWidgetGeometry *req; +XtWidgetGeometry *ret; +{ + Dimension width, height; + Dimension owidth, oheight; + + TRACE(("AuxPanel:QueryGeometry()\n")); + + ret->request_mode = 0; + + if ((req->request_mode & (CWWidth | CWHeight)) == 0) return XtGeometryYes; + + width = (req->request_mode & CWWidth) ? req->width : w->core.width; + height = (req->request_mode & CWHeight) ? req->height : w->core.height; + + owidth = width; + oheight = height; + ComputeSize((AuxPanelWidget)w, + (req->request_mode & CWWidth) != 0, + (req->request_mode & CWHeight) != 0, + &width, &height); + ret->request_mode = CWWidth | CWHeight; + ret->width = width; + ret->height = height; + + if (width != owidth || height != oheight) return XtGeometryAlmost; + + return XtGeometryYes; +} + +static void +InsertChild(w) +Widget w; +{ + AuxPanelWidget cpw = (AuxPanelWidget)XtParent(w); + CompositeWidgetClass super = (CompositeWidgetClass)XtClass(cpw)->core_class.superclass; + String params[1]; + Cardinal num_params; + + TRACE(("AuxPanel:InsertChild()\n")); + + if (!XtIsSubclass(w, convDisplayObjectClass)) { + params[0] = XtClass(cpw)->core_class.class_name; + num_params = 1; + XtAppErrorMsg(XtWidgetToApplicationContext(w), + "childError", "class", "WidgetError", + "%s: child must be subclass of ConvDisplayObject", + params, &num_params); + } + if (cpw->composite.num_children != 0) { + params[0] = XtClass(cpw)->core_class.class_name; + num_params = 1; + XtAppErrorMsg(XtWidgetToApplicationContext(w), + "childError", "number", "WidgetError", + "%s: can only take one child", + params, &num_params); + } + + (*super->composite_class.insert_child)(w); + + cpw->cpanel.displayobj = w; + cpw->cpanel.fontheight = CDLineHeight(w, (Position *)NULL); + +#ifdef notdef + { + Pixel fg, bg; + XtVaGetValues(w, XtNforeground, &fg, XtNbackground, &bg, NULL); + GetInvGC(cpw, fg, bg); + } +#endif + + if (cpw->cpanel.numauxsegments > 0) { + Layout(cpw, cpw->core.width == 0, cpw->core.height == 0); + } +} + +static void +GetInvGC(cpw) +AuxPanelWidget cpw; +{ + XGCValues values; + + TRACE(("AuxPanel:GetInvGC()\n")); + + values.function = GXinvert; + values.plane_mask = cpw->cpanel.foreground ^ cpw->core.background_pixel; + cpw->cpanel.invgc = XtGetGC((Widget)cpw, GCFunction|GCPlaneMask, &values); +} + +/* ARGSUSED */ +static void +ComputeSize(cpw, resizex, resizey, width_inout, height_inout) +AuxPanelWidget cpw; +int resizex; +int resizey; +Dimension *width_inout; +Dimension *height_inout; +{ + int width, height; + int i, minwidth = 0; + DisplaySegment *dseg = cpw->cpanel.dispauxsegments; + + + TRACE(("AuxPanel:ComputeSize()\n")); + + if (cpw->cpanel.displayobj == NULL) return; + + width = *width_inout; + height = *height_inout; + + for (i = 0 ; i < cpw->cpanel.numauxsegments ; i++, dseg++) { + minwidth += CDStringWidth(cpw->cpanel.displayobj, &dseg->seg, 0, -1); + } + minwidth += cpw->cpanel.hspace * 2; + if (resizex) { + width = minwidth; + } else { + width = (cpw->core.width < minwidth) ? minwidth : cpw->core.width; + } + height = cpw->cpanel.fontheight + cpw->cpanel.vspace; + *width_inout = width; + *height_inout = height; +} + +static void +Layout(cpw, resizex, resizey) +AuxPanelWidget cpw; +int resizex; +int resizey; +{ + Dimension width, height; + Dimension owidth, oheight; + XtGeometryResult re; + + TRACE(("AuxPanel:Layout()\n")); + + if (cpw->cpanel.displayobj == NULL) return; + + width = cpw->core.width; + height = cpw->core.height; + ComputeSize(cpw, resizex, resizey, &width, &height); + if (width != cpw->core.width || height != cpw->core.height) { + owidth = width; + oheight = height; + re = XtMakeResizeRequest((Widget)cpw, owidth, oheight, + &width, &height); + switch (re) { + case XtGeometryYes: + /* no problem */ + break; + } + } +} + +/*- allocDisplaySegments: prepare specified number of display segments -*/ +static void +allocDisplaySegments(cpw, n) +AuxPanelWidget cpw; +Cardinal n; +{ + if (cpw->cpanel.dispauxsegmentsize > n) return; + n = ((n + 3) / 4) * 4 ; + if (cpw->cpanel.dispauxsegments == NULL) { + cpw->cpanel.dispauxsegments = + (DisplaySegment *)XtCalloc(n, sizeof(DisplaySegment)); + } else { + cpw->cpanel.dispauxsegments = + (DisplaySegment *)XtRealloc((char *)cpw->cpanel.dispauxsegments, + n * sizeof(DisplaySegment)); + bzero((char *)(cpw->cpanel.dispauxsegments + cpw->cpanel.numauxsegments), + (n - cpw->cpanel.numauxsegments) * sizeof(DisplaySegment)); + } + cpw->cpanel.dispauxsegmentsize = n; +} + +/*- freeDisplaySegments: free display segments -*/ +static void +freeDisplaySegments(cpw) +AuxPanelWidget cpw; +{ + Cardinal i; + DisplaySegment *dseg = cpw->cpanel.dispauxsegments; + + for (i = 0 ; i < cpw->cpanel.dispauxsegmentsize ; i++, dseg++) { + if (dseg->seg.data != NULL) XtFree(dseg->seg.data); + } + XtFree((char *)cpw->cpanel.dispauxsegments); + cpw->cpanel.dispauxsegments = (DisplaySegment *)0; + cpw->cpanel.dispauxsegmentsize = 0; +} + +/*- copyString: copy ICString -*/ +static void +copyString(from, to) +ICString *from; +ICString *to; +{ + if (to->data != NULL) XtFree(to->data); + *to = *from; + to->data = XtMalloc(to->nbytes); + (void)bcopy(from->data, to->data, to->nbytes); +} + +static void +UpdateAuxDisplay(cpw) +AuxPanelWidget cpw; +{ + Widget dispobj = cpw->cpanel.displayobj; + DisplaySegment *dseg; + int hspace, vspace; + int x, y; + Cardinal i; + + if (dispobj == NULL) return; + + hspace = cpw->cpanel.hspace; + vspace = cpw->cpanel.vspace; + + x = hspace / 2; + y = vspace / 2; + + for (i = 0, dseg = cpw->cpanel.dispauxsegments; + i < cpw->cpanel.numauxsegments ; i++, dseg++) { + if (dseg->redrawpos >= 0) { + int offset = 0; + int idx = dseg->redrawpos; + + if (dseg->width == 0) { + dseg->width = CDStringWidth(dispobj, &dseg->seg, 0, -1); + } + if (idx > 0) { + offset = CDStringWidth(dispobj, &dseg->seg, 0, idx); + } + CDDrawString(dispobj, (Widget)cpw, &dseg->seg, 0, -1, x + offset, y); + } + x += dseg->width; + } + return; +} + +/* + * Public Functions + */ + +/* ARGSUSED */ +void +APanelStart(w, segments, nseg, curseg, cursorpos) +Widget w; +ICString *segments; +Cardinal nseg, curseg, cursorpos; +{ + AuxPanelWidget cpw = (AuxPanelWidget)w; + Cardinal i; + DisplaySegment *dseg; + + cpw->cpanel.numauxsegments = nseg; + allocDisplaySegments(cpw, nseg); + for (i = 0, dseg = cpw->cpanel.dispauxsegments ; i < nseg ; i++, dseg++) { + copyString(segments +i, &dseg->seg); + dseg->redrawpos = 0; + dseg->width = 0; + } + Layout(cpw, True, True); + if (XtIsRealized(w)) XClearWindow(XtDisplay(w), XtWindow(w)); + return; +} + +void +APanelEnd(w) +Widget w; +{ + AuxPanelWidget cpw = (AuxPanelWidget)w; + + cpw->cpanel.numauxsegments = 0; + return; +} + +/* ARGSUSED */ +void +APanelChange(w, segments, nseg, curseg, cursorpos) +Widget w; +ICString *segments; +Cardinal nseg, curseg, cursorpos; +{ + AuxPanelWidget cpw = (AuxPanelWidget)w; + Cardinal i; + DisplaySegment *dseg; + + cpw->cpanel.numauxsegments = nseg; + allocDisplaySegments(cpw, nseg); + for (i = 0, dseg = cpw->cpanel.dispauxsegments ; i < nseg ; i++, dseg++) { + /* $BA4=q$-49$($K$J$C$F$7$^$&!#(BICCompareSegment $B$,;H$($k$J$i(B + $B;H$$$?$$$N$@$,!#(B */ + copyString(segments +i, &dseg->seg); + dseg->redrawpos = 0; + dseg->width = 0; + } + Layout(cpw, False, False); + if (XtIsRealized(w)) XClearWindow(XtDisplay(w), XtWindow(w)); + UpdateAuxDisplay(cpw); + return; +} diff -r 000000000000 -r 92745d501b9a lib/CandPanel.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/CandPanel.c Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,737 @@ +#ifndef lint +static char *rcsid = "$Id: CandPanel.c,v 1.11 1994/04/22 04:26:22 ishisone Rel $"; +#endif +/* + * Copyright (c) 1990 Software Research Associates, Inc. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Software Research Associates not be + * used in advertising or publicity pertaining to distribution of the + * software without specific, written prior permission. Software Research + * Associates makes no representations about the suitability of this software + * for any purpose. It is provided "as is" without express or implied + * warranty. + * + * Author: Makoto Ishisone, Software Research Associates, Inc., Japan + */ + +#include +#include +#include "CandPanelP.h" +#include "ConvDisp.h" + +static XtResource resources[] = { +#define offset(field) XtOffset(CandidatePanelWidget, cpanel.field) + { XtNforeground, XtCForeground, XtRPixel, sizeof(Pixel), + offset(foreground), XtRString, XtDefaultForeground }, + { XtNhorizontalSpacing, XtCSpacing, XtRDimension, sizeof(Dimension), + offset(hspace), XtRString, "6" }, + { XtNverticalSpacing, XtCSpacing, XtRDimension, sizeof(Dimension), + offset(vspace), XtRString, "4" }, + { XtNlist, XtCList, XtRPointer, sizeof(ICString*), + offset(list), XtRImmediate, NULL }, + { XtNnumStrings, XtCNumStrings, XtRInt, sizeof(int), + offset(nstrings), XtRImmediate, 0 }, + { XtNdefaultWidth, XtCDefaultWidth, XtRDimension, sizeof(Dimension), + offset(defaultwidth), XtRString, "400" }, + { XtNcurrentItem, XtCCurrentItem, XtRInt, sizeof(int), + offset(current), XtRImmediate, 0 }, + { XtNcursor, XtCCursor, XtRCursor, sizeof(Cursor), + offset(cursor), XtRImmediate, (XtPointer)None }, + { XtNcallback, XtCCallback, XtRCallback, sizeof(XtPointer), + offset(callback), XtRCallback, NULL }, +#undef offset +}; + +static void Move(/* Widget, XEvent*, String*, Cardinal* */); +static void Set(/* Widget, XEvent*, String*, Cardinal* */); +static void Notify(/* Widget, XEvent*, String*, Cardinal* */); + +static XtActionsRec actions[] = { + { "move", Move }, + { "set", Set }, + { "select", Notify }, +}; + +static char translations[] = + ": set() select()\n\ + Up: move(up)\n\ + Down: move(down)\n\ + Left: move(left)\n\ + Right: move(right)"; + +static void Initialize(), Destroy(); +static void Realize(); +static void Redisplay(); +static void Resize(); +static Boolean SetValues(); +static XtGeometryResult QueryGeometry(); +static void InsertChild(); + +static void GetInvGC(); +static int MaxWidth(); +static void ComputeSize(); +static void Layout(); +static void ToggleHighlight(); + +static CompositeClassExtensionRec CompositeExtension = { + /* next_extension */ NULL, + /* record_type */ NULLQUARK, + /* version */ XtCompositeExtensionVersion, + /* record_size */ sizeof(CompositeClassExtensionRec), + /* accept_objects */ True, +}; + +CandidatePanelClassRec candidatePanelClassRec = { + { /* core fields */ + /* superclass */ (WidgetClass) &compositeClassRec, + /* class_name */ "CandidatePanel", + /* widget_size */ sizeof(CandidatePanelRec), + /* class_initialize */ NULL, + /* class_part_initialize */ NULL, + /* class_inited */ FALSE, + /* initialize */ Initialize, + /* initialize_hook */ NULL, + /* realize */ Realize, + /* actions */ actions, + /* num_actions */ XtNumber(actions), + /* resources */ resources, + /* num_resources */ XtNumber(resources), + /* xrm_class */ NULLQUARK, + /* compress_motion */ TRUE, + /* compress_exposure */ TRUE, + /* compress_enterleave */ TRUE, + /* visible_interest */ FALSE, + /* destroy */ Destroy, + /* resize */ Resize, + /* expose */ Redisplay, + /* set_values */ SetValues, + /* set_values_hook */ NULL, + /* set_values_almost */ XtInheritSetValuesAlmost, + /* get_values_hook */ NULL, + /* accept_focus */ NULL, + /* version */ XtVersion, + /* callback_private */ NULL, + /* tm_table */ translations, + /* query_geometry */ QueryGeometry, + /* display_accelerator */ XtInheritDisplayAccelerator, + /* extension */ NULL + }, + { /* composite fields */ + /* geometry_manager */ NULL, + /* change_managed */ NULL, + /* insert_child */ InsertChild, + /* delete_child */ XtInheritDeleteChild, + /* extension */ (XtPointer)&CompositeExtension, + }, + { /* candidatepanel fields */ + /* empty */ 0 + } +}; + +WidgetClass candidatePanelWidgetClass = (WidgetClass)&candidatePanelClassRec; + +/* ARGSUSED */ +static void +Initialize(req, new, args, num_args) +Widget req; +Widget new; +ArgList args; +Cardinal *num_args; +{ + CandidatePanelWidget cpw = (CandidatePanelWidget)new; + + cpw->cpanel.displayobj = NULL; + GetInvGC(cpw); +} + +static void +Destroy(w) +Widget w; +{ + CandidatePanelWidget cpw = (CandidatePanelWidget)w; + + if (cpw->cpanel.invgc != NULL) XtReleaseGC(w, cpw->cpanel.invgc); +} + +static void +Realize(w, mask, value) +Widget w; +XtValueMask *mask; +XSetWindowAttributes *value; +{ + CandidatePanelWidget cpw = (CandidatePanelWidget)w; + CompositeWidgetClass super = (CompositeWidgetClass)XtClass(w)->core_class.superclass; + String params[1]; + Cardinal num_params; + + if (cpw->cpanel.displayobj == NULL) { + params[0] = XtClass(w)->core_class.class_name; + num_params = 1; + XtAppErrorMsg(XtWidgetToApplicationContext(w), + "childError", "number", "WidgetError", + "%s: has no child (ConvDisplayObject)", + params, &num_params); + } + + if (cpw->cpanel.cursor != None) { + *mask |= CWCursor; + value->cursor = cpw->cpanel.cursor; + } + + (*super->core_class.realize)(w, mask, value); +} + +/* ARGSUSED */ +static void +Redisplay(w, ev, region) +Widget w; +XEvent *ev; +Region region; +{ + CandidatePanelWidget cpw = (CandidatePanelWidget)w; + Widget dispobj = cpw->cpanel.displayobj; + XExposeEvent *event = (XExposeEvent *)ev; + ICString *list = cpw->cpanel.list; + int cwidth, cheight, hspace, vspace; + int c0, c1, r0, r1; + int row, col; + int idx; + int x, y; + + if (list == NULL || dispobj == NULL) return; + + cwidth = cpw->cpanel.maxwidth; + cheight = cpw->cpanel.fontheight; + hspace = cpw->cpanel.hspace; + vspace = cpw->cpanel.vspace; + + c0 = (event->x + hspace - hspace / 2) / (cwidth + hspace); + c1 = (event->x + event->width - 1 - hspace / 2) / (cwidth + hspace) + 1; + if (c1 > cpw->cpanel.ncolumns) c1 = cpw->cpanel.ncolumns; + + r0 = (event->y + vspace - vspace / 2) / (cheight + vspace); + r1 = (event->y + event->height - 1 - vspace / 2) / (cheight + vspace) + 1; + if (r1 > cpw->cpanel.nrows) r1 = cpw->cpanel.nrows; + + for (row = r0; row < r1; row++) { + y = (cheight + vspace) * row + vspace / 2; + for (col = c0; col < c1; col++) { + x = (cwidth + hspace) * col + hspace / 2; + idx = row * cpw->cpanel.ncolumns + col; + if (idx >= cpw->cpanel.nstrings) return; + if (idx == cpw->cpanel.current) { + XClearArea(XtDisplay(w), XtWindow(w), x, y, + (unsigned int)cwidth, (unsigned int)cheight, + False); + } + CDDrawString(dispobj, w, list + idx, 0, -1, x, y); + if (idx == cpw->cpanel.current) { + ToggleHighlight(cpw, idx); + } + } + } +} + +static void +Resize(w) +Widget w; +{ + CandidatePanelWidget cpw = (CandidatePanelWidget)w; + + Layout(cpw, False, False); +} + +/* ARGSUSED */ +static Boolean +SetValues(cur, req, wid, args, num_args) +Widget cur; +Widget req; +Widget wid; +ArgList args; +Cardinal *num_args; +{ + CandidatePanelWidget old = (CandidatePanelWidget)cur; + CandidatePanelWidget new = (CandidatePanelWidget)wid; + Boolean redisplay = False; + Boolean listspecified = False; + int i; + + if (new->cpanel.displayobj == NULL) return False; + + for (i = 0; i < *num_args; i++) { + if (!strcmp(args[i].name, XtNlist)) { + listspecified = True; + break; + } + } + + if (new->cpanel.foreground != old->cpanel.foreground || + new->core.background_pixel != old->core.background_pixel) { + XtVaSetValues(new->cpanel.displayobj, + XtNforeground, new->cpanel.foreground, + XtNbackground, new->core.background_pixel, + NULL); + redisplay = True; + } + + if (listspecified || + new->cpanel.list != old->cpanel.list || + new->cpanel.nstrings != old->cpanel.nstrings) { + /* compute maximum pixel width of the list items */ + new->cpanel.maxwidth = MaxWidth(new); + } + + if (listspecified || + new->cpanel.list != old->cpanel.list || + new->cpanel.nstrings != old->cpanel.nstrings || + new->cpanel.hspace != old->cpanel.hspace || + new->cpanel.vspace != old->cpanel.vspace || + new->cpanel.defaultwidth != old->cpanel.defaultwidth) { + Layout(new, True, True); + redisplay = True; + } + + if (new->cpanel.current != old->cpanel.current && + !redisplay && XtIsRealized(wid)) { + ToggleHighlight(new, old->cpanel.current); + ToggleHighlight(new, new->cpanel.current); + } + + if (new->cpanel.cursor != old->cpanel.cursor && XtIsRealized(wid)) { + XDefineCursor(XtDisplay(wid), XtWindow(wid), new->cpanel.cursor); + } + + return redisplay; +} + +static XtGeometryResult +QueryGeometry(w, req, ret) +Widget w; +XtWidgetGeometry *req; +XtWidgetGeometry *ret; +{ + Dimension width, height; + Dimension owidth, oheight; + + ret->request_mode = 0; + + if ((req->request_mode & (CWWidth | CWHeight)) == 0) return XtGeometryYes; + + width = (req->request_mode & CWWidth) ? req->width : w->core.width; + height = (req->request_mode & CWHeight) ? req->height : w->core.height; + + owidth = width; + oheight = height; + ComputeSize((CandidatePanelWidget)w, + (req->request_mode & CWWidth) != 0, + (req->request_mode & CWHeight) != 0, + &width, &height); + ret->request_mode = CWWidth | CWHeight; + ret->width = width; + ret->height = height; + + if (width != owidth || height != oheight) return XtGeometryAlmost; + + return XtGeometryYes; +} + +static void +InsertChild(w) +Widget w; +{ + CandidatePanelWidget cpw = (CandidatePanelWidget)XtParent(w); + CompositeWidgetClass super = (CompositeWidgetClass)XtClass(cpw)->core_class.superclass; + String params[1]; + Cardinal num_params; + + if (!XtIsSubclass(w, convDisplayObjectClass)) { + params[0] = XtClass(cpw)->core_class.class_name; + num_params = 1; + XtAppErrorMsg(XtWidgetToApplicationContext(w), + "childError", "class", "WidgetError", + "%s: child must be subclass of ConvDisplayObject", + params, &num_params); + } + if (cpw->composite.num_children != 0) { + params[0] = XtClass(cpw)->core_class.class_name; + num_params = 1; + XtAppErrorMsg(XtWidgetToApplicationContext(w), + "childError", "number", "WidgetError", + "%s: can only take one child", + params, &num_params); + } + + (*super->composite_class.insert_child)(w); + + cpw->cpanel.displayobj = w; + cpw->cpanel.fontheight = CDLineHeight(w, (Position *)NULL); + +#ifdef notdef + { + Pixel fg, bg; + XtVaGetValues(w, XtNforeground, &fg, XtNbackground, &bg, NULL); + GetInvGC(cpw, fg, bg); + } +#endif + + if (cpw->cpanel.list != NULL) { + cpw->cpanel.maxwidth = MaxWidth(cpw); + Layout(cpw, cpw->core.width == 0, cpw->core.height == 0); + } +} + +static void +GetInvGC(cpw) +CandidatePanelWidget cpw; +{ + XGCValues values; + + values.function = GXinvert; + values.plane_mask = cpw->cpanel.foreground ^ cpw->core.background_pixel; + cpw->cpanel.invgc = XtGetGC((Widget)cpw, GCFunction|GCPlaneMask, &values); +} + +/* ARGSUSED */ +static void +Move(w, ev, args, num_args) +Widget w; +XEvent *ev; +String *args; +Cardinal *num_args; +{ + int dir; + + if (*num_args < 1) return; + + if (!strcmp(*args, "left") || !strcmp(*args, "Left")) { + dir = ICMoveLeft; + } else if (!strcmp(*args, "right") || !strcmp(*args, "Right")) { + dir = ICMoveRight; + } else if (!strcmp(*args, "up") || !strcmp(*args, "Up")) { + dir = ICMoveUp; + } else if (!strcmp(*args, "down") || !strcmp(*args, "Down")) { + dir = ICMoveDown; + } else { + XtAppWarning(XtWidgetToApplicationContext(w), + "CandidatePanel: unknown direction"); + return; + } + + CPanelMoveCurrent(w, dir); +} + +/* ARGSUSED */ +static void +Set(w, ev, args, num_args) +Widget w; +XEvent *ev; +String *args; +Cardinal *num_args; +{ + CandidatePanelWidget cpw = (CandidatePanelWidget)w; + XButtonEvent *event = (XButtonEvent *)ev; + int cwidth, cheight, hspace, vspace; + int x, y; + int row, col; + int newidx; + + cwidth = cpw->cpanel.maxwidth; + cheight = cpw->cpanel.fontheight; + hspace = cpw->cpanel.hspace; + vspace = cpw->cpanel.vspace; + + x = event->x - hspace / 2; + col = x / (cwidth + hspace); + if (col >= cpw->cpanel.ncolumns || (x % (cwidth + hspace)) > cwidth) return; + + y = event->y - vspace / 2; + row = y / (cheight + vspace); + if (row >= cpw->cpanel.nrows || (y % (cheight + vspace)) > cheight) return; + + newidx = col + cpw->cpanel.ncolumns * row; + if (newidx >= cpw->cpanel.nstrings) return; + + CPanelSetCurrent(w, newidx); +} + +/* ARGSUSED */ +static void +Notify(w, ev, args, num_args) +Widget w; +XEvent *ev; +String *args; +Cardinal *num_args; +{ + CandidatePanelWidget cpw = (CandidatePanelWidget)w; + + XtCallCallbackList(w, cpw->cpanel.callback, + (XtPointer)cpw->cpanel.current); +} + +static int +MaxWidth(cpw) +CandidatePanelWidget cpw; +{ + Widget dispobj = cpw->cpanel.displayobj; + ICString *list = cpw->cpanel.list; + int maxwidth; + int i; + + maxwidth = 0; + for (i = 0; i < cpw->cpanel.nstrings; i++) { + int w = CDStringWidth(dispobj, list + i, 0, -1); + if (w > maxwidth) maxwidth = w; + } + + return maxwidth; +} + +static void +ComputeSize(cpw, resizex, resizey, width_inout, height_inout) +CandidatePanelWidget cpw; +int resizex; +int resizey; +Dimension *width_inout; +Dimension *height_inout; +{ + int nrows, ncolumns; + int width, height; + + if (cpw->cpanel.displayobj == NULL || cpw->cpanel.nstrings == 0) return; + + width = *width_inout; + height = *height_inout; + + if (resizex) { + if (resizey) { + int maxheight = HeightOfScreen(XtScreen((Widget)cpw)); + + /* use defaultwidth */ + ncolumns = cpw->cpanel.defaultwidth / + (cpw->cpanel.maxwidth + cpw->cpanel.hspace); + if (ncolumns > cpw->cpanel.nstrings) ncolumns = cpw->cpanel.nstrings; + if (ncolumns <= 0) ncolumns = 1; + nrows = (cpw->cpanel.nstrings + ncolumns - 1) / ncolumns; + width = (cpw->cpanel.maxwidth + cpw->cpanel.hspace) * ncolumns; + height = (cpw->cpanel.fontheight + cpw->cpanel.vspace) * nrows; + /* + * If the computed height exceeds display height, + * expand width so that the entire window fits into the display. + */ + if (height > maxheight) { + /* compute maximum number of rows */ + nrows = maxheight / (cpw->cpanel.fontheight + cpw->cpanel.vspace); + if (nrows <= 0) nrows = 1; + ncolumns = (cpw->cpanel.nstrings + nrows - 1) / nrows; + if (ncolumns > cpw->cpanel.nstrings) { + ncolumns = cpw->cpanel.nstrings; + } + /* re-compute correct number of rows */ + nrows = (cpw->cpanel.nstrings + ncolumns - 1) / ncolumns; + width = (cpw->cpanel.maxwidth + cpw->cpanel.hspace) * ncolumns; + height = (cpw->cpanel.fontheight + cpw->cpanel.vspace) * nrows; + } + } else { + /* use specified height */ + nrows = height / (cpw->cpanel.fontheight + cpw->cpanel.vspace); + if (nrows <= 0) nrows = 1; + ncolumns = (cpw->cpanel.nstrings + nrows - 1) / nrows; + if (ncolumns > cpw->cpanel.nstrings) ncolumns = cpw->cpanel.nstrings; + width = (cpw->cpanel.maxwidth + cpw->cpanel.hspace) * ncolumns; + } + } else { + ncolumns = width / (cpw->cpanel.maxwidth + cpw->cpanel.hspace); + if (ncolumns <= 0) ncolumns = 1; + nrows = (cpw->cpanel.nstrings + ncolumns - 1) / ncolumns; + if (resizey) { + height = (cpw->cpanel.fontheight + cpw->cpanel.vspace) * nrows; + } + } + cpw->cpanel.ncolumns = ncolumns; + cpw->cpanel.nrows = nrows; + *width_inout = width; + *height_inout = height; +} + +static void +Layout(cpw, resizex, resizey) +CandidatePanelWidget cpw; +int resizex; +int resizey; +{ + Dimension width, height; + Dimension owidth, oheight; + XtGeometryResult re; + + if (cpw->cpanel.displayobj == NULL) return; + + width = cpw->core.width; + height = cpw->core.height; + ComputeSize(cpw, resizex, resizey, &width, &height); + + if (width != cpw->core.width || height != cpw->core.height) { + owidth = width; + oheight = height; + re = XtMakeResizeRequest((Widget)cpw, owidth, oheight, &width, &height); + switch (re) { + case XtGeometryYes: + /* no problem */ + break; + case XtGeometryNo: + width = cpw->core.width; + height = cpw->core.height; + ComputeSize(cpw, False, False, &width, &height); + break; + case XtGeometryAlmost: + ComputeSize(cpw, + width != owidth, + height != oheight, + &width, &height); + re = XtMakeResizeRequest((Widget)cpw, width, height, &width, &height); + switch (re) { + case XtGeometryYes: + break; + case XtGeometryNo: + width = cpw->core.width; + height = cpw->core.height; + ComputeSize(cpw, False, False, &width, &height); + break; + case XtGeometryAlmost: + ComputeSize(cpw, False, False, &width, &height); + (void)XtMakeResizeRequest((Widget)cpw, width, height, &width, &height); + } + } + } +} + +static void +ToggleHighlight(cpw, idx) +CandidatePanelWidget cpw; +int idx; +{ + int row, col; + int x, y; + int width; + + if (idx < 0 || cpw->cpanel.nstrings <= idx) return; + + col = idx % cpw->cpanel.ncolumns; + row = idx / cpw->cpanel.ncolumns; + x = (cpw->cpanel.maxwidth + cpw->cpanel.hspace) * col + + cpw->cpanel.hspace / 2; + y = (cpw->cpanel.fontheight + cpw->cpanel.vspace) * row + + cpw->cpanel.vspace / 2; + width = CDStringWidth(cpw->cpanel.displayobj, cpw->cpanel.list + idx, + 0, -1); + + XFillRectangle(XtDisplay(cpw), XtWindow(cpw), cpw->cpanel.invgc, x, y, + (unsigned int)width, (unsigned int)cpw->cpanel.fontheight); +} + + +/* + * Public Functions + */ + +void +CPanelSetList(w, list, nstrings, current, resize) +Widget w; +ICString *list; +int nstrings; +int current; +int resize; +{ + CandidatePanelWidget cpw = (CandidatePanelWidget)w; + + if (list != NULL) { + cpw->cpanel.list = list; + cpw->cpanel.nstrings = nstrings; + if (current < 0) current = 0; + if (current >= nstrings) current = nstrings - 1; + cpw->cpanel.current = current; + } + + if (cpw->cpanel.displayobj == NULL) return; + + cpw->cpanel.fontheight = CDLineHeight(cpw->cpanel.displayobj, + (Position *)NULL); + /* compute maximum pixel width of the list items */ + cpw->cpanel.maxwidth = MaxWidth(cpw); + Layout(cpw, resize, resize); + + if (XtIsRealized(w)) XClearWindow(XtDisplay(w), XtWindow(w)); +} + +void +CPanelSetCurrent(w, idx) +Widget w; +int idx; +{ + CandidatePanelWidget cpw = (CandidatePanelWidget)w; + + if (idx < 0 || cpw->cpanel.nstrings <= idx) return; + + if (idx == cpw->cpanel.current) return; + + if (cpw->cpanel.displayobj != NULL && XtIsRealized(w)) { + ToggleHighlight(cpw, cpw->cpanel.current); + ToggleHighlight(cpw, idx); + } + cpw->cpanel.current = idx; +} + +void +CPanelMoveCurrent(w, dir) +Widget w; +int dir; +{ + CandidatePanelWidget cpw = (CandidatePanelWidget)w; + int newidx; + int row, col; + int nstrings = cpw->cpanel.nstrings; + + if (nstrings <= 0) return; + + col = cpw->cpanel.current % cpw->cpanel.ncolumns; + row = cpw->cpanel.current / cpw->cpanel.ncolumns; + + switch (dir) { + case ICMoveLeft: + if ((newidx = cpw->cpanel.current - 1) < 0) newidx = nstrings - 1; + break; + case ICMoveRight: + if ((newidx = cpw->cpanel.current + 1) >= nstrings) newidx = 0; + break; + case ICMoveUp: + case ICMovePrevPage: + if (--row < 0) row = cpw->cpanel.nrows - 1; + newidx = row * cpw->cpanel.ncolumns + col; + if (newidx >= nstrings) newidx -= cpw->cpanel.ncolumns; + break; + case ICMoveDown: + case ICMoveNextPage: + if (++row >= cpw->cpanel.nrows) row = 0; + newidx = row * cpw->cpanel.ncolumns + col; + if (newidx >= nstrings) newidx = col; + break; + case ICMoveLeftMost: + newidx = row * cpw->cpanel.ncolumns; + break; + case ICMoveRightMost: + newidx = (row + 1) * cpw->cpanel.ncolumns - 1; + if (newidx >= cpw->cpanel.nstrings) newidx = cpw->cpanel.nstrings - 1; + break; + case ICMoveFirst: + newidx = 0; + break; + case ICMoveLast: + newidx = cpw->cpanel.nstrings - 1; + break; + } + + CPanelSetCurrent(w, newidx); +} diff -r 000000000000 -r 92745d501b9a lib/Canna.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/Canna.c Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,1854 @@ +/* + * Copyright (c) 1990 Software Research Associates, Inc. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Software Research Associates not be + * used in advertising or publicity pertaining to distribution of the + * software without specific, written prior permission. Software Research + * Associates makes no representations about the suitability of this software + * for any purpose. It is provided "as is" without express or implied + * warranty. + * + * Author: Makoto Ishisone, Software Research Associates, Inc., Japan + */ + +/* Copyright 1991 NEC Corporation, Tokyo, Japan. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, + * provided that the above copyright notice appear in all copies and that + * both that copyright notice and this permission notice appear in + * supporting documentation, and that the name of NEC Corporation + * not be used in advertising or publicity pertaining to distribution + * of the software without specific, written prior permission. NEC + * Corporation makes no representations about the suitability of this + * software for any purpose. It is provided "as is" without express + * or implied warranty. + * + * NEC CORPORATION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN + * NO EVENT SHALL NEC CORPORATION BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF + * USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR + * OTHER TORTUOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + * + * Author: Akira Kon, NEC Corporation. (kon@d1.bs2.mt.nec.co.jp) + */ + +/* $BD>$5$J$1$l$P$J$i$J$$$H$3$m(B + + $B!&(BDestroy $B$,8F$P$l$J$$$N$G(B CloseUIContext $B$G$-$J$$!#(B + $B!&%b!<%INN0h$NBg$-$5!#(B($B$3$l$OB>$N%U%!%$%k$@$m$&$J(B) + + */ + +#ifndef lint +static char *rcsid = "$Id: Canna.c,v 1.55 1999/05/25 08:13:03 ishisone Exp $"; +#endif + +#include +#include +#include +#define XK_KATAKANA +#include +#if XtSpecificationRelease > 4 +#include +#endif +#include "CannaP.h" +#include "DebugPrint.h" + +#define _WCHAR_T /* $B$3$NDj5A$O(B jrkanji.h $B$G(B wcKanjiStatus $B$J$I$rDj5A$9$k$?$a(B */ +#define wchar_t wchar + +#include + +static XtResource resources[] = { +#define offset(field) XtOffset(CannaObject, canna.field) + { XtNcannahost, XtCCannahost, XtRString, sizeof(String), + offset(cannahost), XtRString, NULL }, + { XtNcannafile, XtCCannafile, XtRString, sizeof(String), + offset(cannafile), XtRString, NULL }, + { XtNsendReturnByString, XtCSendReturnByString, + XtRBoolean, sizeof(Boolean), + offset(sendReturnByString), XtRBoolean, False }, +#undef offset +}; + +static void ClassInitialize(); +static void Initialize(), Destroy(); +static Boolean SetValues(); +static int InputEvent(); +static ICString *GetMode(); +static int CursorPos(); +static int NumSegments(); +static ICString *GetSegment(); +static int CompareSegment(); +static ICString *GetItemList(); +static int SelectItem(); +static int ConvertedString(); +static int ClearConversion(); +static void displayPreEdit(); +static int GetTriggerKeys(); +static int PreeditString(); +static int StatusString(); + +static initializeCannaConnection(); +static toJapaneseMode(); +static void convend(); +static changeTextForCanna(); +static copyInWchar(); +static fixProcForCanna(); +static shiftRight(), shiftLeft(), shiftLeftAll(); +static ibufInitialize(), freeIBuf(); + +#ifdef KC_SETLISTCALLBACK +#ifdef CANNA_LIST_Convert +#define CANNA_LISTFUNCTYPE int +#else +#define CANNA_LISTFUNCTYPE void +#endif +static CANNA_LISTFUNCTYPE listfunc(); + +static void openSelection(); +#define SELECTION_SET 0 /* SelectionStart $B$r$7$F$bNI$$$H8@$&>pJs$r@_Dj$9$k(B */ +#define SELECTION_DO 1 /* $Btype != KeyPress /*&& event->type != KeyRelease*/) return 0; + + obj->canna.textchanged = False; + + /* $B$7$F$7$^$&(B */ + kanabuf[0] = '\0'; + nbytes = XKanaLookup(event, kanabuf, 20, &ks, &compose_status); + + buf[0] = (wchar)kanabuf[0]; /* $B$-$?$J$$(B */ + + if (ks == XK_space && (event->xkey.state & ShiftMask)) { + void convend(); + + convend(obj); + return 0; + } + + /* $BD9$5$,%<%m$N$b$N$K4X$7$F$O$A$g$C$H5_:Q(B */ + functionalChar = checkIfFunctionalChar(event, ks, buf, 1024); + /* shift+$B"*$N$h$&$JJ8;z$@$C$?$i#1J8;z$H?t$($k(B */ + if ( !nbytes && functionalChar ) { + nbytes = 1; + } + + /* $BMW$i$J$$>l9g$OL5;k$9$k(B */ + if (nbytes == 0) return 1; + + /* $B%Y%k$rLD$i$9%G%#%9%W%l%$$N@_Dj(B */ + + displaybell = XtDisplayOfObject((Widget)obj); + + /* $B$+$J4A;zJQ49$9$k(B */ + len = wcKanjiString((int)obj, (int)buf[0], + (wchar_t *)buf, 1024, &kanji_status); + + displayPreEdit(obj, len, buf, &kanji_status); + return (kanji_status.info & KanjiThroughInfo) ? 1 : 0; +} + +static void +displayPreEdit(obj, len, buf, ks) +CannaObject obj; +int len; +wchar *buf; +wcKanjiStatus *ks; +{ + Widget w = (Widget)obj; + + if (len > 0) { /* $B3NDjJ8;z$,$"$k>l9g(B */ + if (len == 1 && (ks->info & KanjiThroughInfo) && + (obj->canna.sendReturnByString == False || + (((buf[0] & 0x7f) < (unsigned)0x20 && + buf[0] != '\r' && buf[0] != '\t') || + buf[0] == '\177'))) { + ;/* XSendEvent$B$GAw$C$F$b$i$&$h$&$JJ8;z(B($B2?$b$7$J$$(B) */ + } + else { + ks->info &= ~KanjiThroughInfo; + fixProcForCanna(obj, buf, len); + fix(obj); + } + } + + changeTextForCanna(obj, ks); + + /* $B%F%-%9%H$NJQ2=$r%A%'%C%/$9$k(B */ + if (obj->canna.textchanged) { + XtCallCallbackList(w, obj->inputConv.textchangecallback, + (XtPointer)NULL); + obj->canna.textchanged = False; + } + + /* $BF~NO%b!<%I$r%A%'%C%/$9$k(B */ + if (ks->info & KanjiModeInfo) { + XtCallCallbackList(w, obj->inputConv.modechangecallback, + (XtPointer)NULL); + } + + if (ks->info & KanjiGLineInfo) { /* $B0lMw9T$,$"$k>l9g(B */ + ICAuxControlArg arg; + + switch (obj->canna.ibuf->candstat) { + case CANNA_GLINE_Start: + arg.command = ICAuxStart; + XtCallCallbackList((Widget)obj, obj->inputConv.auxcallback, + (XtPointer)&arg); + break; + case CANNA_GLINE_End: + arg.command = ICAuxEnd; + XtCallCallbackList((Widget)obj, obj->inputConv.auxcallback, + (XtPointer)&arg); + break; + case CANNA_GLINE_Change: + arg.command = ICAuxChange; + XtCallCallbackList((Widget)obj, obj->inputConv.auxcallback, + (XtPointer)&arg); + break; + } + } + + /* $B=*$o$j$+$I$&$+%A%'%C%/$9$k(B */ + if (ks->info & KanjiModeInfo) { + wchar modeinfo[4]; + + wcKanjiControl((int)obj, KC_SETMODEINFOSTYLE, (char *)1); + wcKanjiControl((int)obj, KC_QUERYMODE, (char *)modeinfo); + wcKanjiControl((int)obj, KC_SETMODEINFOSTYLE, (char *)0); + if (modeinfo[0] - '@' == CANNA_MODE_AlphaMode) { + toJapaneseMode(obj); + convend(obj); + } + } + openSelection(obj, SELECTION_DO, 0/* dummy */); +} + +static ICString * +GetMode(w) +Widget w; +{ + CannaObject obj = (CannaObject)w; + wchar *mode; + static ICString icstr; + + icstr.nchars = obj->canna.ibuf->modelen; + if (icstr.nchars > 0) { + mode = obj->canna.ibuf->curmode; + icstr.data = (char *)mode; + icstr.nbytes = icstr.nchars * sizeof(wchar); + icstr.attr = ICAttrNormalString; + } + return &icstr; +} + +static int +CursorPos(w, nsegp, ncharp) +Widget w; +Cardinal *nsegp; +Cardinal *ncharp; +{ + CannaObject obj = (CannaObject)w; + iBuf *ib = obj->canna.ibuf; + Cardinal nseg, nchar; + int ret = 0; + + if (ib->curseg < ib->nseg) { + nseg = ib->curseg; + nchar = 0; + } + else { + nseg = ib->offset; + nchar = ib->len[0 + ib->offset]; + ret = 1; + } + if (nsegp) { + *nsegp = nseg; + } + if (ncharp) { + *ncharp = nchar; + } + + return ret; +} + +static int +NumSegments(w) +Widget w; +{ + CannaObject obj = (CannaObject)w; + iBuf *ib = obj->canna.ibuf; + + return ib->nseg; +} + +static ICString * +GetSegment(w, n) +Widget w; +Cardinal n; +{ + CannaObject obj = (CannaObject)w; + iBuf *ib = obj->canna.ibuf; + static ICString seg; + + seg.data = (char *)ib->str[n]; + seg.nchars = ib->len[n]; + seg.nbytes = seg.nchars * sizeof(wchar); + if (ib->curseg == n) { + seg.attr = ICAttrConverted | ICAttrCurrentSegment; + } + else if (n < ib->offset) { + seg.attr = ICAttrConverted; + } + else { + seg.attr = ICAttrNotConverted; + } + + return &seg; +} + +/* ARGSUSED */ +static int +CompareSegment(w, seg1, seg2, n) +Widget w; +ICString *seg1; +ICString *seg2; +Cardinal *n; +{ + wchar *p, *q; + int len, nsame; + int result = 0; + + if (seg1->attr != seg2->attr) result |= ICAttrChanged; + + len = seg1->nchars > seg2->nchars ? seg2->nchars : seg1->nchars; + nsame = 0; + p = (wchar *)seg1->data; + q = (wchar *)seg2->data; + while (nsame < len && *p++ == *q++) nsame++; + + if (nsame != len || len != seg1->nchars || len != seg2->nchars) + result |= ICStringChanged; + + if (n) *n = nsame; + + return result; +} + +static ICString * +GetItemList(w, n) +Widget w; +Cardinal *n; +{ + CannaObject obj = (CannaObject)w; + + *n = obj->canna.numcand; + return obj->canna.candlist; +} + +#define SELECTBUFSIZE 1024 + +static int +SelectItem(w, n) +Widget w; +int n; +{ + CannaObject obj = (CannaObject)w; + wcKanjiStatus ks; + wcKanjiStatusWithValue ksv; + wchar buf[SELECTBUFSIZE]; + + if (n >= 0) + *(obj->canna.cur_addr) = n; + + ksv.ks = &ks; + buf[0] = (wchar)'\r'; + ksv.buffer = buf; + ksv.n_buffer = SELECTBUFSIZE; + ksv.val = CANNA_FN_Kakutei; + { + ignoreListfunc = 1; + wcKanjiControl((int)obj, KC_DO, (char *)&ksv); + ignoreListfunc = 0; + } + displayPreEdit(obj, ksv.val, buf, ksv.ks); + return 0; +} + +static int +ConvertedString(w, encoding, format, length, string) +Widget w; +Atom *encoding; +int *format; +int *length; +XtPointer *string; +{ + CannaObject obj = (CannaObject)w; + iBuf *ib = obj->canna.ibuf; + wchar *wbuf, *wp; + int len, wlen; + extern int convJWStoCT(); + int offset = ib->offset; + + if (ib == NULL) return -1; + + if (ib->nseg == 0 || ib->offset == 0) return -1; + + wlen = ib->len[offset - 1]; + if (wlen == 0) return -1; + + wbuf = ib->str[offset - 1]; + + /* + * Canna $B%*%V%8%'%/%H$O(B COMPOUND_TEXT $B%(%s%3!<%G%#%s%0$7$+%5%]!<%H$7$J$$(B + * COMPOUND_TEXT $B$KJQ49$9$k(B + */ + *encoding = XA_COMPOUND_TEXT(XtDisplayOfObject((Widget)obj)); + *format = 8; + + /* COMPOUND_TEXT $B$O(B \r $B$,Aw$l$J$$$N$G(B \n $B$KJQ49$7$F$*$/(B */ + for (wp = wbuf; *wp != 0; wp++) { + if (*wp == '\r') *wp = '\n'; + } + + *length = len = convJWStoCT(wbuf, (unsigned char *)NULL, 0); + *string = XtMalloc(len + 1); + (void)convJWStoCT(wbuf, (unsigned char *)*string, 0); + + shiftLeftAll(ib); + + return 0; +} + +static int +ClearConversion(w) +Widget w; +{ + CannaObject obj = (CannaObject)w; + + wcKanjiStatus ks; + wcKanjiStatusWithValue ksv; + wchar buf[SELECTBUFSIZE]; + + ksv.ks = &ks; + ksv.buffer = buf; + ksv.n_buffer = SELECTBUFSIZE; + wcKanjiControl((int)obj, KC_KILL, (char *)&ksv); + displayPreEdit(obj, ksv.val, buf, ksv.ks); + return 0; +} + +static ICString * +GetAuxSegments(w, n, ns, nc) +Widget w; +Cardinal *n, *ns, *nc; +{ + CannaObject obj = (CannaObject)w; + iBuf *ib = obj->canna.ibuf; + Cardinal nseg, nchar; + + if (n) { + *n = ib->ngseg; + } + + if (ib->curgseg < ib->ngseg) { + nseg = ib->curgseg; + nchar = 0; + } + else { + nseg = 0; + nchar = ib->gllen[0]; + } + if (ns) { + *ns = nseg; + } + if (nc) { + *nc = nchar; + } + + return ib->ics; +} + +/* ARGSUSED */ +static void +Initialize(req, new, args, num_args) +Widget req; +Widget new; +ArgList args; +Cardinal *num_args; +{ + CannaObject obj = (CannaObject)new; + + obj->canna.selectionending = False; + obj->canna.textchanged = False; + obj->canna.symbollist = SymbolList; + obj->canna.numsymbols = NumSymbols; + obj->canna.cursymbol = 0; + obj->canna.candlist = NULL; + obj->canna.candlistsize = 0; + obj->canna.numcand = 0; + obj->canna.lastTextLengthIsZero = False; + + ibufInitialize(obj); + + /* $BJQ49$N=i4|2=(B */ + initializeCannaConnection(obj); + + addObject(obj); +} + +static int +bell() +{ + if (displaybell) { + XBell(displaybell, 0); + } + return 0; +} + +static int nCannaContexts = 0; + +static +initializeCannaConnection(obj) +CannaObject obj; +{ + char **warn = 0; + extern (*jrBeepFunc)(); + + if (nCannaContexts == 0) { +#ifdef KC_SETSERVERNAME + if (obj->canna.cannahost != NULL) { + wcKanjiControl((int)obj, KC_SETSERVERNAME, obj->canna.cannahost); + } +#endif /* KC_SETSERVERNAME */ +#ifdef KC_SETINITFILENAME + if (obj->canna.cannafile != NULL) { + wcKanjiControl((int)obj, KC_SETINITFILENAME, obj->canna.cannafile); + } +#endif /* KC_SETINITFILENAME */ + + wcKanjiControl((int)obj, KC_INITIALIZE, (char *)&warn); + TRACE(("Canna initialized\n")); + + if (warn) { + char **p; + + for (p = warn; *p ; p++) { + XtAppWarning(XtWidgetToApplicationContext((Widget)obj), *p); + } + } + } + nCannaContexts++; + +#ifdef KC_SETAPPNAME + wcKanjiControl((int)obj, KC_SETAPPNAME, "kinput2"); +#endif + +#ifdef DONT_USE_HANKAKU_KATAKANA + /* $BH>3Q%+%?%+%J$N6X;_(B */ + wcKanjiControl((int)obj, KC_INHIBITHANKAKUKANA, (char *)1); +#endif + + /* $B0lMw9T$r#7#8%3%i%`$K@_Dj(B */ + wcKanjiControl((int)obj, KC_SETWIDTH, (char *)78); + + /* $B8uJd0lMw%3!<%k%P%C%/$r@_Dj(B */ + +#ifdef KC_SETLISTCALLBACK + { + jrListCallbackStruct lcs; + + lcs.client_data = (char *)obj; + lcs.callback_func = listfunc; + wcKanjiControl((int)obj, KC_SETLISTCALLBACK, (char *)&lcs); + } +#endif /* KC_SETLISTCALLBACK */ + + jrBeepFunc = bell; + + /* $B$5$i$KF|K\8lF~NO%b!<%I$K$7$F$*$/(B */ + toJapaneseMode(obj); +} + + +static void +Destroy(w) +Widget w; +{ + CannaObject obj = (CannaObject)w; + wcKanjiStatusWithValue ksv; + wcKanjiStatus ks; + wchar buf[512]; + int i; + + /* $B%P%C%U%!$N2rJ|(B */ + + freeIBuf(obj->canna.ibuf); + + if (obj->canna.candlist) { + for (i = 0 ; i < obj->canna.candlistsize ; i++) { + if ((obj->canna.candlist + i)->data) { + XtFree((obj->canna.candlist + i)->data); + } + } + + XtFree((char *)obj->canna.candlist); + } + + /* $B!X$+$s$J!Y$N=hM}(B */ + ksv.buffer = buf; + ksv.n_buffer = 512; + ksv.ks = &ks; + + wcKanjiControl((int)obj, KC_CLOSEUICONTEXT, (char *)&ksv); + + if (--nCannaContexts == 0) { + char **warn = 0; + + wcKanjiControl(0, KC_FINALIZE, (char *)&warn); + if (warn) { + char **p; + + for (p = warn; *p ; p++) { + XtAppWarning(XtWidgetToApplicationContext((Widget)obj), *p); + } + } + } + + deleteObject(obj); +} + +static Boolean +SetValues(cur, req, wid, args, num_args) +Widget cur; +Widget req; +Widget wid; +ArgList args; +Cardinal *num_args; +/* ARGSUSED */ +{ + CannaObject old = (CannaObject)cur; + CannaObject new = (CannaObject)wid; + + return False; +} + +static void +fix(obj) +CannaObject obj; +{ + /* $B3NDj$N=hM}(B */ + XtCallCallbackList((Widget)obj, obj->inputConv.fixcallback, + (XtPointer)NULL); /* $B!)!)!)(B */ +} + +static void +convend(obj) +CannaObject obj; +{ + XtCallCallbackList((Widget)obj, obj->inputConv.endcallback, + (XtPointer)NULL); +} + +/* + * keeping list of objects + */ +typedef struct _oblist_ { + CannaObject obj; + struct _oblist_ *next; +} ObjRec; + +static ObjRec *ObjList = NULL; + +static void +addObject(obj) +CannaObject obj; +{ + ObjRec *objp = XtNew(ObjRec); + + objp->obj = obj; + objp->next = ObjList; + ObjList = objp; +} + +static void +deleteObject(obj) +CannaObject obj; +{ + ObjRec *objp, *objp0; + + for (objp0 = NULL, objp = ObjList; + objp != NULL; + objp0 = objp, objp = objp->next) { + if (objp->obj == obj) { + if (objp0 == NULL) { + ObjList = objp->next; + } else { + objp0->next = objp->next; + } + XtFree((char *)objp); + return; + } + } +} + +/* + * Operations to canna.ibuf + */ + +/* cfuncdef + + changeTextForCanna -- ibuf $B$NFbMF$r(B kanji_status $B$rMQ$$$F=q$-49$($k!#(B + + + $B4pK\E*$K$O8uJdJ8;zNs$H8uJd0lMw9TJ8;zNs$K4X$7$F0J2<$N=hM}$r9T$&!#(B + + (1) $B$$$:$l$NJ8;zNs$b%F%-%9%H$,H?E>$7$F$$$kItJ,$H$=$&$G$J$$ItJ,(B + $B$,B8:_$7!"H?E>$7$F$$$kItJ,$O#1%+=j$7$+B8:_$7$J$$!#(B + (2) $B$7$?$,$C$F$$$:$l$NJ8;zNs$bH?E>$7$F$$$k$H$3$m$H$=$NN>C<$KH?E>(B + $B$7$F$$$J$$ItJ,$H$,B8:_$9$k>l9g$K#3ItJ,$KJ,$+$l$k$3$H$K$J$j!"(B + $BH?E>$7$F$$$kItJ,$N0LCV$d!"H?E>$7$F$$$k2U=j$,$J$$>l9g$J$I$r(B + $B9g$o$;$F9M$($F$b#3ItJ,0J>e$KJ,$+$l$k$3$H$O$J$$!#(B + (3) $B$7$?$,$C$F!"$$$:$l$NJ8;zNs$b:GBg#3$D$N%;%0%a%s%H$KJ,$1$FI=<((B + $B%&%#%8%'%C%H$KEO$9$h$&$K$9$k!#(B + + */ + +static +changeTextForCanna(cldata, ksp) +caddr_t cldata; +wcKanjiStatus *ksp; +{ + CannaObject obj = (CannaObject)cldata; + iBuf *ibuf = obj->canna.ibuf; + int offset = ibuf->offset, i; + + if (ksp->length == 0) { + ibuf->curseg = offset; + ibuf->nseg = offset; + ibuf->len[0 + offset] = ibuf->len[1 + offset] = + ibuf->len[2 + offset] = 0; + if (!obj->canna.lastTextLengthIsZero) { + obj->canna.textchanged = True; + obj->canna.lastTextLengthIsZero = True; + } + } + else if (ksp->length > 0) { + obj->canna.lastTextLengthIsZero = False; + ibuf->len[1 + offset] = ibuf->len[2 + offset] = 0; + if (ksp->revLen > 0) { + if (ksp->revPos == 0) { + int remain = ksp->length - ksp->revLen; + + copyInWchar(ksp->echoStr, ksp->revLen, + &(ibuf->str[0 + offset]), &(ibuf->size[0 + offset]), + &(ibuf->len[0 + offset])); + ibuf->curseg = offset; + ibuf->nseg = offset + 1; + if (remain) { + copyInWchar(ksp->echoStr + ksp->revLen, remain, + &(ibuf->str[1 + offset]), &(ibuf->size[1 + offset]), + &(ibuf->len[1 + offset])); + ibuf->nseg = offset + 2; + } + } + else { + int remain = ksp->length - ksp->revPos - ksp->revLen; + + copyInWchar(ksp->echoStr, ksp->revPos, + &(ibuf->str[0 + offset]), &(ibuf->size[0 + offset]), + &(ibuf->len[0 + offset])); + copyInWchar(ksp->echoStr + ksp->revPos, ksp->revLen, + &(ibuf->str[1 + offset]), &(ibuf->size[1 + offset]), + &(ibuf->len[1 + offset])); + ibuf->curseg = offset + 1; + ibuf->nseg = offset + 2; + if (remain) { + copyInWchar(ksp->echoStr + ksp->revPos + ksp->revLen, + remain, + &(ibuf->str[2 + offset]), &(ibuf->size[2 + offset]), + &(ibuf->len[2 + offset])); + ibuf->nseg = offset + 3; + } + } + } + else { + copyInWchar(ksp->echoStr, ksp->length, + &(ibuf->str[0 + offset]), &(ibuf->size[0 + offset]), + &(ibuf->len[0 + offset])); + ibuf->len[1 + offset] = ibuf->len[2 + offset] = 0; + ibuf->nseg = offset + 1; + ibuf->curseg = offset + 1; + } + obj->canna.textchanged = True; + } + /* $B%b!<%I(B */ + if (ksp->info & KanjiModeInfo) { + int modelen = 0; + + while (ksp->mode[modelen]) modelen++; + copyInWchar(ksp->mode, modelen, + &(ibuf->curmode), &(ibuf->modesize), &(ibuf->modelen)); + } + /* $B0lMw9T(B */ + if (ksp->info & KanjiGLineInfo) { + if (ksp->gline.length == 0) { + switch (ibuf->candstat) { + case CANNA_GLINE_Empty: + case CANNA_GLINE_End: + ibuf->candstat = CANNA_GLINE_Empty; + break; + case CANNA_GLINE_Start: + case CANNA_GLINE_Change: + ibuf->candstat = CANNA_GLINE_End; + break; + } + ibuf->curgseg = 0; + ibuf->ngseg = 0; + ibuf->gllen[0] = ibuf->gllen[1] = ibuf->gllen[2] = 0; + } + else if (ksp->gline.length > 0) { + switch (ibuf->candstat) { + case CANNA_GLINE_Empty: + case CANNA_GLINE_End: + ibuf->candstat = CANNA_GLINE_Start; + break; + case CANNA_GLINE_Start: + case CANNA_GLINE_Change: + ibuf->candstat = CANNA_GLINE_Change; + break; + } + ibuf->gllen[1] = ibuf->gllen[2] = 0; + if (ksp->gline.revLen > 0) { + if (ksp->gline.revPos == 0) { + int remain = ksp->gline.length - ksp->gline.revLen; + + copyInWchar(ksp->gline.line, ksp->gline.revLen, + &(ibuf->gline[0]), &(ibuf->glsize[0]), + &(ibuf->gllen[0])); + ibuf->curgseg = 0; + ibuf->ngseg = 1; + if (remain) { + copyInWchar(ksp->gline.line + ksp->gline.revLen, remain, + &(ibuf->gline[1]), &(ibuf->glsize[1]), + &(ibuf->gllen[1])); + ibuf->ngseg = 2; + } + } + else { + int remain = ksp->gline.length + - ksp->gline.revPos - ksp->gline.revLen; + + copyInWchar(ksp->gline.line, ksp->gline.revPos, + &(ibuf->gline[0]), &(ibuf->glsize[0]), + &(ibuf->gllen[0])); + copyInWchar(ksp->gline.line + ksp->gline.revPos, ksp->gline.revLen, + &(ibuf->gline[1]), &(ibuf->glsize[1]), + &(ibuf->gllen[1])); + ibuf->curgseg = 1; + ibuf->ngseg = 2; + if (remain) { + copyInWchar(ksp->gline.line + + ksp->gline.revPos + ksp->gline.revLen, + remain, + &(ibuf->gline[2]), &(ibuf->glsize[2]), + &(ibuf->gllen[2])); + ibuf->ngseg = 3; + } + } + } + else { + copyInWchar(ksp->gline.line, ksp->gline.length, + &(ibuf->gline[0]), &(ibuf->glsize[0]), + &(ibuf->gllen[0])); + ibuf->gllen[1] = ibuf->gllen[2] = 0; + ibuf->ngseg = 1; + ibuf->curgseg = 1; + } + } + for (i = 0 ; i < ibuf->ngseg ; i++) { + ibuf->ics[i].data = (char *)ibuf->gline[i]; + ibuf->ics[i].nchars = ibuf->gllen[i]; + ibuf->ics[i].nbytes = ibuf->gllen[i] * sizeof(wchar); + ibuf->ics[i].attr = ICAttrConverted; + } + if (ibuf->curgseg < ibuf->ngseg) { + ibuf->ics[ibuf->curgseg].attr |= ICAttrCurrentSegment; + } + } +} + +/* cfuncdef + + copyInWchar -- wchar $B$r%3%T!<$9$k!#(B + + ws, wlen $B$G<($5$l$?(B wchar $BJ8;zNs$r(B wsbuf $B$N%]%$%s%H@h$N%P%C%U%!$K3J(B + $BG<$9$k!#(Bwsbuf $B$N%5%$%:$O(B wssize $B$N%]%$%s%H@h$K3JG<$5$l$F$$$kCM$G;X(B + $BDj$5$l$k$,!"$=$l$G$O>.$5$$;~$O(B copyInWchar $BFb$G(B XtRealloc $B$5$l!"?7(B + $B$?$K%"%m%1!<%H$5$l$?%P%C%U%!$,(B wsbuf $B$N%]%$%s%H@h$K3JG<$5$l$k!#$^$?!"(B + $B%P%C%U%!$N?7$?$J%5%$%:$,(B wssize $B$N%]%$%s%H@h$K3JG<$5$l$k!#F@$i$l$?(B + $BJ8;z?t$,(Bwslen $B$N%]%$%s%H@h$K3JG<$5$l$k!#(B + + */ + +static +copyInWchar(ws, wlen, wsbuf, wssize, wslen) +wchar *ws; +int wlen; +wchar **wsbuf; +int *wssize, *wslen; +{ + int i; + + if (*wssize == 0) { + if ((*wsbuf = (wchar *)XtMalloc((wlen + 1) * sizeof(wchar))) + == (wchar *)0) { + /* $B%(%i!<$@(B */ + } + else { + *wssize = wlen + 1; + } + } + if (wlen + 1 > *wssize) { + if ((*wsbuf = (wchar *)XtRealloc((char *)*wsbuf, + (wlen + 1) * sizeof(wchar))) + == (wchar *)0) { + /* $B%(%i!<$@!#$I$&$9$l$PNI$$!)(B */ + } + else { + *wssize = wlen + 1; + } + } + *wslen = wlen; + (void)bcopy(ws, *wsbuf, wlen * sizeof(wchar)); + *(*wsbuf + wlen) = (wchar)0; + + return 0; /* $B#0$OFC$K0UL#$,L5$$(B */ +} + +/* cfuncdef + + fixProcForCanna -- $B3NDj$7$?J8;z$N=hM}$r9T$&(B + + */ + +static +fixProcForCanna(cldata, fixedstr, fixedlen) +caddr_t cldata; +wchar *fixedstr; +int fixedlen; +{ + CannaObject obj = (CannaObject)cldata; + iBuf *ib = obj->canna.ibuf; + int offset = ib->offset; + + if (offset < NConvertedSegments) { + shiftRight(ib); + offset = ib->offset; + } + else { + shiftLeft(ib); + } + copyInWchar(fixedstr, fixedlen, + &(ib->str[offset - 1]), &(ib->size[offset - 1]), + &(ib->len[offset - 1])); +} + +/* cfuncdef + + shiftRight -- ibuf $B$NJ8;z%P%C%U%!$N(B offset $B0J9_$r1&$K%7%U%H$9$k(B + + */ + +static +shiftRight(ib) +iBuf *ib; +{ + int i; + wchar *tmpbuf; + int tmpsize, tmplen; + int offset = ib->offset; + + tmpbuf = ib->str[ib->nseg]; + tmpsize = ib->size[ib->nseg]; + for (i = ib->nseg ; offset < i ; i--) { + ib->str[i] = ib->str[i - 1]; + ib->size[i] = ib->size[i - 1]; + ib->len[i] = ib->len[i - 1]; + } + ib->str[offset] = tmpbuf; + ib->size[offset] = tmpsize; + ib->offset++; + ib->nseg++; + ib->curseg++; +} + +/* cfuncdef + + shiftLeft -- ibuf $B$NJ8;z%P%C%U%!$N(B offset $B0JA0$r:8$K%7%U%H$9$k(B + + */ + +static +shiftLeft(ib) +iBuf *ib; +{ + int i; + wchar *tmpbuf; + int tmpsize, tmplen; + int offset = ib->offset; + + tmpbuf = ib->str[0]; + tmpsize = ib->size[0]; + for (i = 0 ; i < offset - 1 ; i++) { + ib->str[i] = ib->str[i + 1]; + ib->size[i] = ib->size[i + 1]; + ib->len[i] = ib->len[i + 1]; + } + ib->str[offset - 1] = tmpbuf; + ib->size[offset - 1] = tmpsize; +} + +/* cfuncdef + + shiftLeftAll -- ibuf $B$NJ8;z%P%C%U%!A4BN$r:8$K%7%U%H$9$k(B + + */ + +static +shiftLeftAll(ib) +iBuf *ib; +{ + int i; + wchar *tmpbuf; + int tmpsize, tmplen; + int nseg = ib->nseg; + + tmpbuf = ib->str[0]; + tmpsize = ib->size[0]; + for (i = 0 ; i < nseg - 1 ; i++) { + ib->str[i] = ib->str[i + 1]; + ib->size[i] = ib->size[i + 1]; + ib->len[i] = ib->len[i + 1]; + } + ib->str[nseg - 1] = tmpbuf; + ib->size[nseg - 1] = tmpsize; + ib->nseg--; + ib->curseg--; + ib->offset--; +} + +/* cfuncdef + + ibufInitialize -- ibuf $B$N=i4|2==hM}(B + */ + +static +ibufInitialize(obj) +CannaObject obj; +{ + int i; + iBuf *ib; + + ib = obj->canna.ibuf = (iBuf *)XtMalloc(sizeof(iBuf)); + if (ib == 0) { + /* $B%(%i!<$@!#$I$&$9$Y(B */ + } + for (i = 0 ; i < NConvertedSegments + 3 ; i++) { + ib->size[i] = 0; + ib->len[i] = 0; + } + ib->offset = ib->curseg = ib->nseg = 0; + ib->candstat = CANNA_GLINE_Empty; + for (i = 0 ; i < 3 ; i++) { + ib->gline[i] = 0; + ib->glsize[i] = ib->gllen[i] = 0; + } + ib->modesize = 0; + ib->modelen = 0; +} + +/* cfuncdef + + freeIBuf -- ibuf $B$N(B free + + */ + +static +freeIBuf(ib) +iBuf *ib; +{ + int i; + + if (ib == 0) { + return 0; + } + for (i = 0 ; i < NConvertedSegments + 3 ; i++) { + if (ib->size[i] > 0) { + XtFree((char *)ib->str[i]); + } + } + for (i = 0 ; i < 3 ; i++) { + if (ib->glsize[i] > 0) { + XtFree((char *)ib->gline[i]); + } + } + if (ib->modesize > 0) { + XtFree((char *)ib->curmode); + } + free(ib); + return 0; +} + +static +toJapaneseMode(obj) +CannaObject obj; +{ + wcKanjiStatusWithValue ksv; + wcKanjiStatus ks; + wchar buf[1024]; + + buf[0] = '@'; + ksv.ks = &ks; + ksv.buffer = buf; + ksv.n_buffer = 1024; +#ifndef KC_DO + ksv.val = CANNA_MODE_HenkanMode; + wcKanjiControl((int)obj, KC_CHANGEMODE, (char *)&ksv); +#else + ksv.val = CANNA_FN_JapaneseMode; + wcKanjiControl((int)obj, KC_DO, (char *)&ksv); +#endif + changeTextForCanna(obj, &ks); +} + +/* checkIfFunctionalChar -- $B%7%U%H%-!<$N$h$&$KL50UL#$J%-!<$+$I$&$+$NH=JL(B + + $BCM(B: $B#1(B $B0UL#$,$"$k(B + $B#0(B $BL50UL#(B($B%b%G%#%U%!%$%"%-!<$J$I(B) +*/ + +static int +checkIfFunctionalChar(event_struct, keysym, buffer_return, n_buffer) +XKeyEvent *event_struct; +KeySym keysym; +wchar *buffer_return; +int n_buffer; +{ + int functionalChar = 0; + + switch ((int)keysym) + { + case XK_KP_F1: + case XK_KP_F2: + case XK_KP_F3: + case XK_KP_F4: + *buffer_return = CANNA_KEY_PF1 + (int)keysym - (int)XK_KP_F1; + functionalChar = 1; + break; + case XK_F1: + case XK_F2: + case XK_F3: + case XK_F4: + case XK_F5: + case XK_F6: + case XK_F7: + case XK_F8: + case XK_F9: + case XK_F10: + case XK_F11: + case XK_F12: + case XK_F13: + case XK_F14: + case XK_F15: + case XK_F16: + *buffer_return = CANNA_KEY_F1 + (int)keysym - (int)XK_F1; + functionalChar = 1; + break; + case XK_Insert: + *buffer_return = CANNA_KEY_Insert; + functionalChar = 1; + break; + case XK_Prior: + *buffer_return = CANNA_KEY_Rollup; + functionalChar = 1; + break; + case XK_Next: + *buffer_return = CANNA_KEY_Rolldown; + functionalChar = 1; + break; + case XK_Muhenkan: + if (event_struct->state & 4 /* control-shifted */) + *buffer_return = CANNA_KEY_Cntrl_Nfer; + else if (event_struct->state & 1 /* shifted */) + *buffer_return = CANNA_KEY_Shift_Nfer; + else + *buffer_return = CANNA_KEY_Nfer; + functionalChar = 1; + break; + case XK_Kanji: + if (event_struct->state & 4 /* control-shifted */) + *buffer_return = CANNA_KEY_Cntrl_Xfer; + else if (event_struct->state & 1 /* shifted */) + *buffer_return = CANNA_KEY_Shift_Xfer; + else + *buffer_return = CANNA_KEY_Xfer; + functionalChar = 1; + break; + case XK_Up: + if (event_struct->state & 4 /* control-shifted */) + *buffer_return = CANNA_KEY_Cntrl_Up; + else if (event_struct->state & 1 /* shifted */) + *buffer_return = CANNA_KEY_Shift_Up; + else + *buffer_return = CANNA_KEY_Up; + functionalChar = 1; + break; + case XK_Down: + if (event_struct->state & 4 /* control-shifted */) + *buffer_return = CANNA_KEY_Cntrl_Down; + else if (event_struct->state & 1 /* shifted */) + *buffer_return = CANNA_KEY_Shift_Down; + else + *buffer_return = CANNA_KEY_Down; + functionalChar = 1; + break; + case XK_Right: + if (event_struct->state & 4 /* control-shifted */) + *buffer_return = CANNA_KEY_Cntrl_Right; + else if (event_struct->state & 1 /* shifted */) + *buffer_return = CANNA_KEY_Shift_Right; + else + *buffer_return = CANNA_KEY_Right; + functionalChar = 1; + break; + case XK_Left: + if (event_struct->state & 4 /* control-shifted */) + *buffer_return = CANNA_KEY_Cntrl_Left; + else if (event_struct->state & 1 /* shifted */) + *buffer_return = CANNA_KEY_Shift_Left; + else + *buffer_return = CANNA_KEY_Left; + functionalChar = 1; + break; + case XK_Help: + *buffer_return = CANNA_KEY_Help; + functionalChar = 1; + break; + case XK_Home: + *buffer_return = CANNA_KEY_Home; + functionalChar = 1; + break; + } + return functionalChar; +} + +#ifdef KC_SETLISTCALLBACK + +static void +moveSelection(obj, dir) +CannaObject obj; +int dir; +{ + ICSelectionControlArg arg; + + arg.command = ICSelectionMove; + arg.u.dir = dir; + XtCallCallbackList((Widget)obj, obj->inputConv.selectioncallback, + (XtPointer)&arg); +} + +static int +insertSelection(obj, selected) +CannaObject obj; +int selected; +{ + obj->canna.curcand = selected; + *(obj->canna.cur_addr) = selected; + + return 0; +} + +static void +endSelection(obj, abort) +CannaObject obj; +int abort; +{ + ICSelectionControlArg arg; + int selected; + + if (ignoreListfunc) return; /* SelectItem $B$G=hM}$5$l$k$N$G$3$3$OITMW(B */ + arg.command = ICSelectionEnd; + arg.u.current_item = -1; + XtCallCallbackList((Widget)obj, obj->inputConv.selectioncallback, + (XtPointer)&arg); + + if (!abort && (selected = arg.u.current_item) >= 0) { + insertSelection(obj, selected); + } +} + +#ifdef CANNA_LIST_Query +static void +querySelection(obj) +CannaObject obj; +{ + ICSelectionControlArg arg; + int selected; + + if (ignoreListfunc) return; /* SelectItem $B$G=hM}$5$l$k$N$G$3$3$OITMW(B */ + arg.command = ICSelectionGet; + arg.u.current_item = -1; + XtCallCallbackList((Widget)obj, obj->inputConv.selectioncallback, + (XtPointer)&arg); + + if ((selected = arg.u.current_item) >= 0) { + insertSelection(obj, selected); + } +} +#endif + +static void +openSelection(obj, func, curitem) +CannaObject obj; +int func; /* $B0lHV>e$r8+$h(B */ +int curitem; +{ + ICSelectionControlArg arg; + static int current = 0; + static int doit = 0; + + if (func == SELECTION_SET) { + current = curitem; + doit = 1; + } + else if (func == SELECTION_DO && doit) { + doit = 0; + arg.command = ICSelectionStart; + arg.u.selection_kind = ICSelectionCandidates; + XtCallCallbackList((Widget)obj, obj->inputConv.selectioncallback, + (XtPointer)&arg); + + /* set current item */ + arg.command = ICSelectionSet; + arg.u.current_item = current; + XtCallCallbackList((Widget)obj, obj->inputConv.selectioncallback, + (XtPointer)&arg); + } +} + +static void getAllCandidates(); + +/* listfunc -- $B8uJd0lMw%b!<%I$K$J$C$?;~$K8F$S=P$5$l$k4X?t(B + * + * obj : KC_SETLISTCALLBACK $B$G@_Dj$7$?%/%i%$%"%s%H%G!<%?(B + * func : $B8uJd0lMw5!G=$N8GM-$N5!G=$rI=$9#I#D(B + * items : Start $B$N;~$K$O8uJd0lMw$NA4%"%$%F%`$,F~$k(B + * nitems : $B!7(B $BA4%"%$%F%`$N?t$,F~$k(B + * cur_item : $B!7(B $B%+%l%s%H%"%$%F%`HV9f$r3JG<$9$k%"%I%l%9$,F~$k(B + */ + +static CANNA_LISTFUNCTYPE +listfunc(obj, func, items, nitems, cur_item) +CannaObject obj; +int func; +wchar **items; +int nitems, *cur_item; +{ + ICSelectionControlArg arg; + int i; + wchar **p; + + switch (func) { + case CANNA_LIST_Start: + getAllCandidates(obj, nitems, items); + obj->canna.numcand = nitems; + obj->canna.curcand = *cur_item; + obj->canna.cur_addr = cur_item; + openSelection(obj, SELECTION_SET, *cur_item); + break; + case CANNA_LIST_Select: + endSelection(obj, False); + break; + case CANNA_LIST_Quit: + endSelection(obj, True); + break; +#ifdef CANNA_LIST_Query + case CANNA_LIST_Query: + querySelection(obj); + break; +#endif +#ifdef CANNA_LIST_Convert + case CANNA_LIST_Convert: +#endif + case CANNA_LIST_Forward: + moveSelection(obj, ICMoveRight); + break; + case CANNA_LIST_Backward: + moveSelection(obj, ICMoveLeft); + break; + case CANNA_LIST_Next: + moveSelection(obj, ICMoveDown); + break; + case CANNA_LIST_Prev: + moveSelection(obj, ICMoveUp); + break; + case CANNA_LIST_BeginningOfLine: + moveSelection(obj, ICMoveLeftMost); + break; + case CANNA_LIST_EndOfLine: + moveSelection(obj, ICMoveRightMost); + break; +#ifdef CANNA_LIST_Insert + case CANNA_LIST_Insert: + return 0; +#endif + } +#ifdef CANNA_LIST_Convert + return 1; +#endif +} + +static void +allocCandlist(obj, n) +CannaObject obj; +int n; +{ + ICString *p; + int i; + + if (n <= obj->canna.candlistsize) return; + + if (obj->canna.candlistsize == 0) { + p = (ICString *)XtMalloc(n * sizeof(ICString)); + } else { + p = (ICString *)XtRealloc((char *)obj->canna.candlist, + n * sizeof(ICString)); + } + for (i = obj->canna.candlistsize ; i < n ; i++) { + p[i].nbytes = p[i].nchars = (unsigned short)0; + p[i].data = (char *)0; + p[i].attr = 0; + } + + obj->canna.candlist = p; + obj->canna.candlistsize = n; +} + +static void +getAllCandidates(obj, ncand, items) +CannaObject obj; +int ncand; +wchar **items; +{ + ICString *strp; + wchar **p; + int i, bytes, chars; + + allocCandlist(obj, ncand); + + for (i = 0, strp = obj->canna.candlist, p = items ; + i < ncand; i++, strp++, p++) { + int len = 0; + + bytes = strp->nbytes; + chars = strp->nchars; + while ((*p)[len]) len++; + copyInWchar(*p, len, (wchar **)&(strp->data), &bytes, &chars); + strp->nbytes = bytes; + strp->nchars = chars; + strp->attr = ICAttrNormalString; + } +} +#endif /* KC_SETLISTCALLBACK */ + +struct _keymap { + unsigned char cannakey; + KeySym keysym; + long modifier; +} cannakeymap[] = { + {(unsigned char)'\b', XK_BackSpace, 0}, + {(unsigned char)'\t', XK_Tab, 0}, + {(unsigned char)'\n', XK_Linefeed, 0}, + {(unsigned char)'\013', XK_Clear, 0}, + {(unsigned char)'\r', XK_Return, 0}, + {(unsigned char)'\023', XK_Pause, 0}, + {(unsigned char)'\024', XK_Scroll_Lock, 0}, + {(unsigned char)'\e', XK_Escape, 0}, + {(unsigned char)CANNA_KEY_Nfer, XK_Muhenkan, 0}, + {(unsigned char)CANNA_KEY_Xfer, XK_Kanji, 0}, + {(unsigned char)CANNA_KEY_Up, XK_Up, 0}, + {(unsigned char)CANNA_KEY_Left, XK_Left, 0}, + {(unsigned char)CANNA_KEY_Right, XK_Right, 0}, + {(unsigned char)CANNA_KEY_Down, XK_Down, 0}, + {(unsigned char)CANNA_KEY_Insert, XK_Insert, 0}, + {(unsigned char)CANNA_KEY_Rollup, XK_Prior, 0}, + {(unsigned char)CANNA_KEY_Rolldown, XK_Next, 0}, + {(unsigned char)CANNA_KEY_Home, XK_Home, 0}, + {(unsigned char)CANNA_KEY_Help, XK_Help, 0}, + {(unsigned char)CANNA_KEY_KP_Key, XK_KP_Space, 0}, /* ? */ + {(unsigned char)CANNA_KEY_Shift_Nfer, XK_Muhenkan, ShiftMask}, + {(unsigned char)CANNA_KEY_Shift_Xfer, XK_Kanji, ShiftMask}, + {(unsigned char)CANNA_KEY_Shift_Up, XK_Up, ShiftMask}, + {(unsigned char)CANNA_KEY_Shift_Left, XK_Left, ShiftMask}, + {(unsigned char)CANNA_KEY_Shift_Right, XK_Right, ShiftMask}, + {(unsigned char)CANNA_KEY_Shift_Down, XK_Down, ShiftMask}, + {(unsigned char)CANNA_KEY_Cntrl_Nfer, XK_Muhenkan, ControlMask}, + {(unsigned char)CANNA_KEY_Cntrl_Xfer, XK_Kanji, ControlMask}, + {(unsigned char)CANNA_KEY_Cntrl_Up, XK_Up, ControlMask}, + {(unsigned char)CANNA_KEY_Cntrl_Left, XK_Left, ControlMask}, + {(unsigned char)CANNA_KEY_Cntrl_Right, XK_Right, ControlMask}, + {(unsigned char)CANNA_KEY_Cntrl_Down, XK_Down, ControlMask}, + {(unsigned char)CANNA_KEY_F1, XK_F1, 0}, + {(unsigned char)CANNA_KEY_F2, XK_F2, 0}, + {(unsigned char)CANNA_KEY_F3, XK_F3, 0}, + {(unsigned char)CANNA_KEY_F4, XK_F4, 0}, + {(unsigned char)CANNA_KEY_F5, XK_F5, 0}, + {(unsigned char)CANNA_KEY_F6, XK_F6, 0}, + {(unsigned char)CANNA_KEY_F7, XK_F7, 0}, + {(unsigned char)CANNA_KEY_F8, XK_F8, 0}, + {(unsigned char)CANNA_KEY_F9, XK_F9, 0}, + {(unsigned char)CANNA_KEY_F10, XK_F10, 0}, + {(unsigned char)CANNA_KEY_PF1, XK_KP_F1, 0}, + {(unsigned char)CANNA_KEY_PF2, XK_KP_F2, 0}, + {(unsigned char)CANNA_KEY_PF3, XK_KP_F3, 0}, + {(unsigned char)CANNA_KEY_PF4, XK_KP_F4, 0}, + {(unsigned char)CANNA_KEY_PF5, XK_F15, 0}, + {(unsigned char)CANNA_KEY_PF6, XK_F16, 0}, + {(unsigned char)CANNA_KEY_PF7, XK_F17, 0}, + {(unsigned char)CANNA_KEY_PF8, XK_F18, 0}, + {(unsigned char)CANNA_KEY_PF9, XK_F19, 0}, + {(unsigned char)CANNA_KEY_PF10, XK_F20, 0}, +}; + +#define NCANNAKEYMAP (sizeof(cannakeymap) / sizeof(struct _keymap)) + +/* ARGSUSED */ +static int +GetTriggerKeys(w, keys_return) +Widget w; +ICTriggerKey **keys_return; +{ + CannaObject obj = (CannaObject)w; + ICTriggerKey *keys; + unsigned char c, mkeys[256], *p, *ekeys; /* enough */ + int n; + struct _keymap *pk, *ek; + + n = wcKanjiControl((int)obj, KC_MODEKEYS, (char *)mkeys); + + *keys_return = keys = + (ICTriggerKey *)XtMalloc(2 * n * sizeof(ICTriggerKey)); + /* $B!V(B2 *$B!W$N0UL#(B: + $B0l$D$N%3!<%I$K(B2$B$D$N(B X $B$N%-!<$,B8:_$7$F$$$?$j$9$k;v$,$"$k!#(B + ($BNc(B) C-h $B"*(B Ctlh, Backspace */ + + if (keys) { + for (p = mkeys, ekeys = p + n ; p < ekeys ; p++, keys++) { + c = *p; + if (c == (unsigned char)0) { + keys->keysym = XK_space; + keys->modifiers = keys->modifiermask = ControlMask; + keys++; + keys->keysym = XK_at; + keys->modifiers = keys->modifiermask = ControlMask; + } + else if (c < ' ') { + keys->keysym = XK_quoteleft + c; + keys->modifiers = keys->modifiermask = ControlMask; + for (pk = cannakeymap, ek = cannakeymap + NCANNAKEYMAP ; + pk < ek ; pk++) { + if (c == pk->cannakey) { + keys++; + keys->keysym = pk->keysym; + keys->modifiers = keys->modifiermask = pk->modifier; + } + } + } + else if (c <= '~') { + keys->keysym = XK_space + (c - (unsigned char)' '); + keys->modifiers = keys->modifiermask = 0; + } + else if (c == 0x7f) { + keys->keysym = XK_Delete; + keys->modifiers = keys->modifiermask = 0; + } + else if ((unsigned char)0xa1 <= c && c <= (unsigned char)0xdf) { + keys->keysym = XK_kana_fullstop + (c - (unsigned char)0xa1); + keys->modifiers = keys->modifiermask = pk->modifier; + } + else { + keys--; + for (pk = cannakeymap, ek = cannakeymap + NCANNAKEYMAP ; + pk < ek ; pk++) { + if (c == pk->cannakey) { + keys++; + keys->keysym = pk->keysym; + keys->modifiers = keys->modifiermask = pk->modifier; + } + } + } + } + return n; + } + return 0; +} + +/* ARGSUSED */ +static int +PreeditString(w, segn, offset, encoding, format, length, string) +Widget w; +int segn; +int offset; +Atom *encoding; +int *format; +int *length; +XtPointer *string; +{ + CannaObject obj = (CannaObject)w; + iBuf *ib = obj->canna.ibuf; + int i; + wchar *wbuf, *wp; + int len, wlen; + extern int convJWStoCT(); + + if (ib == NULL) return -1; + if (segn < ib->nseg && offset >= ib->len[segn]) { + /* $B%;%0%a%s%H$N:G8e(B */ + ++segn; + offset = 0; + } + if (segn >= ib->nseg || offset >= ib->len[segn]) { + /* $B:o=|$5$l$?(B */ + *encoding = XA_COMPOUND_TEXT(XtDisplayOfObject(w)); + *format = 8; + *length = 0; + *string = (XtPointer)XtMalloc(1); + return 0; + } + + wlen = 0; + for (i = segn; i < ib->nseg; i++) { + wlen += ib->len[i]; + } + wlen -= offset; + + wp = wbuf = (wchar *)XtMalloc((wlen + 1) * sizeof(wchar)); + len = ib->len[segn] - offset; + (void)bcopy((char *)(ib->str[segn] + offset), (char *)wp, sizeof(wchar) * len); + wp += len; + for (i = segn + 1; i < ib->nseg; i++) { + len = ib->len[i]; + (void)bcopy((char *)ib->str[i], (char *)wp, sizeof(wchar) * len); + wp += len; + } + wbuf[wlen] = 0; + + /* + * Canna $B%*%V%8%'%/%H$O(B COMPOUND_TEXT $B%(%s%3!<%G%#%s%0$7$+%5%]!<%H$7$J$$(B + * COMPOUND_TEXT $B$KJQ49$9$k(B + */ + *encoding = XA_COMPOUND_TEXT(XtDisplayOfObject(w)); + *format = 8; + + /* COMPOUND_TEXT $B$O(B \r $B$,Aw$l$J$$$N$G(B \n $B$KJQ49$7$F$*$/(B */ + for (wp = wbuf; *wp != 0; wp++) { + if (*wp == '\r') *wp = '\n'; + } + + *length = len = convJWStoCT(wbuf, (unsigned char *)NULL, 0); + *string = (XtPointer)XtMalloc(len + 1); + (void)convJWStoCT(wbuf, (unsigned char *)*string, 0); + + /* wbuf $B$r(B free $B$7$F$*$/(B */ + XtFree((char *)wbuf); + + return 0; +} + +/* ARGSUSED */ +static int +StatusString(w, encoding, format, length, string, nchars) +Widget w; +Atom *encoding; +int *format; +int *length; +XtPointer *string; +int *nchars; +{ + ICString *seg; + wchar *wbuf, *wp; + int len, wlen; + extern int convJWStoCT(); + + seg = GetMode(w); + if (seg == NULL) { + *length = *nchars = 0; + return -1; + } + + wlen = seg->nchars; + if (wlen <= 0) { + *length = *nchars = 0; + return -1; + } + + /* + * data $B$KF~$C$F$$$kJQ49%F%-%9%H$O(B null $B%?!<%_%M!<%H$5$l$F$$$J$$$+$b(B + * $B$7$l$J$$$N$G!"$^$:%3%T!<$7$F(B null $B%?!<%_%M!<%H$9$k(B + */ + wbuf = (wchar *)XtMalloc((wlen + 1) * sizeof(wchar)); + (void)bcopy(seg->data, (char *)wbuf, sizeof(wchar) * wlen); + wbuf[wlen] = 0; + + /* + * Canna $B%*%V%8%'%/%H$O(B COMPOUND_TEXT $B%(%s%3!<%G%#%s%0$7$+%5%]!<%H$7$J$$(B + * COMPOUND_TEXT $B$KJQ49$9$k(B + */ + *encoding = XA_COMPOUND_TEXT(XtDisplayOfObject(w)); + *format = 8; + + /* COMPOUND_TEXT $B$O(B \r $B$,Aw$l$J$$$N$G(B \n $B$KJQ49$7$F$*$/(B */ + for (wp = wbuf; *wp != 0; wp++) { + if (*wp == '\r') *wp = '\n'; + } + + *length = len = convJWStoCT(wbuf, (unsigned char *)NULL, 0); + *string = XtMalloc(len + 1); + (void)convJWStoCT(wbuf, (unsigned char *)*string, 0); + *nchars = seg->nchars; + + /* wbuf $B$r(B free $B$7$F$*$/(B */ + XtFree((char *)wbuf); + + return 0; +} diff -r 000000000000 -r 92745d501b9a lib/Canvas.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/Canvas.c Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,98 @@ +#ifndef lint +static char *rcsid = "$Id: Canvas.c,v 1.3 1991/09/23 03:57:20 ishisone Rel $"; +#endif +/* + * Copyright (c) 1990 Software Research Associates, Inc. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Software Research Associates not be + * used in advertising or publicity pertaining to distribution of the + * software without specific, written prior permission. Software Research + * Associates makes no representations about the suitability of this software + * for any purpose. It is provided "as is" without express or implied + * warranty. + * + * Author: Makoto Ishisone, Software Research Associates, Inc., Japan + */ + +#include +#include +#include "CanvasP.h" + +static XtResource resources[] = { +#define offset(field) XtOffset(CanvasWidget, canvas.field) + { XtNexposeCallback, XtCCallback, XtRCallback, sizeof(XtCallbackList), + offset(exposecallback), XtRCallback, (XtPointer)NULL }, + { XtNresizeCallback, XtCCallback, XtRCallback, sizeof(XtCallbackList), + offset(resizecallback), XtRCallback, (XtPointer)NULL }, +#undef offset +}; + +static void Redisplay(); +static void Resize(); + +CanvasClassRec canvasClassRec = { + { /* core fields */ + /* superclass */ (WidgetClass) &widgetClassRec, + /* class_name */ "Canvas", + /* widget_size */ sizeof(CanvasRec), + /* class_initialize */ NULL, + /* class_part_initialize */ NULL, + /* class_inited */ FALSE, + /* initialize */ NULL, + /* initialize_hook */ NULL, + /* realize */ XtInheritRealize, + /* actions */ NULL, + /* num_actions */ 0, + /* resources */ resources, + /* num_resources */ XtNumber(resources), + /* xrm_class */ NULLQUARK, + /* compress_motion */ TRUE, + /* compress_exposure */ TRUE, + /* compress_enterleave */ TRUE, + /* visible_interest */ FALSE, + /* destroy */ NULL, + /* resize */ Resize, + /* expose */ Redisplay, + /* set_values */ NULL, + /* set_values_hook */ NULL, + /* set_values_almost */ XtInheritSetValuesAlmost, + /* get_values_hook */ NULL, + /* accept_focus */ NULL, + /* version */ XtVersion, + /* callback_private */ NULL, + /* tm_table */ NULL, + /* query_geometry */ XtInheritQueryGeometry, + /* display_accelerator */ XtInheritDisplayAccelerator, + /* extension */ NULL + }, + { /* canvas fields */ + /* empty */ 0 + } +}; + +WidgetClass canvasWidgetClass = (WidgetClass)&canvasClassRec; + +/* ARGSUSED */ +static void +Redisplay(w, event, region) +Widget w; +XEvent *event; +Region region; +{ + CanvasWidget csw = (CanvasWidget)w; + + XtCallCallbackList(w, csw->canvas.exposecallback, (XtPointer)event); +} + +static void +Resize(w) +Widget w; +{ + CanvasWidget csw = (CanvasWidget)w; + + XtCallCallbackList(w, csw->canvas.resizecallback, (XtPointer)NULL); +} diff -r 000000000000 -r 92745d501b9a lib/CanvasShel.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/CanvasShel.c Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,155 @@ +#ifndef lint +static char *rcsid = "$Id: CanvasShel.c,v 1.7 1991/09/23 04:03:55 ishisone Rel $"; +#endif +/* + * Copyright (c) 1990 Software Research Associates, Inc. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Software Research Associates not be + * used in advertising or publicity pertaining to distribution of the + * software without specific, written prior permission. Software Research + * Associates makes no representations about the suitability of this software + * for any purpose. It is provided "as is" without express or implied + * warranty. + * + * Author: Makoto Ishisone, Software Research Associates, Inc., Japan + */ + +#include +#include +#include "CanvasSheP.h" + +static XtResource resources[] = { +#define offset(field) XtOffset(CanvasShellWidget, canvasshell.field) + { XtNcursor, XtCCursor, XtRCursor, sizeof(Cursor), + offset(cursor), XtRImmediate, (XtPointer)None }, + { XtNexposeCallback, XtCCallback, XtRCallback, sizeof(XtCallbackList), + offset(exposecallback), XtRCallback, (XtPointer)NULL }, + { XtNresizeCallback, XtCCallback, XtRCallback, sizeof(XtCallbackList), + offset(resizecallback), XtRCallback, (XtPointer)NULL }, +#undef offset +}; + +static void Redisplay(); +static void Realize(); +static void Resize(); +static Boolean SetValues(); + +CanvasShellClassRec canvasShellClassRec = { + { /* core fields */ + /* superclass */ (WidgetClass) &adoptedShellClassRec, + /* class_name */ "CanvasShell", + /* widget_size */ sizeof(CanvasShellRec), + /* class_initialize */ NULL, + /* class_part_initialize */ NULL, + /* class_inited */ FALSE, + /* initialize */ NULL, + /* initialize_hook */ NULL, + /* realize */ Realize, + /* actions */ NULL, + /* num_actions */ 0, + /* resources */ resources, + /* num_resources */ XtNumber(resources), + /* xrm_class */ NULLQUARK, + /* compress_motion */ TRUE, + /* compress_exposure */ TRUE, + /* compress_enterleave */ TRUE, + /* visible_interest */ FALSE, + /* destroy */ NULL, + /* resize */ Resize, + /* expose */ Redisplay, + /* set_values */ SetValues, + /* set_values_hook */ NULL, + /* set_values_almost */ XtInheritSetValuesAlmost, + /* get_values_hook */ NULL, + /* accept_focus */ NULL, + /* version */ XtVersion, + /* callback_private */ NULL, + /* tm_table */ NULL, + /* query_geometry */ XtInheritQueryGeometry, + /* display_accelerator */ XtInheritDisplayAccelerator, + /* extension */ NULL + }, + { /* Composite */ + /* geometry_manager */ XtInheritGeometryManager, + /* change_managed */ XtInheritChangeManaged, + /* insert_child */ XtInheritInsertChild, + /* delete_child */ XtInheritDeleteChild, + /* extension */ NULL + }, + { /* Shell */ + /* extension */ NULL + }, + { /* overrideShell fields */ + /* extension */ NULL + }, + { /* AdoptedShell fields */ + /* empty */ 0 + }, + { /* canvasShell fields */ + /* empty */ 0 + } +}; + +WidgetClass canvasShellWidgetClass = (WidgetClass)&canvasShellClassRec; + +/* ARGSUSED */ +static void +Redisplay(w, event, region) +Widget w; +XEvent *event; +Region region; +{ + CanvasShellWidget csw = (CanvasShellWidget)w; + + XtCallCallbackList(w, csw->canvasshell.exposecallback, (XtPointer)event); +} + +static void +Resize(w) +Widget w; +{ + CanvasShellWidget csw = (CanvasShellWidget)w; + + XtCallCallbackList(w, csw->canvasshell.resizecallback, (XtPointer)NULL); +} + +static void +Realize(w, maskp, attr) +Widget w; +XtValueMask *maskp; +XSetWindowAttributes *attr; +{ + CanvasShellWidget csw = (CanvasShellWidget)w; + + if (csw->canvasshell.cursor != None) { + *maskp |= CWCursor; + attr->cursor = csw->canvasshell.cursor; + } + *maskp |= CWBitGravity; + attr->bit_gravity = NorthWestGravity; + (*canvasShellWidgetClass->core_class.superclass->core_class.realize)(w, maskp, attr); +} + +/* ARGSUSED */ +static Boolean +SetValues(cur, req, new, args, num_args) +Widget cur; +Widget req; +Widget new; +ArgList args; +Cardinal *num_args; +{ + CanvasShellWidget csw = (CanvasShellWidget)new; + CanvasShellWidget old = (CanvasShellWidget)cur; + + if (csw->canvasshell.cursor != old->canvasshell.cursor && + XtIsRealized(new)) { + XDefineCursor(XtDisplay(new), XtWindow(new), csw->canvasshell.cursor); + } + + return False; +} diff -r 000000000000 -r 92745d501b9a lib/CcWnn.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/CcWnn.c Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,2788 @@ +#ifndef lint +static char *rcsid = "$Id: CcWnn.c,v 1.59 2002/01/10 15:51:47 ishisone Exp $"; +#endif +/* + * Copyright (c) 1990 Software Research Associates, Inc. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Software Research Associates not be + * used in advertising or publicity pertaining to distribution of the + * software without specific, written prior permission. Software Research + * Associates makes no representations about the suitability of this software + * for any purpose. It is provided "as is" without express or implied + * warranty. + * + * Author: Makoto Ishisone, Software Research Associates, Inc., Japan + */ + +#include +#include +#include +#if XtSpecificationRelease > 4 +#include +#endif +#include "CcWnnP.h" +#include "CachedAtom.h" +#include "IOECall.h" + +#define DEBUG_VAR debug_CcWnn +#include "DebugPrint.h" + +static XtResource resources[] = { +#define offset(field) XtOffset(CcWnnObject, ccWnn.field) + { XtNconfirmFunc, XtCFunction, XtRPointer, sizeof(int (*)()), + offset(confirmfunc), XtRPointer, (XtPointer)NULL }, + { XtNconfirmData, XtCConfirmData, XtRPointer, sizeof(XtPointer), + offset(confirmdata), XtRPointer, (XtPointer)NULL }, + { XtNjserver, XtCJserver, XtRString, sizeof(String), + offset(jservername), XtRString, NULL }, + { XtNjserver2nd, XtCJserver, XtRString, sizeof(String), + offset(jservername2), XtRString, NULL }, + { XtNwnnEnvname, XtCWnnEnvname, XtRString, sizeof(String), + offset(wnnenvname), XtRString, NULL }, + { XtNwnnEnvrc, XtCWnnEnvrc, XtRString, sizeof(String), + offset(wnnenvrcfile), XtRString, NULL }, + { XtNwnnEnvrc4, XtCWnnEnvrc, XtRString, sizeof(String), + offset(wnnenvrcfile4), XtRString, NULL }, + { XtNwnnEnvrc6, XtCWnnEnvrc, XtRString, sizeof(String), + offset(wnnenvrcfile6), XtRString, NULL }, + { XtNwnnOverrideEnv, XtCWnnOverrideEnv, XtRBoolean, sizeof(Boolean), + offset(wnnoverrideenv), XtRString, "false" }, + { XtNccdef, XtCCcdef, XtRString, sizeof(String), + offset(ccdeffile), XtRString, NULL }, + { XtNwnnEnv, XtCWnnEnv, XtRWnnEnv, sizeof(struct wnn_buf *), + offset(wnnbuf), XtRWnnEnv, NULL}, + { XtNccRule, XtCCcRule, XtRCcRule, sizeof(ccRule), + offset(ccrule), XtRCcRule, NULL}, + { XtNsaveInterval, XtCSaveInterval, XtRInt, sizeof(int), + offset(saveinterval), XtRImmediate, 0 }, +#undef offset +}; + +static void ClassInitialize(); +static int buildSymbolList(); +static void Initialize(), Destroy(); +static Boolean SetValues(); +static int InputEvent(); +static ICString *GetMode(); +static int CursorPos(); +static int NumSegments(); +static ICString *GetSegment(); +static int CompareSegment(); +static ICString *GetItemList(); +static int SelectItem(); +static int ConvertedString(); +static int ClearConversion(); +static ICString *GetAuxSegments(); +static int PreeditString(); +static int StatusString(); + +CcWnnClassRec ccWnnClassRec = { + { /* object fields */ + /* superclass */ (WidgetClass) &inputConvClassRec, + /* class_name */ "CcWnn", + /* widget_size */ sizeof(CcWnnRec), + /* class_initialize */ ClassInitialize, + /* class_part_initialize */ NULL, + /* class_inited */ FALSE, + /* initialize */ Initialize, + /* initialize_hook */ NULL, + /* obj1 */ NULL, + /* obj2 */ NULL, + /* obj3 */ 0, + /* resources */ resources, + /* num_resources */ XtNumber(resources), + /* xrm_class */ NULLQUARK, + /* obj4 */ FALSE, + /* obj5 */ FALSE, + /* obj6 */ FALSE, + /* obj7 */ FALSE, + /* destroy */ Destroy, + /* obj8 */ NULL, + /* obj9 */ NULL, + /* set_values */ SetValues, + /* set_values_hook */ NULL, + /* obj10 */ NULL, + /* get_values_hook */ NULL, + /* obj11 */ NULL, + /* version */ XtVersion, + /* callback_private */ NULL, + /* obj12 */ NULL, + /* obj13 */ NULL, + /* obj14 */ NULL, + /* extension */ NULL + }, + { /* inputConv fields */ + /* InputEvent */ InputEvent, + /* GetMode */ GetMode, + /* CursorPos */ CursorPos, + /* NumSegments */ NumSegments, + /* GetSegment */ GetSegment, + /* CompareSegment */ CompareSegment, + /* GetItemList */ GetItemList, + /* SelectItem */ SelectItem, + /* GetConvetedString */ ConvertedString, + /* ClearConversion */ ClearConversion, + /* GetAuxSegments */ GetAuxSegments, + /* SupportMultipleObjects */ True, + /* GetTriggerKeys */ XtInheritGetTriggerKeys, + /* num_trigger_keys */ 0, + /* trigger_keys */ NULL, + /* GetPreeditString */ PreeditString, + /* GetStatusString */ StatusString, + /* NoMoreObjects */ False, + }, + { /* ccWnn fields */ + /* foo */ 0, + } +}; + +WidgetClass ccWnnObjectClass = (WidgetClass)&ccWnnClassRec; + +/* cconv function table */ +static char *fepfunctbl[] = { + "convert", + "convert-or-fix1", + "convert-or-space", + "convert-or-sendback", + "convert-s", + "unconvert", + "next", + "next-s", + "previous", + "previous-s", + "forward", + "backward", + "move-top", + "move-bottom", + "clear", + "expand", + "expand-s", + "shrink", + "shrink-s", + "expand-noconv", + "expand-noconv-s", + "shrink-noconv", + "shrink-noconv-s", + "fix", + "fix2", + "fix-or-cr", + "fix-or-sendback", + "to-hankaku", + "to-zenkaku", + "to-hiragana", + "to-katakana", + "backspace", + "delete", + "kill-line", + "carriage-return", + "fix-and-write", + "beep", + "jiscode-begin", + "jiscode-end", + "kutencode-begin", + "kutencode-end", + "symbol-input", + "end-conversion", + "send-back", + "convert-move-top-or-sendback", + "convert-move-top-or-space", + "clear-or-cancel", + "backspace-or-cancel", + "delete-or-cancel", + "convert-next-or-move-top-or-sendback", + "convert-next-or-move-top-or-space", + "select", + "select-s", + "register", +}; +#define FTSIZE (sizeof(fepfunctbl) / sizeof(char *)) + +static void convert(); +static void convert_f1(); +static void convert_sb(); +static void convert_sp(); +static void convert_s(); +static void convert_mt_sb(); +static void convert_mt_sp(); +static void unconvert(); +static void egg_select(); +static void egg_select_s(); + +static void move_forward(); +static void move_backward(); +static void move_top(); +static void move_bottom(); + +static void cand_next(); +static void cand_next_s(); +static void cand_next_mt_sb(); +static void cand_next_mt_sp(); +static void cand_prev(); +static void cand_prev_s(); + +static void expand_cl(); +static void expand_cl_s(); +static void shrink_cl(); +static void shrink_cl_s(); +static void expand_cl2(); +static void expand_cl2_s(); +static void shrink_cl2(); +static void shrink_cl2_s(); + +static void clear_buffer(); +static void clear_c(); + +static void sel_top(); +static void sel_bottom(); +static void sel_forward(); +static void sel_backward(); +static void sel_next(); +static void sel_prev(); +static void sel_select(); +static void sel_abort(); + +static void fix(); +static void fix1(); +static void fix_cr(); +static void fix_sb(); + +static void hankaku(); +static void zenkaku(); + +static void hiragana(); +static void katakana(); + +static void backspace(); +static void backspace_c(); +static void delete(); +static void delete_c(); +static void kill_line(); + +static void bell(); +static void beep(); +static void carriageret(); +static void jiscode_begin(); +static void jiscode_end(); +static void kuten_begin(); +static void kuten_end(); + +static void sym_input(); +static void convend(); +static void send_back(); +static void register_word(); + +/* cconv function dispatch table */ +static void (*functable[][3])() = { +/* Function Name Normal-mode selection-mode symbol-mode */ +/* convert */ convert, sel_forward, beep, +/* convert-or-fix1 */ convert_f1, sel_forward, beep, +/* convert-or-sendback*/convert_sb, sel_forward, beep, +/* convert-or-space */ convert_sp, sel_forward, beep, +/* convert-s */ convert_s, sel_forward, beep, +/* unconvert */ unconvert, beep, beep, +/* next */ cand_next, sel_next, sel_next, +/* next-s */ cand_next_s, sel_next, sel_next, +/* previous */ cand_prev, sel_prev, sel_prev, +/* previous-s */ cand_prev_s, sel_prev, sel_prev, +/* forward */ move_forward, sel_forward, sel_forward, +/* backward */ move_backward, sel_backward, sel_backward, +/* move-top */ move_top, sel_top, sel_top, +/* move-bottom */ move_bottom, sel_bottom, sel_bottom, +/* clear */ clear_buffer, clear_buffer, clear_buffer, +/* expand */ expand_cl, expand_cl, beep, +/* expand-s */ expand_cl_s, expand_cl_s, beep, +/* shrink */ shrink_cl, shrink_cl, beep, +/* shrink-s */ shrink_cl_s, shrink_cl_s, beep, +/* expand-noconv */ expand_cl2, expand_cl2, beep, +/* expand-noconv-s */ expand_cl2_s, expand_cl2_s, beep, +/* shrink-noconv */ shrink_cl2, shrink_cl2, beep, +/* shrink-noconv-s */ shrink_cl2_s, shrink_cl2_s, beep, +/* fix */ fix, fix, fix, +/* fix2 */ fix, fix, fix, +/* fix-or-cr */ fix_cr, sel_select, sel_select, +/* fix-or-sendback */ fix_sb, sel_select, sel_select, +/* to-hankaku */ hankaku, hankaku, beep, +/* to-zenkaku */ zenkaku, zenkaku, beep, +/* to-hiragana */ hiragana, hiragana, beep, +/* to-katakana */ katakana, katakana, beep, +/* backspace */ backspace, backspace, backspace, +/* delete */ delete, delete, delete, +/* kill-line */ kill_line, kill_line, kill_line, +/* carriage-return */ carriageret, sel_select, sel_select, +/* fix-and-write */ fix, beep, beep, +/* beep */ bell, bell, bell, +/* jiscode-begin */ jiscode_begin, beep, beep, +/* jiscode-end */ jiscode_end, beep, beep, +/* kutencode-begin */ kuten_begin, beep, beep, +/* kutencode-end */ kuten_end, beep, beep, +/* symbol-input */ sym_input, beep, sel_abort, +/* end-conversion */ convend, convend, convend, +/* send-back */ send_back, send_back, send_back, +/* convert-move-..sb*/ convert_mt_sb, sel_forward, beep, +/* convert-move-..sp*/ convert_mt_sp, sel_forward, beep, +/* clear-or-cancel */ clear_c, clear_c, clear_c, +/* backspace-or-cancel */ backspace_c, backspace_c, backspace_c, +/* delete-or-cancel */ delete_c, delete_c, delete_c, +/* convert-next-..sb */ cand_next_mt_sb, sel_forward, beep, +/* convert-next-..sp */ cand_next_mt_sp, sel_forward, beep, +/* select */ egg_select, beep, beep, +/* select-s */ egg_select_s, beep, beep, +/* register */ register_word, beep, beep, +}; + +static ICString *SymbolList; +static int NumSymbols; + +static void ccInitialize(); +static void jcInitialize(); +static void createEnvError(); +static int createConfirm(); + +static int funcDispatch(); +static void defAction(); +static void insChar(); +static void delChar(); +static void autoFix(); + +static void startSelection(); +static void moveSelection(); +static int endSelection(); +static int insertSelection(); + +static int getSymbol(); + +static void normalState(); + +static void allocCandlist(); +static void allocStrdata(); +static void getAllCandidates(); + +static void addObject(); +static void deleteObject(); +static void serverDead(); + +static void saveData(); +static void restoreData(); + +static void ioeCallback(); + +static CcWnnObject findSelectionObj(); + +static Boolean convertSelection(); +static void saveYomiAndKanji(); + +static void +ClassInitialize() +{ + /* symbollist $B$r@_Dj(B */ + NumSymbols = buildSymbolList(&SymbolList); + /* I/O error $B%3!<%k%P%C%/4X?t$N@_Dj(B */ + XIOESet(ioeCallback, (XPointer)NULL); +} + +static int +buildSymbolList(listp) +ICString **listp; +{ + static struct symgroup { + int first; + int last; + } symgroups[] = { + { 0xa1a1, 0xa2ae }, /* '$B!!(B' - '$B".(B' */ + { 0xa2ba, 0xa2c1 }, /* '$B":(B' - '$B"A(B' */ + { 0xa2ca, 0xa2d0 }, /* '$B"J(B' - '$B"P(B' */ + { 0xa2dc, 0xa2ea }, /* '$B"\(B' - '$B"j(B' */ + { 0xa2f2, 0xa2f9 }, /* '$B"r(B' - '$B"y(B' */ + { 0xa2fe, 0xa2fe }, /* '$B"~(B' */ + { 0xa4ee, 0xa4ee }, /* '$B$n(B' */ + { 0xa4f0, 0xa4f1 }, /* '$B$p(B', '$B$q(B' */ + { 0xa5ee, 0xa5ee }, /* '$B%n(B' */ + { 0xa5f0, 0xa5f1 }, /* '$B%p(B', '$B%q(B' */ + { 0xa5f4, 0xa5f6 }, /* '$B%t(B', '$B%u(B', '$B%v(B' */ + { 0xa6a1, 0xa6b8 }, /* '$B&!(B' - '$B&8(B' */ + { 0xa6c1, 0xa6d8 }, /* '$B&A(B' - '$B&X(B' */ + { 0xa7a1, 0xa7c1 }, /* '$B'!(B' - '$B'A(B' */ + { 0xa7d1, 0xa7f1 }, /* '$B'Q(B' - '$B'q(B' */ + { 0xa8a1, 0xa8c0 }, /* '$B(!(B' - '$B(@(B' */ + { -1, -1 } + }; + struct symgroup *sgp; + Cardinal nsyms; + ICString *symlist, *sp; + wchar *buf, *p; + + for (nsyms = 0, sgp = symgroups; sgp->first > 0; sgp++) { +#define LINEAR_INDEX(c) (((((c)>>8)&0x7f)*94)+((c)&0x7f)) + nsyms += LINEAR_INDEX(sgp->last) - LINEAR_INDEX(sgp->first) + 1; + } + + symlist = (ICString *)XtMalloc(nsyms * sizeof(ICString)); + buf = (wchar *)XtMalloc(nsyms * sizeof(wchar)); + + sp = symlist; + p = buf; + for (sgp = symgroups; sgp->first > 0; sgp++) { + int i; +#define NEXT_CHAR(c) ((((c)&0xff)>0xfd)?(((c)&0xff00)+0x1a1):((c)+1)) + for (i = sgp->first; i <= sgp->last; i = NEXT_CHAR(i)) { + sp->nchars = 1; + sp->nbytes = sizeof(wchar); + sp->data = (char *)p; + sp->attr = ICAttrNormalString; + sp++; + *p++ = i; + } + } + + *listp = symlist; + return nsyms; +} + +static int +InputEvent(w, event) +Widget w; +XEvent *event; +{ + CcWnnObject obj = (CcWnnObject)w; + int sendback; + int ret = 0; + wchar *curmode; + + if (event->type != KeyPress /*&& event->type != KeyRelease*/) return 0; + + /* $B%$%Y%s%H$r%/%i%$%"%s%H$KAw$jJV$9$+$I$&$+$NH=Dj$=$N(B 1 */ + sendback = (NumSegments(w) == 0 && obj->ccWnn.state == normal_state); + + obj->ccWnn.sendbackevent = False; + obj->ccWnn.fixperformed = False; + obj->ccWnn.textchanged = False; + + /* + * $B$b$7!"(Bwnnbuf $B$,L$3MF@$G$"$k$+(B ($B$3$s$J$3$H$O!"$"$j$($J$$$H;W$&$,(B)$B!"(B + * jserver $B$,;`$s$@$J$I$NM}M3$G(B jserver $B$H$N@\B3$,@Z$l$F$$$k$J$i$P!":F(B + * $B=i4|2=!J:F@\B3!K$r9T$J$&!#(B + */ + if (obj->ccWnn.wnnbuf == NULL || !jcIsConnect(obj->ccWnn.wnnbuf)) { + jcInitialize(obj); + /* $B:F@\B3$r;n$_$F$b!"$^$@@\B3$G$-$F$$$J$$$H$-$O!"%(%i!<$rJV$9(B */ + if (obj->ccWnn.wnnbuf == NULL || !jcIsConnect(obj->ccWnn.wnnbuf)) { + bell(obj); + return -1; + } + } + + wnn_errorno = 0; + curmode = ccGetModePrompt(obj->ccWnn.ccbuf); + + (void)ccConvchar(obj->ccWnn.ccbuf, (XKeyPressedEvent *)event); + + /* + * $B%(%i!ccWnn.jservername2 != NULL) jcInitialize(obj); + if (obj->ccWnn.wnnbuf == NULL || !jcIsConnect(obj->ccWnn.wnnbuf)) { + bell(obj); + ret = -1; + } + } + + /* $B%F%-%9%H$NJQ2=$r%A%'%C%/$9$k(B */ + if (obj->ccWnn.textchanged) { + XtCallCallbackList(w, obj->inputConv.textchangecallback, + (XtPointer)NULL); + obj->ccWnn.textchanged = False; + } + /* $BF~NO%b!<%I$r%A%'%C%/$9$k(B */ + if (wstrcmp(ccGetModePrompt(obj->ccWnn.ccbuf), curmode)) { + sendback = 0; + XtCallCallbackList(w, obj->inputConv.modechangecallback, + (XtPointer)NULL); + } + /* $B%$%Y%s%H$r%/%i%$%"%s%H$KAw$jJV$9$+$I$&$+$NH=Dj$=$N(B 2 */ + if (NumSegments(w) != 0 || + obj->ccWnn.state != normal_state || + obj->ccWnn.fixperformed) { + sendback = 0; + } + if (ret == 0 && (obj->ccWnn.sendbackevent || sendback)) ret = 1; + + return ret; +} + +static ICString * +GetMode(w) +Widget w; +{ + CcWnnObject obj = (CcWnnObject)w; + wchar *mode; + static ICString icstr; + + mode = ccGetModePrompt(obj->ccWnn.ccbuf); + icstr.data = (char *)mode; + icstr.nchars = wstrlen(mode); + icstr.nbytes = icstr.nchars * sizeof(wchar); + icstr.attr = ICAttrNormalString; + + return &icstr; +} + +static int +CursorPos(w, nsegp, ncharp) +Widget w; +Cardinal *nsegp; +Cardinal *ncharp; +{ + CcWnnObject obj = (CcWnnObject)w; + jcConvBuf *jcbuf = obj->ccWnn.jcbuf; + Cardinal nseg, nchar; + + if (jcbuf == NULL || jcIsConverted(jcbuf, jcbuf->curClause)) return 0; + + nseg = jcbuf->curClause; + nchar = jcDotOffset(jcbuf); + + if (nseg >= jcbuf->nClause) { + if (nseg == 0) { + nchar = 0; + } else { + jcClause *cinfo = jcbuf->clauseInfo; + nseg--; + nchar = cinfo[nseg + 1].dispp - cinfo[nseg].dispp; + } + } + + if (nsegp) *nsegp = nseg; + if (ncharp) *ncharp = nchar; + + return 1; +} + +static int +NumSegments(w) +Widget w; +{ + CcWnnObject obj = (CcWnnObject)w; + + return (obj->ccWnn.jcbuf != NULL) ? obj->ccWnn.jcbuf->nClause : 0; +} + +static ICString * +GetSegment(w, n) +Widget w; +Cardinal n; +{ + CcWnnObject obj = (CcWnnObject)w; + jcConvBuf *jcbuf = obj->ccWnn.jcbuf; + jcClause *cinfo = jcbuf->clauseInfo; + static ICString seg; + + if (jcbuf == NULL || n >= jcbuf->nClause) return NULL; + seg.data = (char *)cinfo[n].dispp; + seg.nchars = cinfo[n + 1].dispp - cinfo[n].dispp; + seg.nbytes = seg.nchars * sizeof(wchar); + seg.attr = cinfo[n].conv ? ICAttrConverted : ICAttrNotConverted; + if (n == jcbuf->curClause) { + seg.attr |= ICAttrCurrentSegment; + } else if (jcbuf->curLCStart <= n && n < jcbuf->curLCEnd) { + seg.attr |= ICAttrCurrentSubSegment; + } + return &seg; +} + +/* ARGSUSED */ +static int +CompareSegment(w, seg1, seg2, n) +Widget w; +ICString *seg1; +ICString *seg2; +Cardinal *n; +{ + wchar *p, *q; + int len, nsame; + int result = 0; + + if (seg1->attr != seg2->attr) result |= ICAttrChanged; + + len = seg1->nchars > seg2->nchars ? seg2->nchars : seg1->nchars; + nsame = 0; + p = (wchar *)seg1->data; + q = (wchar *)seg2->data; + while (nsame < len && *p++ == *q++) nsame++; + + if (nsame != len || len != seg1->nchars || len != seg2->nchars) + result |= ICStringChanged; + + if (n) *n = nsame; + + return result; +} + +static ICString * +GetItemList(w, n) +Widget w; +Cardinal *n; +{ + CcWnnObject obj = (CcWnnObject)w; + + switch (obj->ccWnn.state) { + case selection_l_state: + case selection_s_state: + *n = obj->ccWnn.numcand; + return obj->ccWnn.candlist; + case symbol_state: + *n = obj->ccWnn.numsymbols; + return obj->ccWnn.symbollist; + default: + *n = 0; + return NULL; /* no item available */ + } + /* NOTREACHED */ +} + +static int +SelectItem(w, n) +Widget w; +int n; +{ + CcWnnObject obj = (CcWnnObject)w; + int ret = 0; + + if (obj->ccWnn.state == normal_state) return -1; + + if (obj->ccWnn.jcbuf == NULL) { + ret = -1; + } else if (n >= 0) { + ret = insertSelection(obj, n); + if (obj->ccWnn.textchanged) { + XtCallCallbackList((Widget)obj, + obj->inputConv.textchangecallback, + (XtPointer)NULL); + obj->ccWnn.textchanged = False; + } + } + + obj->ccWnn.state = normal_state; + return ret; +} + +static int +ConvertedString(w, encoding, format, length, string) +Widget w; +Atom *encoding; +int *format; +int *length; +XtPointer *string; +{ + CcWnnObject obj = (CcWnnObject)w; + jcConvBuf *jcbuf = obj->ccWnn.jcbuf; + wchar *wbuf, *wp; + int len, wlen; + extern int convJWStoCT(); + + if (jcbuf == NULL) return -1; + + wlen = jcbuf->displayEnd - jcbuf->displayBuf; + if (wlen == 0) return -1; + + /* + * jcbuf $B$KF~$C$F$$$kJQ49%F%-%9%H$O(B null $B%?!<%_%M!<%H$5$l$F$$$J$$$N$G(B + * $B$^$:%3%T!<$7$F(B null $B%?!<%_%M!<%H$9$k(B + */ + wbuf = (wchar *)XtMalloc((wlen + 1) * sizeof(wchar)); + (void)bcopy((char *)jcbuf->displayBuf, (char *)wbuf, + sizeof(wchar) * wlen); + wbuf[wlen] = 0; + + /* + * CcWnn $B%*%V%8%'%/%H$O(B COMPOUND_TEXT $B%(%s%3!<%G%#%s%0$7$+%5%]!<%H$7$J$$(B + * COMPOUND_TEXT $B$KJQ49$9$k(B + */ + *encoding = XA_COMPOUND_TEXT(XtDisplayOfObject((Widget)obj)); + *format = 8; + + /* COMPOUND_TEXT $B$O(B \r $B$,Aw$l$J$$$N$G(B \n $B$KJQ49$7$F$*$/(B */ + for (wp = wbuf; *wp != 0; wp++) { + if (*wp == '\r') *wp = '\n'; + } + + *length = len = convJWStoCT(wbuf, (unsigned char *)NULL, 0); + *string = XtMalloc(len + 1); + (void)convJWStoCT(wbuf, (unsigned char *)*string, 0); + + /* wbuf $B$r(B free $B$7$F$*$/(B */ + XtFree((char *)wbuf); + + return 0; +} + +static int +ClearConversion(w) +Widget w; +{ + CcWnnObject obj = (CcWnnObject)w; + + if (obj->ccWnn.jcbuf == NULL) { + return 0; /* not -1, because it's already cleared */ + } + clear_buffer(obj); + XtCallCallbackList(w, obj->inputConv.textchangecallback, (XtPointer)NULL); + return 0; +} + +/* ARGSUSED */ +static ICString * +GetAuxSegments(w, n, ns, nc) +Widget w; +Cardinal *n, *ns, *nc; +{ + /* CcWnn doesn't use AuxPanel */ + XtAppWarning(XtWidgetToApplicationContext(w), + "ccWnn Object: GetAuxSegments shouldn't be called"); + return NULL; +} + +/* ARGSUSED */ +static void +Initialize(req, new, args, num_args) +Widget req; +Widget new; +ArgList args; +Cardinal *num_args; +{ + CcWnnObject obj = (CcWnnObject)new; + + obj->ccWnn.ccrule = NULL; + obj->ccWnn.jcbuf = NULL; + obj->ccWnn.state = normal_state; + obj->ccWnn.selectionending = False; + obj->ccWnn.textchanged = False; + obj->ccWnn.symbollist = SymbolList; + obj->ccWnn.numsymbols = NumSymbols; + obj->ccWnn.cursymbol = 0; + obj->ccWnn.candlist = NULL; + obj->ccWnn.candlistsize = 0; + obj->ccWnn.numcand = 0; + obj->ccWnn.strdata = NULL; + obj->ccWnn.strdatasize = 0; + obj->ccWnn.inputmode = OTHERS; + obj->ccWnn.pendingdata = NULL; + obj->ccWnn.fixcount = 0; + obj->ccWnn.selwidget = NULL; + obj->ccWnn.selyomi = obj->ccWnn.selkanji = NULL; + + /* $BJQ49$N=i4|2=(B */ + obj->ccWnn.createrule = False; + obj->ccWnn.createenv = False; + ccInitialize(obj); + jcInitialize(obj); + + addObject(obj); +} + +static void +ccInitialize(obj) +CcWnnObject obj; +{ + extern char *getenv(); + + if (obj->ccWnn.createrule) { + ccDestroyBuf(obj->ccWnn.ccbuf); + obj->ccWnn.ccbuf = NULL; + } + if (obj->ccWnn.ccrule == NULL) { + if (obj->ccWnn.ccdeffile == NULL) { + obj->ccWnn.ccdeffile = getenv("CC_DEF"); + if (obj->ccWnn.ccdeffile == NULL) { + obj->ccWnn.ccdeffile = DEF_CCDEF_FILE; + } + } + obj->ccWnn.ccrule = ccParseRule(obj->ccWnn.ccdeffile, XtWarning); + obj->ccWnn.createrule = True; + } + + if (obj->ccWnn.ccrule == NULL) { + XtAppError(XtWidgetToApplicationContext((Widget)obj), + "CcWnn Object: cconv initialization failed."); + } + + obj->ccWnn.ccbuf = ccCreateBuf(obj->ccWnn.ccrule, 16, + fepfunctbl, FTSIZE, + defAction, insChar, delChar, + funcDispatch, autoFix, NULL, (caddr_t)obj); +} + +static CcWnnObject current_obj = NULL; + +static void +jcInitialize(obj) +CcWnnObject obj; +{ + if (obj->ccWnn.createenv) { + (void)jcDestroyBuffer(obj->ccWnn.jcbuf, 0); + obj->ccWnn.jcbuf = NULL; + obj->ccWnn.createenv = False; + } + + if (obj->ccWnn.wnnbuf == NULL || !jcIsConnect(obj->ccWnn.wnnbuf)) { + if (obj->ccWnn.wnnbuf != NULL) { + jcClose(obj->ccWnn.wnnbuf); + obj->ccWnn.wnnbuf = NULL; + } + if (obj->ccWnn.wnnenvname == NULL) obj->ccWnn.wnnenvname = ""; + if (obj->ccWnn.wnnenvrcfile == NULL) obj->ccWnn.wnnenvrcfile = ""; + if (obj->ccWnn.wnnenvrcfile4 == NULL) { + obj->ccWnn.wnnenvrcfile4 = obj->ccWnn.wnnenvrcfile; + } + if (obj->ccWnn.wnnenvrcfile6 == NULL) { + obj->ccWnn.wnnenvrcfile6 = obj->ccWnn.wnnenvrcfile; + } + + /* + * jllib $B$N%3!<%k%P%C%/$G$O!"%/%i%$%"%s%H!&%G!<%?$rEO$;$J$$$N(B + * $B$G!"3P$($F$*$/!#(B + */ + current_obj = obj; + obj->ccWnn.wnnbuf = jcOpen2(obj->ccWnn.jservername, + obj->ccWnn.wnnenvname, + obj->ccWnn.wnnoverrideenv, + obj->ccWnn.wnnenvrcfile4, + obj->ccWnn.wnnenvrcfile6, + createEnvError, + createConfirm, + 30); + /* wnnbuf $B$,3MF@$G$-$J$1$l$P!"$=$N$^$^%j%?!<%s(B */ + if (obj->ccWnn.wnnbuf == NULL) { + XtAppWarning(XtWidgetToApplicationContext((Widget)obj), + "ccWnn Object: can't open jserver"); + return; + } + + /* jserver $B$H@\B3$5$l$F$$$J$1$l$P!"%;%+%s%@%j$r;n$7$F$_$k(B */ + if (!jcIsConnect(obj->ccWnn.wnnbuf) + && obj->ccWnn.jservername2 != NULL) { + jcClose(obj->ccWnn.wnnbuf); + current_obj = obj; + obj->ccWnn.wnnbuf = jcOpen2(obj->ccWnn.jservername2, + obj->ccWnn.wnnenvname, + obj->ccWnn.wnnoverrideenv, + obj->ccWnn.wnnenvrcfile4, + obj->ccWnn.wnnenvrcfile6, + createEnvError, + createConfirm, + 30); + if (obj->ccWnn.wnnbuf == NULL) { + XtAppWarning(XtWidgetToApplicationContext((Widget)obj), + "ccWnn Object: can't open jserver"); + return; + } + } + obj->ccWnn.createenv = True; + if (!jcIsConnect(obj->ccWnn.wnnbuf)) { + XtAppWarning(XtWidgetToApplicationContext((Widget)obj), + "ccWnn Object: can't connect to jserver"); + } + } + /* $B@\B3$G$-$J$/$F$b%P%C%U%!$O:n$C$F$*$/(B */ + obj->ccWnn.jcbuf = jcCreateBuffer(obj->ccWnn.wnnbuf, 10, 80); + if (obj->ccWnn.pendingdata) restoreData(obj); +} + +static void +createEnvError(s) +char *s; +{ + if (current_obj != NULL) + XtAppWarning(XtWidgetToApplicationContext((Widget)current_obj), s); +} + +static int +createConfirm(s) +char *s; +{ + if (current_obj != NULL && current_obj->ccWnn.confirmfunc != NULL) + return (*current_obj->ccWnn.confirmfunc)((Widget)current_obj, s); + return 1; +} + +static void +Destroy(w) +Widget w; +{ + CcWnnObject obj = (CcWnnObject)w; + + /* $B%P%C%U%!$N2rJ|(B */ + if (obj->ccWnn.ccbuf) ccDestroyBuf(obj->ccWnn.ccbuf); + if (obj->ccWnn.jcbuf) jcDestroyBuffer(obj->ccWnn.jcbuf, 1); + + /* $B$b$7(B Initialize() $BCf$G%k!<%k(B/$B4D6-$r:n$C$?$N$G$"$l$P2rJ|$9$k(B */ + if (obj->ccWnn.createrule) ccFreeRule(obj->ccWnn.ccrule); + if (obj->ccWnn.createenv) jcClose(obj->ccWnn.wnnbuf); + + if (obj->ccWnn.candlist) XtFree((char *)obj->ccWnn.candlist); + if (obj->ccWnn.strdata) XtFree((char *)obj->ccWnn.strdata); + + if (obj->ccWnn.pendingdata) XtFree((char *)obj->ccWnn.pendingdata); + + if (obj->ccWnn.selwidget) XtDestroyWidget(obj->ccWnn.selwidget); + if (obj->ccWnn.selyomi) XtFree(obj->ccWnn.selyomi); + if (obj->ccWnn.selkanji) XtFree(obj->ccWnn.selkanji); + + deleteObject(obj); +} + +/* ARGSUSED */ +static Boolean +SetValues(cur, req, wid, args, num_args) +Widget cur; +Widget req; +Widget wid; +ArgList args; +Cardinal *num_args; +{ + CcWnnObject old = (CcWnnObject)cur; + CcWnnObject new = (CcWnnObject)wid; + + if (old->ccWnn.ccdeffile != new->ccWnn.ccdeffile || + old->ccWnn.wnnbuf != new->ccWnn.wnnbuf || + old->ccWnn.ccrule != new->ccWnn.ccrule) { + XtAppWarning(XtWidgetToApplicationContext(wid), + "ccWnn Object: can't change resource by XtSetValues()"); + } + return False; +} + + +/* + * cconv function dispatcher + */ + +/* ARGSUSED */ +static int +funcDispatch(func, str, nbytes, w) +int func; +unsigned char *str; +int nbytes; +caddr_t w; +{ + CcWnnObject obj = (CcWnnObject)w; + + obj->ccWnn.cont = True; + if (func < 0 || func >= FTSIZE) return True; + + wnn_errorno = 0; + + switch (obj->ccWnn.state) { + case selection_s_state: + case selection_l_state: + (*functable[func][1])(obj); + break; + case symbol_state: + (*functable[func][2])(obj); + break; + default: + (*functable[func][0])(obj); + break; + } + + return obj->ccWnn.cont; +} + +/* ARGSUSED */ +static void +defAction(str, nbytes, w) +unsigned char *str; +int nbytes; +caddr_t w; +{ + if (nbytes > 0) beep((CcWnnObject)w); +} + +#define ZERO 0xa3b0 +#define NINE 0xa3b9 +#define SmallA 0xa3e1 +#define SmallF 0xa3e6 +#define LargeA 0xa3c1 +#define LargeF 0xa3c6 +static int +toHex(c) +int c; +{ + if ('0' <= c && c <= '9') + return c - '0'; + if ('a' <= c && c <= 'f') + return c + 10 - 'a'; + if ('A' <= c && c <= 'F') + return c + 10 - 'A'; + if (ZERO <= c && c <= NINE) + return c - ZERO; + if (SmallA <= c && c <= SmallF) + return c + 10 - SmallA; + if (LargeA <= c && c <= LargeF) + return c + 10 - LargeA; + return -1; +} + +static int +toHex4(s) +wchar *s; +{ + int c, h, cnt, hex; + + hex = 0; + cnt = 0; + while (cnt < 4 && (c = *s++)) { + if ((h = toHex(c)) < 0) + return -1; + hex = hex * 16 + h; + cnt++; + } + if (cnt != 4) + return -1; + + return hex; +} + +static int +toKuten(s) +wchar *s; +{ + int i, c, d[4]; + + for (i = 0; i < 4 && (c = *s++); i++) { + if ((d[i] = toHex(c)) < 0 || d[i] >= 10) + return(-1); + } + if (i != 4) + return(-1); + return((((d[0] * 10 + d[1]) << 8) | (d[2] * 10 + d[3])) + 0x2020); +} + +static void +insChar(c, cldata) +int c; +caddr_t cldata; +{ + CcWnnObject obj = (CcWnnObject)cldata; + jcConvBuf *jcbuf = obj->ccWnn.jcbuf; + ccBuf ccbuf = obj->ccWnn.ccbuf; + wchar context[17]; + int h; + + normalState(obj); + + if (jcIsConverted(jcbuf, jcbuf->curClause)) { + (void)jcBottom(jcbuf); + } + + switch (obj->ccWnn.inputmode) { + case KUTEN_MODE: + case JIS_MODE: + /* $B%X%-%5$+$I$&$+$N%F%9%H(B */ + if ((h = toHex(c)) < 0 || (obj->ccWnn.inputmode == KUTEN_MODE && h >= 10)) { + beep(obj); + ccContextDelete(ccbuf); + break; + } + ccContextGet(ccbuf, context); + if (wstrlen(context) == 4) { + /* convert to KANJI */ + c = obj->ccWnn.inputmode == KUTEN_MODE ? toKuten(context): toHex4(context); + if (c < 0x2121 || 0x7e7e < c || (c & 0xff) < 0x21 || + 0x7e < (c & 0xff)) { + beep(obj); + break; + } + /* $B#3J8;z:o=|(B -- $B#4J8;zL\$O$^$@A^F~$7$F$$$J$$(B */ + jcDeleteChar(jcbuf, 1); + jcDeleteChar(jcbuf, 1); + jcDeleteChar(jcbuf, 1); + (void)jcInsertChar(jcbuf, c | 0x8080); + obj->ccWnn.textchanged = True; + /* $B%3%s%F%-%9%H$N%/%j%"(B */ + ccContextClear(ccbuf); + break; + } + /* fall thru */ + case OTHERS: + (void)jcInsertChar(jcbuf, c); + obj->ccWnn.textchanged = True; + break; + } +} + +static void +delChar(cldata) +caddr_t cldata; +{ + CcWnnObject obj = (CcWnnObject)cldata; + + if (obj->ccWnn.state != normal_state) { + beep(obj); + return; + } + ccContextDelete(obj->ccWnn.ccbuf); + jcDeleteChar(obj->ccWnn.jcbuf, 1); + obj->ccWnn.textchanged = True; +} + +static void +autoFix(cldata) +caddr_t cldata; +{ + CcWnnObject obj = (CcWnnObject)cldata; + + switch (obj->ccWnn.state) + { + case selection_s_state: + case selection_l_state: + case symbol_state: + fix(obj); + break; + default: + + if (jcIsConverted(obj->ccWnn.jcbuf, 0)) + fix(obj); + break; + } +} + +/* + * cconv functions + */ + +/* some convenient macros */ +#define JCBUF(obj) ((obj)->ccWnn.jcbuf) +#define CCBUF(obj) ((obj)->ccWnn.ccbuf) +#define HINT(obj) ((obj)->ccWnn.textchanged) + +/* $BJQ49%U%!%s%/%7%g%s72(B + * convert + * convert-sp + * convert-s + * unconvert + */ + +static void +convert_general(obj, small) +CcWnnObject obj; +int small; +{ + jcConvBuf *jcbuf = JCBUF(obj); + + if (jcbuf->curClause == jcbuf->nClause) { + (void)jcMove(jcbuf, small, JC_BACKWARD); + HINT(obj) = True; + } + + if (jcIsConverted(jcbuf, jcbuf->curClause)) { + startSelection(obj, small); + return; + } + + if (jcConvert(jcbuf, small, 0, 1) < 0) beep(obj); + ccContextClear(CCBUF(obj)); + HINT(obj) = True; +} + +static void +convert(obj) +CcWnnObject obj; +{ + convert_general(obj, 0); +} + +static void +convert_sb(obj) +CcWnnObject obj; +{ + if (JCBUF(obj)->nClause == 0) { + send_back(obj); + fix(obj); + } else { + convert_general(obj, 0); + } +} + +static void +convert_sp(obj) +CcWnnObject obj; +{ + if (JCBUF(obj)->nClause == 0) { + insChar(' ', (caddr_t)obj); + fix(obj); + } else { + convert_general(obj, 0); + } +} + +static void +convert_mt(obj) +CcWnnObject obj; +{ + jcConvBuf *jcbuf = JCBUF(obj); + if (jcbuf->nClause == 0) { + send_back(obj); + fix(obj); + } else { + int nc = jcbuf->nClause - 1; + convert_general(obj, 0); + if (!jcIsConverted(jcbuf, jcbuf->curClause)) { + int i; + move_top(obj); + if (nc < jcbuf->nClause) + for (i = 0; i < nc; i++) + move_forward(obj); + } + } +} + +static void +convert_f1(obj) +CcWnnObject obj; +{ + jcConvBuf *jcbuf = JCBUF(obj); + + if (0 < jcbuf->nClause && jcIsConverted(jcbuf, 0)) { + fix1(obj); + } else { + convert_general(obj, 0); + } +} + +static void +convert_mt_sb(obj) +CcWnnObject obj; +{ + jcConvBuf *jcbuf = JCBUF(obj); + if (jcbuf->nClause == 0) { + send_back(obj); + fix(obj); + } else { + int nc = jcbuf->nClause - 1; + convert_general(obj, 0); + if (!jcIsConverted(jcbuf, jcbuf->curClause)) { + int i; + move_top(obj); + if (nc < jcbuf->nClause) + for (i = 0; i < nc; i++) + move_forward(obj); + } + } +} + +static void +convert_mt_sp(obj) +CcWnnObject obj; +{ + jcConvBuf *jcbuf = JCBUF(obj); + if (jcbuf->nClause == 0) { + insChar(' ', (caddr_t)obj); + fix(obj); + } else { + int nc = jcbuf->nClause - 1; + convert_general(obj, 0); + if (!jcIsConverted(jcbuf, jcbuf->curClause)) { + int i; + move_top(obj); + if (nc < jcbuf->nClause) + for (i = 0; i < nc; i++) + move_forward(obj); + } + } +} + +static void +convert_s(obj) +CcWnnObject obj; +{ + convert_general(obj, 1); +} + +static void +unconvert(obj) +CcWnnObject obj; +{ + if (jcUnconvert(JCBUF(obj)) < 0) beep(obj); + ccContextClear(CCBUF(obj)); + HINT(obj) = True; +} + +static void +select_general(obj, small) +CcWnnObject obj; +int small; +{ + jcConvBuf *jcbuf = JCBUF(obj); + + if (jcbuf->curClause == jcbuf->nClause) { + (void)jcMove(jcbuf, small, JC_BACKWARD); + HINT(obj) = True; + } + + if (jcIsConverted(jcbuf, jcbuf->curClause)) { + startSelection(obj, small); + obj->ccWnn.cont = False; /* $BcurClause)) + cand_general(obj, 0, JC_NEXT); + else + convert_mt(obj); +} + +static void +cand_next_mt_sb(obj) +CcWnnObject obj; +{ + jcConvBuf *jcbuf = JCBUF(obj); + if (jcIsConverted(jcbuf, jcbuf->curClause)) + cand_general(obj, 0, JC_NEXT); + else + convert_mt_sb(obj); +} + +static void +cand_next_mt_sp(obj) +CcWnnObject obj; +{ + jcConvBuf *jcbuf = JCBUF(obj); + if (jcIsConverted(jcbuf, jcbuf->curClause)) + cand_general(obj, 0, JC_NEXT); + else + convert_mt_sp(obj); +} + +static void +cand_next_s(obj) +CcWnnObject obj; +{ + cand_general(obj, 1, JC_NEXT); +} + +static void +cand_prev(obj) +CcWnnObject obj; +{ + cand_general(obj, 0, JC_PREV); +} + +static void +cand_prev_s(obj) +CcWnnObject obj; +{ + cand_general(obj, 1, JC_PREV); +} + + +/* $BJ8@aD9JQ99%U%!%s%/%7%g%s72(B + * expand_cl + * expand_cl_s + * expand_cl2 + * expand_cl2_s + * shrink_cl + * shrink_cl_s + * shrink_cl2 + * shrink_cl2_s + */ + +static void +expand_shrink_general(obj, shrink, small, conv) +CcWnnObject obj; +int shrink; +int small; +int conv; +{ + int status; + + normalState(obj); + + if (shrink) { + status = jcShrink(JCBUF(obj), small, conv); + } else { + status = jcExpand(JCBUF(obj), small, conv); + } + if (status < 0) beep(obj); + + ccContextClear(CCBUF(obj)); + HINT(obj) = True; +} + +static void +expand_cl(obj) +CcWnnObject obj; +{ + expand_shrink_general(obj, 0, 0, 1); +} + +static void +expand_cl_s(obj) +CcWnnObject obj; +{ + expand_shrink_general(obj, 0, 1, 1); +} + +static void +shrink_cl(obj) +CcWnnObject obj; +{ + expand_shrink_general(obj, 1, 0, 1); +} + +static void +shrink_cl_s(obj) +CcWnnObject obj; +{ + expand_shrink_general(obj, 1, 1, 1); +} + +static void +expand_cl2(obj) +CcWnnObject obj; +{ + expand_shrink_general(obj, 0, 0, 0); +} + +static void +expand_cl2_s(obj) +CcWnnObject obj; +{ + expand_shrink_general(obj, 0, 1, 0); +} + +static void +shrink_cl2(obj) +CcWnnObject obj; +{ + expand_shrink_general(obj, 1, 0, 0); +} + +static void +shrink_cl2_s(obj) +CcWnnObject obj; +{ + expand_shrink_general(obj, 1, 1, 0); +} + + +/* $BJQ49%P%C%U%!%/%j%"%U%!%s%/%7%g%s(B + * clear_buffer + */ + +static void +clear_buffer(obj) +CcWnnObject obj; +{ + normalState(obj); + if (jcClear(JCBUF(obj)) < 0) beep(obj); + ccContextClear(CCBUF(obj)); + HINT(obj) = True; +} + +static void +cancel(obj) +CcWnnObject obj; +{ + if (jcCancel(JCBUF(obj)) < 0) beep(obj); + ccContextClear(CCBUF(obj)); + move_bottom(obj); + HINT(obj) = True; +} + + +static void +clear_c(obj) +CcWnnObject obj; +{ + switch (obj->ccWnn.state) + { + case selection_s_state: + case selection_l_state: + endSelection(obj, False); + cancel(obj); + break; + case symbol_state: + clear_buffer(obj); + break; + default: + if (jcIsConverted(JCBUF(obj), JCBUF(obj)->curClause)) + cancel(obj); + else + clear_buffer(obj); + break; + } +} + +/* $B8uJd0\F0%U%!%s%/%7%g%s72(B + * sel_next + * sel_prev + * sel_top + * sel_bottom + * sel_forward + * sel_backward + */ + +static void +sel_top(obj) +CcWnnObject obj; +{ + moveSelection(obj, ICMoveLeftMost); +} + +static void +sel_bottom(obj) +CcWnnObject obj; +{ + moveSelection(obj, ICMoveRightMost); +} + +static void +sel_forward(obj) +CcWnnObject obj; +{ + moveSelection(obj, ICMoveRight); +} + +static void +sel_backward(obj) +CcWnnObject obj; +{ + moveSelection(obj, ICMoveLeft); +} + +static void +sel_next(obj) +CcWnnObject obj; +{ + moveSelection(obj, ICMoveDown); +} + +static void +sel_prev(obj) +CcWnnObject obj; +{ + moveSelection(obj, ICMoveUp); +} + +static void +sel_select(obj) +CcWnnObject obj; +{ + endSelection(obj, False); +} + +static void +sel_abort(obj) +CcWnnObject obj; +{ + endSelection(obj, True); +} + +static void +fix(obj) +CcWnnObject obj; +{ + jcConvBuf *jcbuf = JCBUF(obj); + + normalState(obj); + ccContextClear(CCBUF(obj)); + + if (jcbuf->nClause > 0) { + obj->ccWnn.fixperformed = True; + + if (jcFix(jcbuf) < 0) { + beep(obj); + return; + } + + /* $B<-=q%;!<%V$N=hM}(B */ + obj->ccWnn.fixcount++; + if (obj->ccWnn.saveinterval > 0 && + obj->ccWnn.fixcount >= obj->ccWnn.saveinterval) { + jcSaveDic(jcbuf); + obj->ccWnn.fixcount = 0; + } + + /* $B3NDj$N=hM}(B */ + XtCallCallbackList((Widget)obj, obj->inputConv.fixcallback, + (XtPointer)NULL); /* ??? */ + + HINT(obj) = True; + } + + /* $B%P%C%U%!$r%/%j%"$9$k(B */ + jcClear(jcbuf); +} + +static void +fix1(obj) +CcWnnObject obj; +{ + jcConvBuf *jcbuf = JCBUF(obj); + + normalState(obj); + ccContextClear(CCBUF(obj)); + + if (jcbuf->nClause > 0) { + obj->ccWnn.fixperformed = True; + + if (jcFix1(jcbuf) < 0) { /* $B$3$3$@$1$,(B fix(obj) $B$H0c$&$H$3$m(B */ + beep(obj); + return; + } + + /* $B<-=q%;!<%V$N=hM}(B */ + obj->ccWnn.fixcount++; + if (obj->ccWnn.saveinterval > 0 && + obj->ccWnn.fixcount >= obj->ccWnn.saveinterval) { + jcSaveDic(jcbuf); + obj->ccWnn.fixcount = 0; + } + + /* $B3NDj$N=hM}(B */ + XtCallCallbackList((Widget)obj, obj->inputConv.fixcallback, + (XtPointer)NULL); /* ??? */ + + HINT(obj) = True; + } + + /* $B%P%C%U%!$r%/%j%"$9$k(B */ + jcClear(jcbuf); +} + +static void +fix_cr(obj) +CcWnnObject obj; +{ + if (JCBUF(obj)->nClause == 0) { + carriageret(obj); + } else { + fix(obj); + } +} + + +static void +fix_sb(obj) +CcWnnObject obj; +{ + if (JCBUF(obj)->nClause == 0) { + send_back(obj); + } else { + fix(obj); + } +} + + +static void +to_hankaku(start, end, res) +wchar *start; +wchar *end; +wchar *res; +{ + static unsigned short hiratohan[] = { /* $BA43Q$+$J(B <-> $BH>3Q$+$J(B */ +#define D (0xde<<8) /* $BBy2;(B */ +#define H (0xdf<<8) /* $BH>By2;(B */ + /* a */ 0xa7, 0xb1, 0xa8, 0xb2, 0xa9, 0xb3, 0xaa, 0xb4, 0xab, 0xb5, + /* k */ 0xb6, 0xb6|D, 0xb7, 0xb7|D, 0xb8, 0xb8|D, + 0xb9, 0xb9|D, 0xba, 0xba|D, + /* s */ 0xbb, 0xbb|D, 0xbc, 0xbc|D, 0xbd, 0xbd|D, + 0xbe, 0xbe|D, 0xbf, 0xbf|D, + /* t */ 0xc0, 0xc0|D, 0xc1, 0xc1|D, 0xaf, 0xc2, 0xc2|D, + 0xc3, 0xc3|D, 0xc4, 0xc4|D, + /* n */ 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, + /* h */ 0xca, 0xca|D, 0xca|H, 0xcb, 0xcb|D, 0xcb|H, 0xcc, 0xcc|D, + 0xcc|H, 0xcd, 0xcd|D, 0xcd|H, 0xce, 0xce|D, 0xce|H, + /* m */ 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, + /* y */ 0xac, 0xd4, 0xad, 0xd5, 0xae, 0xd6, + /* r */ 0xd7, 0xd8, 0xd9, 0xda, 0xdb, + /* w */ 0xdc, 0xdc, 0xb2, 0xb4, 0xa6, + /* n */ 0xdd +#undef D +#undef H + }; + static struct symzenhan { + unsigned short zen; + unsigned char han; + } kigoutohan[] = { /* $BA43Q5-9f(B -> $BH>3Q5-9f(B */ + 0xa1a1, 0x20, 0xa1a2, 0xa4, 0xa1a3, 0xa1, 0xa1a4, 0x2c, + 0xa1a5, 0x2e, 0xa1a6, 0xa5, 0xa1a7, 0x3a, 0xa1a8, 0x3b, + 0xa1a9, 0x3f, 0xa1aa, 0x21, 0xa1ab, 0xde, 0xa1ac, 0xdf, + 0xa1b0, 0x5e, 0xa1b2, 0x5f, 0xa1bc, 0xb0, 0xa1bf, 0x2f, + 0xa1c1, 0x7e, 0xa1c3, 0x7c, 0xa1c6, 0x60, 0xa1c7, 0x27, + 0xa1c8, 0x22, 0xa1c9, 0x22, 0xa1ca, 0x28, 0xa1cb, 0x29, + 0xa1cc, 0x5b, 0xa1cd, 0x5d, 0xa1ce, 0x5b, 0xa1cf, 0x5d, + 0xa1d0, 0x7b, 0xa1d1, 0x7d, 0xa1d6, 0xa2, 0xa1d7, 0xa3, + 0xa1dc, 0x2b, 0xa1dd, 0x2d, 0xa1e1, 0x3d, 0xa1e3, 0x3c, + 0xa1e4, 0x3e, 0xa1ef, 0x5c, 0xa1f0, 0x24, 0xa1f3, 0x25, + 0xa1f4, 0x23, 0xa1f5, 0x26, 0xa1f6, 0x2a, 0xa1f7, 0x40, + }; +#define KIGOUSIZE (sizeof(kigoutohan) / sizeof(struct symzenhan)) + register int c; + + while (start < end) { + c = *start++; + if (0xa1a1 <= c && c <= 0xa1fe) { /* symbol */ + register struct symzenhan *hi = kigoutohan + KIGOUSIZE; + register struct symzenhan *lo = kigoutohan; + register struct symzenhan *m; + register int dif; + + while (lo <= hi) { + m = lo + (hi - lo) / 2; + if ((dif = c - m->zen) == 0) break; + if (dif < 0) { + hi = m - 1; + } else { + lo = m + 1; + } + } + *res++ = (lo > hi) ? c : m->han; + } else if (0xa3b0 <= c && c <= 0xa3b9) { /* Numeric */ + *res++ = c - 0xa3b0 + '0'; + } else if (0xa3c1 <= c && c <= 0xa3da) { /* A-Z */ + *res++ = c - 0xa3c1 + 'A'; + } else if (0xa3e1 <= c && c <= 0xa3fa) { /* a-z */ + *res++ = c - 0xa3e1 + 'a'; + } else if (0xa4a1 <= c && c <= 0xa4f3) { /* $B$R$i$,$J(B */ + c = hiratohan[c - 0xa4a1]; + *res++ = c & 0xff; + if (c & 0xff00) *res++ = c >> 8; + } else if (0xa5a1 <= c && c <= 0xa5f3) { /* $B$+$?$+$J(B */ + c = hiratohan[c - 0xa5a1]; + *res++ = c & 0xff; + if (c & 0xff00) *res++ = c >> 8; + } else { + *res++ = c; + } + } + *res = 0; /* NULL terminate */ +} + +static void +to_zenkaku(start, end, res) +wchar *start; +wchar *end; +wchar *res; +{ + static wchar hantozen[] = { /* $BH>3Q(B $B"M(B $BA43QJQ49I=(B */ + /* C0 */ + 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, + 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f, + 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, + 0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f, + /* ASCII */ + 0xa1a1, 0xa1aa, 0xa1c9, 0xa1f4, 0xa1f0, 0xa1f3, 0xa1f5, 0xa1c7, + 0xa1ca, 0xa1cb, 0xa1f6, 0xa1dc, 0xa1a4, 0xa1dd, 0xa1a5, 0xa1bf, + 0xa3b0, 0xa3b1, 0xa3b2, 0xa3b3, 0xa3b4, 0xa3b5, 0xa3b6, 0xa3b7, + 0xa3b8, 0xa3b9, 0xa1a7, 0xa1a8, 0xa1e3, 0xa1e1, 0xa1e4, 0xa1a9, + 0xa1f7, 0xa3c1, 0xa3c2, 0xa3c3, 0xa3c4, 0xa3c5, 0xa3c6, 0xa3c7, + 0xa3c8, 0xa3c9, 0xa3ca, 0xa3cb, 0xa3cc, 0xa3cd, 0xa3ce, 0xa3cf, + 0xa3d0, 0xa3d1, 0xa3d2, 0xa3d3, 0xa3d4, 0xa3d5, 0xa3d6, 0xa3d7, + 0xa3d8, 0xa3d9, 0xa3da, 0xa1ce, 0xa1ef, 0xa1cf, 0xa1b0, 0xa1b2, + 0xa1c6, 0xa3e1, 0xa3e2, 0xa3e3, 0xa3e4, 0xa3e5, 0xa3e6, 0xa3e7, + 0xa3e8, 0xa3e9, 0xa3ea, 0xa3eb, 0xa3ec, 0xa3ed, 0xa3ee, 0xa3ef, + 0xa3f0, 0xa3f1, 0xa3f2, 0xa3f3, 0xa3f4, 0xa3f5, 0xa3f6, 0xa3f7, + 0xa3f8, 0xa3f9, 0xa3fa, 0xa1d0, 0xa1c3, 0xa1d1, 0xa1c1, 0x007f, + /* C1 */ + 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, + 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f, + 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, + 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f, + /* KANA */ + 0xa1a1, 0xa1a3, 0xa1d6, 0xa1d7, 0xa1a2, 0xa1a6, 0xa5f2, 0xa5a1, + 0xa5a3, 0xa5a5, 0xa5a7, 0xa5a9, 0xa5e3, 0xa5e5, 0xa5e7, 0xa5c3, + 0xa1bc, 0xa5a2, 0xa5a4, 0xa5a6, 0xa5a8, 0xa5aa, 0xa5ab, 0xa5ad, + 0xa5af, 0xa5b1, 0xa5b3, 0xa5b5, 0xa5b7, 0xa5b9, 0xa5bb, 0xa5bd, + 0xa5bf, 0xa5c1, 0xa5c4, 0xa5c6, 0xa5c8, 0xa5ca, 0xa5cb, 0xa5cc, + 0xa5cd, 0xa5ce, 0xa5cf, 0xa5d2, 0xa5d5, 0xa5d8, 0xa5db, 0xa5de, + 0xa5df, 0xa5e0, 0xa5e1, 0xa5e2, 0xa5e4, 0xa5e6, 0xa5e8, 0xa5e9, + 0xa5ea, 0xa5eb, 0xa5ec, 0xa5ed, 0xa5ef, 0xa5f3, 0xa1ab, 0xa1ac, + /* undefined */ + 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7, + 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef, + 0x00f0, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7, + 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x00fe, 0x00ff, + }; + register int c; + + while (start < end) { + c = *start++; + if ((0x20 <= c && c <= 0x7e) || (0xa1 <= c && c <= 0xdf)) { + *res++ = hantozen[c]; + } else { + *res++ = c; + } + } + *res = 0; /* NULL terminate */ +} + +static void +zenkaku_hankaku(obj, hankaku) +CcWnnObject obj; +int hankaku; +{ + jcConvBuf *jcbuf = JCBUF(obj); + + normalState(obj); + + if (jcbuf->curClause != jcbuf->nClause) { + jcClause *cinfo = jcbuf->clauseInfo; + wchar *ks = cinfo[jcbuf->curLCStart].kanap; + wchar *ke = cinfo[jcbuf->curLCEnd].kanap; + wchar buf[256]; + + if (hankaku) { + to_hankaku(ks, ke, buf); + } else { + to_zenkaku(ks, ke, buf); + } + if (jcChangeClause(jcbuf, buf) < 0) beep(obj); + } + ccContextClear(CCBUF(obj)); + HINT(obj) = True; +} + +static void +zenkaku(obj) +CcWnnObject obj; +{ + zenkaku_hankaku(obj, 0); +} + +static void +hankaku(obj) +CcWnnObject obj; +{ + zenkaku_hankaku(obj, 1); +} + +static void +hiragana_katakana(obj, type) +CcWnnObject obj; +int type; +{ + normalState(obj); + + if (jcKana(JCBUF(obj), 0, type) < 0) beep(obj); + ccContextClear(CCBUF(obj)); + HINT(obj) = True; +} + +static void +hiragana(obj) +CcWnnObject obj; +{ + hiragana_katakana(obj, JC_HIRAGANA); +} + +static void +katakana(obj) +CcWnnObject obj; +{ + hiragana_katakana(obj, JC_KATAKANA); +} + + +static void +backspace(obj) +CcWnnObject obj; +{ + switch (obj->ccWnn.state) { + case selection_l_state: + endSelection(obj, False); + (void)jcMove(JCBUF(obj), 0, JC_FORWARD); + break; + case selection_s_state: + endSelection(obj, False); + (void)jcMove(JCBUF(obj), 1, JC_FORWARD); + break; + case symbol_state: + endSelection(obj, False); + break; + } + ccContextDelete(CCBUF(obj)); + if (jcDeleteChar(JCBUF(obj), 1) < 0) beep(obj); + HINT(obj) = True; +} + +static void +backspace_c(obj) +CcWnnObject obj; +{ + switch (obj->ccWnn.state) { + case selection_s_state: + case selection_l_state: + endSelection(obj, False); + cancel(obj); + break; + case symbol_state: + backspace(obj); + break; + default: + if (jcIsConverted(JCBUF(obj), 0)) + cancel(obj); + else + backspace(obj); + break; + } +} + +static void +delete(obj) +CcWnnObject obj; +{ + normalState(obj); + if (jcDeleteChar(JCBUF(obj), 0) < 0) beep(obj); + ccContextClear(CCBUF(obj)); + HINT(obj) = True; +} + +static void +delete_c(obj) +CcWnnObject obj; +{ + switch (obj->ccWnn.state) { + case selection_s_state: + case selection_l_state: + endSelection(obj, False); + cancel(obj); + break; + case symbol_state: + delete(obj); + break; + default: + if (jcIsConverted(JCBUF(obj), JCBUF(obj)->curClause)) + cancel(obj); + else + delete(obj); + break; + } +} + +static void +kill_line(obj) +CcWnnObject obj; +{ + normalState(obj); + if (jcKillLine(JCBUF(obj)) < 0) beep(obj); + ccContextClear(CCBUF(obj)); + HINT(obj) = True; +} + +static void +bell(obj) +CcWnnObject obj; +{ + XBell(XtDisplayOfObject((Widget)obj), 0); +} + +static void +beep(obj) +CcWnnObject obj; +{ + if (JCBUF(obj)->nClause == 0) return; + bell(obj); +} + +static void +jiscode_begin(obj) +CcWnnObject obj; +{ + obj->ccWnn.inputmode = JIS_MODE; +} + +static void +jiscode_end(obj) +CcWnnObject obj; +{ + obj->ccWnn.inputmode = OTHERS; +} + +static void +kuten_begin(obj) +CcWnnObject obj; +{ + obj->ccWnn.inputmode = KUTEN_MODE; +} + +static void +kuten_end(obj) +CcWnnObject obj; +{ + obj->ccWnn.inputmode = OTHERS; +} + +static void +carriageret(obj) +CcWnnObject obj; +{ + insChar('\r', (caddr_t)obj); + fix(obj); +} + + +static void +convend(obj) +CcWnnObject obj; +{ + fix(obj); + /* $B%$%Y%s%H$rAw$jJV$5$J$$$h$&$K(B fixperformed $B$r%;%C%H$7$F$*$/(B */ + obj->ccWnn.fixperformed = True; + XtCallCallbackList((Widget)obj, obj->inputConv.endcallback, + (XtPointer)NULL); +} + + +static void +send_back(obj) +CcWnnObject obj; +{ + obj->ccWnn.sendbackevent = True; +} + + +static void +register_word(obj) +CcWnnObject obj; +{ + Widget w = obj->ccWnn.selwidget; + Display *dpy; + + TRACE(("register_word()\n")); + if (w == NULL) { + /* + * $B%&%#%s%I%&$r;H$$$?$$$N$G!"<+J,$G(B widget $B$r0l$D:n$k!#(B + * nonwidget $B$r?F$K$7$F(B widget $B$r:n@.$9$k$3$H$O2DG=$J$h$&$K(B + * $B;W$($k$N$@$,!"$J$<$+$G$-$J$$$_$?$$$J$N$G!"$^$:$O(B widget $B$G$"$k(B + * $B?F$rC5$7$F!"$=$3$K:n$k$3$H$K$9$k!#(B + */ + Widget p = XtParent((Widget)obj); + + while (p != NULL) { + if (XtIsWidget(p)) break; + p = XtParent(p); + } + if (p == NULL) { + DPRINT(("register_word(): cannot find widget parent\n")); + return; + } + + TRACE(("register_word(): creating core widget\n")); + w = XtVaCreateWidget("for_selection", coreWidgetClass, p, + XtNwidth, 1, XtNheight, 1, NULL); + XtRealizeWidget(w); + obj->ccWnn.selwidget = w; + } + saveYomiAndKanji(obj); + if (obj->ccWnn.selyomi == NULL && obj->ccWnn.selkanji == NULL) return; + + dpy = XtDisplay(w); + XtOwnSelection(w, CachedInternAtom(dpy, CCWNN_REGISTER_ATOM, False), + XtLastTimestampProcessed(dpy), + convertSelection, NULL, NULL); +} + +static void +sym_input(obj) +CcWnnObject obj; +{ + ICSelectionControlArg arg; + + if (obj->ccWnn.state != normal_state) { + beep(obj); + return; + } + obj->ccWnn.state = symbol_state; + + arg.command = ICSelectionStart; + arg.u.selection_kind = ICSelectionSymbols; + XtCallCallbackList((Widget)obj, obj->inputConv.selectioncallback, + (XtPointer)&arg); + + arg.command = ICSelectionSet; + arg.u.current_item = obj->ccWnn.cursymbol; + XtCallCallbackList((Widget)obj, obj->inputConv.selectioncallback, + (XtPointer)&arg); +} + +static int +getSymbol(obj, n) +CcWnnObject obj; +int n; +{ + int c; + + if (n < 0 || n >= obj->ccWnn.numsymbols) return -1; + + c = *(wchar *)(obj->ccWnn.symbollist[n].data); + + return c; +} + +static void +startSelection(obj, small) +CcWnnObject obj; +int small; +{ + ICSelectionControlArg arg; + int ncand, curcand; + + if (obj->ccWnn.state != normal_state) { + beep(obj); + return; + } + + if (jcCandidateInfo(JCBUF(obj), small, &ncand, &curcand) < 0) { + beep(obj); + return; + } + + getAllCandidates(obj, ncand); + + obj->ccWnn.numcand = ncand; + obj->ccWnn.curcand = curcand; + obj->ccWnn.state = small ? selection_s_state : selection_l_state; + + arg.command = ICSelectionStart; + arg.u.selection_kind = ICSelectionCandidates; + XtCallCallbackList((Widget)obj, obj->inputConv.selectioncallback, + (XtPointer)&arg); + + /* set current item */ + arg.command = ICSelectionSet; + arg.u.current_item = curcand; + XtCallCallbackList((Widget)obj, obj->inputConv.selectioncallback, + (XtPointer)&arg); +} + +static void +moveSelection(obj, dir) +CcWnnObject obj; +int dir; +{ + ICSelectionControlArg arg; + + if (obj->ccWnn.state == normal_state) return; + arg.command = ICSelectionMove; + arg.u.dir = dir; + XtCallCallbackList((Widget)obj, obj->inputConv.selectioncallback, + (XtPointer)&arg); +} + +static int +endSelection(obj, abort) +CcWnnObject obj; +int abort; +{ + ICSelectionControlArg arg; + int selected; + int ret = 0; + + if (obj->ccWnn.selectionending) return 0; + + if (obj->ccWnn.state == normal_state) return -1; + + arg.command = ICSelectionEnd; + arg.u.current_item = -1; + XtCallCallbackList((Widget)obj, obj->inputConv.selectioncallback, + (XtPointer)&arg); + + if (!abort && (selected = arg.u.current_item) >= 0) { + ret = insertSelection(obj, selected); + } + obj->ccWnn.state = normal_state; + + return ret; +} + +static int +insertSelection(obj, selected) +CcWnnObject obj; +int selected; +{ + int state = obj->ccWnn.state; + int ret = 0; + + HINT(obj) = True; + + obj->ccWnn.selectionending = True; + if (state == symbol_state) { + int c = getSymbol(obj, selected); + if (c < 0) return -1; + obj->ccWnn.cursymbol = selected; + ccContextAppend(CCBUF(obj), c); + insChar(c, (caddr_t)obj); + } else { + obj->ccWnn.curcand = selected; + ret = jcSelect(JCBUF(obj), selected); + } + obj->ccWnn.selectionending = False; + + return ret; +} + +static void +normalState(obj) +CcWnnObject obj; +{ + switch (obj->ccWnn.state) { + case selection_l_state: + case selection_s_state: + /* $B8uJdA*BrCf$G$"$l$P%+%l%s%H$N8uJd$rA*Br$7$FA*Br%b!<%I$+$iH4$1$k(B */ + case symbol_state: + /* $B5-9fF~NOCf$G$"$l$P%+%l%s%H$N5-9f$rA*Br$7$F5-9f%b!<%I$+$iH4$1$k(B */ + endSelection(obj, False); + break; + } +} + +static void +allocCandlist(obj, n) +CcWnnObject obj; +int n; +{ + ICString *p; + + if (n <= obj->ccWnn.candlistsize) return; + + if (obj->ccWnn.candlistsize == 0) { + p = (ICString *)XtMalloc(n * sizeof(ICString)); + } else { + p = (ICString *)XtRealloc((char *)obj->ccWnn.candlist, + n * sizeof(ICString)); + } + + obj->ccWnn.candlist = p; + obj->ccWnn.candlistsize = n; +} + +static void +allocStrdata(obj, nchars) +CcWnnObject obj; +Cardinal nchars; +{ + wchar *p; + + if (nchars <= obj->ccWnn.strdatasize) return; + + if (obj->ccWnn.strdatasize == 0) { + if (nchars < 256) nchars = 256; + p = (wchar *)XtMalloc(nchars * sizeof(wchar)); + } else { + if (nchars - obj->ccWnn.strdatasize < 256) + nchars = obj->ccWnn.strdatasize + 256; + p = (wchar *)XtRealloc((char *)obj->ccWnn.strdata, + nchars * sizeof(wchar)); + } + + obj->ccWnn.strdata = p; + obj->ccWnn.strdatasize = nchars; +} + +static void +getAllCandidates(obj, ncand) +CcWnnObject obj; +int ncand; +{ + ICString *strp; + Cardinal nchars; + wchar *p; + int i; + wchar buf[256]; + + allocCandlist(obj, ncand); + + nchars = 0; + for (i = 0, strp = obj->ccWnn.candlist; i < ncand; i++, strp++) { + (void)jcGetCandidate(obj->ccWnn.jcbuf, i, buf); + strp->nchars = wstrlen(buf); + strp->nbytes = strp->nchars * sizeof(wchar); + strp->attr = ICAttrNormalString; + allocStrdata(obj, nchars + strp->nchars); + (void)bcopy((char *)buf, (char *)(obj->ccWnn.strdata + nchars), + strp->nbytes); + nchars += strp->nchars; + } + + p = obj->ccWnn.strdata; + for (i = 0, strp = obj->ccWnn.candlist; i < ncand; i++, strp++) { + strp->data = (char *)p; + p += strp->nchars; + } +} + +/* + * keeping list of objects + */ +typedef struct _oblist_ { + CcWnnObject obj; + struct _oblist_ *next; +} ObjRec; + +static ObjRec *ObjList = NULL; + +static void +addObject(obj) +CcWnnObject obj; +{ + ObjRec *objp = XtNew(ObjRec); + + objp->obj = obj; + objp->next = ObjList; + ObjList = objp; +} + +static void +deleteObject(obj) +CcWnnObject obj; +{ + ObjRec *objp, *objp0; + + for (objp0 = NULL, objp = ObjList; + objp != NULL; + objp0 = objp, objp = objp->next) { + if (objp->obj == obj) { + if (objp0 == NULL) { + ObjList = objp->next; + } else { + objp0->next = objp->next; + } + XtFree((char *)objp); + return; + } + } +} + +static void +serverDead() +{ + ObjRec *objp = ObjList; + + while (objp != NULL) { + if (objp->obj->ccWnn.wnnbuf != NULL + && !jcIsConnect(objp->obj->ccWnn.wnnbuf) + && wnn_errorno == WNN_JSERVER_DEAD) { + if (objp->obj->ccWnn.jcbuf != NULL) { + (void)jcDestroyBuffer(objp->obj->ccWnn.jcbuf, 0); + objp->obj->ccWnn.jcbuf = NULL; + } + (void)jcClose(objp->obj->ccWnn.wnnbuf); + objp->obj->ccWnn.wnnbuf = NULL; + if (objp->obj->ccWnn.ccbuf != NULL) { + ccContextClear(objp->obj->ccWnn.ccbuf); + } + } + objp = objp->next; + } +} + +static void +saveData(obj) +CcWnnObject obj; +{ + wchar *wbuf; + int len; + jcConvBuf *jcbuf = obj->ccWnn.jcbuf; + + len = jcbuf->kanaEnd - jcbuf->kanaBuf; + if (len <= 0) return; + + wbuf = (wchar *)XtMalloc((len + 1) * sizeof(wchar)); + (void)bcopy((char *)jcbuf->kanaBuf, (char *)wbuf, + sizeof(wchar) * (len + 1)); + wbuf[len] = 0; + obj->ccWnn.pendingdata = wbuf; +} + +static void +restoreData(obj) +CcWnnObject obj; +{ + wchar *wp = obj->ccWnn.pendingdata; + + if (wp == NULL) return; + + while (*wp != 0) { + jcInsertChar(obj->ccWnn.jcbuf, (int)*wp++); + } + XtFree((char *)obj->ccWnn.pendingdata); + + obj->ccWnn.pendingdata = NULL; + obj->ccWnn.textchanged = True; +} + +/* ARGSUSED */ +static void +ioeCallback(dummy) +XPointer dummy; +{ + ObjRec *objp = ObjList; + + /* + * I/O Error callback function. + * Does minimum cleanup -- i.e. saving dictionaries. + */ + while (objp != NULL) { + if (objp->obj->ccWnn.jcbuf != NULL) { + jcSaveDic(objp->obj->ccWnn.jcbuf); + } + objp = objp->next; + } +} + +static CcWnnObject +findSelectionObj(w) +Widget w; +{ + ObjRec *objp = ObjList; + + while (objp != NULL) { + if (objp->obj->ccWnn.selwidget == w) return objp->obj; + objp = objp->next; + } + return NULL; +} + +/* ARGSUSED */ +static int +PreeditString(w, segn, offset, encoding, format, length, string) +Widget w; +int segn; +int offset; +Atom *encoding; +int *format; +int *length; +XtPointer *string; +{ + CcWnnObject obj = (CcWnnObject)w; + jcConvBuf *jcbuf = obj->ccWnn.jcbuf; + jcClause *cinfo = jcbuf->clauseInfo; + wchar *wbuf, *wp; + int len, wlen; + extern int convJWStoCT(); + + if (jcbuf == NULL) return -1; + if (segn < jcbuf->nClause && + offset >= (cinfo[segn + 1].dispp - cinfo[segn].dispp)) { + /* $B%;%0%a%s%H$N:G8e(B */ + ++segn; + offset = 0; + } + if (segn >= jcbuf->nClause || + offset >= (cinfo[segn + 1].dispp - cinfo[segn].dispp)) { + /* $B:o=|$5$l$?(B */ + *encoding = XA_COMPOUND_TEXT(XtDisplayOfObject(w)); + *format = 8; + *length = 0; + *string = (XtPointer)XtMalloc(1); + return 0; + } + + wlen = (cinfo[jcbuf->nClause].dispp - cinfo[segn].dispp) - offset; + + /* + * jcbuf $B$KF~$C$F$$$kJQ49%F%-%9%H$O(B null $B%?!<%_%M!<%H$5$l$F$$$J$$$N$G(B + * $B$^$:%3%T!<$7$F(B null $B%?!<%_%M!<%H$9$k(B + */ + wbuf = (wchar *)XtMalloc((wlen + 1) * sizeof(wchar)); + (void)bcopy((char *)(cinfo[segn].dispp + offset), (char *)wbuf, sizeof(wchar) * wlen); + wbuf[wlen] = 0; + + /* + * CcWnn $B%*%V%8%'%/%H$O(B COMPOUND_TEXT $B%(%s%3!<%G%#%s%0$7$+%5%]!<%H$7$J$$(B + * COMPOUND_TEXT $B$KJQ49$9$k(B + */ + *encoding = XA_COMPOUND_TEXT(XtDisplayOfObject(w)); + *format = 8; + + /* COMPOUND_TEXT $B$O(B \r $B$,Aw$l$J$$$N$G(B \n $B$KJQ49$7$F$*$/(B */ + for (wp = wbuf; *wp != 0; wp++) { + if (*wp == '\r') *wp = '\n'; + } + + *length = len = convJWStoCT(wbuf, (unsigned char *)NULL, 0); + *string = (XtPointer)XtMalloc(len + 1); + (void)convJWStoCT(wbuf, (unsigned char *)*string, 0); + + /* wbuf $B$r(B free $B$7$F$*$/(B */ + XtFree((char *)wbuf); + + return 0; +} + +/* ARGSUSED */ +static int +StatusString(w, encoding, format, length, string, nchars) +Widget w; +Atom *encoding; +int *format; +int *length; +XtPointer *string; +int *nchars; +{ + ICString *seg; + wchar *wbuf, *wp; + int len, wlen; + extern int convJWStoCT(); + + seg = GetMode(w); + if (seg == NULL) { + *length = *nchars = 0; + return -1; + } + + wlen = seg->nchars; + if (wlen <= 0) { + *length = *nchars = 0; + return -1; + } + + /* + * data $B$KF~$C$F$$$kJQ49%F%-%9%H$O(B null $B%?!<%_%M!<%H$5$l$F$$$J$$$+$b(B + * $B$7$l$J$$$N$G!"$^$:%3%T!<$7$F(B null $B%?!<%_%M!<%H$9$k(B + */ + wbuf = (wchar *)XtMalloc((wlen + 1) * sizeof(wchar)); + (void)bcopy(seg->data, (char *)wbuf, sizeof(wchar) * wlen); + wbuf[wlen] = 0; + + /* + * CcWnn $B%*%V%8%'%/%H$O(B COMPOUND_TEXT $B%(%s%3!<%G%#%s%0$7$+%5%]!<%H$7$J$$(B + * COMPOUND_TEXT $B$KJQ49$9$k(B + */ + *encoding = XA_COMPOUND_TEXT(XtDisplayOfObject(w)); + *format = 8; + + /* COMPOUND_TEXT $B$O(B \r $B$,Aw$l$J$$$N$G(B \n $B$KJQ49$7$F$*$/(B */ + for (wp = wbuf; *wp != 0; wp++) { + if (*wp == '\r') *wp = '\n'; + } + + *length = len = convJWStoCT(wbuf, (unsigned char *)NULL, 0); + *string = XtMalloc(len + 1); + (void)convJWStoCT(wbuf, (unsigned char *)*string, 0); + *nchars = seg->nchars; + + /* wbuf $B$r(B free $B$7$F$*$/(B */ + XtFree((char *)wbuf); + + return 0; +} + +static Boolean +convertSelection(w, selp, targetp, typep, valp, lenp, formatp) +Widget w; +Atom *selp; +Atom *targetp; +Atom *typep; +XtPointer *valp; +unsigned long *lenp; +int *formatp; +{ + CcWnnObject obj = findSelectionObj(w); + int len; + char *s, *data; + Atom t = *targetp; + + TRACE(("CcWnn:convertSelection()\n")); + + if (obj == NULL) { + DPRINT(("CcWnn:convertSelection(): cannot find selection object\n")); + return False; + } + + /* $B%+%l%s%HJ8@a$NFI$_$^$?$O4A;z$rJV$9(B */ + if (t == CachedInternAtom(XtDisplay(w), CCWNN_YOMI_ATOM, True) || + t == CachedInternAtom(XtDisplay(w), "TEXT", True)) { + data = obj->ccWnn.selyomi; + } else if (t == CachedInternAtom(XtDisplay(w), CCWNN_KANJI_ATOM, True)) { + data = obj->ccWnn.selkanji; + } else { + DPRINT(("CcWnn:convertSelection(): unknown target %s\n", + CachedGetAtomName(XtDisplay(w), t))); + return False; + } + + if (data != NULL) { + len = strlen(data); + s = XtMalloc(len + 1); + strcpy(s, data); + } else { + len = 0; + s = XtMalloc(1); + *s = '\0'; + } + + TRACE(("CcWnn:convertSelection(): sending yomi/kanji\n")); + *typep = XA_COMPOUND_TEXT(XtDisplay(w)); + *valp = (XtPointer)s; + *lenp = len; + *formatp = 8; + return True; +} + +static void +saveYomiAndKanji(obj) +CcWnnObject obj; +{ + jcConvBuf *jcbuf = JCBUF(obj); + int clnum = jcbuf->curClause; + jcClause *cinfo = jcbuf->clauseInfo; + wchar wbuf[1024]; + int wlen; + int len; + + TRACE(("CcWnn:saveYomiAndKanji()\n")); + + if (obj->ccWnn.selyomi != NULL) { + XtFree(obj->ccWnn.selyomi); + obj->ccWnn.selyomi = NULL; + } + if (obj->ccWnn.selkanji != NULL) { + XtFree(obj->ccWnn.selkanji); + obj->ccWnn.selkanji = NULL; + } + + /* $B%+%l%s%HJ8@a$NFI$_$H4A;z$rnClause) clnum--; + if (clnum < 0) return; + + /* $BFI$_(B */ + wlen = cinfo[clnum + 1].kanap - cinfo[clnum].kanap; + memcpy(wbuf, cinfo[clnum].kanap, wlen * sizeof(wchar)); + wbuf[wlen] = 0; + len = convJWStoCT(wbuf, (unsigned char *)NULL, 0); + obj->ccWnn.selyomi = XtMalloc(len + 1); + convJWStoCT(wbuf, obj->ccWnn.selyomi, 0); + + /* $B4A;z(B */ + wlen = cinfo[clnum + 1].dispp - cinfo[clnum].dispp; + memcpy(wbuf, cinfo[clnum].dispp, wlen * sizeof(wchar)); + wbuf[wlen] = 0; + len = convJWStoCT(wbuf, (unsigned char *)NULL, 0); + obj->ccWnn.selkanji = XtMalloc(len + 1); + convJWStoCT(wbuf, obj->ccWnn.selkanji, 0); +} diff -r 000000000000 -r 92745d501b9a lib/ConvCtrl.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/ConvCtrl.c Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,1274 @@ +#ifndef lint +static char *rcsid = "$Id: ConvCtrl.c,v 1.54 2001/01/10 08:51:28 ishisone Exp $"; +#endif +/* + * Copyright (c) 1990 Software Research Associates, Inc. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Software Research Associates not be + * used in advertising or publicity pertaining to distribution of the + * software without specific, written prior permission. Software Research + * Associates makes no representations about the suitability of this software + * for any purpose. It is provided "as is" without express or implied + * warranty. + * + * Author: Makoto Ishisone, Software Research Associates, Inc., Japan + */ + +#include +#include +#include +#include "ConvCtrlP.h" +#include "InputConv.h" +#include "ConvDisp.h" +#include "MyDispatch.h" +#include "AsyncErr.h" + +#define DEBUG_VAR debug_ConversionControl +#include "DebugPrint.h" + +static XtResource resources[] = { +#define offset(field) XtOffset(ConversionControlWidget, ccontrol.field) + { XtNinputObject, XtCInputObject, XtRWidget, sizeof(Widget), + offset(inputobj), XtRImmediate, (XtPointer)NULL }, + { XtNinputObjectClass, XtCInputObjectClass, + XtRPointer, sizeof(WidgetClass), + offset(inputobjclass), XtRImmediate, (XtPointer)NULL }, + { XtNdisplayObjectClass, XtCDisplayObjectClass, + XtRPointer, sizeof(WidgetClass), + offset(displayobjclass), XtRImmediate, (XtPointer)NULL }, + { XtNclientWindow, XtCWindow, XtRWindow, sizeof(Window), + offset(clientwindow), XtRImmediate, (XtPointer)None }, + { XtNfocusWindow, XtCWindow, XtRWindow, sizeof(Window), + offset(focuswindow), XtRImmediate, (XtPointer)None }, + { XtNcursor, XtCCursor, XtRCursor, sizeof(Cursor), + offset(cursor), XtRImmediate, (XtPointer)None }, + { XtNeventSelectMethod, XtCEventSelectMethod, + XtREventSelectMethod, sizeof(EventSelectMethod), + offset(eventselectmethod), XtRString, (XtPointer)"none" }, + { XtNtextEncoding, XtCTextEncoding, XtRAtom, sizeof(Atom), + offset(textencoding), XtRString, "COMPOUND_TEXT" }, + { XtNtextCallback, XtCCallback, XtRCallback, sizeof(XtCallbackList), + offset(textcallback), XtRCallback, (XtPointer)NULL }, + { XtNnewTextCallback, XtCCallback, XtRCallback, sizeof(XtCallbackList), + offset(newtextcallback), XtRCallback, (XtPointer)NULL }, + { XtNendCallback, XtCCallback, XtRCallback, sizeof(XtCallbackList), + offset(endcallback), XtRCallback, (XtPointer)NULL }, + { XtNunusedEventCallback, XtCCallback, XtRCallback, sizeof(XtCallbackList), + offset(unusedeventcallback), XtRCallback, (XtPointer)NULL }, + { XtNsendbackKeyPress, XtCSendbackEvent, XtRBoolean, sizeof(Boolean), + offset(sendbackKeyPress), XtRString, (XtPointer)"False" }, + { XtNtitlebarHeight, XtCTitlebarHeight, XtRDimension, sizeof(Dimension), + offset(titlebarheight), XtRImmediate, (XtPointer)0 }, +#undef offset +}; + +static void EventToInputObject(); + +static XtActionsRec actions[] = { + {"to-inputobj", EventToInputObject }, +}; + +static char translations[] = ": to-inputobj()"; + +static void ClassInitialize(); +static void StringToESM(); +static void ClassPartInitialize(); +static void Initialize(), Destroy(); +static void Realize(); +static void Resize(); +static Boolean SetValues(); + +static void ConversionStartup(); +static void ConversionFinish(); +static void ChangeAttributes(); +static void ChangeFocus(); +static void TextChange(); +static void Fix(); +static void ModeChange(); +static void SelectionControl(); +static void AuxControl(); + +static void GetClientCoordinates(); + +static Widget CreateInputObject(); + +static Boolean ClassIsSubClassOf(); + +static void CaptureClientDead(); +static void InterceptClientKeyEvent(); +static void SelectFocusKeyEvent(); +static void UnselectFocusKeyEvent(); +static void ClientKey(); +static void ClientDead(); + +static Boolean SafeGetWindowAttributes(); +static void CheckAttributes(); +static void CheckCoordinates(); +static Boolean clipRectangle(); + +static void FixCallback(); +static void ConversionEndCallback(); +static void TextChangeCallback(); +static void ModeChangeCallback(); +static void SelectionControlCallback(); +static void AuxControlCallback(); + +static void WidgetError(), WidgetWarning(); + +static CompositeClassExtensionRec CompositeExtension = { + /* next_extension */ NULL, + /* record_type */ NULLQUARK, + /* version */ XtCompositeExtensionVersion, + /* record_size */ sizeof(CompositeClassExtensionRec), + /* accept_objects */ True, +}; + +ConversionControlClassRec conversionControlClassRec = { + { /* core fields */ + /* superclass */ (WidgetClass) &transientShellClassRec, + /* class_name */ "ConversionControl", + /* widget_size */ sizeof(ConversionControlRec), + /* class_initialize */ ClassInitialize, + /* class_part_initialize */ ClassPartInitialize, + /* class_inited */ FALSE, + /* initialize */ Initialize, + /* initialize_hook */ NULL, + /* realize */ Realize, + /* actions */ actions, + /* num_actions */ XtNumber(actions), + /* resources */ resources, + /* num_resources */ XtNumber(resources), + /* xrm_class */ NULLQUARK, + /* compress_motion */ TRUE, + /* compress_exposure */ TRUE, + /* compress_enterleave */ TRUE, + /* visible_interest */ FALSE, + /* destroy */ Destroy, + /* resize */ Resize, + /* expose */ NULL, + /* set_values */ SetValues, + /* set_values_hook */ NULL, + /* set_values_almost */ XtInheritSetValuesAlmost, + /* get_values_hook */ NULL, + /* accept_focus */ NULL, + /* version */ XtVersion, + /* callback_private */ NULL, + /* tm_table */ translations, + /* query_geometry */ XtInheritQueryGeometry, + /* display_accelerator */ XtInheritDisplayAccelerator, + /* extension */ NULL + }, + { /* composite fields */ + /* geometry_manager */ XtInheritGeometryManager, + /* change_managed */ XtInheritChangeManaged, + /* insert_child */ XtInheritInsertChild, + /* delete_child */ XtInheritDeleteChild, + /* extension */ (XtPointer)&CompositeExtension, + }, + { /* shell fields */ + /* extension */ NULL + }, + { /* wm_shell fields */ + /* extension */ NULL + }, + { /* vendor_shell fields */ + /* extension */ NULL + }, + { /* transient_shell fields */ + /* extension */ NULL + }, + { /* conversionControl fields */ + /* Startup */ ConversionStartup, + /* Finish */ ConversionFinish, + /* ChangeAttributes */ ChangeAttributes, + /* ChangeFocus */ ChangeFocus, + /* TextChange */ TextChange, + /* Fix */ Fix, + /* ModeChange */ ModeChange, + /* SelectionControl */ SelectionControl, + /* AuxControl */ AuxControl, + } +}; + +WidgetClass conversionControlWidgetClass = (WidgetClass)&conversionControlClassRec; + +/* ARGSUSED */ +static void +ClassInitialize() +{ + /* add String -> EventSelectionMethod converter */ + XtAddConverter(XtRString, XtREventSelectMethod, StringToESM, + (XtConvertArgList)NULL, (Cardinal)0); +} + +/* ARGSUSED */ +static void +StringToESM(args, num_args, from, to) +XrmValue *args; +Cardinal *num_args; +XrmValue *from; +XrmValue *to; +{ + char *s = (char *)from->addr; + static EventSelectMethod esm = ESMethodNone; + + if (!XmuCompareISOLatin1(s, "inputonly")) { + esm = ESMethodInputOnly; + } else if (!XmuCompareISOLatin1(s, "selectfocus")) { + esm = ESMethodSelectFocus; + } else if (!XmuCompareISOLatin1(s, "none")) { + esm = ESMethodNone; + } else { + XtStringConversionWarning(s, XtREventSelectMethod); + } + + to->size = sizeof(EventSelectMethod); + to->addr = (caddr_t)&esm; +} + +static void +ClassPartInitialize(cl) +WidgetClass cl; +{ + ConversionControlWidgetClass class = (ConversionControlWidgetClass)cl; + ConversionControlWidgetClass super = (ConversionControlWidgetClass)class->core_class.superclass; + +#define ccclass conversionControl_class + if (class->ccclass.Startup == XtInheritStartup) { + class->ccclass.Startup = super->ccclass.Startup; + } + if (class->ccclass.Finish == XtInheritFinish) { + class->ccclass.Finish = super->ccclass.Finish; + } + if (class->ccclass.ChangeAttributes == XtInheritChangeAttributes) { + class->ccclass.ChangeAttributes = super->ccclass.ChangeAttributes; + } + if (class->ccclass.ChangeFocus == XtInheritChangeFocus) { + class->ccclass.ChangeFocus = super->ccclass.ChangeFocus; + } + if (class->ccclass.TextChange == XtInheritTextChange) { + class->ccclass.TextChange = super->ccclass.TextChange; + } + if (class->ccclass.Fix == XtInheritFix) { + class->ccclass.Fix = super->ccclass.Fix; + } + if (class->ccclass.ModeChange == XtInheritModeChange) { + class->ccclass.ModeChange = super->ccclass.ModeChange; + } + if (class->ccclass.SelectionControl == XtInheritSelectionControl) { + class->ccclass.SelectionControl = super->ccclass.SelectionControl; + } + if (class->ccclass.AuxControl == XtInheritAuxControl) { + class->ccclass.AuxControl = super->ccclass.AuxControl; + } +#undef ccclass +} + +/* ARGSUSED */ +static void +Initialize(req, new, args, num_args) +Widget req; +Widget new; +ArgList args; +Cardinal *num_args; +{ + ConversionControlWidget ccw = (ConversionControlWidget)new; + + /* + * check inputobj/inputobjclass resource + */ + + if (ccw->ccontrol.inputobj == NULL) { + /* if inputobj not specified, inputobjclass must be specified */ + if (ccw->ccontrol.inputobjclass == NULL) { + WidgetError(new, "noResourceError", "inputObjectClass", + "either inputObject or inputObjectClass must be specified at creation time"); + } else if (!ClassIsSubClassOf(ccw->ccontrol.inputobjclass, + inputConvObjectClass)) { + WidgetError(new, "classError", "inputObjectClass", + "inputObjectClass must be subclass of inputConvObjectClass"); + } + (void)CreateInputObject(ccw); + ccw->ccontrol.createinputobj = True; + + } else if (!XtIsSubclass(ccw->ccontrol.inputobj, inputConvObjectClass)) { + WidgetError(new, "classError", "inputObject", + "inputObject must be subclass of inputConvObjectClass"); + } + + if (ccw->ccontrol.displayobjclass == NULL) { + WidgetError(new, "noResourceError", "displayObjectClass", + "displayObjectClass must be specified"); + } else if (!ClassIsSubClassOf(ccw->ccontrol.displayobjclass, + convDisplayObjectClass)) { + WidgetError(new, "classError", "displayObjectClass", + "displayObjectClass must be subclass of convDisplayObjectClass"); + } + + ccw->ccontrol.active = False; + ccw->ccontrol.oldclientwindow = None; + ccw->ccontrol.probewindow = None; +} + +static void +Destroy(w) +Widget w; +{ + ConversionControlWidget ccw = (ConversionControlWidget)w; + Display *dpy = XtDisplay(w); + + if (ccw->ccontrol.active == False) return; + + if (ccw->ccontrol.clientwindow != None) { + MyRemoveAllEventHandler(dpy, ccw->ccontrol.clientwindow); + } + + if (ccw->ccontrol.probewindow != None) { + MyRemoveAllEventHandler(dpy, ccw->ccontrol.probewindow); + XDestroyWindow(dpy, ccw->ccontrol.probewindow); + } +} + +static void +Realize(w, maskp, attr) +Widget w; +XtValueMask *maskp; +XSetWindowAttributes *attr; +{ + ConversionControlWidget ccw = (ConversionControlWidget)w; + + if (ccw->ccontrol.cursor != None) { + attr->cursor = ccw->ccontrol.cursor; + *maskp |= CWCursor; + } + + /* call super class's realize function */ + (*conversionControlWidgetClass->core_class.superclass->core_class.realize)(w, maskp, attr); +} + +static void +Resize(w) +Widget w; +{ + ConversionControlWidget ccw = (ConversionControlWidget)w; + Widget child; + int i; + + TRACE(("ConversionControl:Resize()\n")); + + /* ignore non-widgets */ + for (i = 0; i < ccw->composite.num_children; i++) { + child = ccw->composite.children[i]; + if (XtIsWidget(child) && child->core.managed) { + XtResizeWidget(child, ccw->core.width, ccw->core.height, + child->core.border_width); + } + } +} + +/* ARGSUSED */ +static Boolean +SetValues(cur, req, wid, args, num_args) +Widget cur; +Widget req; +Widget wid; +ArgList args; +Cardinal *num_args; +{ + ConversionControlWidget old = (ConversionControlWidget)cur; + ConversionControlWidget new = (ConversionControlWidget)wid; + + if (new->ccontrol.active) { + if (old->ccontrol.inputobj != new->ccontrol.inputobj) { + WidgetWarning(wid, "setValuesError", "inputObject", + "inputObject resource can't be changed during conversion"); + new->ccontrol.inputobj = old->ccontrol.inputobj; /* restore */ + } + if (old->ccontrol.eventselectmethod != new->ccontrol.eventselectmethod) { + WidgetWarning(wid, "setValuesError", "eventSelectionMethod", + "eventSelectionMethod resource can't be changed during conversion"); + new->ccontrol.eventselectmethod = old->ccontrol.eventselectmethod; /* restore */ + } + } + + if (new->ccontrol.clientwindow != old->ccontrol.clientwindow || + new->ccontrol.focuswindow != old->ccontrol.focuswindow) { + WidgetWarning(wid, "setValuesError", "clientWindow", + "clientWindow and focusWindow resources are read-only"); + new->ccontrol.clientwindow = old->ccontrol.clientwindow; /* restore */ + new->ccontrol.focuswindow = old->ccontrol.focuswindow; /* restore */ + } + + if (new->ccontrol.cursor != old->ccontrol.cursor && XtIsRealized(wid)) { + XDefineCursor(XtDisplay(wid), XtWindow(wid), new->ccontrol.cursor); + } + + return False; +} + +/* ARGSUSED */ +static void +ConversionStartup(w, mask, value) +Widget w; +unsigned long mask; +ConversionAttributes *value; +{ + /* do nothing */ +} + +/* ARGSUSED */ +static void +ConversionFinish(w) +Widget w; +{ + /* do nothing */ +} + +/* ARGSUSED */ +static void +ChangeAttributes(w, mask, value) +Widget w; +unsigned long mask; +ConversionAttributes *value; +{ + /* do nothing */ +} + +/* ARGSUSED */ +static void +ChangeFocus(w, set) +Widget w; +int set; +{ + /* do nothing */ +} + +/* ARGSUSED */ +static void +TextChange(w) +Widget w; +{ + /* do nothing */ +} + +/* ARGSUSED */ +static void +Fix(w, arg) +Widget w; +CCTextCallbackArg *arg; +{ + ConversionControlWidget ccw = (ConversionControlWidget)w; + + XtCallCallbackList((Widget)ccw, ccw->ccontrol.textcallback, + (XtPointer)arg); +} + +/* ARGSUSED */ +static void +ModeChange(w) +Widget w; +{ + /* do nothing */ +} + +/* ARGSUSED */ +static void +SelectionControl(w, controlarg) +Widget w; +ICSelectionControlArg *controlarg; +{ + /* do nothing */ +} + +/* ARGSUSED */ +static void +AuxControl(w, controlarg) +Widget w; +ICAuxControlArg *controlarg; +{ + /* do nothing */ +} + +/* + * public functions + */ + +void +CControlStartConversion(w, clientwindow, valuemask, value) +Widget w; +Window clientwindow; +unsigned long valuemask; +ConversionAttributes *value; +{ + ConversionControlWidget ccw = (ConversionControlWidget)w; + ConversionControlWidgetClass class = (ConversionControlWidgetClass)w->core.widget_class; + + TRACE(("CControlStartConversion(clientwindow=%lx)\n", clientwindow)); + if (ccw->ccontrol.active) { + WidgetWarning(w, "busyError", "CControlStartConversion", + "is busy. can't start conversion"); + return; + } + if (clientwindow == None) { + /* ouch */ + WidgetWarning(w, "dataError", "cControlStartConversion", + "clientWindow not specified. can't start conversion."); + return; + } + + /* check clientWindow's existance */ + if (!SafeGetWindowAttributes(XtDisplay(w), clientwindow, + &(ccw->ccontrol.client_attr))) { + WidgetWarning(w, "badWindowError", "clientWindow", + "clientWindow does not exist. can't start conversion."); + return; + } + + ICClearConversion(ccw->ccontrol.inputobj); + ccw->ccontrol.notext = ICNumSegments(ccw->ccontrol.inputobj) == 0; + + ccw->ccontrol.active = True; + ccw->ccontrol.clientwindow = clientwindow; + + /* check given attributes */ + CheckAttributes(ccw, &valuemask, value); + + if (valuemask & CAFocusWindow) { + ccw->ccontrol.focuswindow = value->focuswindow; + } else { + ccw->ccontrol.focuswindow = clientwindow; + ccw->ccontrol.focus_attr = ccw->ccontrol.client_attr; + } + + if (ccw->ccontrol.eventselectmethod == ESMethodInputOnly) { + InterceptClientKeyEvent(ccw); + } else if (ccw->ccontrol.eventselectmethod == ESMethodSelectFocus) { + SelectFocusKeyEvent(ccw); + } + + CheckCoordinates(ccw, &valuemask, value, 1); + + GetClientCoordinates(ccw); + + CaptureClientDead(ccw); + + XtAddCallback(ccw->ccontrol.inputobj, + XtNfixNotify, FixCallback, (XtPointer)ccw); + XtAddCallback(ccw->ccontrol.inputobj, + XtNendNotify, ConversionEndCallback, (XtPointer)ccw); + XtAddCallback(ccw->ccontrol.inputobj, + XtNtextChangeNotify, TextChangeCallback, (XtPointer)ccw); + XtAddCallback(ccw->ccontrol.inputobj, + XtNmodeChangeNotify, ModeChangeCallback, (XtPointer)ccw); + XtAddCallback(ccw->ccontrol.inputobj, + XtNselectionControl, SelectionControlCallback, + (XtPointer)ccw); + XtAddCallback(ccw->ccontrol.inputobj, + XtNauxControl, AuxControlCallback, + (XtPointer)ccw); + + /* call input style dependent startup */ + (*class->conversionControl_class.Startup)(w, valuemask, value); +} + +void +CControlEndConversion(w) +Widget w; +{ + ConversionControlWidget ccw = (ConversionControlWidget)w; + ConversionControlWidgetClass class = (ConversionControlWidgetClass)w->core.widget_class; + Display *dpy = XtDisplay(w); + + if (!ccw->ccontrol.active) { + WidgetWarning(w, "busyError", "cControlEndConversion", + "is not active. can't stop conversion"); + return; + } + + XtRemoveCallback(ccw->ccontrol.inputobj, + XtNfixNotify, FixCallback, (XtPointer)ccw); + XtRemoveCallback(ccw->ccontrol.inputobj, + XtNendNotify, ConversionEndCallback, (XtPointer)ccw); + XtRemoveCallback(ccw->ccontrol.inputobj, + XtNtextChangeNotify, TextChangeCallback, (XtPointer)ccw); + XtRemoveCallback(ccw->ccontrol.inputobj, + XtNmodeChangeNotify, ModeChangeCallback, (XtPointer)ccw); + XtRemoveCallback(ccw->ccontrol.inputobj, + XtNselectionControl, SelectionControlCallback, + (XtPointer)ccw); + XtRemoveCallback(ccw->ccontrol.inputobj, + XtNauxControl, AuxControlCallback, + (XtPointer)ccw); + + ICClearConversion(ccw->ccontrol.inputobj); + + MyRemoveEventHandler(dpy, ccw->ccontrol.clientwindow, DestroyNotify, + ClientDead, (XtPointer)ccw); + + if (ccw->ccontrol.probewindow != None) { + MyRemoveAllEventHandler(dpy, ccw->ccontrol.probewindow); + XDestroyWindow(dpy, ccw->ccontrol.probewindow); + ccw->ccontrol.probewindow = None; + } + + /* unselect focuswindow events */ + if (ccw->ccontrol.eventselectmethod == ESMethodSelectFocus) { + UnselectFocusKeyEvent(ccw); + } + + ccw->ccontrol.active = False; + + /* call input style dependent finish */ + (*class->conversionControl_class.Finish)(w); + + ccw->ccontrol.oldclientwindow = ccw->ccontrol.clientwindow; + ccw->ccontrol.clientwindow = None; +} + +void +CControlChangeAttributes(w, valuemask, value) +Widget w; +unsigned long valuemask; +ConversionAttributes *value; +{ + ConversionControlWidget ccw = (ConversionControlWidget)w; + ConversionControlWidgetClass class = (ConversionControlWidgetClass)w->core.widget_class; + + if (!ccw->ccontrol.active) { + WidgetWarning(w, "busyError", "cControlChangeAttributes", + "is not active. can't change attributes"); + return; + } + + CheckAttributes(ccw, &valuemask, value); + CheckCoordinates(ccw, &valuemask, value, 0); + + if (valuemask == 0L) return; + + if (valuemask & CAFocusWindow) { + if (ccw->ccontrol.eventselectmethod == ESMethodSelectFocus) { + UnselectFocusKeyEvent(ccw); + } + ccw->ccontrol.focuswindow = value->focuswindow; + if (ccw->ccontrol.eventselectmethod == ESMethodSelectFocus) { + SelectFocusKeyEvent(ccw); + } + } + + (*class->conversionControl_class.ChangeAttributes)(w, valuemask, value); +} + +void +CControlChangeFocus(w, set) +Widget w; +int set; +{ + ConversionControlWidget ccw = (ConversionControlWidget)w; + ConversionControlWidgetClass class = (ConversionControlWidgetClass)w->core.widget_class; + + if (!ccw->ccontrol.active) { + WidgetWarning(w, "busyError", "cControlChangeFocus", + "is not active. can't change focus"); + return; + } + + (*class->conversionControl_class.ChangeFocus)(w, set); +} + +static Boolean +SafeGetWindowAttributes(dpy, w, attr) +Display *dpy; +Window w; +XWindowAttributes *attr; +{ + XAEHandle h; + unsigned long errbits = 0; + + h = XAESetRecordErrors(dpy, &errbits); + (void)XGetWindowAttributes(dpy, w, attr); + XAEUnset(h); + + return (errbits == 0); +} + +static void +CheckAttributes(ccw, valuemaskp, value) +ConversionControlWidget ccw; +unsigned long *valuemaskp; +ConversionAttributes *value; +{ + Display *dpy = XtDisplay((Widget)ccw); + XAEHandle h; + unsigned long ebits = 0; + +#define CHECKATTRS (CAFocusWindow|CAColormap|CACursor|CABackgroundPixmap) + if ((*valuemaskp & CHECKATTRS) == 0) return; +#undef CHECKATTRS + +#define XERROR(e) (ebits & (1 << (e))) + + h = XAESetRecordErrors(dpy, &ebits); + + if (*valuemaskp & (CAColormap|CACursor|CABackgroundPixmap)) { + XSetWindowAttributes attr; + Window w; + + w = XCreateSimpleWindow(dpy, ccw->ccontrol.clientwindow, + 0, 0, 1, 1, 0, 0L, 0L); + + if (*valuemaskp & CACursor) { + /* BadCursor */ + attr.cursor = value->cursor; + XChangeWindowAttributes(dpy, w, CWCursor, &attr); + } + if (*valuemaskp & CAColormap) { + /* BadMatch or BadColormap */ + attr.colormap = value->colormap; + XChangeWindowAttributes(dpy, w, CWColormap, &attr); + } + if (*valuemaskp & CABackgroundPixmap) { + /* BadMatch or BadPixmap */ + attr.background_pixmap = value->background_pixmap; + XChangeWindowAttributes(dpy, w, CWBackPixmap, &attr); + } + + XDestroyWindow(dpy, w); + } + if (*valuemaskp & CAFocusWindow) { + (void)XGetWindowAttributes(dpy, value->focuswindow, + &(ccw->ccontrol.focus_attr)); + } else { + XSync(dpy, False); + } + XAEUnset(h); + + if ((*valuemaskp & CAFocusWindow) && XERROR(BadWindow)) { + WidgetWarning((Widget)ccw, "badWindowError", "focusWindow", + "focusWindow does not exist."); + *valuemaskp &= ~CAFocusWindow; + } + if ((*valuemaskp & CAColormap) && XERROR(BadColor)) { + WidgetWarning((Widget)ccw, "badColorError", "colormap", + "invalid colormap ID."); + *valuemaskp &= ~CAColormap; + } + if ((*valuemaskp & CAColormap) && XERROR(BadMatch)) { + WidgetWarning((Widget)ccw, "badMatchError", "colormap", + "invalid colormap."); + *valuemaskp &= ~CAColormap; + } + if ((*valuemaskp & CABackgroundPixmap) && XERROR(BadPixmap)) { + WidgetWarning((Widget)ccw, "badPixmapError", "backgroundPixmap", + "invalid pixmap ID."); + *valuemaskp &= ~CABackgroundPixmap; + } + if ((*valuemaskp & CABackgroundPixmap) && XERROR(BadMatch)) { + WidgetWarning((Widget)ccw, "badMatchError", "backgroundPixmap", + "invalid pixmap for background."); + *valuemaskp &= ~CABackgroundPixmap; + } + if ((*valuemaskp & CACursor) && XERROR(BadCursor)) { + WidgetWarning((Widget)ccw, "badCursorError", "cursor", + "invalid cursor ID."); + *valuemaskp &= ~CACursor; + } +#undef XERROR +} + +static void +CheckCoordinates(ccw, valuemaskp, value, clip) +ConversionControlWidget ccw; +unsigned long *valuemaskp; +ConversionAttributes *value; +int clip; +{ +#define INVALIDRECT(r) (r.width == 0 || r.height == 0) + if ((*valuemaskp & CAClientArea) && + (INVALIDRECT(value->clientarea) || + (clip && !clipRectangle(&value->clientarea, &ccw->ccontrol.client_attr)))) { + DPRINT(("CheckCoordinates: invalid ClientArea\n")); + *valuemaskp &= ~CAClientArea; + } + if ((*valuemaskp & CAStatusArea) && + (INVALIDRECT(value->statusarea) || + (clip && !clipRectangle(&value->statusarea, &ccw->ccontrol.client_attr)))) { + DPRINT(("CheckCoordinates: invalid StatusArea\n")); + *valuemaskp &= ~CAStatusArea; + } +#undef INVALIDRECT +} + +static Boolean +clipRectangle(rectp, attrp) +register XRectangle *rectp; +register XWindowAttributes *attrp; +{ + register int z0, z1, e; + + z0 = rectp->x; z1 = z0 + rectp->width; e = attrp->width; + if (z0 == z1) z1 = e; /* if (rectp->width == 0)... */ + if (z0 >= e || z1 <= 0) return False; + if (z0 < 0) z0 = 0; + if (z1 > e) z1 = e; + rectp->x = z0; rectp->width = z1 - z0; + + z0 = rectp->y; z1 = z0 + rectp->height; e = attrp->height; + if (z0 == z1) z1 = e; /* if (rectp->height == 0)... */ + if (z0 >= e || z1 <= 0) return False; + if (z0 < 0) z0 = 0; + if (z1 > e) z1 = e; + rectp->y = z0; rectp->height = z1 - z0; + + return True; +} + +static void +GetClientCoordinates(ccw) +ConversionControlWidget ccw; +{ + Display *dpy = XtDisplay(ccw); + Window root = RootWindowOfScreen(XtScreen(ccw)); + Window win = ccw->ccontrol.clientwindow; + Window junk; + int rootx, rooty; + + if (!XTranslateCoordinates(dpy, win, root, 0, 0, &rootx, &rooty, &junk)) { + WidgetWarning((Widget)ccw, "windowError", "differentRoot", + "clientWindow and conversion widget have different root. this should not happen!"); + rootx = rooty = 0; + } + + ccw->ccontrol.client_rootx = rootx; + ccw->ccontrol.client_rooty = rooty; +} + +/* ARGSUSED */ +static void +EventToInputObject(w, event, args, num_args) +Widget w; +XEvent *event; +String *args; +Cardinal *num_args; +{ + ConversionControlWidget ccw = (ConversionControlWidget)w; + Boolean hascallback = False; + int r; +#ifdef OBSOLETE_FEATURE + Boolean sendback = False; +#endif + + if (ccw->ccontrol.inputobj == NULL) return; + + ccw->ccontrol.endnotify = False; + + if (ccw->ccontrol.unusedeventcallback != NULL && + XtHasCallbacks(w, XtNunusedEventCallback) == XtCallbackHasSome) { + hascallback = True; + } + +#ifdef OBSOLETE_FEATURE + /* + * a cheap little hack -- sending back unused events + * + * if user set some callback on XtNunusedEventCallback, we call + * the callback functions on 'unused' KeyPress events. + * + * otherwise, if the resource XtNsendbackKeyPress is true, we + * attempt to send 'unused' KeyPress events back to the client. + * + * we call callbacks or send an event back to the client when + * following conditions are satisfied: + * + it is a KeyPress event AND + * + the number of segments is 0 before the conversion object + * processes it AND + * + the number of segments remains 0 after processing AND + * + none of the modeChangeNotify, selectionControl, endNotify and + * fixNofity callbacks are called during processing + * it is intentional to exclude textChangeNotify callback from + * above condition, because this callback is often called even if + * the text doesn't change actually. so we use the condition that + * the number of segments remains 0 instead. + */ + + if ((hascallback ||ccw->ccontrol.sendbackKeyPress) && + event->type == KeyPress && + ICNumSegments(ccw->ccontrol.inputobj) == 0) { + sendback = True; + } + + ccw->ccontrol.eventused = False; + + if ((r = ICInputEvent(ccw->ccontrol.inputobj, event)) == 1 || + (sendback && !ccw->ccontrol.eventused && + ICNumSegments(ccw->ccontrol.inputobj) == 0)) { +#else + /* + * Above feature is obsolete. Now it is the input object's + * responsibility to decide whether the event should be + * sent back to the client or not. + */ + if ((r = ICInputEvent(ccw->ccontrol.inputobj, event)) == 1) { +#endif + + /* event isn't used */ + if (hascallback) { + TRACE(("call XtNunusedEventCallback\n")); + XtCallCallbackList(w, ccw->ccontrol.unusedeventcallback, + (XtPointer)event); + } else if (ccw->ccontrol.sendbackKeyPress) { + Window savewin; + Window savesubwin; + + TRACE(("sendback event to window 0x%lx\n", ccw->ccontrol.focuswindow)); + savewin = event->xkey.window; + savesubwin = event->xkey.subwindow; + event->xkey.window = ccw->ccontrol.focuswindow; + event->xkey.subwindow = None; + + /* + * here we use NoEventMask as the eventmask, not + * KeyPressMask. that means the event will be sent only + * to the client who created the destination window. + */ + XSendEvent(XtDisplay(w), event->xkey.window, + False, NoEventMask, event); + + event->xkey.window = savewin; /* restore */ + event->xkey.subwindow = savesubwin; /* restore */ + } + } + + if (r < 0 || ccw->ccontrol.endnotify) { + CControlEndConversion(w); + XtCallCallbackList(w, ccw->ccontrol.endcallback, (XtPointer)False); + } +} + + +/* + * sub-widget creation + */ + +static Widget +CreateInputObject(ccw) +ConversionControlWidget ccw; +{ + Widget inputobj; + Arg args[1]; + + XtSetArg(args[0], XtNdisplayObjectClass, ccw->ccontrol.displayobjclass); + inputobj = XtCreateWidget("inputObj", ccw->ccontrol.inputobjclass, + (Widget)ccw, args, 1); + ccw->ccontrol.inputobj = inputobj; + + return inputobj; +} + +static Boolean +ClassIsSubClassOf(class, reference) +WidgetClass class; +WidgetClass reference; +{ + while (class != NULL) { + if (class == reference) return True; + class = class->core_class.superclass; + } + return False; +} + +static void +CaptureClientDead(ccw) +ConversionControlWidget ccw; +{ + Display *dpy = XtDisplay(ccw); + Window win = ccw->ccontrol.clientwindow; + + MyAddEventHandler(dpy, win, DestroyNotify, StructureNotifyMask, + ClientDead, (XtPointer)ccw); +} + +static void +InterceptClientKeyEvent(ccw) +ConversionControlWidget ccw; +{ + Display *dpy = XtDisplay(ccw); + Window win = ccw->ccontrol.clientwindow; + Window probe; + + TRACE(("InterceptClientKeyEvent()\n")); + probe = XCreateWindow(dpy, win, 0, 0, 9999, 9999, 0, 0, + InputOnly, (Visual *)CopyFromParent, + 0L, (XSetWindowAttributes *)NULL); + TRACE(("\tprobewindow = %lx\n", probe)); + + MyAddEventHandler(dpy, probe, KeyPress, KeyPressMask, + ClientKey, (XtPointer)ccw); + MyAddEventHandler(dpy, probe, KeyRelease, KeyReleaseMask, + ClientKey, (XtPointer)ccw); + + ccw->ccontrol.probewindow = probe; + + XMapWindow(dpy, probe); +} + +static void +SelectFocusKeyEvent(ccw) +ConversionControlWidget ccw; +{ + Display *dpy = XtDisplay(ccw); + Window win = ccw->ccontrol.focuswindow; + + MyAddEventHandler(dpy, win, KeyPress, KeyPressMask, + ClientKey, (XtPointer)ccw); + MyAddEventHandler(dpy, win, KeyRelease, KeyReleaseMask, + ClientKey, (XtPointer)ccw); +} + +static void +UnselectFocusKeyEvent(ccw) +ConversionControlWidget ccw; +{ + Display *dpy = XtDisplay(ccw); + Window win = ccw->ccontrol.focuswindow; + + MyRemoveEventHandler(dpy, win, KeyPress, ClientKey, (XtPointer)ccw); + MyRemoveEventHandler(dpy, win, KeyRelease, ClientKey, (XtPointer)ccw); +} + +static void +ClientKey(ev, data) +XEvent *ev; +XtPointer data; +{ + Widget w = (Widget)data; + Cardinal num_params = 0; + + EventToInputObject(w, ev, (String *)NULL, &num_params); +} + +static void +ClientDead(ev, data) +XEvent *ev; +XtPointer data; +{ + ConversionControlWidget ccw = (ConversionControlWidget)data; + ConversionControlWidgetClass class = (ConversionControlWidgetClass)ccw->core.widget_class; + + if (ev->type != DestroyNotify || + ev->xdestroywindow.window != ccw->ccontrol.clientwindow) return; + + /* + * Client window is destroyed. + */ + + /* remove all event handlers */ + MyRemoveAllEventHandler(XtDisplay(ccw), ccw->ccontrol.clientwindow); + if (ccw->ccontrol.probewindow != None) { + /* no need to destroy probewindow. it's already destroyed. */ + MyRemoveAllEventHandler(XtDisplay(ccw), ccw->ccontrol.probewindow); + } + if (ccw->ccontrol.eventselectmethod == ESMethodSelectFocus && + ccw->ccontrol.focuswindow != ccw->ccontrol.clientwindow) { + MyRemoveAllEventHandler(XtDisplay(ccw), ccw->ccontrol.focuswindow); + } + + ccw->ccontrol.oldclientwindow = ccw->ccontrol.clientwindow; + ccw->ccontrol.clientwindow = None; + ccw->ccontrol.focuswindow = None; + ccw->ccontrol.probewindow = None; + ccw->ccontrol.active = False; + + XtRemoveCallback(ccw->ccontrol.inputobj, + XtNfixNotify, FixCallback, (XtPointer)ccw); + XtRemoveCallback(ccw->ccontrol.inputobj, + XtNendNotify, ConversionEndCallback, (XtPointer)ccw); + XtRemoveCallback(ccw->ccontrol.inputobj, + XtNtextChangeNotify, TextChangeCallback, (XtPointer)ccw); + XtRemoveCallback(ccw->ccontrol.inputobj, + XtNmodeChangeNotify, ModeChangeCallback, (XtPointer)ccw); + XtRemoveCallback(ccw->ccontrol.inputobj, + XtNselectionControl, SelectionControlCallback, + (XtPointer)ccw); + XtRemoveCallback(ccw->ccontrol.inputobj, + XtNauxControl, AuxControlCallback, + (XtPointer)ccw); + + /* call input style dependent finish */ + (*class->conversionControl_class.Finish)((Widget)ccw); + + /* clear conversion object */ + ICClearConversion(ccw->ccontrol.inputobj); + + ccw->ccontrol.oldclientwindow = None; + XtCallCallbackList((Widget)ccw, ccw->ccontrol.endcallback, (XtPointer)True); +} + +/* ARGSUSED */ +static void +FixCallback(w, client_data, call_data) +Widget w; +XtPointer client_data; +XtPointer call_data; +{ + Widget widget = (Widget)client_data; + ConversionControlWidget ccw = (ConversionControlWidget)widget; + ConversionControlWidgetClass class = (ConversionControlWidgetClass)widget->core.widget_class; + Atom encoding = ccw->ccontrol.textencoding; + int format; + int length; + XtPointer text; + CCTextCallbackArg arg; + + ccw->ccontrol.eventused = True; + + if (ICGetConvertedString(w, &encoding, &format, &length, &text) < 0) { + return; + } + arg.encoding = encoding; + arg.format = format; + arg.length = length; + arg.text = text; + + (*class->conversionControl_class.Fix)(widget, &arg); + + XtFree(text); +} + +/* ARGSUSED */ +static void +ConversionEndCallback(w, client_data, call_data) +Widget w; +XtPointer client_data; +XtPointer call_data; +{ + ConversionControlWidget ccw = (ConversionControlWidget)client_data; + + ccw->ccontrol.eventused = True; + ccw->ccontrol.endnotify = True; +} + +/* ARGSUSED */ +static void +TextChangeCallback(w, client_data, call_data) +Widget w; +XtPointer client_data; +XtPointer call_data; +{ + Widget widget = (Widget)client_data; + ConversionControlWidget ccw = (ConversionControlWidget)widget; + ConversionControlWidgetClass class = (ConversionControlWidgetClass)widget->core.widget_class; + int nsegs = ICNumSegments(ccw->ccontrol.inputobj); + + /* + * don't do: + * ccw->ccontrol.eventused = True; + * because this callback is often called even if + * the text didn't change actually. + */ + + /* + * when num-segments changed from 0 to 1 (or more), + * call new-text calllback + */ + if (ccw->ccontrol.notext && nsegs > 0) { + XtCallCallbackList((Widget)ccw, ccw->ccontrol.newtextcallback, + (XtPointer)w); + } + ccw->ccontrol.notext = nsegs == 0; + + (*class->conversionControl_class.TextChange)(widget); +} + +/* ARGSUSED */ +static void +ModeChangeCallback(w, client_data, call_data) +Widget w; +XtPointer client_data; +XtPointer call_data; +{ + Widget widget = (Widget)client_data; + ConversionControlWidget ccw = (ConversionControlWidget)widget; + ConversionControlWidgetClass class = (ConversionControlWidgetClass)widget->core.widget_class; + + ccw->ccontrol.eventused = True; + + (*class->conversionControl_class.ModeChange)(widget); +} + +/* ARGSUSED */ +static void +SelectionControlCallback(w, client_data, call_data) +Widget w; +XtPointer client_data; +XtPointer call_data; +{ + Widget widget = (Widget)client_data; + ConversionControlWidget ccw = (ConversionControlWidget)widget; + ConversionControlWidgetClass class = (ConversionControlWidgetClass)widget->core.widget_class; + ICSelectionControlArg *arg = (ICSelectionControlArg *)call_data; + + ccw->ccontrol.eventused = True; + + (*class->conversionControl_class.SelectionControl)(widget, arg); +} + +/* ARGSUSED */ +static void +AuxControlCallback(w, client_data, call_data) +Widget w; +XtPointer client_data; +XtPointer call_data; +{ + Widget widget = (Widget)client_data; + ConversionControlWidget ccw = (ConversionControlWidget)widget; + ConversionControlWidgetClass class = (ConversionControlWidgetClass)widget->core.widget_class; + ICAuxControlArg *arg = (ICAuxControlArg *)call_data; + + ccw->ccontrol.eventused = True; + + (*class->conversionControl_class.AuxControl)(widget, arg); +} + +static void +WidgetError(w, name, type, msg) +Widget w; +String name; +String type; +String msg; +{ + char buf[512]; + String params[1]; + Cardinal num_params; + + params[0] = XtClass(w)->core_class.class_name; + num_params = 1; + + (void)sprintf(buf, "%%s: %s", msg); + + XtAppErrorMsg(XtWidgetToApplicationContext(w), + name, type, "WidgetError", buf, params, &num_params); +} + +static void +WidgetWarning(w, name, type, msg) +Widget w; +String name; +String type; +String msg; +{ + char buf[512]; + String params[1]; + Cardinal num_params; + + params[0] = XtClass(w)->core_class.class_name; + num_params = 1; + + (void)sprintf(buf, "%%s: %s", msg); + + XtAppWarningMsg(XtWidgetToApplicationContext(w), + name, type, "WidgetError", buf, params, &num_params); +} diff -r 000000000000 -r 92745d501b9a lib/ConvDisp.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/ConvDisp.c Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,538 @@ +#ifndef lint +static char *rcsid = "$Id: ConvDisp.c,v 1.19 1992/08/05 01:51:35 ishisone Rel $"; +#endif +/* + * Copyright (c) 1990 Software Research Associates, Inc. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Software Research Associates not be + * used in advertising or publicity pertaining to distribution of the + * software without specific, written prior permission. Software Research + * Associates makes no representations about the suitability of this software + * for any purpose. It is provided "as is" without express or implied + * warranty. + * + * Author: Makoto Ishisone, Software Research Associates, Inc., Japan + */ + +#include +#include +#include +#include +#include "CachedAtom.h" +#include "ConvDispP.h" + +#define DEBUG_VAR debug_ConvDisplay +#include "DebugPrint.h" + +static XtResource resources[] = { +#define offset(field) XtOffset(ConvDisplayObject, convDisplay.field) + { XtNforeground, XtCForeground, XtRPixel, sizeof (Pixel), + offset(foreground), XtRString, XtDefaultForeground }, + { XtNbackground, XtCBackground, XtRPixel, sizeof (Pixel), + offset(background), XtRString, XtDefaultBackground }, + { XtNcursorBitmap, XtCCursorBitmap, XtRBitmap, sizeof (Pixmap), + offset(cursor), XtRImmediate, None }, + { XtNhotX, XtCHotX, XtRPosition, sizeof (Position), + offset(hotx), XtRString, "3" }, + { XtNhotY, XtCHotY, XtRPosition, sizeof (Position), + offset(hoty), XtRString, "2" }, +#undef offset +}; + +static void ClassInitialize(); +static void ClassPartInitialize(); + +static void Initialize(); +static void Destroy(); +static Boolean SetValues(); + +static Pixmap DefaultCursor(); +static void GetGC(); +static void ComputeBounds(); + +static int StringWidth(); +static int LineHeight(); +static void DrawString(); +static int MaxChar(); +static void DrawCursor(); +static void GetCursorBounds(); +static void SetFonts(); + +ConvDisplayClassRec convDisplayClassRec = { + { /* object fields */ + /* superclass */ (WidgetClass) &objectClassRec, + /* class_name */ "ConvDisplay", + /* widget_size */ sizeof(ConvDisplayRec), + /* class_initialize */ ClassInitialize, + /* class_part_initialize */ ClassPartInitialize, + /* class_inited */ FALSE, + /* initialize */ Initialize, + /* initialize_hook */ NULL, + /* obj1 */ NULL, + /* obj2 */ NULL, + /* obj3 */ 0, + /* resources */ resources, + /* num_resources */ XtNumber(resources), + /* xrm_class */ NULLQUARK, + /* obj4 */ FALSE, + /* obj5 */ FALSE, + /* obj6 */ FALSE, + /* obj7 */ FALSE, + /* destroy */ Destroy, + /* obj8 */ NULL, + /* obj9 */ NULL, + /* set_values */ SetValues, + /* set_values_hook */ NULL, + /* obj10 */ NULL, + /* get_values_hook */ NULL, + /* obj11 */ NULL, + /* version */ XtVersion, + /* callback_private */ NULL, + /* obj12 */ NULL, + /* obj13 */ NULL, + /* obj14 */ NULL, + /* extension */ NULL + }, + { /* convDisplay fields */ + /* StringWidth */ StringWidth, + /* LineHeight */ LineHeight, + /* DrawString */ DrawString, + /* MaxChar */ MaxChar, + /* DrawCursor */ DrawCursor, + /* GetCursorBounds */ GetCursorBounds, + /* SetFonts */ SetFonts, + } +}; + +WidgetClass convDisplayObjectClass = (WidgetClass)&convDisplayClassRec; + +static void +ClassInitialize() +{ + static XtConvertArgRec screenConvertArg[] = { + { XtBaseOffset, (caddr_t) XtOffset(Widget, core.screen), + sizeof(Screen *) } + }; + + /* add string->bitmap converter (for insert-cursor) */ + XtAddConverter("String", "Bitmap", XmuCvtStringToBitmap, + screenConvertArg, XtNumber(screenConvertArg)); +} + +static void +ClassPartInitialize(cl) +WidgetClass cl; +{ + ConvDisplayObjectClass class = (ConvDisplayObjectClass)cl; + ConvDisplayObjectClass super = (ConvDisplayObjectClass)class->object_class.superclass; + ConvDisplayClassPart *classpart = &(class->convDisplay_class); + ConvDisplayClassPart *superpart = &(super->convDisplay_class); + + if (classpart->StringWidth == XtInheritStringWidth) + classpart->StringWidth = superpart->StringWidth; + if (classpart->LineHeight == XtInheritLineHeight) + classpart->LineHeight = superpart->LineHeight; + if (classpart->DrawString == XtInheritDrawString) + classpart->DrawString = superpart->DrawString; + if (classpart->MaxChar == XtInheritMaxChar) + classpart->MaxChar = superpart->MaxChar; + if (classpart->DrawCursor == XtInheritDrawCursor) + classpart->DrawCursor = superpart->DrawCursor; + if (classpart->GetCursorBounds == XtInheritGetCursorBounds) + classpart->GetCursorBounds = superpart->GetCursorBounds; + if (classpart->SetFonts == XtInheritSetFonts) + classpart->SetFonts = superpart->SetFonts; +} + +/* ARGSUSED */ +static void +Initialize(req, new, args, num_args) +Widget req; +Widget new; +ArgList args; +Cardinal *num_args; +{ + ConvDisplayObject obj = (ConvDisplayObject)new; + + if (obj->convDisplay.cursor == None) { + obj->convDisplay.cursor = DefaultCursor(obj); + obj->convDisplay.cursorcreated = True; + } else { + obj->convDisplay.cursorcreated = False; + } + obj->convDisplay.cursorvisible = False; + GetGC(obj); + ComputeBounds(obj); +} + +static void +Destroy(w) +Widget w; +{ + ConvDisplayObject obj = (ConvDisplayObject)w; + + XtReleaseGC(w, obj->convDisplay.cursorgc); + if (obj->convDisplay.cursorcreated == True) { + XFreePixmap(XtDisplayOfObject(w), obj->convDisplay.cursor); + } +} + +/* ARGSUSED */ +static Boolean +SetValues(cur, req, wid, args, num_args) +Widget cur; +Widget req; +Widget wid; +ArgList args; +Cardinal *num_args; +{ + ConvDisplayObject new = (ConvDisplayObject)wid; + ConvDisplayObject old = (ConvDisplayObject)cur; + + if (new->convDisplay.foreground != old->convDisplay.foreground || + new->convDisplay.background != old->convDisplay.background) { + XtReleaseGC(wid, old->convDisplay.cursorgc); + GetGC(new); + } + + if (new->convDisplay.cursor != old->convDisplay.cursor || + new->convDisplay.hotx != old->convDisplay.hotx || + new->convDisplay.hoty != old->convDisplay.hoty) { + if (new->convDisplay.cursor != old->convDisplay.cursor && + old->convDisplay.cursorcreated) { + XFreePixmap(XtDisplayOfObject(wid), old->convDisplay.cursor); + new->convDisplay.cursorcreated = False; + } + ComputeBounds(new); + } + + return False; +} + +static Pixmap +DefaultCursor(obj) +ConvDisplayObject obj; +{ + static char default_bits[] = { 0x0c, 0x0c, 0x1e, 0x3f, 0x33 }; + return XCreateBitmapFromData(XtDisplayOfObject((Widget)obj), + RootWindowOfScreen(XtScreenOfObject((Widget)obj)), + default_bits, + 6, 5); +} + +static void +GetGC(obj) +ConvDisplayObject obj; +{ + XtGCMask mask = GCFunction|GCForeground|GCBackground; + XGCValues values; + + values.function = GXxor; + values.foreground = obj->convDisplay.foreground ^ obj->convDisplay.background; + values.background = 0; + obj->convDisplay.cursorgc = XtGetGC((Widget)obj, mask, &values); +} + +static void +ComputeBounds(obj) +ConvDisplayObject obj; +{ + unsigned int width, height; + Window junkroot; + int junkx, junky; + unsigned int junkbw, junkdepth; + + if (obj->convDisplay.cursor == None || + !XGetGeometry(XtDisplayOfObject((Widget)obj), obj->convDisplay.cursor, + &junkroot, &junkx, &junky, &width, &height, + &junkbw, &junkdepth)) { + obj->convDisplay.cursor = None; + width = height = 0; + } + obj->convDisplay.cursorbounds.width = width; + obj->convDisplay.cursorbounds.height = height; + obj->convDisplay.cursorbounds.x = -obj->convDisplay.hotx; + obj->convDisplay.cursorbounds.y = -obj->convDisplay.hoty; +} + +/* ARGSUSED */ +static int +StringWidth(w, str, start, end) +Widget w; +ICString *str; +int start; +int end; +{ + XtAppError(XtWidgetToApplicationContext(w), + "ConvDisplay Object: StringWidth function isn't defined."); + return 0; /* for lint */ +} + +/* ARGSUSED */ +static int +LineHeight(w, ascentp) +Widget w; +Position *ascentp; +{ + XtAppError(XtWidgetToApplicationContext(w), + "ConvDisplay Object: LineHeight function isn't defined."); + return 0; /* for lint */ +} + +/* ARGSUSED */ +static void +DrawString(w, canvas, str, start, end, x, y) +Widget w; +Widget canvas; +ICString *str; +int start; +int end; +int x; +int y; +{ + XtAppError(XtWidgetToApplicationContext(w), + "ConvDisplay Object: DrawString function isn't defined."); +} + +/* ARGSUSED */ +static int +MaxChar(w, str, start, width) +Widget w; +ICString *str; +int start; +int width; +{ + XtAppError(XtWidgetToApplicationContext(w), + "ConvDisplay Object: MaxChar function isn't defined."); + return 0; /* for lint */ +} + +static void +DrawCursor(w, canvas, x, y, on) +Widget w; +Widget canvas; +int x; +int y; +int on; +{ + ConvDisplayObject obj = (ConvDisplayObject)w; + + if (!XtIsRealized(canvas) || + obj->convDisplay.cursor == None || + (obj->convDisplay.cursorvisible && on) || + (!obj->convDisplay.cursorvisible && !on)) { + obj->convDisplay.cursorvisible = (on != 0); + return; + } + + XCopyPlane(XtDisplay(canvas), + obj->convDisplay.cursor, XtWindow(canvas), + obj->convDisplay.cursorgc, + 0, 0, + obj->convDisplay.cursorbounds.width, + obj->convDisplay.cursorbounds.height, + x + obj->convDisplay.cursorbounds.x, + y + obj->convDisplay.cursorbounds.y, + 1L); + obj->convDisplay.cursorvisible = (on != 0); +} + +static void +GetCursorBounds(w, bounds) +Widget w; +XRectangle *bounds; +{ + ConvDisplayObject obj = (ConvDisplayObject)w; + + bounds->x = obj->convDisplay.cursorbounds.x; + bounds->y = obj->convDisplay.cursorbounds.y; + bounds->width = obj->convDisplay.cursorbounds.width; + bounds->height = obj->convDisplay.cursorbounds.height; +} + +/* ARGSUSED */ +static void +SetFonts(w, fonts, num_fonts) +Widget w; +XFontStruct **fonts; +Cardinal num_fonts; +{ + XtAppError(XtWidgetToApplicationContext(w), + "ConvDisplay Object: SetFonts function isn't defined."); +} + + +/* + * public functions + */ + +int +CDStringWidth(w, str, start, end) +Widget w; +ICString *str; +int start; +int end; +{ + ConvDisplayObjectClass class = (ConvDisplayObjectClass)w->core.widget_class; + + XtCheckSubclass(w, convDisplayObjectClass, "CDStringWidth()"); + return (*class->convDisplay_class.StringWidth)(w, str, start, end); +} + +int +CDLineHeight(w, ascent) +Widget w; +Position *ascent; +{ + ConvDisplayObjectClass class = (ConvDisplayObjectClass)w->core.widget_class; + + XtCheckSubclass(w, convDisplayObjectClass, "CDLineHeight()"); + return (*class->convDisplay_class.LineHeight)(w, ascent); +} + +void +CDDrawString(w, canvas, str, start, end, x, y) +Widget w; +Widget canvas; +ICString *str; +int start; +int end; +int x; +int y; +{ + ConvDisplayObjectClass class = (ConvDisplayObjectClass)w->core.widget_class; + + XtCheckSubclass(w, convDisplayObjectClass, "CDDrawString()"); + (*class->convDisplay_class.DrawString)(w, canvas, str, start, end, x, y); +} + +int +CDMaxChar(w, str, start, width) +Widget w; +ICString *str; +int start; +int width; +{ + ConvDisplayObjectClass class = (ConvDisplayObjectClass)w->core.widget_class; + + XtCheckSubclass(w, convDisplayObjectClass, "CDMaxChar()"); + return (*class->convDisplay_class.MaxChar)(w, str, start, width); +} + +void +CDDrawCursor(w, canvas, x, y, on) +Widget w; +Widget canvas; +int x; +int y; +int on; +{ + ConvDisplayObjectClass class = (ConvDisplayObjectClass)w->core.widget_class; + + XtCheckSubclass(w, convDisplayObjectClass, "CDDrawCursor()"); + (*class->convDisplay_class.DrawCursor)(w, canvas, x, y, on); +} + +void +CDGetCursorBounds(w, bounds) +Widget w; +XRectangle *bounds; +{ + ConvDisplayObjectClass class = (ConvDisplayObjectClass)w->core.widget_class; + + XtCheckSubclass(w, convDisplayObjectClass, "CDGetCursorBounds()"); + (*class->convDisplay_class.GetCursorBounds)(w, bounds); +} + +void +CDSetFonts(w, fonts, num_fonts) +Widget w; +XFontStruct **fonts; +Cardinal num_fonts; +{ + ConvDisplayObjectClass class = (ConvDisplayObjectClass)w->core.widget_class; + + XtCheckSubclass(w, convDisplayObjectClass, "CDSetFonts()"); + (*class->convDisplay_class.SetFonts)(w, fonts, num_fonts); +} + + +void +CDSetBlockCursor(w, shape) +Widget w; +XRectangle *shape; +{ + ConvDisplayObject obj = (ConvDisplayObject)w; + Display *dpy = XtDisplayOfObject((Widget)obj); + Pixmap block; + GC tmpgc; + XGCValues values; + + XtCheckSubclass(w, convDisplayObjectClass, "CDMakeBlockCursor()"); + + block = XCreatePixmap(dpy, + RootWindowOfScreen(XtScreenOfObject((Widget)obj)), + shape->width, shape->height, 1); + + values.function = GXset; + tmpgc = XtGetGC(w, GCFunction, &values); + XFillRectangle(dpy, block, tmpgc, 0, 0, shape->width, shape->height); + XtReleaseGC(w, tmpgc); + + XtVaSetValues(w, + XtNcursorBitmap, block, + XtNhotX, -shape->x, + XtNhotY, -shape->y, + NULL); +} + + +/* + * semi-public function (for subclass use) + */ + +int +_CDPickupFonts(widget, fontspecs, num_specs, fonts, num_fonts) +Widget widget; +FontSpec *fontspecs; +Cardinal num_specs; +XFontStruct **fonts; +Cardinal num_fonts; +{ + Display *dpy = XtDisplayOfObject(widget); + Atom cs_reg = CachedInternAtom(dpy, "CHARSET_REGISTRY", False); + Atom cs_enc = CachedInternAtom(dpy, "CHARSET_ENCODING", False); + Atom atom; + Cardinal i, j; + FontSpec *fsp; + int npick; + + DPRINT(("_CDPickupFonts()\n")); + + /* pickup fonts */ + npick = 0; + for (i = 0, fsp = fontspecs; i < num_specs; i++, fsp++) { + DPRINT(("\tlooking for a font...")); + + fsp->font = NULL; + for (j = 0; j < num_fonts; j++) { + if (fonts[j] != NULL && + XGetFontProperty(fonts[j], cs_reg, (unsigned long *)&atom) && + atom == fsp->registry && + XGetFontProperty(fonts[j], cs_enc, (unsigned long *)&atom) && + atom == fsp->encoding) { + DPRINT((" found")); + fsp->font = fonts[j]; + npick++; + break; + } + } + DPRINT(("\n")); + } + + return npick; +} diff -r 000000000000 -r 92745d501b9a lib/ConvMgr.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/ConvMgr.c Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,356 @@ +#ifndef lint +static char *rcsid = "$Id: ConvMgr.c,v 1.8 1991/10/14 06:40:01 ishisone Rel $"; +#endif +/* + * Copyright (c) 1990 Software Research Associates, Inc. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Software Research Associates not be + * used in advertising or publicity pertaining to distribution of the + * software without specific, written prior permission. Software Research + * Associates makes no representations about the suitability of this software + * for any purpose. It is provided "as is" without express or implied + * warranty. + * + * Author: Makoto Ishisone, Software Research Associates, Inc., Japan + */ + +#include +#include +#include "ConvMgrP.h" +#include "InputConv.h" +#include "ConvCtrl.h" + +static void Initialize(), Destroy(); + +static Screen *getScreen(); +static ConverterRec *newConverter(); +static InputObjRec *getInputObjRec(); +static InputObjRec *newInputObj(); +static Boolean isSomeoneBusy(); + +static CompositeClassExtensionRec CompositeExtension = { + /* next_extension */ NULL, + /* record_type */ NULLQUARK, + /* version */ XtCompositeExtensionVersion, + /* record_size */ sizeof(CompositeClassExtensionRec), + /* accept_objects */ True, +}; + +ConversionManagerClassRec conversionManagerClassRec = { + { /* core fields */ + /* superclass */ (WidgetClass) &compositeClassRec, + /* class_name */ "ConversionManager", + /* widget_size */ sizeof(ConversionManagerRec), + /* class_initialize */ NULL, + /* class_part_initialize */ NULL, + /* class_inited */ FALSE, + /* initialize */ Initialize, + /* initialize_hook */ NULL, + /* realize */ XtInheritRealize, + /* actions */ NULL, + /* num_actions */ 0, + /* resources */ NULL, + /* num_resources */ 0, + /* xrm_class */ NULLQUARK, + /* compress_motion */ TRUE, + /* compress_exposure */ TRUE, + /* compress_enterleave */ TRUE, + /* visible_interest */ FALSE, + /* destroy */ Destroy, + /* resize */ NULL, + /* expose */ NULL, + /* set_values */ NULL, + /* set_values_hook */ NULL, + /* set_values_almost */ XtInheritSetValuesAlmost, + /* get_values_hook */ NULL, + /* accept_focus */ NULL, + /* version */ XtVersion, + /* callback_private */ NULL, + /* tm_table */ NULL, + /* query_geometry */ XtInheritQueryGeometry, + /* display_accelerator */ XtInheritDisplayAccelerator, + /* extension */ NULL + }, + { /* composite fields */ + /* geometry_manager */ NULL, + /* change_managed */ NULL, + /* insert_child */ XtInheritInsertChild, + /* delete_child */ XtInheritDeleteChild, + /* extension */ (XtPointer)&CompositeExtension, + }, + { /* conversionmanager fields */ + /* empty */ 0 + } +}; + +WidgetClass conversionManagerWidgetClass = (WidgetClass)&conversionManagerClassRec; + +/* ARGSUSED */ +static void +Initialize(req, new, args, num_args) +Widget req; +Widget new; +ArgList args; +Cardinal *num_args; +{ + ConversionManagerWidget cmw = (ConversionManagerWidget)new; + + cmw->convmgr.converterlist = NULL; + cmw->convmgr.inputobjlist = NULL; +} + +static void +Destroy(w) +Widget w; +{ + ConversionManagerWidget cmw = (ConversionManagerWidget)w; + ConverterRec *clist = cmw->convmgr.converterlist; + ConverterRec *crp; + InputObjRec *ilist = cmw->convmgr.inputobjlist; + InputObjRec *iorp; + + while (clist != NULL) { + crp = clist->next; + XtFree((char *)clist); + clist = crp; + } + while (ilist != NULL) { + if (ilist->inputobj != NULL) XtDestroyWidget(ilist->inputobj); + iorp = ilist->next; + XtFree((char *)ilist); + ilist = iorp; + } +} + +static Screen * +getScreen(dpy, win) +Display *dpy; +Window win; +{ + Window root; + int reqx, reqy; + unsigned int reqwidth, reqheight, reqborder, junk; + int i; + + /* get root window */ + XGetGeometry(dpy, win, &root, &reqx, &reqy, + &reqwidth, &reqheight, &reqborder, &junk); + + /* get screen of the root window */ + for (i = 0; i < ScreenCount(dpy); i++) { + if (root == RootWindow(dpy, i)) return ScreenOfDisplay(dpy, i); + } + + return NULL; +} + +static ConverterRec * +newConverter(cmw, screen, converterclass, inputobjclass, displayobjclass) +ConversionManagerWidget cmw; +Screen *screen; +WidgetClass converterclass; +WidgetClass inputobjclass; +WidgetClass displayobjclass; +{ + Arg args[5]; + int i; + ConverterRec *crp; + InputObjRec *iorp; + + crp = XtNew(ConverterRec); + crp->busy = False; + crp->converterclass = converterclass; + crp->inputobjclass = inputobjclass; + crp->displayobjclass = displayobjclass; + crp->screen = screen; + + if ((iorp = getInputObjRec(cmw, inputobjclass)) == NULL) { + iorp = newInputObj(cmw, inputobjclass, displayobjclass); + } + + i = 0; + if (screen != XtScreen((Widget)cmw)) { + XtSetArg(args[i], XtNscreen, screen); i++; + XtSetArg(args[i], XtNdepth, DefaultDepthOfScreen(screen)); i++; + XtSetArg(args[i], XtNcolormap, DefaultColormapOfScreen(screen)); i++; + } + if (iorp->inputobj != NULL) { + XtSetArg(args[i], XtNinputObject, iorp->inputobj); i++; + } else { + XtSetArg(args[i], XtNinputObjectClass, inputobjclass); i++; + } + XtSetArg(args[i], XtNdisplayObjectClass, displayobjclass); i++; + + crp->converter = XtCreatePopupShell("converter", converterclass, + (Widget)cmw, args, i); + + /* insert it to the list */ + crp->next = cmw->convmgr.converterlist; + cmw->convmgr.converterlist = crp; + + return crp; +} + +static InputObjRec * +getInputObjRec(cmw, objclass) +ConversionManagerWidget cmw; +WidgetClass objclass; +{ + InputObjRec *iorp = cmw->convmgr.inputobjlist; + + while (iorp != NULL) { + if (iorp->inputobjclass == objclass) return iorp; + iorp = iorp->next; + } + return NULL; +} + +static InputObjRec * +newInputObj(cmw, objclass, dispobjclass) +ConversionManagerWidget cmw; +WidgetClass objclass; +WidgetClass dispobjclass; +{ + InputObjRec *iorp; + + iorp = XtNew(InputObjRec); + iorp->inputobjclass = objclass; + if (!ICSupportMultipleObjects(objclass)) { + Arg args[1]; + + XtSetArg(args[0], XtNdisplayObjectClass, dispobjclass); + iorp->inputobj = XtCreateWidget("convObject", objclass, + (Widget)cmw, args, 1); + } else { + iorp->inputobj = NULL; + } + + iorp->next = cmw->convmgr.inputobjlist; + cmw->convmgr.inputobjlist = iorp; + return iorp; +} + +static Boolean +isSomeoneBusy(clist, objclass) +ConverterRec *clist; +WidgetClass objclass; +{ + while (clist != NULL) { + if (clist->inputobjclass == objclass && clist->busy) return True; + clist = clist->next; + } + return False; +} + + +/* + * public functions + */ + +void +CMPrepareConverter(w, screen, converterclass, inputobjclass, displayobjclass) +Widget w; +Screen *screen; +WidgetClass converterclass; +WidgetClass inputobjclass; +WidgetClass displayobjclass; +{ + XtCheckSubclass(w, conversionManagerWidgetClass, "CMPrepareConverter()"); + (void)newConverter((ConversionManagerWidget)w, screen, + converterclass, inputobjclass, displayobjclass); +} + +Widget +CMGetConverter(w, client, converterclass, inputobjclass, displayobjclass) +Widget w; +Window client; +WidgetClass converterclass; +WidgetClass inputobjclass; +WidgetClass displayobjclass; +{ + ConversionManagerWidget cmw = (ConversionManagerWidget)w; + ConverterRec *clist = cmw->convmgr.converterlist; + ConverterRec *crp; + InputObjRec *iorp; + Screen *scr; + + XtCheckSubclass(w, conversionManagerWidgetClass, "CMGetConverter()"); + + if ((iorp = getInputObjRec(cmw, inputobjclass)) == NULL) { + iorp = newInputObj(cmw, inputobjclass, displayobjclass); + } else if (iorp->inputobj != NULL && isSomeoneBusy(clist, inputobjclass)) { + return NULL; + } + + if ((scr = getScreen(XtDisplay(w), client)) == NULL) { + String params[1]; + Cardinal num_params; + + params[0] = XtClass(w)->core_class.class_name; + num_params = 1; + XtAppWarningMsg(XtWidgetToApplicationContext(w), + "parameterError", "cannotGetScreen", "WidgetError", + "%s: CMGetConverter() cannot get screen of specified client window", + params, &num_params); + return NULL; + } + + while (clist != NULL) { + if (!clist->busy && + clist->screen == scr && + clist->converterclass == converterclass && + clist->inputobjclass == inputobjclass && + clist->displayobjclass == displayobjclass) { + /* found */ + clist->busy = True; + return clist->converter; + } + clist = clist->next; + } + + crp = newConverter(cmw, scr, converterclass, + inputobjclass, displayobjclass); + crp->busy = True; + return crp->converter; +} + +void +CMReleaseConverter(w, converter) +Widget w; +Widget converter; +{ + ConversionManagerWidget cmw = (ConversionManagerWidget)w; + ConverterRec *clist = cmw->convmgr.converterlist; + String params[1]; + Cardinal num_params; + + XtCheckSubclass(w, conversionManagerWidgetClass, "CMReleaseConverter()"); + + while (clist != NULL) { + if (clist->converter == converter) { + if (!clist->busy) { + params[0] = XtClass(w)->core_class.class_name; + num_params = 1; + XtAppWarningMsg(XtWidgetToApplicationContext(w), + "parameterError", "converterNotBusy", + "WidgetError", + "%s: CMReleaseConverter() converter isn't used", + params, &num_params); + } + clist->busy = False; + return; + } + clist = clist->next; + } + + params[0] = XtClass(w)->core_class.class_name; + num_params = 1; + XtAppWarningMsg(XtWidgetToApplicationContext(w), + "parameterError", "noSuchConverter", "WidgetError", + "%s: CMReleaseConverter() no such converter", + params, &num_params); +} diff -r 000000000000 -r 92745d501b9a lib/ICLabel.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/ICLabel.c Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,365 @@ +#ifndef lint +static char *rcsid = "$Id: ICLabel.c,v 1.11 1991/09/23 04:01:20 ishisone Rel $"; +#endif +/* + * Copyright (c) 1990 Software Research Associates, Inc. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Software Research Associates not be + * used in advertising or publicity pertaining to distribution of the + * software without specific, written prior permission. Software Research + * Associates makes no representations about the suitability of this software + * for any purpose. It is provided "as is" without express or implied + * warranty. + * + * Author: Makoto Ishisone, Software Research Associates, Inc., Japan + */ + +#include +#include +#include +#if XtSpecificationRelease > 4 +#include +#endif +#include "ICLabelP.h" +#include "ConvDisp.h" + +static XtResource resources[] = { +#define offset(field) XtOffset(ICLabelWidget, iclabel.field) + { XtNhorizontalSpacing, XtCSpacing, XtRDimension, sizeof(Dimension), + offset(hspace), XtRString, "1" }, + { XtNverticalSpacing, XtCSpacing, XtRDimension, sizeof(Dimension), + offset(vspace), XtRString, "1" }, + { XtNlabel, XtCLabel, XtRPointer, sizeof(ICString*), + offset(label), XtRImmediate, NULL }, + { XtNjustify, XtCJustify, XtRJustify, sizeof(XtJustify), + offset(justify), XtRImmediate, (XtPointer)XtJustifyCenter }, + { XtNcursor, XtCCursor, XtRCursor, sizeof(Cursor), + offset(cursor), XtRImmediate, (XtPointer)None }, +#undef offset +}; + +static void ClassInitialize(); +static void Initialize(), Destroy(); +static void Realize(); +static void Redisplay(); +static Boolean SetValues(); +static XtGeometryResult QueryGeometry(); +static void InsertChild(); + +static void computeSize(); +static ICString *copyString(); +static void freeString(); + +static CompositeClassExtensionRec CompositeExtension = { + /* next_extension */ NULL, + /* record_type */ NULLQUARK, + /* version */ XtCompositeExtensionVersion, + /* record_size */ sizeof(CompositeClassExtensionRec), + /* accept_objects */ True, +}; + +ICLabelClassRec icLabelClassRec = { + { /* core fields */ + /* superclass */ (WidgetClass) &compositeClassRec, + /* class_name */ "ICLabel", + /* widget_size */ sizeof(ICLabelRec), + /* class_initialize */ ClassInitialize, + /* class_part_initialize */ NULL, + /* class_inited */ FALSE, + /* initialize */ Initialize, + /* initialize_hook */ NULL, + /* realize */ Realize, + /* actions */ NULL, + /* num_actions */ 0, + /* resources */ resources, + /* num_resources */ XtNumber(resources), + /* xrm_class */ NULLQUARK, + /* compress_motion */ TRUE, + /* compress_exposure */ TRUE, + /* compress_enterleave */ TRUE, + /* visible_interest */ FALSE, + /* destroy */ Destroy, + /* resize */ NULL, + /* expose */ Redisplay, + /* set_values */ SetValues, + /* set_values_hook */ NULL, + /* set_values_almost */ XtInheritSetValuesAlmost, + /* get_values_hook */ NULL, + /* accept_focus */ NULL, + /* version */ XtVersion, + /* callback_private */ NULL, + /* tm_table */ NULL, + /* query_geometry */ QueryGeometry, + /* display_accelerator */ XtInheritDisplayAccelerator, + /* extension */ NULL + }, + { /* composite fields */ + /* geometry_manager */ NULL, + /* change_managed */ NULL, + /* insert_child */ InsertChild, + /* delete_child */ XtInheritDeleteChild, + /* extension */ (XtPointer)&CompositeExtension, + }, + { /* iclabel fields */ + /* empty */ 0 + } +}; + +WidgetClass icLabelWidgetClass = (WidgetClass)&icLabelClassRec; + +static void +ClassInitialize() +{ + XtAddConverter(XtRString, XtRJustify, XmuCvtStringToJustify, NULL, 0); +} + +/* ARGSUSED */ +static void +Initialize(req, new, args, num_args) +Widget req; +Widget new; +ArgList args; +Cardinal *num_args; +{ + ICLabelWidget iclw = (ICLabelWidget)new; + + if (iclw->iclabel.label != NULL) { + iclw->iclabel.label = copyString(iclw->iclabel.label); + } + iclw->iclabel.width = 0; +} + +static void +Destroy(w) +Widget w; +{ + ICLabelWidget iclw = (ICLabelWidget)w; + + if (iclw->iclabel.label != NULL) freeString(iclw->iclabel.label); +} + +static void +Realize(w, maskp, attr) +Widget w; +XtValueMask *maskp; +XSetWindowAttributes *attr; +{ + ICLabelWidget iclw = (ICLabelWidget)w; + + if (iclw->iclabel.cursor != None) { + *maskp |= CWCursor; + attr->cursor = iclw->iclabel.cursor; + } + (*icLabelWidgetClass->core_class.superclass->core_class.realize)(w, maskp, attr); +} + +/* ARGSUSED */ +static void +Redisplay(w, ev, region) +Widget w; +XEvent *ev; +Region region; +{ + ICLabelWidget iclw = (ICLabelWidget)w; + Widget dispobj = iclw->iclabel.displayobj; + int x, y; + + if (iclw->iclabel.label == NULL || iclw->iclabel.displayobj == NULL) return; + + switch (iclw->iclabel.justify) { + case XtJustifyLeft: + x = iclw->iclabel.hspace; + break; + case XtJustifyRight: + x = iclw->core.width - (iclw->iclabel.vspace + iclw->iclabel.width); + break; + case XtJustifyCenter: + default: + x = (iclw->core.width - iclw->iclabel.width) / 2; + break; + } + y = (iclw->core.height - iclw->iclabel.fontheight) / 2; + + CDDrawString(dispobj, w, iclw->iclabel.label, 0, -1, x, y); +} + +/* ARGSUSED */ +static Boolean +SetValues(cur, req, wid, args, num_args) +Widget cur; +Widget req; +Widget wid; +ArgList args; +Cardinal *num_args; +{ + ICLabelWidget old = (ICLabelWidget)cur; + ICLabelWidget new = (ICLabelWidget)wid; + Boolean widthspecified = False; + Boolean heightspecified = False; + Boolean redisplay = False; + Boolean label_changed = False; + int i; + + for (i = 0; i < *num_args; i++) { + if (!strcmp(args->name, XtNwidth)) widthspecified = True; + else if (!strcmp(args->name, XtNheight)) heightspecified = True; + } + + if (new->iclabel.label != old->iclabel.label) { + /* compute maximum pixel width of the list items */ + if (old->iclabel.label != NULL) freeString(old->iclabel.label); + if (new->iclabel.label != NULL) { + new->iclabel.label = copyString(new->iclabel.label); + if (new->iclabel.displayobj != NULL) { + new->iclabel.width = CDStringWidth(new->iclabel.displayobj, + new->iclabel.label, 0, -1); + } + } else { + new->iclabel.width = 0; + } + label_changed = True; + redisplay = True; + } + + if (new->iclabel.hspace != old->iclabel.hspace || + new->iclabel.vspace != old->iclabel.vspace || + label_changed) { + computeSize(new, widthspecified, heightspecified); + redisplay = True; + } else if (new->iclabel.justify != old->iclabel.justify) { + redisplay = True; + } + + if (new->iclabel.cursor != old->iclabel.cursor && XtIsRealized(wid)) { + XDefineCursor(XtDisplay(wid), XtWindow(wid), new->iclabel.cursor); + } + + return redisplay; +} + +static XtGeometryResult +QueryGeometry(w, req, ret) +Widget w; +XtWidgetGeometry *req; +XtWidgetGeometry *ret; +{ + ICLabelWidget iclw = (ICLabelWidget)w; + + ret->request_mode = CWWidth | CWHeight; + + ret->width = iclw->iclabel.width + iclw->iclabel.hspace * 2; + ret->height = iclw->iclabel.fontheight + iclw->iclabel.vspace * 2; + + if ((!(req->request_mode & CWWidth) || ret->width == req->width) && + (!(req->request_mode & CWHeight) || ret->height == req->height)) { + return XtGeometryYes; + } else if (ret->width == iclw->core.width && + ret->height == iclw->core.height) { + return XtGeometryNo; + } + return XtGeometryAlmost; +} + +static void +InsertChild(w) +Widget w; +{ + ICLabelWidget iclw = (ICLabelWidget)XtParent(w); + CompositeWidgetClass super = (CompositeWidgetClass)XtClass(iclw)->core_class.superclass; + String params[1]; + Cardinal num_params; + + if (!XtIsSubclass(w, convDisplayObjectClass)) { + params[0] = XtClass(iclw)->core_class.class_name; + num_params = 1; + XtAppErrorMsg(XtWidgetToApplicationContext(w), + "childError", "class", "WidgetError", + "%s: child must be subclass of ConvDisplayObject", + params, &num_params); + } + if (iclw->composite.num_children != 0) { + params[0] = XtClass(iclw)->core_class.class_name; + num_params = 1; + XtAppErrorMsg(XtWidgetToApplicationContext(w), + "childError", "number", "WidgetError", + "%s: can only take one child", + params, &num_params); + } + + (*super->composite_class.insert_child)(w); + + iclw->iclabel.displayobj = w; + iclw->iclabel.fontheight = CDLineHeight(w, (Position *)NULL); + + if (iclw->iclabel.label != NULL) { + iclw->iclabel.width = CDStringWidth(iclw->iclabel.displayobj, + iclw->iclabel.label, 0, -1); + } + computeSize(iclw, iclw->core.width != 0, iclw->core.height != 0); +} + +static void +computeSize(iclw, fixwidth, fixheight) +ICLabelWidget iclw; +Boolean fixwidth; +Boolean fixheight; +{ + if (!fixwidth) { + iclw->core.width = iclw->iclabel.width + iclw->iclabel.hspace * 2; + } + if (!fixheight) { + iclw->core.height = iclw->iclabel.fontheight + iclw->iclabel.vspace * 2; + } +} + +static ICString * +copyString(from) +ICString *from; +{ + ICString *to = XtNew(ICString); + + to->nbytes = from->nbytes; + to->nchars = from->nchars; + to->attr = from->attr; + to->data = XtMalloc(from->nbytes); + (void)bcopy(from->data, to->data, from->nbytes); + return to; +} + +static void +freeString(s) +ICString *s; +{ + XtFree(s->data); + XtFree((char *)s); +} + + +/* + * public function + */ + +void +ICLRecomputeSize(w) +Widget w; +{ + ICLabelWidget iclw = (ICLabelWidget)w; + Dimension width, height; + + if (iclw->iclabel.displayobj != NULL) { + iclw->iclabel.fontheight = CDLineHeight(iclw->iclabel.displayobj, + (Position *)NULL); + if (iclw->iclabel.label != NULL) { + iclw->iclabel.width = CDStringWidth(iclw->iclabel.displayobj, + iclw->iclabel.label, 0, -1); + } + width = iclw->iclabel.width + iclw->iclabel.hspace * 2; + height = iclw->iclabel.fontheight + iclw->iclabel.vspace * 2; + XtMakeResizeRequest(w, width, height, + (Dimension *)NULL, (Dimension *)NULL); + } /* else do nothing */ +} diff -r 000000000000 -r 92745d501b9a lib/IMProto.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/IMProto.c Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,1022 @@ +#ifndef lint +static char *rcsid = "$Id: IMProto.c,v 1.20 1999/04/12 08:52:23 ishisone Exp $"; +#endif +/*- + * Copyright (c) 1991, 1994 Software Research Associates, Inc. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Software Research Associates not be + * used in advertising or publicity pertaining to distribution of the + * software without specific, written prior permission. Software Research + * Associates makes no representations about the suitability of this software + * for any purpose. It is provided "as is" without express or implied + * warranty. + * + * Author: Makoto Ishisone, Software Research Associates, Inc., Japan + */ + +/* + * X Input Method Protocol handler is considered to be still in + * beta testing phase. Current version has the following + * restrictions. + * - it does not support on-demand-synchronous method. + * - it does not support front-end model. + * - it does not SetIMValues operation. + * - it supports only X, local and TCP transports. + * Also, there might be various bugs. + */ + +#define DEBUG_VAR debug_IMProtocol + +#include +#include +#include +#include +#include +#include +#include +#include "IMProtoP.h" +#include "ParseKey.h" +#include "InputConv.h" +#include "im.h" + + +#define SERVER_NAME "kinput2" +#define UNIX_SOCKET_DIR "/tmp/.ki2-unix" + +/*- resource table -*/ +static XtResource resources[] = { +#define offset(field) XtOffset(IMProtocolWidget, imp.field) + { XtNserverName, XtCServerName, XtRString, sizeof(String), + offset(server_name), XtRString, (XtPointer)SERVER_NAME }, + { XtNlanguage, XtCLanguage, XtRString, sizeof(String), + offset(language), XtRImmediate, (XtPointer)NULL }, + { XtNlocales, XtCLocales, XtRString, sizeof(String), + offset(locales), XtRImmediate, (XtPointer)NULL }, + { XtNinputObjectClass, XtCClass, XtRPointer, sizeof(WidgetClass), + offset(input_object_class), XtRImmediate, (XtPointer)NULL }, + { XtNdisplayObjectClass, XtCClass, XtRPointer, sizeof(WidgetClass), + offset(display_object_class), XtRImmediate, (XtPointer)NULL }, + { XtNdefaultFontList, XtCFontList, XtRString, sizeof(String), + offset(default_fontlist), XtRImmediate, (XtPointer)NULL }, + { XtNconversionStartKeys, XtCConversionStartKeys, XtRString, sizeof(String), + offset(conversion_start_keys), XtRImmediate, (XtPointer)NULL }, + { XtNforeground, XtCForeground, XtRPixel, sizeof (Pixel), + offset(foreground), XtRString, XtDefaultForeground }, + { XtNstatusWidth, XtCStatusWidth, XtRDimension, sizeof(Dimension), + offset(status_width), XtRImmediate, (XtPointer)0 }, + { XtNtransports, XtCTransports, XtRString, sizeof(String), + offset(transport_list), XtRString, (XtPointer)"tcp,unix,x" }, +#undef offset +}; + +static void Initialize _Pt_((Widget req, Widget new, + ArgList args, Cardinal *num_args)); +static void Destroy _Pt_((Widget w)); +static void Realize _Pt_((Widget w, XtValueMask *mask, + XSetWindowAttributes *value)); + +/*- IMProtocolClassRec -*/ +IMProtocolClassRec imProtocolClassRec = { + { /* core fields */ + /* superclass */ (WidgetClass) &widgetClassRec, + /* class_name */ "IMProtocol", + /* widget_size */ sizeof(IMProtocolRec), + /* class_initialize */ NULL, + /* class_part_initialize */ NULL, + /* class_inited */ FALSE, + /* initialize */ Initialize, + /* initialize_hook */ NULL, + /* realize */ Realize, + /* actions */ NULL, + /* num_actions */ 0, + /* resources */ resources, + /* num_resources */ XtNumber(resources), + /* xrm_class */ NULLQUARK, + /* compress_motion */ TRUE, + /* compress_exposure */ TRUE, + /* compress_enterleave */ TRUE, + /* visible_interest */ FALSE, + /* destroy */ Destroy, + /* resize */ NULL, + /* expose */ NULL, + /* set_values */ NULL, + /* set_values_hook */ NULL, + /* set_values_almost */ XtInheritSetValuesAlmost, + /* get_values_hook */ NULL, + /* accept_focus */ NULL, + /* version */ XtVersion, + /* callback_private */ NULL, + /* tm_table */ NULL, + /* query_geometry */ XtInheritQueryGeometry, + /* display_accelerator */ XtInheritDisplayAccelerator, + /* extension */ NULL + }, + { /* imProtocol fields */ + /* dummy */ 0 + } +}; + +WidgetClass imProtocolWidgetClass = (WidgetClass)&imProtocolClassRec; + +static void getAtoms _Pt_((IMProtocolWidget ipw)); +static void setProperty _Pt_((IMProtocolWidget ipw)); +static int ownSelection _Pt_((IMProtocolWidget ipw)); +static Boolean convertSelection _Pt_((Widget w, Atom *selectionp, + Atom *targetp, Atom *typep, + XtPointer *valuep, + unsigned long *lengthp, int *formatp)); +static void loseSelection _Pt_((Widget w, Atom *selectionp)); +#ifdef IM_TCP_TRANSPORT +static void acceptTCPService _Pt_((XtPointer client_data, + int *sourcep, XtInputId *idp)); +#endif +#ifdef IM_UNIX_TRANSPORT +static void acceptUnixService _Pt_((XtPointer client_data, + int *sourcep, XtInputId *idp)); +#endif +#ifdef IM_X_TRANSPORT +static void acceptXService _Pt_((Widget w, XtPointer client_data, + XEvent *event, Boolean *continuep)); +#endif +static void initializeError _Pt_((Widget w, String resname)); +static char *compactList _Pt_((char *s)); +static void setTransport _Pt_((Widget w)); +static int makeConverter _Pt_((Widget w)); +static void getTriggerKeys _Pt_((Widget w)); +static void ioeCallback _Pt_((XPointer cldata)); + + +/* + *+ Core class methods + */ + +/*- Initialize: intern Atoms, get default fonts, etc. -*/ +/* ARGSUSED */ +static void +Initialize(req, new, args, num_args) +Widget req; +Widget new; +ArgList args; +Cardinal *num_args; +{ + IMProtocolWidget ipw = (IMProtocolWidget)new; + + TRACE(("IMProtocolWidget:Initialize()\n")); + + /* + * Check resources which must be specified at the initialization. + */ +#define NULLorEMPTY(p) ((p) == NULL || (p)[0] == '\0') + if (NULLorEMPTY(ipw->imp.server_name)) { + initializeError(new, XtNserverName); + } + + ipw->imp.server_name = XtNewString(ipw->imp.server_name); + + if (NULLorEMPTY(ipw->imp.language)) { + initializeError(new, XtNlanguage); + } else if (NULLorEMPTY(ipw->imp.locales)) { + initializeError(new, XtNlocales); + } else if (ipw->imp.input_object_class == NULL) { + initializeError(new, XtNinputObjectClass); + } else if (ipw->imp.display_object_class == NULL) { + initializeError(new, XtNdisplayObjectClass); + } + ipw->imp.locales = compactList(XtNewString(ipw->imp.locales)); +#undef NULLorEMPTY + + /* + * Initialize converter info. + */ + if (makeConverter(new) < 0) { + /* + * locales is empty. + */ + String params[1]; + Cardinal num_params; + + params[0] = XtClass(new)->core_class.class_name; + num_params = 1; + XtAppErrorMsg(XtWidgetToApplicationContext(new), + "initializeError", "invalidValue", "WidgetError", + "%s: locale list is empty", + params, &num_params); + } + + /* + * Create font bank (a bank of cached fonts) and enter + * default fonts. + */ + ipw->imp.font_bank = FontBankCreate(XtDisplay(new), ipw->imp.language); + if (ipw->imp.font_bank == NULL) { + /* + * The specified language is not supported. + */ + String params[2]; + Cardinal num_params; + + params[0] = XtClass(new)->core_class.class_name; + params[1] = ipw->imp.language; + num_params = 2; + XtAppErrorMsg(XtWidgetToApplicationContext(new), + "initializeError", "invalidValue", "WidgetError", + "%s: language %s not supported", + params, &num_params); + } + + if (ipw->imp.default_fontlist != NULL) { + ipw->imp.default_fontlist = XtNewString(ipw->imp.default_fontlist); + + DDPRINT(2, ("cache default fonts: %s\n", ipw->imp.default_fontlist)); + ipw->imp.default_fonts = FontBankGet(ipw->imp.font_bank, + ipw->imp.default_fontlist, + &ipw->imp.num_default_fonts); + } else { + ipw->imp.default_fonts = NULL; + ipw->imp.num_default_fonts = 0; + } + + /* + * Initialize private data. + */ + ipw->imp.connection_list = NULL; + ipw->imp.no_more_connections = False; + ipw->imp.scheduler_queue = NULL; + setTransport(new); + getTriggerKeys(new); + IMInitHash(new); + getAtoms(ipw); + + /* + * Initialilze transport layer. + */ + /* 1. TCP/IP */ + ipw->imp.tcp_sock = -1; +#ifdef IM_TCP_TRANSPORT + if (ipw->imp.use_tcp_transport) { + ipw->imp.tcp_port = 0; /* let the system choose the port number */ + ipw->imp.tcp_sock = IMCreateTCPService(&ipw->imp.tcp_port); + } + if (ipw->imp.tcp_sock >= 0) { + TRACE(("call XtAppAddInput for tcp socket(%d)\n", ipw->imp.tcp_sock)); + ipw->imp.tcp_id = XtAppAddInput(XtWidgetToApplicationContext(new), + ipw->imp.tcp_sock, + (XtPointer)XtInputReadMask, + acceptTCPService, (XtPointer)ipw); + } +#endif /* IM_TCP_TRANSPORT */ + + /* 2. UNIX domain */ + ipw->imp.unix_sock = -1; +#ifdef IM_UNIX_TRANSPORT + if (ipw->imp.use_unix_transport) { + char path[1024]; + char *p; + + /* + * The unix domain socket pathname has the following form: + * /- + */ + (void)mkdir(UNIX_SOCKET_DIR, 0777); +#ifdef S_IFLNK + { + /* + * This system has symbolic links. Make sure UNIX_SOCKET_DIR + * is not a symbolic link but a directory before calling + * chmod(). + */ + struct stat st; + if (lstat(UNIX_SOCKET_DIR, &st) == 0 && + (st.st_mode & S_IFMT) == S_IFDIR) { + (void)chmod(UNIX_SOCKET_DIR, 0777); + } + } +#else + (void)chmod(UNIX_SOCKET_DIR, 0777); +#endif + (void)sprintf(path, "%s/%s", UNIX_SOCKET_DIR, + DisplayString(XtDisplay(new))); + /* + * Omit screen number and the preceding period. + */ + for (p = path + strlen(path) - 1; p > path && *p != ':'; p--) { + if (*p == '.') { + *p = '\0'; + break; + } + } + /* + * Append language part. + */ + (void)strcat(path, "-"); + (void)strcat(path, ipw->imp.language); + /* + * Change every ':' in the path name to '_', since ':' is not + * included in POSIX Portable Filename Character Set. + */ + for (p = path; *p != '\0'; p++) { + if (*p == ':') *p = '_'; + } + ipw->imp.unix_path = XtNewString(path); + ipw->imp.unix_sock = IMCreateUnixService(ipw->imp.unix_path); + } + if (ipw->imp.unix_sock >= 0) { + TRACE(("call XtAppAddInput for unix socket(%d)\n", ipw->imp.unix_sock)); + ipw->imp.unix_id = XtAppAddInput(XtWidgetToApplicationContext(new), + ipw->imp.unix_sock, + (XtPointer)XtInputReadMask, + acceptUnixService, (XtPointer)ipw); + ipw->imp.ioe_handle = XIOESet(ioeCallback, (XPointer)ipw); + } +#endif /* IM_UNIX_TRANSPORT */ + +#ifdef IM_X_TRANSPORT + if (ipw->imp.use_x_transport) { + TRACE(("call XtAddEventHandler for X transport\n")); + XtAddEventHandler(new, NoEventMask, True, acceptXService, + (XtPointer)NULL); + } +#endif /* IM_X_TRANSPORT */ + + /* + * Compile request dispatching table. + */ + IMCompileReq(); +} + +/*- Destroy: free allocated memory -*/ +static void +Destroy(w) +Widget w; +{ + IMProtocolWidget ipw = (IMProtocolWidget)w; + IMConnection *conn; + int i; + + TRACE(("IMProtocolWidget:Destroy()\n")); + + XtFree(ipw->imp.server_name); + XtFree(ipw->imp.locales); + if (ipw->imp.default_fontlist != NULL) XtFree(ipw->imp.default_fontlist); + if (ipw->imp.trigger_keys != NULL) XtFree((char *)ipw->imp.trigger_keys); + + for (i = 0; i < ipw->imp.converter.num_locales; i++) { + XtFree(ipw->imp.converter.supported_locales[i]); + } + XtFree((char *)ipw->imp.converter.supported_locales); + + /* + * Close down all connections. + */ + conn = ipw->imp.connection_list; + while (conn != NULL) { + IMConnection *next = conn->next; + + IMCloseConnection(conn); + conn = next; + } + + /* + * Close down TCP/Unix service sockets. + */ + if (ipw->imp.tcp_sock >= 0) { + XtRemoveInput(ipw->imp.tcp_id); + (void)close(ipw->imp.tcp_sock); + } + if (ipw->imp.unix_sock >= 0) { + XIOEUnset(ipw->imp.ioe_handle); + (void)unlink(ipw->imp.unix_path); + XtRemoveInput(ipw->imp.unix_id); + (void)close(ipw->imp.unix_sock); + XtFree(ipw->imp.unix_path); + } + + /* + * Unload default fonts. + */ + if (ipw->imp.num_default_fonts > 0) { + FontBankFreeFonts(ipw->imp.font_bank, + ipw->imp.default_fonts, + ipw->imp.num_default_fonts); + } + + /* + * Free font bank. + */ + FontBankDestroy(ipw->imp.font_bank); +} + +/*- Realize: own selection -*/ +static void +Realize(w, mask, value) +Widget w; +XtValueMask *mask; +XSetWindowAttributes *value; +{ + IMProtocolWidget ipw = (IMProtocolWidget)w; + CoreWidgetClass super = (CoreWidgetClass)XtClass(w)->core_class.superclass; + + TRACE(("IMProtocolWidget:Realize()\n")); + + (*super->core_class.realize)(w, mask, value); + + if (ownSelection(ipw) < 0) { + String params[1]; + Cardinal num_params; + + params[0] = XtClass(w)->core_class.class_name; + num_params = 1; + XtAppWarningMsg(XtWidgetToApplicationContext(w), + "selectionError", "ownSelection", "WidgetError", + "%s: can't own selection", params, &num_params); + + XtDestroyWidget(w); + } + + setProperty(ipw); +} + +/* + *+ Atom, property and selection handling + */ + +/*- getAtoms: intern atoms -*/ +static void +getAtoms(ipw) +IMProtocolWidget ipw; +{ + Display *dpy = XtDisplay((Widget)ipw); + char buf[256]; + + TRACE(("IMProtocolWidget:getAtoms()\n")); + + (void)strcpy(buf, "@server="); + (void)strcat(buf, ipw->imp.server_name); +#define MAKEATOM(s) XInternAtom(dpy, s, False) + ipw->imp.server_atom = MAKEATOM(buf); + ipw->imp.ctext_atom = MAKEATOM("COMPOUND_TEXT"); + ipw->imp.locales_atom = MAKEATOM("LOCALES"); + ipw->imp.transport_atom = MAKEATOM("TRANSPORT"); + ipw->imp.ki2comm_atom = MAKEATOM("_KINPUT2_COMM"); + ipw->imp.xim_xconnect = MAKEATOM("_XIM_XCONNECT"); + ipw->imp.xim_protocol = MAKEATOM("_XIM_PROTOCOL"); + ipw->imp.xim_moredata = MAKEATOM("_XIM_MOREDATA"); +#undef MAKEATOM +} + +/*- setProperty: set XIM_SERVERS property -*/ +static void +setProperty(ipw) +IMProtocolWidget ipw; +{ + Display *dpy = XtDisplay((Widget)ipw); + Atom xim_servers = XInternAtom(dpy, "XIM_SERVERS", False); + Atom server_atom = ipw->imp.server_atom; + Window root0 = RootWindow(dpy, 0); + int op_mode = PropModePrepend; + int no_registration = 0; + Atom type; + int format; + unsigned long nitems; + unsigned long bytes_after; + unsigned char *value; + unsigned long data; + + TRACE(("IMProtocolWidget:setProperty()\n")); + + /* + * For atomic operation, grab the server. + */ +#ifndef DEBUG + XGrabServer(dpy); +#endif + + /* + * First, check the XIM_SERVERS property's existance. + * If it exists, examine the contents. + */ + if (XGetWindowProperty(dpy, root0, xim_servers, 0L, 1024L, False, + AnyPropertyType, &type, &format, &nitems, + &bytes_after, &value) == Success) { + if (type != XA_ATOM || format != 32) { + /* + * The contents of the property is invalid. + */ + DDPRINT(2, ("XIM_SERVERS is corrupted (type=%ld, format=%d)\n", + type, format)); + op_mode = PropModeReplace; + } else { + int i; + unsigned long *atoms = (unsigned long *)value; + + for (i = 0; i < nitems; i++) { + if (atoms[i] == server_atom) { + /* + * Already registered. + */ + TRACE(("server is already registered in XIM_SERVERS\n")); + no_registration = 1; + break; + } + } + } + if (value != NULL) XFree((char *)value); + } + + if (!no_registration) { + TRACE(("changing XIM_SERVERS property\n")); + data = ipw->imp.server_atom; + XChangeProperty(dpy, root0, xim_servers, XA_ATOM, 32, op_mode, + (unsigned char *)&data, 1); + } else { + TRACE(("touching XIM_SERVERS property to generate PropertyNotify\n")); + XChangeProperty(dpy, root0, xim_servers, XA_ATOM, 32, PropModeAppend, + (unsigned char *)&data, 0); + } + +#ifndef DEBUG + XUngrabServer(dpy); +#endif +} + +/*- ownSelection: own conversion selection -*/ +static int +ownSelection(ipw) +IMProtocolWidget ipw; +{ + Display *dpy = XtDisplay((Widget)ipw); + Time time = XtLastTimestampProcessed(dpy); + + + TRACE(("IMProtocolWidget:ownSelection()\n")); + + if (!XtOwnSelection((Widget)ipw, ipw->imp.server_atom, time, + convertSelection, loseSelection, + (XtSelectionDoneProc)NULL)) { + DPRINT(("cannot own selection")); + return -1; + } + DPRINT(("selection atom:%ld owner: %08lx (%ld)\n", ipw->imp.server_atom, + XtWindow((Widget)ipw), XtWindow((Widget)ipw))); + return 0; +} + +/*- convertSelection: convert selections -*/ +/* ARGSUSED */ +static Boolean +convertSelection(w, selectionp, targetp, typep, valuep, lengthp, formatp) +Widget w; +Atom *selectionp; +Atom *targetp; +Atom *typep; +XtPointer *valuep; +unsigned long *lengthp; +int *formatp; +{ + Display *dpy = XtDisplay(w); + IMProtocolWidget ipw = (IMProtocolWidget)w; + + TRACE(("IMProtocolWidget:convertSelection()\n")); + + if (*targetp == XInternAtom(dpy, "TARGETS", False)) { + Atom *targets; + + TRACE(("target is \"TARGETS\"\n")); + targets = (Atom *)XtMalloc(sizeof(Atom) * 2); + targets[0] = ATOM_LOCALES(w); + targets[1] = ATOM_TRANSPORT(w); + + *typep = XA_ATOM; + *valuep = (XtPointer)targets; + *lengthp = 2; + *formatp = 32; + return True; + } else if (*targetp == ATOM_LOCALES(w)) { + char buf[1024]; + + TRACE(("target is \"LOCALES\"\n")); + (void)strcpy(buf, "@locale="); + (void)strcat(buf, ipw->imp.locales); + TRACE(("\ttype: STRING, value: %s\n", buf)); + /* + * The protocol spec is unclear on the type of the + * selection value. Since R6 sample implementation + * uses LOCALES, use it. + */ + *typep = *targetp; + /* *typep = XA_STRING; */ + *valuep = (XtPointer)XtNewString(buf); + *lengthp = strlen(buf); + *formatp = 8; + return True; + } else if (*targetp == ATOM_TRANSPORT(w)) { + char buf[1024]; + char hostname[256]; + + TRACE(("target is \"TRANSPORT\"\n")); + + XmuGetHostname(hostname, 256); + + (void)strcpy(buf, "@transport="); + +#ifdef IM_X_TRANSPORT + if (ipw->imp.use_x_transport) { + (void)strcat(buf, "X/,"); + } +#endif /* IM_X_TRANSPORT */ + +#ifdef IM_TCP_TRANSPORT + if (ipw->imp.use_tcp_transport) { + char t_buf[1024]; + (void)sprintf(t_buf, "tcp/%s:%d,", hostname, ipw->imp.tcp_port); + (void)strcat(buf, t_buf); + } +#endif /* IM_TCP_TRANSPORT */ + +#ifdef IM_UNIX_TRANSPORT + if (ipw->imp.use_unix_transport) { + char u_buf[1024]; + (void)sprintf(u_buf, "local/%s:%s,", hostname, ipw->imp.unix_path); + (void)strcat(buf, u_buf); + } +#endif /* IM_UNIX_TRANSPORT */ + + /* delete trailing comma */ + if (buf[strlen(buf) - 1] == ',') buf[strlen(buf) - 1] = '\0'; + TRACE(("\ttype: STRING, value: %s\n", buf)); + + *typep = *targetp; /* -- see the comment on LOCALES above */ + *valuep = (XtPointer)XtNewString(buf); + *lengthp = strlen(buf); + *formatp = 8; + return True; + } else { + DDPRINT(2, ("unknown target atom (%ld)\n", *targetp)); + return False; + } +} + +/*- loseSelection: disable IM protocol handling -*/ +/* ARGSUSED */ +static void +loseSelection(w, selectionp) +Widget w; +Atom *selectionp; +{ + IMProtocolWidget ipw = (IMProtocolWidget)w; + + TRACE(("IMProtocolWidget:loseSelection()\n")); + + /* + * Someone takes over the selection. That means + * another kinput2 process has been started. + * Let the newly process handle new clients, but + * as long as existing clients are remained, we have + * to maintain them. + */ + + if (ipw->imp.connection_list == NULL) { + /* + * There are no clients. It is OK to destroy protocol handler. + */ + XtDestroyWidget(w); + return; + } + + ipw->imp.no_more_connections = True; + + /* + * Close down TCP/Unix service sockets. + */ + if (ipw->imp.tcp_sock >= 0) { + TRACE(("\tclose tcp socket\n")); + XtRemoveInput(ipw->imp.tcp_id); + (void)close(ipw->imp.tcp_sock); + ipw->imp.tcp_sock = -1; + } + if (ipw->imp.unix_sock >= 0) { + TRACE(("\tclose unix socket\n")); + XtRemoveInput(ipw->imp.unix_id); + (void)close(ipw->imp.unix_sock); + ipw->imp.unix_sock = -1; + } +} + + +/* + *+ Connection acceptance + */ + +#ifdef IM_TCP_TRANSPORT +/*- acceptTCPService: establish connection via TCP transport -*/ +/* ARGSUSED */ +static void +acceptTCPService(client_data, sourcep, idp) +XtPointer client_data; +int *sourcep; +XtInputId *idp; +{ + IMProtocolWidget ipw = (IMProtocolWidget)client_data; + IMConnection *conn; + + TRACE(("IMProtocolWidget:acceptTCPService()\n")); + + /* + * Accept connection request. + */ + conn = IMTCPConnection((Widget)ipw, *sourcep); + + /* + * Set dispatcher. + */ + if (conn != NULL) IMSetInitialDispatcher(conn); + + /* + * Enter to the connections list. + */ + if (conn != NULL) IMRegisterConnection(conn); +} +#endif /* IM_TCP_TRANSPORT */ + +#ifdef IM_UNIX_TRANSPORT +/*- acceptUnixService: establish connection via UNIX domain transport -*/ +/* ARGSUSED */ +static void +acceptUnixService(client_data, sourcep, idp) +XtPointer client_data; +int *sourcep; +XtInputId *idp; +{ + IMProtocolWidget ipw = (IMProtocolWidget)client_data; + IMConnection *conn; + + TRACE(("IMProtocolWidget:acceptUnixService()\n")); + + /* + * Accept connection request. + */ + conn = IMUnixConnection((Widget)ipw, *sourcep); + + /* + * Set dispatcher. + */ + if (conn != NULL) IMSetInitialDispatcher(conn); + + /* + * Enter to the connections list. + */ + if (conn != NULL) IMRegisterConnection(conn); +} +#endif /* IM_UNIX_TRANSPORT */ + +#ifdef IM_X_TRANSPORT +/*- acceptXService: establish connection via X transport -*/ +/* ARGSUSED */ +static void +acceptXService(w, client_data, event, continuep) +Widget w; +XtPointer client_data; +XEvent *event; +Boolean *continuep; +{ + IMConnection *conn; + + TRACE(("IMProtocolWidget:acceptXService()\n")); + + /* + * Check if the event is really a connection request. + */ + if (event->type != ClientMessage) return; + conn = IMXConnection(w, event); + + /* + * Set dispatcher. + */ + if (conn != NULL) IMSetInitialDispatcher(conn); + + /* + * Enter to the connections list. + */ + if (conn != NULL) IMRegisterConnection(conn); +} +#endif /* IM_X_TRANSPORT */ + + +/* + *+ utility functions + */ + +/*- initializeError: display error message when resource isn't specified -*/ +static void +initializeError(w, resname) +Widget w; +String resname; +{ + String params[2]; + Cardinal num_params; + + params[0] = XtClass(w)->core_class.class_name; + params[1] = resname; + num_params = 2; + XtAppErrorMsg(XtWidgetToApplicationContext(w), + "initializeError", "noResource", "WidgetError", + "%s: resource %s must be specified at widget creation", + params, &num_params); +} + +/*- compactList: remove unnecessary spaces in a comma-separated list -*/ +static char * +compactList(s) +char *s; +{ + char *src, *dst; + int c; + + src = dst = s; + for (;;) { + /* skip leading space */ + while (isspace(*src)) src++; + + if (*src == '\0') { + *dst = '\0'; + return s; + } + + /* copy string until comma or NUL appears */ + while ((c = *dst++ = *src++) != ',') { + if (c == '\0') return s; + } + } +} + +/*- setTransport: determine which transport to be used -*/ +static void +setTransport(w) +Widget w; +{ + IMProtocolWidget ipw = (IMProtocolWidget)w; + char *p; + + TRACE(("IMProtocolWidget:setTransport(%s)\n", ipw->imp.transport_list)); + + ipw->imp.use_tcp_transport = False; + ipw->imp.use_unix_transport = False; + ipw->imp.use_x_transport = False; + + p = ipw->imp.transport_list; + while (*p != '\0') { + char lower[256]; + char *q; + + while (isspace(*p)) p++; + if (*p == '\0') break; + + q = lower; + while (*p != '\0' && *p != ',' && !isspace(*p)) { + if (isupper(*p)) { + *q++ = tolower(*p); + } else { + *q++ = *p; + } + p++; + } + *q = '\0'; + while (isspace(*p)) p++; + if (*p == ',') p++; + + if (!strcmp(lower, "tcp")) { + TRACE(("\tTCP transport\n")); + ipw->imp.use_tcp_transport = True; + } else if (!strcmp(lower, "unix")) { + TRACE(("\tUNIX domain transport\n")); + ipw->imp.use_unix_transport = True; + } else if (!strcmp(lower, "x")) { + TRACE(("\tX transport\n")); + ipw->imp.use_x_transport = True; + } + } +} + +/*- makeConverter: create converter record -*/ +static int +makeConverter(w) +Widget w; +{ + IMProtocolWidget ipw = (IMProtocolWidget)w; + char *locales[100]; + int num_locales; + int size; + char *p; + + TRACE(("IMProtocolWidget:makeConverter()\n")); + + ipw->imp.converter.input_object_class = ipw->imp.input_object_class; + ipw->imp.converter.display_object_class = ipw->imp.display_object_class; + + p = ipw->imp.locales; + num_locales = 0; + do { + char buf[256]; + char *q = buf; + + while (isspace(*p)) p++; + if (*p == '\0') break; + + while (*p != '\0' && *p != ',' && !isspace(*p)) *q++ = *p++; + *q = '\0'; + TRACE(("\tsupported locale: %s\n", buf)); + locales[num_locales++] = XtNewString(buf); + while (isspace(*p)) p++; + if (*p == ',') p++; + } while (*p != '\0' && num_locales < 100); + TRACE(("\tnumber of supported locales: %d\n", num_locales)); + + if (num_locales == 0) return -1; + ipw->imp.converter.num_locales = num_locales; + + size = sizeof(char *) * num_locales; + ipw->imp.converter.supported_locales = (char **)XtMalloc(size); + bcopy((char *)locales, (char *)ipw->imp.converter.supported_locales, size); + return 0; +} + +/*- getTriggerKeys: parse conversion trigger key specification -*/ +static void +getTriggerKeys(w) +Widget w; +{ + IMProtocolWidget ipw = (IMProtocolWidget)w; + char *key_str; + IMTriggerKey keys[100]; + int num_keys; + int c, n; + ICTriggerKey *ckeys, *ekeys; + + TRACE(("IMProtocolWidget:getTriggerKeys()\n")); + + key_str = ipw->imp.conversion_start_keys; + num_keys = 0; + TRACE(("\tstart keys: %s\n", key_str)); + + if (key_str != NULL) { + do { + char buf[256]; + char *p = buf; + KeySym keysym; + long mods, chk_mods; + + while ((c = *key_str++) != '\0' && c != '\n') { + *p++ = c; + } + *p = '\0'; + if (ParseKeyEvent(buf, &keysym, &mods, &chk_mods)) { + TRACE(("\tkeysym: %08lx, modifiers: %04lx, check: %04lx\n", + keysym, mods, chk_mods)); + keys[num_keys].keysym = keysym; + keys[num_keys].modifiers = mods; + keys[num_keys].check_modifiers = chk_mods; + num_keys++; + } + } while (c != '\0' && num_keys < 100); + } + + n = ICGetTriggerKeysOfInputObjectClass(ipw->imp.input_object_class, + &ckeys); + for (ekeys = ckeys + n ; + ckeys < ekeys && num_keys < (sizeof(keys) / sizeof(IMTriggerKey)) ; + ckeys++) { + keys[num_keys].keysym = ckeys->keysym; + keys[num_keys].modifiers = ckeys->modifiers; + keys[num_keys].check_modifiers = ckeys->modifiermask; + num_keys++; + } + + TRACE(("\tnumber of trigger keys: %d\n", num_keys)); + ipw->imp.num_trigger_keys = num_keys; + + if (num_keys > 0) { + int size; + + size = sizeof(IMTriggerKey) * num_keys; + ipw->imp.trigger_keys = (IMTriggerKey *)XtMalloc(size); + bcopy((char *)keys, (char *)ipw->imp.trigger_keys, size); + } else { + ipw->imp.trigger_keys = NULL; + } +} + +/*- ioeCallback: callback procedure for X I/O error -*/ +static void +ioeCallback(cldata) +XPointer cldata; +{ + IMProtocolWidget ipw = (IMProtocolWidget)cldata; + + if (ipw->imp.unix_sock >= 0 && ipw->imp.unix_path != NULL) { + (void)unlink(ipw->imp.unix_path); + } +} diff -r 000000000000 -r 92745d501b9a lib/Imakefile --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/Imakefile Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,75 @@ +#include "../Kinput2.conf" + + WIDGETSRCS = AdoptedShe.c AuxPanel.c CandPanel.c Canvas.c \ + CanvasShel.c ConvCtrl.c ConvDisp.c ConvMgr.c \ + ICLabel.c InputConv.c KIProto.c OffConv.c \ + OverConv.c OnConv.c WcharDisp.c XimpProto.c IMProto.c + + WIDGETOBJS = AdoptedShe.o AuxPanel.o CandPanel.o Canvas.o \ + CanvasShel.o ConvCtrl.o ConvDisp.o ConvMgr.o \ + ICLabel.o InputConv.o KIProto.o OffConv.o \ + OverConv.o OnConv.o WcharDisp.o XimpProto.o IMProto.o + + UTILSRCS = cachedatom.c cachedfont.c ctext.c dispatch.c \ + fontset.c wstring.c xtwstr.c xwstr.c \ + asyncerr.c fontbank.c parsekey.c ioecall.c + + UTILOBJS = cachedatom.o cachedfont.o ctext.o dispatch.o \ + fontset.o wstring.o xtwstr.o xwstr.o \ + asyncerr.o fontbank.o parsekey.o ioecall.o + +#define PassCDebugFlags 'CDEBUGFLAGS=$(CDEBUGFLAGS)' +#define IHaveSubdirs + SUBDIRS = imlib + +#ifdef UseWnn + WNNSRCS = CcWnn.c cconv.c wnnlib.c + WNNOBJS = CcWnn.o cconv.o wnnlib.o + WNNINCS = -I$(WNNINCDIR) +#ifdef UseWnn6 + WNN6DEF = -DWNN6 +#endif +#ifdef WnnLibDir + WNNLIBDIR = WnnLibDir + WNNLIBDEF = -DLIBDIR=\"$(WNNLIBDIR)\" +#endif + WNNDEFS = -DCCDEFPATH=\"$(CCDEF_DIR)/\" \ + $(WNN6DEF) $(WNNLIBDEF) +#endif +#ifdef UseCanna + CANNASRCS = Canna.c + CANNAOBJS = Canna.o + CANNAINCS = -I$(CANNASRC) +#endif +#ifdef UseSj3 + SJ3SRCS = Sj3.c + SJ3OBJS = Sj3.o + SJ3INCS = -I$(SJ3SRC)/sj3lib -I$(SJ3SRC) + SJ3DEFS = -DSJ3DEFPATH=\"$(SJ3DEF_DIR)/\" + SUBDIRS = imlib Xsj3clib +#endif +#ifdef UseAtok + ATOKSRCS = Atok.c + ATOKOBJS = Atok.o + ATOKINCS = -I$(ATOKINCDIR) + SUBDIRS = imlib Xatoklib +#endif + + SRCS = $(WIDGETSRCS) $(UTILSRCS) \ + $(WNNSRCS) $(CANNASRCS) $(SJ3SRCS) $(ATOKSRCS) + OBJS = $(WIDGETOBJS) $(UTILOBJS) \ + $(WNNOBJS) $(CANNAOBJS) $(SJ3OBJS) $(ATOKOBJS) + + LOCAL_INCLUDES = -I../include -Iimlib + INCLUDES = $(LOCAL_INCLUDES) $(WNNINCS) $(CANNAINCS) $(SJ3INCS) $(ATOKINCS) + + DEFINES = $(WNNDEFS) $(SJ3DEFS) $(TRANSPORTDEFS) + +NormalLibraryObjectRule() +NormalLibraryTarget(Ki2,$(OBJS)) +DependTarget() + +#ifdef IHaveSubdirs +MakeSubdirs($(SUBDIRS)) +DependSubdirs($(SUBDIRS)) +#endif diff -r 000000000000 -r 92745d501b9a lib/InputConv.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/InputConv.c Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,569 @@ +#ifndef lint +static char *rcsid = "$Id: InputConv.c,v 1.17 1999/01/13 08:42:00 ishisone Exp $"; +#endif +/* + * Copyright (c) 1990 Software Research Associates, Inc. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Software Research Associates not be + * used in advertising or publicity pertaining to distribution of the + * software without specific, written prior permission. Software Research + * Associates makes no representations about the suitability of this software + * for any purpose. It is provided "as is" without express or implied + * warranty. + * + * Author: Makoto Ishisone, Software Research Associates, Inc., Japan + */ + +#include +#include +#include "InputConvP.h" + +static XtResource resources[] = { +#define offset(field) XtOffset(InputConvObject, inputConv.field) + {XtNselectionControl, XtCCallback, XtRCallback, sizeof(XtCallbackList), + offset(selectioncallback), XtRCallback, (XtPointer)NULL}, + {XtNtextChangeNotify, XtCCallback, XtRCallback, sizeof(XtCallbackList), + offset(textchangecallback), XtRCallback, (XtPointer)NULL}, + {XtNmodeChangeNotify, XtCCallback, XtRCallback, sizeof(XtCallbackList), + offset(modechangecallback), XtRCallback, (XtPointer)NULL}, + {XtNendNotify, XtCCallback, XtRCallback, sizeof(XtCallbackList), + offset(endcallback), XtRCallback, (XtPointer)NULL}, + {XtNfixNotify, XtCCallback, XtRCallback, sizeof(XtCallbackList), + offset(fixcallback), XtRCallback, (XtPointer)NULL}, + {XtNauxControl, XtCCallback, XtRCallback, sizeof(XtCallbackList), + offset(auxcallback), XtRCallback, (XtPointer)NULL}, + {XtNdisplayObjectClass, XtCClass, XtRPointer, sizeof(WidgetClass), + offset(displayObjClass), XtRImmediate, (XtPointer)NULL }, +#undef offset +}; + +static void ClassPartInitialize(); +static void Initialize(); +static void Destroy(); + +static int InputEvent(); +static ICString *GetMode(); +static int CursorPos(); +static int NumSegments(); +static ICString *GetSegment(); +static int CompareSegment(); +static ICString *GetItemList(); +static int SelectItem(); +static int ConvertedString(); +static int Clear(); +static ICString *GetAuxSegments(); +static int GetTriggerKeys(); +static int GetPreeditString(); +static int GetStatusString(); + +InputConvClassRec inputConvClassRec = { + { /* object fields */ + /* superclass */ (WidgetClass) &objectClassRec, + /* class_name */ "InputConv", + /* widget_size */ sizeof(InputConvRec), + /* class_initialize */ NULL, + /* class_part_initialize */ ClassPartInitialize, + /* class_inited */ FALSE, + /* initialize */ Initialize, + /* initialize_hook */ NULL, + /* obj1 */ NULL, + /* obj2 */ NULL, + /* obj3 */ 0, + /* resources */ resources, + /* num_resources */ XtNumber(resources), + /* xrm_class */ NULLQUARK, + /* obj4 */ FALSE, + /* obj5 */ FALSE, + /* obj6 */ FALSE, + /* obj7 */ FALSE, + /* destroy */ Destroy, + /* obj8 */ NULL, + /* obj9 */ NULL, + /* set_values */ NULL, + /* set_values_hook */ NULL, + /* obj10 */ NULL, + /* get_values_hook */ NULL, + /* obj11 */ NULL, + /* version */ XtVersion, + /* callback_private */ NULL, + /* obj12 */ NULL, + /* obj13 */ NULL, + /* obj14 */ NULL, + /* extension */ NULL, + }, + { /* inputConv fields */ + /* InputEvent */ InputEvent, + /* GetMode */ GetMode, + /* CursorPos */ CursorPos, + /* NumSegments */ NumSegments, + /* GetSegment */ GetSegment, + /* CompareSegment */ CompareSegment, + /* GetItemList */ GetItemList, + /* SelectItem */ SelectItem, + /* GetConvertedString */ ConvertedString, + /* ClearConversion */ Clear, + /* GetSegments */ GetAuxSegments, + /* SupportMultipleObjects */ False, + /* GetTriggerKeys */ GetTriggerKeys, + /* num_trigger_keys */ 0, + /* trigger_keys */ NULL, + /* GetPreeditString */ GetPreeditString, + /* GetStatusString */ GetStatusString, + /* NoMoreObjects */ False, + } +}; + +WidgetClass inputConvObjectClass = (WidgetClass)&inputConvClassRec; + +static void +ClassPartInitialize(cl) +WidgetClass cl; +{ + InputConvObjectClass class = (InputConvObjectClass)cl; + InputConvObjectClass super = (InputConvObjectClass)class->object_class.superclass; + + if (class->inputConv_class.InputEvent == XtInheritInputEvent) + class->inputConv_class.InputEvent = super->inputConv_class.InputEvent; + if (class->inputConv_class.GetMode == XtInheritGetMode) + class->inputConv_class.GetMode = super->inputConv_class.GetMode; + if (class->inputConv_class.CursorPos == XtInheritCursorPos) + class->inputConv_class.CursorPos = super->inputConv_class.CursorPos; + if (class->inputConv_class.NumSegments == XtInheritNumSegments) + class->inputConv_class.NumSegments = super->inputConv_class.NumSegments; + if (class->inputConv_class.GetSegment == XtInheritGetSegment) + class->inputConv_class.GetSegment = super->inputConv_class.GetSegment; + if (class->inputConv_class.CompareSegment == XtInheritCompareSegment) + class->inputConv_class.CompareSegment = super->inputConv_class.CompareSegment; + if (class->inputConv_class.GetItemList == XtInheritGetItemList) + class->inputConv_class.GetItemList = super->inputConv_class.GetItemList; + if (class->inputConv_class.SelectItem == XtInheritSelectItem) + class->inputConv_class.SelectItem = super->inputConv_class.SelectItem; + if (class->inputConv_class.GetConvertedString == XtInheritGetConvertedString) + class->inputConv_class.GetConvertedString = super->inputConv_class.GetConvertedString; + if (class->inputConv_class.ClearConversion == XtInheritClearConversion) + class->inputConv_class.ClearConversion = super->inputConv_class.ClearConversion; + if (class->inputConv_class.GetAuxSegments == XtInheritGetAuxSegments) + class->inputConv_class.GetAuxSegments = super->inputConv_class.GetAuxSegments; + if (class->inputConv_class.GetTriggerKeys == XtInheritGetTriggerKeys) + class->inputConv_class.GetTriggerKeys = super->inputConv_class.GetTriggerKeys; + if (class->inputConv_class.GetPreeditString == XtInheritGetPreeditString) + class->inputConv_class.GetPreeditString = super->inputConv_class.GetPreeditString; + if (class->inputConv_class.GetStatusString == XtInheritGetStatusString) + class->inputConv_class.GetStatusString = super->inputConv_class.GetStatusString; + + class->inputConv_class.NoMoreObjects = False; +} + +/* ARGSUSED */ +static void +Initialize(req, new, args, num_args) +Widget req; +Widget new; +ArgList args; +Cardinal *num_args; +{ + InputConvObjectClass class = (InputConvObjectClass)new->core.widget_class; + String params[1]; + Cardinal num_params; + + if (class->inputConv_class.NoMoreObjects) { + params[0] = XtClass(new)->core_class.class_name; + num_params = 1; + XtAppErrorMsg(XtWidgetToApplicationContext(new), + "creationError", "widget", "WidgetError", + "Class %s cannot have multiple instances", + params, &num_params); + } + if (!class->inputConv_class.SupportMultipleObjects) { + class->inputConv_class.NoMoreObjects = True; + } +} + +static void +Destroy(w) +Widget w; +{ + InputConvObjectClass class = (InputConvObjectClass)w->core.widget_class; + + class->inputConv_class.NoMoreObjects = False; +} + +/* ARGSUSED */ +static int +InputEvent(w, event) +Widget w; +XEvent *event; +{ + XtAppError(XtWidgetToApplicationContext(w), + "InputConv Object: InputEvent function isn't defined."); + return -1; /* for lint */ +} + +/* ARGSUSED */ +static ICString * +GetMode(w) +Widget w; +{ + XtAppError(XtWidgetToApplicationContext(w), + "InputConv Object: GetMode function isn't defined."); + return NULL; /* for lint */ +} + +/* ARGSUSED */ +static int +CursorPos(w, segidx, offset) +Widget w; +Cardinal *segidx; +Cardinal *offset; +{ + XtAppError(XtWidgetToApplicationContext(w), + "InputConv Object: CursorPos function isn't defined."); + return 0; /* for lint */ +} + +/* ARGSUSED */ +static int +NumSegments(w) +Widget w; +{ + XtAppError(XtWidgetToApplicationContext(w), + "InputConv Object: NumSegments function isn't defined."); + return 0; /* for lint */ +} + +/* ARGSUSED */ +static ICString * +GetSegment(w, n) +Widget w; +Cardinal n; +{ + XtAppError(XtWidgetToApplicationContext(w), + "InputConv Object: GetSegment function isn't defined."); + return NULL; /* for lint */ +} + +/* ARGSUSED */ +static int +CompareSegment(w, seg1, seg2, n) +Widget w; +ICString *seg1; +ICString *seg2; +Cardinal *n; +{ + XtAppError(XtWidgetToApplicationContext(w), + "InputConv Object: CompareSegment function isn't defined."); + return 0; /* for lint */ +} + +/* ARGSUSED */ +static ICString * +GetItemList(w, n) +Widget w; +Cardinal *n; +{ + XtAppError(XtWidgetToApplicationContext(w), + "InputConv Object: GetItem function isn't defined."); + return NULL; /* for lint */ +} + +/* ARGSUSED */ +static int +SelectItem(w, n) +Widget w; +int n; +{ + XtAppError(XtWidgetToApplicationContext(w), + "InputConv Object: SelectItem function isn't defined."); + return -1; /* for lint */ +} + +/* ARGSUSED */ +static int +ConvertedString(w, encoding, format, length, string) +Widget w; +Atom *encoding; +int *format; +int *length; +XtPointer *string; +{ + XtAppError(XtWidgetToApplicationContext(w), + "InputConv Object: GetConvertedString function isn't defined."); + return -1; /* for lint */ +} + +/* ARGSUSED */ +static int +Clear(w) +Widget w; +{ + XtAppError(XtWidgetToApplicationContext(w), + "InputConv Object: ClearConversion function isn't defined."); + return -1; /* for lint */ +} + +/* ARGSUSED */ +static ICString * +GetAuxSegments(w, n, ns, nc) +Widget w; +Cardinal *n, *ns, *nc; +{ + XtAppError(XtWidgetToApplicationContext(w), + "InputConv Object: GetAuxSegments function isn't defined."); + return NULL; /* for lint */ +} + + +/* ARGSUSED */ +static int +GetTriggerKeys(w, keys_return) +Widget w; +ICTriggerKey **keys_return; +{ + return 0; +} + +/* ARGSUSED */ +static int +GetPreeditString(w, segn, offset, encoding, format, length, string) +Widget w; +int segn; +int offset; +Atom *encoding; +int *format; +int *length; +XtPointer *string; +{ + XtAppError(XtWidgetToApplicationContext(w), + "InputConv Object: GetPreeditString function isn't defined."); + return 0; /* for lint */ +} + +static int +GetStatusString(w, encoding, format, length, string, nchars) +Widget w; +Atom *encoding; +int *format; +int *length; +XtPointer *string; +int *nchars; +{ + XtAppError(XtWidgetToApplicationContext(w), + "InputConv Object: GetStatusString function isn't defined."); + return 0; /* for lint */ +} + + +/* + * public functions + */ + +Boolean +ICSupportMultipleObjects(cl) +WidgetClass cl; +{ + InputConvObjectClass class = (InputConvObjectClass)cl; + + /* check if specified class is a subclass of InputConvObjectClass */ + while (cl != NULL) { + if (cl == inputConvObjectClass) { + /* OK */ + XtInitializeWidgetClass(cl); + return class->inputConv_class.SupportMultipleObjects; + } + cl = cl->core_class.superclass; + } + return True; /* for almost all of other classes, it's True */ +} + +int +ICInputEvent(w, event) +Widget w; +XEvent *event; +{ + InputConvObjectClass class = (InputConvObjectClass)w->core.widget_class; + + XtCheckSubclass(w, inputConvObjectClass, "ICInputEvent()"); + return (*class->inputConv_class.InputEvent)(w, event); +} + +ICString * +ICGetMode(w) +Widget w; +{ + InputConvObjectClass class = (InputConvObjectClass)w->core.widget_class; + + XtCheckSubclass(w, inputConvObjectClass, "ICGetMode()"); + return (*class->inputConv_class.GetMode)(w); +} + +int +ICCursorPos(w, segidx, offset) +Widget w; +Cardinal *segidx; +Cardinal *offset; +{ + InputConvObjectClass class = (InputConvObjectClass)w->core.widget_class; + + XtCheckSubclass(w, inputConvObjectClass, "ICCursorPos()"); + return (*class->inputConv_class.CursorPos)(w, segidx, offset); +} + +int +ICNumSegments(w) +Widget w; +{ + InputConvObjectClass class = (InputConvObjectClass)w->core.widget_class; + + XtCheckSubclass(w, inputConvObjectClass, "ICNumSegments()"); + return (*class->inputConv_class.NumSegments)(w); +} + +ICString * +ICGetSegment(w, n) +Widget w; +Cardinal n; +{ + InputConvObjectClass class = (InputConvObjectClass)w->core.widget_class; + + XtCheckSubclass(w, inputConvObjectClass, "ICGetSegment()"); + return (*class->inputConv_class.GetSegment)(w, n); +} + +int +ICCompareSegment(w, seg1, seg2, n) +Widget w; +ICString *seg1; +ICString *seg2; +Cardinal *n; +{ + InputConvObjectClass class = (InputConvObjectClass)w->core.widget_class; + + XtCheckSubclass(w, inputConvObjectClass, "ICCompareSegment()"); + return (*class->inputConv_class.CompareSegment)(w, seg1, seg2, n); +} + +ICString * +ICGetItemList(w, n) +Widget w; +Cardinal *n; +{ + InputConvObjectClass class = (InputConvObjectClass)w->core.widget_class; + + XtCheckSubclass(w, inputConvObjectClass, "ICGetItemList()"); + return (*class->inputConv_class.GetItemList)(w, n); +} + +int +ICSelectItem(w, n) +Widget w; +int n; +{ + InputConvObjectClass class = (InputConvObjectClass)w->core.widget_class; + + XtCheckSubclass(w, inputConvObjectClass, "ICSelectItem()"); + return (*class->inputConv_class.SelectItem)(w, n); +} + +int +ICGetConvertedString(w, encoding, format, length, string) +Widget w; +Atom *encoding; +int *format; +int *length; +XtPointer *string; +{ + InputConvObjectClass class = (InputConvObjectClass)w->core.widget_class; + + XtCheckSubclass(w, inputConvObjectClass, "ICGetConvertedString()"); + return (*class->inputConv_class.GetConvertedString)(w, encoding, format, + length, string); +} + +int +ICClearConversion(w) +Widget w; +{ + InputConvObjectClass class = (InputConvObjectClass)w->core.widget_class; + + XtCheckSubclass(w, inputConvObjectClass, "ICClearConversion()"); + return (*class->inputConv_class.ClearConversion)(w); +} + +ICString * +ICGetAuxSegments(w, n, ns, nc) +Widget w; +Cardinal *n, *ns, *nc; +{ + InputConvObjectClass class = (InputConvObjectClass)w->core.widget_class; + + XtCheckSubclass(w, inputConvObjectClass, "ICGetAuxSegments()"); + return (*class->inputConv_class.GetAuxSegments)(w, n, ns, nc); +} + +int +ICGetPreeditString(w, segn, offset, encoding, format, length, string) +Widget w; +int segn; +int offset; +Atom *encoding; +int *format; +int *length; +XtPointer *string; +{ + InputConvObjectClass class = (InputConvObjectClass)w->core.widget_class; + + XtCheckSubclass(w, inputConvObjectClass, "ICGetPreeditString()"); + return (*class->inputConv_class.GetPreeditString)(w, segn, offset, encoding, format, length, string); +} + +int +ICGetStatusString(w, encoding, format, length, string, nchars) +Widget w; +Atom *encoding; +int *format; +int *length; +XtPointer *string; +int *nchars; +{ + InputConvObjectClass class = (InputConvObjectClass)w->core.widget_class; + + XtCheckSubclass(w, inputConvObjectClass, "ICGetStatusString()"); + return (*class->inputConv_class.GetStatusString)(w, encoding, format, length, string, nchars); +} + +/* + + Though the following procedure should be done during initialization + of object class, I will do the following separately from the + initialization procedure in order to prevent duplicate + initialization of input object, that is, to prevent making + connection twice to input conversion server. + + */ + +int +ICRegisterTriggerKeys(w) +Widget w; +{ + InputConvObjectClass class = (InputConvObjectClass)w->core.widget_class; + + XtCheckSubclass(w, inputConvObjectClass, "ICRegisterTriggerKeys()"); + return class->inputConv_class.num_trigger_keys = + (*class->inputConv_class.GetTriggerKeys) + (w, &class->inputConv_class.trigger_keys); +} + +int +ICGetTriggerKeysOfInputObjectClass(cl, keys_return) +WidgetClass cl; +ICTriggerKey **keys_return; +{ + InputConvObjectClass class = (InputConvObjectClass)cl; + + *keys_return = class->inputConv_class.trigger_keys; + return class->inputConv_class.num_trigger_keys; +} diff -r 000000000000 -r 92745d501b9a lib/KIProto.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/KIProto.c Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,2351 @@ +#ifndef lint +static char *rcsid = "$Id: KIProto.c,v 1.49 1999/01/07 03:12:57 ishisone Exp $"; +#endif +/*- + * Copyright (c) 1991 Software Research Associates, Inc. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Software Research Associates not be + * used in advertising or publicity pertaining to distribution of the + * software without specific, written prior permission. Software Research + * Associates makes no representations about the suitability of this software + * for any purpose. It is provided "as is" without express or implied + * warranty. + * + * Author: Makoto Ishisone, Software Research Associates, Inc., Japan + */ + +#include +#include +#include +#include +#include +#include "KIProtoP.h" +#include "ConvMgr.h" +#include "OverConv.h" +#include "OffConv.h" +#include "ConvDisp.h" +#include "MyDispatch.h" +#include "CachedFont.h" +#include "ConvProto.h" +#include "AsyncErr.h" + +#define DEBUG_VAR debug_KinputProtocol +#include "DebugPrint.h" + +#define JINPUT_PROTOCOL_VERSION 0x20000L /* version 2 */ + +#define XLC_AUTO_REPLACE 1 +#define XLC_ALL_INFORMATION 2 +#define XLC_FRAME_INFORMATION 4 +#define XLC_OFFSET_INFORMATION 8 + +/*- resource table -*/ +static XtResource resources[] = { +#define offset(field) XtOffset(KinputProtocolWidget, kinput.field) + { XtNlanguage, XtCLanguage, XtRString, sizeof(String), + offset(language), XtRString, (XtPointer)NULL }, + { XtNinputObjectClass, XtCClass, XtRPointer, sizeof(WidgetClass), + offset(inputObjClass), XtRImmediate, (XtPointer)NULL }, + { XtNdisplayObjectClass, XtCClass, XtRPointer, sizeof(WidgetClass), + offset(displayObjClass), XtRImmediate, (XtPointer)NULL }, + { XtNbackwardCompatible, XtCBackwardCompatible, XtRBoolean, sizeof(Boolean), + offset(backward_compatible), XtRString, (XtPointer)"False" }, + { XtNxlcConversionStartKey, XtCXlcConversionStartKey, XtRString, sizeof(String), + offset(xlcstartkey), XtRString, (XtPointer)NULL }, +#undef offset +}; + +static void ConversionRequestProc(); +static void ConversionEndRequestProc(); +static void ConversionOpenRequestProc(); +static void ConversionCloseRequestProc(); +static void ConversionCloseProc(); +static void ConversionXYNotifyProc(); +static void ConversionColorNotifyProc(); +static void ConversionFontsNotifyProc(); +static void ConversionAttributeNotifyProc(); +static void SelectionRequestProc(); +static void SelectionClearProc(); +static void XlcOnTheSpotChangedProc(); + +/*- action table -*/ +static XtActionsRec actions[] = { + { "conversion-request", ConversionRequestProc }, + { "conversion-end-request", ConversionEndRequestProc }, + { "conversion-open-request", ConversionOpenRequestProc }, + { "conversion-close-request", ConversionCloseRequestProc }, + { "conversion-close", ConversionCloseProc }, + { "conversion-xy-notify", ConversionXYNotifyProc }, + { "conversion-color-notify", ConversionColorNotifyProc }, + { "conversion-fonts-notify", ConversionFontsNotifyProc }, + { "conversion-attribute-notify", ConversionAttributeNotifyProc }, + { "xlc-on-the-spot-changed", XlcOnTheSpotChangedProc }, + { "selection-request", SelectionRequestProc }, + { "selection-clear", SelectionClearProc }, +}; + +/*- default translation -*/ +static char translations[] = + "CONVERSION_REQUEST: conversion-request()\n\ + CONVERSION_END_REQUEST: conversion-end-request()\n\ + CONVERSION_OPEN_REQUEST: conversion-open-request()\n\ + CONVERSION_CLOSE_REQUEST: conversion-close-request()\n\ + CONVERSION_CLOSE: conversion-close()\n\ + CONVERSION_XY_NOTIFY: conversion-xy-notify()\n\ + CONVERSION_COLOR_NOTIFY: conversion-color-notify()\n\ + CONVERSION_FONTS_NOTIFY: conversion-fonts-notify()\n\ + CONVERSION_ATTRIBUTE_NOTIFY: conversion-attribute-notify()\n\ + _XLC_ON_THE_SPOT: xlc-on-the-spot-changed()\n\ + : selection-request()\n\ + : selection-clear()"; + +/*- static function declarations -*/ +static void Initialize(), Destroy(); +static void Realize(); +static Boolean SetValues(); + +static void getAtoms(); +static Boolean ownSelection(); + +static ConvClient *findClient(); +static ConvClient *newClient(); +static Widget attachConverter(); +static void detachConverter(); +static void jinputDetach(); +static void deleteClient(); + +static Boolean isCorrectClientEvent(); +static Boolean isCorrectWindowID(); + +static void myStartConversion(); +static void myChangeAttributes(); + +static void getJinputInitialProperty(); +static void jinputSendReq(); +static void jinputFreeResources(); +static void kinput2FreeResources(); +static void xlcFreeResources(); +static void setAttribute(); +static int getFontsByFontAtoms(); +static int safeGetAttributeProperty(); +static void getAttributeFromProperty1(); +static void getAttributeFromProperty(); +static void getAttributeFromEvent(); +static ConvClient *getXlcDataFromProperty(); +static void initializeError(); +static int parseKeyEvent(); +static char *mystrstr(); +static void getDefaultFontHeight(); + +static void setJinputProperty(); +static void setKinput2Property(); +static void setXlcProperty(); +static void setXlcStatusProperty(); +static void setXlcBCKey(); + +static void sendClientMessage(); +static void sendNegativeConversionNotify(); +static void sendConversionNotify(); +static void sendNegativeConversionOpenNotify(); +static void sendConversionOpenNotify(); +static void sendColorRequest(); +static void sendFontRequest(); +static void sendXYRequest(); + +static void fixCallback(); +static void fixProc(); +static void jinputFix(); +static void endCallback(); +static void endProc(); +static void jinputEnd(); +static void jinputNewTextCallback(); +static void xlcEnd(); + +static void ClientDead(); + +/*- KinputProtocolClassRec -*/ +KinputProtocolClassRec kinputProtocolClassRec = { + { /* core fields */ + /* superclass */ (WidgetClass) &widgetClassRec, + /* class_name */ "KinputProtocol", + /* widget_size */ sizeof(KinputProtocolRec), + /* class_initialize */ NULL, + /* class_part_initialize */ NULL, + /* class_inited */ FALSE, + /* initialize */ Initialize, + /* initialize_hook */ NULL, + /* realize */ Realize, + /* actions */ actions, + /* num_actions */ XtNumber(actions), + /* resources */ resources, + /* num_resources */ XtNumber(resources), + /* xrm_class */ NULLQUARK, + /* compress_motion */ TRUE, + /* compress_exposure */ TRUE, + /* compress_enterleave */ TRUE, + /* visible_interest */ FALSE, + /* destroy */ Destroy, + /* resize */ NULL, + /* expose */ NULL, + /* set_values */ SetValues, + /* set_values_hook */ NULL, + /* set_values_almost */ XtInheritSetValuesAlmost, + /* get_values_hook */ NULL, + /* accept_focus */ NULL, + /* version */ XtVersion, + /* callback_private */ NULL, + /* tm_table */ translations, + /* query_geometry */ XtInheritQueryGeometry, + /* display_accelerator */ XtInheritDisplayAccelerator, + /* extension */ NULL + }, + { /* kinputprotocol fields */ + /* empty */ 0 + } +}; + +WidgetClass kinputProtocolWidgetClass = (WidgetClass)&kinputProtocolClassRec; + +/* + *+ Core class methods + */ + +/*- Initialize: intern Atoms -*/ +/* ARGSUSED */ +static void +Initialize(req, new, args, num_args) +Widget req; +Widget new; +ArgList args; +Cardinal *num_args; +{ + KinputProtocolWidget kpw = (KinputProtocolWidget)new; + + if (kpw->kinput.language == NULL) { + initializeError(new, XtNlanguage); + } else if (kpw->kinput.inputObjClass == NULL) { + initializeError(new, XtNinputObjectClass); + } else if (kpw->kinput.displayObjClass == NULL) { + initializeError(new, XtNdisplayObjectClass); + } + kpw->kinput.language = XtNewString(kpw->kinput.language); + kpw->kinput.clients = (ConvClient *)NULL; + getDefaultFontHeight(kpw); + getAtoms(kpw); +} + +/*- Destroy: free allocated memory -*/ +static void +Destroy(w) +Widget w; +{ + KinputProtocolWidget kpw = (KinputProtocolWidget)w; + + XtFree(kpw->kinput.language); +} + +/*- Realize: own selection -*/ +static void +Realize(w, mask, value) +Widget w; +XtValueMask *mask; +XSetWindowAttributes *value; +{ + KinputProtocolWidget kpw = (KinputProtocolWidget)w; + CoreWidgetClass super = (CoreWidgetClass)XtClass(w)->core_class.superclass; + + (*super->core_class.realize)(w, mask, value); + + setJinputProperty(kpw); + setKinput2Property(kpw); + setXlcProperty(kpw); + + if (!ownSelection(kpw)) { + String params[1]; + Cardinal num_params; + + params[0] = XtClass(w)->core_class.class_name; + num_params = 1; + XtAppWarningMsg(XtWidgetToApplicationContext(w), + "selectionError", "ownSelection", "WidgetError", + "%s: can't own selection", params, &num_params); + + XtDestroyWidget(w); + } else { + CMPrepareConverter(XtParent(w), XtScreen(w), + separateConversionWidgetClass, + kpw->kinput.inputObjClass, + kpw->kinput.displayObjClass); + } +} + +/*- SetValues: not implemented yet -*/ +/* ARGSUSED */ +static Boolean +SetValues(cur, req, wid, args, num_args) +Widget cur; +Widget req; +Widget wid; +ArgList args; +Cardinal *num_args; +{ +#ifdef notdef + KinputProtocolWidget old = (KinputProtocolWidget)cur; + KinputProtocolWidget new = (KinputProtocolWidget)wid; + Boolean redisplay = False; +#endif + + return False; +} + +/* + *+ atom handling + */ + +/*- getAtoms: intern atoms -*/ +static void +getAtoms(kpw) +KinputProtocolWidget kpw; +{ + Display *dpy = XtDisplay((Widget)kpw); + char buf[256]; + + (void)sprintf(buf, "_%s_CONVERSION", kpw->kinput.language); + kpw->kinput.convAtom = XInternAtom(dpy, buf, False); + if (kpw->kinput.backward_compatible) { + (void)sprintf(buf, "%s_CONVERSION", kpw->kinput.language); + kpw->kinput.oldConvAtom = XInternAtom(dpy, buf, False); + } else { + kpw->kinput.oldConvAtom = None; + } + + kpw->kinput.ctextAtom = XA_COMPOUND_TEXT(dpy); + +#define MAKEATOM(s) XInternAtom(dpy, s, False) + + kpw->kinput.convStringAtom = MAKEATOM("CONVERSION_STRING"); + kpw->kinput.convNotifyAtom = MAKEATOM("CONVERSION_NOTIFY"); + kpw->kinput.convEndAtom = MAKEATOM("CONVERSION_END"); + + (void)sprintf(buf, "%s_CONVERSION_VERSION", kpw->kinput.language); + kpw->kinput.convVersionAtom = XInternAtom(dpy, buf, False); + kpw->kinput.convInitialTypeAtom = MAKEATOM("CONVERSION_INITIAL_TYPE"); + kpw->kinput.convOpenNotifyAtom = MAKEATOM("CONVERSION_OPEN_NOTIFY"); + kpw->kinput.convXYRequestAtom = MAKEATOM("CONVERSION_XY_REQUEST"); + kpw->kinput.convFontsRequestAtom = MAKEATOM("CONVERSION_FONTS_REQUEST"); + kpw->kinput.convColorRequestAtom = MAKEATOM("CONVERSION_COLOR_REQUEST"); + kpw->kinput.convCloseNotifyAtom = MAKEATOM("CONVERSION_CLOSE_NOTIFY"); + kpw->kinput.convAttributeAtom = MAKEATOM("CONVERSION_ATTRIBUTE"); + kpw->kinput.xlcStatusAtom = MAKEATOM("_XLC_STATUS"); + kpw->kinput.xlcOnTheSpotAtom = MAKEATOM("_XLC_ON_THE_SPOT"); + kpw->kinput.xlcBcModifierAtom = MAKEATOM("_XLC_BC_MODIFIER"); + kpw->kinput.xlcBcKeycodeAtom = MAKEATOM("_XLC_BC_KEYCODE"); + + /* + * some of the clients who speak Xlc protocol check the existence + * of atom "CONVERSION_REQUEST" before starting conversion. + * so make it at initialization time. + */ + (void)MAKEATOM("CONVERSION_REQUEST"); + +#undef MAKEATOM +} + +/*- ownSelection: own conversion selection -*/ +static Boolean +ownSelection(kpw) +KinputProtocolWidget kpw; +{ + Display *dpy = XtDisplay((Widget)kpw); + Window w = XtWindow((Widget)kpw); + Boolean res; + + TRACE(("kinputProtocol:ownSelection()\n")); + XSetSelectionOwner(dpy, kpw->kinput.convAtom, w, CurrentTime); + /* $B0l1~(B SetSelectionOwner $B$7$?8e(B GetSelectionOwner $B$7$F$_$F3N$+$a$k(B */ + res = XGetSelectionOwner(XtDisplay((Widget)kpw), kpw->kinput.convAtom) == w; + + if (kpw->kinput.backward_compatible) { + XSetSelectionOwner(dpy, kpw->kinput.oldConvAtom, w, CurrentTime); + } + + return res; +} + +/* + *+ client data handling + */ + +/*- findClient: get clientdata of given client -*/ +static ConvClient * +findClient(kpw, client) +KinputProtocolWidget kpw; +Window client; +{ + register ConvClient *ccp = kpw->kinput.clients; + + while (ccp != NULL) { + if (ccp->reqwin == client) return ccp; + ccp = ccp->next; + } + + return NULL; +} + +/*- newClient: get a clientdata for new client -*/ +static ConvClient * +newClient(kpw, client, selection) +KinputProtocolWidget kpw; +Window client; +Atom selection; +{ + ConvClient *ccp; + + ccp = XtNew(ConvClient); + ccp->protocol = unresolved_protocol; + ccp->style = separate_style; /* default */ + ccp->protocolwidget = (Widget)kpw; + ccp->conversion = NULL; + ccp->reqwin = client; + ccp->selection = selection; + ccp->target = None; + ccp->property = None; + ccp->esm = ESMethodNone; + ccp->data = NULL; + ccp->attrmask = 0L; + ccp->validattrmask = 0L; + ccp->start_proc = NULL; + ccp->detach_proc = NULL; + ccp->fix_proc = NULL; + ccp->end_proc = NULL; + ccp->free_resources = NULL; + + ccp->next = kpw->kinput.clients; + kpw->kinput.clients = ccp; + + return ccp; +} + +/*- attachConverter: attach converter to the client -*/ +static Widget +attachConverter(ccp) +ConvClient *ccp; +{ + WidgetClass class; + KinputProtocolWidget kpw = (KinputProtocolWidget)ccp->protocolwidget; + + if (ccp->conversion != NULL) return ccp->conversion; + + if (ccp->protocol == unresolved_protocol) { + ccp->protocol = kinput1_protocol; + ccp->style = separate_style; + } + + if (ccp->style == overthespot_style) { + class = overTheSpotConversionWidgetClass; + } else if (ccp->style == offthespot_style) { + class = offTheSpotConversionWidgetClass; + } else { + class = separateConversionWidgetClass; + } + + ccp->conversion = CMGetConverter(XtParent(ccp->protocolwidget), + ccp->reqwin, class, + kpw->kinput.inputObjClass, + kpw->kinput.displayObjClass); + + return ccp->conversion; +} + +/*- detachConverter: detach converter from client -*/ +static void +detachConverter(ccp) +ConvClient *ccp; +{ + TRACE(("detachConverter(window=0x%lx)\n", ccp->reqwin)); + + XtRemoveCallback(ccp->conversion, XtNtextCallback, + fixCallback, (XtPointer)ccp); + XtRemoveCallback(ccp->conversion, XtNendCallback, + endCallback, (XtPointer)ccp); + + /* call additional detach proc */ + if (ccp->detach_proc != NULL) (*ccp->detach_proc)(ccp); + + CMReleaseConverter(XtParent(ccp->protocolwidget), ccp->conversion); + ccp->conversion = NULL; +} + +/*- jinputDetach: jinput protocol specific detach processing -*/ +static void +jinputDetach(client) +ConvClient *client; +{ + XtRemoveCallback(client->conversion, XtNnewTextCallback, + jinputNewTextCallback, (XtPointer)client); +} + +/*- deleteClient: delete specified client -*/ +static void +deleteClient(client) +ConvClient *client; +{ + KinputProtocolWidget kpw = (KinputProtocolWidget)client->protocolwidget; + ConvClient *ccp, *ccp0; + + TRACE(("deleteClient(window=0x%lx)\n", client->reqwin)); + if (client->conversion != NULL) detachConverter(client); + if (client->free_resources != NULL) (*client->free_resources)(client); + + for (ccp = kpw->kinput.clients, ccp0 = NULL; + ccp != NULL; + ccp0 = ccp, ccp = ccp->next) { + if (ccp == client) { + if (ccp0 == NULL) { + kpw->kinput.clients = ccp->next; + } else { + ccp0->next = ccp->next; + } + XtFree((char *)client); + return; + } + } + DPRINT(("deleteClient: cannot find the client in the client list!\n")); +} + +/* + *+ utility functions + */ + +/*- isCorrectClientEvent: is the event in correct format? -*/ +static Boolean +isCorrectClientEvent(kpw, event) +KinputProtocolWidget kpw; +XEvent *event; +{ + XClientMessageEvent *ev = &(event->xclient); + Atom atom = (Atom)ev->data.l[0]; + + return (ev->window == XtWindow((Widget)kpw) && + ev->format == 32 && + (atom == kpw->kinput.convAtom || + kpw->kinput.backward_compatible && atom == kpw->kinput.oldConvAtom)); +} + +/*- isCorrectWindowID: is the given window ID valid? -*/ +static Boolean +isCorrectWindowID(w, window) +Widget w; +Window window; +{ + int status; + Window root; + int x, y; + unsigned int width, height, bwidth, depth; + XAEHandle h; + + /* + * previous version uses XGetWindowAttributes(), which + * issues both GetWindowAttributes and GetGeometry request. + * since it is a bit inefficient to issue two requests just + * for checking if a window exists, I've changed to use + * XGetGeometry which issues only GetGeometry. + */ + h = XAESetIgnoreErrors(XtDisplay(w)); + status = XGetGeometry(XtDisplay(w), window, &root, &x, &y, + &width, &height, &bwidth, &depth); + XAEUnset(h); + return status == 0 ? False : True; +} + +/*- myStartConversion: custom version of CControlStartConversion -*/ +static void +myStartConversion(w, clwin, mask, attrs) +Widget w; +Window clwin; +unsigned long mask; +ConversionAttributes *attrs; +{ + if (mask & CAFonts) { + mask |= CAStatusFonts; + attrs->status_fonts = attrs->fonts; + attrs->num_status_fonts = attrs->num_fonts; + } else { + mask &= ~CAStatusFonts; + } + CControlStartConversion(w, clwin, mask, attrs); +} + +/*- myChangeAttributes: custom version of CControlChangeAttributes -*/ +static void +myChangeAttributes(w, mask, attrs) +Widget w; +unsigned long mask; +ConversionAttributes *attrs; +{ + if (mask & CAFonts) { + mask |= CAStatusFonts; + attrs->status_fonts = attrs->fonts; + attrs->num_status_fonts = attrs->num_fonts; + } else { + mask &= ~CAStatusFonts; + } + CControlChangeAttributes(w, mask, attrs); +} + +/*- getJinputInitialProperty: get property for jinput protocol and set data -*/ +static void +getJinputInitialProperty(kpw, ccp, prop, reqtype) +KinputProtocolWidget kpw; +ConvClient *ccp; +Atom prop; +Atom reqtype; +{ + Atom type; + int format; + unsigned long nitems; + long *data; + unsigned long bytesafter; + JinputData *jdp = (JinputData *)ccp->data; + + XGetWindowProperty(XtDisplay((Widget)kpw), ccp->reqwin, prop, 0L, 11L, + False, reqtype, &type, &format, &nitems, + &bytesafter, (unsigned char **)&data); + + if (type != reqtype) { + DPRINT(("getJinputInitialProperty(): unknown property type (%ld)\n", type)); + return; + } + + /* data[0]: version number */ + if (data[0] != JINPUT_PROTOCOL_VERSION) { + DPRINT(("getJinputInitialProperty(): unknown version (0x%lx)\n", data[0])); + return; + } + /* data[1]: requestor window */ + if (data[1] != ccp->reqwin) { + return; + } + /* data[2]: preedit type */ + if (data[2] == 3) { + /* over-the-spot */ + ccp->style = overthespot_style; + } else { + ccp->style = separate_style; + } + /* data[3]: fold mode (ignore) */ + /* data[4]: clip mode (ignore) */ + /* data[5]: multi color mode */ + if (data[5] == 0) { + /* fixed color */ + ccp->attrmask |= CAColor; + /* data[6]: background */ + ccp->attrs.background = data[6]; + /* data[7]: foreground */ + ccp->attrs.foreground = data[7]; + } else { + /* query */ + DPRINT(("getJinputInitialProperty(): multi-color mode\n")); + jdp->state |= JINPUT_MULTI_COLOR; + } + /* data[8]: multi font mode */ + if (data[8] == 0) { + ccp->attrmask |= CAFonts; + ccp->attrs.num_fonts = 2; + ccp->attrs.fonts = (XFontStruct **)XtMalloc(sizeof(XFontStruct *) * 2); + /* data[9]: font1 */ + ccp->attrs.fonts[0] = XQueryFont(XtDisplay((Widget)kpw), + (XID)data[9]); /* should make it safe */ + /* data[10]: font2 */ + ccp->attrs.fonts[1] = XQueryFont(XtDisplay((Widget)kpw), + (XID)data[10]); + } else { + /* query */ + TRACE(("getJinputInitialProperty(): multi-font mode\n")); + jdp->state |= JINPUT_MULTI_FONT; + } +} + +/*- jinputSendReq: jinput protocol specific startup processing -*/ +static void +jinputSendReq(client) +ConvClient *client; +{ + JinputData *jdp = (JinputData *)client->data; + + XtAddCallback(client->conversion, XtNnewTextCallback, + jinputNewTextCallback, (XtPointer)client); + + if (jdp->state & JINPUT_MULTI_COLOR) sendColorRequest(client); + if (jdp->state & JINPUT_MULTI_FONT) sendFontRequest(client); + if (client->style != separate_style) sendXYRequest(client); +} + +/*- jinputFreeResources: free resources for jinput protocol client -*/ +static void +jinputFreeResources(client) +ConvClient *client; +{ + XtFree(client->data); + if (client->attrmask & CAFonts) { + /* free fonts */ + XFreeFontInfo((char **)NULL, client->attrs.fonts[0], 1); + XFreeFontInfo((char **)NULL, client->attrs.fonts[1], 1); + XtFree((char *)client->attrs.fonts); + } +} + +/*- xlcFreeResources: free resources for xlc protocol client -*/ +static void +xlcFreeResources(client) +ConvClient *client; +{ + if (client->validattrmask & CAFonts) { + /* free fonts */ + XFreeFontInfo((char **)NULL, client->attrs.fonts[0], 1); + XFreeFontInfo((char **)NULL, client->attrs.fonts[1], 1); + XtFree((char *)client->attrs.fonts); + } +} + +/*- kinput2FreeResources: free resources for kinput2 protocol client -*/ +static void +kinput2FreeResources(client) +ConvClient *client; +{ + if (client->attrmask & CAFonts) { /* free fonts */ + Cardinal i; + for (i = 0; i < client->attrs.num_fonts; i++) { + CachedFreeFont(XtDisplay(client->protocolwidget), + client->attrs.fonts[i]); + } + XtFree((char *)client->attrs.fonts); + } +} + +struct proprec { + Atom prop; + struct proprec *prev; +}; + +/*- setAttribute: set conversion attribute (kinput2 only) -*/ +static void +setAttribute(client, data, precp, fromevent) +ConvClient *client; +unsigned long *data; +struct proprec *precp; /* to prevent possible inifinite loop */ +Boolean fromevent; +{ + int code = CODE_OF_ATTR(*data); + int len = LENGTH_OF_ATTR(*data); + +#define CHECK_LENGTH(num, name) \ + if (len != num) { DPRINT(("\tlength of %s attribute is wrong\n", name)); break; } + + TRACE(("setAttribute()\n")); + data++; + switch (code) { + case CONVATTR_NONE: + TRACE(("\tNone:\n")); + break; + case CONVATTR_INDIRECT: + CHECK_LENGTH(1, "IndirectAttribute"); + TRACE(("\tIndirectAttribute:\n")); + getAttributeFromProperty1(client, data[0], precp, fromevent); + break; + case CONVATTR_FOCUS_WINDOW: + CHECK_LENGTH(1, "FocusWindow"); + client->attrmask |= CAFocusWindow; + client->attrs.focuswindow = data[0]; + TRACE(("\tFocusWindow: 0x%lx\n", data[0])); + break; + case CONVATTR_SPOT_LOCATION: + CHECK_LENGTH(1, "SpotLocation"); + client->attrmask |= CASpotLocation; + client->attrs.spotx = UPPER16S(data[0]); + client->attrs.spoty = LOWER16S(data[0]); + TRACE(("\tSpotLocation: x=%d, y=%d\n", client->attrs.spotx, client->attrs.spoty)); + break; + case CONVATTR_CLIENT_AREA: + CHECK_LENGTH(2, "ClientArea"); + client->attrmask |= CAClientArea; + client->attrs.clientarea.x = UPPER16S(data[0]); + client->attrs.clientarea.y = LOWER16S(data[0]); + client->attrs.clientarea.width = UPPER16U(data[1]); + client->attrs.clientarea.height = LOWER16U(data[1]); + TRACE(("\tClientArea: %d,%d-%d,%d\n", client->attrs.clientarea.x,client->attrs.clientarea.y,client->attrs.clientarea.width,client->attrs.clientarea.height)); + break; + case CONVATTR_STATUS_AREA: + CHECK_LENGTH(2, "StatusArea"); + client->attrmask |= CAStatusArea; + client->attrs.statusarea.x = UPPER16S(data[0]); + client->attrs.statusarea.y = LOWER16S(data[0]); + client->attrs.statusarea.width = UPPER16U(data[1]); + client->attrs.statusarea.height = LOWER16U(data[1]); + TRACE(("\tStatusArea: %d,%d-%d,%d\n", client->attrs.statusarea.x,client->attrs.statusarea.y,client->attrs.statusarea.width,client->attrs.statusarea.height)); + break; + case CONVATTR_COLORMAP: + CHECK_LENGTH(1, "Colormap"); + client->attrmask |= CAColormap; + client->attrs.colormap = data[0]; + TRACE(("\tColormap: 0x%lx\n", data[0])); + break; + case CONVATTR_COLOR: + CHECK_LENGTH(2, "Color"); + client->attrmask |= CAColor; + client->attrs.foreground = data[0]; + client->attrs.background = data[1]; + TRACE(("\tColor: fg=%ld,bg=%ld\n", data[0], data[1])); + break; + case CONVATTR_BACKGROUND_PIXMAP: + CHECK_LENGTH(1, "BackgroundPixmap"); + client->attrmask |= CABackgroundPixmap; + client->attrs.background_pixmap = data[0]; + TRACE(("\tBackgroundPixmap: 0x%lx\n", data[0])); + break; + case CONVATTR_LINE_SPACING: + CHECK_LENGTH(1, "LineSpacing"); + client->attrmask |= CALineSpacing; + client->attrs.linespacing = data[0]; + TRACE(("\tLineSpacing: %ld\n", data[0])); + break; + case CONVATTR_FONT_ATOMS: + if (len < 1) { + DPRINT(("length of FontAtoms attribute is less than 1\n")); + break; + } + if (client->attrmask & CAFonts) { + /* fonts set more than once -- free previously specified fonts */ + Cardinal i; + for (i = 0; i < client->attrs.num_fonts; i++) { + CachedFreeFont(XtDisplay(client->protocolwidget), + client->attrs.fonts[i]); + } + XtFree((char *)client->attrs.fonts); + } + client->attrmask |= CAFonts; + client->attrs.num_fonts = + getFontsByFontAtoms(XtDisplay(client->protocolwidget), + (Atom *)data, (Cardinal)len, + &client->attrs.fonts); + break; + case CONVATTR_CURSOR: + CHECK_LENGTH(1, "Cursor"); + client->attrmask |= CACursor; + client->attrs.cursor = data[0]; + TRACE(("\tCursor: 0x%lx\n", data[0])); + break; + case CONVATTR_INPUT_STYLE: + if (fromevent) { + DPRINT(("InputStyle can't change during conversion\n")); + break; + } + CHECK_LENGTH(1, "InputStyle"); + if (data[0] == CONVARG_OVERTHESPOT) { + client->style = overthespot_style; + } else if (data[0] == CONVARG_OFFTHESPOT) { + client->style = offthespot_style; + } else { + client->style = separate_style; + } + TRACE(("\tInputStyle: %ld\n", data[0])); + break; + case CONVATTR_EVENT_CAPTURE_METHOD: + if (fromevent) { + DPRINT(("EventCaptureMethod can't change during conversion\n")); + break; + } + CHECK_LENGTH(1, "EventCaptureMethod"); + if (data[0] == CONVARG_NONE) { + client->esm = ESMethodNone; + } else if (data[0] == CONVARG_SELECT_FOCUS_WINDOW) { + client->esm = ESMethodSelectFocus; + } else { + client->esm = ESMethodInputOnly; + } + TRACE(("\tEventCaptureMethod: %ld\n", data[0])); + break; + case CONVATTR_USE_EXTENSION: + if (fromevent) { + DPRINT(("UseExtension must be specified at conversion startup\n")); + break; + } + TRACE(("\tUseExtension: not supported\n")); + break; + default: + if (code > 255) { + /* private extension code */ + DPRINT(("\tPrivateExtension (code=%d): not supported\n", code)); + } + } +#undef CHECK_LENGTH +} + +/*- getFontsByFontAtoms: get fonts from 'FONT' atom list (kinput2 only) -*/ +static int +getFontsByFontAtoms(dpy, atoms, len, fontsp) +Display *dpy; +Atom *atoms; +Cardinal len; +XFontStruct *** fontsp; +{ + XFontStruct **fonts; + Cardinal nf, i; + + fonts = (XFontStruct **)XtMalloc(sizeof(XFontStruct *) * len); + for (nf = 0, i = 0; i < len; i++) { + if ((fonts[nf] = CachedLoadQueryFontByProp(dpy, atoms[i])) == NULL) { + TRACE(("\tcan't load font (atom=%ld)\n", atoms[i])); + } else { + TRACE(("\tfont loaded (atom=%ld)\n", atoms[i])); + nf++; + } + } + + *fontsp = fonts; + return nf; +} + +/*- safeGetAttributeProperty: get attribute property safely -*/ +static int +safeGetAttributeProperty(client, prop, data) +ConvClient *client; +Atom prop; +unsigned long **data; +{ + KinputProtocolWidget kpw = (KinputProtocolWidget)client->protocolwidget; + int err; + Atom type; + int format; + unsigned long nitems; + unsigned long bytesafter; + XAEHandle h; + + *data = NULL; + + h = XAESetIgnoreErrors(XtDisplay((Widget)kpw)); + err = XGetWindowProperty(XtDisplay((Widget)kpw), client->reqwin, prop, + 0L, 1000L, False, + kpw->kinput.convAttributeAtom, + &type, &format, &nitems, + &bytesafter, (unsigned char **)data); + XAEUnset(h); + + if (err) { + DPRINT(("\tcan't get property value. bad property (0x%lx)?\n", prop)); + return 0; + }else if (format != 32 || type != kpw->kinput.convAttributeAtom) { + DPRINT(("\twrong format or type\n")); + if (*data != NULL) XtFree((char *)*data); + return 0; + } + + TRACE(("safeGetAttributeProperty(): returns %ld\n", nitems)); + return nitems; +} + +/*- getAttributeFromProperty1: get and set attribute data (kinput2 only) -*/ +static void +getAttributeFromProperty1(client, prop, precp, fromevent) +ConvClient *client; +Atom prop; +struct proprec *precp; +Boolean fromevent; +{ + unsigned long *data, *datap; + int nitems; + struct proprec prec; + + prec.prop = prop; + prec.prev = precp; + + /* try to detect loop */ + while (precp != NULL) { + if (precp->prop == prop) { + DPRINT(("loop detected. property=0x%lx\n", prop)); + return; + } + precp = precp->prev; + } + + data = NULL; + if ((nitems = safeGetAttributeProperty(client, prop, &data)) <= 0) { + return; + } + + datap = data; + while (nitems > 0) { + int alen = LENGTH_OF_ATTR(datap[0]) + 1; /* 1 is for the header */ + + if (alen > nitems) break; + setAttribute(client, datap, &prec, fromevent); + nitems -= alen; + datap += alen; + } + XtFree((char *)data); +} + +/*- getAttributeFromProperty: get and set attribute data (kinput2 only) -*/ +static void +getAttributeFromProperty(client, prop) +ConvClient *client; +Atom prop; +{ + TRACE(("getAttributeFromProperty(reqwin=0x%lx, prop=%ld)\n", client->reqwin, prop)); + getAttributeFromProperty1(client, prop, (struct proprec *)NULL, False); +} + +/*- getAttributeFromEvent: set attribute data specified in an event (kinput2 only) -*/ +static void +getAttributeFromEvent(client, ev) +ConvClient *client; +XEvent *ev; +{ + XClientMessageEvent *event = &(ev->xclient); + unsigned long *data; + int alen; + + TRACE(("getAttributeFromEvent(client=0x%lx)\n", client->reqwin)); + + data = (unsigned long *)&(event->data.l[2]); + alen = LENGTH_OF_ATTR(data[0]); + if (alen >= 3) return; + + setAttribute(client, data, (struct proprec *)NULL, True); +} + +/*- getXlcDataFromProperty: get and set attribute data (xlc only) -*/ +static ConvClient * +getXlcDataFromProperty(kpw, client, initial) +KinputProtocolWidget kpw; +ConvClient *client; +Boolean initial; +{ + unsigned long *data; + Atom type; + int format; + unsigned long nitems; + unsigned long bytesafter; + int flag; + int err; + + TRACE(("getXlcDataFromProperty(initial=%d)\n", initial)); + data = NULL; + err = XGetWindowProperty(XtDisplay((Widget)kpw), XtWindow((Widget)kpw), + kpw->kinput.xlcOnTheSpotAtom, + 0L, 1000L, True, + kpw->kinput.xlcOnTheSpotAtom, + &type, &format, &nitems, + &bytesafter, (unsigned char **)&data); + + if (err) { + DPRINT(("\tcan't get property value\n")); + return NULL; + } else if (/* format != 32 || */ type != kpw->kinput.xlcOnTheSpotAtom) { + DPRINT(("\twrong format(%d) or type(%ld)\n", format, type)); + if (data != NULL) XtFree((char *)data); + return NULL; + } else if (nitems < 17) { + /* it seems that the current implementation of Xlc library + * (client-side library for XLC protocol) has a bug. + * it seems to set number of bytes instead of number of items + * when calling XChangeProperty(). + */ + DPRINT(("\twrong length (%ld)\n", nitems)); + return NULL; + } + + if (client == NULL) { + if ((client = findClient(kpw, (Window)data[1])) == NULL) { + TRACE(("\tcreate new client rec. for the window ID\n")); + /* check validity of the client window ID */ + if (!isCorrectWindowID(kpw, (Window)data[1])) { + DPRINT(("getXlcDataFromProperty(): client window doesn't exist\n")); + return NULL; + } + client = newClient(kpw, (Window)data[1], None); + client->protocol = xlc_protocol; + client->style = overthespot_style; + client->esm = ESMethodInputOnly; + client->end_proc = xlcEnd; + client->free_resources = xlcFreeResources; + MyAddEventHandler(XtDisplay((Widget)kpw), client->reqwin, + DestroyNotify, StructureNotifyMask, + ClientDead, (XtPointer)client); + initial = True; + } + } else { + if (data[1] != client->reqwin) { + DPRINT(("\twindow ID isn't the requestor window ID\n")); + return NULL; + } + } + TRACE(("\t%ld items read\n", nitems)); + + flag = data[0]; + if (flag & XLC_AUTO_REPLACE) { + /* set auto spot forwarding */ + /* XXX */ + TRACE(("\tauto spot forwarding\n")); + } + if (flag & XLC_ALL_INFORMATION) { + /* foreground / background colors */ + if (!initial && + (client->validattrmask & CAColor) && + client->attrs.foreground == data[5] && + client->attrs.background == data[6]) { + client->attrmask &= ~CAColor; + } else { + client->attrs.foreground = data[5]; + client->attrs.background = data[6]; + client->attrmask |= CAColor; + } + client->validattrmask |= CAColor; + TRACE(("\tColor: fg=%ld,bg=%ld\n", data[5], data[6])); + + /* fonts */ + if (data[7] == 0L || data[8] == 0L) { + /* invalid */ + if (client->validattrmask & CAFonts) { + XFreeFontInfo((char **)NULL, client->attrs.fonts[0], 1); + XFreeFontInfo((char **)NULL, client->attrs.fonts[2], 1); + XFree((char *)client->attrs.fonts); + client->validattrmask &= ~CAFonts; + } + client->attrmask &= ~CAFonts; + } else { + if (!initial && + (client->validattrmask & CAFonts) && + client->attrs.fonts[0]->fid == data[7] && + client->attrs.fonts[1]->fid == data[8]) { + client->attrmask &= ~CAFonts; + } else if (client->validattrmask & CAFonts) { + if (client->attrs.fonts[0]->fid != data[7]) { + XFreeFontInfo((char **)NULL, client->attrs.fonts[0], 1); + client->attrs.fonts[0] = XQueryFont(XtDisplay((Widget)kpw), + (XID)data[7]); + } + if (client->attrs.fonts[1]->fid != data[8]) { + XFreeFontInfo((char **)NULL, client->attrs.fonts[1], 1); + client->attrs.fonts[1] = XQueryFont(XtDisplay((Widget)kpw), + (XID)data[8]); + } + client->attrmask |= CAFonts; + } else { + client->attrs.num_fonts = 2; + client->attrs.fonts = + (XFontStruct **)XtMalloc(sizeof(XFontStruct *) * 2); + client->attrs.fonts[0] = XQueryFont(XtDisplay((Widget)kpw), + (XID)data[7]); + client->attrs.fonts[1] = XQueryFont(XtDisplay((Widget)kpw), + (XID)data[8]); + client->attrmask |= CAFonts; + } + client->validattrmask |= CAFonts; + TRACE(("\tFonts: 0x%lx, 0x%lx\n", data[7], data[8])); + } + } + if (flag & (XLC_ALL_INFORMATION | XLC_FRAME_INFORMATION)) { + /* frame (client area) */ + if (!initial && + (client->validattrmask & CAClientArea) && + client->attrs.clientarea.x == data[10] && + client->attrs.clientarea.y == data[11] && + client->attrs.clientarea.width == data[12] && + client->attrs.clientarea.height == data[13]) { + client->attrmask &= ~CAClientArea; + } else { + client->attrs.clientarea.x = data[10]; + client->attrs.clientarea.y = data[11]; + client->attrs.clientarea.width = data[12]; + client->attrs.clientarea.height = data[13]; + if (data[12] == 0 || data[13] == 0) { + client->attrmask &= ~CAClientArea; + } else { + client->attrmask |= CAClientArea; + } + } + client->validattrmask |= CAClientArea; + TRACE(("\tClientArea: %ld,%ld-%ld,%ld\n", + data[10],data[11],data[12],data[13])); + } + if (flag & (XLC_ALL_INFORMATION | XLC_FRAME_INFORMATION | XLC_OFFSET_INFORMATION)) { + /* spot location */ + client->attrmask |= CASpotLocation; /* always set spot location */ + client->attrs.spotx = data[14]; + client->attrs.spoty = data[15] + + ((client->validattrmask & CAFonts) ? + client->attrs.fonts[0]->ascent : kpw->kinput.defaultascent); + client->validattrmask |= CASpotLocation; + TRACE(("\tSpotLocation: x=%ld, y=%ld\n", data[14], data[15])); + + /* line spacing */ + if (!initial && + (client->validattrmask & CALineSpacing) && + client->attrs.linespacing == data[16]) { + client->attrmask &= ~CALineSpacing; + } else { + client->attrmask |= CALineSpacing; + client->attrs.linespacing = data[16]; + } + client->validattrmask |= CALineSpacing; + TRACE(("\tLineSpacing: %ld\n", data[16])); + } + + XtFree((char *)data); + return client; +} + +/*- initializeError: display error message when resource isn't specified -*/ +static void +initializeError(w, resname) +Widget w; +String resname; +{ + String params[2]; + Cardinal num_params; + + params[0] = XtClass(w)->core_class.class_name; + params[1] = resname; + num_params = 2; + XtAppErrorMsg(XtWidgetToApplicationContext(w), + "initializeError", "noResource", "WidgetError", + "%s: resource %s must be specified at widget creation", + params, &num_params); +} + +/*- parseKeyEvent: parses key event description and get keycode and modmask -*/ +static int +parseKeyEvent(dpy, s, codep, modmaskp) +Display *dpy; +char *s; +long *codep; +long *modmaskp; +{ + char *mod, *key; + char *p; + KeySym keysym; + char buf[128]; + + /* + * keyevent description (stored in argument 's') must be of the + * following format: + * modifier-listkeysym + * modifier-list is a combination of: + * Ctrl, Shift, Lock, Meta, Alt, Mod1, Mod2, Mod3, Mod4, Mod5 + */ + + strcpy(buf, s); + + /* find "" */ + if ((p = mystrstr(buf, "")) != NULL) { + key = p + 5; /* p + strlen("") */ + } else if ((p = mystrstr(buf, "")) != NULL) { + key = p + 10; /* p + strlen("") */ + } else if ((p = mystrstr(buf, "")) != NULL) { + key = p + 9; /* p + strlen("") */ + } else { + return 0; + } + mod = buf; + *p = '\0'; + + /* get modifier mask */ + *modmaskp = 0; + if (mystrstr(mod, "Shift")) *modmaskp |= ShiftMask; + if (mystrstr(mod, "Lock")) *modmaskp |= LockMask; + if (mystrstr(mod, "Ctrl")) *modmaskp |= ControlMask; + if (mystrstr(mod, "Mod1")) *modmaskp |= Mod1Mask; + if (mystrstr(mod, "Mod2")) *modmaskp |= Mod2Mask; + if (mystrstr(mod, "Mod3")) *modmaskp |= Mod3Mask; + if (mystrstr(mod, "Mod4")) *modmaskp |= Mod4Mask; + if (mystrstr(mod, "Mod5")) *modmaskp |= Mod5Mask; + if (mystrstr(mod, "Meta")) *modmaskp |= Mod1Mask; + if (mystrstr(mod, "Alt")) *modmaskp |= Mod1Mask; + + /* get keycode */ + if ((keysym = XStringToKeysym(key)) == NoSymbol) return 0; + if ((*codep = (long)XKeysymToKeycode(dpy, keysym)) == 0) return 0; + return 1; +} + +/*- mystrstr: not-so-good implementaion of ANSI strstr() -*/ +static char * +mystrstr(s1, s2) +char *s1; +char *s2; +{ + char *p, *q; + + while (*(p = s1++) != '\0') { + q = s2; + do { + if (*q == '\0') return s1 - 1; + } while (*p++ == *q++); + } + return NULL; +} + +/*- getDefaultFontHeight: get default font ascent (for xlc protocol) -*/ +static void +getDefaultFontHeight(kpw) +KinputProtocolWidget kpw; +{ + Widget obj; + + obj = XtCreateWidget("displayObj", kpw->kinput.displayObjClass, + (Widget)kpw, NULL, 0); + (void)CDLineHeight(obj, &kpw->kinput.defaultascent); + XtDestroyWidget(obj); +} + +/* + *+ property handling + */ + +/*- setJinputProperty: set version property for jinput protocol -*/ +static void +setJinputProperty(kpw) +KinputProtocolWidget kpw; +{ + long version; + + version = JINPUT_PROTOCOL_VERSION; + XChangeProperty(XtDisplay((Widget)kpw), XtWindow((Widget)kpw), + kpw->kinput.convVersionAtom, XA_INTEGER, 32, + PropModeReplace, (unsigned char *)&version, 1); +} + +/*- setKinput2Property: set version property for kinput2 protocol -*/ +static void +setKinput2Property(kpw) +KinputProtocolWidget kpw; +{ + Display *dpy = XtDisplay((Widget)kpw); + Atom property; + Atom type; + unsigned long profile[10]; + + property = XInternAtom(dpy, CONVERSION_PROFILE, False); + type = XInternAtom(dpy, CONVERSION_ATTRIBUTE_TYPE, False); + + profile[0] = CONV_ATTR(CONVPROF_PROTOCOL_VERSION, 1); + profile[1] = XInternAtom(dpy, PROTOCOL_VERSION, False); + profile[2] = CONV_ATTR(CONVPROF_SUPPORTED_STYLES, 1); + profile[3] = CONVARG_ROOTWINDOW|CONVARG_OFFTHESPOT|CONVARG_OVERTHESPOT; + + XChangeProperty(dpy, XtWindow((Widget)kpw), + property, type, 32, PropModeReplace, + (unsigned char *)profile, 4); +} + +/*- setXlcProperty: set initial status property for xlc protocol -*/ +static void +setXlcProperty(kpw) +KinputProtocolWidget kpw; +{ + setXlcStatusProperty(kpw, 0); + setXlcBCKey(kpw); +} + +/*- setXlcStatusProperty: set status property for xlc protocol -*/ +static void +setXlcStatusProperty(kpw, status) +KinputProtocolWidget kpw; +int status; +{ + XChangeProperty(XtDisplay((Widget)kpw), XtWindow((Widget)kpw), + kpw->kinput.xlcStatusAtom, XA_INTEGER, 32, + PropModeReplace, (unsigned char *)&status, 1); +} + +/*- setXlcBCKey: set conversion start key code property for xlc protocol -*/ +static void +setXlcBCKey(kpw) +KinputProtocolWidget kpw; +{ + long code; + long mask; + + if (kpw->kinput.xlcstartkey == NULL) return; + if (parseKeyEvent(XtDisplay((Widget)kpw), kpw->kinput.xlcstartkey, + &code, &mask) == 0) { + String params[1]; + Cardinal num_params; + + params[0] = XtClass((Widget)kpw)->core_class.class_name; + num_params = 1; + XtAppWarningMsg(XtWidgetToApplicationContext((Widget)kpw), + "parseError", XtNxlcConversionStartKey, "WidgetError", + "%s: can't parse coversion start key string", + params, &num_params); + return; + } + + TRACE(("setXlcBCKey(): keycode=%ld, mask=0x%lx\n", code, mask)); + + XChangeProperty(XtDisplay((Widget)kpw), XtWindow((Widget)kpw), + kpw->kinput.xlcBcModifierAtom, XA_INTEGER, 32, + PropModeReplace, (unsigned char *)&mask, 1); + XChangeProperty(XtDisplay((Widget)kpw), XtWindow((Widget)kpw), + kpw->kinput.xlcBcKeycodeAtom, XA_INTEGER, 32, + PropModeReplace, (unsigned char *)&code, 1); +} + +/* + *+ event sending + */ + +/*- sendClientMessage: send a clientmessage event -*/ +static void +sendClientMessage(dpy, window, type, l0, l1, l2, l3, l4) +Display *dpy; +Window window; +Atom type; +long l0, l1, l2, l3, l4; +{ + XEvent event; + + event.xclient.type = ClientMessage; + event.xclient.window = window; + event.xclient.message_type = type; + event.xclient.format = 32; + event.xclient.data.l[0] = l0; + event.xclient.data.l[1] = l1; + event.xclient.data.l[2] = l2; + event.xclient.data.l[3] = l3; + event.xclient.data.l[4] = l4; + + XSendEvent(dpy, window, False, NoEventMask, &event); +} + +/*- sendNegativeConversionNotify: send negative conversion-notify event -*/ +static void +sendNegativeConversionNotify(kpw, window, selection) +KinputProtocolWidget kpw; +Window window; +Atom selection; +{ + TRACE(("sendNegativeConversionNotify(window=0x%lx)\n", window)); + sendClientMessage(XtDisplay((Widget)kpw), window, + kpw->kinput.convNotifyAtom, + (long)selection, (long)None, 0L, 0L, 0L); +} + +/*- sendConversionNotify: send conversion-notify event -*/ +static void +sendConversionNotify(ccp) +ConvClient *ccp; +{ + KinputProtocolWidget kpw = (KinputProtocolWidget)ccp->protocolwidget; + long l4; + + TRACE(("sendConversionNotify(reqwin=0x%lx)\n", ccp->reqwin)); + if (ccp->protocol == xlc_protocol) { + l4 = (long)kpw->kinput.xlcOnTheSpotAtom; + } else { + l4 = 0L; + } + sendClientMessage(XtDisplay((Widget)kpw), ccp->reqwin, + kpw->kinput.convNotifyAtom, + (long)ccp->selection, (long)ccp->target, + (long)ccp->property, (long)XtWindow(ccp->conversion), + l4); +} + +/*- sendNegativeConversionOpenNotify: send negative conversion-open-notify event -*/ +static void +sendNegativeConversionOpenNotify(kpw, window, selection) +KinputProtocolWidget kpw; +Window window; +Atom selection; +{ + TRACE(("sendNegativeConversionOpenNotify(window=0x%lx)\n", window)); + sendClientMessage(XtDisplay((Widget)kpw), window, + kpw->kinput.convOpenNotifyAtom, + (long)selection, 0L, (long)XtWindow(kpw), 0L, 0L); +} + +/*- sendConversionOpenNotify: send conversion-open-notify event -*/ +static void +sendConversionOpenNotify(ccp) +ConvClient *ccp; +{ + KinputProtocolWidget kpw = (KinputProtocolWidget)ccp->protocolwidget; + + TRACE(("sendConversionOpenNotify(reqwin=0x%lx)\n", ccp->reqwin)); + sendClientMessage(XtDisplay((Widget)kpw), ccp->reqwin, + kpw->kinput.convOpenNotifyAtom, + (long)ccp->selection, JINPUT_PROTOCOL_VERSION, + (long)XtWindow((Widget)kpw), 1L, 0L); +} + +/*- sendColorRequest: send color-request event (jinput only) -*/ +static void +sendColorRequest(ccp) +ConvClient *ccp; +{ + KinputProtocolWidget kpw = (KinputProtocolWidget)ccp->protocolwidget; + + TRACE(("sendColorRequest(reqwin=0x%lx)\n", ccp->reqwin)); + sendClientMessage(XtDisplay((Widget)kpw), ccp->reqwin, + kpw->kinput.convColorRequestAtom, + (long)ccp->selection, JINPUT_PROTOCOL_VERSION, + (long)XtWindow((Widget)kpw), 0L, 0L); +} + +/*- sendFontRequest: send font-request event (jinput only) -*/ +static void +sendFontRequest(ccp) +ConvClient *ccp; +{ + KinputProtocolWidget kpw = (KinputProtocolWidget)ccp->protocolwidget; + + TRACE(("sendFontRequest(reqwin=0x%lx)\n", ccp->reqwin)); + sendClientMessage(XtDisplay((Widget)kpw), ccp->reqwin, + kpw->kinput.convFontsRequestAtom, + (long)ccp->selection, JINPUT_PROTOCOL_VERSION, + (long)XtWindow((Widget)kpw), 0L, 0L); +} + +/*- sendXYRequest: send XY-request event (jinput only) -*/ +static void +sendXYRequest(ccp) +ConvClient *ccp; +{ + KinputProtocolWidget kpw = (KinputProtocolWidget)ccp->protocolwidget; + + TRACE(("sendXYRequest(reqwin=0x%lx)\n", ccp->reqwin)); + sendClientMessage(XtDisplay((Widget)kpw), ccp->reqwin, + kpw->kinput.convXYRequestAtom, + (long)ccp->selection, JINPUT_PROTOCOL_VERSION, + (long)XtWindow((Widget)kpw), 0L, 0L); +} + +/* + *+ callback procedures + */ + +/*- fixCallback: fix callback -*/ +/* ARGSUSED */ +static void +fixCallback(w, client_data, call_data) +Widget w; +XtPointer client_data; +XtPointer call_data; +{ + CCTextCallbackArg *arg = (CCTextCallbackArg *)call_data; + ConvClient *ccp = (ConvClient *)client_data; + + TRACE(("fixCallback(reqwin=0x%lx, length=%d)\n",ccp->reqwin, arg->length)); + fixProc(ccp, arg); +} + +/*- fixProc: do actual fix processing -*/ +static void +fixProc(client, arg) +ConvClient *client; +CCTextCallbackArg *arg; +{ + /* Property $B$K7k2L$r%;%C%H$9$k(B */ + XChangeProperty(XtDisplay(client->conversion), client->reqwin, + client->property, arg->encoding, arg->format, + PropModeAppend, (unsigned char *)arg->text, arg->length); + + /* call protocol dependent proc */ + if (client->fix_proc != NULL) (*client->fix_proc)(client, arg); +} + +/*- jinputFix: jinput protocol specific fix processing -*/ +static void +jinputFix(client) +ConvClient *client; +{ + JinputData *jdp = (JinputData *)client->data; + + /* spotlocation information is no longer valid */ + client->attrmask &= ~CASpotLocation; + + if (jdp->state & JINPUT_MULTI_COLOR) sendColorRequest(client); + if (jdp->state & JINPUT_MULTI_FONT) sendFontRequest(client); + if (client->style != separate_style) sendXYRequest(client); +} + +/*- endCallback: conversion end callback -*/ +/* ARGSUSED */ +static void +endCallback(w, client_data, call_data) +Widget w; +XtPointer client_data; +XtPointer call_data; +{ + ConvClient *ccp = (ConvClient *)client_data; + int abort = (int)call_data; + + TRACE(("endCallback(reqwin=0x%lx,abort=%s)\n", ccp->reqwin, abort?"True":"False")); + endProc(ccp, abort); +} + +/*- endProc: conversion end processing -*/ +static void +endProc(client, abort) +ConvClient *client; +int abort; +{ + KinputProtocolWidget kpw = (KinputProtocolWidget)client->protocolwidget; + + if (!abort) { + /* $B%/%i%$%"%s%H$K(B ClientMessage $B$rAw$C$FCN$i$;$k(B + * $B%$%Y%s%H$N%U%)!<%^%C%H$O!"(B + * window: requestor window + * message_type: "CONVERSION_END" + * format: 32 + * data.l[0]: selection + * data.l[1]: selection-owner window + */ + sendClientMessage(XtDisplay((Widget)kpw), client->reqwin, + kpw->kinput.convEndAtom, + (long)client->selection, (long)XtWindow((Widget)kpw), + 0L, 0L, 0L); + } + if (client->conversion != NULL) { + XtRemoveCallback(client->conversion, XtNtextCallback, + fixCallback, (XtPointer)client); + XtRemoveCallback(client->conversion, XtNendCallback, + endCallback, (XtPointer)client); + } + + /* call protocol dependent proc */ + if (client->end_proc != NULL) { + (*client->end_proc)(client, abort); + } else { + deleteClient(client); + } +} + +/*- jinputEnd: jinput specific conversion end processing -*/ +/* ARGSUSED */ +static void +jinputEnd(client, abort) +ConvClient *client; +Boolean abort; /* UNUSED */ +{ + /* don't delete client until CONVERSION_CLOSE_REQUEST or client dead */ + detachConverter(client); + + client->attrmask &= ~CASpotLocation; +} + +/*- jinputNewTextCallback: jinput protocol specific new text callback -*/ +/* ARGSUSED */ +static void +jinputNewTextCallback(w, client_data, call_data) +Widget w; +XtPointer client_data; +XtPointer call_data; +{ + ConvClient *ccp = (ConvClient *)client_data; + + TRACE(("jinputNewTextCallback(reqwin=0x%lx)\n",ccp->reqwin)); + if (ccp->style != separate_style) sendXYRequest(ccp); +} + +/*- xlcEnd: xlc specific conversion end processing -*/ +/* ARGSUSED */ +static void +xlcEnd(client, abort) +ConvClient *client; +Boolean abort; /* UNUSED */ +{ + /* don't delete client until CONVERSION_CLOSE or client dead */ + detachConverter(client); + + client->attrmask &= ~CASpotLocation; +} + +/* + *+ ClientMessage event handler + */ + +/*- ConversionOpenRequestProc: CONVERSION_OPEN_REQUEST event handler -*/ +/* ARGSUSED */ +static void +ConversionOpenRequestProc(w, event, args, num_args) +Widget w; +XEvent *event; +String *args; +Cardinal *num_args; +{ + KinputProtocolWidget kpw = (KinputProtocolWidget)w; + XClientMessageEvent *ev = &event->xclient; + int version; + Window reqwin; + Atom convatom; + Atom initproperty; + Atom initpropertytype; + ConvClient *ccp; + JinputData *jdp; + + TRACE(("ConversionOpenRequestProc(window=0x%lx)\n", ev->data.l[2])); + /* is it a correct event? */ + if (!isCorrectClientEvent(kpw, event)) { + /*ignore */ + DPRINT(("got invalid clientmessage event.\n")); + return; + } + + convatom = (Atom)ev->data.l[0]; + version = ev->data.l[1]; + reqwin = (Window)ev->data.l[2]; + initproperty = ev->data.l[3]; + initpropertytype = ev->data.l[4]; + + /* check the protocol version & initial property type */ + /* also check if the client already opened connection */ + if (version != JINPUT_PROTOCOL_VERSION || + initpropertytype != kpw->kinput.convInitialTypeAtom || + findClient(kpw, reqwin) != NULL) { + DPRINT(("ConversionOpenRequestProc(): open denied\n")); + sendNegativeConversionOpenNotify(kpw, reqwin, convatom); + return; + } + /* check validity of the client window ID */ + if (!isCorrectWindowID(w, reqwin)) { + DPRINT(("ConversionOpenRequestProc(): requestor window doesn't exist\n")); + /* nothing to do */ + return; + } + + ccp = newClient(kpw, reqwin, convatom); + ccp->protocol = jinput_protocol; + ccp->esm = ESMethodInputOnly; + ccp->start_proc = jinputSendReq; + ccp->detach_proc = jinputDetach; + ccp->fix_proc = jinputFix; + ccp->end_proc = jinputEnd; + ccp->free_resources = jinputFreeResources; + jdp = XtNew(JinputData); + jdp->state = 0; + ccp->data = (XtPointer)jdp; + + getJinputInitialProperty(kpw, ccp, initproperty, initpropertytype); + + /* watch for client destroy */ + MyAddEventHandler(XtDisplay(w), reqwin, DestroyNotify, StructureNotifyMask, + ClientDead, (XtPointer)ccp); + + sendConversionOpenNotify(ccp); +} + +/*- ConversionRequestProc: CONVERSION_REQUEST event handler -*/ +/* ARGSUSED */ +static void +ConversionRequestProc(w, event, args, num_args) +Widget w; +XEvent *event; +String *args; +Cardinal *num_args; +{ + KinputProtocolWidget kpw = (KinputProtocolWidget)w; + XClientMessageEvent *ev = &event->xclient; + Window reqwin; + Atom convatom; + Atom prop; + ConvClient *ccp; + + TRACE(("ConversionRequestProc(window=0x%lx)\n", ev->data.l[1])); + /* is it a correct event? */ + if (!isCorrectClientEvent(kpw, event)) { + /*ignore */ + DPRINT(("got invalid clientmessage event.\n")); + return; + } + + convatom = (Atom)ev->data.l[0]; + reqwin = (Window)ev->data.l[1]; + prop = (Atom)ev->data.l[4]; + TRACE(("\tatom=0x%lx, reqwin=0x%lx\n", convatom, reqwin)); + + if ((ccp = findClient(kpw, reqwin)) == NULL) { + /* check validity of the client window ID */ + if (!isCorrectWindowID(w, reqwin)) { + DPRINT(("ConversionRequestProc(): requestor window doesn't exist\n")); + /* nothing to do */ + return; + } + ccp = newClient(kpw, reqwin, convatom); + if (prop == kpw->kinput.xlcOnTheSpotAtom) { + /* xlc protocol */ + TRACE(("\txlc protocol\n")); + if (getXlcDataFromProperty(kpw, ccp, True)) { + ccp->protocol = xlc_protocol; + ccp->style = overthespot_style; + ccp->esm = ESMethodInputOnly; + ccp->end_proc = xlcEnd; + ccp->free_resources = xlcFreeResources; + MyAddEventHandler(XtDisplay(w), reqwin, + DestroyNotify, StructureNotifyMask, + ClientDead, (XtPointer)ccp); + } else { + TRACE(("\tchanged to kinput protocol\n")); + ccp->protocol = kinput1_protocol; + ccp->style = separate_style; + ccp->esm = ESMethodInputOnly; + } + } else if (prop != None) { + /* kinput2 protocol */ + TRACE(("\tkinput2 protocol\n")); + ccp->protocol = kinput2_protocol; + ccp->style = separate_style; + ccp->esm = ESMethodInputOnly; + ccp->free_resources = kinput2FreeResources; + /* ccp->fix_proc = sendKeyCode0 */ + getAttributeFromProperty(ccp, prop); + } else { + /* old protocol */ + ccp->protocol = kinput1_protocol; + ccp->style = separate_style; + ccp->esm = ESMethodInputOnly; + } + } else if (ccp->conversion != NULL) { + /* now converting */ + if (ccp->protocol == xlc_protocol) { + /* + * xlc protocol uses CONVERSION_REQUEST event to notify + * the frontend of changing conversion attribute + */ + return; + } + sendNegativeConversionNotify(kpw, reqwin, convatom); + return; + } else if (ccp->protocol == xlc_protocol) { + if (prop == kpw->kinput.xlcOnTheSpotAtom) { + /* reread property before starting conversion */ + (void)getXlcDataFromProperty(kpw, ccp, False); + } + } + + /* set convatom */ + if (ccp->selection == None) ccp->selection = convatom; + + if (attachConverter(ccp) == NULL) { + sendNegativeConversionNotify(kpw, reqwin, convatom); + return; + } + + /* set target type (ignore client's request) */ + ccp->target = kpw->kinput.ctextAtom; + + /* use default property if not specified */ + if ((ccp->property = ev->data.l[3]) == None) { + ccp->property = kpw->kinput.convStringAtom; + } + + XtAddCallback(ccp->conversion, XtNtextCallback, + fixCallback, (XtPointer)ccp); + XtAddCallback(ccp->conversion, XtNendCallback, + endCallback, (XtPointer)ccp); + + /* startup the conversion window */ + XtVaSetValues(ccp->conversion, XtNeventSelectMethod, ccp->esm, NULL); + myStartConversion(ccp->conversion, ccp->reqwin, + ccp->attrmask, &ccp->attrs); + + /* send ConversionNotify to the client */ + sendConversionNotify(ccp); + + if (ccp->start_proc != NULL) (*ccp->start_proc)(ccp); +} + +/*- ConversionEndRequestProc: CONVERSION_END_REQUEST event handler -*/ +/* ARGSUSED */ +static void +ConversionEndRequestProc(w, event, args, num_args) +Widget w; +XEvent *event; +String *args; +Cardinal *num_args; +{ + KinputProtocolWidget kpw = (KinputProtocolWidget)w; + XClientMessageEvent *ev = &event->xclient; + Window reqwin; + ConvClient *ccp; + + TRACE(("ConversionEndRequestProc(window=0x%lx)\n", ev->data.l[1])); + /* is it a correct event? */ + if (!isCorrectClientEvent(kpw, event)) { + /*ignore */ + DPRINT(("got invalid clientmessage event.\n")); + return; + } + + reqwin = (Window)ev->data.l[1]; + if ((ccp = findClient(kpw, reqwin)) == NULL) { + /* request from unknown client. just ignore */ + DPRINT(("got conversion end request from unknown window\n")); + return; + } + + if (ccp->conversion != NULL) { + CControlEndConversion(ccp->conversion); + endProc(ccp, False); + } +} + +/*- ConversionCloseRequestProc: CONVERSION_CLOSE_REQUEST event handler (jinput only) -*/ +/* ARGSUSED */ +static void +ConversionCloseRequestProc(w, event, args, num_args) +Widget w; +XEvent *event; +String *args; +Cardinal *num_args; +{ + KinputProtocolWidget kpw = (KinputProtocolWidget)w; + XClientMessageEvent *ev = &event->xclient; + Window reqwin; + ConvClient *ccp; + + TRACE(("ConversionCloseRequestProc(window=0x%lx)\n", ev->data.l[2])); + /* is it a correct event? */ + if (!isCorrectClientEvent(kpw, event)) { + /*ignore */ + DPRINT(("got invalid clientmessage event.\n")); + return; + } + if (ev->data.l[1] != JINPUT_PROTOCOL_VERSION) { + /* wrong version number */ + DPRINT(("ConversionCloseRequestProc(): unknown version number (0x%lx)\n", ev->data.l[1])); + return; + } + reqwin = ev->data.l[2]; + if ((ccp = findClient(kpw, reqwin)) == NULL) { + /* request from unknown client. just ignore */ + DPRINT(("got conversion end request from unknown window\n")); + return; + } + if (ccp->protocol != jinput_protocol) { + DPRINT(("got jinput-specific event from a client that use other protocol\n")); + return; + } + + MyRemoveEventHandler(XtDisplay(w), reqwin, DestroyNotify, + ClientDead, (XtPointer)ccp); + + deleteClient(ccp); +} + +/*- ConversionXYNotifyProc: CONVERSION_XY_NOTIFY event handler (jinput only) -*/ +/* ARGSUSED */ +static void +ConversionXYNotifyProc(w, event, args, num_args) +Widget w; +XEvent *event; +String *args; +Cardinal *num_args; +{ + KinputProtocolWidget kpw = (KinputProtocolWidget)w; + XClientMessageEvent *ev = &event->xclient; + Window reqwin; + ConvClient *ccp; + JinputData *jdp; + + TRACE(("ConversionXYNotifyProc(window=0x%lx)\n", ev->data.l[2])); + /* is it a correct event? */ + if (!isCorrectClientEvent(kpw, event)) { + /*ignore */ + DPRINT(("got invalid clientmessage event.\n")); + return; + } + if (ev->data.l[1] != JINPUT_PROTOCOL_VERSION) { + /* wrong version number */ + DPRINT(("ConversionXYNotifyProc(): unknown version number (0x%lx)\n", ev->data.l[1])); + return; + } + reqwin = ev->data.l[2]; + if ((ccp = findClient(kpw, reqwin)) == NULL) { + /* request from unknown client. just ignore */ + DPRINT(("got conversion end request from unknown window\n")); + return; + } + if (ccp->protocol != jinput_protocol) { + DPRINT(("got jinput-specific event from a client that use other protocol\n")); + return; + } + jdp = (JinputData *)ccp->data; + jdp->rawspotx = ev->data.l[3]; + jdp->rawspoty = ev->data.l[4]; + + ccp->attrmask |= CASpotLocation; + ccp->attrs.spotx = jdp->rawspotx; + ccp->attrs.spoty = jdp->rawspoty + + ((ccp->attrmask & CAFonts) ? ccp->attrs.fonts[0]->ascent : 0); + + if (ccp->conversion != NULL) { + myChangeAttributes(ccp->conversion, CASpotLocation, &ccp->attrs); + } +} + +/*- ConversionColorNotifyProc: CONVERSION_COLOR_NOTIFY event handler (jinput only) -*/ +/* ARGSUSED */ +static void +ConversionColorNotifyProc(w, event, args, num_args) +Widget w; +XEvent *event; +String *args; +Cardinal *num_args; +{ + KinputProtocolWidget kpw = (KinputProtocolWidget)w; + XClientMessageEvent *ev = &event->xclient; + Window reqwin; + ConvClient *ccp; + + TRACE(("ConversionColorNotifyProc(window=0x%lx)\n", ev->data.l[2])); + /* is it a correct event? */ + if (!isCorrectClientEvent(kpw, event)) { + /*ignore */ + DPRINT(("got invalid clientmessage event.\n")); + return; + } + if (ev->data.l[1] != JINPUT_PROTOCOL_VERSION) { + /* wrong version number */ + DPRINT(("ConversionColorNotifyProc(): unknown version number (0x%lx)\n", ev->data.l[1])); + return; + } + reqwin = ev->data.l[2]; + if ((ccp = findClient(kpw, reqwin)) == NULL) { + /* request from unknown client. just ignore */ + DPRINT(("got conversion end request from unknown window\n")); + return; + } + if (ccp->protocol != jinput_protocol) { + DPRINT(("got jinput-specific event from a client that use other protocol\n")); + return; + } + ccp->attrmask |= CAColor; + ccp->attrs.background = ev->data.l[3]; + ccp->attrs.foreground = ev->data.l[4]; + + if (ccp->conversion != NULL) { + myChangeAttributes(ccp->conversion, CAColor, &ccp->attrs); + } +} + +/*- ConversionFontsNotifyProc: CONVERSION_FONTS_NOTIFY event handler (jinput only) -*/ +/* ARGSUSED */ +static void +ConversionFontsNotifyProc(w, event, args, num_args) +Widget w; +XEvent *event; +String *args; +Cardinal *num_args; +{ + KinputProtocolWidget kpw = (KinputProtocolWidget)w; + XClientMessageEvent *ev = &event->xclient; + Window reqwin; + ConvClient *ccp; + unsigned long attrmask; + + TRACE(("ConversionFontsNotifyProc(window=0x%lx)\n", ev->data.l[2])); + /* is it a correct event? */ + if (!isCorrectClientEvent(kpw, event)) { + /*ignore */ + DPRINT(("got invalid clientmessage event.\n")); + return; + } + if (ev->data.l[1] != JINPUT_PROTOCOL_VERSION) { + /* wrong version number */ + DPRINT(("ConversionFontsNotifyProc(): unknown version number (0x%lx)\n", ev->data.l[1])); + return; + } + reqwin = ev->data.l[2]; + if ((ccp = findClient(kpw, reqwin)) == NULL) { + /* request from unknown client. just ignore */ + DPRINT(("got conversion end request from unknown window\n")); + return; + } + if (ccp->protocol != jinput_protocol) { + DPRINT(("got jinput-specific event from a client that use other protocol\n")); + return; + } + + attrmask = CAFonts; + if (ccp->attrmask & CAFonts) { + if (ccp->attrs.fonts[0]->fid != ev->data.l[3]) { + XFreeFontInfo((char **)NULL, ccp->attrs.fonts[0], 1); + ccp->attrs.fonts[0] = XQueryFont(XtDisplay((Widget)kpw), + (XID)ev->data.l[3]); + } + if (ccp->attrs.fonts[1]->fid != ev->data.l[4]) { + XFreeFontInfo((char **)NULL, ccp->attrs.fonts[1], 1); + ccp->attrs.fonts[1] = XQueryFont(XtDisplay((Widget)kpw), + (XID)ev->data.l[4]); + } + } else { + ccp->attrmask |= CAFonts; + ccp->attrs.num_fonts = 2; + ccp->attrs.fonts = (XFontStruct **)XtMalloc(sizeof(XFontStruct *) * 2); + ccp->attrs.fonts[0] = XQueryFont(XtDisplay((Widget)kpw), + (XID)ev->data.l[3]); + ccp->attrs.fonts[1] = XQueryFont(XtDisplay((Widget)kpw), + (XID)ev->data.l[4]); + } + if (ccp->attrmask & CASpotLocation) { + JinputData *jdp = (JinputData *)ccp->data; + ccp->attrs.spotx = jdp->rawspotx; + ccp->attrs.spoty = jdp->rawspoty + ccp->attrs.fonts[0]->ascent; + attrmask |= CASpotLocation; + } + + if (ccp->conversion != NULL) { + myChangeAttributes(ccp->conversion, attrmask, &ccp->attrs); + } +} + +/*- ConversionAttributeNotifyProc: CONVERSION_ATTRIBUTE_NOTIFY event handler (kinput2 only) -*/ +/* ARGSUSED */ +static void +ConversionAttributeNotifyProc(w, event, args, num_args) +Widget w; +XEvent *event; +String *args; +Cardinal *num_args; +{ + KinputProtocolWidget kpw = (KinputProtocolWidget)w; + XClientMessageEvent *ev = &event->xclient; + Window reqwin; + ConvClient *ccp; + XFontStruct **fonts; + Cardinal nfonts; + + TRACE(("ConversionAttributeNotifyProc(window=0x%lx)\n", ev->data.l[1])); + /* is it a correct event? */ + if (!isCorrectClientEvent(kpw, event)) { + /*ignore */ + DPRINT(("got invalid clientmessage event.\n")); + return; + } + + reqwin = (Window)ev->data.l[1]; + TRACE(("\treqwin=0x%lx\n", reqwin)); + + if ((ccp = findClient(kpw, reqwin)) == NULL) { + /* request from unknown client. just ignore */ + DPRINT(("got conversion attribute request from unknown window\n")); + return; + } else if (ccp->protocol != kinput2_protocol) { + DPRINT(("get conversion attribute request from a client that doesn't use kinput2 protocol\n")); + return; + } else if (ccp->conversion == NULL) { + /* not converting (this should not happen) */ + DPRINT(("got conversion attribute request before conversion start\n")); + return; + } + + /* + * special treat for fonts -- because if they are changed, + * you should release old fonts. + */ + if (ccp->attrmask & CAFonts) { + fonts = ccp->attrs.fonts; + nfonts = ccp->attrs.num_fonts; + } else { + fonts = NULL; + nfonts = 0; + } + + ccp->attrmask = 0L; + getAttributeFromEvent(ccp, event); + + /* change it */ + myChangeAttributes(ccp->conversion, ccp->attrmask, &ccp->attrs); + + if (ccp->attrmask & CAFonts) { + if (fonts != NULL) { + /* fonts changed -- free old fonts */ + Cardinal i; + for (i = 0; i < nfonts; i++) { + CachedFreeFont(XtDisplay(w), fonts[i]); + } + XtFree((char *)fonts); + } + } else { + /* restore fonts data */ + ccp->attrmask = CAFonts; + ccp->attrs.fonts = fonts; + ccp->attrs.num_fonts = nfonts; + } +} + +/*- ConversionCloseProc: CONVERSION_CLOSE event handler (xlc only) -*/ +/* ARGSUSED */ +static void +ConversionCloseProc(w, event, args, num_args) +Widget w; +XEvent *event; +String *args; +Cardinal *num_args; +{ + KinputProtocolWidget kpw = (KinputProtocolWidget)w; + XClientMessageEvent *ev = &event->xclient; + Window reqwin; + ConvClient *ccp; + + TRACE(("ConversionCloseProc(window=0x%lx)\n", ev->data.l[2])); + /* is it a correct event? */ + if (!isCorrectClientEvent(kpw, event)) { + /*ignore */ + DPRINT(("got invalid clientmessage event.\n")); + return; + } + reqwin = ev->data.l[1]; + if ((ccp = findClient(kpw, reqwin)) == NULL) { + /* request from unknown client. just ignore */ + DPRINT(("got conversion end from unknown window\n")); + return; + } + + if (ccp->protocol != xlc_protocol && ccp->protocol != kinput1_protocol) { + /* + * Only XLC protocol uses this event (CONVERSION_CLOSE ClientMessage), + * so the checking for kinput1 protocol seems to be unnecessary. + * ...Wrong. A client using kinput1 protocol and a client using + * XLC protocol with off-the-spot mode can't be distinguishable + * until you get this event. + */ + DPRINT(("got xlc-specific event from a client that use other protocol\n")); + return; + } + + MyRemoveEventHandler(XtDisplay(w), reqwin, DestroyNotify, + ClientDead, (XtPointer)ccp); + if (ccp->conversion != NULL) { + CControlEndConversion(ccp->conversion); + endProc(ccp, False); + } + if (ccp->protocol == xlc_protocol) deleteClient(ccp); +} + +/* + *+ other event handler + */ + +/*- XlcOnTheSpotChangedProc: ProptyNotify of "_XLC_ON_THE_SPOT" handler -*/ +/* ARGSUSED */ +static void +XlcOnTheSpotChangedProc(w, event, args, num_args) +Widget w; +XEvent *event; +String *args; /* not used */ +Cardinal *num_args; /* not used */ +{ + KinputProtocolWidget kpw = (KinputProtocolWidget)w; + XPropertyEvent *ev = &(event->xproperty); + ConvClient *client; + + TRACE(("XlcOnTheSpotChangedProc(window=0x%lx)\n", ev->window)); + + if (ev->window != XtWindow(w) || + ev->atom != kpw->kinput.xlcOnTheSpotAtom) { + DPRINT(("\tgot invalid PropertyNotify event.\n")); + return; + } else if (ev->state != PropertyNewValue) { + return; + } + client = getXlcDataFromProperty(kpw, (ConvClient *)NULL, False); + if (client == NULL) return; + + if (client->conversion != NULL) { + myChangeAttributes(client->conversion, + client->attrmask, &client->attrs); + } +} + +/*- SelectionRequestProc: SelectionRequest event handler -*/ +/*ARGSUSED*/ +static void +SelectionRequestProc(w, event, args, num_args) +Widget w; +XEvent *event; +String *args; /* not used */ +Cardinal *num_args; /* not used */ +{ + XSelectionRequestEvent *ev = &(event->xselectionrequest); + XEvent repl; + String params[1]; + Cardinal num_params; + + repl.xselection.type = SelectionNotify; + repl.xselection.requestor = ev->requestor; + repl.xselection.selection = ev->selection; + repl.xselection.target = ev->target; + repl.xselection.property = None; + repl.xselection.time = ev->time; + + params[0] = XtClass(w)->core_class.class_name; + num_params = 1; + XtAppWarningMsg(XtWidgetToApplicationContext(w), + "selectionError", "SelectionRequest", "WidgetError", + "%s: SelectionRequest event received", + params, &num_params); + + XSendEvent(ev->display, ev->requestor, False, NoEventMask, &repl); +} + +/*- SelectionClearProc: SelectionClear event handler -*/ +/* ARGSUSED */ +static void +SelectionClearProc(w, event, args, num_args) +Widget w; +XEvent *event; +String *args; +Cardinal *num_args; +{ + KinputProtocolWidget kpw = (KinputProtocolWidget)w; + ConvClient *ccp; + String params[1]; + Cardinal num_params; + + /* Selection owner changed. kill myself */ + + /* + * send ConversionEnd event to the clients before exit + */ + for (ccp = kpw->kinput.clients; ccp; ccp = ccp->next) { + if (ccp->reqwin != None) { + if (ccp->conversion != NULL) { + CControlEndConversion(ccp->conversion); + } + endProc(ccp, False); + } + } + + params[0] = XtClass(w)->core_class.class_name; + num_params = 1; + XtAppWarningMsg(XtWidgetToApplicationContext(w), + "selectionError", "SelectionClear", "WidgetError", + "%s: SelectionClear event received", + params, &num_params); + + XtDestroyWidget(w); +} + +/*- ClientDead: DestroyNotify event handler (jinput and xlc) -*/ +static void +ClientDead(ev, data) +XEvent *ev; +XtPointer data; +{ + ConvClient *ccp = (ConvClient *)data; + + TRACE(("ClientDead(window=0x%lx)\n", ev->xdestroywindow.window)); + if (ev->type != DestroyNotify || + ev->xdestroywindow.window != ccp->reqwin) return; + + MyRemoveAllEventHandler(ev->xany.display, ccp->reqwin); + deleteClient(ccp); +} diff -r 000000000000 -r 92745d501b9a lib/OffConv.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/OffConv.c Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,2045 @@ +#ifndef lint +static char *rcsid = "$Id: OffConv.c,v 1.44 2001/07/01 13:47:00 ishisone Exp $"; +#endif +/* + * Copyright (c) 1990 Software Research Associates, Inc. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Software Research Associates not be + * used in advertising or publicity pertaining to distribution of the + * software without specific, written prior permission. Software Research + * Associates makes no representations about the suitability of this software + * for any purpose. It is provided "as is" without express or implied + * warranty. + * + * Author: Makoto Ishisone, Software Research Associates, Inc., Japan + */ + +/* + * Note: This file contains TWO widget classes, OffTheSpotConversionWidget + * and its subclass SeparateConversionWidget. + */ + +#include +#include +#if XtSpecificationRelease > 4 +#include +#endif +#include "CachedAtom.h" +#include "AsyncErr.h" +#include "OffConvP.h" +#include +#include "InputConv.h" +#include "ConvDisp.h" +#include "CandPanel.h" +#include "AuxPanel.h" +#include "Canvas.h" +#include "AdoptedShe.h" +#include "CanvasShel.h" +#include "ICLabel.h" + +#define DEBUG_VAR debug_OffTheSpotConversion +#include "DebugPrint.h" + +/*- resource table for OffTheSpotConversion (SeparateConversion has no resources -*/ +static XtResource off_resources[] = { +#define offset(field) XtOffset(OffTheSpotConversionWidget, offthespot.field) + { XtNleftMargin, XtCMargin, XtRDimension, sizeof(Dimension), + offset(leftmargin), XtRImmediate, (XtPointer)2 }, + { XtNrightMargin, XtCMargin, XtRDimension, sizeof(Dimension), + offset(rightmargin), XtRImmediate, (XtPointer)2 }, +#undef offset +}; + +/*- default translations -- same as superclass's -*/ +static char off_translations[] = ": to-inputobj()"; +static char sep_translations[] = ": to-inputobj()"; + +/*- declarations of static functions -*/ +static void OffTheSpot_Initialize(); +static void OffTheSpot_Destroy(); +static Boolean OffTheSpot_SetValues(); +static void OffTheSpot_Startup(); +static void OffTheSpot_ConversionFinish(); +static void OffTheSpot_ChangeAttributes(); +static void OffTheSpot_ChangeFocus(); + +static void Separate_Initialize(); +static void Separate_Startup(); +static void Separate_ConversionFinish(); +static void Separate_ChangeAttributes(); +static void Separate_ChangeFocus(); + +static Widget CreateDisplayObject(); +static Widget CreateSelectionWidget(); + +static void SetupDisplayObject(); +static Boolean ResetDisplayObject(); +static void SetupModeWidget(); +static Boolean ResetModeWidget(); +static void SetupCanvasWidget(); +static Boolean ResetCanvasWidget(); + +static void UpdateText(); +static void UpdateMode(); + +static void SelectionControl(); +static void SelectionStart(); +static void LocateSelectionPopup(); +static void SelectionEnd(); +static void SelectionSet(); +static void SelectionGet(); +static void SelectionMove(); + +static Widget CreateAuxWidget(); +static void AuxControl(); +static void AuxStart(); +static void AuxEnd(); +static void AuxChange(); +static void LocateAuxPopup(); + +static void TextRedisplay(); +static void TextResize(); + +static void SelectionSelected(); + +static void computeDisplaySegments(); +static void recomputeDisplaySegments(); +static void computeLastPosition(); +static DisplayFragment * computeDisplayFragments(); +static int widthAvailable(); +static void initialLocation(); +static void nextLocation(); +static DisplayLocation * findLocation(); +static void reconfigureDisplay(); +static void updateDisplay(); +static void updateDisplaySegment(); +static void redrawSegments(); + +static void eraseCursor(); +static void showCursor(); +static Boolean exposeCursor(); +static void computeCursor(); + +static void MoveShell(); +static Window getToplevelWindow(); +static void setTransientFor(); +static Boolean intersectRect(); +static void unionRect(); +static DisplayFragment * allocDisplayFragment(); +static void freeDisplayFragments(); +static void destroyDisplayFragments(); +static void allocDisplaySegments(); +static void freeDisplaySegment(); +static void clearAllDisplaySegments(); +static void copyString(); +static void freeString(); + +/*- composite-extension rec: for enabling non-widget children -*/ +static CompositeClassExtensionRec CompositeExtension = { + /* next_extension */ NULL, + /* record_type */ NULLQUARK, + /* version */ XtCompositeExtensionVersion, + /* record_size */ sizeof(CompositeClassExtensionRec), + /* accept_objects */ True, +}; + +/*- offTheSpotConversionClass record -*/ +OffTheSpotConversionClassRec offTheSpotConversionClassRec = { + { /* core fields */ + /* superclass */ (WidgetClass)&conversionControlClassRec, + /* class_name */ "OffTheSpotConversion", + /* widget_size */ sizeof(OffTheSpotConversionRec), + /* class_initialize */ NULL, + /* class_part_initialize */ NULL, + /* class_inited */ FALSE, + /* initialize */ OffTheSpot_Initialize, + /* initialize_hook */ NULL, + /* realize */ XtInheritRealize, + /* actions */ NULL, + /* num_actions */ 0, + /* resources */ off_resources, + /* num_resources */ XtNumber(off_resources), + /* xrm_class */ NULLQUARK, + /* compress_motion */ TRUE, + /* compress_exposure */ TRUE, + /* compress_enterleave */ TRUE, + /* visible_interest */ FALSE, + /* destroy */ OffTheSpot_Destroy, + /* resize */ XtInheritResize, + /* expose */ NULL, + /* set_values */ OffTheSpot_SetValues, + /* set_values_hook */ NULL, + /* set_values_almost */ XtInheritSetValuesAlmost, + /* get_values_hook */ NULL, + /* accept_focus */ NULL, + /* version */ XtVersion, + /* callback_private */ NULL, + /* tm_table */ off_translations, + /* query_geometry */ XtInheritQueryGeometry, + /* display_accelerator */ XtInheritDisplayAccelerator, + /* extension */ NULL + }, + { /* composite fields */ + /* geometry_manager */ XtInheritGeometryManager, + /* change_managed */ XtInheritChangeManaged, + /* insert_child */ XtInheritInsertChild, + /* delete_child */ XtInheritDeleteChild, + /* extension */ (XtPointer)&CompositeExtension, + }, + { /* shell fields */ + /* extension */ NULL + }, + { /* wm_shell fields */ + /* extension */ NULL + }, + { /* vendor_shell fields */ + /* extension */ NULL + }, + { /* transient_shell fields */ + /* extension */ NULL + }, + { /* conversionControl fields */ + /* Startup */ OffTheSpot_Startup, + /* Finish */ OffTheSpot_ConversionFinish, + /* ChangeAttributes */ OffTheSpot_ChangeAttributes, + /* ChangeFocus */ OffTheSpot_ChangeFocus, + /* TextChange */ UpdateText, + /* Fix */ XtInheritFix, + /* ModeChange */ UpdateMode, + /* SelectionControl */ SelectionControl, + /* AuxControl */ AuxControl, + }, + { /* offTheSpotConversion fields */ + /* empty */ 0 + }, +}; + +WidgetClass offTheSpotConversionWidgetClass = (WidgetClass)&offTheSpotConversionClassRec; + +/*- separateConversionClass record -*/ +SeparateConversionClassRec separateConversionClassRec = { + { /* core fields */ + /* superclass */ (WidgetClass)&offTheSpotConversionClassRec, + /* class_name */ "SeparateConversion", + /* widget_size */ sizeof(SeparateConversionRec), + /* class_initialize */ NULL, + /* class_part_initialize */ NULL, + /* class_inited */ FALSE, + /* initialize */ Separate_Initialize, + /* initialize_hook */ NULL, + /* realize */ XtInheritRealize, + /* actions */ NULL, + /* num_actions */ 0, + /* resources */ NULL, + /* num_resources */ 0, + /* xrm_class */ NULLQUARK, + /* compress_motion */ TRUE, + /* compress_exposure */ TRUE, + /* compress_enterleave */ TRUE, + /* visible_interest */ FALSE, + /* destroy */ NULL, + /* resize */ XtInheritResize, + /* expose */ NULL, + /* set_values */ NULL, + /* set_values_hook */ NULL, + /* set_values_almost */ XtInheritSetValuesAlmost, + /* get_values_hook */ NULL, + /* accept_focus */ NULL, + /* version */ XtVersion, + /* callback_private */ NULL, + /* tm_table */ sep_translations, + /* query_geometry */ XtInheritQueryGeometry, + /* display_accelerator */ XtInheritDisplayAccelerator, + /* extension */ NULL + }, + { /* composite fields */ + /* geometry_manager */ XtInheritGeometryManager, + /* change_managed */ XtInheritChangeManaged, + /* insert_child */ XtInheritInsertChild, + /* delete_child */ XtInheritDeleteChild, + /* extension */ (XtPointer)&CompositeExtension, + }, + { /* shell fields */ + /* extension */ NULL + }, + { /* wm_shell fields */ + /* extension */ NULL + }, + { /* vendor_shell fields */ + /* extension */ NULL + }, + { /* transient_shell fields */ + /* extension */ NULL + }, + { /* conversionControl fields */ + /* Startup */ Separate_Startup, + /* Finish */ Separate_ConversionFinish, + /* ChangeAttributes */ Separate_ChangeAttributes, + /* ChangeFocus */ Separate_ChangeFocus, + /* TextChange */ XtInheritTextChange, + /* Fix */ XtInheritFix, + /* ModeChange */ XtInheritModeChange, + /* SelectionControl */ XtInheritSelectionControl, + /* AuxControl */ XtInheritAuxControl, + }, + { /* offTheSpotConversion fields */ + /* empty */ 0 + }, + { /* separateConversion fields */ + /* empty */ 0 + }, +}; + +WidgetClass separateConversionWidgetClass = (WidgetClass)&separateConversionClassRec; + +/* + *+ OffTheSpot -- Core class method + */ + +/*- OffTheSpot_Initialize: initalize method for OffTheSpotCoversion -*/ +/* ARGSUSED */ +static void +OffTheSpot_Initialize(req, new, args, num_args) +Widget req; +Widget new; +ArgList args; +Cardinal *num_args; +{ + OffTheSpotConversionWidget ocw = (OffTheSpotConversionWidget)new; + + (void)CreateDisplayObject(ocw); + (void)CreateSelectionWidget(ocw); + (void)CreateAuxWidget(ocw); + + ocw->offthespot.canvaswidget = NULL; + ocw->offthespot.modewidget = NULL; + ocw->offthespot.modeshell = NULL; + + ocw->offthespot.dispsegments = NULL; + ocw->offthespot.numsegments = 0; + ocw->offthespot.dispsegmentsize = 0; + ocw->offthespot.candlist = NULL; + ocw->offthespot.numcands = 0; + ocw->offthespot.selectionpoppedup = False; + ocw->offthespot.auxpoppedup = False; +} + +/*- OffTheSpot_Destroy: destroy method for OffTheSpotCoversion -*/ +static void +OffTheSpot_Destroy(w) +Widget w; +{ + OffTheSpotConversionWidget ocw = (OffTheSpotConversionWidget)w; + + /* $B%G%#%9%W%l%$%;%0%a%s%H$NNN0h$r2rJ|(B */ + if (ocw->offthespot.dispsegments) { + DisplaySegment *dsp = ocw->offthespot.dispsegments; + int i; + + for (i = 0; i < ocw->offthespot.numsegments; i++) { + freeString(&dsp[i].seg); + destroyDisplayFragments(dsp->fragments); + } + XtFree((char *)dsp); + } +} + +/*- OffTheSpot_SetValues: setvalues method for OffTheSpotCoversion -*/ +/* ARGSUSED */ +static Boolean +OffTheSpot_SetValues(cur, req, new, args, num_args) +Widget cur; +Widget req; +Widget new; +ArgList args; +Cardinal *num_args; +{ + /* OffTheSpotConversionWidget ocw = (OffTheSpotConversionWidget)new; */ + return False; +} + +/* + *+ OffTheSpot -- ConversionControl class method + */ + +/*- OffTheSpot_Startup: OffTheSpot conversion startup -*/ +static void +OffTheSpot_Startup(widget, valuemask, value) +Widget widget; +unsigned long valuemask; +ConversionAttributes *value; +{ + OffTheSpotConversionWidget ocw = (OffTheSpotConversionWidget)widget; + Window toplevel; + + if (!(valuemask & CAStatusArea)) { + String params[1]; + Cardinal num_params = 1; + + params[0] = XtClass(widget)->core_class.class_name; + XtAppErrorMsg(XtWidgetToApplicationContext(widget), + "conversionAttributeError", "statusArea", "WidgetError", + "%s: status area must be specified", + params, &num_params); + } + + SetupDisplayObject(ocw, valuemask, value); + SetupModeWidget(ocw, valuemask, value); + SetupCanvasWidget(ocw, valuemask, value); + + /* $BFbIt$N%P%C%U%!$r%/%j%"$9$k(B */ + clearAllDisplaySegments(ocw); + + /* $B%+!<%=%k$N@_Dj(B */ + ocw->offthespot.cursorvisible = True; + eraseCursor(ocw); + ocw->offthespot.cursorvisible = True; + initialLocation(ocw, &(ocw->offthespot.cursorlocation)); + ocw->offthespot.cursorlocation.y += ocw->offthespot.ascent; + + /* WM_TRANSIENT_FOR $B%W%m%Q%F%#$r@5$7$/%;%C%H$9$k(B */ + toplevel = getToplevelWindow(XtDisplay(widget), + ocw->ccontrol.clientwindow); + setTransientFor(ocw->offthespot.selectionshell, toplevel); + setTransientFor(ocw->offthespot.auxshell, toplevel); + + /* + * OffTheSpotConvesion $B$N(B widget $B<+BN$O%]%C%W%"%C%W$5$;$J$$$,!"(B + * $B%P%C%/%(%s%I%?%$%W$N;~$K$O%/%i%$%"%s%H$,$3$N(B widget $B$N(B + * $B%&%#%s%I%&$KBP$7$F%$%Y%s%H$rAw$k$N$G(B Realize $B$@$1$7$F$*$/(B + */ + if (!XtIsRealized(widget)) { + Arg args[2]; + + XtSetArg(args[0], XtNwidth, 1); + XtSetArg(args[1], XtNheight, 1); + XtSetValues(widget, args, 2); + XtRealizeWidget(widget); + } + + /* $B%]%C%W%"%C%W$9$k(B */ + XtPopup(ocw->offthespot.modeshell, XtGrabNone); + XtPopup(ocw->offthespot.canvaswidget, XtGrabNone); +} + +/*- OffTheSpot_ConversionFinish: OffTheSpot conversion finish -*/ +/* ARGSUSED */ +static void +OffTheSpot_ConversionFinish(w) +Widget w; +{ + OffTheSpotConversionWidget ocw = (OffTheSpotConversionWidget)w; + XAEHandle h; + + /* Popdown and unrealize textcanvas and mode widget + * we must be careful here. if clientwindow are destroyed, + * the text canvas and mode widget are also destroyed. + * we have to popdown and unrealize those widgets, but if + * they are destroyed, BadWindow error will be generated. + * so we must set own error handler that ignores errors. + */ + h = XAESetIgnoreErrors(XtDisplay(w)); + XtPopdown(ocw->offthespot.modeshell); + XtUnrealizeWidget(ocw->offthespot.modeshell); + XtPopdown(ocw->offthespot.canvaswidget); + XtUnrealizeWidget(ocw->offthespot.canvaswidget); + XAEUnset(h); + + if (ocw->offthespot.selectionpoppedup) { + XtPopdown(ocw->offthespot.selectionshell); + ocw->offthespot.selectionpoppedup = False; + } + if (ocw->offthespot.auxpoppedup) { + XtPopdown(ocw->offthespot.auxshell); + ocw->offthespot.auxpoppedup = False; + } +} + +/*- OffTheSpot_ChangeAttributes: OffTheSpot conversion attribute change -*/ +/* ARGSUSED */ +static void +OffTheSpot_ChangeAttributes(w, valuemask, value) +Widget w; +unsigned long valuemask; +ConversionAttributes *value; +{ + OffTheSpotConversionWidget ocw = (OffTheSpotConversionWidget)w; + Boolean redraw, reconfig; + + if (ResetModeWidget(ocw, valuemask, value) && + XtIsRealized(ocw->offthespot.modewidget)) { + XClearArea(XtDisplay(w), XtWindow((Widget)ocw->offthespot.modewidget), + 0, 0, 0, 0, True); + } + + redraw = ResetDisplayObject(ocw, valuemask, value); + reconfig = ResetCanvasWidget(ocw, valuemask, value); + + if (reconfig) { + TextResize(ocw->offthespot.canvaswidget, (XtPointer)w, (XtPointer)NULL); + } else if (redraw && XtIsRealized(ocw->offthespot.canvaswidget)) { + XClearArea(XtDisplay(w), XtWindow(ocw->offthespot.canvaswidget), + 0, 0, 0, 0, True); + } +} + +/*- OffTheSpot_ChangeFocus: OffTheSpot focus change -*/ +static void +OffTheSpot_ChangeFocus(w, set) +Widget w; +int set; +{ + OffTheSpotConversionWidget ocw = (OffTheSpotConversionWidget)w; + + if (set) { + XtPopup(ocw->offthespot.modeshell, XtGrabNone); + XtPopup(ocw->offthespot.canvaswidget, XtGrabNone); + } else { + XtPopdown(ocw->offthespot.modeshell); + XtPopdown(ocw->offthespot.canvaswidget); + } +} + +/* + *+ Separate -- Core class method + */ + +/*- Separate_Initialize: initialize method for SeparateConversion -*/ +/* ARGSUSED */ +static void +Separate_Initialize(req, new, args, num_args) +Widget req; +Widget new; +ArgList args; +Cardinal *num_args; +{ + SeparateConversionWidget scw = (SeparateConversionWidget)new; + Widget inputobj = scw->ccontrol.inputobj; + Widget form, canvas, mode, tmp[2]; + + form = XtCreateManagedWidget("form", formWidgetClass, (Widget)scw, + NULL, 0); + tmp[0] = mode = XtVaCreateWidget("mode", icLabelWidgetClass, form, + XtNlabel, ICGetMode(inputobj), + NULL); + (void)XtCreateWidget("display", scw->ccontrol.displayobjclass, mode, + NULL, 0); + + tmp[1] = canvas = XtCreateWidget("text", canvasWidgetClass, form, NULL, 0); + XtManageChildren(tmp, 2); + + XtAddCallback(canvas, XtNexposeCallback, TextRedisplay, (XtPointer)scw); + XtAddCallback(canvas, XtNresizeCallback, TextResize, (XtPointer)scw); + + XtInstallAccelerators(canvas, (Widget)scw); + XtInstallAccelerators(mode, (Widget)scw); + XtInstallAccelerators(form, (Widget)scw); + + scw->separate.formwidget = form; + scw->offthespot.canvaswidget = canvas; + scw->offthespot.modewidget = mode; + +} + +/* + *+ Separate -- ConversionControl class method + */ + +/*- Separate_Startup: Separate conversion startup -*/ +/* ARGSUSED */ +static void +Separate_Startup(widget, valuemask, value) +Widget widget; +unsigned long valuemask; +ConversionAttributes *value; +{ + SeparateConversionWidget scw = (SeparateConversionWidget)widget; + Position clx, cly; + Dimension clw, clh; + Position x, y; + Dimension w, h; + Dimension dpyWidth, dpyHeight; + Window toplevel; + + /* $BFbIt$N%P%C%U%!$r%/%j%"$9$k(B */ + clearAllDisplaySegments((OffTheSpotConversionWidget)scw); + + /* $B%+!<%=%k$N@_Dj(B */ + scw->offthespot.cursorvisible = True; + eraseCursor((OffTheSpotConversionWidget)scw); + scw->offthespot.cursorvisible = True; + initialLocation((OffTheSpotConversionWidget)scw, + &(scw->offthespot.cursorlocation)); + scw->offthespot.cursorlocation.y += scw->offthespot.ascent; + + /* $B=i4|%b!<%I$r@_Dj$9$k(B */ + XtVaSetValues(scw->offthespot.modewidget, + XtNlabel, ICGetMode(scw->ccontrol.inputobj), + NULL); + + /* $BI=<(0LCV$r7h$a$k(B */ + clx = scw->ccontrol.client_rootx; + cly = scw->ccontrol.client_rooty; + clw = scw->ccontrol.client_attr.width; + clh = scw->ccontrol.client_attr.height; + + XtRealizeWidget((Widget)scw); + w = scw->core.width; + h = scw->core.height; + DPRINT(("Off_the_spot_Startup(): widget size = %dx%d\n", w, h)); + x = clx + clw / 2 - w / 2; + y = cly + clh + 8; + + dpyWidth = WidthOfScreen(XtScreen(widget)); + dpyHeight = HeightOfScreen(XtScreen(widget)); + + if (x + w > dpyWidth) x = dpyWidth - w; + if (x < 0) x = 0; + if (y + h > dpyHeight) { + y = cly - h; + if (y < 0) y = dpyHeight - h; + } + MoveShell(widget, x, y); + + /* WM_TRANSIENT_FOR $B%W%m%Q%F%#$r@5$7$/%;%C%H$9$k(B */ + toplevel = getToplevelWindow(XtDisplay(widget), + scw->ccontrol.clientwindow); + setTransientFor((Widget)scw, toplevel); + + /* + * This is a kind of a magic word... I don't know why, but without this + * the selection popup will appear in wrong size (1x1) at the first time. + */ + XtRealizeWidget(scw->offthespot.selectionshell); + XtRealizeWidget(scw->offthespot.auxshell); + + /* $B%]%C%W%"%C%W$9$k(B */ + XtPopup(widget, XtGrabNone); +} + +/*- Separate_ConversionFinish: Separate conversion finish -*/ +/* ARGSUSED */ +static void +Separate_ConversionFinish(w) +Widget w; +{ + SeparateConversionWidget scw = (SeparateConversionWidget)w; + + if (scw->offthespot.selectionpoppedup) { + XtPopdown(scw->offthespot.selectionshell); + scw->offthespot.selectionpoppedup = False; + } + if (scw->offthespot.auxpoppedup) { + XtPopdown(scw->offthespot.auxshell); + scw->offthespot.auxpoppedup = False; + } + XtPopdown(w); +} + +/*- Separate_ChangeAttributes: Separate conversion attribute change -*/ +/* ARGSUSED */ +static void +Separate_ChangeAttributes(w, mask, value) +Widget w; +unsigned long mask; +ConversionAttributes *value; +{ + /* do nothing */ +} + +/*- Separate_ChangeFocus: Separate focus change -*/ +/* ARGSUSED */ +static void +Separate_ChangeFocus(w, set) +Widget w; +int set; +{ + /* do nothing */ +} + +/* + *+ sub-widget creation + */ + +/*- CreateDisplayObject: create display object for text drawing -*/ +static Widget +CreateDisplayObject(ocw) +OffTheSpotConversionWidget ocw; +{ + Widget dispobj; + + dispobj = XtCreateWidget("displayObj", ocw->ccontrol.displayobjclass, + (Widget)ocw, NULL, 0); + + ocw->offthespot.displayobj = dispobj; + ocw->offthespot.lineheight = CDLineHeight(dispobj, &ocw->offthespot.ascent); + + return dispobj; +} + +/*- CreateSelectionWidget: create selection widget for selecting candidates -*/ +static Widget +CreateSelectionWidget(ocw) +OffTheSpotConversionWidget ocw; +{ + Widget shell, sel; + + /* set width/height so that XtRealizeWidget() doesn't cause error */ + shell = XtVaCreatePopupShell("selectionShell", + transientShellWidgetClass, + (Widget)ocw, + XtNwidth, 1, + XtNheight, 1, + NULL); + ocw->offthespot.selectionshell = shell; + + sel = XtCreateManagedWidget("selection", candidatePanelWidgetClass, + shell, NULL, 0); + (void)XtCreateWidget("display", ocw->ccontrol.displayobjclass, sel, + NULL, 0); + XtAddCallback(sel, XtNcallback, SelectionSelected, (XtPointer)ocw); + XtInstallAccelerators(sel, (Widget)ocw); + + ocw->offthespot.selectionwidget = sel; + + return shell; +} + +/*- CreateAuxWidget: create aux widget for display auxiliary data -*/ +static Widget +CreateAuxWidget(ocw) +OffTheSpotConversionWidget ocw; +{ + Widget shell, sel; + + /* set width/height so that XtRealizeWidget() doesn't cause error */ + shell = XtVaCreatePopupShell("auxShell", + transientShellWidgetClass, + (Widget)ocw, + XtNwidth, 1, + XtNheight, 1, + XtNallowShellResize, True, + NULL); + ocw->offthespot.auxshell = shell; + + sel = XtCreateManagedWidget("aux", auxPanelWidgetClass, + shell, NULL, 0); + (void)XtCreateWidget("display", ocw->ccontrol.displayobjclass, sel, + NULL, 0); + XtAddCallback(sel, XtNcallback, SelectionSelected, (XtPointer)ocw); + XtInstallAccelerators(sel, (Widget)ocw); + + ocw->offthespot.auxwidget = sel; + + return shell; +} + +/* + *+ subwidget configuration + */ + +/*- SetupDisplayObject: do display objetct configuration on conversion startup -*/ +static void +SetupDisplayObject(ocw, mask, value) +OffTheSpotConversionWidget ocw; +unsigned long mask; +ConversionAttributes *value; +{ + /* + * order is important. we must set fonts BEFORE anything else, + * because it is possible that the fonts previously set in the + * display object no longer exist, and if so, that causes BadFont + * error when changing GCs. + */ + + if (mask & CAFonts) { + CDSetFonts(ocw->offthespot.displayobj, + value->fonts, value->num_fonts); + } else { + CDSetFonts(ocw->offthespot.displayobj, (XFontStruct **)NULL, 0); + } + if (mask & CAColor) { + XtVaSetValues(ocw->offthespot.displayobj, + XtNforeground, value->foreground, + XtNbackground, value->background, + NULL); + } + + ocw->offthespot.lineheight = CDLineHeight(ocw->offthespot.displayobj, + &ocw->offthespot.ascent); +} + +/*- ResetDisplayObject: do display objetct reconfiguration on attribute change -*/ +static Boolean +ResetDisplayObject(ocw, mask, value) +OffTheSpotConversionWidget ocw; +unsigned long mask; +ConversionAttributes *value; +{ + Boolean redraw = False; + + if (mask & CAColor) { + XtVaSetValues(ocw->offthespot.displayobj, + XtNforeground, value->foreground, + XtNbackground, value->background, + NULL); + redraw = True; + } + if (mask & CAFonts) { + CDSetFonts(ocw->offthespot.displayobj, + value->fonts, value->num_fonts); + redraw = True; + ocw->offthespot.lineheight = CDLineHeight(ocw->offthespot.displayobj, + &ocw->offthespot.ascent); + } + return redraw; +} + +/*- SetupModeWidget: do mode widget configuration (OffTheSpot only) -*/ +static void +SetupModeWidget(ocw, mask, value) +OffTheSpotConversionWidget ocw; +unsigned long mask; +ConversionAttributes *value; +{ + Window clwin = ocw->ccontrol.clientwindow; + Widget inputobj = ocw->ccontrol.inputobj; + Arg shellarg[10], modearg[10], objarg[10]; + Cardinal i = 0, j = 0, k = 0; + + XtSetArg(shellarg[i], XtNparentWindow, clwin); i++; + XtSetArg(shellarg[i], XtNx, value->statusarea.x); i++; + XtSetArg(shellarg[i], XtNy, value->statusarea.y); i++; + XtSetArg(shellarg[i], XtNwidth, value->statusarea.width); i++; + XtSetArg(shellarg[i], XtNheight, value->statusarea.height); i++; + + XtSetArg(modearg[j], XtNlabel, ICGetMode(inputobj)); j++; + + if (mask & CAColormap) { + XtSetArg(modearg[j], XtNcolormap, value->colormap); j++; + } else { + XtSetArg(modearg[j], XtNcolormap, + DefaultColormapOfScreen(XtScreen((Widget)ocw))); j++; + } + if (mask & CAColor) { + XtSetArg(modearg[j], XtNbackground, value->background); j++; + XtSetArg(objarg[k], XtNforeground, value->foreground); k++; + XtSetArg(objarg[k], XtNbackground, value->background); k++; + } else { + XtSetArg(modearg[j], XtNbackground, ocw->core.background_pixel); j++; + } + + if (ocw->offthespot.modewidget == NULL) { + Widget shell, mode, disp; + shell = XtCreatePopupShell("modeShell", adoptedShellWidgetClass, + (Widget)ocw, shellarg, i); + mode = XtCreateManagedWidget("mode", icLabelWidgetClass, shell, + modearg, j); + disp = XtCreateWidget("display", ocw->ccontrol.displayobjclass, mode, + objarg, k); + if (mask & CAStatusFonts) { + CDSetFonts(disp, value->status_fonts, value->num_status_fonts); + } + + ocw->offthespot.modeshell = shell; + ocw->offthespot.modewidget = mode; + ocw->offthespot.modedisplayobj = disp; + XtInstallAccelerators(mode, (Widget)ocw); + } else { + if (mask & CAStatusFonts) { + CDSetFonts(ocw->offthespot.modedisplayobj, + value->status_fonts, value->num_status_fonts); + } else { + CDSetFonts(ocw->offthespot.modedisplayobj, + (XFontStruct **)NULL, 0); + } + XtSetValues(ocw->offthespot.modeshell, shellarg, i); + XtSetValues(ocw->offthespot.modewidget, modearg, j); + XtSetValues(ocw->offthespot.modedisplayobj, objarg, k); + } + + ICLRecomputeSize(ocw->offthespot.modewidget); +} + +/*- ResetModeWidget: do mode widget reconfiguration (OffTheSpot only) -*/ +static Boolean +ResetModeWidget(ocw, mask, value) +OffTheSpotConversionWidget ocw; +unsigned long mask; +ConversionAttributes *value; +{ + Arg shellarg[10], modearg[10], objarg[10]; + Cardinal i = 0, j = 0, k = 0; + Boolean redraw = False; + + if (mask & CAStatusArea) { + XtSetArg(shellarg[i], XtNx, value->statusarea.x); i++; + XtSetArg(shellarg[i], XtNy, value->statusarea.y); i++; + XtSetArg(shellarg[i], XtNwidth, value->statusarea.width); i++; + XtSetArg(shellarg[i], XtNheight, value->statusarea.height); i++; + } + + if (mask & CAColormap) { + XtSetArg(modearg[j], XtNcolormap, value->colormap); j++; + redraw = True; + } + if (mask & CAColor) { + XtSetArg(modearg[j], XtNbackground, value->background); j++; + XtSetArg(objarg[k], XtNforeground, value->foreground); k++; + XtSetArg(objarg[k], XtNbackground, value->background); k++; + redraw = True; + } + XtSetValues(ocw->offthespot.modeshell, shellarg, i); + XtSetValues(ocw->offthespot.modewidget, modearg, j); + XtSetValues(ocw->offthespot.modedisplayobj, objarg, k); + + if (mask & CAStatusFonts) { + CDSetFonts(ocw->offthespot.modedisplayobj, + value->status_fonts, value->num_status_fonts); + ICLRecomputeSize(ocw->offthespot.modewidget); + redraw = True; + } + + return redraw; +} + +/*- SetupCanvasWidget: do text canvas configuration on conversion startup -*/ +static void +SetupCanvasWidget(ocw, mask, value) +OffTheSpotConversionWidget ocw; +unsigned long mask; +ConversionAttributes *value; +{ + Window clwin = ocw->ccontrol.clientwindow; + Arg arg[10]; + Cardinal i = 0; + + XtSetArg(arg[i], XtNparentWindow, clwin); i++; + + if (mask & CAClientArea) { + XtSetArg(arg[i], XtNx, value->clientarea.x); i++; + XtSetArg(arg[i], XtNy, value->clientarea.y); i++; + XtSetArg(arg[i], XtNwidth, value->clientarea.width); i++; + XtSetArg(arg[i], XtNheight, value->clientarea.height); i++; + } else { + XtSetArg(arg[i], XtNx, 0); i++; + XtSetArg(arg[i], XtNy, 0); i++; + XtSetArg(arg[i], XtNwidth, ocw->ccontrol.client_attr.width); i++; + XtSetArg(arg[i], XtNheight, ocw->ccontrol.client_attr.height); i++; + } + + /* if (mask & CALineSpacing) ... */ + if (mask & CAColormap) { + XtSetArg(arg[i], XtNcolormap, value->colormap); i++; + } else { + XtSetArg(arg[i], XtNcolormap, + DefaultColormapOfScreen(XtScreen((Widget)ocw))); i++; + } + if (mask & CAColor) { + XtSetArg(arg[i], XtNbackground, value->background); i++; + } else { + XtSetArg(arg[i], XtNbackground, ocw->core.background_pixel); i++; + } + if (mask & CACursor) { + XtSetArg(arg[i], XtNcursor, value->cursor); i++; + } else { + XtSetArg(arg[i], XtNcursor, None); i++; + } + + if (ocw->offthespot.canvaswidget == NULL) { + Widget canvas; + canvas = XtCreatePopupShell("text", canvasShellWidgetClass, + (Widget)ocw, arg, i); + XtAddCallback(canvas, XtNexposeCallback, TextRedisplay, (XtPointer)ocw); + XtAddCallback(canvas, XtNresizeCallback, TextResize, (XtPointer)ocw); + XtInstallAccelerators(canvas, (Widget)ocw); + ocw->offthespot.canvaswidget = canvas; + } else { + XtSetValues(ocw->offthespot.canvaswidget, arg, i); + } +} + +/*- ResetCanvasWidget: do text canvas reconfiguration on attribute change (OfftheSpot only) -*/ +static Boolean +ResetCanvasWidget(ocw, mask, value) +OffTheSpotConversionWidget ocw; +unsigned long mask; +ConversionAttributes *value; +{ + Arg arg[10]; + Cardinal i = 0; + Boolean redraw = False; + + if (mask & CAClientArea) { + XtSetArg(arg[i], XtNx, value->clientarea.x); i++; + XtSetArg(arg[i], XtNy, value->clientarea.y); i++; + XtSetArg(arg[i], XtNwidth, value->clientarea.width); i++; + XtSetArg(arg[i], XtNheight, value->clientarea.height); i++; + redraw = True; + } + + if (mask & CAColormap) { + XtSetArg(arg[i], XtNcolormap, value->colormap); i++; + redraw = True; + } + if (mask & CAColor) { + XtSetArg(arg[i], XtNbackground, value->background); i++; + redraw = True; + } + if (mask & CACursor) { + XtSetArg(arg[i], XtNcursor, value->cursor); i++; + } + + XtSetValues(ocw->offthespot.canvaswidget, arg, i); + + return redraw; +} + +static void +UpdateText(w) +Widget w; +{ + OffTheSpotConversionWidget ocw = (OffTheSpotConversionWidget)w; + + TRACE(("OffTheSpotConversion:UpdateText()\n")); + eraseCursor(ocw); + computeDisplaySegments(ocw); + computeCursor(ocw); + reconfigureDisplay(ocw); + updateDisplay(ocw); + showCursor(ocw); +} + +static void +UpdateMode(w) +Widget w; +{ + OffTheSpotConversionWidget ocw = (OffTheSpotConversionWidget)w; + + TRACE(("OffTheSpotConversion:UpdateMode()\n")); + XtVaSetValues(ocw->offthespot.modewidget, + XtNlabel, ICGetMode(ocw->ccontrol.inputobj), + NULL); +} + +static void +SelectionControl(w, arg) +Widget w; +ICSelectionControlArg *arg; +{ + OffTheSpotConversionWidget ocw = (OffTheSpotConversionWidget)w; + String params[1]; + Cardinal num_params; + + switch (arg->command) { + case ICSelectionStart: + SelectionStart(ocw, arg->u.selection_kind); + break; + case ICSelectionEnd: + SelectionEnd(ocw, &arg->u.current_item); + break; + case ICSelectionSet: + SelectionSet(ocw, arg->u.current_item); + break; + case ICSelectionMove: + SelectionMove(ocw, arg->u.dir); + break; + case ICSelectionGet: + SelectionGet(ocw, &arg->u.current_item); + break; + default: + params[0] = XtClass(w)->core_class.class_name; + num_params = 1; + XtAppWarningMsg(XtWidgetToApplicationContext(w), + "parameterError", "SelectionControl", "WidgetError", + "%s: unknown selection control command", + params, &num_params); + break; + } +} + +/* ARGSUSED */ +static void +SelectionStart(ocw, kind) +OffTheSpotConversionWidget ocw; +int kind; +{ + Cardinal ncand; + + TRACE(("OffTheSpotConversion:SelectionStart()\n")); + if (ocw->offthespot.selectionpoppedup) { + TRACE(("\tselection already started -- ignored\n")); + return; + } + + ocw->offthespot.candlist = ICGetItemList(ocw->ccontrol.inputobj, &ncand); + ocw->offthespot.numcands = ncand; + + TRACE(("\tnumcands=%d\n", ocw->offthespot.numcands)); + CPanelSetList(ocw->offthespot.selectionwidget, + ocw->offthespot.candlist, + ocw->offthespot.numcands, 0, True); + + /* $B%]%C%W%"%C%W$9$k>l=j$r7h$a$k(B */ + LocateSelectionPopup(ocw); + + XtPopup(ocw->offthespot.selectionshell, XtGrabNone); + ocw->offthespot.selectionpoppedup = True; +} + +static void +LocateSelectionPopup(ocw) +OffTheSpotConversionWidget ocw; +{ + Position x, y; + DisplayLocation lastp; + Dimension dpyWidth, dpyHeight; + Widget canvas = ocw->offthespot.canvaswidget; + Widget panel = ocw->offthespot.selectionwidget; + Widget shell = ocw->offthespot.selectionshell; + int clx, cly; + Window junk; + int barheight = ocw->ccontrol.titlebarheight; + + if (ocw->offthespot.numsegments > 0) { + computeLastPosition(ocw->offthespot.dispsegments[ocw->offthespot.numsegments - 1].fragments, &lastp); + } else { + lastp.y = 0; + } + lastp.x = canvas->core.width / 2; + lastp.y += ocw->offthespot.lineheight; + (void)XTranslateCoordinates(XtDisplay(canvas), XtWindow(canvas), + RootWindowOfScreen(XtScreen(canvas)), + 0, 0, &clx, &cly, &junk); + + x = clx + lastp.x - panel->core.width / 2; + y = cly + lastp.y + 8; /* XXX */ + + dpyWidth = WidthOfScreen(XtScreen(canvas)); + dpyHeight = HeightOfScreen(XtScreen(canvas)); + + if (x + panel->core.width > dpyWidth) x = dpyWidth - panel->core.width; + if (x < 0) x = 0; + if (y + panel->core.height + barheight > dpyHeight) { + y = cly - panel->core.height - 8 - barheight; + if (y < 0) y = dpyHeight - panel->core.height - barheight; + } + MoveShell(shell, x, y); +} + +static void +SelectionEnd(ocw, current) +OffTheSpotConversionWidget ocw; +int *current; +{ + TRACE(("OffTheSpotConversion:SelectionEnd()\n")); + if (!ocw->offthespot.selectionpoppedup) { /* for safe */ + TRACE(("\tnot in selection mode -- ignored\n")); + return; + } + + XtVaGetValues(ocw->offthespot.selectionwidget, + XtNcurrentItem, current, + NULL); + + XtPopdown(ocw->offthespot.selectionshell); + + ocw->offthespot.selectionpoppedup = False; +} + +static void +SelectionSet(ocw, current) +OffTheSpotConversionWidget ocw; +int current; +{ + TRACE(("OffTheSpotConversion:SelectionSet()\n")); + if (!ocw->offthespot.selectionpoppedup) { /* for safe */ + TRACE(("\tnot in selection mode -- ignored\n")); + return; + } + + XtVaSetValues(ocw->offthespot.selectionwidget, + XtNcurrentItem, current, + NULL); +} + +static void +SelectionGet(ocw, current) +OffTheSpotConversionWidget ocw; +int *current; +{ + TRACE(("OffTheSpotConversion:SelectionGet()\n")); + if (!ocw->offthespot.selectionpoppedup) { /* for safe */ + TRACE(("\tnot in selection mode -- ignored\n")); + return; + } + + XtVaGetValues(ocw->offthespot.selectionwidget, + XtNcurrentItem, current, + NULL); +} + +static void +SelectionMove(ocw, dir) +OffTheSpotConversionWidget ocw; +int dir; +{ + TRACE(("OffTheSpotConversion:SelectionMove()\n")); + if (!ocw->offthespot.selectionpoppedup) { /* for safe */ + TRACE(("\tnot in selection mode -- ignored\n")); + return; + } + + CPanelMoveCurrent(ocw->offthespot.selectionwidget, dir); +} + +/* + * Aux Callback + */ + +static void +AuxControl(w, arg) +Widget w; +ICAuxControlArg *arg; +{ + OffTheSpotConversionWidget ocw = (OffTheSpotConversionWidget)w; + String params[1]; + Cardinal num_params; + + switch (arg->command) { + case ICAuxStart: + AuxStart(ocw); + break; + case ICAuxEnd: + AuxEnd(ocw); + break; + case ICAuxChange: + AuxChange(ocw); + break; + default: + params[0] = XtClass(w)->core_class.class_name; + num_params = 1; + XtAppWarningMsg(XtWidgetToApplicationContext(w), + "parameterError", "AuxControl", "WidgetError", + "%s: unknown aux control command", + params, &num_params); + break; + } +} + +/* ARGSUSED */ +static void +AuxStart(ocw) +OffTheSpotConversionWidget ocw; +{ + ICString *auxstr; + Cardinal ncand, curseg, cursorpos; + + if (ocw->offthespot.auxpoppedup) return; + + /* $B%F%-%9%H%3!<%k%P%C%/$N;~$N$h$&$J=hM}$r$9$k(B + $B$N$O(B AuxPanel.c $B$K$^$+$;$h$&(B */ + + auxstr = ICGetAuxSegments(ocw->ccontrol.inputobj, + &ncand, &curseg, &cursorpos); + + APanelStart(ocw->offthespot.auxwidget, auxstr, ncand, curseg, cursorpos); + + /* $B%]%C%W%"%C%W$9$k>l=j$r7h$a$k(B */ + LocateAuxPopup(ocw); + + XtPopup(ocw->offthespot.auxshell, XtGrabNone); + ocw->offthespot.auxpoppedup = True; +} + +/* ARGSUSED */ +static void +AuxEnd(ocw) +OffTheSpotConversionWidget ocw; +{ + if (!ocw->offthespot.auxpoppedup) return; /* for safe */ + +/* APanelEnd(ocw->offthespot.auxwidget); */ + + XtPopdown(ocw->offthespot.auxshell); + + ocw->offthespot.auxpoppedup = False; +} + +/* ARGSUSED */ +static void +AuxChange(ocw) +OffTheSpotConversionWidget ocw; +{ + Cardinal ncand, curseg, cursorpos; + ICString *auxstr; + + if (!ocw->offthespot.auxpoppedup) return; /* for safe */ + + auxstr = ICGetAuxSegments(ocw->ccontrol.inputobj, + &ncand, &curseg, &cursorpos); + + APanelChange(ocw->offthespot.auxwidget, auxstr, ncand, curseg, cursorpos); +} + +static void +LocateAuxPopup(ocw) +OffTheSpotConversionWidget ocw; +{ + Position x, y; + DisplayLocation lastp; + Dimension dpyWidth, dpyHeight; + Widget canvas = ocw->offthespot.canvaswidget; + Widget panel = ocw->offthespot.auxwidget; + Widget shell = ocw->offthespot.auxshell; + int clx, cly; + Window junk; + int barheight = ocw->ccontrol.titlebarheight; + + if (ocw->offthespot.numsegments > 0) { + computeLastPosition(ocw->offthespot.dispsegments[ocw->offthespot.numsegments - 1].fragments, &lastp); + } else { + lastp.y = 0; + } + lastp.x = canvas->core.width / 2; + lastp.y += ocw->offthespot.lineheight; + (void)XTranslateCoordinates(XtDisplay(canvas), XtWindow(canvas), + RootWindowOfScreen(XtScreen(canvas)), + 0, 0, &clx, &cly, &junk); + + x = clx + lastp.x - panel->core.width / 2; + y = cly + lastp.y + 8; /* XXX */ + + dpyWidth = WidthOfScreen(XtScreen(canvas)); + dpyHeight = HeightOfScreen(XtScreen(canvas)); + + if (x + panel->core.width > dpyWidth) x = dpyWidth - panel->core.width; + if (x < 0) x = 0; + if (y + panel->core.height + barheight > dpyHeight) { + y = cly - panel->core.height - 8 - barheight; + if (y < 0) y = dpyHeight - panel->core.height - barheight; + } + MoveShell(shell, x, y); +} + + +/* + *+ TextCanvas callback + */ + +/*- TextRedisplay: redraw text canvas -*/ +static void +TextRedisplay(w, client_data, call_data) +Widget w; +XtPointer client_data; +XtPointer call_data; +{ + OffTheSpotConversionWidget ocw = (OffTheSpotConversionWidget)client_data; + XExposeEvent *event = (XExposeEvent *)call_data; + XRectangle region; + Boolean cursorredraw; + + TRACE(("OffTheSpotConversion:TextRedisplay()\n")); + region.x = event->x; + region.y = event->y; + region.width = event->width; + region.height = event->height; + + cursorredraw = exposeCursor(ocw, w, ®ion); + redrawSegments(ocw, ®ion); + if (cursorredraw) showCursor(ocw); +} + +/*- TextResize: do reconfiguration (and redraw) of text canvas when resized -*/ +/* ARGSUSED */ +static void +TextResize(w, client_data, call_data) +Widget w; +XtPointer client_data; +XtPointer call_data; /* unused */ +{ + OffTheSpotConversionWidget ocw = (OffTheSpotConversionWidget)client_data; + + TRACE(("OffTheSpotConversion:TextResize()\n")); + recomputeDisplaySegments(ocw); + computeCursor(ocw); + if (XtIsRealized(w)) { + /* redraw it */ + XClearArea(XtDisplay(w), XtWindow(w), 0, 0, 0, 0, True); + } +} + + +/* + *+ Selection Widget callback + */ + +/*- SelectionSelected: selection selected callback -*/ +/* ARGSUSED */ +static void +SelectionSelected(w, client_data, call_data) +Widget w; +XtPointer client_data; +XtPointer call_data; +{ + OffTheSpotConversionWidget ocw = (OffTheSpotConversionWidget)client_data; + int current = (int)call_data; + + TRACE(("OffTheSpotConversion:SelectionSelected()\n")); + XtPopdown(ocw->offthespot.selectionshell); + ocw->offthespot.selectionpoppedup = False; + ICSelectItem(ocw->ccontrol.inputobj, current); +} + + +/* + *+ text drawing functions + */ + +/*- computeDisplaySegments: compare old&new text and update segments/fragments -*/ +static void +computeDisplaySegments(ocw) +OffTheSpotConversionWidget ocw; +{ + Widget inputobj = ocw->ccontrol.inputobj; + Cardinal nnew = ICNumSegments(inputobj); + Cardinal nold = ocw->offthespot.numsegments; + ICString *newseg; + DisplaySegment *dseg; + DisplayLocation disploc; + Cardinal nsame; + int diff; + Cardinal i; + + TRACE(("OffTheSpotConversion:computeDisplaySegments() nnew=%d\n", nnew)); + allocDisplaySegments(ocw, nnew); + + initialLocation(ocw, &disploc); + + for (i = 0, dseg = ocw->offthespot.dispsegments; i < nnew; i++, dseg++) { + newseg = ICGetSegment(ocw->ccontrol.inputobj, i); + if (i >= nold) { + copyString(newseg, &dseg->seg); + dseg->redrawpos = 0; + dseg->fragments = computeDisplayFragments(ocw, newseg, &disploc); + } else { + DisplayFragment *oldfragments, *newfragments; + + dseg->redrawpos = -1; + diff = ICCompareSegment(inputobj, newseg, &dseg->seg, &nsame); + if (diff != ICSame || + disploc.x != dseg->fragments->region.x || + disploc.y != dseg->fragments->region.y) { + oldfragments = dseg->fragments; + newfragments = computeDisplayFragments(ocw, newseg, &disploc); + dseg->fragments = newfragments; + } else { + oldfragments = NULL; + newfragments = dseg->fragments; + computeLastPosition(newfragments, &disploc); + } + + switch (diff) { + case ICSame: + if (oldfragments == NULL || + oldfragments->region.x == newfragments->region.x && + oldfragments->region.y == newfragments->region.y) { + dseg->redrawpos = -1; + } else { + dseg->redrawpos = 0; + } + break; + case ICAttrChanged: + dseg->redrawpos = 0; + dseg->seg.attr = newseg->attr; + break; + case ICStringChanged: + if (oldfragments == NULL || + oldfragments->region.x == newfragments->region.x && + oldfragments->region.y == newfragments->region.y) { + dseg->redrawpos = nsame; + } else { + dseg->redrawpos = 0; + } + freeString(&dseg->seg); + copyString(newseg, &dseg->seg); + break; + default: + dseg->redrawpos = 0; + freeString(&dseg->seg); + copyString(newseg, &dseg->seg); + break; + } + if (oldfragments) freeDisplayFragments(oldfragments); + } + } + + for (; i < nold; i++, dseg++) freeDisplaySegment(dseg); + + ocw->offthespot.numsegments = nnew; +} + +/*- recomputeDisplaySegments: recompute segments/fragments -*/ +static void +recomputeDisplaySegments(ocw) +OffTheSpotConversionWidget ocw; +{ + Cardinal nsegs = ocw->offthespot.numsegments; + DisplaySegment *dseg; + DisplayLocation disploc; + Cardinal i; + + initialLocation(ocw, &disploc); + + for (i = 0, dseg = ocw->offthespot.dispsegments; i < nsegs; i++, dseg++) { + freeDisplayFragments(dseg->fragments); + dseg->redrawpos = 0; + dseg->fragments = computeDisplayFragments(ocw, &dseg->seg, &disploc); + } +} + +/*- computeLastPosition: get last position of the specified fragment list -*/ +static void +computeLastPosition(fragments, disploc) +DisplayFragment *fragments; +DisplayLocation *disploc; +{ + while (fragments->next != NULL) fragments = fragments->next; + disploc->x = fragments->region.x + fragments->region.width; + disploc->y = fragments->region.y; +} + +/*- computeDisplayFragments: compute fragment(s) of the specified segment -*/ +static DisplayFragment * +computeDisplayFragments(ocw, newseg, disploc) +OffTheSpotConversionWidget ocw; +ICString *newseg; +DisplayLocation *disploc; +{ + int start; + int nchars; + Widget dispobj = ocw->offthespot.displayobj; + DisplayFragment *fragments, *dfp; + int widthavailable; + + TRACE(("computeDisplayFragments()\n")); + start = 0; + fragments = NULL; + while (start < newseg->nchars) { + widthavailable = widthAvailable(ocw, disploc); + nchars = CDMaxChar(dispobj, newseg, start, widthavailable); + if (nchars == 0 && disploc->x <= ocw->offthespot.leftmargin) { + /* + * avoiding infinite loop + * we display at least one character per line + */ + nchars = 1; + } + TRACE(("\twidthavailable=%d, start=%d, maxchar=%d\n", widthavailable, start, nchars)); + if (nchars > 0) { + if (fragments == NULL) { + fragments = dfp = allocDisplayFragment(); + } else { + dfp->next = allocDisplayFragment(); + dfp = dfp->next; + } + dfp->from = start; + dfp->nchars = nchars; + dfp->region.x = disploc->x; + dfp->region.y = disploc->y; + dfp->region.width = CDStringWidth(dispobj, newseg, start, + start + nchars); + dfp->region.height = ocw->offthespot.lineheight; + dfp->next = NULL; + + disploc->x += dfp->region.width; + } + start += nchars; + + if (start < newseg->nchars) nextLocation(ocw, disploc); + } + + return fragments; +} + +/*- widthAvailable: return the width of the current line left for drawing -*/ +static int +widthAvailable(ocw, disploc) +OffTheSpotConversionWidget ocw; +DisplayLocation *disploc; +{ + return ocw->offthespot.canvaswidget->core.width - + ocw->offthespot.rightmargin - disploc->x; +} + +/*- initialLocation: return the initial text drawing position -*/ +static void +initialLocation(ocw, disploc) +OffTheSpotConversionWidget ocw; +DisplayLocation *disploc; +{ + int cheight = ocw->offthespot.canvaswidget->core.height; + int lheight = ocw->offthespot.lineheight; + + disploc->x = ocw->offthespot.leftmargin; + if (cheight / lheight == 1) { + /* if there's space for a single line, locate it in the center */ + disploc->y = (cheight - lheight) / 2; + } else { + disploc->y = 0; + } +} + +/*- nextLocation: return the position of the next line -*/ +static void +nextLocation(ocw, disploc) +OffTheSpotConversionWidget ocw; +DisplayLocation *disploc; +{ + disploc->x = ocw->offthespot.leftmargin; + disploc->y += ocw->offthespot.lineheight; +} + +/*- findLocation: compute the display position of specific character -*/ +static DisplayLocation * +findLocation(ocw, dsp, offset, disploc) +OffTheSpotConversionWidget ocw; +DisplaySegment *dsp; +Cardinal offset; +DisplayLocation *disploc; +{ + DisplayFragment *dfp = dsp->fragments; + + while (dfp != NULL) { + if (dfp->nchars > offset || + dfp->next == NULL && dfp->nchars == offset) { + break; + } + offset -= dfp->nchars; + dfp = dfp->next; + } + if (dfp == NULL) return NULL; + + disploc->x = dfp->region.x + CDStringWidth(ocw->offthespot.displayobj, + &dsp->seg, dfp->from, + dfp->from + offset); + disploc->y = dfp->region.y; + + return disploc; +} + +/*- reconfigureDisplay: do reconfiguration of text canvas (resize/popup/popdown) -*/ +static void +reconfigureDisplay(ocw) +OffTheSpotConversionWidget ocw; +{ + DisplaySegment *dsp; + DisplayFragment *dfp; + Widget canvas = ocw->offthespot.canvaswidget; + Position lastx, lasty; + Dimension height = ocw->offthespot.lineheight; + int i; + + lastx = 0; + dsp = ocw->offthespot.dispsegments; + if (ocw->offthespot.numsegments > 0 && dsp->fragments != NULL) { + lasty = dsp->fragments->region.y; + } else { + lasty = 0; + } + for (i = 0, dsp = ocw->offthespot.dispsegments; i < ocw->offthespot.numsegments; i++, dsp++) { + for (dfp = dsp->fragments; dfp != NULL; dfp = dfp->next) { + if (lasty != dfp->region.y) { + XClearArea(XtDisplay(canvas), XtWindow(canvas), + lastx, lasty, 0, height, False); + } + lastx = dfp->region.x + dfp->region.width; + lasty = dfp->region.y; + } + } + + XClearArea(XtDisplay(canvas), XtWindow(canvas), + lastx, lasty, 0, 0, False); + if (lasty + height < canvas->core.height) { + XClearArea(XtDisplay(canvas), XtWindow(canvas), + 0, lasty + height, 0, 0, False); + } +} + +/*- updateDisplay: redraw text (if needed) -*/ +static void +updateDisplay(ocw) +OffTheSpotConversionWidget ocw; +{ + DisplaySegment *dsp = ocw->offthespot.dispsegments; + int i; + + for (i = 0; i < ocw->offthespot.numsegments; i++, dsp++) { + if (dsp->redrawpos >= 0) { + TRACE(("updateDisplaySegment(seg#=%d)\n", i)); + updateDisplaySegment(ocw, dsp); + } + } +} + +/*- updateDisplaySegment: redraw specified segment (if needed) -*/ +static void +updateDisplaySegment(ocw, dsp) +OffTheSpotConversionWidget ocw; +DisplaySegment *dsp; +{ + DisplayFragment *dfp = dsp->fragments; + Widget dispobj = ocw->offthespot.displayobj; + Widget canvas = ocw->offthespot.canvaswidget; + int from; + int x; + + while (dfp != NULL) { + if (dsp->redrawpos < dfp->from + dfp->nchars) { + from = (dsp->redrawpos > dfp->from) ? dsp->redrawpos : dfp->from; + x = dfp->region.x; + if (from > dfp->from) { + x += CDStringWidth(dispobj, &dsp->seg, dfp->from, from); + } + CDDrawString(dispobj, canvas, &dsp->seg, + from, dfp->from + dfp->nchars, + x, dfp->region.y); + } + dfp = dfp->next; + } +} + +/*- redrawSegments: redraw segments in specified area -*/ +static void +redrawSegments(ocw, region) +OffTheSpotConversionWidget ocw; +XRectangle *region; +{ + DisplaySegment *dsp = ocw->offthespot.dispsegments; + DisplayFragment *dfp; + Widget dispobj = ocw->offthespot.displayobj; + Widget canvas = ocw->offthespot.canvaswidget; + int i; + + for (i = 0; i < ocw->offthespot.numsegments; i++, dsp++) { + for (dfp = dsp->fragments; dfp != NULL; dfp = dfp->next) { + if (intersectRect(&dfp->region, region)) { + CDDrawString(dispobj, canvas, &dsp->seg, + dfp->from, dfp->from + dfp->nchars, + dfp->region.x, dfp->region.y); + } + } + } +} + +/* + *+ insert cursor handling + */ + +/*- eraseCursor: erase insert cursor -*/ +static void +eraseCursor(ocw) +OffTheSpotConversionWidget ocw; +{ + if (!ocw->offthespot.cursorvisible) return; + + TRACE(("eraseCursor() at (%d,%d)\n", + ocw->offthespot.cursorlocation.x, + ocw->offthespot.cursorlocation.y)); + CDDrawCursor(ocw->offthespot.displayobj, + ocw->offthespot.canvaswidget, + ocw->offthespot.cursorlocation.x, + ocw->offthespot.cursorlocation.y, + False); + ocw->offthespot.cursorvisible = False; +} + +/*- showCursor: draw insert cursor -*/ +static void +showCursor(ocw) +OffTheSpotConversionWidget ocw; +{ + if (!ocw->offthespot.cursorvisible) return; + + TRACE(("showCursor at (%d,%d)\n", + ocw->offthespot.cursorlocation.x, + ocw->offthespot.cursorlocation.y)); + CDDrawCursor(ocw->offthespot.displayobj, + ocw->offthespot.canvaswidget, + ocw->offthespot.cursorlocation.x, + ocw->offthespot.cursorlocation.y, + True); +} + +/*- exposeCursor: make the insert cursor redraw correctly when exposing -*/ +static Boolean +exposeCursor(ocw, w, region) +OffTheSpotConversionWidget ocw; +Widget w; +XRectangle *region; +{ + XRectangle bounds; + + if (!ocw->offthespot.cursorvisible) return False; + + TRACE(("exposeCursor(region=%d,%d-%d,%d)\n", + region->x, region->y, region->width, region->height)); + CDGetCursorBounds(ocw->offthespot.displayobj, &bounds); + bounds.x += ocw->offthespot.cursorlocation.x; + bounds.y += ocw->offthespot.cursorlocation.y; + if (intersectRect(region, &bounds)) { + eraseCursor(ocw); + XClearArea(XtDisplay(w), XtWindow(w), + bounds.x, bounds.y, bounds.width, bounds.height, False); + unionRect(region, &bounds, region); + } + ocw->offthespot.cursorvisible = True; + return True; +} + +/*- computeCursor: compute cursor position -*/ +static void +computeCursor(ocw) +OffTheSpotConversionWidget ocw; +{ + DisplaySegment *dsp; + DisplayLocation disploc; + Cardinal seg, offset; + + if (ocw->offthespot.numsegments == 0) { + /* special case */ + initialLocation(ocw, &(ocw->offthespot.cursorlocation)); + ocw->offthespot.cursorlocation.y += ocw->offthespot.ascent; + ocw->offthespot.cursorvisible = True; + return; + } + + if (!ICCursorPos(ocw->ccontrol.inputobj, &seg, &offset)) return; + + /* sanity check */ + if (seg >= ocw->offthespot.numsegments) return; + dsp = ocw->offthespot.dispsegments + seg; + if (offset > dsp->seg.nchars) return; + + if (findLocation(ocw, dsp, offset, &disploc) == NULL) return; + + disploc.y += ocw->offthespot.ascent; + + ocw->offthespot.cursorvisible = True; + ocw->offthespot.cursorlocation = disploc; +} + +/* + *+ miscelaneous functions + */ + +/*- MoveShell: move shell widget -*/ +static void +MoveShell(w, x, y) +Widget w; +Position x; +Position y; +{ + XtWidgetGeometry req; + + /* + * calling XtMoveWidget() is NOT enough to move shell widgets. + * we must use XtMakeGeometryRequest() or XtSetValues() to + * invoke root-geometry-manager which modifies the size hint + * appropriately. + */ + req.request_mode = CWX | CWY; + req.x = x; + req.y = y; + (void)XtMakeGeometryRequest(w, &req, (XtWidgetGeometry *)NULL); +} + +/*- getToplevelWindow: get top-level window of a given window -*/ +static Window +getToplevelWindow(dpy, win) +Display *dpy; +Window win; +{ + Atom wm_state; + Atom type; + int format; + unsigned long nitems, bytesafter; + unsigned char *data; + Window root, parent; + Window *children; + unsigned int nchildren; + + /* + * find toplevel window which has WM_STATE property or if no exists, + * direct subwindow of the root window. (ie I assume that if a + * window manager is running, that is a ICCCM compliant one) + */ + wm_state = CachedInternAtom(dpy, "WM_STATE", True); + for (;;) { + type = None; + if (wm_state != None) { + data = NULL; + XGetWindowProperty(dpy, win, wm_state, 0L, 0L, False, + AnyPropertyType, &type, &format, + &nitems, &bytesafter, &data); + if (data != NULL) XtFree((char *)data); + if (type != None) break; + } + if (!XQueryTree(dpy, win, &root, &parent, &children, &nchildren)) break; + if (nchildren > 0) XtFree((char *)children); + if (root == parent) break; + win = parent; + } + return win; +} + +/*- setTransientFor: set WM_TRANSIENT_FOR property to specified widget -*/ +static void +setTransientFor(w, win) +Widget w; +Window win; +{ + if (!XtIsRealized(w)) XtRealizeWidget(w); + XSetTransientForHint(XtDisplay(w), XtWindow(w), win); +} + +/*- intersectRect: return whether given two rectangles have a intersection -*/ +static Boolean +intersectRect(rect1, rect2) +register XRectangle *rect1; +register XRectangle *rect2; +{ + return (rect1->x + rect1->width <= rect2->x || + rect1->x >= rect2->x + rect2->width || + rect1->y + rect1->height <= rect2->y || + rect1->y >= rect2->y + rect2->height) ? False : True; +} + +/*- unionRect: returns a minimum rectangle that covers given two rectangles -*/ +static void +unionRect(rect1, rect2, rect_ret) +register XRectangle *rect1; +register XRectangle *rect2; +XRectangle *rect_ret; +{ + int x0, x1, y0, y1; + + x0 = (rect1->x > rect2->x) ? rect2->x : rect1->x; + y0 = (rect1->y > rect2->y) ? rect2->y : rect1->y; + x1 = (rect1->x + rect1->width > rect2->x + rect2->width) ? + rect1->x + rect1->width : rect2->x + rect2->width; + y1 = (rect1->y + rect1->height > rect2->y + rect2->height) ? + rect1->y + rect1->height : rect2->y + rect2->height; + + rect_ret->x = x0; + rect_ret->y = y0; + rect_ret->width = x1 - x0; + rect_ret->height = y1 - y0; +} + +static DisplayFragment *free_fragments = NULL; + +/*- allocDisplayFragment: get a new fragment -*/ +static DisplayFragment * +allocDisplayFragment() +{ + if (free_fragments == NULL) { + return XtNew(DisplayFragment); + } else { + DisplayFragment *dfp = free_fragments; + free_fragments = dfp->next; + return dfp; + } +} + +/*- freeDisplayFragments: add specified fragment list to the free-list -*/ +static void +freeDisplayFragments(fragments) +DisplayFragment *fragments; +{ + DisplayFragment *dfp = fragments; + + if (dfp == NULL) return; + while (dfp->next != NULL) dfp = dfp->next; + dfp->next = free_fragments; + free_fragments = fragments; +} + +/*- destroyDisplayFragments: do 'free()' specified fragment list -*/ +static void +destroyDisplayFragments(fragments) +DisplayFragment *fragments; +{ + DisplayFragment *dfp; + + while (fragments != NULL) { + dfp = fragments->next; + XtFree((char *)fragments); + fragments = dfp; + } +} + +/*- allocDisplaySegments: prepare specified number of display segments -*/ +static void +allocDisplaySegments(ocw, n) +OffTheSpotConversionWidget ocw; +Cardinal n; +{ + if (ocw->offthespot.dispsegmentsize > n) return; + n = ((n + 3) / 4) * 4 ; + if (ocw->offthespot.dispsegments == NULL) { + ocw->offthespot.dispsegments = (DisplaySegment *)XtMalloc(n * sizeof(DisplaySegment)); + } else { + ocw->offthespot.dispsegments = (DisplaySegment *)XtRealloc((char *)ocw->offthespot.dispsegments, n * sizeof(DisplaySegment)); + } + ocw->offthespot.dispsegmentsize = n; +} + +/*- freeDisplaySegment: free display segment's contents -*/ +static void +freeDisplaySegment(dsp) +DisplaySegment *dsp; +{ + freeString(&dsp->seg); + freeDisplayFragments(dsp->fragments); + dsp->fragments = NULL; +} + +/*- clearAllDisplaySegments: clear all display segment's -*/ +static void +clearAllDisplaySegments(ocw) +OffTheSpotConversionWidget ocw; +{ + DisplaySegment *dsp = ocw->offthespot.dispsegments; + int i; + + for (i = 0; i < ocw->offthespot.numsegments; i++) { + freeDisplaySegment(dsp++); + } + ocw->offthespot.numsegments = 0; +} + +/*- copyString: copy ICString -*/ +static void +copyString(from, to) +ICString *from; +ICString *to; +{ + *to = *from; + to->data = XtMalloc(to->nbytes); + (void)bcopy(from->data, to->data, to->nbytes); +} + +/*- freeString: free ICString -*/ +static void +freeString(seg) +ICString *seg; +{ + XtFree(seg->data); + seg->data = NULL; + seg->nbytes = 0; +} diff -r 000000000000 -r 92745d501b9a lib/OnConv.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/OnConv.c Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,1442 @@ +#ifndef lint +static char *rcsid = "$Id: OnConv.c,v 10.9 1999/05/19 08:52:42 ishisone Exp $"; +#endif +/* + * Copyright (c) 1990 Software Research Associates, Inc. + * Copyright (c) 1999 Kazuki YASUMATSU + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Software Research Associates not be + * used in advertising or publicity pertaining to distribution of the + * software without specific, written prior permission. Software Research + * Associates makes no representations about the suitability of this software + * for any purpose. It is provided "as is" without express or implied + * warranty. + * + * Author: Makoto Ishisone, Software Research Associates, Inc., Japan + * Author: Kazuki YASUMATSU (Kazuki.Yasumatsu@fujixerox.co.jp) + */ + + +#include +#include +#include +#if XtSpecificationRelease > 4 +#include +#endif +#include "CachedAtom.h" +#include "AsyncErr.h" +#include "OnConvP.h" +#include "InputConv.h" +#include "ConvDisp.h" +#include "CandPanel.h" +#include "AuxPanel.h" +#include "ICLabel.h" + +#define DEBUG_VAR debug_OnTheSpotConversion +#include "DebugPrint.h" + +/*- resource table -*/ +static XtResource resources[] = { +#define offset(field) XtOffset(OnTheSpotConversionWidget, onthespot.field) + { XtNpreeditStartCallback, XtCCallback, XtRCallback, sizeof(XtCallbackList), + offset(preeditstartcallback), XtRCallback, (XtPointer)NULL }, + { XtNpreeditDoneCallback, XtCCallback, XtRCallback, sizeof(XtCallbackList), + offset(preeditdonecallback), XtRCallback, (XtPointer)NULL }, + { XtNpreeditDrawCallback, XtCCallback, XtRCallback, sizeof(XtCallbackList), + offset(preeditdrawcallback), XtRCallback, (XtPointer)NULL }, + { XtNpreeditCaretCallback, XtCCallback, XtRCallback, sizeof(XtCallbackList), + offset(preeditcaretcallback), XtRCallback, (XtPointer)NULL }, + { XtNstatusStartCallback, XtCCallback, XtRCallback, sizeof(XtCallbackList), + offset(statusstartcallback), XtRCallback, (XtPointer)NULL }, + { XtNstatusDoneCallback, XtCCallback, XtRCallback, sizeof(XtCallbackList), + offset(statusdonecallback), XtRCallback, (XtPointer)NULL }, + { XtNstatusDrawCallback, XtCCallback, XtRCallback, sizeof(XtCallbackList), + offset(statusdrawcallback), XtRCallback, (XtPointer)NULL }, + { XtNfeedbackAttributes, XtCFeedbackAttributes, + XtRFeedbackAttributes, sizeof(FeedbackAttributes), + offset(feedbackattrs), XtRString, (XtPointer)"U,,R,H" }, +#undef offset +}; + +/*- default translations -*/ +static char translations[] = ": to-inputobj()"; /* same as superclass's */ + +/*- declarations of local structures -*/ +typedef struct { + int attrs_length; + int attrs_limit; + unsigned long *attrs_buffer; +} AttributeBuffer; + +/*- declarations of static functions -*/ +static void ClassInitialize(); +static void Initialize(); +static void Destroy(); +static Boolean SetValues(); + +static void ConversionStartup(); +static void ConversionFinish(); +static void ChangeAttributes(); +static void ChangeFocus(); + +static void StringToFeedbackAttrs(); + +static Widget CreateSelectionWidget(); + +static void UpdateText(); +static void CommitText(); +static void UpdateMode(); +static void SelectionControl(); + +static void SelectionStart(); +static void LocateSelectionPopup(); +static void SelectionEnd(); +static void SelectionSet(); +static void SelectionGet(); +static void SelectionMove(); + +static Widget CreateAuxWidget(); +static void AuxControl(); +static void AuxStart(); +static void AuxEnd(); +static void AuxChange(); +static void LocateAuxPopup(); + +static void SelectionSelected(); + +static Boolean SafeGetWindowAttributes(); +static void MoveShell(); +static Window getToplevelWindow(); +static void setTransientFor(); +static void allocDisplaySegments(); +static void freeDisplaySegment(); +static void clearAllDisplaySegments(); +static void copyString(); +static void freeString(); +static AttributeBuffer *allocAttributeBuffer(); +static void destroyAttributeBuffer(); +static void addAttributeBuffer(); +static unsigned long attrToFeedback(); +static void CBPreeditStart(); +static void CBPreeditDone(); +static void CBPreeditDraw(); +static void CBPreeditCaret(); +static void CBStatusStart(); +static void CBStatusDone(); +static void CBStatusDraw(); + +/*- composite-extension rec: for enabling non-widget children -*/ +static CompositeClassExtensionRec CompositeExtension = { + /* next_extension */ NULL, + /* record_type */ NULLQUARK, + /* version */ XtCompositeExtensionVersion, + /* record_size */ sizeof(CompositeClassExtensionRec), + /* accept_objects */ True, +}; + +/*- onTheSpotConversionClass record -*/ +OnTheSpotConversionClassRec onTheSpotConversionClassRec = { + { /* core fields */ + /* superclass */ (WidgetClass)&conversionControlClassRec, + /* class_name */ "OnTheSpotConversion", + /* widget_size */ sizeof(OnTheSpotConversionRec), + /* class_initialize */ ClassInitialize, + /* class_part_initialize */ NULL, + /* class_inited */ FALSE, + /* initialize */ Initialize, + /* initialize_hook */ NULL, + /* realize */ XtInheritRealize, + /* actions */ NULL, + /* num_actions */ 0, + /* resources */ resources, + /* num_resources */ XtNumber(resources), + /* xrm_class */ NULLQUARK, + /* compress_motion */ TRUE, + /* compress_exposure */ TRUE, + /* compress_enterleave */ TRUE, + /* visible_interest */ FALSE, + /* destroy */ Destroy, + /* resize */ XtInheritResize, + /* expose */ NULL, + /* set_values */ SetValues, + /* set_values_hook */ NULL, + /* set_values_almost */ XtInheritSetValuesAlmost, + /* get_values_hook */ NULL, + /* accept_focus */ NULL, + /* version */ XtVersion, + /* callback_private */ NULL, + /* tm_table */ translations, + /* query_geometry */ XtInheritQueryGeometry, + /* display_accelerator */ XtInheritDisplayAccelerator, + /* extension */ NULL + }, + { /* composite fields */ + /* geometry_manager */ XtInheritGeometryManager, + /* change_managed */ XtInheritChangeManaged, + /* insert_child */ XtInheritInsertChild, + /* delete_child */ XtInheritDeleteChild, + /* extension */ (XtPointer)&CompositeExtension, + }, + { /* shell fields */ + /* extension */ NULL + }, + { /* wm_shell fields */ + /* extension */ NULL + }, + { /* vendor_shell fields */ + /* extension */ NULL + }, + { /* transient_shell fields */ + /* extension */ NULL + }, + { /* conversionControl fields */ + /* Startup */ ConversionStartup, + /* Finish */ ConversionFinish, + /* ChangeAttributes */ ChangeAttributes, + /* ChangeFocus */ ChangeFocus, + /* TextChange */ UpdateText, + /* Fix */ CommitText, + /* ModeChange */ UpdateMode, + /* SelectionControl */ SelectionControl, + /* AuxControl */ AuxControl, + }, + { /* onTheSpotConversion fields */ + /* empty */ 0 + }, +}; + +WidgetClass onTheSpotConversionWidgetClass = (WidgetClass)&onTheSpotConversionClassRec; + +/* + *+ Core class method + */ + +/*- ClassInitialize: class initializer -*/ +/* ARGSUSED */ +static void +ClassInitialize() +{ + /* add String -> FeedbackAttributes converter */ + XtAddConverter(XtRString, XtRFeedbackAttributes, StringToFeedbackAttrs, + (XtConvertArgList)NULL, (Cardinal)0); +} + +/*- Initialize: initalize method -*/ +/* ARGSUSED */ +static void +Initialize(req, new, args, num_args) +Widget req; +Widget new; +ArgList args; +Cardinal *num_args; +{ + OnTheSpotConversionWidget ocw = (OnTheSpotConversionWidget)new; + + (void)CreateSelectionWidget(ocw); + (void)CreateAuxWidget(ocw); + + ocw->onthespot.dispsegments = NULL; + ocw->onthespot.numsegments = 0; + ocw->onthespot.dispsegmentsize = 0; + ocw->onthespot.candlist = NULL; + ocw->onthespot.numcands = 0; + ocw->onthespot.selectionpoppedup = False; + ocw->onthespot.auxpoppedup = False; + ocw->onthespot.lastcaret = 0; + ocw->onthespot.fixnotify = False; +} + +/*- Destroy: destroy method -*/ +static void +Destroy(w) +Widget w; +{ + OnTheSpotConversionWidget ocw = (OnTheSpotConversionWidget)w; + + /* $B%G%#%9%W%l%$%;%0%a%s%H$NNN0h$r2rJ|(B */ + if (ocw->onthespot.dispsegments) { + DisplaySegment *dsp = ocw->onthespot.dispsegments; + int i; + + for (i = 0; i < ocw->onthespot.numsegments; i++) { + freeString(&dsp[i].seg); + } + XtFree((char *)dsp); + } +} + +/*- SetValues: setvalues method -*/ +/* ARGSUSED */ +static Boolean +SetValues(cur, req, new, args, num_args) +Widget cur; +Widget req; +Widget new; +ArgList args; +Cardinal *num_args; +{ + /* OnTheSpotConversionWidget ocw = (OnTheSpotConversionWidget)new; */ + return False; +} + +/* + *+ ConversionControl class method + */ + +/*- ConversionStartup: class specific conversion startup -*/ +static void +ConversionStartup(widget, valuemask, value) +Widget widget; +unsigned long valuemask; +ConversionAttributes *value; +{ + OnTheSpotConversionWidget ocw = (OnTheSpotConversionWidget)widget; + Widget inputobj = ocw->ccontrol.inputobj; + Window toplevel; + + TRACE(("OnTheSpot:ConversionStartup()\n")); + + /* $BFbIt$N%P%C%U%!$r%/%j%"$9$k(B */ + clearAllDisplaySegments(ocw); + + /* WM_TRANSIENT_FOR $B%W%m%Q%F%#$r@5$7$/%;%C%H$9$k(B */ + toplevel = getToplevelWindow(XtDisplay(widget), + ocw->ccontrol.clientwindow); + setTransientFor(ocw->onthespot.selectionshell, toplevel); + setTransientFor(ocw->onthespot.auxshell, toplevel); + + /* + * OnTheSpotConvesion $B$N(B widget $B<+BN$O%]%C%W%"%C%W$5$;$J$$$,!"(B + * $B%P%C%/%(%s%I%?%$%W$N;~$K$O%/%i%$%"%s%H$,$3$N(B widget $B$N(B + * $B%&%#%s%I%&$KBP$7$F%$%Y%s%H$rAw$k$N$G(B Realize $B$@$1$7$F$*$/(B + */ + if (!XtIsRealized(widget)) { + Arg args[2]; + + XtSetArg(args[0], XtNwidth, 1); + XtSetArg(args[1], XtNheight, 1); + XtSetValues(widget, args, 2); + XtRealizeWidget(widget); + } + + ocw->onthespot.lastcaret = 0; + ocw->onthespot.fixnotify = False; + + /* $B%9%F!<%?%9$r99?7$9$k(B */ + UpdateMode(widget); + + /* $B%W%l%(%G%#%C%H$r3+;O$9$k(B */ + CBPreeditStart(widget); +} + +/*- ConversionFinish: class specific conversion finish -*/ +/* ARGSUSED */ +static void +ConversionFinish(w) +Widget w; +{ + OnTheSpotConversionWidget ocw = (OnTheSpotConversionWidget)w; + Atom encoding = XA_COMPOUND_TEXT(XtDisplayOfObject(w)); + int format = 8; + + if (!ocw->onthespot.fixnotify) { + /* $B3NDj$7$F$$$J$$(B */ + DisplaySegment *dseg = ocw->onthespot.dispsegments; + int i, len = 0; + for (i = 0; i < ocw->onthespot.numsegments; i++, dseg++) { + len += dseg->seg.nchars; + } + if (len > 0) { + /* $B%W%l%(%G%#%C%H%P%C%U%!$N>C5n(B */ + unsigned long attr = 0; + CBPreeditDraw(ocw, 0, 0, len, encoding, format, 0, (XPointer)"", + 0, &attr); + } + } + + /* $B%W%l%(%G%#%C%H$r=*N;$9$k(B */ + CBPreeditDone(w); + + /* $B%9%F!<%?%9$r99?7(B($B=i4|2=(B)$B$9$k(B */ + CBStatusDraw(ocw, encoding, format, 0, (XPointer)"", 0); + + if (ocw->onthespot.selectionpoppedup) { + XtPopdown(ocw->onthespot.selectionshell); + ocw->onthespot.selectionpoppedup = False; + } + if (ocw->onthespot.auxpoppedup) { + XtPopdown(ocw->onthespot.auxshell); + ocw->onthespot.auxpoppedup = False; + } +} + +/*- ChangeAttributes: class specific conversion attribute change routine -*/ +/* ARGSUSED */ +static void +ChangeAttributes(w, valuemask, value) +Widget w; +unsigned long valuemask; +ConversionAttributes *value; +{ + /* do nothing */ +} + +/*- ChangeFocus: class specific conversion attribute change routine -*/ +static void +ChangeFocus(w, set) +Widget w; +int set; +{ + if (set) { + UpdateMode(w); + } else { +#if 0 + /* $B%U%)!<%+%9$r<:$C$?>l9g$K$O2?$b$7$J$$(B */ + OnTheSpotConversionWidget ocw = (OnTheSpotConversionWidget)w; + Atom encoding = XA_COMPOUND_TEXT(XtDisplayOfObject(w)); + int format = 8; + + CBStatusDraw(ocw, encoding, format, 0, (XPointer)"", 0); +#endif + } +} + +/* + *+ resource converter + */ + +/*- StringToFeedbackAttrs: string to feedback attiributes converter -*/ +static void +StringToFeedbackAttrs(args, num_args, from, to) +XrmValue *args; +Cardinal *num_args; +XrmValue *from; +XrmValue *to; +{ + char *s = (char *)from->addr; + int idx; + int invalid = 0; + static FeedbackAttributes fba; + + for (idx = 0; idx < 4; idx++) fba.feedbacks[idx] = 0; + + for (idx = 0; idx < 4; idx++) { + int c; + unsigned long fb = 0; + + while ((c = *s++) != ',' && c != '\0') { + switch (c) { + case 'R': case 'r': fb |= XIMReverse; break; + case 'U': case 'u': fb |= XIMUnderline; break; + case 'H': case 'h': fb |= XIMHighlight; break; + case 'P': case 'p': fb |= XIMPrimary; break; + case 'S': case 's': fb |= XIMSecondary; break; + case 'T': case 't': fb |= XIMTertiary; break; + case ' ': case '\t': + break; + default: + invalid++; + break; + } + } + fba.feedbacks[idx] = fb; + if (c == '\0') break; + } + + if (invalid) { + XtStringConversionWarning((char *)from->addr, XtRFeedbackAttributes); + } + to->size = sizeof(fba); + to->addr = (caddr_t)&fba; +} + +/* + *+ sub-widget creation + */ + +/*- CreateSelectionWidget: create selection widget for selecting candidates -*/ +static Widget +CreateSelectionWidget(ocw) +OnTheSpotConversionWidget ocw; +{ + Widget shell, sel; + + /* set width/height so that XtRealizeWidget() doesn't cause error */ + shell = XtVaCreatePopupShell("selectionShell", + transientShellWidgetClass, + (Widget)ocw, + XtNwidth, 1, + XtNheight, 1, + NULL); + ocw->onthespot.selectionshell = shell; + + sel = XtCreateManagedWidget("selection", candidatePanelWidgetClass, + shell, NULL, 0); + (void)XtCreateWidget("display", ocw->ccontrol.displayobjclass, sel, + NULL, 0); + XtAddCallback(sel, XtNcallback, SelectionSelected, (XtPointer)ocw); + XtInstallAccelerators(sel, (Widget)ocw); + + ocw->onthespot.selectionwidget = sel; + + return shell; +} + +/*- CreateAuxWidget: create aux widget for display auxiliary data -*/ +static Widget +CreateAuxWidget(ocw) +OnTheSpotConversionWidget ocw; +{ + Widget shell, sel; + + /* set width/height so that XtRealizeWidget() doesn't cause error */ + shell = XtVaCreatePopupShell("auxShell", + transientShellWidgetClass, + (Widget)ocw, + XtNwidth, 1, + XtNheight, 1, + XtNallowShellResize, True, + NULL); + ocw->onthespot.auxshell = shell; + + sel = XtCreateManagedWidget("aux", auxPanelWidgetClass, + shell, NULL, 0); + (void)XtCreateWidget("display", ocw->ccontrol.displayobjclass, sel, + NULL, 0); + XtAddCallback(sel, XtNcallback, SelectionSelected, (XtPointer)ocw); + XtInstallAccelerators(sel, (Widget)ocw); + + ocw->onthespot.auxwidget = sel; + + return shell; +} + +/* + *+ inputobject callback + */ + +/*- UpdateText: update text -*/ +static void +UpdateText(w) +Widget w; +{ + OnTheSpotConversionWidget ocw = (OnTheSpotConversionWidget)w; + Widget inputobj = ocw->ccontrol.inputobj; + int nnew = ICNumSegments(inputobj); + int nold = ocw->onthespot.numsegments; + FeedbackAttributes *fba = &ocw->onthespot.feedbackattrs; + Cardinal cseg, caret; + ICString *newseg; + DisplaySegment *dseg; + Boolean changed; + int chgseg, chgoffset; + int oldlen; + AttributeBuffer *buffer; + int i; + int diff; + Cardinal nsame; + + TRACE(("OnTheSpotConversion:UpdateText() nnew=%d\n", nnew)); + + ocw->onthespot.fixnotify = False; + + if (!ICCursorPos(inputobj, &cseg, &caret)) { + cseg = nnew; + caret = 0; + } + + allocDisplaySegments(ocw, nnew); + + changed = False; + chgseg = chgoffset = 0; + oldlen = 0; + buffer = allocAttributeBuffer(); + for (i = 0, dseg = ocw->onthespot.dispsegments; i < nnew; i++, dseg++) { + newseg = ICGetSegment(inputobj, i); + if (i < cseg) { + caret += newseg->nchars; + } + if (i >= nold) { + copyString(newseg, &dseg->seg); + addAttributeBuffer(buffer, inputobj, newseg, 0, fba); + if (!changed) { + chgseg = i; + chgoffset = 0; + changed = True; + } + } else { + oldlen += dseg->seg.nchars; + diff = ICCompareSegment(inputobj, newseg, &dseg->seg, &nsame); + switch (diff) { + case ICSame: + if (changed) { + addAttributeBuffer(buffer, inputobj, newseg, 0, fba); + } + break; + case ICAttrChanged: + dseg->seg.attr = newseg->attr; + addAttributeBuffer(buffer, inputobj, newseg, 0, fba); + if (!changed) { + chgseg = i; + chgoffset = 0; + changed = True; + } + break; + case ICStringChanged: + freeString(&dseg->seg); + copyString(newseg, &dseg->seg); + if (!changed) { + addAttributeBuffer(buffer, inputobj, newseg, nsame, fba); + chgseg = i; + chgoffset = nsame; + changed = True; + } + else { + addAttributeBuffer(buffer, inputobj, newseg, 0, fba); + } + break; + default: /* ICAttrChanged | ICStringChanged */ + freeString(&dseg->seg); + copyString(newseg, &dseg->seg); + addAttributeBuffer(buffer, inputobj, newseg, 0, fba); + if (!changed) { + chgseg = i; + chgoffset = 0; + changed = True; + } + break; + } + } + } + + for (; i < nold; i++, dseg++) { + oldlen += dseg->seg.nchars; + if (!changed) { + chgseg = i; + chgoffset = 0; + changed = True; + } + freeDisplaySegment(dseg); + } + + ocw->onthespot.numsegments = nnew; + + if (!changed) { + if (ocw->onthespot.lastcaret != caret) { + CBPreeditCaret(ocw, caret); + } + } + else { /* changed */ + Atom encoding = ocw->ccontrol.textencoding; + int format; + int length; + XtPointer string; + + if (ICGetPreeditString(inputobj, chgseg, chgoffset, &encoding, &format, + &length, &string) == 0) { + + dseg = ocw->onthespot.dispsegments; + for (i = 0; i < chgseg; i++, dseg++) { + chgoffset += dseg->seg.nchars; + } + CBPreeditDraw(ocw, caret, chgoffset, oldlen - chgoffset, + encoding, format, length, string, + buffer->attrs_length, buffer->attrs_buffer); + + /* string $B$r(B free $B$7$F$*$/(B */ + XtFree((char *)string); + } + } + + ocw->onthespot.lastcaret = caret; + + /* buffer $B$r(B destroy $B$7$F$*$/(B */ + destroyAttributeBuffer(buffer); +} + +/*- CommitText: commit text -*/ +static void +CommitText(w, arg) +Widget w; +CCTextCallbackArg *arg; +{ + OnTheSpotConversionWidget ocw = (OnTheSpotConversionWidget)w; + DisplaySegment *dseg; + int i, len; + + dseg = ocw->onthespot.dispsegments; + len = 0; + for (i = 0; i < ocw->onthespot.numsegments; i++, dseg++) { + len += dseg->seg.nchars; + } + if (len > 0) { + /* $B%W%l%(%G%#%C%H%P%C%U%!$N>C5n(B */ + Atom encoding = XA_COMPOUND_TEXT(XtDisplayOfObject(w)); + int format = 8; + unsigned long attr = 0; + CBPreeditDraw(ocw, 0, 0, len, encoding, format, 0, (XPointer)"", + 0, &attr); + } + /* $BFbIt$N%P%C%U%!$r%/%j%"$9$k(B */ + clearAllDisplaySegments(ocw); + ocw->onthespot.lastcaret = 0; + + XtCallCallbackList((Widget)ocw, ocw->ccontrol.textcallback, + (XtPointer)arg); + + ocw->onthespot.fixnotify = True; +} + +/*- UpdateMode: update mode -*/ +static void +UpdateMode(w) +Widget w; +{ + OnTheSpotConversionWidget ocw = (OnTheSpotConversionWidget)w; + Widget inputobj = ocw->ccontrol.inputobj; + Atom encoding = ocw->ccontrol.textencoding; + int format; + int length; + XtPointer string; + int nchars; + + TRACE(("OnTheSpotConversion:UpdateMode()\n")); + + if (ICGetStatusString(inputobj, &encoding, &format, &length, &string, + &nchars) == -1) + return; + + CBStatusDraw(ocw, encoding, format, length, string, nchars); + + /* string $B$r(B free $B$7$F$*$/(B */ + XtFree((char *)string); +} + +/*- SelectionControl: selection control -*/ +static void +SelectionControl(w, arg) +Widget w; +ICSelectionControlArg *arg; +{ + OnTheSpotConversionWidget ocw = (OnTheSpotConversionWidget)w; + String params[1]; + Cardinal num_params; + + switch (arg->command) { + case ICSelectionStart: + SelectionStart(ocw, arg->u.selection_kind); + break; + case ICSelectionEnd: + SelectionEnd(ocw, &arg->u.current_item); + break; + case ICSelectionSet: + SelectionSet(ocw, arg->u.current_item); + break; + case ICSelectionMove: + SelectionMove(ocw, arg->u.dir); + break; + case ICSelectionGet: + SelectionGet(ocw, &arg->u.current_item); + break; + default: + params[0] = XtClass(w)->core_class.class_name; + num_params = 1; + XtAppWarningMsg(XtWidgetToApplicationContext(w), + "parameterError", "SelectionControl", "WidgetError", + "%s: unknown selection control command", + params, &num_params); + break; + } +} + +/*- SelectionStart: selection startup -*/ +/* ARGSUSED */ +static void +SelectionStart(ocw, kind) +OnTheSpotConversionWidget ocw; +int kind; +{ + Cardinal ncand; + + TRACE(("OnTheSpotConversion:SelectionStart()\n")); + if (ocw->onthespot.selectionpoppedup) { + TRACE(("\tselection already started -- ignored\n")); + return; + } + + ocw->onthespot.candlist = ICGetItemList(ocw->ccontrol.inputobj, &ncand); + ocw->onthespot.numcands = ncand; + + TRACE(("\tnumcands=%d\n", ocw->onthespot.numcands)); + CPanelSetList(ocw->onthespot.selectionwidget, + ocw->onthespot.candlist, + ocw->onthespot.numcands, 0, True); + + LocateSelectionPopup(ocw); + XtPopup(ocw->onthespot.selectionshell, XtGrabNone); + ocw->onthespot.selectionpoppedup = True; +} + +/*- LocateSelectionPopup: put selection popup at an appropriate position -*/ +static void +LocateSelectionPopup(ocw) +OnTheSpotConversionWidget ocw; +{ + Position x, y; + int clx, cly; + Dimension dpyWidth, dpyHeight; + Widget panel = ocw->onthespot.selectionwidget; + Widget shell = ocw->onthespot.selectionshell; + Window junk; + int barheight = ocw->ccontrol.titlebarheight; + + (void)XTranslateCoordinates(XtDisplay(ocw), + ocw->ccontrol.clientwindow, + RootWindowOfScreen(XtScreen(ocw)), + 0, 0, &clx, &cly, &junk); + + (void)SafeGetWindowAttributes(XtDisplay(ocw), ocw->ccontrol.clientwindow, + &(ocw->ccontrol.client_attr)); + + x = clx; + y = cly + ocw->ccontrol.client_attr.height; + + dpyWidth = WidthOfScreen(XtScreen(shell)); + dpyHeight = HeightOfScreen(XtScreen(shell)); + + if (x + panel->core.width > (int)dpyWidth) x = dpyWidth - panel->core.width; + if (x < 0) x = 0; +#if 0 + if (y + panel->core.height + barheight > (int)dpyHeight) { + y = cly - panel->core.height - 8 - barheight - 20; /* XXX */ + if (y < 0) y = dpyHeight - panel->core.height - barheight; + } +#endif + if (y + panel->core.height + barheight > (int)dpyHeight) + y = dpyHeight - panel->core.height - 8 - barheight - 20; /* XXX */ + if (y < 0) y = 0; + MoveShell(shell, x, y); +} + +/*- SelectionEnd: selection finish -*/ +static void +SelectionEnd(ocw, current) +OnTheSpotConversionWidget ocw; +int *current; +{ + TRACE(("OnTheSpotConversion:SelectionEnd()\n")); + + if (!ocw->onthespot.selectionpoppedup) { /* for safe */ + TRACE(("\tnot in selection mode -- ignored\n")); + return; + } + + XtVaGetValues(ocw->onthespot.selectionwidget, + XtNcurrentItem, current, + NULL); + + XtPopdown(ocw->onthespot.selectionshell); + + ocw->onthespot.selectionpoppedup = False; +} + +/*- SelectionSet: set current selection item -*/ +static void +SelectionSet(ocw, current) +OnTheSpotConversionWidget ocw; +int current; +{ + TRACE(("OnTheSpotConversion:SelectionSet()\n")); + + if (!ocw->onthespot.selectionpoppedup) { /* for safe */ + TRACE(("\tnot in selection mode -- ignored\n")); + return; + } + + XtVaSetValues(ocw->onthespot.selectionwidget, + XtNcurrentItem, current, + NULL); +} + +/*- SelectionGet: get current selection item -*/ +static void +SelectionGet(ocw, current) +OnTheSpotConversionWidget ocw; +int *current; +{ + TRACE(("OnTheSpotConversion:SelectionGet()\n")); + + if (!ocw->onthespot.selectionpoppedup) { /* for safe */ + TRACE(("\tnot in selection mode -- ignored\n")); + return; + } + + XtVaGetValues(ocw->onthespot.selectionwidget, + XtNcurrentItem, current, + NULL); +} + +/*- SelectionMove: move crrent selection to specified direction -*/ +static void +SelectionMove(ocw, dir) +OnTheSpotConversionWidget ocw; +int dir; +{ + TRACE(("OnTheSpotConversion:SelectionMove()\n")); + + if (!ocw->onthespot.selectionpoppedup) { /* for safe */ + TRACE(("\tnot in selection mode -- ignored\n")); + return; + } + + CPanelMoveCurrent(ocw->onthespot.selectionwidget, dir); +} + +/* + * Aux Callback + */ + +static void +AuxControl(w, arg) +Widget w; +ICAuxControlArg *arg; +{ + OnTheSpotConversionWidget ocw = (OnTheSpotConversionWidget)w; + String params[1]; + Cardinal num_params; + + switch (arg->command) { + case ICAuxStart: + AuxStart(ocw); + break; + case ICAuxEnd: + AuxEnd(ocw); + break; + case ICAuxChange: + AuxChange(ocw); + break; + default: + params[0] = XtClass(w)->core_class.class_name; + num_params = 1; + XtAppWarningMsg(XtWidgetToApplicationContext(w), + "parameterError", "AuxControl", "WidgetError", + "%s: unknown aux control command", + params, &num_params); + break; + } +} + +/* ARGSUSED */ +static void +AuxStart(ocw) +OnTheSpotConversionWidget ocw; +{ + ICString *auxstr; + Cardinal ncand, curseg, cursorpos; + + if (ocw->onthespot.auxpoppedup) return; + + /* $B%F%-%9%H%3!<%k%P%C%/$N;~$N$h$&$J=hM}$r$9$k(B + $B$N$O(B AuxPanel.c $B$K$^$+$;$h$&(B */ + + auxstr = ICGetAuxSegments(ocw->ccontrol.inputobj, + &ncand, &curseg, &cursorpos); + + APanelStart(ocw->onthespot.auxwidget, auxstr, ncand, curseg, cursorpos); + + /* $B%]%C%W%"%C%W$9$k>l=j$r7h$a$k(B */ + LocateAuxPopup(ocw); + + XtPopup(ocw->onthespot.auxshell, XtGrabNone); + ocw->onthespot.auxpoppedup = True; +} + +/* ARGSUSED */ +static void +AuxEnd(ocw) +OnTheSpotConversionWidget ocw; +{ + if (!ocw->onthespot.auxpoppedup) return; /* for safe */ + +/* APanelEnd(ocw->onthespot.auxwidget); */ + + XtPopdown(ocw->onthespot.auxshell); + + ocw->onthespot.auxpoppedup = False; +} + +/* ARGSUSED */ +static void +AuxChange(ocw) +OnTheSpotConversionWidget ocw; +{ + Cardinal ncand, curseg, cursorpos; + ICString *auxstr; + + if (!ocw->onthespot.auxpoppedup) return; /* for safe */ + + auxstr = ICGetAuxSegments(ocw->ccontrol.inputobj, + &ncand, &curseg, &cursorpos); + + APanelChange(ocw->onthespot.auxwidget, auxstr, ncand, curseg, cursorpos); +} + +/*- LocateAuxPopup: put aux popup at an appropriate position -*/ +static void +LocateAuxPopup(ocw) +OnTheSpotConversionWidget ocw; +{ + Position x, y; + int clx, cly; + Dimension dpyWidth, dpyHeight; + Widget panel = ocw->onthespot.auxwidget; + Widget shell = ocw->onthespot.auxshell; + Window junk; + int barheight = ocw->ccontrol.titlebarheight; + + (void)XTranslateCoordinates(XtDisplay(ocw), + ocw->ccontrol.clientwindow, + RootWindowOfScreen(XtScreen(ocw)), + 0, 0, &clx, &cly, &junk); + + (void)SafeGetWindowAttributes(XtDisplay(ocw), ocw->ccontrol.clientwindow, + &(ocw->ccontrol.client_attr)); + + x = clx; + y = cly + ocw->ccontrol.client_attr.height; + + dpyWidth = WidthOfScreen(XtScreen(shell)); + dpyHeight = HeightOfScreen(XtScreen(shell)); + + if (x + panel->core.width > (int)dpyWidth) x = dpyWidth - panel->core.width; + if (x < 0) x = 0; +#if 0 + if (y + panel->core.height + barheight > (int)dpyHeight) { + y = cly - panel->core.height - 8 - barheight - 20; /* XXX */ + if (y < 0) y = dpyHeight - panel->core.height - barheight; + } +#endif + if (y + panel->core.height + barheight > (int)dpyHeight) + y = dpyHeight - panel->core.height - 8 - barheight - 20; /* XXX */ + if (y < 0) y = 0; + MoveShell(shell, x, y); +} + +/* + *+ Selection Widget callback + */ + +/*- SelectionSelected: selection selected callback -*/ +/* ARGSUSED */ +static void +SelectionSelected(w, client_data, call_data) +Widget w; +XtPointer client_data; +XtPointer call_data; +{ + OnTheSpotConversionWidget ocw = (OnTheSpotConversionWidget)client_data; + int current = (int)call_data; + + TRACE(("OnTheSpotConversion:SelectionSelected()\n")); + XtPopdown(ocw->onthespot.selectionshell); + ocw->onthespot.selectionpoppedup = False; + ICSelectItem(ocw->ccontrol.inputobj, current); +} + +/* + *+ miscelaneous functions + */ + +/*- SafeGetWindowAttributes: get window attributes -*/ +static Boolean +SafeGetWindowAttributes(dpy, w, attr) +Display *dpy; +Window w; +XWindowAttributes *attr; +{ + XAEHandle h; + unsigned long errbits = 0; + + h = XAESetRecordErrors(dpy, &errbits); + (void)XGetWindowAttributes(dpy, w, attr); + XAEUnset(h); + + return (errbits == 0); +} + +/*- MoveShell: move shell widget -*/ +static void +MoveShell(w, x, y) +Widget w; +Position x; +Position y; +{ + XtWidgetGeometry req; + + /* + * calling XtMoveWidget() is NOT enough to move shell widgets. + * we must use XtMakeGeometryRequest() or XtSetValues() to + * invoke root-geometry-manager which modifies the size hint + * appropriately. + */ + req.request_mode = CWX | CWY; + req.x = x; + req.y = y; + (void)XtMakeGeometryRequest(w, &req, (XtWidgetGeometry *)NULL); +} + +/*- getToplevelWindow: get top-level window of a given window -*/ +static Window +getToplevelWindow(dpy, win) +Display *dpy; +Window win; +{ + Atom wm_state; + Atom type; + int format; + unsigned long nitems, bytesafter; + unsigned char *data; + Window root, parent; + Window *children; + unsigned int nchildren; + + /* + * find toplevel window which has WM_STATE property or if no exists, + * direct subwindow of the root window. (ie I assume that if a + * window manager is running, that is a ICCCM compliant one) + */ + wm_state = CachedInternAtom(dpy, "WM_STATE", True); + for (;;) { + type = None; + if (wm_state != None) { + data = NULL; + XGetWindowProperty(dpy, win, wm_state, 0L, 0L, False, + AnyPropertyType, &type, &format, + &nitems, &bytesafter, &data); + if (data != NULL) XtFree((char *)data); + if (type != None) break; + } + if (!XQueryTree(dpy, win, &root, &parent, &children, &nchildren)) break; + if (nchildren > 0) XtFree((char *)children); + if (root == parent) break; + win = parent; + } + return win; +} + +/*- setTransientFor: set WM_TRANSIENT_FOR property to specified widget -*/ +static void +setTransientFor(w, win) +Widget w; +Window win; +{ + if (!XtIsRealized(w)) XtRealizeWidget(w); + XSetTransientForHint(XtDisplay(w), XtWindow(w), win); +} + +/*- allocDisplaySegments: prepare specified number of display segments -*/ +static void +allocDisplaySegments(ocw, n) +OnTheSpotConversionWidget ocw; +Cardinal n; +{ + if (ocw->onthespot.dispsegmentsize > n) return; + n = ((n + 3) / 4) * 4 ; + if (ocw->onthespot.dispsegments == NULL) { + ocw->onthespot.dispsegments = (DisplaySegment *)XtMalloc(n * sizeof(DisplaySegment)); + } else { + ocw->onthespot.dispsegments = (DisplaySegment *)XtRealloc((char *)ocw->onthespot.dispsegments, n * sizeof(DisplaySegment)); + } + ocw->onthespot.dispsegmentsize = n; +} + +/*- freeDisplaySegment: free display segment's contents -*/ +static void +freeDisplaySegment(dsp) +DisplaySegment *dsp; +{ + freeString(&dsp->seg); +} + +/*- clearAllDisplaySegments: clear all display segment's -*/ +static void +clearAllDisplaySegments(ocw) +OnTheSpotConversionWidget ocw; +{ + DisplaySegment *dsp = ocw->onthespot.dispsegments; + int i; + + for (i = 0; i < ocw->onthespot.numsegments; i++) { + freeDisplaySegment(dsp++); + } + ocw->onthespot.numsegments = 0; +} + +/*- copyString: copy ICString -*/ +static void +copyString(from, to) +ICString *from; +ICString *to; +{ + *to = *from; + to->data = XtMalloc(to->nbytes); + (void)bcopy(from->data, to->data, to->nbytes); +} + +/*- freeString: free ICString -*/ +static void +freeString(seg) +ICString *seg; +{ + XtFree(seg->data); + seg->data = NULL; + seg->nbytes = 0; +} + +/*- allocAttributeBuffer: allocate attribute buffer -*/ +static AttributeBuffer * +allocAttributeBuffer() +{ + AttributeBuffer *buffer; + + buffer = (AttributeBuffer *)XtMalloc(sizeof(AttributeBuffer)); + buffer->attrs_length = 0; + buffer->attrs_limit = 64; + buffer->attrs_buffer = (unsigned long *)XtMalloc(buffer->attrs_limit * sizeof(unsigned long)); + return buffer; +} + +/*- destroyAttributeBuffer: destroy draw string buffer's contents -*/ +static void +destroyAttributeBuffer(buffer) +AttributeBuffer *buffer; +{ + XtFree((char *)buffer->attrs_buffer); + XtFree((char *)buffer); +} + +/*- addAttributeBuffer: add segment to draw string buffer's contents -*/ +static void +addAttributeBuffer(buffer, inputobj, seg, offset, fba) +AttributeBuffer *buffer; +Widget inputobj; +ICString *seg; +int offset; +FeedbackAttributes *fba; +{ + int nchars = seg->nchars - offset; + unsigned long fb; + int i; + + if (buffer->attrs_length + nchars > buffer->attrs_limit) { + unsigned long *new_attrs_buffer; + int new_limit = buffer->attrs_limit * 2; + if (new_limit < buffer->attrs_length + nchars) + new_limit = buffer->attrs_length + nchars + 8; + new_attrs_buffer = (unsigned long *)XtMalloc(new_limit * sizeof(unsigned long)); + bcopy(buffer->attrs_buffer, new_attrs_buffer, + buffer->attrs_length * sizeof(unsigned long)); + XtFree((char *)buffer->attrs_buffer); + buffer->attrs_limit = new_limit; + buffer->attrs_buffer = new_attrs_buffer; + } + fb = attrToFeedback(fba, seg->attr); + for (i = 0; i < nchars; i++) { + buffer->attrs_buffer[buffer->attrs_length + i] = fb; + } + buffer->attrs_length += nchars; +} + +/*- attrToFeedback: ICString attribute -> XIMFeedback attribute converter -*/ +static unsigned long +attrToFeedback(fba, attr) +FeedbackAttributes *fba; +int attr; +{ + int idx; + + if (attr == ICAttrNormalString) return 0; + + if (!(attr & ICAttrConverted)) { + /* Not yet converted */ + idx = FEEDBACK_NOCONV; + } else if (attr & ICAttrCurrentSegment) { + /* it's converted and the current segment */ + idx = FEEDBACK_CURRENT; + } else if (attr & ICAttrCurrentSubSegment) { + /* it's converted and the current sub segment */ + idx = FEEDBACK_CURRENTSUB; + } else { + /* converted, not current */ + idx = FEEDBACK_CONV; + } + return fba->feedbacks[idx]; +} + +/*- CBPreeditStart: callback preedit start -*/ +static void +CBPreeditStart(ocw) +OnTheSpotConversionWidget ocw; +{ + if (ocw->onthespot.preeditstartcallback == NULL || + XtHasCallbacks((Widget)ocw, XtNpreeditStartCallback) != XtCallbackHasSome) + { + /* no callback */ + return; + } + + TRACE(("OnTheSpot:CBPreeditStart()\n")); + + XtCallCallbackList((Widget)ocw, ocw->onthespot.preeditstartcallback, + (XtPointer)NULL); +} + +/*- CBPreeditDone: callback preedit done -*/ +static void +CBPreeditDone(ocw) +OnTheSpotConversionWidget ocw; +{ + if (ocw->onthespot.preeditdonecallback == NULL || + XtHasCallbacks((Widget)ocw, XtNpreeditDoneCallback) != XtCallbackHasSome) + { + /* no callback */ + return; + } + + TRACE(("OnTheSpot:CBPreeditDone()\n")); + + XtCallCallbackList((Widget)ocw, ocw->onthespot.preeditdonecallback, + (XtPointer)NULL); +} + +/*- CBPreeditDraw: callback preedit draw -*/ +static void +CBPreeditDraw(ocw, caret, chg_first, chg_length, encoding, format, text_length, text, attrs_length, attrs) +OnTheSpotConversionWidget ocw; +int caret; +int chg_first; +int chg_length; +Atom encoding; +int format; +int text_length; +XtPointer text; +int attrs_length; +unsigned long *attrs; +{ + OCCPreeditDrawArg arg; + + if (ocw->onthespot.preeditdrawcallback == NULL || + XtHasCallbacks((Widget)ocw, XtNpreeditDrawCallback) != XtCallbackHasSome) + { + /* no callback */ + return; + } + + TRACE(("OnTheSpot:CBPreeditDraw()\n")); + + arg.caret = caret; + arg.chg_first = chg_first; + arg.chg_length = chg_length; + arg.encoding = encoding; + arg.format = format; + arg.text_length = text_length; + arg.text = text; + arg.attrs_length = attrs_length; + arg.attrs = attrs; + XtCallCallbackList((Widget)ocw, ocw->onthespot.preeditdrawcallback, + (XtPointer)&arg); +} + +/*- CBPreeditCaret: callback preedit caret -*/ +static void +CBPreeditCaret(ocw, caret) +OnTheSpotConversionWidget ocw; +int caret; +{ + if (ocw->onthespot.preeditcaretcallback == NULL || + XtHasCallbacks((Widget)ocw, XtNpreeditCaretCallback) != XtCallbackHasSome) + { + /* no callback */ + return; + } + + TRACE(("OnTheSpot:CBPreeditCaret()\n")); + + XtCallCallbackList((Widget)ocw, ocw->onthespot.preeditcaretcallback, + (XtPointer)caret); +} + +/*- CBStatusStart: callback status start -*/ +static void +CBStatusStart(ocw) +OnTheSpotConversionWidget ocw; +{ + if (ocw->onthespot.statusstartcallback == NULL || + XtHasCallbacks((Widget)ocw, XtNstatusStartCallback) != XtCallbackHasSome) + { + /* no callback */ + return; + } + + TRACE(("OnTheSpot:CBStatusStart()\n")); + + XtCallCallbackList((Widget)ocw, ocw->onthespot.statusstartcallback, + (XtPointer)NULL); +} + +/*- CBStatusDone: callback status done -*/ +static void +CBStatusDone(ocw) +OnTheSpotConversionWidget ocw; +{ + if (ocw->onthespot.statusdonecallback == NULL || + XtHasCallbacks((Widget)ocw, XtNstatusDoneCallback) != XtCallbackHasSome) + { + /* no callback */ + return; + } + + TRACE(("OnTheSpot:CBStatusDone()\n")); + + XtCallCallbackList((Widget)ocw, ocw->onthespot.statusdonecallback, + (XtPointer)NULL); +} + +/*- CBStatusDraw: callback status draw -*/ +static void +CBStatusDraw(ocw, encoding, format, length, text, nchars) +OnTheSpotConversionWidget ocw; +Atom encoding; +int format; +int length; +XtPointer text; +int nchars; +{ + OCCPreeditDrawArg arg; + + if (ocw->onthespot.statusdrawcallback == NULL || + XtHasCallbacks((Widget)ocw, XtNstatusDrawCallback) != XtCallbackHasSome) + { + /* no callback */ + return; + } + + TRACE(("OnTheSpot:CBStatusDraw()\n")); + + arg.caret = 0; /* ignored */ + arg.chg_first = 0; /* ignored */ + arg.chg_length = 0; /* ignored */ + arg.encoding = encoding; + arg.format = format; + arg.text_length = length; + arg.text = text; + arg.attrs_length = nchars; + arg.attrs = NULL; /* ignored */ + XtCallCallbackList((Widget)ocw, ocw->onthespot.statusdrawcallback, + (XtPointer)&arg); +} + diff -r 000000000000 -r 92745d501b9a lib/OverConv.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/OverConv.c Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,2708 @@ +#ifndef lint +static char *rcsid = "$Id: OverConv.c,v 1.71 1999/05/06 09:07:58 ishisone Exp $"; +#endif +/*- + * Copyright (c) 1990 Software Research Associates, Inc. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Software Research Associates not be + * used in advertising or publicity pertaining to distribution of the + * software without specific, written prior permission. Software Research + * Associates makes no representations about the suitability of this software + * for any purpose. It is provided "as is" without express or implied + * warranty. + * + * Author: Makoto Ishisone, Software Research Associates, Inc., Japan + */ + +#include +#include +#include +#if XtSpecificationRelease > 4 +#include +#endif +#include "CachedAtom.h" +#include "AsyncErr.h" +#include "OverConvP.h" +#include "InputConv.h" +#include "ConvDisp.h" +#include "CandPanel.h" +#include "AuxPanel.h" +#include "CanvasShel.h" +#include "ICLabel.h" + +#define DEBUG_VAR debug_OverTheSpotConversion +#include "DebugPrint.h" + +typedef enum { NeedNone, NeedRedraw, NeedReconfig } ResetStatus; + +/*- resource table -*/ +static XtResource resources[] = { +#define offset(field) XtOffset(OverTheSpotConversionWidget, overthespot.field) + { XtNspotX, XtCPosition, XtRPosition, sizeof(Position), + offset(spotx), XtRImmediate, (XtPointer)0 }, + { XtNspotY, XtCPosition, XtRPosition, sizeof(Position), + offset(spoty), XtRImmediate, (XtPointer)0 }, + { XtNautoSpotForwarding, XtCAutoSpotForwarding, XtRBoolean, sizeof(Boolean), + offset(spotforwarding), XtRImmediate, (XtPointer)False }, + { XtNlineSpacing, XtCLineSpacing, XtRDimension, sizeof(Dimension), + offset(linespacing), XtRImmediate, (XtPointer)0 }, + { XtNmodeLocation, XtCModeLocation, XtRModeLocation, sizeof(ModeLocation), + offset(modelocation), XtRString, "BottomLeft" }, + { XtNshrinkWindow, XtCShrinkWindow, XtRBoolean, sizeof(Boolean), + offset(shrinkwindow), XtRImmediate, (XtPointer)False }, + { XtNignoreStatusAreaSpec, XtCIgnoreStatusAreaSpec, + XtRBoolean, sizeof(Boolean), + offset(ignorestatusarea), XtRImmediate, (XtPointer)False }, + { XtNmodeBorderForeground, XtCModeBorderForeground, + XtRBoolean, sizeof(Boolean), + offset(borderforeground), XtRImmediate, (XtPointer)False }, + { XtNuseOverrideShellForMode, XtCUseOverrideShellForMode, + XtRBoolean, sizeof(Boolean), + offset(useoverride), XtRImmediate, (XtPointer)False }, + /* changes superclass's default */ + { XtNmappedWhenManaged, XtCMappedWhenManaged, XtRBoolean, sizeof(Boolean), + XtOffset(OverTheSpotConversionWidget, core.mapped_when_managed), + XtRImmediate, (XtPointer)False }, +#undef offset +}; + +/*- default translation table -*/ +static char translations[] = ": to-inputobj()"; /* same as superclass's */ + +/*- declarations of static functions -*/ +static void ClassInitialize(); +static void Initialize(); +static void Destroy(); +static Boolean SetValues(); + +static void ConversionStartup(); +static void ChangeAttributes(); +static void ChangeFocus(); +static void ConversionFinish(); + +static void CreateDisplayObject(); +static void CreateSelectionWidget(); +static void CreateModeWidget(); +static TextCanvas * CreateTextCanvas(); + +static void setupTextCanvas(); +static ResetStatus resetTextCanvas(); +static void setupDisplayObject(); +static ResetStatus resetDisplayObject(); +static void setupModeWidget(); +static ResetStatus resetModeWidget(); +static void locateTextCanvasInitial(); +static void locateModeWidget(); +static void locateTrackingModeWidget(); +static void redrawAndReconfigureTextCanvas(); + +static void UpdateText(); +static void UpdateMode(); +static void SelectionControl(); + +static void SelectionStart(); +static void locateSelectionPopup(); +static void SelectionEnd(); +static void SelectionSet(); +static void SelectionGet(); +static void SelectionMove(); +static void ForwardSpot(); + +static void CreateAuxWidget(); +static void AuxControl(); +static void AuxStart(); +static void locateAuxPopup(); +static void AuxEnd(); +static void AuxChange(); + + +static void TextRedisplay(); + +static void SelectionSelected(); + +static void computeDisplaySegments(); +static void recomputeDisplaySegments(); +static void computeLastPosition(); +static DisplayFragment *computeDisplayFragments(); +static int computeWidthAvailable(); +static void nextLocation(); +static DisplayLocation *findLocation(); +static void reconfigureDisplay(); +static void updateDisplay(); +static void updateDisplaySegment(); +static void redrawSegments(); + +static void adjustDisplay(); +static Boolean getAttributeSegmentRange(); +static Boolean getInsertingSegmentRange(); +static void adjustOffset(); + +static void eraseCursor(); +static void showCursor(); +static Boolean exposeCursor(); +static void computeCursor(); + +static void StringToModeLocation(); + +static void MoveShell(); +static Window getToplevelWindow(); +static void setTransientFor(); +static void setMwmHints(); +static void getFocusOffset(); +static Boolean intersectRect(); +static void unionRect(); +static int enoughSpaceForStatus(); +static DisplayFragment *allocDisplayFragment(); +static void freeDisplayFragments(); +static void destroyDisplayFragments(); +static void allocDisplaySegments(); +static void freeDisplaySegment(); +static void clearAllDisplaySegments(); +static void copyString(); +static void freeString(); + +/*- composite-extension rec: for enabling non-widget children -*/ +static CompositeClassExtensionRec CompositeExtension = { + /* next_extension */ NULL, + /* record_type */ NULLQUARK, + /* version */ XtCompositeExtensionVersion, + /* record_size */ sizeof(CompositeClassExtensionRec), + /* accept_objects */ True, +}; + +/*- overTheSpotConversionClass record -*/ +OverTheSpotConversionClassRec overTheSpotConversionClassRec = { + { /* core fields */ + /* superclass */ (WidgetClass)&conversionControlClassRec, + /* class_name */ "OverTheSpotConversion", + /* widget_size */ sizeof(OverTheSpotConversionRec), + /* class_initialize */ ClassInitialize, + /* class_part_initialize */ NULL, + /* class_inited */ FALSE, + /* initialize */ Initialize, + /* initialize_hook */ NULL, + /* realize */ XtInheritRealize, + /* actions */ NULL, + /* num_actions */ 0, + /* resources */ resources, + /* num_resources */ XtNumber(resources), + /* xrm_class */ NULLQUARK, + /* compress_motion */ TRUE, + /* compress_exposure */ TRUE, + /* compress_enterleave */ TRUE, + /* visible_interest */ FALSE, + /* destroy */ Destroy, + /* resize */ XtInheritResize, + /* expose */ NULL, + /* set_values */ SetValues, + /* set_values_hook */ NULL, + /* set_values_almost */ XtInheritSetValuesAlmost, + /* get_values_hook */ NULL, + /* accept_focus */ NULL, + /* version */ XtVersion, + /* callback_private */ NULL, + /* tm_table */ translations, + /* query_geometry */ XtInheritQueryGeometry, + /* display_accelerator */ XtInheritDisplayAccelerator, + /* extension */ NULL + }, + { /* composite fields */ + /* geometry_manager */ XtInheritGeometryManager, + /* change_managed */ XtInheritChangeManaged, + /* insert_child */ XtInheritInsertChild, + /* delete_child */ XtInheritDeleteChild, + /* extension */ (XtPointer)&CompositeExtension, + }, + { /* shell fields */ + /* extension */ NULL + }, + { /* wm_shell fields */ + /* extension */ NULL + }, + { /* vendor_shell fields */ + /* extension */ NULL + }, + { /* transient_shell fields */ + /* extension */ NULL + }, + { /* conversionControl fields */ + /* Startup */ ConversionStartup, + /* Finish */ ConversionFinish, + /* ChangeAttributes */ ChangeAttributes, + /* ChangeFocus */ ChangeFocus, + /* TextChange */ UpdateText, + /* Fix */ XtInheritFix, + /* ModeChange */ UpdateMode, + /* SelectionControl */ SelectionControl, + /* SelectionControl */ AuxControl, + }, + { /* overTheSpotConversion fields */ + /* empty */ 0 + }, +}; + +WidgetClass overTheSpotConversionWidgetClass = (WidgetClass)&overTheSpotConversionClassRec; + +/* + *+ Convenience macros + */ +#define SPOTX(w) ((w)->overthespot.spotx) +#define SPOTY(w) ((w)->overthespot.spoty) +#define CLAREA(w) ((w)->overthespot.clientarea) +#define FOCUSOFFX(w) ((w)->overthespot.focusoffsetx) +#define FOCUSOFFY(w) ((w)->overthespot.focusoffsety) + +/* + *+ Core class methods + */ + +/*- ClassInitialize: add resource converter (string->modelocation) -*/ +/* ARGSUSED */ +static void +ClassInitialize() +{ + XtAddConverter(XtRString, XtRModeLocation, StringToModeLocation, + NULL, 0); +} + +/*- Initialize: initialize method -*/ +/* ARGSUSED */ +static void +Initialize(req, new, args, num_args) +Widget req; +Widget new; +ArgList args; +Cardinal *num_args; +{ + OverTheSpotConversionWidget ocw = (OverTheSpotConversionWidget)new; + + ocw->overthespot.background = ocw->core.background_pixel; + ocw->overthespot.canvaslist = NULL; + ocw->overthespot.overflowcanvas = NULL; + ocw->overthespot.dispsegments = NULL; + ocw->overthespot.numsegments = 0; + ocw->overthespot.dispsegmentsize = 0; + ocw->overthespot.candlist = NULL; + ocw->overthespot.numcands = 0; + ocw->overthespot.selectionpoppedup = False; + ocw->overthespot.cursorvisible = False; + ocw->overthespot.canvascursor = None; + ocw->overthespot.auxpoppedup = False; + + ocw->overthespot.wm_state = + CachedInternAtom(XtDisplay(new), "WM_STATE", False); + + /* $B%F%-%9%HI=<($N(B widget $B$O:G=i$NJQ493+;O;~$K:n$k(B */ + CreateDisplayObject(ocw); + CreateSelectionWidget(ocw); + CreateAuxWidget(ocw); + CreateModeWidget(ocw); +} + +/*- Destroy: destroy method -*/ +static void +Destroy(w) +Widget w; +{ + OverTheSpotConversionWidget ocw = (OverTheSpotConversionWidget)w; + + /* $B%G%#%9%W%l%$%;%0%a%s%H$NNN0h$r2rJ|(B */ + if (ocw->overthespot.dispsegments) { + DisplaySegment *dsp = ocw->overthespot.dispsegments; + int i; + + for (i = 0; i < ocw->overthespot.numsegments; i++) { + freeString(&dsp[i].seg); + destroyDisplayFragments(dsp->fragments); + } + XtFree((char *)dsp); + } + + /* canvaslist $B$NNN0h$r2rJ|(B (canvas widget $B$O(B $B<+F0E*$K(B destroy $B$5$l$k(B */ + if (ocw->overthespot.canvaslist) { + TextCanvas *p = ocw->overthespot.canvaslist; + while (p) { + TextCanvas *q = p->next; + XtFree((char *)p); + p = q; + } + } +} + +/*- SetValues: setvalues method -*/ +/* ARGSUSED */ +static Boolean +SetValues(cur, req, new, args, num_args) +Widget cur; +Widget req; +Widget new; +ArgList args; +Cardinal *num_args; +{ + /* OverTheSpotConversionWidget ocw = (OverTheSpotConversionWidget)new; */ + return False; +} + +/* + *+ ConversionControl cass methods + */ + +/*- ConversionStartup: class specific conversion startup -*/ +static void +ConversionStartup(w, mask, value) +Widget w; +unsigned long mask; +ConversionAttributes *value; +{ + OverTheSpotConversionWidget ocw = (OverTheSpotConversionWidget)w; + Widget inputobj = ocw->ccontrol.inputobj; + Window toplevel; + + TRACE(("OverTheSpot:ConversionStartup()\n")); + + /* $BFbIt$N%P%C%U%!$r%/%j%"$9$k(B */ + clearAllDisplaySegments(ocw); + + /* $BJQ49%*%V%8%'%/%H$K%3!<%k%P%C%/$r@_Dj$9$k(B */ + XtAddCallback(inputobj, XtNfixNotify, ForwardSpot, (XtPointer)w); + + if (ocw->overthespot.ignorestatusarea) mask &= ~CAStatusArea; + + setupDisplayObject(ocw, mask, value); + setupTextCanvas(ocw, mask, value); + setupModeWidget(ocw, mask, value); + + /* WM_TRANSIENT_FOR $B%W%m%Q%F%#$r@5$7$/%;%C%H$9$k(B */ + toplevel = getToplevelWindow(XtDisplay(w), + ocw->ccontrol.clientwindow, + ocw->overthespot.wm_state); + setTransientFor(ocw->overthespot.modeshell, toplevel); + setTransientFor(ocw->overthespot.selectionshell, toplevel); + setTransientFor(ocw->overthespot.auxshell, toplevel); + + /* $B%F%-%9%H%-%c%s%P%9$NI=<(0LCV$r7h$a$k(B */ + locateTextCanvasInitial(ocw); + + /* $B%b!<%I$NI=<(0LCV$r7h$a$k(B */ + if (!ocw->overthespot.modelocationspecified) locateModeWidget(ocw); + + /* + * OverTheSpotConvesion $B$N>l9g!"<+J,<+?H$O%]%C%W%"%C%W$7$J$$$,!"(B + * $B%P%C%/%(%s%I%?%$%W$N;~$K$O%/%i%$%"%s%H$,$3$N(B widget $B$N(B + * $B%&%#%s%I%&$KBP$7$F%$%Y%s%H$rAw$k$N$G!"(BRealize $B$@$1$7$F$*$/(B + * $B$=$N:]!"Bg$-$5$r;XDj$7$J$$$H%5%$%:$,(B 0 $B$K$J$C$F$7$^$&$N$GCm0U$9$k(B + */ + if (!XtIsRealized(w)) { + Arg args[2]; + + XtSetArg(args[0], XtNwidth, 1); + XtSetArg(args[1], XtNheight, 1); + XtSetValues(w, args, 2); + XtRealizeWidget(w); + } + + /* $B%b!<%II=<(%-%c%s%P%9$r%]%C%W%"%C%W$9$k(B */ + if (ocw->overthespot.modeshell != NULL) { + XtPopup(ocw->overthespot.modeshell, XtGrabNone); + } +} + +/*- ChangeAttributes: class specific conversion attribute change routine -*/ +/* ARGSUSED */ +static void +ChangeAttributes(w, mask, value) +Widget w; +unsigned long mask; +ConversionAttributes *value; +{ + OverTheSpotConversionWidget ocw = (OverTheSpotConversionWidget)w; + ResetStatus dispres, tcres; + + TRACE(("OverTheSpot:ChangeAttributes()\n")); + + if (ocw->overthespot.ignorestatusarea) mask &= ~CAStatusArea; + + dispres = resetDisplayObject(ocw, mask, value); + tcres = resetTextCanvas(ocw, mask, value); + if (dispres == NeedReconfig || tcres == NeedReconfig) { + redrawAndReconfigureTextCanvas(ocw); + } else if (dispres == NeedRedraw || tcres == NeedRedraw) { + TextCanvas *tcp = ocw->overthespot.canvaslist; + + while (tcp != NULL) { + if (XtIsRealized(tcp->canvas)) { + XClearArea(XtDisplay(tcp->canvas), XtWindow(tcp->canvas), + 0, 0, 0, 0, True); + } + tcp = tcp->next; + } + } + + if (resetModeWidget(ocw, mask, value) != NeedNone && + XtIsRealized(ocw->overthespot.modewidget)) { + XClearArea(XtDisplay(w), XtWindow((Widget)ocw->overthespot.modewidget), + 0, 0, 0, 0, True); + } +} + +/*- ChangeFocus: class specific conversion attribute change routine -*/ +static void +ChangeFocus(w, set) +Widget w; +int set; +{ + OverTheSpotConversionWidget ocw = (OverTheSpotConversionWidget)w; + + TRACE(("OverTheSpot:ChangeFocus()\n")); + + if (ocw->overthespot.modeshell == NULL) return; + if (set) { + XtPopup(ocw->overthespot.modeshell, XtGrabNone); + } else { + XtPopdown(ocw->overthespot.modeshell); + } +} + +/*- ConversionFinish: class specific conversion finish -*/ +/* ARGSUSED */ +static void +ConversionFinish(w) +Widget w; +{ + OverTheSpotConversionWidget ocw = (OverTheSpotConversionWidget)w; + Widget inputobj = ocw->ccontrol.inputobj; + TextCanvas *tcp = ocw->overthespot.canvaslist; + XAEHandle h; + + /* $BJQ49%*%V%8%'%/%H$N%3!<%k%P%C%/$r>C$9(B */ + XtRemoveCallback(inputobj, XtNfixNotify, ForwardSpot, (XtPointer)w); + + /* Popdown and unrealize textcanvases + * we must be careful here. if clientwindow are destroyed, + * the text canvases are also destroyed. + * we have to popdown and unrealize canvas widgets, but if + * they are destroyed, BadWindow error will be generated. + * so we must set own error handler that ignores errors. + */ + h = XAESetIgnoreErrors(XtDisplay(w)); + while (tcp != NULL) { + if (tcp->poppedup) XtPopdown(tcp->canvas); + XtUnrealizeWidget(tcp->canvas); + /* XtVaSetValues(tcp->canvas, XtNcursor, None, NULL); */ + tcp->poppedup = False; + tcp = tcp->next; + } + /* Popdown mode widget */ + if (ocw->overthespot.modeshell != NULL) { + XtPopdown(ocw->overthespot.modeshell); + } + if (ocw->overthespot.modeshell == ocw->overthespot.modeshell_fix) { + XtUnrealizeWidget(ocw->overthespot.modeshell); + } + XAEUnset(h); + + /* Popdown selection popup (if popped-up) */ + if (ocw->overthespot.selectionpoppedup) { + XtPopdown(ocw->overthespot.selectionshell); + ocw->overthespot.selectionpoppedup = False; + } + if (ocw->overthespot.auxpoppedup) { + XtPopdown(ocw->overthespot.auxshell); + ocw->overthespot.auxpoppedup = False; + } +} + +/* + *+ sub-widget creation + */ + +/*- CreateDisplayObject: create display object for text drawing -*/ +static void +CreateDisplayObject(ocw) +OverTheSpotConversionWidget ocw; +{ + Widget dispobj; + + dispobj = XtCreateWidget("displayObj", ocw->ccontrol.displayobjclass, + (Widget)ocw, NULL, 0); + + ocw->overthespot.displayobj = dispobj; + ocw->overthespot.lineheight = CDLineHeight(dispobj, + &ocw->overthespot.ascent); + +} + +/*- CreateSelectionWidget: create selection widget for selecting candidates -*/ +static void +CreateSelectionWidget(ocw) +OverTheSpotConversionWidget ocw; +{ + Widget shell, sel, obj; + + shell = XtVaCreatePopupShell("selectionShell", + transientShellWidgetClass, + (Widget)ocw, + XtNwidth, 1, XtNheight, 1, + NULL); + ocw->overthespot.selectionshell = shell; + + sel = XtCreateManagedWidget("selection", candidatePanelWidgetClass, + shell, NULL, 0); + obj = XtCreateWidget("display", ocw->ccontrol.displayobjclass, + sel, NULL, 0); + XtAddCallback(sel, XtNcallback, SelectionSelected, (Widget)ocw); + XtInstallAccelerators(sel, (Widget)ocw); + + ocw->overthespot.selectionwidget = sel; + ocw->overthespot.selectiondisplayobj = obj; +} + +/*- CreateAuxWidget: create auxiliary widget for displaying auxiliary data -*/ +static void +CreateAuxWidget(ocw) +OverTheSpotConversionWidget ocw; +{ + Widget shell, sel, obj; + + shell = XtVaCreatePopupShell("auxShell", + transientShellWidgetClass, + (Widget)ocw, + XtNwidth, 1, XtNheight, 1, + XtNallowShellResize, True, + NULL); + ocw->overthespot.auxshell = shell; + + sel = XtCreateManagedWidget("aux", auxPanelWidgetClass, + shell, NULL, 0); + obj = XtCreateWidget("display", ocw->ccontrol.displayobjclass, + sel, NULL, 0); + XtAddCallback(sel, XtNcallback, SelectionSelected, (Widget)ocw); + XtInstallAccelerators(sel, (Widget)ocw); + + ocw->overthespot.auxwidget = sel; + ocw->overthespot.auxdisplayobj = obj; +} + +/*- CreateModeWidget: create mode displaying widget -*/ +static void +CreateModeWidget(ocw) +OverTheSpotConversionWidget ocw; +{ + Widget shell, w, obj; + + TRACE(("CreateModeWidget()\n")); + + /* create fixed widget */ + shell = XtCreatePopupShell("modeShell", adoptedShellWidgetClass, + (Widget)ocw, NULL, 0); + XtVaGetValues(shell, XtNborderWidth, &ocw->overthespot.saved_bw, NULL); + w = XtCreateManagedWidget("mode", icLabelWidgetClass, shell, NULL, 0); + obj = XtCreateWidget("display", ocw->ccontrol.displayobjclass, w, + NULL, 0); + XtInstallAccelerators(shell, (Widget)ocw); + XtInstallAccelerators(w, (Widget)ocw); + ocw->overthespot.modeshell_fix = shell; + ocw->overthespot.modewidget_fix = w; + ocw->overthespot.modedisplayobj_fix = obj; + + /* create floating widget */ + if (ocw->overthespot.useoverride) { + shell = XtCreatePopupShell("modeShell", overrideShellWidgetClass, + (Widget)ocw, NULL, 0); + } else { + shell = XtCreatePopupShell("modeShell", transientShellWidgetClass, + (Widget)ocw, NULL, 0); + } + w = XtCreateManagedWidget("mode", icLabelWidgetClass, shell, NULL, 0); + obj = XtCreateWidget("display", ocw->ccontrol.displayobjclass, w, + NULL, 0); + XtInstallAccelerators(shell, (Widget)ocw); + XtInstallAccelerators(w, (Widget)ocw); + ocw->overthespot.modeshell_float = shell; + ocw->overthespot.modewidget_float = w; + ocw->overthespot.modedisplayobj_float = obj; + + /* set mwm hints for the shell */ + setMwmHints(shell); +} + +/*- CreateTextCanvas: create a text canvas -*/ +static TextCanvas * +CreateTextCanvas(ocw) +OverTheSpotConversionWidget ocw; +{ + TextCanvas *tcp; + + tcp = XtNew(TextCanvas); + tcp->x = 0; + tcp->y = 0; + tcp->poppedup = False; + tcp->next = NULL; + tcp->canvas = XtVaCreatePopupShell("text", + canvasShellWidgetClass, + (Widget)ocw, + XtNcolormap, + ocw->overthespot.colormap, + XtNbackground, + ocw->overthespot.background, + XtNparentWindow, + ocw->ccontrol.clientwindow, + XtNoverrideRedirect, True, + NULL); /* XXX for now XXX */ + XtAddCallback(tcp->canvas, XtNexposeCallback, TextRedisplay, (XtPointer)ocw); + XtInstallAccelerators(tcp->canvas, (Widget)ocw); + + return tcp; +} + + +/* + *+ subwidget configuration + */ + +/*- setupTextCanvas: do text canvas configuration on conversion startup -*/ +static void +setupTextCanvas(ocw, mask, value) +OverTheSpotConversionWidget ocw; +unsigned long mask; +ConversionAttributes *value; +{ + TRACE(("setupTextCanvas(mask=0x%lx)\n", mask)); + + getFocusOffset(ocw); + + if (mask & CAClientArea) { + CLAREA(ocw) = value->clientarea; + } else { + /* default */ + CLAREA(ocw).x = 0; + CLAREA(ocw).y = 0; + CLAREA(ocw).width = ocw->ccontrol.focus_attr.width; + CLAREA(ocw).height = ocw->ccontrol.focus_attr.height; + } + CLAREA(ocw).x += FOCUSOFFX(ocw); + CLAREA(ocw).y += FOCUSOFFY(ocw); + + TRACE(("\tclientarea: (%d,%d)-(%d,%d)\n",CLAREA(ocw).x,CLAREA(ocw).y,CLAREA(ocw).width,CLAREA(ocw).height)); + if (mask & CASpotLocation) { + SPOTX(ocw) = value->spotx + FOCUSOFFX(ocw); + SPOTY(ocw) = value->spoty + FOCUSOFFY(ocw); + } else { + /* default */ + SPOTX(ocw) = CLAREA(ocw).x; + SPOTY(ocw) = CLAREA(ocw).y + ocw->overthespot.ascent; + } + TRACE(("\tspotlocation: (%d,%d)\n",SPOTX(ocw),SPOTY(ocw))); + + if (mask & CALineSpacing) { + ocw->overthespot.linespacing = value->linespacing; + if (ocw->overthespot.linespacing == 0) { + DPRINT(("\tspecified linespacing is 0. reset to default\n")); + ocw->overthespot.linespacing = ocw->overthespot.lineheight; + } + } else { + ocw->overthespot.linespacing = ocw->overthespot.lineheight; + } + if (mask & CAColormap) { + ocw->overthespot.colormap = value->colormap; + } else { + ocw->overthespot.colormap = DefaultColormapOfScreen(XtScreen((Widget)ocw)); + } + if (mask & CAColor) { + ocw->overthespot.background = value->background; + } else { + /* default */ + ocw->overthespot.background = ocw->core.background_pixel; + } + if (mask & CACursor) { + ocw->overthespot.canvascursor = value->cursor; + } else { + ocw->overthespot.canvascursor = None; + } + + if (ocw->overthespot.canvaslist == NULL) { + ocw->overthespot.canvaslist = CreateTextCanvas(ocw); + } else { + TextCanvas *tcp = ocw->overthespot.canvaslist; + while (tcp != NULL) { + XtVaSetValues(tcp->canvas, + XtNcolormap, ocw->overthespot.colormap, + XtNbackground, ocw->overthespot.background, + XtNparentWindow, ocw->ccontrol.clientwindow, + XtNcursor, ocw->overthespot.canvascursor, + NULL); + tcp = tcp->next; + } + } +} + +/*- resetTextCanvas: do text canvas reconfiguration on attribute change -*/ +static ResetStatus +resetTextCanvas(ocw, mask, value) +OverTheSpotConversionWidget ocw; +unsigned long mask; +ConversionAttributes *value; +{ + ResetStatus redraw = NeedNone; + + if (mask & (CAColormap|CAColor|CACursor)) { + Arg args[3]; + Cardinal i = 0; + if (mask & CAColormap && + value->colormap != ocw->overthespot.colormap) { + ocw->overthespot.colormap = value->colormap; + XtSetArg(args[i], XtNcolormap, value->colormap); i++; + } + if (mask & CAColor && + value->background != ocw->overthespot.background) { + ocw->overthespot.background = value->background; + XtSetArg(args[i], XtNbackground, value->background); i++; + } + if (mask & CACursor && + value->cursor != ocw->overthespot.canvascursor) { + ocw->overthespot.canvascursor = value->cursor; + XtSetArg(args[i], XtNcursor, value->cursor); i++; + } + if (i > 0) { + TextCanvas *tcp = ocw->overthespot.canvaslist; + + while (tcp != NULL) { + XtSetValues(tcp->canvas, args, i); + tcp = tcp->next; + } + redraw = NeedRedraw; + } + } + if (mask & CAFocusWindow) { + getFocusOffset(ocw); + redraw = NeedReconfig; + } + if (mask & CAClientArea) { + if (value->clientarea.x + FOCUSOFFX(ocw) != CLAREA(ocw).x || + value->clientarea.y + FOCUSOFFY(ocw) != CLAREA(ocw).y || + value->clientarea.width != CLAREA(ocw).width || + value->clientarea.height != CLAREA(ocw).height) { + CLAREA(ocw) = value->clientarea; + CLAREA(ocw).x += FOCUSOFFX(ocw); + CLAREA(ocw).y += FOCUSOFFY(ocw); + redraw = NeedReconfig; + } + } else if (mask & CAFocusWindow) { + CLAREA(ocw).x = FOCUSOFFX(ocw); + CLAREA(ocw).y = FOCUSOFFY(ocw); + CLAREA(ocw).width = ocw->ccontrol.focus_attr.width; + CLAREA(ocw).height = ocw->ccontrol.focus_attr.height; + } + if (mask & CASpotLocation) { + if (value->spotx + FOCUSOFFX(ocw) != SPOTX(ocw) || + value->spoty + FOCUSOFFY(ocw) != SPOTY(ocw)) { + SPOTX(ocw) = value->spotx + FOCUSOFFX(ocw); + SPOTY(ocw) = value->spoty + FOCUSOFFY(ocw); + redraw = NeedReconfig; + } + } else if (mask & CAFocusWindow) { + SPOTX(ocw) = CLAREA(ocw).x; + SPOTY(ocw) = CLAREA(ocw).y + ocw->overthespot.ascent; + } + if (mask & CALineSpacing) { + if (value->linespacing != ocw->overthespot.linespacing && + value->linespacing != 0) { + ocw->overthespot.linespacing = value->linespacing; + redraw = NeedReconfig; + } + } else if (mask & CAFonts) { + ocw->overthespot.linespacing = ocw->overthespot.lineheight; + redraw = NeedReconfig; + } + + return redraw; +} + +/*- setupDisplayObject: do displayobj configuration on conversion startup -*/ +static void +setupDisplayObject(ocw, mask, value) +OverTheSpotConversionWidget ocw; +unsigned long mask; +ConversionAttributes *value; +{ + Widget dispobj = ocw->overthespot.displayobj; + + TRACE(("setupDisplayObject()\n")); + + /* + * order is important. we must set fonts BEFORE anything else, + * because it is possible that the fonts previously set in the + * display object no longer exist, and if so, that causes BadFont + * error when changing GCs. + */ + + if (mask & CAFonts) { + TRACE(("\tchanging fonts...\n")); + CDSetFonts(dispobj, value->fonts, value->num_fonts); + } else { + /* reset to default */ + CDSetFonts(dispobj, (XFontStruct **)NULL, 0); + } + if (mask & CAColor) { + TRACE(("\tchanging colors...\n")); + XtVaSetValues(dispobj, + XtNforeground, value->foreground, + XtNbackground, value->background, + NULL); + } + ocw->overthespot.lineheight = CDLineHeight(dispobj, + &ocw->overthespot.ascent); +} + +/*- resetDisplayObject: do displayobj reconfiguration on attribute change -*/ +static ResetStatus +resetDisplayObject(ocw, mask, value) +OverTheSpotConversionWidget ocw; +unsigned long mask; +ConversionAttributes *value; +{ + Widget dispobj = ocw->overthespot.displayobj; + ResetStatus redraw = NeedNone; + + TRACE(("resetDisplayObject()\n")); + + if (mask & CAColor) { + TRACE(("\tchanging colors...\n")); + XtVaSetValues(dispobj, + XtNforeground, value->foreground, + XtNbackground, value->background, + NULL); + redraw = NeedRedraw; + } + if (mask & CAFonts) { + TRACE(("\tchanging fonts...\n")); + CDSetFonts(dispobj, value->fonts, value->num_fonts); + ocw->overthespot.lineheight = CDLineHeight(dispobj, + &ocw->overthespot.ascent); + redraw = NeedReconfig; + } + + return redraw; +} + +/*- setupModeWidget: do mode widget configuration on conversion startup -*/ +static void +setupModeWidget(ocw, mask, value) +OverTheSpotConversionWidget ocw; +unsigned long mask; +ConversionAttributes *value; +{ + Widget inputobj = ocw->ccontrol.inputobj; + Widget dispobj; + Widget mode; + Arg modeargs[10]; + Arg shellargs[15]; + Cardinal i = 0, j = 0; + + TRACE(("setupModeWidget()\n")); + + /* choose appropriate widgets */ + if (mask & CAStatusArea) { + /* use fixed modedisplay */ + ocw->overthespot.modeshell = ocw->overthespot.modeshell_fix; + ocw->overthespot.modewidget = ocw->overthespot.modewidget_fix; + ocw->overthespot.modedisplayobj = ocw->overthespot.modedisplayobj_fix; + XtSetArg(shellargs[j], XtNparentWindow, ocw->ccontrol.clientwindow); j++; + XtSetArg(shellargs[j], XtNborderWidth, 0); j++; + XtSetArg(shellargs[j], XtNallowShellResize, False); j++; + XtSetArg(shellargs[j], XtNx, value->statusarea.x); j++; + XtSetArg(shellargs[j], XtNy, value->statusarea.y); j++; + XtSetArg(shellargs[j], XtNwidth, value->statusarea.width); j++; + XtSetArg(shellargs[j], XtNheight, value->statusarea.height); j++; + ocw->overthespot.modelocationspecified = True; + } else if (ocw->overthespot.modelocation == ModeTrackText && + enoughSpaceForStatus(ocw)) { + ocw->overthespot.modeshell = ocw->overthespot.modeshell_fix; + ocw->overthespot.modewidget = ocw->overthespot.modewidget_fix; + ocw->overthespot.modedisplayobj = ocw->overthespot.modedisplayobj_fix; + ocw->overthespot.modelocationspecified = False; + XtSetArg(shellargs[j], XtNparentWindow, ocw->ccontrol.clientwindow); j++; + XtSetArg(shellargs[j], XtNallowShellResize, True); j++; + XtSetArg(shellargs[j], XtNborderWidth, ocw->overthespot.saved_bw); j++; + } else if (ocw->overthespot.modelocation == ModeNone) { + ocw->overthespot.modeshell = NULL; + ocw->overthespot.modewidget = NULL; + ocw->overthespot.modedisplayobj = NULL; + ocw->overthespot.modelocationspecified = False; + return; + } else { + /* use floating modedisplay */ + ocw->overthespot.modeshell = ocw->overthespot.modeshell_float; + ocw->overthespot.modewidget = ocw->overthespot.modewidget_float; + ocw->overthespot.modedisplayobj = ocw->overthespot.modedisplayobj_float; + ocw->overthespot.modelocationspecified = False; + } + + mode = ocw->overthespot.modewidget; + dispobj = ocw->overthespot.modedisplayobj; + + XtSetArg(modeargs[i], XtNlabel, ICGetMode(inputobj)); i++; + if (mask & CAColormap) { + XtSetArg(modeargs[i], XtNcolormap, value->colormap); i++; + } + /* ignore background_pixmap... */ + + /* + * order of changing display object resources is important. + * see comment in setupDisplayObject() for details. + */ + if (mask & CAStatusFonts) { + TRACE(("\tchanging fonts...\n")); + CDSetFonts(dispobj, value->status_fonts, value->num_status_fonts); + } else { + /* reset to default */ + CDSetFonts(dispobj, (XFontStruct **)NULL, 0); + } + if (mask & CAColor) { + TRACE(("\tchanging colors...\n")); + XtVaSetValues(dispobj, + XtNforeground, value->foreground, + XtNbackground, value->background, + NULL); + XtSetArg(modeargs[i], XtNbackground, value->background); i++; + if (ocw->overthespot.borderforeground) { + XtSetArg(shellargs[j], XtNborderColor, value->foreground); j++; + } + } else { + XtSetArg(modeargs[i], XtNbackground, ocw->overthespot.background); i++; + } + + XtSetValues(mode, modeargs, i); + ICLRecomputeSize(mode); + + if (!(mask & CAStatusArea)) { + /* + * force shell to resize. + * it is because Shell doesn't honor its child's dimension + * at second (or later) realization. + */ + XtSetArg(shellargs[j], XtNwidth, mode->core.width); j++; + XtSetArg(shellargs[j], XtNheight, mode->core.height); j++; + } + XtSetValues(ocw->overthespot.modeshell, shellargs, j); +} + +/*- resetModeWidget: do mode widget reconfiguration on attribute change -*/ +static ResetStatus +resetModeWidget(ocw, mask, value) +OverTheSpotConversionWidget ocw; +unsigned long mask; +ConversionAttributes *value; +{ + Widget mode = ocw->overthespot.modewidget; + Widget dispobj = ocw->overthespot.modedisplayobj; + ResetStatus redraw = NeedNone; + + TRACE(("resetModeWidget()\n")); + + if (ocw->overthespot.modeshell == NULL) return NeedNone; + + if (mask & CAStatusArea) { + if (ocw->overthespot.modelocationspecified && + ocw->overthespot.modeshell == ocw->overthespot.modeshell_fix) { + XtVaSetValues(ocw->overthespot.modeshell, + XtNx, value->statusarea.x, + XtNy, value->statusarea.y, + XtNwidth, value->statusarea.width, + XtNheight, value->statusarea.height, + NULL); + } /* else ignore... */ + } + + if (mask & CAColormap) { + XtVaSetValues(mode, XtNcolormap, value->colormap, NULL); + } + + if (mask & CAColor) { + TRACE(("\tchanging colors...\n")); + XtVaSetValues(dispobj, + XtNforeground, value->foreground, + XtNbackground, value->background, + NULL); + XtVaSetValues(mode, XtNbackground, value->background, NULL); + if (ocw->overthespot.borderforeground) { + XtVaSetValues(ocw->overthespot.modeshell, + XtNborderColor, value->foreground, + NULL); + } + redraw = NeedRedraw; + } + if (mask & CAStatusFonts) { + TRACE(("\tchanging fonts...\n")); + CDSetFonts(dispobj, value->status_fonts, value->num_status_fonts); + ICLRecomputeSize(mode); + redraw = NeedRedraw; + } + + return redraw; +} + +/*- locateTextCanvasInitial: put the text canvas at the initial position -*/ +static void +locateTextCanvasInitial(ocw) +OverTheSpotConversionWidget ocw; +{ + TextCanvas *tcp = ocw->overthespot.canvaslist; + + tcp->x = SPOTX(ocw); + tcp->y = SPOTY(ocw) - ocw->overthespot.ascent; +} + +/*- locateModeWidget: put the mode widget at the initial position -*/ +static void +locateModeWidget(ocw) +OverTheSpotConversionWidget ocw; +{ + Position x, y; + Widget modewidget = ocw->overthespot.modewidget; + Widget modeshell = ocw->overthespot.modeshell; + int rootx, rooty; + Window child; + + if (modeshell == ocw->overthespot.modeshell_fix) { + /* must be tracking text type */ + locateTrackingModeWidget(ocw, True, 0, 0); + return; + } + + switch (ocw->overthespot.modelocation) { + case ModeTopLeft: + x = 0; + y = -(modewidget->core.height + modeshell->core.border_width * 2); + y -= ocw->ccontrol.titlebarheight; + break; + case ModeTopRight: + x = ocw->ccontrol.client_attr.width - modewidget->core.width + modeshell->core.border_width * 2; + y = -(modewidget->core.height + modeshell->core.border_width * 2); + y -= ocw->ccontrol.titlebarheight; + break; + case ModeBottomRight: + x = ocw->ccontrol.client_attr.width - modewidget->core.width + modeshell->core.border_width * 2; + y = ocw->ccontrol.client_attr.height; + break; + case ModeTrackText: /* in case of insufficient space in the client area */ + x = CLAREA(ocw).x; + y = CLAREA(ocw).y + CLAREA(ocw).height + 2; + break; + case ModeBottomLeft: + x = 0; + y = ocw->ccontrol.client_attr.height; + break; + default: + /* ModeNone */ + return; + } + + (void)XTranslateCoordinates(XtDisplay(ocw), ocw->ccontrol.clientwindow, + RootWindowOfScreen(XtScreen(ocw)), + x, y, &rootx, &rooty, &child); + MoveShell(ocw->overthespot.modeshell, rootx, rooty); +} + +/*- locateTrackingModeWidget: put the tracking text type mode widget at appropriate position */ +static void +locateTrackingModeWidget(ocw, initial, x, y) +OverTheSpotConversionWidget ocw; +Boolean initial; +Position x; +Position y; +{ + Widget modewidget = ocw->overthespot.modewidget; + Widget modeshell = ocw->overthespot.modeshell; + Dimension width, height; + XRectangle *clarea = &CLAREA(ocw); + static Position lastx, lasty; + + if (initial) { + x = SPOTX(ocw); + y = SPOTY(ocw) - ocw->overthespot.ascent + + ocw->overthespot.lineheight; + } else if (x == lastx && y == lasty) { + return; + } + + lastx = x; + lasty = y; + + width = modewidget->core.width + modeshell->core.border_width * 2; + height = modewidget->core.height + modeshell->core.border_width * 2; + + /* adjust x */ + if (x + width > clarea->x + clarea->width) { + x = clarea->x + clarea->width - width; + } + if (x < clarea->x) x = clarea->x; + + /* adjust y */ + if (y + height + 2 <= clarea->y + clarea->height) { + y += 2; /* make some (2pixels high) space between text and mode */ + } else if (y + height > clarea->y + clarea->height) { + Position initx, inity; + + if (initial) { + initx = SPOTX(ocw); + inity = SPOTY(ocw) - ocw->overthespot.ascent; + } else { + TextCanvas *tcp = ocw->overthespot.canvaslist; + initx = tcp->x; + inity = tcp->y; + } + if (inity - height > clarea->y) { + y = inity - height; + } else if (x + width < initx) { + y = inity - modeshell->core.border_width * 2; + } else if (clarea->x + width < initx) { + x = initx - width; + y = inity - modeshell->core.border_width * 2; + } else { + x = initx - width; + y = inity - height; + } + if (y < clarea->y) y = clarea->y; + } + XtMoveWidget(modeshell, x, y); +} + +/*- redrawAndReconfigureTextCanvas: redraw & reconfigure text canvas -*/ +static void +redrawAndReconfigureTextCanvas(ocw) +OverTheSpotConversionWidget ocw; +{ + TextCanvas *tcp = ocw->overthespot.canvaslist; + + TRACE(("OverTheSpotConversion:redrawAndReconfigureTextCanvas()\n")); + + /* popdown and clear all canvases */ + while (tcp != NULL) { + if (tcp->poppedup) XtPopdown(tcp->canvas); + tcp->poppedup = False; + if (XtIsRealized(tcp->canvas)) { + XClearArea(XtDisplay(tcp->canvas), XtWindow(tcp->canvas), + 0, 0, 0, 0, True); + } + tcp = tcp->next; + } + locateTextCanvasInitial(ocw); + recomputeDisplaySegments(ocw); + computeCursor(ocw); + reconfigureDisplay(ocw); +} + +/* + *+ inputobject callback + */ + +/*- UpdateText: update text -*/ +static void +UpdateText(w) +Widget w; +{ + OverTheSpotConversionWidget ocw = (OverTheSpotConversionWidget)w; + + TRACE(("OverTheSpotConversion:UpdateText()\n")); + eraseCursor(ocw); + computeDisplaySegments(ocw); + computeCursor(ocw); + reconfigureDisplay(ocw); + updateDisplay(ocw); + showCursor(ocw); +} + +/*- UpdateMode: update mode -*/ +static void +UpdateMode(w) +Widget w; +{ + OverTheSpotConversionWidget ocw = (OverTheSpotConversionWidget)w; + + if (ocw->overthespot.modewidget == NULL) return; + + XtVaSetValues(ocw->overthespot.modewidget, + XtNlabel, ICGetMode(ocw->ccontrol.inputobj), + NULL); +#ifdef notdef + /* a hack... */ + if (ocw->overthespot.modeshell == ocw->overthespot.modeshell_float && + XtIsRealized(ocw->overthespot.modeshell)) { + XRaiseWindow(XtDisplay(ocw->overthespot.modeshell), + XtWindow(ocw->overthespot.modeshell)); + } +#endif +} + +/*- SelectionControl: selection control -*/ +static void +SelectionControl(w, arg) +Widget w; +ICSelectionControlArg *arg; +{ + OverTheSpotConversionWidget ocw = (OverTheSpotConversionWidget)w; + + switch (arg->command) { + case ICSelectionStart: + SelectionStart(ocw, arg->u.selection_kind); + break; + case ICSelectionEnd: + SelectionEnd(ocw, &arg->u.current_item); + break; + case ICSelectionSet: + SelectionSet(ocw, arg->u.current_item); + break; + case ICSelectionMove: + SelectionMove(ocw, arg->u.dir); + break; + case ICSelectionGet: + SelectionGet(ocw, &arg->u.current_item); + break; + default: + XtAppWarning(XtWidgetToApplicationContext(w), + "OverTheSpotConversion: unknown selection control command"); + break; + } +} + +/*- SelectionStart: selection startup -*/ +/* ARGSUSED */ +static void +SelectionStart(ocw, kind) +OverTheSpotConversionWidget ocw; +int kind; +{ + Cardinal ncand; + + TRACE(("OverTheSpotConversion:SelectionStart()\n")); + if (ocw->overthespot.selectionpoppedup) { + DPRINT(("\tselection already started -- ignored\n")); + return; + } + + ocw->overthespot.candlist = ICGetItemList(ocw->ccontrol.inputobj, &ncand); + ocw->overthespot.numcands = ncand; + + TRACE(("\tnumcands=%d\n", ocw->overthespot.numcands)); + CPanelSetList(ocw->overthespot.selectionwidget, + ocw->overthespot.candlist, + ocw->overthespot.numcands, 0, True); + + locateSelectionPopup(ocw); + XtPopup(ocw->overthespot.selectionshell, XtGrabNone); + ocw->overthespot.selectionpoppedup = True; +} + +/*- locateSelectionPopup: put selection popup at an appropriate position -*/ +static void +locateSelectionPopup(ocw) +OverTheSpotConversionWidget ocw; +{ + Position x, y; + int clx, cly; + Dimension dpyWidth, dpyHeight; + Widget panel = ocw->overthespot.selectionwidget; + Widget shell = ocw->overthespot.selectionshell; + Window junk; + int barheight = ocw->ccontrol.titlebarheight; + + (void)XTranslateCoordinates(XtDisplay(ocw), + ocw->ccontrol.clientwindow, + RootWindowOfScreen(XtScreen(ocw)), + 0, 0, &clx, &cly, &junk); + + if (ocw->overthespot.numsegments > 0) { + DisplayLocation lastp; + DisplaySegment *dsp = ocw->overthespot.dispsegments; + int i; + int offset = 0; + + /* find current segment. if not found, use last segment */ + for (i = 0; i < ocw->overthespot.numsegments - 1; i++) { + if (dsp[i].seg.attr & ICAttrCurrentSegment) break; + } + + computeLastPosition(dsp[i].fragments, &lastp); + if (lastp.canvas == ocw->overthespot.overflowcanvas) { + offset = ocw->overthespot.overflowoffset; + } + x = clx + lastp.canvas->x + lastp.x + - panel->core.width / 2 + offset; + y = cly + lastp.canvas->y + lastp.y + ocw->overthespot.lineheight; + } else { + x = clx + SPOTX(ocw) - panel->core.width / 2; + y = cly + SPOTY(ocw); + } + + dpyWidth = WidthOfScreen(XtScreen(shell)); + dpyHeight = HeightOfScreen(XtScreen(shell)); + + if (x + panel->core.width > (int)dpyWidth) x = dpyWidth - panel->core.width; + if (x < 0) x = 0; + if (y + panel->core.height + barheight > (int)dpyHeight) { + y = cly + SPOTY(ocw) - panel->core.height - barheight; + if (y < 0) y = dpyHeight - panel->core.height - barheight; + } + MoveShell(shell, x, y); +} + +/*- SelectionEnd: selection finish -*/ +static void +SelectionEnd(ocw, current) +OverTheSpotConversionWidget ocw; +int *current; +{ + TRACE(("OverTheSpotConversion:SelectionEnd()\n")); + + if (!ocw->overthespot.selectionpoppedup) { /* for safe */ + TRACE(("\tnot in selection mode -- ignored\n")); + return; + } + + XtVaGetValues(ocw->overthespot.selectionwidget, + XtNcurrentItem, current, + NULL); + + XtPopdown(ocw->overthespot.selectionshell); + + ocw->overthespot.selectionpoppedup = False; +} + +/*- SelectionSet: set current selection item -*/ +static void +SelectionSet(ocw, current) +OverTheSpotConversionWidget ocw; +int current; +{ + TRACE(("OverTheSpotConversion:SelectionSet()\n")); + + if (!ocw->overthespot.selectionpoppedup) { /* for safe */ + TRACE(("\tnot in selection mode -- ignored\n")); + return; + } + + XtVaSetValues(ocw->overthespot.selectionwidget, + XtNcurrentItem, current, + NULL); +} + +/*- SelectionGet: get current selection item -*/ +static void +SelectionGet(ocw, current) +OverTheSpotConversionWidget ocw; +int *current; +{ + TRACE(("OverTheSpotConversion:SelectionGet()\n")); + + if (!ocw->overthespot.selectionpoppedup) { /* for safe */ + TRACE(("\tnot in selection mode -- ignored\n")); + return; + } + + XtVaGetValues(ocw->overthespot.selectionwidget, + XtNcurrentItem, current, + NULL); +} + +/*- SelectionMove: move crrent selection to specified direction -*/ +static void +SelectionMove(ocw, dir) +OverTheSpotConversionWidget ocw; +int dir; +{ + TRACE(("OverTheSpotConversion:SelectionMove()\n")); + + if (!ocw->overthespot.selectionpoppedup) { /* for safe */ + TRACE(("\tnot in selection mode -- ignored\n")); + return; + } + + CPanelMoveCurrent(ocw->overthespot.selectionwidget, dir); +} + +/*- ForwardSpot: forward spot location when text is fixed -*/ +/* ARGSUSED */ +static void +ForwardSpot(w, client_data, call_data) +Widget w; +XtPointer client_data; +XtPointer call_data; +{ + OverTheSpotConversionWidget ocw = (OverTheSpotConversionWidget)client_data; + DisplaySegment *dsp = ocw->overthespot.dispsegments; + Cardinal nsegs = ocw->overthespot.numsegments; + DisplayLocation disploc; + + if (!ocw->overthespot.spotforwarding || nsegs == 0) return; + + /* get next spot location */ + computeLastPosition(dsp[nsegs - 1].fragments, &disploc); + + SPOTX(ocw) = disploc.canvas->x + disploc.x; + SPOTY(ocw) = disploc.canvas->y + disploc.y + ocw->overthespot.ascent; + locateTextCanvasInitial(ocw); +} + +/* + * Aux Callback + */ + +static void +AuxControl(w, arg) +Widget w; +ICAuxControlArg *arg; +{ + OverTheSpotConversionWidget ocw = (OverTheSpotConversionWidget)w; + String params[1]; + Cardinal num_params; + + switch (arg->command) { + case ICAuxStart: + AuxStart(ocw); + break; + case ICAuxEnd: + AuxEnd(ocw); + break; + case ICAuxChange: + AuxChange(ocw); + break; + default: + params[0] = XtClass(w)->core_class.class_name; + num_params = 1; + XtAppWarningMsg(XtWidgetToApplicationContext(w), + "parameterError", "AuxControl", "WidgetError", + "%s: unknown aux control command", + params, &num_params); + break; + } +} + +/* ARGSUSED */ +static void +AuxStart(ocw) +OverTheSpotConversionWidget ocw; +{ + ICString *auxstr; + Cardinal ncand, curseg, cursorpos; + + if (ocw->overthespot.auxpoppedup) return; + + /* $B%F%-%9%H%3!<%k%P%C%/$N;~$N$h$&$J=hM}$r$9$k(B + $B$N$O(B AuxPanel.c $B$K$^$+$;$h$&(B */ + + auxstr = ICGetAuxSegments(ocw->ccontrol.inputobj, + &ncand, &curseg, &cursorpos); + + APanelStart(ocw->overthespot.auxwidget, auxstr, ncand, curseg, cursorpos); + + /* $B%]%C%W%"%C%W$9$k>l=j$r7h$a$k(B */ + locateAuxPopup(ocw, False); + + XtPopup(ocw->overthespot.auxshell, XtGrabNone); + ocw->overthespot.auxpoppedup = True; +} + +/* ARGSUSED */ +static void +AuxEnd(ocw) +OverTheSpotConversionWidget ocw; +{ + if (!ocw->overthespot.auxpoppedup) return; /* for safe */ + +/* APanelEnd(ocw->overthespot.auxwidget); */ + + XtPopdown(ocw->overthespot.auxshell); + + ocw->overthespot.auxpoppedup = False; +} + +/* ARGSUSED */ +static void +AuxChange(ocw) +OverTheSpotConversionWidget ocw; +{ + Cardinal ncand, curseg, cursorpos; + ICString *auxstr; + + if (!ocw->overthespot.auxpoppedup) return; /* for safe */ + + auxstr = ICGetAuxSegments(ocw->ccontrol.inputobj, + &ncand, &curseg, &cursorpos); + + APanelChange(ocw->overthespot.auxwidget, auxstr, ncand, curseg, cursorpos); + + /* reposition popup shell */ + locateAuxPopup(ocw, True); +} + +/*- locateAuxPopup: put aux popup at an appropriate position -*/ +static void +locateAuxPopup(ocw, usecurloc) +OverTheSpotConversionWidget ocw; +Boolean usecurloc; /* use the current location as the default */ +{ + int x, y; + int clx, cly; + int dpyWidth, dpyHeight; + Widget panel = ocw->overthespot.auxwidget; + Widget shell = ocw->overthespot.auxshell; + Window junk; + int barheight = ocw->ccontrol.titlebarheight; + + (void)XTranslateCoordinates(XtDisplay(ocw), + ocw->ccontrol.clientwindow, + RootWindowOfScreen(XtScreen(ocw)), + 0, 0, &clx, &cly, &junk); + + if (usecurloc) { + x = shell->core.x; + y = shell->core.y; + } else { + if (ocw->overthespot.numsegments > 0) { + DisplayLocation lastp; + DisplaySegment *dsp = ocw->overthespot.dispsegments; + int i; + int offset; + + /* find current segment. if not found, use last segment */ + for (i = 0; i < ocw->overthespot.numsegments - 1; i++) { + if (dsp[i].seg.attr & ICAttrCurrentSegment) break; + } + + computeLastPosition(dsp[i].fragments, &lastp); + if (lastp.canvas == ocw->overthespot.overflowcanvas) + offset = ocw->overthespot.overflowoffset; + else + offset = 0; + x = clx + lastp.canvas->x + lastp.x + - panel->core.width / 2 + offset; + y = cly + lastp.canvas->y + lastp.y + ocw->overthespot.lineheight; + } else { + x = clx + ocw->overthespot.spotx - panel->core.width / 2; + y = cly + ocw->overthespot.spoty; + } + } + + dpyWidth = (int)WidthOfScreen(XtScreen(shell)); + dpyHeight = (int)HeightOfScreen(XtScreen(shell)); + + if ((int)(x + panel->core.width) > dpyWidth) x = dpyWidth - panel->core.width; + if (x < 0) x = 0; + if ((int)(y + panel->core.height + barheight) > dpyHeight) { + y = cly + ocw->overthespot.spoty - panel->core.height - barheight; + if (y < 0) y = dpyHeight - panel->core.height - barheight; + } + MoveShell(shell, x, y); +} + + +/* + *+ TextCanvas callback + */ + +/*- TextRedisplay: redraw text canvas -*/ +static void +TextRedisplay(w, client_data, call_data) +Widget w; +XtPointer client_data; +XtPointer call_data; +{ + OverTheSpotConversionWidget ocw = (OverTheSpotConversionWidget)client_data; + XExposeEvent *event = (XExposeEvent *)call_data; + XRectangle region; + Boolean cursorredraw; + + TRACE(("OverTheSpotConversion:TextRedisplay()\n")); + region.x = event->x; + region.y = event->y; + region.width = event->width; + region.height = event->height; + + cursorredraw = exposeCursor(ocw, w, ®ion); + redrawSegments(ocw, w, ®ion); + if (cursorredraw) showCursor(ocw); +} + + +/* + *+ Selection Widget callback + */ + +/*- SelectionSelected: selection selected callback -*/ +/* ARGSUSED */ +static void +SelectionSelected(w, client_data, call_data) +Widget w; +XtPointer client_data; +XtPointer call_data; +{ + OverTheSpotConversionWidget ocw = (OverTheSpotConversionWidget)client_data; + int current = (int)call_data; + + TRACE(("OverTheSpotConversion:SelectionSelected()\n")); + XtPopdown(ocw->overthespot.selectionshell); + ocw->overthespot.selectionpoppedup = False; + ICSelectItem(ocw->ccontrol.inputobj, current); +} + + +/* + *+ text drawing functions + */ + +/*- computeDisplaySegments: compare old&new text and update segments/fragments -*/ +static void +computeDisplaySegments(ocw) +OverTheSpotConversionWidget ocw; +{ + Widget inputobj = ocw->ccontrol.inputobj; + int nnew = ICNumSegments(inputobj); + int nold = ocw->overthespot.numsegments; + ICString *newseg; + DisplaySegment *dseg; + DisplayLocation disploc; + Cardinal nsame; + int diff; + int i; + + TRACE(("OverTheSpotConversion:computeDisplaySegments() nnew=%d\n", nnew)); + allocDisplaySegments(ocw, nnew); + + ocw->overthespot.overflowcanvas = NULL; + + disploc.x = disploc.y = 0; + if (ocw->overthespot.canvaslist == NULL) { + ocw->overthespot.canvaslist = CreateTextCanvas(ocw); + } + disploc.canvas = ocw->overthespot.canvaslist; + + for (i = 0, dseg = ocw->overthespot.dispsegments; i < nnew; i++, dseg++) { + newseg = ICGetSegment(ocw->ccontrol.inputobj, i); + if (i >= nold) { + copyString(newseg, &dseg->seg); + dseg->redrawpos = 0; + dseg->fragments = computeDisplayFragments(ocw, newseg, &disploc); + } else { + DisplayFragment *oldfragments, *newfragments; + + dseg->redrawpos = -1; + diff = ICCompareSegment(inputobj, newseg, &dseg->seg, &nsame); + if (diff != ICSame || + disploc.canvas != dseg->fragments->canvas || + disploc.x != dseg->fragments->region.x || + disploc.y != dseg->fragments->region.y) { + oldfragments = dseg->fragments; + newfragments = computeDisplayFragments(ocw, newseg, &disploc); + dseg->fragments = newfragments; + } else { + oldfragments = NULL; + newfragments = dseg->fragments; + computeLastPosition(newfragments, &disploc); + } + + switch (diff) { + case ICSame: + if (oldfragments == NULL || + oldfragments->canvas == newfragments->canvas && + oldfragments->region.x == newfragments->region.x && + oldfragments->region.y == newfragments->region.y) { + dseg->redrawpos = -1; + } else { + dseg->redrawpos = 0; + } + break; + case ICAttrChanged: + dseg->redrawpos = 0; + dseg->seg.attr = newseg->attr; + break; + case ICStringChanged: + if (oldfragments == NULL || + oldfragments->canvas == newfragments->canvas && + oldfragments->region.x == newfragments->region.x && + oldfragments->region.y == newfragments->region.y) { + dseg->redrawpos = nsame; + } else { + dseg->redrawpos = 0; + } + freeString(&dseg->seg); + copyString(newseg, &dseg->seg); + break; + default: + dseg->redrawpos = 0; + freeString(&dseg->seg); + copyString(newseg, &dseg->seg); + break; + } + if (oldfragments) freeDisplayFragments(oldfragments); + } + } + + for (; i < nold; i++, dseg++) freeDisplaySegment(dseg); + + ocw->overthespot.numsegments = nnew; +} + +/*- recomputeDisplaySegments: recompute segments/fragments -*/ +static void +recomputeDisplaySegments(ocw) +OverTheSpotConversionWidget ocw; +{ + int nseg = ocw->overthespot.numsegments; + DisplaySegment *dseg; + DisplayLocation disploc; + int i; + + ocw->overthespot.overflowcanvas = NULL; + + disploc.x = disploc.y = 0; + if (ocw->overthespot.canvaslist == NULL) { + ocw->overthespot.canvaslist = CreateTextCanvas(ocw); + } + disploc.canvas = ocw->overthespot.canvaslist; + + for (i = 0, dseg = ocw->overthespot.dispsegments; i < nseg; i++, dseg++) { + freeDisplayFragments(dseg->fragments); + dseg->redrawpos = 0; + dseg->fragments = computeDisplayFragments(ocw, &dseg->seg, &disploc); + } +} + +/*- computeLastPosition: get last position of the specified fragment -*/ +static void +computeLastPosition(fragments, disploc) +DisplayFragment *fragments; +DisplayLocation *disploc; +{ + while (fragments->next != NULL) fragments = fragments->next; + disploc->canvas = fragments->canvas; + disploc->x = fragments->region.x + fragments->region.width; + disploc->y = fragments->region.y; +} + +/*- computeDisplayFragments: compute fragment(s) of the specified segment -*/ +static DisplayFragment * +computeDisplayFragments(ocw, newseg, disploc) +OverTheSpotConversionWidget ocw; +ICString *newseg; +DisplayLocation *disploc; +{ + int start; + int nchars; + Widget dispobj = ocw->overthespot.displayobj; + DisplayFragment *fragments, *dfp; + int widthavailable; + + TRACE(("computeDisplayFragments()\n")); + start = 0; + fragments = NULL; + while (start < newseg->nchars) { + widthavailable = computeWidthAvailable(ocw, disploc); + nchars = CDMaxChar(dispobj, newseg, start, widthavailable); + if (nchars == 0) { + if (disploc->canvas->x <= CLAREA(ocw).x && + disploc->x == 0) { + /* + * specified width is too narrow to display a character. + * we force to display at least one character per line. + */ + nchars = 1; + } + } + TRACE(("\twidthavailable=%d, start=%d, maxchar=%d\n", widthavailable, start, nchars)); + if (nchars > 0) { + if (fragments == NULL) { + fragments = dfp = allocDisplayFragment(); + } else { + dfp->next = allocDisplayFragment(); + dfp = dfp->next; + } + dfp->from = start; + dfp->nchars = nchars; + dfp->canvas = disploc->canvas; + dfp->region.x = disploc->x; + dfp->region.y = disploc->y; + dfp->region.width = CDStringWidth(dispobj, newseg, start, + start + nchars); + dfp->region.height = ocw->overthespot.lineheight; + dfp->next = NULL; + + disploc->x += dfp->region.width; + } + start += nchars; + if (start < newseg->nchars) nextLocation(ocw, disploc); + } + + return fragments; +} + +/*- computeWidthAvailable: return the width of the current line left for drawing -*/ +/* ARGSUSED */ +static int +computeWidthAvailable(ocw, disploc) +OverTheSpotConversionWidget ocw; +DisplayLocation *disploc; +{ + XRectangle *cregion = &CLAREA(ocw); + + if (disploc->canvas == ocw->overthespot.overflowcanvas) { + /* we pretend this canvas is veeeeeeery wide */ + return 9999; + } + return (cregion->x + cregion->width) - (disploc->canvas->x + disploc->x); +} + +/*- nextLocation: return the position of the next line -*/ +/* ARGSUSED */ +static void +nextLocation(ocw, disploc) +OverTheSpotConversionWidget ocw; +DisplayLocation *disploc; +{ + XRectangle *cregion = &CLAREA(ocw); + Position x, y; + + if (disploc->canvas->y + ocw->overthespot.linespacing * 2 > + cregion->y + cregion->height) { + /* no new canvas can create underneath this canvas */ + ocw->overthespot.overflowcanvas = disploc->canvas; + return; + } + + if (disploc->canvas->next == NULL) { + disploc->canvas->next = CreateTextCanvas(ocw); + } + x = CLAREA(ocw).x; + y = disploc->canvas->y + ocw->overthespot.linespacing; + disploc->canvas = disploc->canvas->next; + disploc->x = disploc->y = 0; + + disploc->canvas->x = x; + disploc->canvas->y = y; +} + +/*- findLocation: compute the display position of specified char -*/ +static DisplayLocation * +findLocation(ocw, dsp, offset, disploc) +OverTheSpotConversionWidget ocw; +DisplaySegment *dsp; +Cardinal offset; +DisplayLocation *disploc; +{ + DisplayFragment *dfp = dsp->fragments; + + while (dfp != NULL) { + if (dfp->nchars > offset || + dfp->next == NULL && dfp->nchars == offset) { + break; + } + offset -= dfp->nchars; + dfp = dfp->next; + } + if (dfp == NULL) return NULL; + + disploc->canvas = dfp->canvas; + disploc->x = dfp->region.x + CDStringWidth(ocw->overthespot.displayobj, + &dsp->seg, dfp->from, + dfp->from + offset); + disploc->y = dfp->region.y; + + return disploc; +} + +/*- reconfigureDisplay: do reconfiguration of text canvas (resize/popup/popdown) -*/ +static void +reconfigureDisplay(ocw) +OverTheSpotConversionWidget ocw; +{ + DisplaySegment *dsp; + DisplayFragment *dfp; + TextCanvas *tcp, *lasttcp; + Boolean shrink = ocw->overthespot.shrinkwindow; + XRectangle *areap = &CLAREA(ocw); + int i; + + for (tcp = ocw->overthespot.canvaslist; tcp != NULL; tcp = tcp->next) { + tcp->maxx = tcp->maxy = 0; + tcp->shouldpopup = False; + } + + for (i = 0, dsp = ocw->overthespot.dispsegments; i < ocw->overthespot.numsegments; i++, dsp++) { + for (dfp = dsp->fragments; dfp != NULL; dfp = dfp->next) { + tcp = dfp->canvas; + tcp->maxx = dfp->region.x + dfp->region.width; + tcp->maxy = dfp->region.y + dfp->region.height; + tcp->shouldpopup = True; + } + } + + lasttcp = NULL; + for (tcp = ocw->overthespot.canvaslist; tcp != NULL; tcp = tcp->next) { + if (tcp->maxx < tcp->canvas->core.width && XtIsRealized(tcp->canvas)) { + XClearArea(XtDisplay(tcp->canvas), XtWindow(tcp->canvas), + tcp->maxx, 0, 0, 0, False); + } + if (tcp->shouldpopup) lasttcp = tcp; + } + + if (!ocw->overthespot.modelocationspecified && + ocw->overthespot.modeshell == ocw->overthespot.modeshell_fix) { + /* ModeTrackText */ + if (lasttcp == NULL) { + locateTrackingModeWidget(ocw, True, 0, 0); + } else { + locateTrackingModeWidget(ocw, False, lasttcp->x, + lasttcp->y + lasttcp->maxy); + } + } + + if (ocw->overthespot.cursorvisible) { + DisplayLocation *dlp = &ocw->overthespot.cursorlocation; + XRectangle cbounds; + int x; + + tcp = dlp->canvas; + CDGetCursorBounds(ocw->overthespot.displayobj, &cbounds); + x = dlp->x + cbounds.x + cbounds.width; + if (x > tcp->maxx) tcp->maxx = x; + } + + if (lasttcp != NULL && + lasttcp->x + lasttcp->maxx > areap->x + areap->width) { + ocw->overthespot.overflowcanvas = lasttcp; + adjustDisplay(ocw); + } + + for (tcp = ocw->overthespot.canvaslist; tcp != NULL; tcp = tcp->next) { + Arg args[2]; + int nargs = 0; + if (tcp->shouldpopup && tcp->maxx > 0 && tcp->maxy > 0) { + if (tcp == ocw->overthespot.overflowcanvas) { + XtMoveWidget(tcp->canvas, + tcp->x + ocw->overthespot.overflowoffset, tcp->y); + } else if (tcp->x != tcp->canvas->core.x || + tcp->y != tcp->canvas->core.y) { + XtMoveWidget(tcp->canvas, tcp->x, tcp->y); + } + if (shrink || !tcp->poppedup || + tcp->maxx > tcp->canvas->core.width) { + XtSetArg(args[nargs], XtNwidth, tcp->maxx); nargs++; + } + if (!tcp->poppedup || tcp->maxy > tcp->canvas->core.height) { + XtSetArg(args[nargs], XtNheight, tcp->maxy); nargs++; + } + if (nargs > 0) XtSetValues(tcp->canvas, args, nargs); + + if (!tcp->poppedup) { + TRACE(("reconfigureDisplay(): canvas popup\n")); + XtPopup(tcp->canvas, XtGrabNone); + tcp->poppedup = True; + } + } else { + if (tcp->poppedup) { + TRACE(("reconfigureDisplay(): canvas popdown\n")); + XtPopdown(tcp->canvas); + tcp->poppedup = False; + } + } + } +} + +/*- updateDisplay: redraw text (if needed) -*/ +static void +updateDisplay(ocw) +OverTheSpotConversionWidget ocw; +{ + Widget dispobj = ocw->overthespot.displayobj; + DisplaySegment *dsp = ocw->overthespot.dispsegments; + int i; + + for (i = 0; i < ocw->overthespot.numsegments; i++, dsp++) { + if (dsp->redrawpos >= 0) { + TRACE(("updateDisplaySegment(seg#=%d)\n", i)); + updateDisplaySegment(dispobj, dsp); + } + } +} + +/*- updateDisplaySegment: redraw specified segment (if needed) -*/ +static void +updateDisplaySegment(dispobj, dsp) +Widget dispobj; +DisplaySegment *dsp; +{ + DisplayFragment *dfp = dsp->fragments; + int from; + int x; + + while (dfp != NULL) { + if (dsp->redrawpos < dfp->from + dfp->nchars) { + from = (dsp->redrawpos > dfp->from) ? dsp->redrawpos : dfp->from; + x = dfp->region.x; + if (from > dfp->from) { + x += CDStringWidth(dispobj, &dsp->seg, dfp->from, from); + } + CDDrawString(dispobj, dfp->canvas->canvas, &dsp->seg, + from, dfp->from + dfp->nchars, + x, dfp->region.y); + } + dfp = dfp->next; + } +} + +/*- redrawSegments: redraw segments in specified area -*/ +static void +redrawSegments(ocw, canvas, region) +OverTheSpotConversionWidget ocw; +Widget canvas; +XRectangle *region; +{ + DisplaySegment *dsp = ocw->overthespot.dispsegments; + DisplayFragment *dfp; + Widget dispobj = ocw->overthespot.displayobj; + int i; + + for (i = 0; i < ocw->overthespot.numsegments; i++, dsp++) { + for (dfp = dsp->fragments; dfp != NULL; dfp = dfp->next) { + if (dfp->canvas->canvas == canvas && + intersectRect(&dfp->region, region)) { + CDDrawString(dispobj, canvas, &dsp->seg, + dfp->from, dfp->from + dfp->nchars, + dfp->region.x, dfp->region.y); + } + } + } +} + +/* + *+ handle overflow canvas functions + */ + +/*- adjustDisplay: compute appropriate offset for the overflow canvas -*/ +static void +adjustDisplay(ocw) +OverTheSpotConversionWidget ocw; +{ + Position outerleft, outerright, innerleft, innerright; + TextCanvas *overflowcanvas = ocw->overthespot.overflowcanvas; + Cardinal curseg; + Cardinal curoffset; + XRectangle *areap; + Position offset; + + TRACE(("adjustDisplay()\n")); + ocw->overthespot.overflowoffset = 0; + + /* + * $B%9%H%i%F%8$H$7$F$O(B + * $B%+%l%s%H%;%0%a%s%H!&%+%l%s%H%5%V%;%0%a%s%H!&%$%s%5!<%H%+!<%=%k$N$"$k(B + * $B%;%0%a%s%H$N$I$l$b$J$1$l$P5$$K$7$J$$(B + * $B%$%s%5!<%H%+!<%=%k$,$"$l$P$=$l$r:GM%@h$9$k!#$D$^$j%$%s%5!<%H%+!<%=%k(B + * $B$O2?$,$"$C$F$bI=<($9$k$h$&$K$9$k!#(B + * $B$G$-$l$P%$%s%5!<%H%+!<%=%k$N$"$k%;%0%a%s%H$O$9$Y$FI=<($9$k!#(B + */ + + outerleft = innerleft = 9999; + outerright = innerright = 0; + + if (ICCursorPos(ocw->ccontrol.inputobj, &curseg, &curoffset) == 1) { + (void)getInsertingSegmentRange(ocw, overflowcanvas, + curseg, curoffset, + &outerleft, &outerright, &innerleft); + if (outerleft <= outerright) innerright = innerleft + 2; /* XXX */ + } else { + (void)getAttributeSegmentRange(ocw, overflowcanvas, + ICAttrCurrentSegment, + &innerleft, &innerright); + (void)getAttributeSegmentRange(ocw, overflowcanvas, + ICAttrCurrentSubSegment, + &outerleft, &outerright); + } + + if (outerleft > outerright && innerleft > innerright) { + /* no important segments is on the overflow canvas */ + TRACE(("\tno important segments on the canvas\n")); + return; + } + + if (outerleft > innerleft) outerleft = innerleft; + if (outerright < innerright) outerright = innerright; + + areap = &CLAREA(ocw); + + if (areap->x <= outerleft && outerright <= areap->x + areap->width) { + /* important part fits in the visible area */ + TRACE(("\timportant segments are visible\n")); + return; + } + + offset = 0; + adjustOffset(areap, outerleft, outerright, &offset, False); + adjustOffset(areap, innerleft, innerright, &offset, True); + TRACE(("\toffset = %d\n", offset)); + ocw->overthespot.overflowoffset = offset; +} + +/*- getAttributeSegmentRange: compute span of segments which has the specified attributes -*/ +static Boolean +getAttributeSegmentRange(ocw, canvas, attr, leftp, rightp) +OverTheSpotConversionWidget ocw; +TextCanvas *canvas; +int attr; +Position *leftp; +Position *rightp; +{ + int nsegs = ocw->overthespot.numsegments; + DisplaySegment *dseg = ocw->overthespot.dispsegments; + DisplayFragment *dfp; + Position left, right; + + left = 32767; + right = 0; + + while (nsegs-- > 0) { + if (dseg->seg.attr & attr) { + dfp = dseg->fragments; + + while (dfp != NULL) { + if (dfp->canvas == canvas) { + if (dfp->region.x < left) left = dfp->region.x; + if (right < dfp->region.x + dfp->region.width) { + right = dfp->region.x + dfp->region.width; + } + } + dfp = dfp->next; + } + } + dseg++; + } + + if (left > right) return False; + + *leftp = left + canvas->x; + *rightp = right + canvas->x; + return True; +} + +/*- getInsertingSegmentRange: compute span of segments which has insert cursor -*/ +static Boolean +getInsertingSegmentRange(ocw, canvas, curseg, offset, leftp, rightp, posp) +OverTheSpotConversionWidget ocw; +TextCanvas *canvas; +Cardinal curseg; +Cardinal offset; +Position *leftp; +Position *rightp; +Position *posp; +{ + DisplaySegment *dseg = ocw->overthespot.dispsegments + curseg; + DisplayFragment *dfp; + Position left, right, insert; + + left = 32767; + right = 0; + + dfp = dseg->fragments; + + while (dfp != NULL) { + if (dfp->canvas == canvas && + dfp->from <= offset && offset <= dfp->from + dfp->nchars) { + if (dfp->region.x < left) left = dfp->region.x; + if (right < dfp->region.x + dfp->region.width) { + right = dfp->region.x + dfp->region.width; + } + + if (offset == dfp->from) { + insert = dfp->region.x; + } else if (offset == dfp->from + dfp->nchars) { + insert = dfp->region.x + dfp->region.width; + } else { + insert = dfp->region.x + + CDStringWidth(ocw->overthespot.displayobj, + &dseg->seg, dfp->from, + offset); + } + break; + } + dfp = dfp->next; + } + + if (left > right) return False; + + *leftp = left + canvas->x; + *rightp = right + canvas->x; + *posp = insert + canvas->x; + return True; +} + +/*- adjustOffset: make the span fit within the specified area -*/ +static void +adjustOffset(rectp, left, right, offsetp, force) +XRectangle *rectp; +Position left; +Position right; +Position *offsetp; +Boolean force; +{ + Position offset = *offsetp; + + if (rectp->x <= left + offset && + right + offset <= rectp->x + rectp->width) return; + + if (right - left > rectp->width) { + if (!force) return; + /* centering */ + offset = (rectp->x + rectp->width / 2) - (right + left) / 2; + } else { + if (left + offset < rectp->x) { + offset = rectp->x - left; + } else if (rectp->x + rectp->width < right + offset) { + offset = rectp->x + rectp->width - right; + } + } + *offsetp = offset; + return; +} + + +/* + *+ insert cursor handling functions + */ + +/*- eraseCursor: erase insert cursor -*/ +static void +eraseCursor(ocw) +OverTheSpotConversionWidget ocw; +{ + if (!ocw->overthespot.cursorvisible) return; + + TRACE(("eraseCursor() at (%d,%d)\n", + ocw->overthespot.cursorlocation.x, + ocw->overthespot.cursorlocation.y)); + CDDrawCursor(ocw->overthespot.displayobj, + ocw->overthespot.cursorlocation.canvas->canvas, + ocw->overthespot.cursorlocation.x, + ocw->overthespot.cursorlocation.y, + False); + ocw->overthespot.cursorvisible = False; +} + +/*- showCursor: draw insert cursor -*/ +static void +showCursor(ocw) +OverTheSpotConversionWidget ocw; +{ + if (!ocw->overthespot.cursorvisible) return; + + TRACE(("showCursor at (%d,%d)\n", + ocw->overthespot.cursorlocation.x, + ocw->overthespot.cursorlocation.y)); + CDDrawCursor(ocw->overthespot.displayobj, + ocw->overthespot.cursorlocation.canvas->canvas, + ocw->overthespot.cursorlocation.x, + ocw->overthespot.cursorlocation.y, + True); +} + +/*- exposeCursor: make the insert cursor redraw correctly when exposing -*/ +static Boolean +exposeCursor(ocw, w, region) +OverTheSpotConversionWidget ocw; +Widget w; +XRectangle *region; +{ + XRectangle bounds; + + if (!ocw->overthespot.cursorvisible || + w != ocw->overthespot.cursorlocation.canvas->canvas) return False; + + TRACE(("exposeCursor(region=%d,%d-%d,%d)\n", + region->x, region->y, region->width, region->height)); + /* + * if a part of the insert cursor is in the exposing region, + * clear the entire cursor before redraw, since the cursor is + * drawn with xor mode. + */ + CDGetCursorBounds(ocw->overthespot.displayobj, &bounds); + bounds.x += ocw->overthespot.cursorlocation.x; + bounds.y += ocw->overthespot.cursorlocation.y; + if (intersectRect(region, &bounds)) { + eraseCursor(ocw); + XClearArea(XtDisplay(w), XtWindow(w), + bounds.x, bounds.y, bounds.width, bounds.height, False); + unionRect(region, &bounds, region); + } + ocw->overthespot.cursorvisible = True; + return True; +} + +/*- computeCursor: compute insert cursor position if visible -*/ +static void +computeCursor(ocw) +OverTheSpotConversionWidget ocw; +{ + DisplaySegment *dsp; + DisplayLocation disploc; + Cardinal seg, offset; + + if (!ICCursorPos(ocw->ccontrol.inputobj, &seg, &offset)) { + ocw->overthespot.cursorvisible = False; + return; + } + + /* sanity check */ + if (seg >= ocw->overthespot.numsegments) return; + dsp = ocw->overthespot.dispsegments + seg; + if (offset > dsp->seg.nchars) return; + + if (findLocation(ocw, dsp, offset, &disploc) == NULL) return; + + disploc.y += ocw->overthespot.ascent; + + ocw->overthespot.cursorvisible = True; + ocw->overthespot.cursorlocation = disploc; +} + +/* + *+ resource converter + */ + +/*- StringToModeLocation: string->mode-location resource converter -*/ +/* ARGSUSED */ +static void +StringToModeLocation(args, num_args, from, to) +XrmValue *args; +Cardinal *num_args; +XrmValue *from; +XrmValue *to; +{ + char *s = (char *)from->addr; + static ModeLocation ml = ModeBottomLeft; + + if (!XmuCompareISOLatin1(s, "topleft")) ml = ModeTopLeft; + else if (!XmuCompareISOLatin1(s, "topright")) ml = ModeTopRight; + else if (!XmuCompareISOLatin1(s, "bottomleft")) ml = ModeBottomLeft; + else if (!XmuCompareISOLatin1(s, "bottomright")) ml = ModeBottomRight; + else if (!XmuCompareISOLatin1(s, "tracktext")) ml = ModeTrackText; + else if (!XmuCompareISOLatin1(s, "none")) ml = ModeNone; + else { + XtStringConversionWarning(s, XtRModeLocation); + } + + to->size = sizeof(ModeLocation); + to->addr = (caddr_t)&ml; +} + +/* + *+ miscellaneous functions + */ + +/*- MoveShell: move shell widget -*/ +static void +MoveShell(w, x, y) +Widget w; +Position x; +Position y; +{ + ShellWidget shell = (ShellWidget)w; + + TRACE(("MoveShell(%s,x=%d,y=%d,core.x=%d,core.y=%d)\n",XtName(w),x,y,w->core.x,w->core.y)); + XtCheckSubclass(w, shellWidgetClass, + "MoveShell: specified widget is not a shell"); + /* + * calling XtMoveWidget() is NOT enough to move shell widgets when + * they are not mapped. we must use XtMakeGeometryRequest() or + * XtSetValues() to invoke root-geometry-manager which modifies + * the size hint appropriately. + */ + if (shell->shell.popped_up) { + XtMoveWidget(w, x, y); + } else { + XtWidgetGeometry req; + + req.request_mode = CWX | CWY; + req.x = x; + req.y = y; + (void)XtMakeGeometryRequest(w, &req, (XtWidgetGeometry *)NULL); + } +} + +/*- getToplevelWindow: get top-level window of a given window -*/ +static Window +getToplevelWindow(dpy, win, wm_state) +Display *dpy; +Window win; +Atom wm_state; +{ + Atom type; + int format; + unsigned long nitems, bytesafter; + unsigned char *data; + Window root, parent; + Window *children; + unsigned int nchildren; + + /* + * find toplevel window which has WM_STATE property or if no exists, + * direct subwindow of the root window. (ie I assume that if a + * window manager is running, that is a ICCCM compliant one) + */ + for (;;) { + type = None; + if (wm_state != None) { + data = NULL; + XGetWindowProperty(dpy, win, wm_state, 0L, 0L, False, + AnyPropertyType, &type, &format, + &nitems, &bytesafter, &data); + if (data != NULL) XtFree((char *)data); + if (type != None) break; + } + if (!XQueryTree(dpy, win, &root, &parent, &children, &nchildren)) break; + if (nchildren > 0) XtFree((char *)children); + if (root == parent) break; + win = parent; + } + return win; +} + +/*- setTransientFor: set WM_TRANSIENT_FOR property to specified widget -*/ +static void +setTransientFor(w, win) +Widget w; +Window win; +{ + if (w == NULL) return; + if (!XtIsRealized(w)) XtRealizeWidget(w); + XSetTransientForHint(XtDisplay(w), XtWindow(w), win); +} + +/*-setMwmHints: set _MOTIF_WM_HINTS for mode shell -*/ +static void +setMwmHints(w) +Widget w; +{ +#define MWM_HINTS_ATOM "_MOTIF_WM_HINTS" +#define MWM_HINTS_DECOR (1 << 1) +#define MWM_DECOR_BORDER (1 << 1) + Atom mwm_hints; + unsigned long hints[5]; + + if (w == NULL) return; + if (!XtIsRealized(w)) XtRealizeWidget(w); + + mwm_hints = CachedInternAtom(XtDisplay(w), MWM_HINTS_ATOM, False); + if (mwm_hints == None) return; /* just in case.. */ + + hints[0] = MWM_HINTS_DECOR; /* flags */ + hints[2] = MWM_DECOR_BORDER; /* decorations */ + hints[1] = hints[3] = hints[4] = 0; /* functions, input mode and status */ + + XChangeProperty(XtDisplay(w), XtWindow(w), + mwm_hints, mwm_hints, 32, PropModeReplace, + (unsigned char *)hints, 5); +} + +/*- getFocusOffset: get the focus window's position relative to the client window -*/ +static void +getFocusOffset(ocw) +OverTheSpotConversionWidget ocw; +{ + int offx, offy; + Window junkw; + + if (ocw->ccontrol.focuswindow == ocw->ccontrol.clientwindow) { + FOCUSOFFX(ocw) = 0; + FOCUSOFFY(ocw) = 0; + return; + } + XTranslateCoordinates(XtDisplay((Widget)ocw), + ocw->ccontrol.focuswindow, + ocw->ccontrol.clientwindow, + 0, 0, &offx, &offy, &junkw); + FOCUSOFFX(ocw) = offx; + FOCUSOFFY(ocw) = offy; +} + +/*- intersectRect: returns given rectangles have a intersection -*/ +static Boolean +intersectRect(rect1, rect2) +register XRectangle *rect1; +register XRectangle *rect2; +{ + return (rect1->x + rect1->width <= rect2->x || + rect1->x >= rect2->x + rect2->width || + rect1->y + rect1->height <= rect2->y || + rect1->y >= rect2->y + rect2->height) ? False : True; +} + +/*- unionRect: returns minimum rectangle that covers given rectangles -*/ +static void +unionRect(rect1, rect2, rect_ret) +register XRectangle *rect1; +register XRectangle *rect2; +XRectangle *rect_ret; +{ + int x0, x1, y0, y1; + + x0 = (rect1->x > rect2->x) ? rect2->x : rect1->x; + y0 = (rect1->y > rect2->y) ? rect2->y : rect1->y; + x1 = (rect1->x + rect1->width > rect2->x + rect2->width) ? + rect1->x + rect1->width : rect2->x + rect2->width; + y1 = (rect1->y + rect1->height > rect2->y + rect2->height) ? + rect1->y + rect1->height : rect2->y + rect2->height; + + rect_ret->x = x0; + rect_ret->y = y0; + rect_ret->width = x1 - x0; + rect_ret->height = y1 - y0; +} + +/*- enoughSpaceForStatus: checks if there's enough space for the status display -*/ +static int +enoughSpaceForStatus(ocw) +OverTheSpotConversionWidget ocw; +{ + Widget modew = ocw->overthespot.modewidget_fix; + int modespace; + int ascent = ocw->overthespot.ascent; + int descent = ocw->overthespot.lineheight - ascent; + int lspace = ocw->overthespot.linespacing; + int areatop = CLAREA(ocw).y; + int areabottom = CLAREA(ocw).y + CLAREA(ocw).height; + int top, bottom, y; + + if (lspace == 0) lspace = 1; /* avoid "divide by zero" error */ + + /* + * tracking $B%9%F!<%?%9$,I=<($G$-$k$+$I$&$+%A%'%C%/$9$k$K$O!"%/%i%$(B + * $B%"%s%H%(%j%"$KI=<($G$-$k:G=i$H:G8e$N9T$K$D$$$F$=$N>e$+2<$K%9%F!<(B + * $B%?%9$,I=<($G$-$k$3$H$rD4$Y$l$P$h$$!#(B + */ + + modespace = modew->core.height + modew->core.border_width * 2 + 2; + + /* $B:G=i$N9T$N>e2<$N(B Y $B:BI8$r7W;;$7$F%9%F!<%?%9$,I=<($G$-$k$+D4$Y$k(B */ + y = SPOTY(ocw) - ascent; + top = y - ((y - areatop) / lspace) * lspace; + bottom = top + ascent + descent; + if (top - areatop < modespace && areabottom - bottom < modespace) { + return 0; + } + + /* $B:G8e$N9T$N>e2<$N(B Y $B:BI8$r7W;;$7$F%9%F!<%?%9$,I=<($G$-$k$+D4$Y$k(B */ + y = SPOTY(ocw) + descent; + bottom = y + ((areabottom - y) / lspace) * lspace; + top = bottom - (ascent + descent); + if (top - areatop < modespace && areabottom - bottom < modespace) { + return 0; + } + + return 1; +} + +static DisplayFragment *free_fragments = NULL; + +/*- allocDisplayFragment: get new fragment -*/ +static DisplayFragment * +allocDisplayFragment() +{ + if (free_fragments == NULL) { + return XtNew(DisplayFragment); + } else { + DisplayFragment *dfp = free_fragments; + free_fragments = dfp->next; + return dfp; + } +} + +/*- freeDisplayFragments: add specified fragment list to free-list -*/ +static void +freeDisplayFragments(fragments) +DisplayFragment *fragments; +{ + DisplayFragment *dfp = fragments; + + if (dfp == NULL) return; + while (dfp->next != NULL) dfp = dfp->next; + dfp->next = free_fragments; + free_fragments = fragments; +} + +/*- destroyDisplayFragments: free specified fragment list -*/ +static void +destroyDisplayFragments(fragments) +DisplayFragment *fragments; +{ + DisplayFragment *dfp; + + while (fragments != NULL) { + dfp = fragments->next; + XtFree((char *)fragments); + fragments = dfp; + } +} + +/*- allocDisplaySegments: prepare specified number of display segments -*/ +static void +allocDisplaySegments(ocw, n) +OverTheSpotConversionWidget ocw; +int n; +{ + if (ocw->overthespot.dispsegmentsize > n) return; + n = ((n + 3) / 4) * 4 ; + if (ocw->overthespot.dispsegments == NULL) { + ocw->overthespot.dispsegments = (DisplaySegment *)XtMalloc(n * sizeof(DisplaySegment)); + } else { + ocw->overthespot.dispsegments = (DisplaySegment *)XtRealloc((char *)ocw->overthespot.dispsegments, n * sizeof(DisplaySegment)); + } + ocw->overthespot.dispsegmentsize = n; +} + +/*- freeDisplaySegment: free display segment's contents -*/ +static void +freeDisplaySegment(dsp) +DisplaySegment *dsp; +{ + freeString(&dsp->seg); + freeDisplayFragments(dsp->fragments); + dsp->fragments = NULL; +} + +/*- clearAllDisplaySegments: clear all display segment's -*/ +static void +clearAllDisplaySegments(ocw) +OverTheSpotConversionWidget ocw; +{ + DisplaySegment *dsp = ocw->overthespot.dispsegments; + int i; + + for (i = 0; i < ocw->overthespot.numsegments; i++) { + freeDisplaySegment(dsp++); + } + ocw->overthespot.numsegments = 0; +} + +/*- copyString: copy ICString -*/ +static void +copyString(from, to) +ICString *from; +ICString *to; +{ + *to = *from; + to->data = XtMalloc(to->nbytes); + (void)bcopy(from->data, to->data, to->nbytes); +} + +/*- freeString: free ICString -*/ +static void +freeString(seg) +ICString *seg; +{ + XtFree(seg->data); + seg->data = NULL; + seg->nbytes = 0; +} diff -r 000000000000 -r 92745d501b9a lib/Sj3.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/Sj3.c Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,1282 @@ +#ifndef lint +static char *rcsid = "$Id: Sj3.c,v 2.10 1999/05/25 08:13:05 ishisone Exp $"; +#endif +/* + * Copyright (c) 1990 Software Research Associates, Inc. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Software Research Associates not be + * used in advertising or publicity pertaining to distribution of the + * software without specific, written prior permission. Software Research + * Associates makes no representations about the suitability of this software + * for any purpose. It is provided "as is" without express or implied + * warranty. + * + * Author: Makoto Ishisone, Software Research Associates, Inc., Japan + */ +/* + * Copyright 1991 Sony Corporation + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Sony not be used in advertising or + * publicity pertaining to distribution of the software without specific, + * written prior permission. Sony makes no representations about the + * suitability of this software for any purpose. It is provided "as is" + * without express or implied warranty. + * + * SONY DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL SONY + * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ +/* + * Author: Naoshi Suzuki, SONY Corporation. (nao@sm.sony.co.jp) + */ + +#include +#include +#if XtSpecificationRelease > 4 +#include +#endif +#include +#include +#include +#ifdef X_LOCALE +#include +#else /* X_LOCALE */ +#include +#endif /* X_LOCALE */ +#include +#include "Sj3P.h" + +static XtResource resources[] = { +#define offset(field) XtOffset(Sj3Object, sj3.field) + { XtNsj3serv, XtCSj3serv, XtRString, sizeof(String), + offset(sj3serv), XtRString, NULL }, + { XtNsj3serv2, XtCSj3serv2, XtRString, sizeof(String), + offset(sj3serv2), XtRString, NULL }, + { XtNsj3user, XtCSj3user, XtRString, sizeof(String), + offset(sj3user), XtRString, NULL }, + { XtNrcfile, XtCRcfile, XtRString, sizeof(String), + offset(rcfile), XtRString, NULL }, + { XtNsbfile, XtCSbfile, XtRString, sizeof(String), + offset(sbfile), XtRString, NULL }, + { XtNrkfile, XtCRkfile, XtRString, sizeof(String), + offset(rkfile), XtRString, NULL }, + { XtNhkfile, XtCHkfile, XtRString, sizeof(String), + offset(hkfile), XtRString, NULL }, + { XtNzhfile, XtCZhfile, XtRString, sizeof(String), + offset(zhfile), XtRString, NULL }, +#undef offset +}; + +static void ClassInitialize(); +static void Initialize(), Destroy(); +static Boolean SetValues(); +static int InputEvent(); +static ICString *GetMode(); +static int CursorPos(); +static int NumSegments(); +static ICString *GetSegment(); +static int CompareSegment(); +static ICString *GetItemList(); +static int SelectItem(); +static int ConvertedString(); +static int ClearConversion(); +static ICString *GetAuxSegments(); +static int PreeditString(); +static int StatusString(); + +Sj3ClassRec sj3ClassRec = { + { /* object fields */ + /* superclass */ (WidgetClass) &inputConvClassRec, + /* class_name */ "Sj3", + /* widget_size */ sizeof(Sj3Rec), + /* class_initialize */ ClassInitialize, + /* class_part_initialize */ NULL, + /* class_inited */ FALSE, + /* initialize */ Initialize, + /* initialize_hook */ NULL, + /* obj1 */ NULL, + /* obj2 */ NULL, + /* obj3 */ 0, + /* resources */ resources, + /* num_resources */ XtNumber(resources), + /* xrm_class */ NULLQUARK, + /* obj4 */ FALSE, + /* obj5 */ FALSE, + /* obj6 */ FALSE, + /* obj7 */ FALSE, + /* destroy */ Destroy, + /* obj8 */ NULL, + /* obj9 */ NULL, + /* set_values */ SetValues, + /* set_values_hook */ NULL, + /* obj10 */ NULL, + /* get_values_hook */ NULL, + /* obj11 */ NULL, + /* version */ XtVersion, + /* callback_private */ NULL, + /* obj12 */ NULL, + /* obj13 */ NULL, + /* obj14 */ NULL, + /* extension */ NULL + }, + { /* inputConv fields */ + /* InputEvent */ InputEvent, + /* GetMode */ GetMode, + /* CursorPos */ CursorPos, + /* NumSegments */ NumSegments, + /* GetSegment */ GetSegment, + /* CompareSegment */ CompareSegment, + /* GetItemList */ GetItemList, + /* SelectItem */ SelectItem, + /* GetConvertedString */ ConvertedString, + /* ClearConversion */ ClearConversion, + /* GetAuxSegments */ GetAuxSegments, + /* SupportMultipleObjects */ True, + /* GetTriggerKeys */ XtInheritGetTriggerKeys, + /* num_trigger_keys */ 0, + /* trigger_keys */ NULL, + /* GetPreeditString */ PreeditString, + /* GetStatusString */ StatusString, + /* NoMoreObjects */ False, + }, + { /* sj3 fields */ + /* foo */ (int)NULL, + } +}; + +WidgetClass sj3ObjectClass = (WidgetClass)&sj3ClassRec; + +static void startCandidate(); +static void startSymbol(); +static void startHinsi(); +static void moveSelection(); +static int endSelection(); +static int insertSelection(); +static void hinsiInit(); +static void symbolInit(); +static void allocCandlist(); +static void startRegistration(); +static void changeRegistration(); +static void endRegistration(); +static void setLocale(); +static void setUser(); + +static void addObject(); +static void deleteObject(); +static void bell(); + +static ICString *SymbolList = NULL; +static int NumSymbol; +static ICString *HinsiList = NULL; +static int NumHinsi; + +static int clcount = 0; + +static int usr_code; +static char home[256]; +static char uname[32]; + +/* + * ClassInitialize() + * Initialize common resource. + */ +static void +ClassInitialize() +{ + setLocale(); + setUser(); + + Xsj3cSetInLang(usr_code); + Xsj3cSetOutLang(JP_EUC); +} + +/* + * setLocale() + * Set locale and decide file code for all set-up files. + */ +static void +setLocale() +{ + char *loc; + +#ifdef X_LOCALE + if (loc = _Xsetlocale (LC_CTYPE, "")) { +#else /* X_LOCALE */ + if (loc = setlocale (LC_CTYPE, "")) { +#endif /* X_LOCALE */ + if (!strcmp(loc, "ja_JP.SJIS")||!strcmp(loc, "ja_JP.mscode")) + usr_code = JP_SJIS; + else if (!strcmp(loc, "ja_JP.jis7")) + usr_code = JP_JIS7; + else if (!strcmp(loc, "ja_JP.jis8")) + usr_code = JP_JIS8; + else + usr_code = JP_EUC; + } else + usr_code = JP_EUC; +#ifdef FORCE_SJIS + usr_code = JP_SJIS; +#endif +#ifdef FORCE_JIS8 + usr_code = JP_JIS8; +#endif +#ifdef FORCE_JIS7 + usr_code = JP_JIS7; +#endif +} + +/* + * setUser() + * Set user name and home directory. + */ +static void +setUser() +{ + extern char *getenv(), *getlogin(); + char *login; + struct passwd *pwd, *getpwnam(), *getpwuid(); + + + if (login = getlogin()) + strcpy(uname, login); + setpwent(); + if (!uname || *uname == '\0') { + if (pwd = getpwuid(getuid())) { + strcpy(uname, pwd->pw_name); + } + } else { + pwd = getpwnam(uname); + } + if (pwd) + strcpy(home, pwd->pw_dir); + else + strcpy(home, getenv("HOME")); + endpwent(); +} + +/* + * InputEvent() + * KeyPress event dispatch routine + */ +static int +InputEvent(w, ev) + Widget w; + XEvent *ev; +{ + Sj3Object obj = (Sj3Object)w; + Xsj3cBuf buf = obj->sj3.sj3buf; + int ret = 0, len, nbytes; + unsigned char *pre; + unsigned long modmask; + KeySym ks; + register Xsj3cEvent value, select, dict; + + /* KeyPress$B0J30$Otype != KeyPress) + return ret; + + pre = Xsj3cGetPreeditArea(buf, &len); + + /* $B%$%Y%s%H$rJ8;zNs5Z$S(B KeySym $B$KJQ49$9$k(B */ + nbytes = XmuLookupKana((XKeyPressedEvent *)ev, (char *)pre, len, &ks, NULL); + modmask = ev->xkey.state & 0xff; + + value = Xsj3cKeyConv(buf, nbytes, modmask, ks); + + if (select = (value & KEY_SELECT)) { + switch (select) { + case KEY_CAND_START: + startCandidate(obj); + break; + case KEY_SYMBOL_START: + startSymbol(obj); + break; + case KEY_HINSI_START: + startHinsi(obj); + break; + case KEY_SELECT_RIGHT: + moveSelection(obj, ICMoveRight); + break; + case KEY_SELECT_LEFT: + moveSelection(obj, ICMoveLeft); + break; + case KEY_SELECT_UP: + moveSelection(obj, ICMoveUp); + break; + case KEY_SELECT_DOWN: + moveSelection(obj, ICMoveDown); + break; + case KEY_SELECT_FIRST: + moveSelection(obj, ICMoveFirst); + break; + case KEY_SELECT_LAST: + moveSelection(obj, ICMoveLast); + break; + case KEY_SELECT_NEXTP: + moveSelection(obj, ICMoveNextPage); + break; + case KEY_SELECT_PREVP: + moveSelection(obj, ICMovePrevPage); + break; + case KEY_SELECT_RIGHTMOST: + moveSelection(obj, ICMoveRightMost); + break; + case KEY_SELECT_LEFTMOST: + moveSelection(obj, ICMoveLeftMost); + break; + case KEY_SELECT_END: + endSelection(obj, False); + break; + case KEY_SELECT_ABORT: + endSelection(obj, True); + break; + default: + break; + } + } + if (dict = (value & KEY_DICT)) { + switch (dict) { + case KEY_DICT_START: + startRegistration(obj); + break; + case KEY_DICT_CHANGE: + changeRegistration(obj); + break; + case KEY_DICT_REGISTER: + Xsj3cDictRegister(buf); + changeRegistration(obj); + break; + case KEY_DICT_CLEAR: + Xsj3cDictClear(buf); + changeRegistration(obj); + break; + case KEY_DICT_END: + endRegistration(obj); + break; + default: + break; + } + } + if (value & KEY_CONTROL || value == KEY_NULL) + ret = 1; + if (value & KEY_CHANGE){ + if (value & KEY_MODE_CHANGE) { + /* Change display mode string */ + XtCallCallbackList(w, obj->inputConv.modechangecallback, + (XtPointer)NULL); + } + if (value & KEY_TEXT_FIXED) { + /* Fix converting strings */ + XtCallCallbackList(w, obj->inputConv.fixcallback, + (XtPointer)NULL); + Xsj3cFixBuffer(buf); + } else if (value & KEY_TEXT_FLUSH) { + /* Fix & Input strings at same time */ + XtCallCallbackList(w, obj->inputConv.fixcallback, + (XtPointer)NULL); + Xsj3cFlushBuffer(buf); + } + if (value & KEY_TEXT_CHANGE) { + /* Change converting strings */ + XtCallCallbackList(w, obj->inputConv.textchangecallback, + (XtPointer)NULL); + } + if (value & KEY_HENKAN_END) { + /* End conversion */ + XtCallCallbackList((Widget)obj, obj->inputConv.endcallback, + (XtPointer)NULL); + Xsj3cClearBuffer(buf); + } + } + if (value & KEY_BELL){ + bell(obj); + return ret; + } else if (value & KEY_RECONNECT) { + Xsj3cConnect(buf, obj->sj3.sj3serv, + obj->sj3.sj3serv2, obj->sj3.sj3user); + Xsj3cClearBuffer(buf); + return ret; + } + return ret; +} + +static ICString * +GetMode(w) + Widget w; +{ + Sj3Object obj = (Sj3Object)w; + Xsj3cBuf buf = obj->sj3.sj3buf; + int len; + static ICString icstr; + + icstr.data = (char *)Xsj3cGetModeStr(buf, &len); + icstr.nchars = len; + icstr.nbytes = icstr.nchars * sizeof(wchar); + icstr.attr = ICAttrNormalString; + return &icstr; +} + +static int +CursorPos(w, nsegp, ncharp) + Widget w; + Cardinal *nsegp; + Cardinal *ncharp; +{ + Sj3Object obj = (Sj3Object)w; + Xsj3cBuf buf = obj->sj3.sj3buf; + + return(Xsj3cGetPosition(buf, nsegp, ncharp)); +} + +static int +NumSegments(w) +Widget w; +{ + Sj3Object obj = (Sj3Object)w; + Xsj3cBuf buf = obj->sj3.sj3buf; + + return (Xsj3cGetSegNum(buf)); +} + +static ICString * +GetSegment(w, n) + Widget w; + Cardinal n; +{ + Sj3Object obj = (Sj3Object)w; + Xsj3cBuf buf = obj->sj3.sj3buf; + static ICString seg; + int len, attr; + + seg.data = (char *)Xsj3cGetSeg(buf, n, &len, &attr); + seg.nchars = len; + seg.nbytes = seg.nchars * sizeof(wchar); + switch (attr) { + case SEG_REVERSED: + seg.attr = ICAttrConverted|ICAttrCurrentSegment; + break; + case SEG_UNDER_LINE: + seg.attr = ICAttrNotConverted; + break; + case SEG_NORMAL: + seg.attr = ICAttrConverted; + break; + default: + seg.attr = ICAttrConverted; + break; + } + + return &seg; +} + +/* ARGSUSED */ +static int +CompareSegment(w, seg1, seg2, n) + Widget w; + ICString *seg1; + ICString *seg2; + Cardinal *n; +{ + register unsigned char *p, *q; + register int len, nsame = 0; + int result = ICSame; + + if (seg1->attr != seg2->attr) + result |= ICAttrChanged; + + len = seg1->nbytes > seg2->nbytes ? seg2->nbytes : seg1->nbytes; + p = (unsigned char *)seg1->data; + q = (unsigned char *)seg2->data; + while (nsame < len && *p++ == *q++) nsame++; + + if (nsame != len || len != seg1->nbytes + || len != seg2->nbytes || seg1->data != seg2->data) + result |= ICStringChanged; + + if (n) + *n = nsame / sizeof(wchar); + + return result; + +} + +static ICString * +GetItemList(w, n) + Widget w; + Cardinal *n; +{ + Sj3Object obj = (Sj3Object)w; + + switch (obj->sj3.state) { + case candidate_state: + *n = obj->sj3.numcand; + return obj->sj3.candlist; + case symbol_state: + *n = NumSymbol; + return obj->sj3.symbollist; + case hinsi_state: + *n = NumHinsi; + return obj->sj3.hinsilist; + default: + *n = 0; + return NULL; /* no item available */ + } + /* NOTREACHED */ + +} + +static int +SelectItem(w, n) + Widget w; + int n; +{ + Sj3Object obj = (Sj3Object)w; + Xsj3cBuf buf = obj->sj3.sj3buf; + int ret = 0, changed = False, flush = False; + + if (obj->sj3.state == normal_state ) + return -1; + else if (n >= 0) + ret = insertSelection(obj, n, &changed, &flush); + + switch (obj->sj3.state) { + case candidate_state: + Xsj3cEndCandidate(buf, changed); + break; + case symbol_state: + Xsj3cEndSymbol(buf); + break; + case hinsi_state: + Xsj3cEndHinsi(buf); + break; + default: + XtAppWarning(XtWidgetToApplicationContext((Widget)obj), + "sj3 Object: Unknown ConvMode state"); + break; + } + obj->sj3.state = normal_state; + + if (changed) { + if (flush) { + XtCallCallbackList((Widget)obj, obj->inputConv.fixcallback, + (XtPointer)NULL); + Xsj3cFlushBuffer(buf); + } + XtCallCallbackList((Widget)obj, + obj->inputConv.textchangecallback, + (XtPointer)NULL); + } + + return ret; + +} + +static int +ConvertedString(w, encoding, format, length, string) + Widget w; + Atom *encoding; + int *format; + int *length; + XtPointer *string; +{ + Sj3Object obj = (Sj3Object)w; + Xsj3cBuf buf = obj->sj3.sj3buf; + wchar *wbuf, *wp; + wchar *data; + int len, wlen; + extern int convJWStoCT(); + + wlen = Xsj3cGetConvertedLength(buf); + wbuf = (wchar *)XtMalloc((wlen + 1) * sizeof(wchar)); + + if ((Xsj3cGetConvertedStr(buf, wbuf)) == NULL) { + XtAppWarning(XtWidgetToApplicationContext(w), + "sj3 Object: Could not get converted string"); + return -1; + } + *encoding = XA_COMPOUND_TEXT(XtDisplayOfObject((Widget)obj)); + *format = 8; + + for (wp = wbuf; *wp != 0; wp++) { + if (*wp == '\r') *wp = '\n'; + } + + *length = len = convJWStoCT(wbuf, (unsigned char *)NULL, 0); + *string = XtMalloc(len + 1); + (void)convJWStoCT(wbuf, (unsigned char *)*string, 0); + + XtFree((char *)wbuf); + + return 0; +} + +static int +ClearConversion(w) + Widget w; +{ + Sj3Object obj = (Sj3Object)w; + Xsj3cBuf buf = obj->sj3.sj3buf; + + Xsj3cClearBuffer(buf); + XtCallCallbackList(w, obj->inputConv.textchangecallback, (XtPointer)NULL); + return 0; +} + +static ICString * +GetAuxSegments(w, n, ns, nc) + Widget w; + Cardinal *n, *ns, *nc; +{ + Sj3Object obj = (Sj3Object)w; + Xsj3cBuf buf = obj->sj3.sj3buf; + register int i; + register Xsj3cDictMsg p; + register ICString *seg; + static ICString *ics; + + *n = Xsj3cGetDictMsgNum(buf); + if (!ics) { + ics = (ICString *)XtCalloc(*n, sizeof(ICString)); + } else { + ics = (ICString *)XtRealloc((char *)ics, *n * sizeof(ICString)); + } + bzero(ics, *n * sizeof(ICString)); + for (i = 0, seg = ics, p = Xsj3cGetDictMsgs(buf); + i < *n; i++, seg++) { + seg->data = (char *)p[i].data; + seg->nchars = p[i].len; + seg->nbytes = seg->nchars * sizeof(wchar); + switch (p[i].attr) { + case SEG_REVERSED: + seg->attr = ICAttrConverted|ICAttrCurrentSegment; + break; + case SEG_UNDER_LINE: + seg->attr = ICAttrNotConverted; + break; + case SEG_NORMAL: + seg->attr = ICAttrConverted; + break; + default: + seg->attr = ICAttrNotConverted; + break; + } + } + *ns = *n - 1; + *nc = 0; + + return ics; +} + +/* ARGSUSED */ +static int +PreeditString(w, segn, offset, encoding, format, length, string) +Widget w; +int segn; +int offset; +Atom *encoding; +int *format; +int *length; +XtPointer *string; +{ + Sj3Object obj = (Sj3Object)w; + Xsj3cBuf buf = obj->sj3.sj3buf; + int segnum = Xsj3cGetSegNum(buf); + int seglen, junk; + wchar *segdata; + Boolean deleted; + int i; + wchar *wbuf, *wp; + int len, wlen; + extern int convJWStoCT(); + + if (segn < segnum) { + segdata = Xsj3cGetSeg(buf, segn, &seglen, &junk); + if (offset >= seglen) { + /* $B%;%0%a%s%H$N:G8e(B */ + ++segn; + offset = 0; + } + } + if (segn >= segnum) { + deleted = True; + } + else { + segdata = Xsj3cGetSeg(buf, segn, &seglen, &junk); + deleted = (offset >= seglen); + } + if (deleted) { + /* $B:o=|$5$l$?(B */ + *encoding = XA_COMPOUND_TEXT(XtDisplayOfObject(w)); + *format = 8; + *length = 0; + *string = (XtPointer)XtMalloc(1); + return 0; + } + + wlen = 0; + for (i = segn; i < segnum; i++) { + segdata = Xsj3cGetSeg(buf, i, &seglen, &junk); + wlen += seglen; + } + wlen -= offset; + + wp = wbuf = (wchar *)XtMalloc((wlen + 1) * sizeof(wchar)); + segdata = Xsj3cGetSeg(buf, segn, &seglen, &junk); + len = seglen - offset; + (void)bcopy((char *)(segdata + offset), (char *)wp, sizeof(wchar) * len); + wp += len; + for (i = segn + 1; i < segnum; i++) { + segdata = Xsj3cGetSeg(buf, i, &seglen, &junk); + (void)bcopy((char *)segdata, (char *)wp, sizeof(wchar) * seglen); + wp += seglen; + } + wbuf[wlen] = 0; + + /* + * Sj3 $B%*%V%8%'%/%H$O(B COMPOUND_TEXT $B%(%s%3!<%G%#%s%0$7$+%5%]!<%H$7$J$$(B + * COMPOUND_TEXT $B$KJQ49$9$k(B + */ + *encoding = XA_COMPOUND_TEXT(XtDisplayOfObject(w)); + *format = 8; + + /* COMPOUND_TEXT $B$O(B \r $B$,Aw$l$J$$$N$G(B \n $B$KJQ49$7$F$*$/(B */ + for (wp = wbuf; *wp != 0; wp++) { + if (*wp == '\r') *wp = '\n'; + } + + *length = len = convJWStoCT(wbuf, (unsigned char *)NULL, 0); + *string = (XtPointer)XtMalloc(len + 1); + (void)convJWStoCT(wbuf, (unsigned char *)*string, 0); + + /* wbuf $B$r(B free $B$7$F$*$/(B */ + XtFree((char *)wbuf); + + return 0; +} + +/* ARGSUSED */ +static int +StatusString(w, encoding, format, length, string, nchars) +Widget w; +Atom *encoding; +int *format; +int *length; +XtPointer *string; +int *nchars; +{ + ICString *seg; + wchar *wbuf, *wp; + int len, wlen; + extern int convJWStoCT(); + + seg = GetMode(w); + if (seg == NULL) { + *length = *nchars = 0; + return -1; + } + + wlen = seg->nchars; + if (wlen <= 0) { + *length = *nchars = 0; + return -1; + } + + /* + * data $B$KF~$C$F$$$kJQ49%F%-%9%H$O(B null $B%?!<%_%M!<%H$5$l$F$$$J$$$+$b(B + * $B$7$l$J$$$N$G!"$^$:%3%T!<$7$F(B null $B%?!<%_%M!<%H$9$k(B + */ + wbuf = (wchar *)XtMalloc((wlen + 1) * sizeof(wchar)); + (void)bcopy(seg->data, (char *)wbuf, sizeof(wchar) * wlen); + wbuf[wlen] = 0; + + /* + * Sj3 $B%*%V%8%'%/%H$O(B COMPOUND_TEXT $B%(%s%3!<%G%#%s%0$7$+%5%]!<%H$7$J$$(B + * COMPOUND_TEXT $B$KJQ49$9$k(B + */ + *encoding = XA_COMPOUND_TEXT(XtDisplayOfObject(w)); + *format = 8; + + /* COMPOUND_TEXT $B$O(B \r $B$,Aw$l$J$$$N$G(B \n $B$KJQ49$7$F$*$/(B */ + for (wp = wbuf; *wp != 0; wp++) { + if (*wp == '\r') *wp = '\n'; + } + + *length = len = convJWStoCT(wbuf, (unsigned char *)NULL, 0); + *string = XtMalloc(len + 1); + (void)convJWStoCT(wbuf, (unsigned char *)*string, 0); + *nchars = seg->nchars; + + /* wbuf $B$r(B free $B$7$F$*$/(B */ + XtFree((char *)wbuf); + + return 0; +} + +/* ARGSUSED */ +static void +Initialize(req, new, args, num_args) + Widget req; + Widget new; + ArgList args; + Cardinal *num_args; +{ + Sj3Object obj = (Sj3Object)new; + Xsj3cBuf buf = NULL; + int min_keycode, max_keycode, keysyms_per_keycode; + register int i, j, k; + unsigned long kanamod = 0; + KeySym *keymap; + XModifierKeymap *modmap; + + obj->sj3.symbollist = SymbolList; + obj->sj3.hinsilist = HinsiList; + obj->sj3.candlist = NULL; + obj->sj3.numcand = 0; + obj->sj3.curcand = 0; + obj->sj3.cursymbol = 0; + obj->sj3.curhinsi = 0; + obj->sj3.candlistsize = 0; + obj->sj3.state = normal_state; + obj->sj3.selectionending = False; + + if (!obj->sj3.sj3user || *obj->sj3.sj3user == '\0') + obj->sj3.sj3user = uname; + + if (!clcount++) { + /* Get kana lock modmask */ + XDisplayKeycodes (XtDisplayOfObject((Widget)obj), + &min_keycode, &max_keycode); + keymap = XGetKeyboardMapping (XtDisplayOfObject((Widget)obj), + min_keycode, (max_keycode - min_keycode + 1), + &keysyms_per_keycode); + XFree(keymap); + + if (keysyms_per_keycode == 4) { + modmap = XGetModifierMapping(XtDisplayOfObject((Widget)obj)); + k = 0; + for (i = 0; i < 8; i++) { + for (j = 0; j < modmap->max_keypermod; j++) { + if (XK_Mode_switch == + XKeycodeToKeysym(XtDisplayOfObject((Widget)obj), + modmap->modifiermap[k], 0)) { + kanamod |= 1 << i; + } + k++; + } + } + XFreeModifiermap(modmap); + } + + /* Set kana lock modmask */ + Xsj3cSetKanaMod(kanamod); + + } + + /* Making buffer for Xsj3clib */ + buf = obj->sj3.sj3buf = Xsj3cCreateBuffer(); + if (!buf) { + XtAppError(XtWidgetToApplicationContext(new), + "sj3 Object: Failed to allocate buffers"); + } + + /* Read user resource customize file and set flags */ + (void)Xsj3cRCInit(buf, obj->sj3.rcfile, home); + + /* Convertion table initialization */ + Xsj3cInitializeTables(buf, home, obj->sj3.rkfile, obj->sj3.hkfile, + obj->sj3.zhfile, obj->sj3.sbfile); + + /* Connect to Kana-kanji conversion server */ + if ((Xsj3cOpen(buf, obj->sj3.sj3serv, + obj->sj3.sj3user, False, False)) != CONNECT_OK) { + XtAppWarning(XtWidgetToApplicationContext(new), + "sj3 Object: Failed to connect first server, then try to second server"); + if ((Xsj3cOpen(buf, obj->sj3.sj3serv2, + obj->sj3.sj3user, False, True)) != CONNECT_OK) { + XtAppError(XtWidgetToApplicationContext(new), + "sj3 Object: Failed to connect to second server"); + } + }; + + addObject(obj); +} + +static void +Destroy(w) + Widget w; +{ + Sj3Object obj = (Sj3Object)w; + Xsj3cBuf buf = obj->sj3.sj3buf; + + Xsj3cClose(buf, False); + Xsj3cFreeBuffer(buf); + deleteObject(obj); +} + +static void +symbolInit(obj) + Sj3Object obj; +{ + Xsj3cBuf buf = obj->sj3.sj3buf; + register ICString *strp; + register int i; + register Xsj3cSymbol p; + + for (i = 0, strp = SymbolList, p = Xsj3cGetSymbols(buf); + i < NumSymbol; i++, strp++) { + strp->data = (char *)p[i].data; + strp->nchars = p[i].len; + strp->nbytes = strp->nchars * sizeof(wchar); + strp->attr = ICAttrNormalString; + } +} + +static void +startSymbol(obj) + Sj3Object obj; +{ + Xsj3cBuf buf = obj->sj3.sj3buf; + ICSelectionControlArg arg; + + /* Symbol list initialization */ + if (!SymbolList) { + NumSymbol = Xsj3cGetSymbolNum(buf, &obj->sj3.cursymbol); + SymbolList = (ICString *)XtMalloc(NumSymbol * sizeof(ICString)); + symbolInit(obj); + obj->sj3.symbollist = SymbolList; + } else if (!obj->sj3.symbollist) { + obj->sj3.symbollist = SymbolList; + } + + obj->sj3.state = symbol_state; + + arg.command = ICSelectionStart; + arg.u.selection_kind = ICSelectionCandidates; + XtCallCallbackList((Widget)obj, obj->inputConv.selectioncallback, + (XtPointer)&arg); + + /* set current item */ + arg.command = ICSelectionSet; + arg.u.current_item = obj->sj3.cursymbol; + XtCallCallbackList((Widget)obj, obj->inputConv.selectioncallback, + (XtPointer)&arg); +} + +static void +startCandidate(obj) + Sj3Object obj; +{ + Xsj3cBuf buf = obj->sj3.sj3buf; + ICSelectionControlArg arg; + register ICString *strp; + register int i; + int ncand, curcand; + register Xsj3cCand p; + + if ((ncand = Xsj3cGetCandidateNum(buf, &curcand)) <= 0) { + bell(obj); + return; + } + obj->sj3.curcand = curcand; + obj->sj3.numcand = ncand; + + allocCandlist(obj, obj->sj3.numcand); + + for (i = 0, strp = obj->sj3.candlist, p = Xsj3cGetCandidates(buf); + i < obj->sj3.numcand; i++, strp++) { + strp->data = (char *)p[i].data; + strp->nchars = p[i].len; + strp->nbytes = strp->nchars * sizeof(wchar); + strp->attr = ICAttrNormalString; + } + + obj->sj3.state = candidate_state; + + arg.command = ICSelectionStart; + arg.u.selection_kind = ICSelectionCandidates; + XtCallCallbackList((Widget)obj, obj->inputConv.selectioncallback, + (XtPointer)&arg); + + /* set current candidate */ + arg.command = ICSelectionSet; + arg.u.current_item = curcand; + XtCallCallbackList((Widget)obj, obj->inputConv.selectioncallback, + (XtPointer)&arg); +} + +static void +hinsiInit(obj) + Sj3Object obj; +{ + Xsj3cBuf buf = obj->sj3.sj3buf; + register ICString *strp; + register int i; + register Xsj3cHinsi p; + + for (i = 0, strp = HinsiList, p = Xsj3cGetHinsis(buf); + i < NumHinsi; i++, strp++) { + strp->data = (char *)p[i].data; + strp->nchars = p[i].len; + strp->nbytes = strp->nchars * sizeof(wchar); + strp->attr = ICAttrNormalString; + } +} + +static void +startHinsi(obj) + Sj3Object obj; +{ + Xsj3cBuf buf = obj->sj3.sj3buf; + ICSelectionControlArg arg; + + /* Hinsi list initialization */ + if (!HinsiList) { + NumHinsi = Xsj3cGetHinsiNum(buf, &obj->sj3.curhinsi); + HinsiList = (ICString *)XtMalloc(NumHinsi * sizeof(ICString)); + hinsiInit(obj); + obj->sj3.hinsilist = HinsiList; + } else if (!obj->sj3.hinsilist) { + obj->sj3.hinsilist = HinsiList; + } + + obj->sj3.state = hinsi_state; + + arg.command = ICSelectionStart; + arg.u.selection_kind = ICSelectionCandidates; + XtCallCallbackList((Widget)obj, obj->inputConv.selectioncallback, + (XtPointer)&arg); + + /* set current item */ + arg.command = ICSelectionSet; + arg.u.current_item = obj->sj3.curhinsi; + XtCallCallbackList((Widget)obj, obj->inputConv.selectioncallback, + (XtPointer)&arg); +} + +static void +moveSelection(obj, dir) + Sj3Object obj; + int dir; +{ + ICSelectionControlArg arg; + + if (obj->sj3.state == normal_state) return; + arg.command = ICSelectionMove; + arg.u.dir = dir; + XtCallCallbackList((Widget)obj, obj->inputConv.selectioncallback, + (XtPointer)&arg); +} + +static int +endSelection(obj, abort) + Sj3Object obj; + int abort; +{ + ICSelectionControlArg arg; + int selected; + int ret = 0, changed = False, flush = False; + Xsj3cBuf buf = obj->sj3.sj3buf; + + if (obj->sj3.selectionending) + return 0; + + if (obj->sj3.state == normal_state) + return -1; + + arg.command = ICSelectionEnd; + arg.u.current_item = -1; + XtCallCallbackList((Widget)obj, obj->inputConv.selectioncallback, + (XtPointer)&arg); + + if (!abort && (selected = arg.u.current_item) >= 0) { + ret = insertSelection(obj, selected, &changed, &flush); + } + + switch (obj->sj3.state) { + case candidate_state: + Xsj3cEndCandidate(buf, changed); + break; + case symbol_state: + Xsj3cEndSymbol(buf); + break; + case hinsi_state: + Xsj3cEndHinsi(buf); + break; + default: + XtAppWarning(XtWidgetToApplicationContext((Widget)obj), + "sj3 Object: Unknow ConvMode state"); + break; + } + obj->sj3.state = normal_state; + + if (changed) { + if (flush) { + XtCallCallbackList((Widget)obj, obj->inputConv.fixcallback, + (XtPointer)NULL); + Xsj3cFlushBuffer(buf); + } + XtCallCallbackList((Widget)obj, + obj->inputConv.textchangecallback, + (XtPointer)NULL); + } + + return ret; +} + +/* ARGSUSED */ +static Boolean +SetValues(cur, req, wid, args, num_args) + Widget cur; + Widget req; + Widget wid; + ArgList args; + Cardinal *num_args; +{ + return False; +} + +static int +insertSelection(obj, selected, changed, flush) + Sj3Object obj; + int selected; + int *changed; + int *flush; +{ + Xsj3cBuf buf = obj->sj3.sj3buf; + int ret = 0; + + obj->sj3.selectionending = True; + switch (obj->sj3.state) { + case candidate_state: + obj->sj3.curcand = selected; + ret = Xsj3cSetCandidate(buf, selected, changed, flush); + break; + case symbol_state: + obj->sj3.cursymbol = selected; + ret = Xsj3cSetSymbol(buf, selected, changed, flush); + break; + case hinsi_state: + obj->sj3.curhinsi = selected; + ret = Xsj3cSetHinsi(buf, selected, changed, flush); + break; + } + obj->sj3.selectionending = False; + + return ret; +} + +static void +allocCandlist(obj, n) + Sj3Object obj; + int n; +{ + ICString *p; + + if (n <= obj->sj3.candlistsize) + return; + + if (obj->sj3.candlistsize == 0) { + p = (ICString *)XtMalloc(n * sizeof(ICString)); + } else { + p = (ICString *)XtRealloc((char *)obj->sj3.candlist, + n * sizeof(ICString)); + } + + obj->sj3.candlist = p; + obj->sj3.candlistsize = n; +} + +static void +startRegistration(obj) + Sj3Object obj; +{ + ICAuxControlArg arg; + + arg.command = ICAuxStart; + XtCallCallbackList((Widget)obj, obj->inputConv.auxcallback, + (XtPointer)&arg); +} + +static void +changeRegistration(obj) + Sj3Object obj; +{ + ICAuxControlArg arg; + + arg.command = ICAuxChange; + XtCallCallbackList((Widget)obj, obj->inputConv.auxcallback, + (XtPointer)&arg); +} + +static void +endRegistration(obj) + Sj3Object obj; +{ + Xsj3cBuf buf = obj->sj3.sj3buf; + ICAuxControlArg arg; + + arg.command = ICAuxEnd; + XtCallCallbackList((Widget)obj, obj->inputConv.auxcallback, + (XtPointer)&arg); + Xsj3cEndDict(buf); +} + +/* + * keeping list of objects + */ +typedef struct _oblist_ { + Sj3Object obj; + struct _oblist_ *next; +} ObjRec; + +static ObjRec *ObjList = NULL; + +static void +addObject(obj) + Sj3Object obj; +{ + ObjRec *objp = XtNew(ObjRec); + + objp->obj = obj; + objp->next = ObjList; + ObjList = objp; +} + +static void +deleteObject(obj) + Sj3Object obj; +{ + ObjRec *objp, *objp0; + + for (objp0 = NULL, objp = ObjList; + objp != NULL; + objp0 = objp, objp = objp->next) { + if (objp->obj == obj) { + if (objp0 == NULL) { + ObjList = objp->next; + } else { + objp0->next = objp->next; + } + XtFree((char *)objp); + return; + } + } +} + +static void +bell(obj) + Sj3Object obj; +{ + XBell(XtDisplayOfObject((Widget)obj), 0); +} diff -r 000000000000 -r 92745d501b9a lib/WcharDisp.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/WcharDisp.c Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,853 @@ +#ifndef lint +static char *rcsid = "$Id: WcharDisp.c,v 1.23 1994/10/27 08:29:05 ishisone Exp $"; +#endif +/* + * Copyright (c) 1990 Software Research Associates, Inc. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Software Research Associates not be + * used in advertising or publicity pertaining to distribution of the + * software without specific, written prior permission. Software Research + * Associates makes no representations about the suitability of this software + * for any purpose. It is provided "as is" without express or implied + * warranty. + * + * Author: Makoto Ishisone, Software Research Associates, Inc., Japan + */ + +#include +#include +#include +#include "CachedAtom.h" +#include "WcharDispP.h" +#include "LocalAlloc.h" + +#define DEBUG_VAR debug_wcharDisplay +#include "DebugPrint.h" + +/* + * R5 servers implicitly changes font properties when an alias name is + * used. The character set properties (CHARSET_REGISTRY and + * CHARSET_ENCODING) are taken from the XLFD fontname. So if the + * fontname is represented in lower-case letters, for example: + * -jis-fixed-medium-r-normal--16-110-100-100-c-160-jisx0208.1983-0 + * (this example is taken from R5 fonts/misc/fonts.alias file) + * then, the value of CHARSET_REGISTRY becomes "jisx0208.1983", + * instead of the registered charset name "JISX0208.1983". + * The following flag forces kinput2 to accept these invalid lower + * case charset names as well. + */ +#define ALLOW_LOWERCASE_CHARSET_NAME + +static FontMapping defaultMapping = { { False, False, False, False } }; + +static XtResource resources[] = { +#define offset(field) XtOffset(WcharDisplayObject, wcharDisplay.field) + { XtNfontG0, XtCFont, XtRFontStruct, sizeof (XFontStruct *), + offset(defaultfonts[0]), XtRString, XtDefaultFont }, + { XtNfontG1, XtCFont, XtRFontStruct, sizeof (XFontStruct *), + offset(defaultfonts[1]), XtRImmediate, (XtPointer)NULL }, + { XtNfontG2, XtCFont, XtRFontStruct, sizeof (XFontStruct *), + offset(defaultfonts[2]), XtRImmediate, (XtPointer)NULL }, + { XtNfontG3, XtCFont, XtRFontStruct, sizeof (XFontStruct *), + offset(defaultfonts[3]), XtRImmediate, (XtPointer)NULL }, + { XtNfontMapping, XtCFontMapping, XtRFontMapping, sizeof (FontMapping), + offset(defaultmapping), XtRFontMapping, (XtPointer)&defaultMapping }, +#undef offset +}; + +static WDCharSet defCharSet[] = { + { "ISO8859-1", G0LCharSet }, + { "JISX0201.1976-0", G0LCharSet }, /* alternative */ +#ifdef ALLOW_LOWERCASE_CHARSET_NAME + { "iso8859-1", G0LCharSet }, + { "jisx0201.1976-0", G0LCharSet }, /* alternative */ +#endif +}; + +static void ClassInitialize(); +static void StringToFontMapping(); + +static void Initialize(); +static void Destroy(); +static Boolean SetValues(); + +static void GetAtoms(); +static void GetGC(); +static void ChangeFont(); + +static int StringWidth(); +static int LineHeight(); +static void DrawString(); +static int MaxChar(); +static void SetFonts(); + +static int countControlChars(); +static void expandControlChars(); +static int charWidth(); + +WcharDisplayClassRec wcharDisplayClassRec = { + { /* object fields */ + /* superclass */ (WidgetClass)&convDisplayClassRec, + /* class_name */ "WcharDisplay", + /* widget_size */ sizeof(WcharDisplayRec), + /* class_initialize */ ClassInitialize, + /* class_part_initialize */ NULL, + /* class_inited */ FALSE, + /* initialize */ Initialize, + /* initialize_hook */ NULL, + /* obj1 */ NULL, + /* obj2 */ NULL, + /* obj3 */ 0, + /* resources */ resources, + /* num_resources */ XtNumber(resources), + /* xrm_class */ NULLQUARK, + /* obj4 */ FALSE, + /* obj5 */ FALSE, + /* obj6 */ FALSE, + /* obj7 */ FALSE, + /* destroy */ Destroy, + /* obj8 */ NULL, + /* obj9 */ NULL, + /* set_values */ SetValues, + /* set_values_hook */ NULL, + /* obj10 */ NULL, + /* get_values_hook */ NULL, + /* obj11 */ NULL, + /* version */ XtVersion, + /* callback_private */ NULL, + /* obj12 */ NULL, + /* obj13 */ NULL, + /* obj14 */ NULL, + /* extension */ NULL + }, + { /* convDisplay fields */ + /* StringWidth */ StringWidth, + /* LineHeight */ LineHeight, + /* DrawString */ DrawString, + /* MaxChar */ MaxChar, + /* DrawCursor */ XtInheritDrawCursor, + /* GetCursorBounds */ XtInheritGetCursorBounds, + /* SetFonts */ SetFonts, + }, + { /* wcharDisplay fields */ + /* charset_specs */ defCharSet, + /* num_specs */ XtNumber(defCharSet), + } +}; + +WidgetClass wcharDisplayObjectClass = (WidgetClass)&wcharDisplayClassRec; + +/* ARGSUSED */ +static void +ClassInitialize() +{ + /* add String -> FontMapping converter */ + XtAddConverter(XtRString, XtRFontMapping, StringToFontMapping, + (XtConvertArgList)NULL, (Cardinal)0); +} + +/* ARGSUSED */ +static void +StringToFontMapping(args, num_args, from, to) +XrmValue *args; +Cardinal *num_args; +XrmValue *from; +XrmValue *to; +{ + char *s = (char *)from->addr; + char buf[128]; + static FontMapping fm; + int c; + int i; + + for (i = 0; i < 4; i++) fm.grmapping[i] = False; + to->size = sizeof(FontMapping); + to->addr = (caddr_t)&fm; + + if (strlen(s) + 1 > sizeof(buf)) return; + + XmuCopyISOLatin1Lowered(buf, s); + s = buf; + for (i = 0; i < 4; i++) { + while ((c = *s) != '\0' && (c == ' ' || c == '\t' || c == '\n')) s++; + if (c == '\0') break; + if (c == '/' || c == ',') { + s++; + continue; + } + if (!strncmp(s, "gl", 2)) { + fm.grmapping[i] = False; + } else if (!strncmp(s, "gr", 2)) { + fm.grmapping[i] = True; + } else { + XtStringConversionWarning(s, XtRFontMapping); + } + s += 2; + while ((c = *s) != '\0' && (c == ' ' || c == '\t' || c == '\n')) s++; + if (c == '\0') break; + if (c == '/' || c == ',') s++; + } +} + +/* ARGSUSED */ +static void +Initialize(req, new, args, num_args) +Widget req; +Widget new; +ArgList args; +Cardinal *num_args; +{ + WcharDisplayObjectClass class = (WcharDisplayObjectClass)XtClass(new); + WcharDisplayObject obj = (WcharDisplayObject)new; + int i; + static char stipple_bits[] = { + 0x55, 0x55, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, + 0xaa, 0xaa, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00, + 0x55, 0x55, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00 + }; + + /* create a Stipple Bitmap (for drawing CurrentSubSegment) */ + obj->wcharDisplay.stipple = + XCreateBitmapFromData(XtDisplayOfObject((Widget)obj), + RootWindowOfScreen(XtScreenOfObject((Widget)obj)), + stipple_bits, 16, 16); + + for (i = 0; i < 4; i++) { + obj->wcharDisplay.fonts[i] = obj->wcharDisplay.defaultfonts[i]; + obj->wcharDisplay.grmapping[i] = + obj->wcharDisplay.defaultmapping.grmapping[i]; + } + + obj->wcharDisplay.num_specs = class->wcharDisplay_class.num_specs; + obj->wcharDisplay.charset_specs = class->wcharDisplay_class.charset_specs; + + GetAtoms(obj); + GetGC(obj); +} + +static void +Destroy(w) +Widget w; +{ + WcharDisplayObject obj = (WcharDisplayObject)w; + + XtFree((char *)obj->wcharDisplay.fontspecs); + XtWSReleaseGCSet(w, obj->wcharDisplay.gcset_normal); + XtWSReleaseGCSet(w, obj->wcharDisplay.gcset_rev); + XFreePixmap(XtDisplayOfObject((Widget)obj), obj->wcharDisplay.stipple); +} + +/* ARGSUSED */ +static Boolean +SetValues(cur, req, wid, args, num_args) +Widget cur; +Widget req; +Widget wid; +ArgList args; +Cardinal *num_args; +{ + WcharDisplayObject old = (WcharDisplayObject)cur; + WcharDisplayObject new = (WcharDisplayObject)wid; + Boolean redraw = False; + int i; + +#define wd wcharDisplay + for (i = 0; i < 4; i++) { + if ((new->wd.defaultfonts[i] != old->wd.defaultfonts[i] || + new->wd.defaultmapping.grmapping[i] != + new->wd.defaultmapping.grmapping[i]) && + new->wd.fonts[i] == old->wd.defaultfonts[i]) { + redraw = True; + break; + } + } + if (redraw || + new->convDisplay.foreground != old->convDisplay.foreground || + new->convDisplay.background != old->convDisplay.background) { + XtWSReleaseGCSet(wid, new->wcharDisplay.gcset_normal); + XtWSReleaseGCSet(wid, new->wcharDisplay.gcset_rev); + GetGC(new); + redraw = True; + } +#undef wd + + return redraw; +} + +static void +GetAtoms(obj) +WcharDisplayObject obj; +{ + Display *dpy = XtDisplayOfObject((Widget)obj); + WDCharSet *csp; + FontSpec *fsp; + Cardinal nspecs; + char buf[128]; + char *p, *q; + int i; + String params[1]; + Cardinal num_params; + + if ((nspecs = obj->wcharDisplay.num_specs) == 0) { + params[0] = XtClass((Widget)obj)->core_class.class_name; + num_params = 1; + XtAppErrorMsg(XtWidgetToApplicationContext((Widget)obj), + "noEntry", "charSpec", "WidgetError", + "%s: has no character set spec.", + params, &num_params); + } + + csp = obj->wcharDisplay.charset_specs; + fsp = (FontSpec *)XtMalloc(sizeof(FontSpec) * obj->wcharDisplay.num_specs); + obj->wcharDisplay.fontspecs = fsp; + + for (i = 0; i < nspecs; i++, csp++, fsp++) { + p = csp->charset; + q = buf; + while (*p != '\0' && *p != '-') *q++ = *p++; + if (*p++ == '\0' || *p == '\0') { + params[0] = XtClass((Widget)obj)->core_class.class_name; + num_params = 1; + XtAppErrorMsg(XtWidgetToApplicationContext((Widget)obj), + "invalidSpec", "charSetSpec", "WidgetError", + "%s: has invalid character set spec.", + params, &num_params); + } + *q = '\0'; + fsp->registry = CachedInternAtom(dpy, buf, False); + fsp->encoding = CachedInternAtom(dpy, p, False); + } +} + +static void +GetGC(obj) +WcharDisplayObject obj; +{ + XtGCMask mask = GCFont|GCForeground|GCBackground; + XGCValues values; + int ascent, descent; + Boolean *map = obj->wcharDisplay.grmapping; + + values.function = GXcopy; + values.foreground = obj->convDisplay.foreground; + values.background = obj->convDisplay.background; + mask = GCFunction|GCForeground|GCBackground; + obj->wcharDisplay.gc_normal = XtGetGC((Widget)obj, mask, &values); + + values.foreground = obj->convDisplay.background; + values.fill_style = FillStippled; + values.stipple = obj->wcharDisplay.stipple; + mask = GCFunction|GCForeground|GCFillStyle|GCStipple; + obj->wcharDisplay.gc_stipple = XtGetGC((Widget)obj, mask, &values); + + mask = GCFont|GCFunction|GCForeground|GCBackground; + values.function = GXcopy; + values.foreground = obj->convDisplay.foreground; + values.background = obj->convDisplay.background; + obj->wcharDisplay.gcset_normal = XtWSGetGCSet((Widget)obj, mask, &values, + obj->wcharDisplay.fonts[0], + obj->wcharDisplay.fonts[1], + obj->wcharDisplay.fonts[2], + obj->wcharDisplay.fonts[3]); + values.foreground = obj->convDisplay.background; + values.background = obj->convDisplay.foreground; + obj->wcharDisplay.gcset_rev = XtWSGetGCSet((Widget)obj, mask, &values, + obj->wcharDisplay.fonts[0], + obj->wcharDisplay.fonts[1], + obj->wcharDisplay.fonts[2], + obj->wcharDisplay.fonts[3]); + + /* set font mapping */ + XWSSetMapping(obj->wcharDisplay.gcset_normal, + map[0], map[1], map[2], map[3]); + XWSSetMapping(obj->wcharDisplay.gcset_rev, + map[0], map[1], map[2], map[3]); + + XWSFontHeight(obj->wcharDisplay.gcset_normal, NULL, 0, &ascent, &descent); + obj->wcharDisplay.ascent = ascent; + obj->wcharDisplay.fontheight = ascent + descent; +} + +static void +ChangeFont(obj, fonts, mapping) +WcharDisplayObject obj; +XFontStruct **fonts; +Boolean *mapping; +{ + Boolean newgc = False; + int i; + + for (i = 0; i < 4; i++) { + if (fonts[i] != obj->wcharDisplay.fonts[i] || + mapping[i] != obj->wcharDisplay.grmapping[i]) { + obj->wcharDisplay.fonts[i] = fonts[i]; + obj->wcharDisplay.grmapping[i] = mapping[i]; + newgc = True; + } + } + if (newgc) { + XtWSReleaseGCSet((Widget)obj, obj->wcharDisplay.gcset_normal); + XtWSReleaseGCSet((Widget)obj, obj->wcharDisplay.gcset_rev); + GetGC(obj); + } +} + +static int +StringWidth(w, seg, start, end) +Widget w; +ICString *seg; +int start; +int end; +{ + WcharDisplayObject obj = (WcharDisplayObject)w; + wchar *wstr; + int len = seg->nchars; + int nctl; + int width; + + if (end < 0 || len < end) end = len; + if (start >= end || start >= len) return 0; + + wstr = (wchar *)seg->data + start; + len = end - start; + + /* + * searching for control characters -- if found, convert them + * into '^?' format for readability. + */ + if ((nctl = countControlChars(wstr, len)) == 0) { + /* no control characters */ + width = XWSTextWidth(obj->wcharDisplay.gcset_normal, wstr, len); + } else { + wchar *s = (wchar *)LOCAL_ALLOC(sizeof(wchar) * (len + nctl)); + + expandControlChars(wstr, len, s); + width = XWSTextWidth(obj->wcharDisplay.gcset_normal, s, len + nctl); + LOCAL_FREE(s); + } + return width; +} + +static int +LineHeight(w, ascentp) +Widget w; +Position *ascentp; +{ + WcharDisplayObject obj = (WcharDisplayObject)w; + + if (ascentp != NULL) *ascentp = obj->wcharDisplay.ascent; + return obj->wcharDisplay.fontheight; +} + +static void +DrawString(w, canvas, seg, start, end, x, y) +Widget w; +Widget canvas; +ICString *seg; +int start; +int end; +int x; +int y; +{ + WcharDisplayObject obj = (WcharDisplayObject)w; + wchar *wstr; + XWSGC gcset; + int len = seg->nchars; + int nctl; + Display *dpy = XtDisplay(canvas); + Window win = XtWindow(canvas); + int width; + int attr; + + if (end < 0 || len < end) end = len; + if (start >= end || start >= len) return; + + wstr = (wchar *)seg->data + start; + len = end - start; + +#define STIPPLED 1 +#define UNDERLINED 2 + + if (seg->attr == ICAttrNormalString) { + gcset = obj->wcharDisplay.gcset_normal; + attr = 0; + } else if (seg->attr & ICAttrConverted) { + /* converted segment */ + if (seg->attr & ICAttrCurrentSegment) { + gcset = obj->wcharDisplay.gcset_rev; + attr = 0; + } else if (seg->attr & ICAttrCurrentSubSegment) { + gcset = obj->wcharDisplay.gcset_rev; + attr = STIPPLED; + } else { + gcset = obj->wcharDisplay.gcset_normal; + attr = 0; + } + } else { /* ICAttrNotConverted */ + gcset = obj->wcharDisplay.gcset_normal; + attr = UNDERLINED; + } + + if ((nctl = countControlChars(wstr, len)) == 0) { + width = XWSDrawImageString(dpy, win, gcset, + x, y + obj->wcharDisplay.ascent, + wstr, len); + } else { + wchar *s = (wchar *)LOCAL_ALLOC((len + nctl) * sizeof(wchar)); + expandControlChars(wstr, len, s); + width = XWSDrawImageString(dpy, win, gcset, + x, y + obj->wcharDisplay.ascent, + s, len + nctl); + LOCAL_FREE(s); + } + + if (attr == UNDERLINED) { + int uloffset = 1; + int descent = obj->wcharDisplay.fontheight - obj->wcharDisplay.ascent; + + if (descent <= 1) { + /* font descent is 0 or 1 */ + uloffset = descent - 1; + } + XDrawLine(dpy, win, obj->wcharDisplay.gc_normal, + x, y + obj->wcharDisplay.ascent + uloffset, + x + width - 1, y + obj->wcharDisplay.ascent + uloffset); + } else if (attr == STIPPLED) { + XFillRectangle(dpy, win, obj->wcharDisplay.gc_stipple, x, y, + (unsigned int)width, + (unsigned int)obj->wcharDisplay.fontheight); + } +} + +static int +MaxChar(w, seg, start, width) +Widget w; +ICString *seg; +int start; +int width; +{ + WcharDisplayObject obj = (WcharDisplayObject)w; + XWSGC gcset = obj->wcharDisplay.gcset_normal; + wchar *sp = (wchar *)seg->data + start; + wchar *ep = (wchar *)seg->data + seg->nchars; + int cwidth; + int chars; + + chars = 0; + while (sp < ep) { + cwidth = charWidth(*sp++, gcset); + if (width < cwidth) break; + chars++; + if ((width -= cwidth) == 0) break; + } + return chars; +} + +static void +SetFonts(w, fonts, num_fonts) +Widget w; +XFontStruct **fonts; +Cardinal num_fonts; +{ + WcharDisplayObject obj = (WcharDisplayObject)w; + WDCharSet *csp = obj->wcharDisplay.charset_specs; + FontSpec *fsp = obj->wcharDisplay.fontspecs; + Cardinal nspecs = obj->wcharDisplay.num_specs; + Cardinal i, j; + XFontStruct *pickedfonts[4]; + Boolean mapping[4]; + static int csetmask[4] = { + G0LCharSet|G0RCharSet, + G1LCharSet|G1RCharSet, + G2LCharSet|G2RCharSet, + G3LCharSet|G3RCharSet, + }; + + if (num_fonts == 0) { + ChangeFont(obj, obj->wcharDisplay.defaultfonts, + obj->wcharDisplay.defaultmapping.grmapping); + return; + } + + for (i = 0; i < 4; i++) pickedfonts[i] = NULL; + + (void)_CDPickupFonts(w, fsp, nspecs, fonts, num_fonts); + +#define GRMAP (G0RCharSet|G1RCharSet|G2RCharSet|G3RCharSet) + for (j = 0; j < nspecs; j++, fsp++, csp++) { + if (fsp->font == NULL) continue; + for (i = 0; i < 4; i++) { + if (pickedfonts[i] == NULL && (csp->flag & csetmask[i])) { + pickedfonts[i] = fsp->font; + mapping[i] = (csp->flag & csetmask[i] & GRMAP) ? True : False; + } + } + } +#undef GRMAP + for (i = 0; i < 4; i++) { + if (pickedfonts[i] == NULL) { + pickedfonts[i] = obj->wcharDisplay.defaultfonts[i]; + mapping[i] = obj->wcharDisplay.defaultmapping.grmapping[i]; + } + } + + ChangeFont(obj, pickedfonts, mapping); +} + +/* countControlChars -- count number of control characters in a string */ +static int +countControlChars(wstr, len) +register wchar *wstr; +int len; +{ + register wchar *end = wstr + len; + register int n = 0; + + while (wstr < end) { + if (*wstr < 0x20 || *wstr == 0x7f) n++; + wstr++; + } + return n; +} + +/* expandControlChars -- convert control characters into '^?' format */ +static void +expandControlChars(org, orglen, res) +wchar *org; +int orglen; +wchar *res; +{ + wchar *end; + + for (end = org + orglen; org < end; org++) { + if (*org < 0x20 || *org == 0x7f) { + *res++ = '^'; + *res++ = *org ^ 0x40; + } else { + *res++ = *org; + } + } +} + +#define WITHIN_RANGE_2D(row, col, fs) \ + ((fs)->min_byte1 <= (row) && (row) <= (fs)->max_byte1 && \ + (fs)->min_char_or_byte2 <= (col) && (col) <= (fs)->max_char_or_byte2) + +#define WITHIN_RANGE(c, fs) \ + ((fs)->min_char_or_byte2 <= (c) && (c) <= (fs)->max_char_or_byte2) + +#define CHAR_INFO_2D(row, col, fs) \ + ((fs)->per_char + ((row) - (fs)->min_byte1) * \ + ((fs)->max_char_or_byte2 - (fs)->min_char_or_byte2 + 1) + \ + ((col) - (fs)->min_char_or_byte2)) + +#define CHAR_INFO(c, fs) \ + ((fs)->per_char + ((c) - (fs)->min_char_or_byte2)) + +#define CHAR_EXIST(csp) \ + ((csp)->width != 0 || ((csp)->rbearing != 0) || ((csp)->lbearing != 0)) + +static int +defaultCharWidth(font) +XFontStruct *font; +{ + int defchar = font->default_char; + + if (font->min_byte1 || font->max_byte1) { + int row = defchar >> 8; + int col = defchar & 0xff; + if (WITHIN_RANGE_2D(row, col, font)) { + if (font->per_char == NULL) { + return font->min_bounds.width; + } else { + XCharStruct *csp = CHAR_INFO_2D(row, col, font); + return CHAR_EXIST(csp) ? csp->width : 0; + } + } else { + return 0; + } + } else { + if (WITHIN_RANGE(defchar, font)) { + if (font->per_char == NULL) { + return font->min_bounds.width; + } else { + XCharStruct *csp = CHAR_INFO(defchar, font); + return CHAR_EXIST(csp) ? csp->width : 0; + } + } else { + return 0; + } + } +} + +/* charWidth -- returns width of the specified character */ +static int +charWidth(c, gcset) +register int c; +XWSGC gcset; +{ + register XFontStruct *font; + int width; + int gset; + int nonPrinting = (c < 0x20 || c == 0x7f); + + if (nonPrinting) c ^= 0x40; + + switch (c & 0x8080) { + case 0x0000: gset = 0; break; + case 0x8080: gset = 1; break; + case 0x0080: gset = 2; break; + case 0x8000: gset = 3; break; + } + + if ((font = gcset->fe[gset].font) == NULL) return 0; + + if (gcset->fe[gset].flag & GRMAPPING) { + c |= 0x8080; + } else { + c &= 0x7f7f; + } + + if (gcset->fe[gset].flag & TWOB) { + register int row = (c >> 8) & 0xff; + register int col = c & 0xff; + if (WITHIN_RANGE_2D(row, col, font)) { + if (font->per_char == NULL) { + width = font->min_bounds.width; + } else { + XCharStruct *csp = CHAR_INFO_2D(row, col, font); + + width = CHAR_EXIST(csp) ? csp->width : defaultCharWidth(font); + } + } else { + width = defaultCharWidth(font); + } + } else { + c &= 0xff; + if (WITHIN_RANGE(c, font)) { + if (font->per_char == NULL) { + width = font->min_bounds.width; + } else { + XCharStruct *csp = CHAR_INFO(c, font); + + width = CHAR_EXIST(csp) ? csp->width : defaultCharWidth(font); + } + } else { + width = defaultCharWidth(font); + } + } + if (nonPrinting) width += charWidth('^', gcset); + + return width; +} + + +/* + * jpWcharDisplay definition + * + * character set assignment for Japanese wchar: + * G0: ascii (ISO8859/1 left-half) + * G1: kanji (JISX0208) + * G2: half-width kana (JISX0201 right-half) + * G3: unused + */ + +static FontMapping jpDefaultMapping = { { False, False, True, False } }; + +#define JPFONT_ASCII "-Misc-Fixed-Medium-R-*--14-*-*-*-C-*-ISO8859-1" +#define JPFONT_KANJI "-Misc-Fixed-Medium-R-*--14-*-*-*-C-*-JISX0208.1983-0" +#define JPFONT_KANA "-Misc-Fixed-Medium-R-*--14-*-*-*-C-*-JISX0201.1976-0" + +static XtResource jpresources[] = { + /* only override superclass's default */ +#define offset(field) XtOffset(JpWcharDisplayObject, wcharDisplay.field) + { XtNfont, XtCFont, XtRFontStruct, sizeof (XFontStruct *), + offset(defaultfonts[0]), XtRString, JPFONT_ASCII }, + { XtNkanjiFont, XtCKanjiFont, XtRFontStruct, sizeof (XFontStruct *), + offset(defaultfonts[1]), XtRString, JPFONT_KANJI }, + { XtNkanaFont, XtCKanaFont, XtRFontStruct, sizeof (XFontStruct *), + offset(defaultfonts[2]), XtRString, JPFONT_KANA }, + { XtNfontG3, "Not.used", XtRFontStruct, sizeof (XFontStruct *), + offset(defaultfonts[3]), XtRImmediate, (XtPointer)NULL }, + { XtNfontMapping, XtCFontMapping, XtRFontMapping, sizeof (FontMapping), + offset(defaultmapping), XtRFontMapping, (XtPointer)&jpDefaultMapping }, +#undef offset +}; + +static WDCharSet jpCharSet[] = { + { "ISO8859-1", G0LCharSet }, /* my preference */ + { "JISX0201.1976-0", G0LCharSet | G2RCharSet }, + { "JISX0208.1990-0", G1LCharSet }, + { "JISX0208.1983-0", G1LCharSet }, + { "JISX0208.1978-0", G1LCharSet }, + { "JISX0208.1983-1", G1RCharSet }, + { "JISX0208.1978-1", G1RCharSet }, +#ifdef ALLOW_LOWERCASE_CHARSET_NAME + { "iso8859-1", G0LCharSet }, /* my preference */ + { "jisx0201.1976-0", G0LCharSet | G2RCharSet }, + { "jisx0208.1990-0", G1LCharSet }, + { "jisx0208.1983-0", G1LCharSet }, + { "jisx0208.1978-0", G1LCharSet }, + { "jisx0208.1983-1", G1RCharSet }, + { "jisx0208.1978-1", G1RCharSet }, +#endif +}; + +JpWcharDisplayClassRec jpWcharDisplayClassRec = { + { /* object fields */ + /* superclass */ (WidgetClass)&wcharDisplayClassRec, + /* class_name */ "JpWcharDisplay", + /* widget_size */ sizeof(JpWcharDisplayRec), + /* class_initialize */ NULL, + /* class_part_initialize */ NULL, + /* class_inited */ FALSE, + /* initialize */ NULL, + /* initialize_hook */ NULL, + /* obj1 */ NULL, + /* obj2 */ NULL, + /* obj3 */ 0, + /* resources */ jpresources, + /* num_resources */ XtNumber(jpresources), + /* xrm_class */ NULLQUARK, + /* obj4 */ FALSE, + /* obj5 */ FALSE, + /* obj6 */ FALSE, + /* obj7 */ FALSE, + /* destroy */ NULL, + /* obj8 */ NULL, + /* obj9 */ NULL, + /* set_values */ NULL, + /* set_values_hook */ NULL, + /* obj10 */ NULL, + /* get_values_hook */ NULL, + /* obj11 */ NULL, + /* version */ XtVersion, + /* callback_private */ NULL, + /* obj12 */ NULL, + /* obj13 */ NULL, + /* obj14 */ NULL, + /* extension */ NULL + }, + { /* convDisplay fields */ + /* StringWidth */ XtInheritStringWidth, + /* LineHeight */ XtInheritLineHeight, + /* DrawString */ XtInheritDrawString, + /* MaxChar */ XtInheritMaxChar, + /* DrawCursor */ XtInheritDrawCursor, + /* GetCursorBounds */ XtInheritGetCursorBounds, + /* SetFonts */ XtInheritSetFonts, + }, + { /* wcharDisplay fields */ + /* charset_specs */ jpCharSet, + /* num_specs */ XtNumber(jpCharSet), + }, + { /* jpWcharDisplay fields */ + /* empty */ 0, + }, +}; + +WidgetClass jpWcharDisplayObjectClass = (WidgetClass)&jpWcharDisplayClassRec; diff -r 000000000000 -r 92745d501b9a lib/Xatoklib/Imakefile --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/Xatoklib/Imakefile Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,22 @@ +#include "../../Kinput2.conf" + + SRCS = \ + aux.c \ + buffer.c \ + compstr.c \ + event.c \ + if.c \ + key.c \ + misc.c \ + segment.c \ + sysline.c + + OBJS = $(SRCS:%.c=%.o) + + INCLUDES = -I../../include -I$(ATOKINCDIR) + + DEFINES = + +NormalLibraryObjectRule() +NormalLibraryTarget(Xatoklib,$(OBJS)) +DependTarget() diff -r 000000000000 -r 92745d501b9a lib/Xatoklib/README --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/Xatoklib/README Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,23 @@ +/* + * Copyright 1999 Justsystem Corporation, Japan. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, + * provided that the above copyright notice appear in all copies and that + * both that copyright notice and this permission notice appear in + * supporting documentation, and that the name of Justsystem Corporation + * not be used in advertising or publicity pertaining to distribution + * of the software without specific, written prior permission. Justsystem + * Corporation makes no representations about the suitability of this + * software for any purpose. It is provided "as is" without express + * or implied warranty. + * + * $B$3$N%G%#%l%/%H%j!<$K$O(B ATOK $B$N%i%$%V%i%j!<$r%"%/%;%9$9$k$?$a$N%3!<%I(B + * $B$*$h$S(B kinput2 $B$N%P%C%U%!$H(B $B%"%/%;%9%i%$%V%i%j!<$N%P%C%U%!$N(B + * $B%G!<%?$NJQ49$r9T$J$&%=!<%9$,B8:_$7$^$9!#(B + * ATOK $B$+$i(B $BLa$C$F$/$k%3!<%I$O!"(BUNICODE$B!"(BSHIFT JIS $B$G$9$,!"(B + * kinput2 $B$K=PNO$9$k$H$-$O!"(B EUC $B$KJQ49$7$F$$$^$9!#(B + * $B2?8D$+$N%=!<%9%U%!%$%k$K$O!"%a%C%;!<%8$,(BEUC$B$G$"$k$3$H$,A0Ds$K(B + * $B$J$C$F$$$^$9$N$G(B $B%3%s%Q%$%k$O$G$-$l$P(B EUC$B$G9T$J$C$F$/$@$5$$!#(B + * + */ diff -r 000000000000 -r 92745d501b9a lib/Xatoklib/aux.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/Xatoklib/aux.c Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,1182 @@ +/* + * Copyright 1999 Justsystem Corporation, Japan. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, + * provided that the above copyright notice appear in all copies and that + * both that copyright notice and this permission notice appear in + * supporting documentation, and that the name of Justsystem Corporation + * not be used in advertising or publicity pertaining to distribution + * of the software without specific, written prior permission. Justsystem + * Corporation makes no representations about the suitability of this + * software for any purpose. It is provided "as is" without express + * or implied warranty. + * + * Author: Atsushi Irisawa + */ +#ifndef lint +static char rcsid[] = "$Id: aux.c,v 1.3 1999/08/24 09:05:25 ishisone Exp $" ; +#endif /* !lint */ + +#include +#include +#include +#include +#include + +#include + + +/* Page */ +/* + * [$B4X?tL>(B] + * wordStartFunc( ) + * [$BI=Bj(B] + * $BC18lEPO?%a%K%e!<$N=i4|2==hM}(B + * [$B8F=P7A<0(B] + * int wordStartFunc( _XatokRecPtr acomm ) + * + * [$B0z?t(B] + * $B7?(B : $BL>(B $B>N(B : I O : $B@b(B $BL@(B + * _XatokRecPtr : acomm : i/o : kinput2$BMQJQ49%P%C%U%!(B + * + * [$BJV$jCM(B] + * 1 : $B>o$K#1(B + * + * [$B;HMQ4X?t(B] + * $B$J$7(B + * [$B5!G=(B] + * $BC18lEPO?%a%K%e!<$rI=<($9$k0Y$K!"%G!<%?$N=i4|2=$r9T$J$&!#(B + */ +int wordStartFunc(acomm) +_XatokRecPtr acomm; +{ + +#ifdef ATOK_DEBUG + printf( "\303\261\270\354\305\320\317\277\263\253\273\317\n"/*=$BC18lEPO?3+;O(B\n=*/ ) ; +#endif /* ATOK_DEBUG */ + bzero( acomm->word_str, sizeof( acomm->word_str )) ; + bzero( acomm->word_yomi, sizeof( acomm->word_yomi )) ; + acomm->word_strLen = 0 ; + acomm->word_yomiLen = 0 ; + acomm->word_mode = W_WORD ; + + return 1 ; +} + +/* Page */ +/* + * [$B4X?tL>(B] + * wordFunc( ) + * [$BI=Bj(B] + * $BC18lEPO?;~$N%$%Y%s%H=hM}(B + * [$B8F=P7A<0(B] + * int wordFunc( _XatokRecPtr acomm, menuAux *mAux, + * WORD *aajcode, int *op ) + * + * [$B0z?t(B] + * $B7?(B : $BL>(B $B>N(B : I/O : $B@b(B $BL@(B + * _XatokRecPtr : acomm : i/o : kinput2$BMQJQ49%P%C%U%!(B + * menuAux : *mAux : i : $B8=:_I=<($7$F$$$k(BMENU + * WORD : *aajcode : i/o : $BF~NO$5$l$?J8;z(B + * int : *op : o : MENU OPERATION + * + * + * [$BJV$jCM(B] + * 0 : key $BF~NO$r%(%s%8%s$KAw$i$J$$!#(B + * 1 : key$BF~NO$r%(%s%8%s$KAw$k!#(B + * + * [$B;HMQ4X?t(B] + * atokModeSet( ) + * atokWordRegister( ) + * atokWordStyleList( ) + * [$B5!G=(B] + * $BC18lEPO?MQ$N(BAUX WINDOW$BI=<(;~$N%$%Y%s%H4IM}$r9T$J$&!#(B + * $BC18lEPO?;~$O!"C18lI=5-F~NO!"FI$_F~NO!"IJ;lA*Br!"=hM}3NG'(B + * $B=hM}7k2LI=<($N%b!<%I$,B8:_$9$k!#(B + * $B3F%b!<%I$K$*$$$F!"F~NO$G$-$kJ8;zBN7O$r@_Dj$9$k!#(B + * CTR$B%-!<$J$I$N@)8f%-!<$NA`:n$b9T$J$&!#(B + */ +int wordFunc(acomm, mAux, aajcode, op) +_XatokRecPtr acomm; +menuAux *mAux; +WORD *aajcode; +int *op; +{ + ATOKDEHINSTR *hptr ; + char euc[BUFSIZ] ; + int i ; + int pgMax = CAND_ROWS * CAND_COLS ; + int status ; + + char *pp ; +#ifdef ATOK_DEBUG +printf( "WORD FUNC OK (%x) word_mode (%d)\n", *aajcode, acomm->word_mode ) ; +printf( "word_strLen %d, word_yomiLen %d\n", + acomm->word_strLen, acomm->word_yomiLen ) ; +#endif /* ATOK_DEBUG */ + if ( *aajcode == CTR_H ) *aajcode = BS ; + + /* + * $BL$3NDjJ8;z$,L5$$;~$K@)8f%-!<$rF~NO$5$l$?>l9g$K$O(B + * $B%*%Z%l!<%7%g%s$rL58z$K$9$k!#(B + */ + if ( !acomm->echoLen && + (( *aajcode & CTRL ) || *aajcode == DEL )) { + return 0 ; + } + /* + * $BC18lEPO?word_mode == W_WORD ) { + if ( *aajcode == CR && acomm->echoLen == 0 ) { + if ( acomm->word_strLen ) { + atokModeSet( acomm, IME_PRV_SETKOTEMODE, 0x0001 ) ; + acomm->word_mode <<= 1 ; + return 0 ; + } + return 0 ; + } + else if ( *aajcode == BS && !acomm->echoLen ) { + if ( acomm->word_strLen ) { + acomm->word_strLen-- ; + } + else { + *op = OP_CANCEL ; + } + return 0 ; + } + + else if ( *aajcode == EESC ) { + if ( !( acomm->convStatus & M_CAND )) { /* 616 */ + *op = OP_CANCEL ; + } + /* + * $BL$3NDjJ8;zNs$,$"$k;~$O!"L$3NDj%P%C%U%!$r%/%j%"$9$k(B + */ + if ( acomm->echoLen ) { + acomm->echoLen = 0 ; + *aajcode = EESC ; + return 1 ; + } + return 0 ; + } + else if ((( *aajcode & CTRL ) && !acomm->echoLen ) + || *aajcode == TAB ){ + return 0 ; + } + return 1 ; + } + /* + * $BFI$_F~NO;~$N(BOP + */ + else if ( acomm->word_mode == W_YOMI ) { + if ( *aajcode == CR && acomm->echoLen == 0 ) { + if ( acomm->word_yomiLen ) { + atokModeSet( acomm, IME_PRV_SETKOTEMODE, 0x0000 ) ; + acomm->word_mode <<= 1 ; + acomm->convStatus |= M_CAND ; + atokWordStyleList( acomm ) ; + *aajcode = XFER ; + return 0 ; + } + return 0 ; + } + else if ( *aajcode == BS && !acomm->echoLen ) { + if ( acomm->word_yomiLen ) { + acomm->word_yomiLen-- ; + } + else { + atokModeSet( acomm, IME_PRV_SETKOTEMODE, 0x0000 ) ; + acomm->word_mode >>= 1 ; + } + return 0 ; + } + else if ((( *aajcode & CTRL ) && !acomm->echoLen ) + || *aajcode == TAB ){ + return 0 ; + } + else if ( *aajcode == EESC ) { + atokModeSet( acomm, IME_PRV_SETKOTEMODE, 0x0000 ) ; + /* acomm->word_mode >>= 1 ; */ + *op = OP_CANCEL ; + return 0 ; + } + return 1 ; + } + /* + * $BIJ;l$rA*BrCf$N(BOP + */ + else if ( acomm->word_mode == W_HINSHI ) { + if ( *aajcode > '0' && *aajcode <= '9' ) { + acomm->kohoPos = *aajcode - '1' ; + *aajcode = CR ; + } + if ( *aajcode == CR ) { + acomm->word_hinshi = acomm->kohoCurPage * pgMax + acomm->kohoPos + 1 ; + acomm->word_mode <<= 1 ; + } + else if ( *aajcode == CTR_G || + *aajcode == EESC ) { + acomm->word_mode >>= 1 ; + } + return 0 ; + } + /* + * $BEPO?3NG'$N%@%$%"%m%0I=<(Cf$N(BOP + */ + else if ( acomm->word_mode == W_YORN ) { + if ( *aajcode == 'y' || *aajcode == 'Y' ) { + acomm->word_str[acomm->word_strLen] = 0x00 ; + acomm->word_str[acomm->word_strLen+1] = 0x00 ; + + acomm->wordStatus = atokWordRegister( + acomm, + acomm->word_str, + acomm->word_strLen, + acomm->word_yomi, + acomm->word_yomiLen, + acomm->word_hinshi ) ; + acomm->word_mode <<= 1 ; + /* *op = OP_CANCEL ; */ + } + else if ( *aajcode == 'n' || *aajcode == 'N' || *aajcode == BS ) { + atokWordStyleList( acomm ) ; + acomm->convStatus |= M_CAND ; + acomm->word_mode >>= 1 ; + *aajcode = XFER ; + } + else if ( *aajcode == EESC ) { + acomm->word_mode = 0 ; + *op = OP_CANCEL ; + } + return 0 ; + } + /* + * $BEPO?7k2LI=<(Cf$N(BOP + */ + else if ( acomm->word_mode == W_RESULT ) { + if ( *aajcode == CR || *aajcode == EESC ) { + acomm->word_mode = 0 ; + *op = OP_CANCEL ; + } + return 0 ; + } + return 0 ; + +#ifdef ATOK_DEBUG + printf( "WORD STR [%s]\n", pp ) ; +#endif /* ATOK_DEBUG */ +} + +/* Page */ +/* + * [$B4X?tL>(B] + * wordEndFunc( ) + * [$BI=Bj(B] + * $BC18lEPO?%a%K%e!<$N8e=hM}(B + * [$B8F=P7A<0(B] + * int wordEndFunc( _XatokRecPtr acomm ) + * + * [$B0z?t(B] + * $B7?(B : $BL>(B $B>N(B : I O : $B@b(B $BL@(B + * _XatokRecPtr : acomm : i/o : kinput2$BMQJQ49%P%C%U%!(B + * + * [$BJV$jCM(B] + * 1 : $B>o$K#1(B + * + * [$B;HMQ4X?t(B] + * $B$J$7(B + * [$B5!G=(B] + * $BC18lEPO?%a%K%e!<$r:o=|$9$k0Y$K!"%G!<%?$N8e=hM}$r9T$J$&!#(B + * + */ +int wordEndFunc(acomm) +_XatokRecPtr acomm; +{ + + /* printf( "wordEndFunc\n" ) ; */ + return 1 ; +} +/* + * Str + * $BC18lEPO?(B : $BC18l(B [XXXXX] $BFI$_(B [XXXX] $BIJ;l(B : + */ +/* Page */ +/* + * [$B4X?tL>(B] + * wordStringFunc( ) + * [$BI=Bj(B] + * $BC18lEPO?%a%K%e!<$NJ8;zNs:n@.(B + * [$B8F=P7A<0(B] + * int wordStringFunc( _XatokRecPtr acomm, menuAux *mAux, + * wchar *echoStr, int *echoLen, int *revLen, + * int *revPos ) + * + * [$B0z?t(B] + * $B7?(B : $BL>(B $B>N(B : I O : $B@b(B $BL@(B + * _XatokRecPtr : acomm : i/o : kinput2$BMQJQ49%P%C%U%!(B + * menuAux : *mAux : i : $B8=:_$N(B MENU CLASS + * wchar : *echoStr: o : $BI=<(J8;zNs3JG$ND9$5(B + * int : *revPos : o : $BI=<(J8;z%F%k$NH?E>$N3+;O0LCV(B + * + * [$BJV$jCM(B] + * $BI=<(J8;zNs$ND9$5(B + * + * [$B;HMQ4X?t(B] + * euc2wcs( ) + * s2e( ) + * [$B5!G=(B] + * $BC18lEPO?%a%K%e!<$rI=<(;~$NI=<(MQ$NJ8;zNs$r:n@.$9$k!#(B + * $BI=5-F~NO;~$O!"I=5-3NDjJ8;zNs$HL$3NDjJ8;zNs!"(B + * $B$h$_F~NO;~$O!"I=5-3NDjJ8;zNs$H!"$h$_3NDjJ8;zNs!"$h$_L$3NDjJ8;zNs(B + * $BIJ;lA*Br;~$O!"FI$_F~NO;~$HF1$8!"(B + * $BEPO?3NG';~$O!"I=5-3NDjJ8;zNs(B,$B$h$_J8;zNs!"IJ;l(B + * $BEPO?40N;;~$O!"%9%F!<%?%9J8;zNs(B + * $B$r:n@.$9$k!#(B + */ +int wordStringFunc(acomm, mAux, echoStr, echoLen, revLen, revPos) +_XatokRecPtr acomm; +menuAux *mAux; +wchar *echoStr; +int *echoLen; +int *revLen; +int *revPos; +{ + char tbuf[BUFSIZ*2] ; + int len ; + int n ; + int i, j, k, es ; + char *ep ; + int status ; + int c ; + + *revPos = 0 ; + *revLen = 0 ; + + ep = tbuf ; + if ( mAux->str ) { + strcpy( ep, mAux->str ) ; + ep += strlen( ep ) ; + } +#ifdef ATOK_DEBUG +printf( "WORD MODE %d\n", acomm->word_mode ); + printf( " \303\261\270\354 [%s"/*= $BC18l(B [%s=*/, acomm->word_str ) ; +printf( "\303\261\270\354\263\316\304\352\272\321\312\270\273\372\316\363(%d) [%s]\n"/*=$BC18l3NDj:QJ8;zNs(B(%d) [%s]\n=*/, acomm->word_strLen, acomm->word_str ) ; +printf( "\303\261\270\354 \263\316\304\352\244\267\244\277\312\270\273\372\316\363(%d) [%s]\n"/*=$BC18l(B $B3NDj$7$?J8;zNs(B(%d) [%s]\n=*/, acomm->wlen, acomm->wbuf ) ; +printf( "\303\261\270\354 \314\244\263\316\304\352\312\270\273\372\316\363[%s]\n"/*=$BC18l(B $BL$3NDjJ8;zNs(B[%s]\n=*/, acomm->echoStr ) ; +for( i = 0 ; i < acomm->echoLen ; i++ ) { + printf( "%x ", acomm->echoStr[i] ) ; +} +printf( "\n" ); +#endif /* ATOK_DEBUG */ + + + /* + * $BC18lEPO?$N%,%$%I$r@_Dj(B + */ + sprintf( ep, " \303\261\270\354 ["/*= $BC18l(B [=*/ ) ; + es = strlen( tbuf ) ; + len = euc2wcs( tbuf, es, echoStr ) ; + for( i = 0 ; i < acomm->word_strLen ; i++ ) { + echoStr[len++] = acomm->word_str[i] ; + } + /* + * $BC18lF~NOCf$NI=<((B + */ + if ( acomm->word_mode == W_WORD ) { + /* + * $B:#2s$NF~NO$G3NDj$7$?J8;zNs$,$"$k>l9g$K$O!"(B + * $B3NDjC18lJ8;zNs$H$7$F@_Dj$9$k!#(B + */ + for( i = 0 ; i < acomm->wlen ; i++ ) { + if ( acomm->word_strLen+i >= WORD_HYOKI_MAX ) { + /* printf( "$BC18l$,$J$,$9$.$k!#(B(%d)\n", i ) ; */ + break ; + } + acomm->word_str[acomm->word_strLen+i] = acomm->wbuf[i] ; + echoStr[len++] = acomm->word_str[acomm->word_strLen+i] ; +/* printf( "0x%x ", acomm->wbuf[i] ) ; */ + } +/* printf( "\n" ) ; */ + acomm->word_strLen += i ; + acomm->word_str[acomm->word_strLen] = 0x00 ; + /* + * $BL$3NDjJ8;zNs$r@_Dj(B + */ + if ( acomm->echoLen > 0 ) { + *revPos = len + acomm->revPos ; + *revLen = acomm->revLen ; + for( i = 0 ; i < acomm->echoLen ; i++ ) { + echoStr[len++] = acomm->echoStr[i] ; + } + } + else { + *revPos = len ; + *revLen = 1 ; + } + } + n = euc2wcs( "]", 1, &echoStr[len] ) ; + len += n ; + *echoLen = len ; + if ( acomm->word_mode < W_YOMI ) { + return ; + } + sprintf( tbuf, " \306\311\244\337 ["/*= $BFI$_(B [=*/ ) ; + es = strlen( tbuf ) ; + n = euc2wcs( tbuf, es, &echoStr[len] ) ; + len += n ; + + /* + * $B$h$_$N$J$,$5$O(B $B4A;z$H(BANK$B$G$O(B $BF1$8$G$"$k!#(B + */ + for( i = 0 ; i < acomm->word_yomiLen ; i++ ) { + echoStr[len++] = acomm->word_yomi[i] ; + } + if ( acomm->word_mode == W_YOMI ) { + /* + * $B:#2s$NF~NO$G3NDj$7$?J8;zNs$,$"$k>l9g$K$O!"(B + * $B3NDjC18lJ8;zNs$H$7$F@_Dj$9$k!#(B + */ + for( i = 0 ; i < acomm->wlen ; i++ ) { + if ( acomm->word_yomiLen+i >= WORD_YOMI_MAX ) { + /* printf( "$B$h$_$,$J$,$9$.$k!#(B(%d)\n", i ) ; */ + break ; + } + acomm->word_yomi[acomm->word_yomiLen+i] = acomm->wbuf[i] ; + echoStr[len++] = acomm->word_yomi[acomm->word_yomiLen+i] ; + } + acomm->word_yomiLen += i ; + /* + * $BL$3NDjJ8;zNs$r@_Dj(B + */ + if ( acomm->echoLen > 0 ) { + *revPos = len + acomm->revPos ; + *revLen = acomm->revLen ; + for( i = 0 ; i < acomm->echoLen ; i++ ) { + echoStr[len++] = acomm->echoStr[i] ; + } + } + else { + *revPos = len ; + *revLen = 1 ; + } + } + + n = euc2wcs( "]", 1, &echoStr[len] ) ; + len += n ; + + *echoLen = len ; + if ( acomm->word_mode < W_HINSHI ) { + return len ; + } + if ( acomm->word_mode > W_HINSHI ) { + sprintf( tbuf, " \311\312\273\354 ["/*= $BIJ;l(B [=*/ ) ; + es = strlen( tbuf ) ; + n = euc2wcs( tbuf, es, &echoStr[len] ) ; + len += n ; + + s2e( acomm->hinsiPtr[acomm->word_hinshi-1].szHinsiStr, + strlen( acomm->hinsiPtr[acomm->word_hinshi-1].szHinsiStr ), + tbuf, sizeof( tbuf )) ; + + es = strlen( tbuf ) ; + n = euc2wcs( tbuf, es, &echoStr[len] ) ; + len += n ; + + sprintf( tbuf, "] \244\350\244\355\244\267\244\244\244\307\244\271\244\253 [y/n]"/*=] $B$h$m$7$$$G$9$+(B [y/n]=*/, tbuf ) ; + es = strlen( tbuf ) ; + n = euc2wcs( tbuf, es, &echoStr[len] ) ; + len += n ; + + *revPos = len - 1 ; + *revLen = 1 ; + } + if ( acomm->word_mode == W_RESULT ) { + switch( acomm->wordStatus ) { + case 0 : + sprintf( tbuf, "\305\320\317\277\275\252\316\273\244\267\244\336\244\267\244\277\241\243"/*=$BEPO?=*N;$7$^$7$?!#(B=*/ ) ; + break ; + case 1 : + sprintf( tbuf, "\244\263\244\316\306\311\244\337\244\307\244\317\244\263\244\354\260\312\276\345\305\320\317\277\244\307\244\255\244\336\244\273\244\363\241\243"/*=$B$3$NFI$_$G$O$3$l0J>eEPO?$G$-$^$;$s!#(B=*/ ) ; + break ; + case 2 : + sprintf( tbuf, "\244\263\244\354\260\312\276\345\305\320\317\277\244\307\244\255\244\336\244\273\244\363\241\243"/*=$B$3$l0J>eEPO?$G$-$^$;$s!#(B=*/ ) ; + break ; + case 3 : + sprintf( tbuf, "\274\255\275\361\300\337\304\352\244\254\311\324\305\254\300\332\244\307\244\271\241\243"/*=$B<-=q@_Dj$,ITE,@Z$G$9!#(B=*/ ) ; + break ; + case 4 : + sprintf( tbuf, "\303\261\270\354\244\313\311\324\305\254\300\332\244\312\312\270\273\372\244\254\264\336\244\336\244\354\244\306\244\244\244\336\244\271\241\243"/*=$BC18l$KITE,@Z$JJ8;z$,4^$^$l$F$$$^$9!#(B=*/ ) ; + break ; + case 5 : + sprintf( tbuf, "\305\320\317\277\244\307\244\255\244\336\244\273\244\363\241\243"/*=$BEPO?$G$-$^$;$s!#(B=*/ ) ; + break ; + case 6 : + sprintf( tbuf, "\306\311\244\337\244\313\311\324\305\254\300\332\244\312\312\270\273\372\244\254\264\336\244\336\244\354\244\306\244\244\244\336\244\271\241\243"/*=$BFI$_$KITE,@Z$JJ8;z$,4^$^$l$F$$$^$9!#(B=*/ ) ; + break ; + case 7 : + sprintf( tbuf, "\264\373\244\313\305\320\317\277\244\265\244\354\244\306\244\244\244\336\244\271\241\243"/*=$B4{$KEPO?$5$l$F$$$^$9!#(B=*/ ) ; + break ; + default: + sprintf( tbuf, "\303\261\270\354\305\320\317\277\244\313\274\272\307\324\244\267\244\336\244\267\244\277\241\243"/*=$BC18lEPO?$K<:GT$7$^$7$?!#(B=*/ ) ; + break; + } + strcat( tbuf, " " ) ; + es = strlen( tbuf ) ; + n = euc2wcs( tbuf, es, echoStr ) ; + len = n ; + *revPos = len - 1 ; + *revLen = 1 ; + } + *echoLen = len ; + +#ifdef ATOK_DEBUG +printf( "\303\261\270\354 EUC STR [%s]\n"/*=$BC18l(B EUC STR [%s]\n=*/, tbuf ) ; +#endif /* ATOK_DEBUG */ + return len ; +} + + +#define OFF 0 +#define ON 1 +#define itemSize( item ) sizeof( item ) / sizeof( item[0] ) + +/* + * $BC18lEPO?(B + */ +menuItem auxWordRegItem[] = { + { CTR_G, OFF, OP_CANCEL, NULL, NULL, NULL } +} ; +menuAux auxWordRegMenu[] = { + M_WORD, -1, + wordStartFunc, + wordFunc, + NULL, + wordStringFunc, + "\303\261\270\354\305\320\317\277\241\247"/*=$BC18lEPO?!'(B=*/, NULL, + auxWordRegItem, itemSize( auxWordRegItem ) +} ; + +#define REVERSE printf( "\033[7m" ) +#define NORMAL printf( "\033[m" ) + +menuAux *getMenuInstance( ) +{ + return auxWordRegMenu ; +} + +/* Page */ +/* + * [$B4X?tL>(B] + * menuPrevOn( ) + * [$BI=Bj(B] + * $B%a%K%e!<9`L\$N0\F0(B + * [$B8F=P7A<0(B] + * int menuPrevOn( int cur, int mode, menuAux *mAux ) + * + * [$B0z?t(B] + * $B7?(B : $BL>(B $B>N(B : I O : $B@b(B $BL@(B + * int : cur : i : $B8=:_$N9`L\(B + * int : mode : i : $B0\F0%b!<%I(B + * menuAux : *mAux : i : $B8=:_$N%a%K%e!<%G!<%?(B + * + * [$BJV$jCM(B] + * $B0\F08e$N9`L\HV9f(B + * + * [$B;HMQ4X?t(B] + * $B$J$7(B + * [$B5!G=(B] + * mode $B$,#0$N;~$O!"8=:_A*Br$5$l$F$$$k9`L\$h$j#1$DA0$N(B + * $BA*Br2DG=$J9`L\$rC5$9!#(B + * mode $B$,#1$N;~$O!"8=:_$N%a%K%e!<$G#1HV8e$m$NA*Br2DG=$J(B + * $B9`L\$rC5$9!#(B + * $BA*Br2DG=$J9`L\$H$O(Bitem $B$N(B mode $B$,(BON$B$N;~$G$"$k!#(B + */ +int menuPrevOn(cur, mode, mAux) +int cur; +int mode; +menuAux *mAux; +{ + register menuItem *item ; + int last = -1 ; + int target = -1 ; + int i ; + + item = &( mAux->items[mAux->nitems-1] ) ; + for( i = mAux->nitems - 1 ; i >= 0 ; i-- ) { +#ifdef ATOK_DEBUG + printf( "item->mode = (%s) %s\n", + item->itemStr ? item->itemStr : "NULL", + item->mode == ON ? "ON" : "OFF" ) ; +#endif /* ATOK_DEBUG */ + if ( item->mode == ON ) { + if ( last == -1 ) { + last = i ; + if ( mode ) { + /* printf( "LAST FOUND %d\n", last ); */ + return last ; + } + } + if ( target == -1 && i < cur ) { + target = i ; + } + } + item-- ; + } + if ( target == -1 ) { + target = last ; + } + + return target ; +} + +/* Page */ +/* + * [$B4X?tL>(B] + * menuNextOn( ) + * [$BI=Bj(B] + * $B%a%K%e!<9`L\$N0\F0(B + * [$B8F=P7A<0(B] + * int menuNextOn( int cur, int mode, menuAux *mAux ) + * + * [$B0z?t(B] + * $B7?(B : $BL>(B $B>N(B : I O : $B@b(B $BL@(B + * int : cur : i : $B8=:_$N9`L\(B + * int : mode : i : $B0\F0%b!<%I(B + * menuAux : *mAux : i : $B8=:_$N%a%K%e!<%G!<%?(B + * + * [$BJV$jCM(B] + * $B0\F08e$N9`L\HV9f(B + * + * [$B;HMQ4X?t(B] + * $B$J$7(B + * [$B5!G=(B] + * mode $B$,#0$N;~$O!"8=:_A*Br$5$l$F$$$k9`L\$h$j#1$D8e$m$N(B + * $BA*Br2DG=$J9`L\$rC5$9!#(B + * mode $B$,#1$N;~$O!"8=:_$N%a%K%e!<$G@hF,$NA*Br2DG=$J(B + * $B9`L\$rC5$9!#(B + * $BA*Br2DG=$J9`L\$H$O(Bitem $B$N(B mode $B$,(BON$B$N;~$G$"$k!#(B + */ +int menuNextOn(cur, mode, mAux) +int cur; +int mode; +menuAux *mAux; +{ + register menuItem *item ; + int first = -1 ; + int target = -1 ; + int i ; + + item = mAux->items ; + for( i = 0 ; i < mAux->nitems ; i++ ) { + if ( item->mode == ON ) { + if ( first == -1 ) { + first = i ; + if ( mode ) { + return first ; + } + } + if ( target == -1 && i > cur ) { + target = i ; + } + } + item++ ; + } + if ( target == -1 ) { + target = first ; + } + + return target ; +} + +/* Page */ +/* + * [$B4X?tL>(B] + * menuKey( ) + * [$BI=Bj(B] + * $B%a%K%e!(B $B>N(B : I O : $B@b(B $BL@(B + * menuAux : *mAux : i : $B8=:_$N%a%K%e!<%G!<%?(B + * WORD : key : i : $BF~NO$5$l$?%-!<(B + * int : *cur : o : $BA*Br$5$l$?9`L\(B + * + * [$BJV$jCM(B] + * 0 : $B9`L\$OA*Br$5$l$F$$$J$$!#(B + * $B$=$NB>(B: $BA*Br$5$l$?9`L\$N%"%I%l%9(B + * + * [$B;HMQ4X?t(B] + * $B$J$7(B + * [$B5!G=(B] + * $B;XDj$5$l$?%-!<$,!"(B $B8=:_I=<($7$F$$$k%a%K%e!<$h$j!"(B + * $B9`L\$rA*Br$9$k$?$a$NM-8z%-!<$+%A%'%C%/$7!"(B + * $BM-8z%-!l9g$K$O!"9`L\$,A*Br$5$l$?J*$H$7!"(B + * $B$=$N9`L\HV9f$r@_Dj$7!"9`L\$N%"%I%l%9$rJV$9!#(B + */ +menuItem *menuKey(mAux, key, cur) +menuAux *mAux; +WORD key; +int *cur; +{ + register menuItem *item ; + register int i ; + + *cur = 0 ; + item = mAux->items ; + for ( i = 0 ; i < mAux->nitems ; i++ ) { + /* + printf( "Check Keys for '%s'\n", + item->itemStr ? item->itemStr : "NULL" ) ; + */ + if ( item->key == key ) { + /* printf( "found\n" ) ; */ + *cur = i ; + return item ; + } + item++ ; + } + /* printf( "not found\n" ) ; */ + return ( menuItem * )NULL ; +} + +/* Page */ +/* + * [$B4X?tL>(B] + * MenuCtrl( ) + * [$BI=Bj(B] + * $B%a%K%e!(B $B>N(B : I O : $B@b(B $BL@(B + * _XatokRecPtr : acomm : i/o : kinput2$BMQJQ49%P%C%U%!(B + * menuAux : **curMenu : i/o : $B8=:_$N%a%K%e!<%G!<%?(B + * WORD : *aajcode : i/o : $BF~NO$5$l$?(BAAJCODE + * int : op : i : $B3+;O%U%!%s%/%7%g%s$N8F$S=P$7(B + * int : *length : o : $BF~NOJ8;zNs$ND9$5(B + * + * [$BJV$jCM(B] + * 0 : $B%a%K%e!<$NJQ99L5$7(B + * 1 : $B%a%K%e!<=hM}%-%c%s%;%k(B + * 2 : $B%a%K%e!startProc( ) + * menuAux->defaultProc( ) + * menuAux->endProc( ) + * menuNextOn( ) + * menuPrevOn( ) + * [$B5!G=(B] + * AUX$B%&%#%s%I%&$K%a%K%e!<$,I=<($5$l$F$$$k;~$N(B + * $B%$%Y%s%H4IM}$r9T$J$&!#(B + * $B%$%Y%s%H$K$h$j!"I=<($7$F$$$k%a%K%e!<%G!<%?$N(B + * $B@ZBX$($d!"(BAUX$B%&%#%s%I%&$N=*N;$r9T$J$&!#(B + */ +int MenuCtrl(acomm, curMenu, aajcode, op, length) +_XatokRecPtr acomm; +menuAux **curMenu; +WORD *aajcode; +int op; +int *length; +{ + + menuItem *target ; + menuItem sel ; + int newNbr ; + int changes =-1 ; + int cur ; + + *length = 0 ; + if ( op ) { /* Start Proc */ + if (( *curMenu )->startProc ) { + ( *curMenu )->startProc( acomm ) ; + } + return ; + } + + target = menuKey( *curMenu, *aajcode, &newNbr ) ; + /* + * $B>e0L$G(BDEFAULT PROC$B$rdefaultProc ) { + sel.op = 0 ; + *length = ( *curMenu )->defaultProc( acomm, *curMenu, aajcode, &sel.op ) ; + if ( sel.op ) { + target = &sel ; + goto menu_op ; + } +#ifdef ATOK_DEBUG + printf( "\274\302\271\324\n"/*=$Bop ) { + case OP_NEXT : + ( *curMenu )->cur = menuNextOn(( *curMenu )->cur, 0, *curMenu ) ; + changes = 0 ; + break ; + case OP_FIRST : + ( *curMenu )->cur = menuNextOn(( *curMenu )->cur, 1, *curMenu ) ; + changes = 0 ; + break ; + case OP_PREV : + ( *curMenu )->cur = menuPrevOn(( *curMenu )->cur, 0, *curMenu ) ; + changes = 0 ; + break ; + case OP_LAST : + ( *curMenu )->cur = menuPrevOn(( *curMenu )->cur, 1, *curMenu ) ; + changes = 0 ; + break ; + case OP_SPEC : + /* + * $B;XDj$7$?HV9f(B + */ + ( *curMenu )->cur = newNbr ; + changes = 0 ; + break ; + case OP_CANCEL : + /* + * $B%-%c%s%;%k$,2!$5$l$?$N$G>e0L%a%K%e!<$X(B + */ + if (( *curMenu )->endProc ) { + ( *curMenu )->endProc( acomm ) ; + } + *curMenu = ( *curMenu )->parent ; + if ( *curMenu ) { + if (( *curMenu )->startProc ) { + ( *curMenu )->startProc( acomm ) ; + } + } + changes = 1 ; + break ; + case OP_SELECT : + /* + * $B7hDj%-!<$,2!$5$l$?$N$G=hM}cur ; + if (( *curMenu )->items[cur].child ) { + ( *curMenu )->items[cur].child->parent = ( *curMenu ) ; + *curMenu = ( *curMenu )->items[cur].child ; + if (( *curMenu )->startProc ) { + ( *curMenu )->startProc( acomm, *aajcode ) ; + } + } + changes = 2 ; + break ; + default : + changes = 0 ; + break ; + } + + return changes ; +} + + +/* Page */ +/* + * [$B4X?tL>(B] + * auxMenuCopy( ) + * [$BI=Bj(B] + * $B%a%K%e!<%G!<%?$N%3%T!<(B + * [$B8F=P7A<0(B] + * menuAux *auxMenuCopy( menuAux *orgAux ) + * + * [$B0z?t(B] + * $B7?(B : $BL>(B $B>N(B : I O : $B@b(B $BL@(B + * menuAux : *orgAux : i : $B%3%T!<85%a%K%e!<%G!<%?(B + * + * [$BJV$jCM(B] + * $B%3%T!<$7$?%a%K%e!<%G!<%?(B + * + * [$B;HMQ4X?t(B] + * auxMenuCopy( ) + * [$B5!G=(B] + * $B;XDj$5$l$?%a%K%e!<%G!<%?$r?75,%P%C%U%!$K%3%T!<$7$F(B + * $B$=$N%"%I%l%9$rJV$9!#(B + */ +menuAux *auxMenuCopy(orgAux) +menuAux *orgAux; +{ + menuItem *item ; + int nitem ; + int i ; + menuAux *newAux ; + + newAux = ( menuAux * )malloc( sizeof( menuAux )) ; + if ( !newAux ) return 0 ; + + memcpy(( char * )newAux, ( char * )orgAux, sizeof( menuAux )) ; + + item = ( menuItem * )malloc( sizeof( menuItem ) * orgAux->nitems ) ; + newAux->items = item ; + for( i = 0 ; i < orgAux->nitems ; i++ ) { + memcpy(( char * )item, ( char * )&orgAux->items[i], + sizeof( menuItem )) ; + if ( item->child ) { + item->child = auxMenuCopy( item->child ) ; + } + item++ ; + } + return newAux ; +} + +/* Page */ +/* + * [$B4X?tL>(B] + * auxMenuString( ) + * [$BI=Bj(B] + * $B%a%K%e!(B $B>N(B : I O : $B@b(B $BL@(B + * _XatokRecPtr : acomm : i/o : kinput2$BMQJQ49%P%C%U%!(B + * menuAux : *mAux : i : $B8=:_$N(B MENU CLASS + * wchar : *echoStr: o : $BI=<(J8;zNs3JGstringProc( ) + * euc2wcs( ) + * [$B5!G=(B] + * $B%a%K%e!<$KI=<($9$k$?$a$NJ8;zNs$r:n@.$9$k!#(B + * $B8=:_I=<($7$F$$$k%a%K%e!<$KJ8;zNs$r:n@.$9$k$?$a$N(B + * $B4X?t(B(menuAux->stirngProc)$B$,;XDj$5$l$F$$$k>l9g$K$O!"(B + * $B$=$N4X?t$r8F$S=P$7$F!"J8;zNs$r:n@.$9$k!#(B + */ +int auxMenuString(acomm, mAux, echoStr, echoLen, revLen, revPos) +_XatokRecPtr acomm; +menuAux *mAux; +wchar *echoStr; +int *echoLen; +int *revLen; +int *revPos; +{ + register menuItem *item ; + char tbuf[BUFSIZ*2] ; + int len ; + int i, es ; + char *ep ; + int status ; + + item = mAux->items ; + + *revPos = 0 ; + *revLen = 0 ; + len = 0 ; + bzero( tbuf, sizeof( tbuf )) ; + +#ifdef ATOK_DEBUG +printf( "AUX ADDR (STR) 0x%x\n", mAux ) ; +#endif /* ATOK_DEBUG */ + if ( mAux->stringProc ) { +#ifdef ATOK_DEBUG + printf( "STRING PROC\n" ) ; +#endif /* ATOK_DEBUG */ + len = ( mAux->stringProc )( acomm, mAux, + echoStr, echoLen, revLen, revPos ) ; + return len ; + } + ep = tbuf ; + if ( mAux->str ) { + strcpy( ep, mAux->str ) ; + ep += strlen( ep ) ; + } + +#ifdef ATOK_DEBUG + printf( "auxMenuString START(%d)\n", mAux->nitems ) ; +#endif /* ATOK_DEBUG */ + + for( i = 0 ; i < mAux->nitems ; i++ ) { + +#ifdef ATOK_DEBUG + printf( "ITEMS %s\n", item->itemStr ? item->itemStr : "NULL" ) ; +#endif /* ATOK_DEBUG */ + if ( item->mode == ON ) { + if ( mAux->cur == i ) { + es = strlen( tbuf ) ; + *revPos = euc2wcs( tbuf, es, echoStr ) ; +#ifdef ATOK_DEBUG + printf( "SET ECHO POS %d\n", *revPos ) ; +#endif /* ATOK_DEBUG */ + + len += *revPos ; + es = strlen( item->numStr ) ; + + *revLen = euc2wcs( item->numStr, es, + &echoStr[*revPos] ) ; + len += *revLen ; +#ifdef ATOK_DEBUG + printf( "SET ECHO LEN %d\n", *revLen ) ; +#endif /* ATOK_DEBUG */ + ep = tbuf ; + sprintf( ep, " %s", item->itemStr ) ; + ep += strlen( ep ) ; + + REVERSE ; + printf( "%s", item->numStr ) ; + NORMAL ; + printf( " %s", item->itemStr ) ; + } + else { + sprintf( ep, "%s %s", item->numStr, item->itemStr ) ; + ep += strlen( ep ) ; + +#ifdef ATOK_DEBUG + printf( "%s", item->numStr ) ; + printf( " %s", item->itemStr ) ; +#endif /* ATOK_DEBUG */ + } + sprintf( ep, " " ) ; + ep += strlen( ep ) ; + } + item++ ; + } + + if (( es = strlen( tbuf ))) { + es = euc2wcs( tbuf, es, &echoStr[*revPos + *revLen] ) ; +#ifdef ATOK_DEBUG + printf( "STR [%s] set +len = %d\n", tbuf, es ) ; +#endif /* ATOK_DEBUG */ + len += es ; + } + *echoLen = len ; +#ifdef ATOK_DEBUG + printf( "len = %d, echoLen = %d\n", len, *echoLen ) ; +#endif /* ATOK_DEBUG */ + return len ; +} + +/* + * $B$3$3$+$i2<$O(BDEBUG$BMQ(B + */ + +menuPrint(mAux) +menuAux *mAux; +{ + int i ; + register menuItem *item ; + + item = mAux->items ; + if ( mAux->str ) { + printf( "%s", mAux->str ) ; + } + for( i = 0 ; i < mAux->nitems ; i++ ) { + if ( item->mode == ON ) { + if ( mAux->cur == i ) { + REVERSE ; + printf( "%s", item->numStr ) ; + NORMAL ; + printf( " %s", item->itemStr ) ; + } + else { + printf( "%s", item->numStr ) ; + printf( " %s", item->itemStr ) ; + } + printf( " " ) ; + } + item++ ; + } + printf( "\n" ) ; +} + +#ifdef STAND +void +main (argc, argv) +int argc; +char **argv; +{ + + char buf[BUFSIZ] ; + menuAux *topMenu ; + menuAux *cur ; + + int status ; + int key ; + + topMenu = auxTopMenu ; + cur = topMenu ; + + while( 1 ) { + menuPrint( cur ) ; + printf( "enter command => " ) ; + gets( buf ) ; + key = buf[0] ; + status = MenuCtrl( &cur, key ) ; + if ( status == 1 ) { + if ( !cur ) { + printf( "Program terminated\n" ) ; + exit( 0 ) ; + } + } + else if ( status == 2 ) { + printf( "go to Chiled\n" ) ; + } + else if ( status != 0 ) { + switch( cur->mode ) { + case M_AUX : + printf( "TOP MENU FUNC\n" ) ; + break ; + case M_CODE : + printf( "CODE MENU FUNC\n" ) ; + break ; + case M_CODESJ : + printf( "SJ FUNC\n" ) ; + break ; + case M_CODEEUC : + printf( "EUC FUNC\n" ) ; + break ; + case M_CODEJIS : + printf( "JIS FUNC\n" ) ; + break ; + case M_CODEKUTEN : + printf( "KUTEN FUNC\n" ) ; + break ; + case M_KIGOU : + printf( "KIGOU FUNC\n" ) ; + break ; + default: + printf( "UNKNOWN\n" ) ; + break ; + } + } + } +} + +#endif STAND diff -r 000000000000 -r 92745d501b9a lib/Xatoklib/buffer.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/Xatoklib/buffer.c Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,337 @@ +/* + * Copyright 1999 Justsystem Corporation, Japan. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, + * provided that the above copyright notice appear in all copies and that + * both that copyright notice and this permission notice appear in + * supporting documentation, and that the name of Justsystem Corporation + * not be used in advertising or publicity pertaining to distribution + * of the software without specific, written prior permission. Justsystem + * Corporation makes no representations about the suitability of this + * software for any purpose. It is provided "as is" without express + * or implied warranty. + * + * Author: Atsushi Irisawa + */ + +#ifndef lint +static char rcsid[] = "$Id: buffer.c,v 1.3 1999/08/24 09:05:26 ishisone Exp $" ; +#endif /* !lint */ + +#include +#include +#include +#include +#include + + +#include + + +/* Page */ +/* + * [$B4X?tL>(B] + * XatokClearBuffer( ) + * [$BI=Bj(B] + * kinput2$BMQJQ49%P%C%U%!$K%/%j%"(B + * [$B8F=P7A<0(B] + * int XatokClearBuffer( _XatokRecPtr acomm ) + * + * [$B0z?t(B] + * $B7?(B : $BL>(B $B>N(B : I O : $B@b(B $BL@(B + * _XatokRecPtr : acomm : i/o : kinput2$BMQJQ49%P%C%U%!(B + * + * [$BJV$jCM(B] + * $B$J$7(B + * + * [$B;HMQ4X?t(B] + * $B$J$7(B + * [$B5!G=(B] + * $B3NJ]$5$l$?(B kinput2$BMQJQ49%P%C%U%!$r%/%j%"$9$k!#(B + */ +void XatokClearBuffer(abuf) +_XatokRecPtr abuf; +{ + int i, n ; + + for( i = 0 ; i < abuf->nbr_of_seg ; i++ ) { + /* XatokFreeSegement( abuf->segments[i] ) ; */ + } + abuf->cur_seg = 0 ; + abuf->nbr_of_seg = 0 ; + +} + +/* Page */ +/* + * [$B4X?tL>(B] + * XatokBufferConvert( ) + * [$BI=Bj(B] + * $B%(%s%8%sJQ497k2L%G!<%?$N%3%s%P!<%H(B + * [$B8F=P7A<0(B] + * int XatokBufferConvert( _XatokRecPtr acomm, + * WORD ceCmd, AtokRsltPacket *result, int *status, + * int *enable, int *change, int *elseEvent ) + * [$B0z?t(B] + * $B7?(B : $BL>(B $B>N(B : I O : $B@b(B $BL@(B + * _XatokRecPtr : acomm : i/o : kinput2$BMQJQ49%P%C%U%!(B + * WORD ceCmd, + * AtokRsltPacket *result, + * int *status, + * int *enable, + * int *change, + * int *elseEvent + * + * + * [$BJV$jCM(B] + * $B3NDjJ8;zNs$ND9$5(B + * [$B;HMQ4X?t(B] + * ucs2euc( ) + * es = euc2wcs( ) + * s2e( ) + * XatokCompStr( ) + * + * [$B5!G=(B] + * ATOK12X $B$X$N(BREQUEST$B$h$j(B $BLa$C$FMh$?%G!<%?$r%A%'%C%/$7!"(B + * kinput2 $B$N(B ATOK CLASS$B$G;HMQ$G$-$k%G!<%?7A<0$KJQ49$9$k!#(B + * + */ +int XatokBufferConvert(acomm, ceCmd, result, status, enable, change, elseEvent) +_XatokRecPtr acomm; +WORD ceCmd; +AtokRsltPacket *result; +int *status; +int *enable; +int *change; +int *elseEvent; +{ + char euc[BUFSIZ*4] ; /* $BFI$_I=<($N$?$a$N%P%C%U%!(B */ + int es ; /* euc $BJ8;zNs$ND9$5(B */ + unsigned char *sp, *sp1, *uni2euc( ) ; + wchar *wbuf ; /* $B3NDjJ8;zNs(B */ + char *wrbuf ; /* $B3NDjFI$_J8;zNs(B */ + + int length = 0 ; /* $B3NDjJ8;zNs$ND9$5(B */ + int i, n, ksize ; /* WORK */ + AtokRsltHdr *hdr ; /* WORK */ + int wsize ; /* WORK */ + static int euclen = 1 ; + + wsize = sizeof( wchar ) ; + wbuf = acomm->wbuf ; + wrbuf = acomm->wrbuf ; + + hdr = &acomm->NETrslt.header ; + + /* + * $B%b!<%IJ8;zNs$N@_Dj(B + * $B%b!<%IJ8;zNs$N@hF,$K6uGr$,B8:_$9$k$N$G:o=|$9$k!#(B + */ +#ifdef ATOK_DEBUG + printf( "buffer conv \245\342\241\274\245\311LEN %d\n"/*=buffer conv $B%b!<%I(BLEN %d\n=*/, hdr->modeLen ) ; +#endif /* ATOK_DEBUG */ + if ( hdr->modeLen > 0 ) { + es = hdr->modeLen * 3 ; + sp = ( unsigned char * )malloc( es ) ; + bzero( sp, es ) ; + ucs2euc( hdr->modePtr, hdr->modeLen, sp, es, 0x0000a2ae ) ; + sp1 = sp ; + while( *sp1 == 0x20 ) sp1++ ; /* SPACE */ + es = strlen( sp1 ) ; + es = euc2wcs( sp1, es, acomm->mode.name ) ; +#ifdef ATOK_DEBUG + printf( "\245\342\241\274\245\311\312\270\273\372\316\363 [%s]\n"/*=$B%b!<%IJ8;zNs(B [%s]\n=*/, sp ) ; +#endif /* ATOK_DEBUG */ + acomm->mode.length = hdr->modeLen ; + acomm->mode.length = es ; + free( sp ) ; + /* acomm->mode.changes = 1 ; */ + } + + /* + * $B3NDjJ8;zNs$,B8:_$9$k>l9g$K$O!"(Bwbuf $B$K3NDjJ8;zNs$r@_Dj$7!"(B + * $B%j%?!<%sCM$G$"$k3NDjJ8;zNs$ND9$5$r@_Dj$9$k!#(B + * wrbuf $B$K$OFI$_J8;zNs$r@_Dj$9$k!#(B + */ + if ( hdr->resultStrLen ) { + es = hdr->resultStrLen * 3 ; + sp = ( unsigned char * )malloc( es ) ; + bzero( sp, es ) ; + ucs2euc( hdr->resultStrPtr, hdr->resultStrLen, sp, es, 0x0000a2ae ) ; + + es = strlen( sp ) ; + es = euc2wcs( sp, es, wbuf ) ; + length = hdr->resultStrLen ; + free( sp ) ; + + /* + * $B$h$_J8;zNs(B + */ + bzero( acomm->wrbuf, sizeof( acomm->wrbuf )) ; + es = hdr->resultReadLen ; + s2e( hdr->resultReadPtr, es, wrbuf, sizeof( acomm->wrbuf )) ; + +#ifdef ATOK_DEBUG + printf( "=== buffer.c \263\316\304\352EUC [%s] === \n"/*==== buffer.c $B3NDj(BEUC [%s] === \n=*/, sp ) ; + printf( "=== buffer.c \263\316\304\352 READ EUC [%s] === \n"/*==== buffer.c $B3NDj(B READ EUC [%s] === \n=*/, acomm->wrbuf ) ; +#endif /* ATOK_DEBUG */ + + } + /* + * $BL$3NDjJ8;zNs$,$"$C$?>l9g$K$O!"(B + * $BL$3NDjJ8;zNs$r(BUNICODE$B$+$i(BEUC$B$KJQ49$7!"(B + * $BH?E>I=<(Ey$N0LCV$r5a$a$k!#(B + * $BL$3NDjJ8;zNs$ND9$5$HL$3NDjJ8;zNsB0@-$ND9$5$O(B + * $BF1$8$J$N$G(B if $BJ8$O$^$H$a$F=hM}$9$k!#(B + */ + if ( hdr->compStrLen ) { + es = hdr->compStrLen * wsize ; + es = hdr->compStrLen * 3 ; + sp = ( unsigned char * )malloc( es ) ; + bzero( sp, es ) ; + + ucs2euc( hdr->compStrPtr, hdr->compStrLen, sp, es, 0x0000a2ae ) ; + es = strlen( sp ) ; + + acomm->echoLen = euc2wcs( sp, es, acomm->echoStr ) ; + /* + * $B$3$3$GH?E>I=<($N%3%a%s%H$b:n@.$9$k!#(B + */ + XatokCompStr( hdr->compStrPtr, hdr->compAttrPtr, + hdr->compStrLen, &acomm->revPos, &acomm->revLen ) ; +#ifdef ATOK_DEBUG + /* printf( "$BL$3NDjJ8;zNs(B[%s]\n", sp ) ; */ + printf( "EUC CODE\n" ) ; + for( i = 0 ; sp[i] ; i++ ) { + printf( "0x%x ", sp[i] ) ; + } + printf( "\n" ) ; + + printf( "== DEBUG \314\244\263\316\304\352\311\275\274\250:\n"/*=== DEBUG $BL$3NDjI=<((B:\n=*/ ) ; + printf( "==> [%s]\n", sp ) ; + printf( "==> [----+----1----+----2----+----3]\n" ) ; + printf( "==> [" ) ; + for( i = 0 ; i < acomm->revPos ; i++ ) { + printf( "\241\373"/*=$B!{(B=*/ ) ; + } + for( i = 0 ; i < acomm->revLen ; i++ ) { + printf( "\241\374"/*=$B!|(B=*/ ) ; + } + for( i = acomm->revPos + acomm->revLen ; i < hdr->compStrLen ; i++ ) { + printf( "\241\373"/*=$B!{(B=*/ ) ; + } + printf( "-]\n" ) ; + printf( "revPos %d, revLen %d\n", acomm->revPos, acomm->revLen ) ; +#endif /* ATOK_DEBUG */ + + free( sp ) ; + } + else { + acomm->echoLen = 0 ; + acomm->echoStr[0] = 0 ; + } + + /* + * $B8uJdJ8;zNs(B + */ +#ifdef ATOK_DEBUG + printf( "\270\365\312\344\277\364\241\242 %d, \270\365\312\344\245\265\245\244\245\272 %d\n"/*=$B8uJd?t!"(B %d, $B8uJd%5%$%:(B %d\n=*/, hdr->kohoNum, hdr->kohoStrLen ) ; +#endif /* ATOK_DEBUG */ + + acomm->kohoNum = 0 ; + if ( hdr->kohoNum > 0 && hdr->kohoStrLen > 0 ) { + n = hdr->kohoNum ; + ksize = hdr->kohoStrLen ; + if ( acomm->kohoSize == 0 ) { + acomm->kohoStrPtr = ( WCHAR * )malloc( ksize * sizeof( WCHAR )) ; + acomm->kohoLenPtr = ( BYTE * )malloc( n * sizeof( BYTE )) ; + acomm->kohoSfxPtr = ( BYTE * )malloc( n * sizeof( BYTE )) ; + acomm->kohoSize = n ; + acomm->kohoStrLen = ksize ; + } + /* + * $BJ8;zNsD9!"B0@-$O!"8uJd?t$@$13NJ](B + * $B8uJd?t$O(B kohoSize $B$K(B $B@_Dj$7$F$"$k!#(B + */ + if ( acomm->kohoSize < n ) { + + acomm->kohoLenPtr = ( BYTE * )realloc( acomm->kohoLenPtr, n * sizeof( BYTE )) ; + acomm->kohoSfxPtr = ( BYTE * )realloc( acomm->kohoSfxPtr, n * sizeof( BYTE )) ; + acomm->kohoSize = n ; + } + if ( acomm->kohoStrLen < ksize ) { + acomm->kohoStrPtr = ( WCHAR * )realloc( acomm->kohoStrPtr, ksize * sizeof( WCHAR )) ; + acomm->kohoStrLen = ksize ; + } + + memcpy( acomm->kohoStrPtr, hdr->kohoStrPtr, ksize * sizeof( WCHAR)) ; + memcpy( acomm->kohoLenPtr, hdr->kohoLenPtr, n * sizeof( BYTE )) ; + memcpy( acomm->kohoSfxPtr, hdr->kohoSfxPtr, n * sizeof( BYTE )) ; + acomm->kohoNum = n ; + acomm->kohoPos = hdr->kohoPos ; + +#ifdef ATOK_DEBUG +{ + int kk ; + char *eep ; + kk = ksize * sizeof( WCHAR ); + eep = uni2euc( acomm->kohoStrPtr, &kk ) ; + printf( "\270\365\312\344 [%s]\n"/*=$B8uJd(B [%s]\n=*/, eep ) ; + for ( i = 0 ; i < n ; i++ ) { + printf( "%d ", acomm->kohoLenPtr[i] ) ; + } + printf( "\304\271\244\265\n"/*=$BD9$5(B\n=*/ ) ; +} +#endif /* ATOK_DEBUG */ + } + + /* + * $B%7%9%F%`9T%G!<%?(B + */ + if ( hdr->sysStrLen ) { + es = hdr->sysStrLen * 3 ; + sp = ( unsigned char * )malloc( es ) ; + bzero( sp, es ) ; + ucs2euc( hdr->sysStrPtr, hdr->sysStrLen, sp, es, 0x0000a2ae ) ; + es = strlen( sp ) ; + es = euc2wcs( sp, es, acomm->sysLineStr ) ; + acomm->sysLineLen = hdr->sysStrLen ; +#ifdef ATOK_DEBUG + printf( "SYS LINE LEN in buffer.c (%d)\n", hdr->sysStrLen ) ; +#endif /* ATOK_DEBUG */ + if ( acomm->sysLineSize == 0 ) { + acomm->sysAttrPtr = ( WORD * )malloc( sizeof( WORD ) * + hdr->sysStrLen ) ; + acomm->sysLineSize = hdr->sysStrLen ; + } + else if ( acomm->sysLineSize < hdr->sysStrLen ) { + acomm->sysAttrPtr = ( WORD * )malloc( sizeof( WORD ) * + hdr->sysStrLen ) ; + acomm->sysLineSize = hdr->sysStrLen ; + } + memcpy( acomm->sysAttrPtr, hdr->sysAttrPtr, sizeof( WORD ) * hdr->sysStrLen ) ; + + free( sp ) ; + } + if ( hdr->guideStrLen ) { + es = hdr->guideStrLen * 3 ; + sp = ( unsigned char * )malloc( es ) ; + bzero( sp, es ) ; + ucs2euc( hdr->guideStrPtr, hdr->guideStrLen, sp, es, 0x0000a2ae ) ; + free( sp ) ; + } + acomm->kohoNum = hdr->kohoNum ; + + acomm->guide_openEventIndex = hdr->CEGuideOpenEventIndx ; + acomm->guide_closeEventIndex = hdr->CEGuideCloseEventIndx ; + acomm->guide_OpenIndex = hdr->CEGuideOpenIndx ; + + *status = hdr->CEOutinf ; + *enable = hdr->StatusEnableFlag ; + *change = hdr->DispChangeStatus ; + *elseEvent = hdr->StatusElseEvent ; + + return length ; +} +/* End of buffer.c */ diff -r 000000000000 -r 92745d501b9a lib/Xatoklib/compstr.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/Xatoklib/compstr.c Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,99 @@ +/* + * Copyright 1999 Justsystem Corporation, Japan. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, + * provided that the above copyright notice appear in all copies and that + * both that copyright notice and this permission notice appear in + * supporting documentation, and that the name of Justsystem Corporation + * not be used in advertising or publicity pertaining to distribution + * of the software without specific, written prior permission. Justsystem + * Corporation makes no representations about the suitability of this + * software for any purpose. It is provided "as is" without express + * or implied warranty. + * + * Author: Atsushi Irisawa + */ + +#ifndef lint +static char rcsid[] = "$Id: compstr.c,v 1.2 1999/08/24 09:01:08 ishisone Exp $" ; +#endif /* !lint */ +#include +#include + +/* Page */ +/* + * [$B4X?tL>(B] + * XatokCompStr( ) + * [$BI=Bj(B] + * $BL$3NDjJ8;zNs>uBV(B $B>N(B : IO : $B@b(B $BL@(B + * WCHAR : *compStr : i : $BL$3NDjJ8;zNs(B + * WORD : *compAttr : i : $BL$3NDjJ8;zNsB0@-(B + * WORD : compLen : i : $BL$3NDjJ8;zNsD9$5(B + * int : *revPos : o : $BH?E>I=<(3+;O0LCV(B + * int : *revLen : o : $BH?E>I=<(D9$5(B + * + * [$BJV$jCM(B] + * $B%;%0%a%s%H$N8D?t(B(1-3) + * + * [$B;HMQ4X?t(B] + * $B$J$7(B + * [$B5!G=(B] + * $BL$3NDjJ8;zNs$NJ8;z>pJs!"B0@->pJs$h$j!"(B + * $BL$3NDjJ8;zNs$NI=<(>uBV$ruBV$H$O!"(B $B%N!<%^%kI=<(!"H?E>I=<($+$i@.N)$A!"(B + * $B:GBg#3$D$N%;%0%a%s%H$KJ,3d$5$l$k!#(B + * + */ + +int XatokCompStr(compStr, compAttr, compLen, revPos, revLen) +WCHAR *compStr; +WORD *compAttr; +WORD compLen; +int *revPos; +int *revLen; +{ + int i ; + int nseg = 0 ; + int prevAttr = -1 ; + int isReverse = 0 ; + *revPos = 0 ; + *revLen = 0 ; + + for( i = 0 ; i < ( int )compLen ; i++ ) { + /* printf( "compAttr[%d] = %d\n", i , compAttr[i] ) ; */ + switch( compAttr[i] ) { + case ATCOLINDX_TARGETCONVERT: + case ATCOLINDX_TARGETNOTCONVERTED: + case ATCOLINDX_INPUTCUR: + case ATCOLINDX_INPUTCURKOTEI: + case ATCOLINDX_TARGETNOTCONVERTEDKOTEI: + case ATCOLINDX_TARGETCOMMENT : + ( *revLen )++ ; + if ( !isReverse ) { + *revPos = i ; + isReverse = 1 ; + } + if ( prevAttr != 1 ) { + prevAttr = 1 ; + nseg++ ; + } + break ; + default : + if ( prevAttr != 0 ) { + prevAttr = 0 ; + nseg++ ; + } + break ; + } + } + return nseg ; +} + +/* End of compstr.c */ diff -r 000000000000 -r 92745d501b9a lib/Xatoklib/event.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/Xatoklib/event.c Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,593 @@ +/* + * Copyright 1999 Justsystem Corporation, Japan. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, + * provided that the above copyright notice appear in all copies and that + * both that copyright notice and this permission notice appear in + * supporting documentation, and that the name of Justsystem Corporation + * not be used in advertising or publicity pertaining to distribution + * of the software without specific, written prior permission. Justsystem + * Corporation makes no representations about the suitability of this + * software for any purpose. It is provided "as is" without express + * or implied warranty. + * + * Author: Atsushi Irisawa + */ + +#ifndef lint +static char rcsid[] = "$Id: event.c,v 1.4 1999/08/24 09:05:26 ishisone Exp $" ; +#endif /* !lint */ + +#include +#include +#include +#include +#include +#include + +#include +#include + + +/* Page */ +/* + * [$B4X?tL>(B] + * WordDelEvent( ) + * [$BI=Bj(B] + * $BC18l:o=|%&%#%s%I%&I=<(;~$N%$%Y%s%H=hM}(B + * [$B8F=P7A<0(B] + * int WordDelEvent( _XatokRecPtr acomm, WORD *aajcode, WORD *ceCmd ) + * + * [$B0z?t(B] + * $B7?(B : $BL>(B $B>N(B : IO : $B@b(B $BL@(B + * _XatokRecPtr : acomm : i/o : kinput2$BMQJQ49%P%C%U%!(B + * WORD : *aajcode : i/o : $BF~NO%-!<%3!<%I(B + * WORD : *ceCmd : o : ATOK12CE $B$N%3%^%s%IHV9f(B + * + * [$BJV$jCM(B] + * 0 : $B%-!l9g(B + */ + acomm->convStatus ^= M_WDEL ; /* 623 */ + status = 1 ; + break ; + default : + status = 0 ; + } + return status ; +} +/* Page */ +/* + * [$B4X?tL>(B] + * AuxEvent( ) + * [$BI=Bj(B] +* AUX$B%&%#%s%I%&I=<(;~$N%$%Y%s%H=hM}(B + * [$B8F=P7A<0(B] + * int AuxEvent( _XatokRecPtr acomm, WORD *aajcode, + * WORD *ceCmd, int *length ) + * + * [$B0z?t(B] + * $B7?(B : $BL>(B $B>N(B : IO : $B@b(B $BL@(B + * _XatokRecPtr : acomm : i/o : kinput2$BMQJQ49%P%C%U%!(B + * WORD : *aajcode : i/o : $BF~NO%-!<%3!<%I(B + * WORD : *ceCmd : o : ATOK12CE $B$N%3%^%s%IHV9f(B + * int : *length : o : $BF~NO$5$l$?J8;zNs$ND9$5(B + * + * + * [$BJV$jCM(B] + * -1 : $BAw?.%(%i!<(B + * N : $BAw?.%P%$%H?t(B + * + * [$B;HMQ4X?t(B] + * MenuCtrl( ) + * [$B5!G=(B] + * AUX $B%&%#%s%I%&I=<(;~$N%$%Y%s%H=hM}$r9T$J$&!#(B + * AUX $B%&%#%s%I%&$K$O(B MenuClass $B$,@_Dj$5$l$F$$$F!"(B + * MenuClass $B$KDj5A$5$l$?2hLL$NA+0\$r9T$J$&!#(B + */ +static int AuxEvent(acomm, aajcode, ceCmd, length) +_XatokRecPtr acomm; +WORD *aajcode; +WORD *ceCmd; +int *length; +{ + int status ; + + *length = 0 ; + +#ifdef ATOK_DEBUG + printf( "AUX KEY 0x%x\n", *aajcode ) ; +#endif /* ATOK_DEBUG */ + status = MenuCtrl( acomm, &acomm->curAux, aajcode, 0, length ) ; +#ifdef ATOK_DEBUG + printf( "MENU Status = %d\n", status ) ; +#endif /* ATOK_DEBUG */ + /* + * NULL $B$K$J$C$?>l9g$O(BAUX WINDOW$B$r%-%c%s%;%k$5$l$?>l9g(B + * status : -1 $BJQ99$J$7(B(DefaultProc $B$G=hM}(B) + * : 0 $B%a%K%e!<$NA*BrJQ99(B + * : 1 $B%a%K%e!curAux 0x%x\n", acomm->curAux ) ; */ + if ( !acomm->curAux ) { + acomm->curAux = acomm->menuAux ; + acomm->menuStatus = ICAuxEnd ; /* END */ + } + break ; + case 2 : + /* $B%a%K%e!<3NDj(B */ + acomm->menuStatus = ICAuxChange ; + break ; + case -1 : + acomm->menuStatus = ICAuxChange ; + return *length ; + case 0 : + default : + acomm->menuStatus = ICAuxChange ; + return 0 ; + } + /* return 0 ; */ + return *length ; +} + +/* Page */ +/* + * [$B4X?tL>(B] + * CandEvent( ) + * [$BI=Bj(B] + * $B8uJd%&%#%s%I%&I=<(;~$N%$%Y%s%H=hM}(B + * [$B8F=P7A<0(B] + * int CandEvent( _XatokRecPtr acomm, WORD *aajcode, WORD *ceCmd ) + * + * [$B0z?t(B] + * $B7?(B : $BL>(B $B>N(B : IO : $B@b(B $BL@(B + * _XatokRecPtr : acomm : i/o : kinput2$BMQJQ49%P%C%U%!(B + * WORD : *aajcode : i/o : $BF~NO%-!<%3!<%I(B + * WORD : *ceCmd : o : ATOK12CE $B$N%3%^%s%IHV9f(B + * + * + * [$BJV$jCM(B] + * 0 : $B%-!kohoMax ; + + switch( *aajcode ) { + case EESC : + *aajcode = FUNC_CNV_CANCL ; + return 0 ; + case LEFT : + case RIGHT : + case DOWN : + case UP : + case CTR_U : + case CTR_N : + case CTR_F : + case CTR_B : + case CTR_A : + return 0 ; + case CTR_DEL : + /* + * $B8=:_(B $BI=<(>eA*Br$5$l$F$$$k8uJd$r%(%s%8%s$KEA$($k(B + * $BI,MW$,$"$k!#(B + */ + *aajcode = acomm->kohoPos ; + atokCandidate( acomm, *aajcode ) ; + *aajcode = CTR_DEL ; + acomm->convStatus |= M_WDEL ; /* 623 */ + return 1 ; + case SPACE : + *aajcode = SPACE ; + /* *aajcode = XFER ; */ + return 0 ; /* 617 */ + break ; + case CR : + /* + * kinput2 $BB&$GA*Br$5$l$F$$$k=j$H%(%s%8%sFb$G(B + * $BA*Br$5$l$F$$$k=j$rF14|$5$;$k!#(B + */ + *aajcode = acomm->kohoPos ; + + acomm->NETrqst.AtCEIncode = acomm->kohoPos ; +#ifdef ATOK_DEBUG + printf( "\301\252\302\362\244\265\244\354\244\277\270\365\312\344\310\326\271\346 (%d) Page (%d)\n"/*=$BA*Br$5$l$?8uJdHV9f(B (%d) Page (%d)\n=*/, + acomm->NETrqst.AtCEIncode, + acomm->kohoCurPage ) ; +#endif /* ATOK_DEBUG */ + len = 1 ; + break ; + /* + * $B?t;z%-!<$N>l9g$O8uJdHV9f$rA*Br$7$?;v$H$9$k!#(B + * $BM-8z$J?t;z$K$D$$$F$O%A%'%C%/$9$k;v(B + */ + + default : + len = 0 ; +#ifdef CAND_PAGE + if ( *aajcode >= '1' && *aajcode <= '9' ) { + *aajcode -= '1' ; + len = 1 ; + } + else if ( *aajcode >= 'a' && *aajcode <= 'z' ) { + *aajcode -= 'a' ; + *aajcode += 10 ; + len = 1 ; + } + else if ( *aajcode >= 'A' && *aajcode <= 'Z' ) { + *aajcode -= 'A' ; + *aajcode += 10 ; + len = 1 ; + } + *aajcode = acomm->kohoCurPage * pgMax + *aajcode ; + *aajcode = acomm->kohoCurPage * pgMax + *aajcode ; +#else + len = 0 ; +#endif + } + if ( len > 0 ) { +#ifdef ATOK_DEBUG + Printf( "\270\365\312\344 \270\275\272\337\244\316\245\332\241\274\245\270 (%d)\n"/*=$B8uJd(B $B8=:_$N%Z!<%8(B (%d)\n=*/, acomm->kohoCurPage ) ; + printf( "\270\365\312\344 \263\316\304\352\310\326\271\346 (%d)\n"/*=$B8uJd(B $B3NDjHV9f(B (%d)\n=*/, *aajcode ) ; + printf( "\270\365\312\344 \263\316\304\352\310\326\271\346 (%d)\n"/*=$B8uJd(B $B3NDjHV9f(B (%d)\n=*/, acomm->NETrqst.AtCEIncode ) ; +#endif /* ATOK_DEBUG */ + atokCandidate( acomm, *aajcode ) ; + + *aajcode = VKEY|FUNC_KAKU_BUBUN ; + + } + return len ; +} +/* Page */ +/* + * [$B4X?tL>(B] + * KeyEvent( ) + * [$BI=Bj(B] + * $B%-!(B $B>N(B : IO : $B@b(B $BL@(B + * _XatokRecPtr : acomm : i/o : kinput2$BMQJQ49%P%C%U%!(B + * WORD : *aajcode : i/o : $BF~NO%-!<%3!<%I(B + * WORD : *ceCmd : o : ATOK12CE $B$N%3%^%s%IHV9f(B + * + * [$BJV$jCM(B] + * 0 : $B%-!oF~NO>uBV$G$N%-!o$N>uBV$G$O$J$/!"B>$N%$%Y%s%H=hM}$r9T$J$o$l$?8e$G$b(B + * $B%(%s%8%s$K%-!<$rEO$9I,MW$,$"$k>l9g$K$O8F$S=P$5$l$k!#(B + */ +static int KeyEvent(acomm, aajcode, ceCmd, wbuf, length, status, enable, change, elseEvent) +_XatokRecPtr acomm; +WORD *aajcode; +WORD *ceCmd; +wchar *wbuf; +int *length; +int *status; +int *enable; +int *change; +int *elseEvent; +{ + int call = 1 ; + int sRet = 0 ; + WORD key ; + + *length = 0 ; + *status = 0 ; + *enable = 0 ; + *change = 0 ; + acomm->NETrqst.AtCEIncode = 0 ; + acomm->NETrqst.AtCEPrvAPIOutinf = 0 ; + /* + * $BL$3NDjJ8;zNs$,$J$$$H$-$K@)8f%-!<$r2!$5$l$?>l9g$K$O(B + * $B%-!<$r$=$N$^$^JV$9!#(B + * $B@)8f%-!<$K$D$$$F$N(B if $BJ8$O(B $B=$@5$9$kI,MW$"$j!#(B + */ +#if 0 + if ( !acomm->echoLen && *aajcode == CR ) { + /* + ( + *aajcode == CR || + *aajcode == SPACE || + *aajcode == BS + )) { + */ + printf( "\245\271\245\353\241\274 KEY %x\n"/*=$B%9%k!<(B KEY %x\n=*/, *aajcode ) ; +#ifdef ATOK_DEBUG +#endif /* ATOK_DEBUG */ + wbuf[0] = *aajcode & 0xff ; + *length = 1 ; + return 1 ; + } +#endif + key = *aajcode ; + /* + * CTRL + W $B$O(B $BF~NO%b!<%I$N@Z$jBX$(%-!<(B + * $B%-!echoLen > 0 ) { + return 0 ; + } + acomm->convStatus = M_AUX ; + MenuCtrl( acomm, &acomm->curAux, aajcode, 1, length ) ; + acomm->menuStatus = ICAuxStart ; + return 0 ; + case SPACE : + *ceCmd = IME_PRV_KEYCONVERT ; + /* *aajcode = XFER ; */ + /* key = XFER ; */ + /* + * $B$3$3$O(B $B%9%Z!<%9%-!<$N3dEv$r%A%'%C%/$9$k;v(B + */ + if ( !acomm->echoLen ) key = SPACE ; + else key = XFER ; + /* key = XFER ; */ + key = SPACE ; /* 616 */ + + acomm->NETrqst.AtCEIncode = key & 0xffff ; + sRet = 1 ; + break ; + /* KEYCONV */ + default : + *ceCmd = IME_PRV_KEYCONVERT ; + acomm->NETrqst.AtCEIncode = *aajcode & 0xffff ; + sRet = 1 ; + break ; + } + + if ( call ) { + acomm->NETrqst.ceCmd = *ceCmd ; + +#ifdef ATOK_DEBUG +printf( "COMMUNICATE CMD(%d) AAJCODE(0x%04x)\n", *ceCmd, *aajcode & 0xffff ) ; +#endif /* ATOK_DEBUG */ + AtokClntCommunicate( acomm->sock, &acomm->NETrqst, &acomm->NETrslt ) ; +#ifdef ATOK_DEBUG +printf( "REQ OK\n" ) ; +#endif /* ATOK_DEBUG */ + } + + *length = XatokBufferConvert( acomm, *ceCmd, &acomm->NETrslt, + status, enable, change, elseEvent ) ; + +#ifdef ATOK_DEBUG + printf( "\270\365\312\344\244\316\277\364\244\362\245\301\245\247\245\303\245\257(%d)\241\243\n"/*=$B8uJd$N?t$r%A%'%C%/(B(%d)$B!#(B\n=*/, acomm->kohoNum ) ; + printf( "CAND STAT (%d)\n", acomm->convStatus & M_CAND ) ; +#endif /* ATOK_DEBUG */ + /* + * $B8uJd$,J#?tB8:_$7!"8=:_$^$@8uJd%&%#%s%I%&$rI=<($7$F$$$J$$$J$i(B + * $B8uJd%&%#%s%I%&$rI=<($9$k$?$a$K!"8uJd%j%9%H$rkohoNum > 1 && + !( acomm->convStatus & M_CAND ) ) { + + /* + * kohoNum $B$K$O(B $B8=:_$O8uJd?t$,F~$C$F$$$k$,!"(B + * Candidate $B$r$h$V$H%+%l%s%H8uJdHV9f$K$J$C$F$7$^$&$N$G(B + * kohoNum2 $B$K8uJd$NAm?t$rJ]B8$7$F$*$/(B + */ + acomm->kohoNum2 = acomm->kohoNum ; + +#ifdef ATOK_DEBUG + printf( "\270\365\312\344\244\254\244\242\244\303\244\277\244\316\244\307 \270\365\312\344\311\275\274\250\245\342\241\274\245\311\244\313\260\334\244\353\241\243\n"/*=$B8uJd$,$"$C$?$N$G(B $B8uJdI=<(%b!<%I$K0\$k!#(B\n=*/ ) ; +#endif /* ATOK_DEBUG */ + atokCandidate( acomm, ATCEPRVAPI_READCMD ) ; + acomm->convStatus |= M_CAND ; + *aajcode = XFER ; + *length = XatokBufferConvert( acomm, *ceCmd, &acomm->NETrslt, + status, enable, change, elseEvent ) ; + } + + return 1 ; +} + +/* Page */ +/* + * [$B4X?tL>(B] + * XatokEventControl( ) + * [$BI=Bj(B] + * $B%-!(B $B>N(B : IO : $B@b(B $BL@(B + * + * + * [$BJV$jCM(B] + * + * [$B;HMQ4X?t(B] + * + * [$B5!G=(B] + * X $B$+$i$N%$%Y%s%H$rwbuf ; + *status = 0 ; + wbuf[0] = 0 ; + length = 0 ; + acomm->wlen = 0 ; + + /* + * $BK\Ev$O$3$3$G(B ATOK CE$B$r8F$S=P$7(B $BJQ497k2L$r8+$F=hM}$r$9$k!#(B + * CE $B$r8F$S=P$9(BAPI$B$O(B X$B$N%-!<%$%Y%s%H$r8+$F(B AAJCODE$B$K$9$k!#(B + * $B3NDj$7$?J8;z$,$"$k>l9g$K$O!"(B wbuf $B$K3NDjJ8;z$r@_Dj$9$k!#(B + * $B3NDj$7$J$+$C$?>l9g$K$O!"F~NOJ8;z$H$7$F(Bprebuf $B$K%;%C%H$9$k!#(B + */ + /* + * $B$3$3$G(B $B%-!echoLen ) ; +printf( "convStatus %d\n", acomm->convStatus ) ; +#endif /* ATOK_DEBUG */ + if ( *aajcode == 0 ) { + return 0 ; + } + + /* + * $B%-!<%$%Y%s%H$,H/@8$7$F$3$N4X?t$K$H$s$GMh$?;~$K(B + * $B%b!<%I$,@_Dj$5$l$F$$$J$$>l9g$K$O!"JQ493+;O$N%-!<$r(B + * $B2!$5$l$?;~$G$"$k$N$G!"%-!convStatus == M_NOKEYCONV ) { + atokKanjiOn( acomm ) ; +/* printf( "KANJI ON MODE (%d)\n", acomm->convStatus ) ; */ + } + + /* + * CTRL_SPACE $B$O(B $B4A;z(BON$B!?(BOFF$B$N@Z$jBX$(%-!<(B + * CTRL_SPACE $B$O$I$s$J>l9g$G$b4A;z(BOFF + */ + if ( *aajcode == SFT_SP ) { +#ifdef ATOK_DEBUG + printf( "AAJ SFT_SP -> KANJIOFF\n" ) ; +#endif /* ATOK_DEBUG */ + if ( acomm->convStatus == M_KEYCONV ) { + atokKanjiOff( acomm ) ; +/* printf( "KANJI ON OFF (%d)\n", acomm->oldStatus ) ; */ + } + return 0 ; + } + + if ( acomm->convStatus & M_AUX ) { + /* + * AUX $B%&%#%s%I%&(B $BI=<(Cf$N%$%Y%s%H=hM}(B + */ + + sRet = AuxEvent( acomm, aajcode, &ceCmd, &length ) ; + /* printf( "AUX %d RETURN LENGTH = %d\n", sRet, length ) ; */ + if ( sRet < 1 ) { + return length ; + } + } + /* if ( acomm->convStatus & M_CAND ) { */ + /* + * $B8uJd%&%#%s%I%&$rI=<(Cf$G$+$D%7%9%F%`9T$rI=<($7$F$$$J$$>l9g$N(B + * $B%$%Y%s%H=hM}(B + */ + if ( acomm->convStatus & M_WDEL ) { + sRet = WordDelEvent( acomm, aajcode, &ceCmd ) ; + if ( sRet == 0 ) { + return 0 ; + } + } + if ( acomm->convStatus & M_CAND && + !( acomm->convStatus & M_SYSLINE )) { /* 616 */ + /* + * $B8uJd%&%#%s%I%&$rI=<(Cf$N%$%Y%s%H=hM}(B + */ + sRet = CandEvent( acomm, aajcode, &ceCmd ) ; + /* + * $B%9%F!<%?%9$,#00J30$N;~$O!"8uJd$,3NDj$5$l$?;~(B + */ + if ( sRet == 0 ) { + return 0 ; + } + } + /* + * $B$=$NB>$O(B $BDL>o$N%-!kohoPos ) ; */ +#ifdef ATOK_DEBUG + printf( "\263\316\304\352\312\270\273\372\316\363EVENT[%s]\n"/*=$B3NDjJ8;zNs(BEVENT[%s]\n=*/, acomm->wbuf ) ; +#endif /* ATOK_DEBUG */ + acomm->wlen = length ; + + return length ; +} + +/* End of event.c */ diff -r 000000000000 -r 92745d501b9a lib/Xatoklib/if.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/Xatoklib/if.c Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,564 @@ +/* + * Copyright 1999 Justsystem Corporation, Japan. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, + * provided that the above copyright notice appear in all copies and that + * both that copyright notice and this permission notice appear in + * supporting documentation, and that the name of Justsystem Corporation + * not be used in advertising or publicity pertaining to distribution + * of the software without specific, written prior permission. Justsystem + * Corporation makes no representations about the suitability of this + * software for any purpose. It is provided "as is" without express + * or implied warranty. + * + * Author: Atsushi Irisawa + */ + +#ifndef lint +static char rcsid[] = "$Id: if.c,v 1.3 1999/08/24 09:05:26 ishisone Exp $" ; +#endif /* !lint */ + +#include +#include +#include +#include +#include + +#include +#include + +/* Page */ +/* + * [$B4X?tL>(B] + * atokModeSet( ) + * [$BI=Bj(B] + * $B%b!<%I$N@_Dj(B + * [$B8F=P7A<0(B] + * int atokModeSet( _XatokRecPtr acomm, WORD ceCmd, WORD value ) + * + * [$B0z?t(B] + * $B7?(B : $BL>(B $B>N(B : IO : $B@b(B $BL@(B + * _XatokRecPtr : acomm : i/o : kinput2$BMQJQ49%P%C%U%!(B + * WORD : ceCmd : i : CE $B%3%^%s%IHV9f(B + * WORD : value : i : $BCM(B + * + * + * [$BJV$jCM(B] + * CE$B$N=hM}7k2L(B + * [$B;HMQ4X?t(B] + * AtokClntCommunicate( ) + * [$B5!G=(B] + * CE$B$N%b!<%I$r9T$J$&(BAPI$B$r8F$S=P$9!#(B + * value $B$,(BATCEPRVAPI_READCMD $B$N;~$O!"(B + * $B8=:_$N@_DjCM$NFI$_9~$_$G$"$k!#(B + */ +WORD atokModeSet(acomm, ceCmd, value) +_XatokRecPtr acomm; +WORD ceCmd; +WORD value; +{ + if ( value == ATCEPRVAPI_READCMD ) { + acomm->NETrqst.AtCEPrvAPIOutinf = ATCEPRVAPI_READCMD ; + } + else { + acomm->NETrqst.AtCEPrvAPIOutinf = value ; + } + acomm->NETrqst.ceCmd = ceCmd ; ; + AtokClntCommunicate( acomm->sock, &acomm->NETrqst, &acomm->NETrslt ) ; + + return acomm->NETrslt.header.CEOutinf ; +} + +/* Page */ +/* + * [$B4X?tL>(B] + * atokConnect( ) + * [$BI=Bj(B] + * ATOK12X $B%5!<%P$H$N@\B3(B + * [$B8F=P7A<0(B] + * int atokConnect( char *server, char *port, char *conf, char *style, + * _XatokRecPtr acomm ) + * + * [$B0z?t(B] + * $B7?(B : $BL>(B $B>N(B : IO : $B@b(B $BL@(B + * char : *server : i : ATOK12x $B2TF/%[%9%HL>(B + * char : *port : i : $B@\B3%5!<%S%9L>(B + * char : *conf : i : conf $B%U%!%$%kL>(B + * char : *style : i : style $B%U%!%$%kL>(B + * _XatokRecPtr : acomm : i/o : kinput2$BMQJQ49%P%C%U%!(B + * + * + * [$BJV$jCM(B] + * 0 $BL$K~(B : $B@\B3%(%i!<(B + * $B#00J>e(B :$B@\B3$7$?(BSOCKET$B5-=R;R(B + * + * [$B;HMQ4X?t(B] + * AtokClntConnect( ) + * XatokBufferConvert( ) + * [$B5!G=(B] + * $B?75,$K(B ATO$B#1#2(Bx$B$H$N@\B3$r9T$J$&!#(B + * $B@\B3$O%W%m%;%9$G#1$D$G$h$$!#(B + * $B@\B3$,=PMh$?>l9g$K$O!"3F%b!<%I$N8=:_$N@_DjCM$rNETrqst, &acomm->NETrslt ) ; + if ( sock < 0 ) { + return sock ; + } + + /* + * $B@\B3$K@.8y$7$?$i8=:_$N%b!<%I$rNETrslt, + dummy, &status, &status, &status, &status ) ; + + acomm->sock = sock ; + + /* + * $B8=:_$N@_DjCM$rmode.modeKANDSP = atokModeSet( acomm, + IME_PRV_SETKANDSP, ATCEPRVAPI_READCMD ) ; + acomm->mode.modeHEN = atokModeSet( acomm, + IME_PRV_SETHENMODE, ATCEPRVAPI_READCMD ) ; + acomm->mode.modeGAKU = atokModeSet( acomm, + IME_PRV_SETGAKUMODE, ATCEPRVAPI_READCMD ) ; + acomm->mode.modeKOTE = atokModeSet( acomm, + IME_PRV_SETKOTEMODE, ATCEPRVAPI_READCMD ) ; + acomm->mode.modeOKURI = atokModeSet( acomm, + IME_PRV_SETOKURIMODE, ATCEPRVAPI_READCMD ) ; + acomm->mode.modeROT = atokModeSet( acomm, + IME_PRV_SETROTMODEF, ATCEPRVAPI_READCMD ) ; + + return sock ; +} +/* Page */ +/* + * [$B4X?tL>(B] + * atokCEOpen( ) + * [$BI=Bj(B] + * CONTEXT$B$N:n@.(B + * [$B8F=P7A<0(B] + * int atokCEOpen( int sock, int clntid, _XatokRecPtr acomm ) + * + * [$B0z?t(B] + * $B7?(B : $BL>(B $B>N(B : IO : $B@b(B $BL@(B + * int : sock : i : ATOK12X $B$H$N@\B3(BSOCKET + * int : clntid : i : $B%/%i%$%"%s%H(BID + * _XatokRecPtr : acomm : i/o : kinput2$BMQJQ49%P%C%U%!(B + * + * [$BJV$jCM(B] + * -1 : CONTEXT$B:n@.%(%i!<(B + * 1 : CONTEXT $B:n@.@.8y(B + * + * [$B;HMQ4X?t(B] + * AtokClntCEOpen( ) + * XatokBufferConvert( ) + * [$B5!G=(B] + * $B4{$K@\B3$5$l$F$$$F!"%/%i%$%"%s%H(BID$B$,3d$jEv$F$i$l$F$$$k(B + * $B%;%C%7%g%s$KBP$7!"(BATOK12CE $B$H$N(BCONTEXT$B$rDI2C:n@.$9$k!#(B + */ + +int atokCEOpen(sock, clntid, acomm) +int sock; +int clntid; +_XatokRecPtr acomm; +{ + wchar dummy[128] ; /* BufferConvert $B$N$?$a$N(B TMP */ + int status ; /* BufferConvert $B$N$?$a$N(B TMP */ + + if ( AtokClntCEOpen( sock, clntid, &acomm->NETrqst, &acomm->NETrslt ) < 0 ) { + return -1 ; + } + + XatokBufferConvert( acomm, ( WORD ) -1, &acomm->NETrslt, + dummy, &status, &status, &status, &status ) ; + + acomm->mode.modeKANDSP = atokModeSet( acomm, + IME_PRV_SETKANDSP, ATCEPRVAPI_READCMD ) ; + acomm->mode.modeHEN = atokModeSet( acomm, + IME_PRV_SETHENMODE, ATCEPRVAPI_READCMD ) ; + acomm->mode.modeGAKU = atokModeSet( acomm, + IME_PRV_SETGAKUMODE, ATCEPRVAPI_READCMD ) ; + acomm->mode.modeKOTE = atokModeSet( acomm, + IME_PRV_SETKOTEMODE, ATCEPRVAPI_READCMD ) ; + acomm->mode.modeOKURI = atokModeSet( acomm, + IME_PRV_SETOKURIMODE, ATCEPRVAPI_READCMD ) ; + acomm->mode.modeROT = atokModeSet( acomm, + IME_PRV_SETROTMODEF, ATCEPRVAPI_READCMD ) ; + + return 1 ; +} + + +/* Page */ +/* + * [$B4X?tL>(B] + * atokKanjiOn + * [$BI=Bj(B] + * $B4A;z(BON + * [$B8F=P7A<0(B] + * int atokKanjiOn( _XatokRecPtr acomm ) + * [$B0z?t(B] + * $B7?(B : $BL>(B $B>N(B : IO : $B@b(B $BL@(B + * _XatokRecPtr : acomm : i/o : kinput2$BMQJQ49%P%C%U%!(B + * + * [$BJV$jCM(B] + * 0 $BL$K~(B : $B%(%i!<(B + * 0 : OK + * + * [$B;HMQ4X?t(B] + * atokClntCommunicate( ) + * [$B5!G=(B] + * CE $B$N%b!<%I$r4A;z(BON$B$H$9$k!#(B + * + */ +int atokKanjiOn(acomm) +_XatokRecPtr acomm; +{ + int status ; + + acomm->convStatus = M_KEYCONV ; + acomm->convStatus = acomm->oldStatus ; + acomm->NETrqst.ceCmd = IME_PRV_KANJION ; + acomm->curAux = acomm->menuAux ; + + status = AtokClntCommunicate( acomm->sock, + &acomm->NETrqst, &acomm->NETrslt ) ; + + return status ; +} + +int atokKanjiOff(acomm) +_XatokRecPtr acomm; +{ + int status ; + + acomm->oldStatus = acomm->convStatus ; + acomm->convStatus = M_NOKEYCONV ; + acomm->NETrqst.ceCmd = IME_PRV_KANJIOFF ; + acomm->curAux = acomm->menuAux ; + + status = AtokClntCommunicate( acomm->sock, + &acomm->NETrqst, &acomm->NETrslt ) ; + + return status ; +} + +/* Page */ +/* + * [$B4X?tL>(B] + * atokWordStyleList( ) + * [$BI=Bj(B] + * $BIJ;l%j%9%H$N(B $B>N(B : I O : $B@b(B $BL@(B + * _XatokRecPtr : acomm : i/o : kinput2$BMQJQ49%P%C%U%!(B + * + * [$BJV$jCM(B] + * -1 : $BAw?.%(%i!<(B + * N : $BIJ;l$N8D?t(B + * + * [$B;HMQ4X?t(B] + * atokClntCommunicate( ) + * [$B5!G=(B] + * $B<-=q$KEPO?$9$k$?$a$NIJ;l%j%9%H$rl9g$K$O!"(B + * $B?7$?$KhinsiPtr ) { + goto make_cand ; + } + + acomm->NETrqst.ceCmd = IME_PRV_WORDSYLECOUNT ; + if ( AtokClntCommunicate( acomm->sock, &acomm->NETrqst, &acomm->NETrslt ) < 0 ) { + return -1 ; + } + +#ifdef ATOK_DEBUG + printf( "CHECK %d\n", acomm->NETrslt.header.CEOutinf ) ; +#endif /* ATOK_DEBUG */ + acomm->hinsiNum = acomm->NETrslt.header.CEOutinf ; + acomm->NETrqst.ceCmd = IME_PRV_WORDSTYLELIST ; + acomm->NETrqst.AtCEIncode = acomm->hinsiNum ; +#ifdef ATOK_DEBUG +printf( "\311\312\273\354\301\355\277\364 %d\n"/*=$BIJ;lAm?t(B %d\n=*/, acomm->hinsiNum ) ; +#endif /* ATOK_DEBUG */ + AtokClntCommunicate( acomm->sock, &acomm->NETrqst, &acomm->NETrslt ) ; + + size = sizeof( ATOKDEHINSTR ) * acomm->hinsiNum ; + acomm->hinsiPtr = ( ATOKDEHINSTR * )malloc( size ) ; + sptr = acomm->NETrslt.header.wordPtr ; + memcpy( acomm->hinsiPtr, sptr, size ) ; +make_cand: + size = 0 ; + /* + * S-JIS $B$GAw$i$l$F$-$?IJ;l%j%9%H%G!<%?$r(B kinput2$BB&$G07$($k$h$&$K(B + * EUC $B$KJQ49$9$k!#(B + */ + for( i = 0 ; i < acomm->hinsiNum ; i++ ) { + size += s2e( acomm->hinsiPtr[i].szHinsiStr, + strlen( acomm->hinsiPtr[i].szHinsiStr ), + euc, sizeof( euc )) ; + } + /* + * $BIJ;l%j%9%H$r4IM}$9$k%P%C%U%!$O8uJd%j%9%H$r4IM}$9$k%P%C%U%!$H(B + * $BF1$8NN0h$H$7!"4{$K3NJ]$5$l$F$$$k>l9g$K$O$=$NNN0h$O3NJ]$7$J$$!#(B + * $B%P%C%U%!$r6&M-=PMh$k$N$O!"8uJd$r=PNOCf$K!"IJ;l%j%9%H$r(B + * $B=PNO$9$k;v$,$J$$$+$i$G$"$j!"F1;~$K=PNO$9$k;v$,$"$k>l9g$K$O(B + * $BNN0h$rJL$K$H$k$h$&$K=$@5$9$kI,MW$,$"$k!#(B + */ + if ( acomm->kohoSize == 0 ) { + acomm->kohoStrPtr = ( WCHAR * )malloc( size * sizeof( WCHAR )) ; + acomm->kohoLenPtr = ( BYTE * )malloc( acomm->hinsiNum * sizeof( BYTE )) ; + acomm->kohoSfxPtr = ( BYTE * )malloc( acomm->hinsiNum * sizeof( BYTE )) ; + acomm->kohoSize = acomm->hinsiNum ; + acomm->kohoStrLen = size ; + } + if ( acomm->kohoSize < acomm->hinsiNum ) { + acomm->kohoLenPtr = ( BYTE * )realloc( acomm->kohoLenPtr, + acomm->hinsiNum * sizeof( BYTE )) ; + acomm->kohoSfxPtr = ( BYTE * )realloc( acomm->kohoSfxPtr, + acomm->hinsiNum * sizeof( BYTE )) ; + acomm->kohoSize = n ; + } + if ( acomm->kohoStrLen < size ) { + acomm->kohoStrPtr = ( WCHAR * )realloc( acomm->kohoStrPtr, + size * sizeof( WCHAR )) ; + acomm->kohoStrLen = size ; + } + len = 0 ; + for( i = 0 ; i < acomm->hinsiNum ; i++ ) { + n = strlen( acomm->hinsiPtr[i].szHinsiStr ) ; + n = sjis2ucs( acomm->hinsiPtr[i].szHinsiStr, n, + &acomm->kohoStrPtr[len], size -len, 0 ) ; + acomm->kohoLenPtr[i] = n ; + len += n ; + } + acomm->kohoNum2 = acomm->hinsiNum ; + acomm->kohoPos = 0 ; + + return acomm->hinsiNum ; +} + +/* Page */ +/* + * [$B4X?tL>(B] + * atokCandidate( ) + * [$BI=Bj(B] + * $B8uJd%j%9%H$N(B $B>N(B : I O : $B@b(B $BL@(B + * _XatokRecPtr : acomm : i/o : kinput2$BMQJQ49%P%C%U%!(B + * int : nbr : i : $B@_Dj$9$kHV9f(B + * + * [$BJV$jCM(B] + * 0 $BL$K~(B : $BAw?.%(%i!<(B + * 0 : OK + * + * [$B;HMQ4X?t(B] + * atokClntCommunicate( ) + * [$B5!G=(B] + * $B8uJd%j%9%H$h$j!"8=:_A*Br$5$l$F$$$k8uJdHV9f$r@_Dj$9$k!#(B + */ +int atokCandidate(acomm, nbr) +_XatokRecPtr acomm; +int nbr; +{ + int status ; + /* + * if $BJ8I,MW$J$7(B + */ + if ( nbr != ATCEPRVAPI_READCMD ) { + acomm->NETrqst.AtCEIncode = nbr ; + } + else { + acomm->NETrqst.AtCEIncode = ATCEPRVAPI_READCMD ; + } + acomm->NETrqst.ceCmd = IME_PRV_CANDLIST ; + + status = AtokClntCommunicate( acomm->sock, &acomm->NETrqst, &acomm->NETrslt ) ; + + return status ; +} + +/* Page */ +/* + * [$B4X?tL>(B] + * atokWordRegister( ) + * [$BI=Bj(B] + * $BC18l$NEPO?(B + * [$B8F=P7A<0(B] + * atokWordRegister( _XatokRecPtr acomm, wchar *word, + * int wlen, wchar *yomi, int ylen, int hinshi ) + * + * [$B0z?t(B] + * $B7?(B : $BL>(B $B>N(B : I O : $B@b(B $BL@(B + * _XatokRecPtr : acomm : i/o : kinput2$BMQJQ49%P%C%U%!(B + * wchar : *word : i : $BEPO?C18l(B + * int : wlen : i : $BEPO?C18lD9$5(B + * wchar : *yomi : i : $BC18l$h$_(B + * int : ylen : i : $BC18l$h$_$J$,$5(B + * int : hinshi : i : $BIJ;lHV9f(B + * + * + * [$BJV$jCM(B] + * -1 : $BAw?.$G$-$J$$!#(B + * 0 : $B@5>o=*N;(B + * 1 : $B$3$NFI$_$G$O$3$l0J>eEPO?IT2D(B + * 2 : $B$3$l0J>eEPO?IT2D(B + * 3 : $B<-=q@_DjIT@5(B + * 4 : $BI=5-$KITE,@Z$JJ8;z$r4^$`(B + * 5 : $BEPO?$G$-$J$$!#(B + * 6 : $BFI$_$KITE,@Z$JJ8;z$r4^$`(B + * 7 : $B4{$KEPO?$5$l$F$$$k!#(B + * + * [$B;HMQ4X?t(B] + * atokClntCommunicate( ) + * wcs2euc( ) + * euc2ucs( ) + * [$B5!G=(B] + * $BC18lEPO?$r9T$J$&!#(B + * $BC18lI=5-!"$h$_$O(B $B$=$l$>$F(B UCS$B%3!<%I$GEPO?$9$k!#(B + * kinput2 $B$G4IM}$7$F$$$k;~$O(B + * $BC18lI=5-$O(B WCHAR, $BFI$_%3!<%I$O(BEUC$B$G$"$k$N$G$=$l$>$l(B + * UCS $B$X$NJQ49$r0lEY9T$J$&!#(B + * $BIJ;lHV9f$O!"#1$+$i;O$^$kJ*$G$"$k!#(B + */ + +int atokWordRegister(acomm, word, wlen, yomi, ylen, hinshi) +_XatokRecPtr acomm; +wchar *word; +int wlen; +wchar *yomi; +int ylen; +int hinshi; +{ + AtokReqPacket *req ; + unsigned char *eucp ; + WCHAR *ucs_wp ; /* $BC18l(B UCS $BJ8;zNs(B */ + WCHAR *ucs_yp ; /* $BFI$_(B UCS $BJ8;zNs(B */ + unsigned char *sjp ; + int len ; + int alen ; +int i ; + + if ( wlen > ylen ) alen = wlen ; + else alen = ylen ; + + acomm->NETrqst.ceCmd = IME_PRV_REGISTERWORDEX ; + req = &acomm->NETrqst ; +/* printf( "wlen %d, ylen %d\n", wlen, ylen ) ; */ + + eucp = ( unsigned char * )malloc( alen * sizeof( WCHAR ) + 1 ) ; + sjp = ( unsigned char * )malloc( ylen * sizeof( WCHAR ) + 1 ) ; + + /* + * $BC18lJ8;zNs$r(B WCS -> EUC -> UCS $BJQ49$9$k!#(B + */ + bzero( eucp, alen ) ; + wcs2euc( word, wlen, eucp ) ; + len = strlen( eucp ) ; + ucs_wp = ( WCHAR * )malloc(( len + 1 ) * sizeof( WCHAR )) ; + euc2ucs( eucp, strlen( eucp ), ucs_wp, len, 0x3013 ) ; + +#if 0 +printf( "\303\261\270\354 WCS CODE -> "/*=$BC18l(B WCS CODE -> =*/ ) ; +for( i = 0 ; i <= wlen ; i++ ) { + printf( "0x%x ", word[i] ) ; +} +printf( "\303\261\270\354 EUC CODE -> "/*=$BC18l(B EUC CODE -> =*/ ) ; +for( i = 0 ; i <= len ; i++ ) { + printf( "0x%x ", eucp[i] ) ; +} +printf( "\n" ) ; +printf( "\303\261\270\354 EUC [%s]\n"/*=$BC18l(B EUC [%s]\n=*/, eucp ) ; +printf( "\303\261\270\354 UCS CODE -> "/*=$BC18l(B UCS CODE -> =*/ ) ; +for( i = 0 ; i <= wlen ; i++ ) { + /* printf( "0x%x ", ucs_wp[i] ) ; */ +} +printf( "\n" ) ; +#endif + + + /* + * $BFI$_J8;zNs$r(B WCS -> EUC -> UCS $BJQ49$9$k!#(B + */ + bzero( eucp, alen ) ; + wcs2euc( yomi, ylen, eucp ) ; + len = strlen( eucp ) ; + ucs_yp = ( WCHAR * )malloc(( len + 1 ) * sizeof( WCHAR )) ; + euc2ucs( eucp, strlen( eucp ), ucs_yp, len, 0x3013 ) ; + +#if 0 +printf( "\306\311\244\337 EUC CODE -->"/*=$BFI$_(B EUC CODE -->=*/ ) ; +for( i = 0 ; i <= len ; i++ ) { + printf( "0x%x ", eucp[i] ) ; +} +printf( "\n" ) ; +printf( "\306\311\244\337 EUC [%s]\n"/*=$BFI$_(B EUC [%s]\n=*/, eucp ) ; +for( i = 0 ; i <= strlen( eucp ) ; i++ ) { + printf( "0x%0x ", eucp[i] ) ; +} +printf( "\n" ) ; +printf( "\306\311\244\337 UCS CODE -> "/*=$BFI$_(B UCS CODE -> =*/ ) ; +for( i = 0 ; i <= ylen ; i++ ) { + printf( "0x%x ", ucs_yp[i] ) ; +} +printf( "\n" ) ; +#endif + + /* + * $BAw?.%Q%i%a!<%?$N:n@.(B + */ + req->Kind[0] = T_WCHAR ; + req->Size[0] = wlen ; + req->ArgPtr[0] = ucs_wp ; + + req->Kind[1] = T_WCHAR ; + req->Size[1] = ylen ; + req->ArgPtr[1] = ucs_yp ; + + req->Ctr[0] = hinshi ; + + AtokClntCommunicate( acomm->sock, &acomm->NETrqst, &acomm->NETrslt ) ; + + free( ucs_wp ) ; + free( ucs_yp ) ; + free( eucp ) ; + +/* printf( "$BEPO?7k2L(B %d\n", acomm->NETrslt.header.CEOutinf ) ; */ + return acomm->NETrslt.header.CEOutinf ; +} +/* End of if.c */ diff -r 000000000000 -r 92745d501b9a lib/Xatoklib/key.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/Xatoklib/key.c Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,198 @@ +/* + * Copyright 1999 Justsystem Corporation, Japan. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, + * provided that the above copyright notice appear in all copies and that + * both that copyright notice and this permission notice appear in + * supporting documentation, and that the name of Justsystem Corporation + * not be used in advertising or publicity pertaining to distribution + * of the software without specific, written prior permission. Justsystem + * Corporation makes no representations about the suitability of this + * software for any purpose. It is provided "as is" without express + * or implied warranty. + * + * Author: Atsushi Irisawa + */ + +#ifndef lint +static char rcsid[] = "$Id: key.c,v 1.3 1999/08/24 09:01:09 ishisone Exp $" ; +#endif /* !lint */ + + +#include +#include +#include +#include + +#include +#include + +const WORD XkeyAAJtable[]={ +/* 0,8 ,1,9 ,2,a ,3,b ,4,c ,5,d ,6,e ,7,f */ + 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, /* 00-07 */ + 0x0108,0x0109,0x0000,0x0000,0x0000,0x010d,0x0000,0x0000, /* 08-0f */ + 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, /* 10-17 */ + 0x0000,0x0000,0x0000,0x011b,0x0000,0x0000,0x0000,0x0000, /* 18-1f */ + /* ! " # $ % & ' */ + /* XK_Kanji XK_Muhenkan XK_ */ + 0x0000,XFER,NFER,XFER,EIJI,HIRAGANA,KATAKANA,HIRAGANA, /* 20-27 */ + /* ( ) * + , - */ + ZORH, ZORH, ZORH,0x0341,0x033a,0x0015,0x0000,0x0000, /* 28-2f */ + 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, /* 30-37 */ + 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, /* 38-3f */ + 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, /* 40-47 */ + 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, /* 48-4f */ + /* P Q R S T U V W */ + /* XK_Home XK_Left XK_Up XK_Right XK_PageUP XK_PageDown XK_End */ + HOME, LEFT, UP, RIGHT, DOWN, PGUP, PGDN, EEND, /* 50-57 */ + /* X Y Z [ \ ] ^ _ */ + 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, /* 58-5f */ + /* ` a b c d e f g */ + 0x0000,0x0000, NFER, INS,0x0000,0x0000,0x0000,0x0000, /* 60-67 */ + /* h i j k l m n o */ + 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, /* 68-6f */ + /* p q r s t u v w */ + 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, /* 70-77 */ + /* x y z { | } ~ del */ + 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, /* 78-7f */ + 0x0020,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, /* 80-87 */ + 0x0000, TAB,0x0000,0x0000,0x0000, CR,0x0000,0x0000, /* 88-8f */ + 0x0000, F1, F2, F3, F4, HOME, LEFT, UP, /* 90-97 */ + RIGHT, DOWN, PGUP, PGDN, EEND,0x0000, INS, DEL, /* 98-9f */ + 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, /* a0-a7 */ + 0x0000,0x0000,0x022a,0x022b,0x0000,0x022d,0x0000,0x022f, /* a8-af */ + 0x0230,0x0231,0x0232,0x0233,0x0234,0x0235,0x0236,0x0237, /* b0-b7 */ + /* XK_F1 XK_F2 */ + 0x0238,0x0239,0x0000,0x0000,0x0000,0x0000, F1, F2, /* b8-bf */ + /* XK_F3 XK_F4 XK_F5 XK_F6 XK_F7 XK_F8 XK_F9 XK_F10 */ + F3, F4, F5, F6, F7, F8, F9, F10, /* c0-c7 */ + /* XK_F11 XK_F12 XK_F13 XK_F14 XK_F15 XK_F16 XK_F17 XK_F18 */ + F11, F12, F13, F14, F15, F16, F17, F18, /* c8-cf */ + /* XK_F19 XK_F20 */ + F19, F20,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, /* d0-d7 */ + /* XK_F33 */ + 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, HELP,0x0000, /* d8-df */ + 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, /* e0-e7 */ + 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, /* e8-ef */ + 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, /* f0-f7 */ + /* XK_Delete */ + 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, DEL /* f8-ff */ +}; + +/* Page */ +/* + * [$B4X?tL>(B] + * getAAJCode( ) + * [$BI=Bj(B] + * AAJCODE $B$N(B $B>N(B : I O : $B@b(B $BL@(B + * XKeyEvent : *event : i : X $B$N%$%Y%s%H%3!<%I(B + * KeySym : xkeysym : i : X$B$N%-!<%7%s%\%k(B + * unsigned char : *kbuf : i : $BF~NO$5$l$?J8;z%3!<%I(B + * + * [$BJV$jCM(B] + * AAJCODE : $BJQ49$5$l$?(BAAJCODE + * + * [$B;HMQ4X?t(B] + * $B$J$7(B + * [$B5!G=(B] + * X$B$N%-!<%$%Y%s%H$h$j!"(B AAJCODE$B$KJQ49$9$k!#(B + * + */ +WORD getAAJCode(event, xkeysym, kbuf) +/* Fix Length */ +XKeyEvent *event; +KeySym xkeysym; +unsigned char *kbuf; +{ + + WORD aajcode = 0 ; + unsigned char ch ; + + ch = kbuf[0] ; + +#ifdef ATOK_DEBUG +printf( "KEY CODE CH = 0x%02x\n", ch ) ; +printf( "KEY SYM ORG 0x%x, FF00 4 = 0x%04x\n", xkeysym, xkeysym & 0xff00 ) ; +printf( "KEY SYM CODE 4 = 0x%04x\n", xkeysym ) ; +printf( "SHIFT STAT %d\n", event->state & ShiftMask ) ; +printf( "CTRL STAT %d\n", event->state & ControlMask ) ; + +#endif /* ATOK_DEBUG */ + + /* + * X $B$N5!G=%-!<$@$C$?>l9g(B,AAJTABLE $B$KDj5A$7$F$"$k%3!<%I$KJQ49(B + */ + if (( xkeysym & 0xFF00 ) == 0xFF00 ) { + int index ; + index = xkeysym & 0xff ; +#ifdef ATOK_DEBUG + printf( "FUNCTIONAL KEY INDEX = 0x%02x\n", index ) ; +#endif /* ATOK_DEBUG */ + aajcode = XkeyAAJtable[index] ; + if ( !aajcode ) { + return 0 ; + } + } + /* + * $BF~NO$5$l$?J8;z$H%-!<%3!<%I$,F1$8>l9g$K$O(B + * $B$=$N%3!<%I$r(BAAJ$B%3!<%I$H$9$k!#(B + * $BF~NOJ8;z$,%3%s%H%m!<%k%3!<%I$N>l9g$OF~NOJ8;z$r(B + * AAJ$B%3!<%I$H$9$k!#(B + */ + else if ( ch == 0x8e ) { + aajcode = ( WORD )kbuf[1] ; + } + else if ( ch == xkeysym & 0xff ) { + aajcode = ( WORD )xkeysym ; + } + else if ( ch > 0 && ch < 0x20 ) { + aajcode = ch ; + } +/* 990614 */ + else if ( ch == 0 && xkeysym & 0xff ) { + aajcode = xkeysym & 0xff ; + if (( xkeysym & 0xff ) == '@' && ( event->state & ControlMask )) { + aajcode = 0x1000 ; + return aajcode ; + } + } +/* 990614 */ + else { + /* printf( "unknonw key\n" ) ; */ + return 0 ; + } + + if ( event->state & ShiftMask ) { + aajcode |= SHIFT ; + } + if ( event->state & ControlMask ) { + aajcode |= CTRL ; + } + if( event->state & 0x08 ) { /* ALT Mask */ + aajcode |= ALT ; + } + switch( aajcode ) { + case 0x101b : /* CTR + 3 */ + case 0x101c : /* CTR + 4 */ + case 0x101d : /* CTR + 5 */ + case 0x101e : /* CTR + 6 */ + case 0x101f : /* CTR + 7 */ + aajcode = 0x1033 + aajcode - 0x101b ; + break ; + } + + + return aajcode ; +} +/* End of key.c */ + + + + diff -r 000000000000 -r 92745d501b9a lib/Xatoklib/key_def.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/Xatoklib/key_def.h Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,848 @@ +/****************************************************************************** +* $B%U%!%$%kL>(B : KEY_DEF.H +* $B%U%!%$%k35MW(B : $BFbIt%-!<%3!<%I(B,$B5!G=%-! ATOK12 + + FUNC_CAND_NEXT(0x3b) $B FUNC_CNV_NEXT(0x08) $BJQ49(B($B FUNC_CNV_PREV(0x09) $BJQ49(B($BA08uJd(B)$B$XE}9g(B + FUNC_CNV_CODE(0x69) $B%3!<%IJQ49(B -> FUNC_CNV_NEXT(0x08) $BJQ49(B($B FUNC_KAKU_ONE(0x0a) $B#12;3NDj$XE}9g(B + FUNC_DESTRUCTONE(0x7e)$BJQ49J8@a#1J8;z>C5n(B -> FUNC_CHR_DEL(0x01) $B#1J8;z:o=|(B($B%+!<%=%k0LCV(B)$B$XE}9g(B + FUNC_REVERTFLUSH(0x82)$BJQ49C$7$FA4J8;z:o=|(B -> FUNC_CNV_CANCL(0x32) $BJQ49C(B($BCmL\J8@a0J9_(B) $B$H(B FUNC_DEL_ALL(0x1e) $BA4J8;z:o=|$XJ,3d(B + FUNC_ICONEXEC(0xb1) $B:G>.2=(B -> $B:o=|(B + FUNC_OPPLEXEC(0xb5) $BA`:n%Q%l%C%H5/F0(B -> $B:o=|(B +*/ + + +/*===========================================================================*/ +/* ATOK$B5!G=%-!C5n5!G=$r%W%i%9(B */ +#define FUNC_CHR_RIGHT 0x02 /*@ $B%+!<%=%k0\F0(B($B#1J8;z1&(B) */ +#define FUNC_CHR_LEFT 0x03 /*@ $B%+!<%=%k0\F0(B($B#1J8;z:8(B) */ +#define FUNC_CHR_TAIL 0x04 /*@ $B%+!<%=%k0\F0(B($BJ8Kv(B) */ +#define FUNC_CHR_HEAD 0x05 /*@ $B%+!<%=%k0\F0(B($BJ8F,(B) */ +#define FUNC_CNV_BUSYU 0x06 /*@ $BIt(B FUNC_CNV */ +#define FUNC_CNV_PREV 0x09 /* $BJQ49(B($BA08uJd(B) <<$BDI2C(B*/ +#define FUNC_KAKU_ONE 0x0a /*@ $B#12;3NDj(B $B5l$NJQ49J8@a#1J8;z3NDj5!G=$r%W%i%9(B */ +#define FUNC_CNV_HMUHEN 0x0b /*@ $BH>3QL5JQ498eJQ49(B $B5lL>(B FUNC_CNV_HANMU */ +#define FUNC_CNV_HIRA 0x0c /*@ $B$R$i$,$J(B($B8e(B)$BJQ49(B */ +#define FUNC_CNV_ZKATA 0x0d /*@ $B%+%?%+%J(B($B8e(B)$BJQ49(B $B5lL>(B FUNC_CNV_KANA */ +#define FUNC_CNV_HAN 0x0e /*@ $BH>3Q(B($B8e(B)$BJQ49(B */ +#define FUNC_CNV_ZMUHEN 0x0f /*@ $BL5JQ49(B($B8e(B)$BJQ49(B $B5lL>(B FUNC_CNV_MUHEN */ +#define FUNC_MENU_DIC 0x10 /*@ $BJQ49<-=q@ZBXA*Br%a%K%e!<(B */ +#define FUNC_CNV_DIC01 0x11 /*@ $B<-=q#1JQ49(B */ +#define FUNC_CNV_DIC02 0x12 /*@ $B<-=q#2JQ49(B */ +#define FUNC_CNV_DIC03 0x13 /*@ $B<-=q#3JQ49(B */ +#define FUNC_CNV_DIC04 0x14 /*@ $B<-=q#4JQ49(B */ +#define FUNC_CNV_DIC05 0x15 /*@ $B<-=q#5JQ49(B */ +#define FUNC_CNV_DIC06 0x16 /*@ $B<-=q#6JQ49(B */ +#define FUNC_CNV_DIC07 0x17 /*@ $B<-=q#7JQ49(B */ +#define FUNC_CNV_DIC08 0x18 /*@ $B<-=q#8JQ49(B */ +#define FUNC_CNV_DIC09 0x19 /*@ $B<-=q#9JQ49(B */ +#define FUNC_CNV_DIC10 0x1a /*@ $B<-=q#0JQ49(B */ +#define FUNC_KAKU_BUBUN 0x1b /*@ $BItJ,3NDj(B($BCmL\J8@a$^$G(B) */ +#define FUNC_CANDZ 0x1c /*@ $BA48uJdJQ49(B $B5lL>(B FUNC_CAND_ALL */ +#define FUNC_KAKU_ALL 0x1d /*@ $BA4J83NDj(B */ +#define FUNC_DEL_ALL 0x1e /*@ $BA4J8;z:o=|(B */ +#define FUNC_REPEAT 0x1f /*@ $B3NDj%j%T!<%H(B */ +#define FUNC_UNDO 0x20 /*@ $B3NDj%"%s%I%%(B */ +#define FUNC_KAKU_BUBUNONE 0x21 /*$B!_ItJ,3NDj(B($B@hF,J8@a$N$_(B) <<$BDI2C(B $BHs8x3+(BHN */ +#define FUNC_MENU_ALL 0x22 /*@ ATOK$B%a%K%e!<(B */ +#define FUNC_MENU_MOJI 0x23 /*@ $BF~NOJ8;z(B FUNC_SWTCH_AKOTE */ +#define FUNC_SWTCH_EFIX 0x26 /* $B8GDjF~NO1Q;z=g(B FUNC_SWTCH_EKOTE */ +#define FUNC_SWTCH_KFIX 0x27 /* $B8GDjF~NO%+%?%+%J=g(B FUNC_SWTCH_KKOTE */ +#define FUNC_SWTCH_KUTO 0x28 /* $B6gFIE@%b!<%I@ZBX(B */ +#define FUNC_ONOFF_FIXHIRA 0x29 /*@ $BA43Q$R$i$,$J8GDj(B($B$"(B)ON/OFF $B5lL>(B FUNC_ONOFF_HIRA */ +#define FUNC_ONOFF_FIXZKATA 0x2a /*@ $BA43Q%+%?%+%J8GDj(B($B%"(B)ON/OFF $B5lL>(B FUNC_ONOFF_ZKANA */ +#define FUNC_ONOFF_FIXHKATA 0x2b /*@ $BH>3Q%+%?%+%J8GDj(B($B%"(B)ON/OFF $B5lL>(B FUNC_ONOFF_HKANA */ +#define FUNC_ONOFF_FIXZMUHEN 0x2c /*@ $BL5JQ49A43Q8GDj(B($B#A(B)ON/OFF $B5lL>(B FUNC_ONOFF_MUHEN */ +#define FUNC_ONOFF_FIXHMUHEN 0x2d /*@ $BL5JQ49H>3Q8GDj(B(A)ON/OFF $B5lL>(B FUNC_ONOFF_HAN */ +#define FUNC_ONOFF_EIJI 0x2e /*@ $B1Q;zF~NO(BON/OFF */ +#define FUNC_CHR_ERRYOMI 0x2f /*@ $BF~NOFI$_8m$j0LCV%8%c%s%W(B */ +#define FUNC_KAKU_HEAD 0x30 /*@ $B#1J8;z3NDj(B($BJ8F,(B) $B5lL>(B FUNC_OUT_HEAD */ +#define FUNC_KAKU_TAIL 0x31 /*@ $B#1J8;z3NDj(B($BJ8Kv(B) $B5lL>(B FUNC_OUT_TAIL */ +#define FUNC_CNV_CANCL 0x32 /*@ $BJQ49C(B($BCmL\J8@a0J9_(B) */ +#define FUNC_CNV_CANCLALL 0x33 /*@ $BA4JQ49C(B */ +#define FUNC_KUGI_RIGHT 0x34 /*@ $BJ8@a6h@Z$j(B($B#1J8;z1&(B) $B5lL>(B FUNC_FOCUS_RIGHT */ +#define FUNC_KUGI_LEFT 0x35 /*@ $BJ8@a6h@Z$j(B($B#1J8;z:8(B) $B5lL>(B FUNC_FOCUS_LEFT */ +#define FUNC_BST_NEXT 0x36 /*@ $BJ8@a0\F0(B($B1&(B) $B5lL>(B FUNC_FOCUS_NEXT */ +#define FUNC_BST_PREV 0x37 /*@ $BJ8@a0\F0(B($B:8(B) $B5lL>(B FUNC_FOCUS_PREV */ +#define FUNC_BST_TAIL 0x38 /*@ $BJ8@a0\F0(B($B:G=*(B) $B5lL>(B FUNC_FOCUS_TAIL */ +#define FUNC_BST_HEAD 0x39 /*@ $BJ8@a0\F0(B($B@hF,(B) $B5lL>(B FUNC_FOCUS_HEAD */ +#define FUNC_TAN_DEL 0x3a /*@ $BC18l:o=|(B */ +/* 0x3b $B3HD%MQ(B <<$B:o=|(B FUNC_CAND_NEXT $B(B FUNC_CNV_PGNEXT */ +#define FUNC_CAND_PGPREV 0x3f /* $BA08uJd72I=<((B $B5lL>(B FUNC_CNV_PGPREV */ +#define FUNC_SWTCH_ZORH 0x40 /* $BA43Q!?H>3QJ8;z@ZBX(B */ +#define FUNC_TAN_TOROKU 0x41 /*@ $BC18lEPO?(B */ +/* 0x42 $B3HD%MQ(B */ +#define FUNC_SWTCH_OKRI 0x43 /* $BAw$j$,$J%b!<%I=g(B FUNC_TO_KC_HIRA */ +#define FUNC_TO_KCIZKATA 0x4a /*@ $BF~NOJ8;z(B FUNC_TO_KC_ZKANA */ +#define FUNC_TO_KCIHKATA 0x4b /*@ $BF~NOJ8;z3Q%+%?%+%J(B($B%"(B) $B5lL>(B FUNC_TO_KC_HKANA */ +#define FUNC_TO_KCIZMUHEN 0x4c /*@ $BF~NOJ8;z(B FUNC_TO_KC_MUHEN */ +#define FUNC_TO_KCIHMUHEN 0x4d /*@ $BF~NOJ8;z3Q(B(A) $B5lL>(B FUNC_TO_KC_HAN */ +#define FUNC_TO_DIC 0x4e /*@ $B<-=q!&3X=,JQ99(B */ +#define FUNC_SWTCH_KOUGO 0x4f /* $B8}8lBN%b!<%I@ZBX(B */ +#define FUNC_MENU_KOUGO 0x50 /*@ $B8}8lBN%b!<%IA*Br%a%K%e!<(B */ +#define FUNC_MENU_ROMA 0x51 /*@ $B4A;zF~NO%b!<%IA*Br%a%K%e!<(B */ +#define FUNC_MENU_HEN 0x52 /*@ $BJQ49%b!<%IA*Br%a%K%e!<(B */ +/* 0x53 $B3HD%MQ(B */ +#define FUNC_MENU_OKRI 0x54 /*@ $BAw$j$,$JA*Br%a%K%e!<(B */ +#define FUNC_MENU_COMP 0x55 /*$B!_(BATOK$BL$3NDjJ8;z%a%K%e!<(B */ +#define FUNC_MENU_CAND 0x56 /*$B!_(BATOK$B8uJd%a%K%e!<(B */ +#define FUNC_CHG_KANHAN 0x57 /* $B4A;z!?H>3Q%b!<%I@ZBX(B */ +#define FUNC_MENU_IM 0x58 /*@ $BF~NO%b!<%IA*Br%a%K%e!<(B */ +#define FUNC_ONOFF_ATOK 0x59 /* ATOK ON/OFF <<$B8x3+I|3h(B */ +#define FUNC_SWTCH_IM 0x5a /* $BF~NO%b!<%I=g3Q%b!<%IA*Br%a%K%e!<(B */ +#define FUNC_MENU_KCODE 0x67 /* $B%3!<%IBN7OA*Br%a%K%e!<(B */ +#define FUNC_MENU_GUIDE 0x68 /*$B!_(BATOK$B%,%$%I%a%K%e!<(B */ +/* 0x69 $B3HD%MQ(B <<$B:o=|(B FUNC_CNV_CODE $B%3!<%IJQ49(B */ +#define FUNC_SWTCH_KCODE 0x6a /* $B%3!<%IBN7O=g3Q%b!<%I=g(B FUNC_KOHOATR_NEXT */ +#define FUNC_CAND_PREVATR 0x77 /* $BA08uJdB0@-%8%c%s%W(B $B5lL>(B FUNC_KOHOATR_PREV */ +#define FUNC_CNV_ACNV 0x78 /* $B=g(B FUNC_CNV_AATHN */ +#define FUNC_CNV_ECNV 0x79 /* $B=g(B FUNC_CNV_EATHN */ +#define FUNC_CNV_KCNV 0x7a /* $B=g(B FUNC_CNV_KATHN */ +#define FUNC_KUGI_ROMARIGHT 0x7b /*@ $B%m!<%^;z6h@Z$jD>$7(B($B1&(B) $B5lL>(B FUNC_CHG_RMADJUST_R */ +#define FUNC_KUGI_ROMALEFT 0x7c /*@ $B%m!<%^;z6h@Z$jD>$7(B($B:8(B) $B5lL>(B FUNC_CHG_RMADJUST_L */ +/* 0x7d $B3HD%MQ(B <<$B:o=|(B FUNC_DECIDEONE $BJQ49J8@a#1J8;z3NDj(B */ +/* 0x7e $B3HD%MQ(B <<$B:o=|(B FUNC_DESTRUCTONE $BJQ49J8@a#1J8;z>C5n(B */ +#define FUNC_CNVREAD_AORK 0x7f /* $B1Q;zFI$_%+%JFI$_=gC$7$FA4J8;z:o=|(B */ +#define FUNC_SWTCH_HIRAKATAEI 0x83 /* $BJ8;z(B FUNC_MENU_VARI */ +#define FUNC_AMET01 0x91 /*@ $B#A#M#E#T#1(B $B5lL>(B FUNC_OUT_VARI01 */ +#define FUNC_AMET02 0x92 /*@ $B#A#M#E#T#2(B $B5lL>(B FUNC_OUT_VARI02 */ +#define FUNC_AMET03 0x93 /*@ $B#A#M#E#T#3(B $B5lL>(B FUNC_OUT_VARI03 */ +#define FUNC_AMET04 0x94 /*@ $B#A#M#E#T#4(B $B5lL>(B FUNC_OUT_VARI04 */ +#define FUNC_AMET05 0x95 /*@ $B#A#M#E#T#5(B $B5lL>(B FUNC_OUT_VARI05 */ +#define FUNC_AMET06 0x96 /*@ $B#A#M#E#T#6(B $B5lL>(B FUNC_OUT_VARI06 */ +#define FUNC_AMET07 0x97 /*@ $B#A#M#E#T#7(B $B5lL>(B FUNC_OUT_VARI07 */ +#define FUNC_AMET08 0x98 /*@ $B#A#M#E#T#8(B $B5lL>(B FUNC_OUT_VARI08 */ +#define FUNC_AMET09 0x99 /*@ $B#A#M#E#T#9(B $B5lL>(B FUNC_OUT_VARI09 */ +#define FUNC_AMET10 0x9a /*@ $B#A#M#E#T#0(B $B5lL>(B FUNC_OUT_VARI10 */ +/* 0x9b $B3HD%MQ(B */ +/* 0x9c $B3HD%MQ(B */ +/* #define FUNC_CNV_FUKUGO 0x9d /* $BJ#9g8lJQ49(B <<$BDI2CHyL/(B*/ +#define FUNC_CNV_ABBREV 0x9e /*@@$B>JF~NOJQ49(B <<$BDI2C(BHN */ +#define FUNC_CNV_UNDO 0x9f /*@@$B:FJQ49(B <<$BDI2C(B */ +#define FUNC_TO_KANJ 0xa0 /* $B4A;z%b!<%I(B */ +#define FUNC_TO_HAN 0xa1 /* $BH>3Q%b!<%I(B */ +#define FUNC_TO_CODE 0xa2 /* $B%3!<%IF~NO%b!<%I(B */ +#define FUNC_TO_KIGO 0xa3 /* $B5-9f%b!<%I(B */ +/* 0xa4 $B3HD%MQ(B */ +#define FUNC_ON_KANALK 0xa5 /* $B%+%J%m%C%/(BON */ +#define FUNC_OFF_KANALK 0xa6 /* $B%+%J%m%C%/(BOFF */ +#define FUNC_ONOFF_KANALK 0xa7 /* $B%+%J%m%C%/(BONOFF */ +#define FUNC_CANDZ_NEXT 0xa8 /* $BA48uJd(B FUNC_CAND_LNNEXT */ +#define FUNC_CANDZ_LNPREV 0xac /* $BA48uJdA09T9`L\0\F0(B $B5lL>(B FUNC_CAND_LNPREV */ +#define FUNC_CANDZ_KAKU 0xad /* $BA48uJd9`L\A*Br3NDj(B $B5lL>(B FUNC_CAND_KAKU */ +#define FUNC_CANDZ_ESC 0xae /* $BA48uJd9`L\A*BrC(B $B5lL>(B FUNC_CAND_ESC */ +#define FUNC_CAND_TAIL 0xaf /* $B8uJd0\F0(B($B:G=*(B) <<$BDI2C(B */ +#define FUNC_APLEXEC_STARTNO 0xb0 /* $B%"%W%j5/F04X783+;O(BNO. */ +/* #define FUNC_HELPEXEC 0xb0 /*@ $B%X%k%W5/F0(B */ +#define FUNC_MENU_HELP 0xb0 /*@ $B%X%k%W%a%K%e!<5/F0(B */ +/* $BK\Mh!"5/F07O$G$J$$$,%9%?%$%k%3%s%P!<%H$J$I$N8_49@-$N0Y$K$3$3$KF~$l$k(B */ +/* 0xb1 $B3HD%MQ(B <<$B:o=|(B FUNC_ICONEXEC $B:G>.2=(B */ +#define FUNC_ATUTEXEC 0xb2 /*@ ATOK$B%W%m%Q%F%#5/F0(B */ +#define FUNC_UTEXEC 0xb3 /*@ $B<-=q%f!<%F%#%j%F%#5/F0(B */ +#define FUNC_MJPLEXEC 0xb4 /*@ $BJ8;z%Q%l%C%H5/F0(B */ +/* 0xb5 /* $B3HD%MQ(B <<$B:o=|(B FUNC_OPPLEXEC $BA`:n%Q%l%C%H(B */ +#define FUNC_SOFTKEYBOARD 0xb6 /*@ $B%/%j%C%/%Q%l%C%H(B */ +#define FUNC_RESULTRECORD 0xb7 /*@ $BJ8;zNs%\%C%/%95/F0(B */ +#define FUNC_FUNCKEYGUIDE 0xb8 /*@@$B%U%!%s%/%7%g%s%-!<%,%$%I(B */ +#define FUNC_HELPTOPICEXEC 0xb9 /*$B!_%X%k%W%H%T%C%/5/F0(B */ +#define FUNC_HELPWEBEXEC 0xba /*$B!_(BWeb$B%X%k%W5/F0(B */ +#define FUNC_VERINFOEXEC 0xbb /*$B!_%P!<%8%g%s>pJs5/F0(B */ + +#define FUNC_APLEXEC_ENDNO 0xbb /* $B%"%W%j5/F04X78=*N;(BNO */ +/* 0xbc $B3HD%MQ(B */ +/* 0xbd $B3HD%MQ(B */ +/* 0xbe $B3HD%MQ(B */ +/* 0xbf $B3HD%MQ(B */ +/* 0xc0 $B3HD%MQ(B */ +/* 0xc1 $B3HD%MQ(B */ +/* 0xc2 $B3HD%MQ(B */ +/* 0xc3 $B3HD%MQ(B */ +/* 0xc4 $B3HD%MQ(B */ +/* 0xc5 $B3HD%MQ(B */ +/* 0xc6 $B3HD%MQ(B */ +/* 0xc7 $B3HD%MQ(B */ +/* 0xc8 $B3HD%MQ(B */ +/* 0xc9 $B3HD%MQ(B */ +/* 0xca $B3HD%MQ(B */ +/* 0xcb $B3HD%MQ(B */ +/* 0xcc $B3HD%MQ(B */ +/* 0xcd $B3HD%MQ(B */ +/* 0xce $B3HD%MQ(B */ +/* 0xcf $B3HD%MQ(B */ +/* 0xd0 $B3HD%MQ(B */ +/* 0xd1 $B3HD%MQ(B */ +/* 0xd2 $B3HD%MQ(B */ +/* 0xd3 $B3HD%MQ(B */ +/* 0xd4 $B3HD%MQ(B */ +/* 0xd5 $B3HD%MQ(B */ +/* 0xd6 $B3HD%MQ(B */ +/* 0xd7 $B3HD%MQ(B */ +/* 0xd8 $B3HD%MQ(B */ +/* 0xd9 $B3HD%MQ(B */ +/* 0xda $B3HD%MQ(B */ +/* 0xdb $B3HD%MQ(B */ +/* 0xdc $B3HD%MQ(B */ +/* 0xdd $B3HD%MQ(B */ +/* 0xde $B3HD%MQ(B */ +/* 0xdf $B3HD%MQ(B */ +/*--------------------------------------------------------------------*/ +/* $B0J2<$O!"(BATOK$BFbIt2>A[5!G=%-!uBVDj5A(B */ +/*===========================================================================*/ +/* + $B%+%9%?%^%$%65!G=%-!uBV$O(B + $B4A(B1 : $BJ8;zL$F~NO(B $BH>(B : $BH>3QF~NO(B + $B4A(B2 : $BJ8;zF~NOCf(B $B5-(B : $B5-9fF~NO(B + $B4A(B3 : $BJQ49Cf(B + $B4A(B4 : $BuBV$O$J$$(B ($BJ8@a=$@5Cf>uBV$O$J$$(B + $B4A(B5 : $BA48uJdI=<(Cf(B $B%3(B1 : $B4A(B1,$B5-$N%5%V%;%C%H(B $B4A(B1$B$H$7$F07$&(B) + $B4A(B6 : $BJ8@a6h@Z$jD>$7Cf(B $B%3(B2 : $B4A(B2$B$N%5%V%;%C%H(B) + $B$NAH$_9g$o$;$GDj5A$5$l$k(B +*/ +#define FNG_NONE 0x0000 /* $B>uBV$J$7(B : 0$B8GDjCM(B */ +#define FNG_KANNONE 0x0001 /* $B4A(B1 : $BJ8;zL$F~NO(B */ +#define FNG_KANINPUT 0x0002 /* $B4A(B2 : $BJ8;zF~NOCf(B */ +#define FNG_KANHENKAN 0x0004 /* $B4A(B3 : $BJQ49Cf(B */ +#define FNG_KANKOHO 0x0008 /* $B4A(B4 : $B$7Cf(B */ +#define FNG_HAN 0x4000 /* $BH>(B : $BH>3QF~NO(B */ +#define FNG_KIGOU 0x8000 /* $B5-(B : $B5-9fF~NO(B */ +/* + $B"(Cm0U(B $B%+%9%?%^%$%6>uBVDj5A$NHO0O$O(B0x0001$B!A(B0x8000$B$H$9$k!#(B + ATOK$BFbIt>uBVDj5A$NHO0O$O(B0x00010000$B!A(B0x80000000$B$H$9$k!#(B +*/ +#define FNG_NEUTRAL (FNG_KANNONE | FNG_HAN | FNG_KIGOU) +#define FNG_KANALLMIGHTY (FNG_KANNONE | FNG_KANINPUT | FNG_KANHENKAN | FNG_KANKOHO | FNG_KANZKOHO | FNG_KANKUGIRI) +#define FNG_ALLMIGHTY (FNG_KANALLMIGHTY | FNG_HAN | FNG_KIGOU) +#define FNG_KANALLINPUT (FNG_KANNONE | FNG_KANINPUT ) +#define FNG_KANSTOCK (FNG_KANINPUT | FNG_KANHENKAN | FNG_KANKOHO | FNG_KANZKOHO | FNG_KANKUGIRI) +#define FNG_KANSTOCK234 (FNG_KANINPUT | FNG_KANHENKAN | FNG_KANKOHO ) +#define FNG_KANSTOCK2346 (FNG_KANINPUT | FNG_KANHENKAN | FNG_KANKOHO | FNG_KANKUGIRI) +#define FNG_KANSTOCK236 (FNG_KANINPUT | FNG_KANHENKAN | FNG_KANKUGIRI) +#define FNG_KANSTOCK34 (FNG_KANHENKAN | FNG_KANKOHO) +#define FNG_KANSTOCK345 (FNG_KANHENKAN | FNG_KANKOHO | FNG_KANZKOHO) +#define FNG_KANSTOCK346 (FNG_KANHENKAN | FNG_KANKOHO | FNG_KANKUGIRI) +#define FNG_KANSTOCK3456 (FNG_KANHENKAN | FNG_KANKOHO | FNG_KANZKOHO | FNG_KANKUGIRI) +#define FNG_KANKOHOCMN (FNG_KANKOHO | FNG_KANZKOHO) +/* +#define FNG_KANUNDO (FNG_KANNONE | FNG_KANINPUT | FNG_KANHENKAN) +#define FNG_KANUNDOTOGGLE (FNG_KANNONE | FNG_KANINPUT | FNG_KANHENKAN | FNG_KANKOHO | FNG_KANKUGIRI) +*/ + +/*===========================================================================*/ +/* ATOKCE$BFbIt>uBVDj5A(B $B%+%9%?%^%$%6$K$O4X78$J$$ItJ,(B $B$3$3$+$i(B */ +/*===========================================================================*/ + +/* + ATOK$B%(%s%8%sFbIt5!G=%-!uBV$O%+%9%?%^%$%6>uBV$K2C$($F0J2<$N>uBV$,$"$k!#(B + $B$3$N>uBV$O%+%9%?%^%$%6$K$OL54X78!#(B +*/ +/* $B"(2<5-$rJQ99$9$k>l9g$O!"(Batok12ce.rc$B$N(BFNGR_xxx$B$bJQ99$9$kI,MW$"$j!#(B*/ +#define FNG_ATOKOFF 0x00100000 /* OFF : $B4A;z(BOFF $B!J%-!<$O!"FCJL=hM}!K(B*/ +#define FNG_CODENONE 0x00010000 /* $B%3(B1 : $B%3!<%IL$F~NO(B $B!J%-!<$O!"4A(B1($BJ8;zL$F~NO(B)$B>uBV$G;2>H!K(B*/ +#define FNG_CODEINPUT 0x00020000 /* $B%3(B2 : $B%3!<%IF~NOCf(B $B!J%-!<$O!"4A(B2($BJ8;zF~NOCf(B)$B>uBV$G;2>H!K(B*/ +#define FNG_BUSYU 0x00040000 /* $BIt(B : $BItuBV$G;2>H!K(B*/ +#define FNG_TANDEL 0x00200000 /* $B:o(B : $BC18l:o=|Cf(B $B!J%-!<$O!"4A(B3($BJQ49Cf(B) $B>uBV$G;2>H!K(B*/ +#define FNGSP_CHGINPUT 0x10000000 /* $BF~NO%b!<%I(B(rot)$BJQ99$K4X$o$k5!G=(B($BFCJL(B)*/ +#define FNGSP_AMET 0x20000000 /* AMET$B5/F05!G=(B($BFCJL(B)*/ +/* + $B"(%+%9%?%^%$%6>uBVDj5A$NHO0O$O(B0x0001$B!A(B0x8000$B$H$9$k!#(B + ATOK$BFbIt>uBVDj5A$NHO0O$O(B0x00010000$B!A(B0x80000000$B$H$9$k!#(B +*/ + + +/*===========================================================================*/ +/* ATOK$B%(%s%8%sF~NO%-!<%3!<%IDj5A(B(AAJ$B%-!<%3!<%II=(B) */ +/*===========================================================================*/ +/*****************************************************************************/ +/* AAJ$B%-!<%3!<%II=(B($B3HD%%$%Y%s%HDj5A(B) */ +/*****************************************************************************/ +#define BUTTONEVENT 0x7ffa /* Mouse Event*/ +#define KANJIINPUTEVENT 0x7ffb /* $B4A;z%3!<%IF~NO(B Event*/ +/* + AAJ$B%3!<%I$NDj5A$,(B2$B%P%$%H$N9=@.$G$"$k$?$a!">u67$K$h$j(BAAJ$B3HD%%(%j%"$r;HMQ$9$k(B + 1.$B3HD%(B1 .AtCEIncode($BF~NO%-!<%3!<%I(B)$B$NCM$,(BBUTTONEVENT$B$N>l9g(B + $B%^%&%9A`:n%$%Y%s%H$H2rH$9$k!#(B(MSE_DEF.H$B;2>H(B) + .AtCEInMouseMsg ($BF~NO%^%&%9%a%C%;!<%8%?%$%W(B) + .AtCEInWndNo ($BF~NO%^%&%9%a%C%;!<%8H/@8%&%$%s%I%&(B) + .AtCEInEventPosX ($BF~NO%^%&%9%a%C%;!<%8H/@8J8;z0LCV(B 1$B!A(B) + .AtCEInEventPosY ($BF~NO%^%&%9%a%C%;!<%8H/@8J8;z0LCVJdB-(B 0/1 $BA0H>(B/$B8eH>(B) + 2.$B3HD%(B2 .AtCEIncode($BF~NO%-!<%3!<%I(B)$B$NCM$,(BKANJIINPUTEVENT$B$N>l9g(B + UCS2$BJ8;zF~NO%$%Y%s%H$H2rH$9$k!#(B + .AtCEInkanjicode ($BF~NO%-!<%3!<%I(B(UCS2$BJ8;z%3!<%I(B)) + + $B0J30$O(BAAJ$B%-!<%3!<%ICM$,@_Dj$5$l$k!#(B(KEY_DEF.H$B;2>H(B) + [AAJ$B%3!<%I(B] + NKEY $BL58z%-!A[%-!A[J8;zHV9f(B) $B2>A[%-!uBV(Bbit) + | | | + | | |__________________ CTRL (Ctrl$B>uBV(B bit) + | |______________________ ALT (Alt$B>uBV(B bit) + |__________________________ CAPS (CAPS$B>uBV(B bit) +*/ + +/*****************************************************************************/ +/* AAJ$B%-!<%3!<%II=(B($B@)8f(Bbit$BDj5A(B) */ +/*****************************************************************************/ +#define NKEY 0xffff /* $BL58z%-!<%3!<%IDj5A(B*/ +#define VKEY 0x0300 /* 0x03xx $B2>A[5!G=%-!<%3!<%I(Bbit*/ +#define VKEY_H 0x03 /* 0x03xx $B2>A[5!G=%-!<%3!<%I(Bbit*/ +#define FNCKEY 0x0100 /* $B5!G=%-!<(Bbit*/ +#define TENKEY 0x0200 /* $B%F%s%-!<(Bbit*/ +#define SHIFT 0x0400 /* Shift$B>uBV(Bbit*/ +#define VMOJIKEY 0x0a00 /* 0x0axx $B2>A[J8;z%-!<%3!<%I(Bbit*/ +#define VMOJIKEY_H 0x0a /* 0x0axx $B2>A[J8;z%-!<%3!<%I(Bbit*/ +#define CTRL 0x1000 /* Ctrl$B>uBV(Bbit*/ +#define ALT 0x2000 /* Alt$B>uBV(B bit*/ +#define GRPH ALT /* "*/ +#define CAPS 0x4000 /* CAPS$B>uBV(B bit*/ + +#define NOTMOJIKEY_MASK (FNCKEY|CTRL|ALT) /*$BJ8;z%-!A[5!G=%-!A[J8;z%-!<%3!<%IH=DjMQ(BMask*/ + +/************************************************************************/ +/* AAJ$B%-!<%3!<%II=(B($BJ*M}%-!<%3!<%ICMDj5A(B) */ +/************************************************************************/ +#define SPACE 0x0020 /* Space */ +#define BS (FNCKEY|0x0008) /* BackSpace */ +#define TAB (FNCKEY|0x0009) /* Tab */ +#define CR (FNCKEY|0x000d) /* Enter */ +#define EESC (FNCKEY|0x001b) /* Esc */ +#define F1 (FNCKEY|0x0021) /* F1 $B!A(B F20 */ +#define F2 (FNCKEY|0x0022) /**/ +#define F3 (FNCKEY|0x0023) /**/ +#define F4 (FNCKEY|0x0024) /**/ +#define F5 (FNCKEY|0x0025) /**/ +#define F6 (FNCKEY|0x0026) /**/ +#define F7 (FNCKEY|0x0027) /**/ +#define F8 (FNCKEY|0x0028) /**/ +#define F9 (FNCKEY|0x0029) /**/ +#define F10 (FNCKEY|0x002A) /**/ +#define F11 (FNCKEY|0x002B) /**/ +#define F12 (FNCKEY|0x002C) /**/ +#define F13 (FNCKEY|0x002D) /**/ +#define F14 (FNCKEY|0x002E) /**/ +#define F15 (FNCKEY|0x002F) /**/ +#define F16 (FNCKEY|0x0030) /**/ +#define F17 (FNCKEY|0x0031) /**/ +#define F18 (FNCKEY|0x0032) /**/ +#define F19 (FNCKEY|0x0033) /**/ +#define F20 (FNCKEY|0x0034) /**/ +/*#define JIKKO (FNCKEY|0x0046) /* $BC(B */ +#define EEND (FNCKEY|0x004f) /* End */ +#define HIRAGANA (FNCKEY|0x0050) /* $B$R$i$,$J(B */ +#define KATAKANA (FNCKEY|0x0051) /* $B%+%?%+%J(B */ +#define EIJI (FNCKEY|0x0052) /* $B1Q?t(B */ +#define ZORH (FNCKEY|0x0053) /* $BA43Q!&H>3Q(B */ +#define ROMA (FNCKEY|0x0054) /* $B%m!<%^;z(B<< */ +/*#define LWIN (FNCKEY|0x005a) /* Windows(Left) */ +/*#define RWIN (FNCKEY|0x005b) /* Windows(Right) */ +/*#define APPS (FNCKEY|0x005c) /* Application */ +#define XFER (FNCKEY|0x0060) /* $BJQ49(B */ +#define PGDN (FNCKEY|0x0061) /* PageDown */ +#define RLUP PGDN /* " */ +#define PGUP (FNCKEY|0x0062) /* PageUp */ +#define RLDN PGUP /* " */ +#define INS (FNCKEY|0x0063) /* Insert */ +#define DEL (FNCKEY|0x0064) /* Delete */ +#define UP (FNCKEY|0x0065) /* $B",(B */ +#define LEFT (FNCKEY|0x0066) /* $B"+(B */ +#define RIGHT (FNCKEY|0x0067) /* $B"*(B */ +#define DOWN (FNCKEY|0x0068) /* $B"-(B */ +#define HOME (FNCKEY|0x0069) /* Home */ +#define HELP (FNCKEY|0x006a) /* Help */ +#define NFER (FNCKEY|0x006b) /* $BL5JQ49(B */ +#define KANJ (FNCKEY|0x006c) /* $B4A;z(B */ + +#define SFT_SP (SHIFT+SPACE) +#define SFT_BS (SHIFT+BS) +#define SFT_TAB (SHIFT+TAB) +#define SFT_CR (SHIFT+CR) +#define SFT_ESC (SHIFT+EESC) +#define SFT_F1 (SHIFT+F1) +#define SFT_F2 (SHIFT+F2) +#define SFT_F3 (SHIFT+F3) +#define SFT_F4 (SHIFT+F4) +#define SFT_F5 (SHIFT+F5) +#define SFT_F6 (SHIFT+F6) +#define SFT_F7 (SHIFT+F7) +#define SFT_F8 (SHIFT+F8) +#define SFT_F9 (SHIFT+F9) +#define SFT_F10 (SHIFT+F10) +#define SFT_F11 (SHIFT+F11) +#define SFT_F12 (SHIFT+F12) +#define SFT_F13 (SHIFT+F13) +#define SFT_F14 (SHIFT+F14) +#define SFT_F15 (SHIFT+F15) +#define SFT_F16 (SHIFT+F16) +#define SFT_F17 (SHIFT+F17) +#define SFT_F18 (SHIFT+F18) +#define SFT_F19 (SHIFT+F19) +#define SFT_F20 (SHIFT+F20) +/*#define SFT_JIKKO (SHIFT+JIKKO) */ +/*#define SFT_CLEAR (SHIFT+CLEAR) */ +/*#define SFT_SHURYOU (SHIFT+SHURYOU) */ +/*#define SFT_TORIKESI (SHIFT+TORIKESI)*/ +#define SFT_EEND (SHIFT+EEND) +/*#define SFT_HIRAGANA (SHIFT+HIRAGANA)*/ +/*#define SFT_KATAKANA (SHIFT+KATAKANA)*/ +/*#define SFT_EIJI (SHIFT+EIJI) */ +/*#define SFT_ZORH (SHIFT+ZORH) */ +/*#define SFT_ROMA (SHIFT+ROMA) */ +/*#define SFT_LWIN (SHIFT+LWIN) */ +/*#define SFT_RWIN (SHIFT+RWIN) */ +/*#define SFT_APPS (SHIFT+APPS) */ +#define SFT_XFER (SHIFT+XFER) +#define SFT_PGDN (SHIFT+PGDN) +#define SFT_RLUP SFT_PGDN +#define SFT_PGUP (SHIFT+PGUP) +#define SFT_RLDN SFT_PGUP +#define SFT_INS (SHIFT+INS) +#define SFT_DEL (SHIFT+DEL) +#define SFT_UP (SHIFT+UP) +#define SFT_LEFT (SHIFT+LEFT) +#define SFT_RIGHT (SHIFT+RIGHT) +#define SFT_DOWN (SHIFT+DOWN) +#define SFT_HOME (SHIFT+HOME) +#define SFT_HELP (SHIFT+HELP) +#define SFT_NFER (SHIFT+NFER) +#define SFT_KANJ (SHIFT+KANJ) + +#define CTR_SP (CTRL+SPACE) +#define CTR_BS (CTRL+BS) +#define CTR_TAB (CTRL+TAB) +#define CTR_CR (CTRL+CR) +#define CTR_ESC (CTRL+EESC) +#define CTR_F1 (CTRL+F1) +#define CTR_F2 (CTRL+F2) +#define CTR_F3 (CTRL+F3) +#define CTR_F4 (CTRL+F4) +#define CTR_F5 (CTRL+F5) +#define CTR_F6 (CTRL+F6) +#define CTR_F7 (CTRL+F7) +#define CTR_F8 (CTRL+F8) +#define CTR_F9 (CTRL+F9) +#define CTR_F10 (CTRL+F10) +#define CTR_F11 (CTRL+F11) +#define CTR_F12 (CTRL+F12) +#define CTR_F13 (CTRL+F13) +#define CTR_F14 (CTRL+F14) +#define CTR_F15 (CTRL+F15) +#define CTR_F16 (CTRL+F16) +#define CTR_F17 (CTRL+F17) +#define CTR_F18 (CTRL+F18) +#define CTR_F19 (CTRL+F19) +#define CTR_F20 (CTRL+F20) +/*#define CTR_JIKKO (CTRL+JIKKO) */ +/*#define CTR_CLEAR (CTRL+CLEAR) */ +/*#define CTR_SHURYOU (CTRL+SHURYOU) */ +/*#define CTR_TORIKESI (CTRL+TORIKESI) */ +#define CTR_EEND (CTRL+EEND) +/*#define CTR_HIRAGANA (CTRL+HIRAGANA) */ +/*#define CTR_KATAKANA (CTRL+KATAKANA) */ +/*#define CTR_EIJI (CTRL+EIJI) */ +/*#define CTR_ZORH (CTRL+ZORH) */ +/*#define CTR_ROMA (CTRL+ROMA) */ +/*#define CTR_LWIN (CTRL+LWIN) */ +/*#define CTR_RWIN (CTRL+RWIN) */ +/*#define CTR_APPS (CTRL+APPS) */ +#define CTR_XFER (CTRL+XFER) +#define CTR_PGDN (CTRL+PGDN) +#define CTR_RLUP CTR_PGDN +#define CTR_PGUP (CTRL+PGUP) +#define CTR_RLDN CTR_PGUP +#define CTR_INS (CTRL+INS) +#define CTR_DEL (CTRL+DEL) +#define CTR_UP (CTRL+UP) +#define CTR_LEFT (CTRL+LEFT) +#define CTR_RIGHT (CTRL+RIGHT) +#define CTR_DOWN (CTRL+DOWN) +#define CTR_HOME (CTRL+HOME) +#define CTR_HELP (CTRL+HELP) +#define CTR_NFER (CTRL+NFER) +#define CTR_KANJ (CTRL+KANJ) + +#define CTRSFT_SP (CTRL+SHIFT+SPACE) +#define CTRSFT_BS (CTRL+SHIFT+BS) +#define CTRSFT_TAB (CTRL+SHIFT+TAB) +#define CTRSFT_CR (CTRL+SHIFT+CR) +#define CTRSFT_ESC (CTRL+SHIFT+EESC) +#define CTRSFT_F1 (CTRL+SHIFT+F1) +#define CTRSFT_F2 (CTRL+SHIFT+F2) +#define CTRSFT_F3 (CTRL+SHIFT+F3) +#define CTRSFT_F4 (CTRL+SHIFT+F4) +#define CTRSFT_F5 (CTRL+SHIFT+F5) +#define CTRSFT_F6 (CTRL+SHIFT+F6) +#define CTRSFT_F7 (CTRL+SHIFT+F7) +#define CTRSFT_F8 (CTRL+SHIFT+F8) +#define CTRSFT_F9 (CTRL+SHIFT+F9) +#define CTRSFT_F10 (CTRL+SHIFT+F10) +#define CTRSFT_F11 (CTRL+SHIFT+F11) +#define CTRSFT_F12 (CTRL+SHIFT+F12) +#define CTRSFT_F13 (CTRL+SHIFT+F13) +#define CTRSFT_F14 (CTRL+SHIFT+F14) +#define CTRSFT_F15 (CTRL+SHIFT+F15) +#define CTRSFT_F16 (CTRL+SHIFT+F16) +#define CTRSFT_F17 (CTRL+SHIFT+F17) +#define CTRSFT_F18 (CTRL+SHIFT+F18) +#define CTRSFT_F19 (CTRL+SHIFT+F19) +#define CTRSFT_F20 (CTRL+SHIFT+F20) +/*#define CTRSFT_JIKKO (CTRL+SHIFT+JIKKO) */ +/*#define CTRSFT_CLEAR (CTRL+SHIFT+CLEAR) */ +/*#define CTRSFT_SHURYOU (CTRL+SHIFT+SHURYOU) */ +/*#define CTRSFT_TORIKESI (CTRL+SHIFT+TORIKESI) */ +#define CTRSFT_EEND (CTRL+SHIFT+EEND) +/*#define CTRSFT_HIRAGANA (CTRL+SHIFT+HIRAGANA) */ +/*#define CTRSFT_KATAKANA (CTRL+SHIFT+KATAKANA) */ +/*#define CTRSFT_EIJI (CTRL+SHIFT+EIJI) */ +/*#define CTRSFT_ZORH (CTRL+SHIFT+ZORH) */ +/*#define CTRSFT_ROMA (CTRL+SHIFT+ROMA) */ +/*#define CTRSFT_LWIN (CTRL+SHIFT+LWIN) */ +/*#define CTRSFT_RWIN (CTRL+SHIFT+RWIN) */ +/*#define CTRSFT_APPS (CTRL+SHIFT+APPS) */ +#define CTRSFT_XFER (CTRL+SHIFT+XFER) +#define CTRSFT_PGDN (CTRL+SHIFT+PGDN) +#define CTRSFT_RLUP CTRSFT_PGDN +#define CTRSFT_PGUP (CTRL+SHIFT+PGUP) +#define CTRSFT_RLDN CTRSFT_PGUP +#define CTRSFT_INS (CTRL+SHIFT+INS) +#define CTRSFT_DEL (CTRL+SHIFT+DEL) +#define CTRSFT_UP (CTRL+SHIFT+UP) +#define CTRSFT_LEFT (CTRL+SHIFT+LEFT) +#define CTRSFT_RIGHT (CTRL+SHIFT+RIGHT) +#define CTRSFT_DOWN (CTRL+SHIFT+DOWN) +#define CTRSFT_HOME (CTRL+SHIFT+HOME) +#define CTRSFT_HELP (CTRL+SHIFT+HELP) +#define CTRSFT_NFER (CTRL+SHIFT+NFER) +#define CTRSFT_KANJ (CTRL+SHIFT+KANJ) +#define SFTCTR_SP CTRSFT_SP +#define SFTCTR_BS CTRSFT_BS +#define SFTCTR_TAB CTRSFT_TAB +#define SFTCTR_CR CTRSFT_CR +#define SFTCTR_ESC CTRSFT_ESC +#define SFTCTR_F1 CTRSFT_F1 +#define SFTCTR_F2 CTRSFT_F2 +#define SFTCTR_F3 CTRSFT_F3 +#define SFTCTR_F4 CTRSFT_F4 +#define SFTCTR_F5 CTRSFT_F5 +#define SFTCTR_F6 CTRSFT_F6 +#define SFTCTR_F7 CTRSFT_F7 +#define SFTCTR_F8 CTRSFT_F8 +#define SFTCTR_F9 CTRSFT_F9 +#define SFTCTR_F10 CTRSFT_F10 +#define SFTCTR_F11 CTRSFT_F11 +#define SFTCTR_F12 CTRSFT_F12 +#define SFTCTR_F13 CTRSFT_F13 +#define SFTCTR_F14 CTRSFT_F14 +#define SFTCTR_F15 CTRSFT_F15 +#define SFTCTR_F16 CTRSFT_F16 +#define SFTCTR_F17 CTRSFT_F17 +#define SFTCTR_F18 CTRSFT_F18 +#define SFTCTR_F19 CTRSFT_F19 +#define SFTCTR_F20 CTRSFT_F20 +/*#define SFTCTR_JIKKO CTRSFT_JIKKO */ +/*#define SFTCTR_CLEAR CTRSFT_CLEAR */ +/*#define SFTCTR_SHURYOU CTRSFT_SHURYOU */ +/*#define SFTCTR_TORIKESI CTRSFT_TORIKESI */ +#define SFTCTR_EEND CTRSFT_EEND +/*#define SFTCTR_HIRAGANA CTRSFT_HIRAGANA */ +/*#define SFTCTR_KATAKANA CTRSFT_KATAKANA */ +/*#define SFTCTR_EIJI CTRSFT_EIJI */ +/*#define SFTCTR_ZORH CTRSFT_ZORH */ +/*#define SFTCTR_ROMA CTRSFT_ROMA */ +/*#define SFTCTR_LWIN CTRSFT_LWIN */ +/*#define SFTCTR_RWIN CTRSFT_RWIN */ +/*#define SFTCTR_APPS CTRSFT_APPS */ +#define SFTCTR_XFER CTRSFT_XFER +#define SFTCTR_PGDN CTRSFT_PGDN +#define SFTCTR_RLUP CTRSFT_RLUP +#define SFTCTR_PGUP CTRSFT_PGUP +#define SFTCTR_RLDN CTRSFT_RLDN +#define SFTCTR_INS CTRSFT_INS +#define SFTCTR_DEL CTRSFT_DEL +#define SFTCTR_UP CTRSFT_UP +#define SFTCTR_LEFT CTRSFT_LEFT +#define SFTCTR_RIGHT CTRSFT_RIGHT +#define SFTCTR_DOWN CTRSFT_DOWN +#define SFTCTR_HOME CTRSFT_HOME +#define SFTCTR_HELP CTRSFT_HELP +#define SFTCTR_NFER CTRSFT_NFER +#define SFTCTR_KANJ CTRSFT_KANJ + +#define CTR_AT (CTRL+0x0000) /* CTRL+@ */ +#define CTR_A (CTRL+0x0001) +#define CTR_B (CTRL+0x0002) +#define CTR_C (CTRL+0x0003) +#define CTR_D (CTRL+0x0004) +#define CTR_E (CTRL+0x0005) +#define CTR_F (CTRL+0x0006) +#define CTR_G (CTRL+0x0007) +#define CTR_H (CTRL+0x0008) +#define CTR_I (CTRL+0x0009) +#define CTR_J (CTRL+0x000a) +#define CTR_K (CTRL+0x000b) +#define CTR_L (CTRL+0x000c) +#define CTR_M (CTRL+0x000d) +#define CTR_N (CTRL+0x000e) +#define CTR_O (CTRL+0x000f) +#define CTR_P (CTRL+0x0010) +#define CTR_Q (CTRL+0x0011) +#define CTR_R (CTRL+0x0012) +#define CTR_S (CTRL+0x0013) +#define CTR_T (CTRL+0x0014) +#define CTR_U (CTRL+0x0015) +#define CTR_V (CTRL+0x0016) +#define CTR_W (CTRL+0x0017) +#define CTR_X (CTRL+0x0018) +#define CTR_Y (CTRL+0x0019) +#define CTR_Z (CTRL+0x001a) +#define CTR_KL (CTRL+0x001b) /* CTRL+[ */ +#define CTR_YEN (CTRL+0x001c) /* CTRL+\ */ +#define CTR_RAG (CTRL+0x001d) /* CTRL+] */ +#define CTR_HAT (CTRL+0x001e) /* CTRL+^ */ +#define CTR__ (CTRL+0x001f) /* CTRL+_ */ + +#define CTRSFT_AT (CTRL+SHIFT+0x0000) /* CTRL+@ */ +#define CTRSFT_A (CTRL+SHIFT+0x0001) +#define CTRSFT_B (CTRL+SHIFT+0x0002) +#define CTRSFT_C (CTRL+SHIFT+0x0003) +#define CTRSFT_D (CTRL+SHIFT+0x0004) +#define CTRSFT_E (CTRL+SHIFT+0x0005) +#define CTRSFT_F (CTRL+SHIFT+0x0006) +#define CTRSFT_G (CTRL+SHIFT+0x0007) +#define CTRSFT_H (CTRL+SHIFT+0x0008) +#define CTRSFT_I (CTRL+SHIFT+0x0009) +#define CTRSFT_J (CTRL+SHIFT+0x000a) +#define CTRSFT_K (CTRL+SHIFT+0x000b) +#define CTRSFT_L (CTRL+SHIFT+0x000c) +#define CTRSFT_M (CTRL+SHIFT+0x000d) +#define CTRSFT_N (CTRL+SHIFT+0x000e) +#define CTRSFT_O (CTRL+SHIFT+0x000f) +#define CTRSFT_P (CTRL+SHIFT+0x0010) +#define CTRSFT_Q (CTRL+SHIFT+0x0011) +#define CTRSFT_R (CTRL+SHIFT+0x0012) +#define CTRSFT_S (CTRL+SHIFT+0x0013) +#define CTRSFT_T (CTRL+SHIFT+0x0014) +#define CTRSFT_U (CTRL+SHIFT+0x0015) +#define CTRSFT_V (CTRL+SHIFT+0x0016) +#define CTRSFT_W (CTRL+SHIFT+0x0017) +#define CTRSFT_X (CTRL+SHIFT+0x0018) +#define CTRSFT_Y (CTRL+SHIFT+0x0019) +#define CTRSFT_Z (CTRL+SHIFT+0x001a) +#define CTRSFT_KL (CTRL+SHIFT+0x001b) /* CTRL+[ */ +#define CTRSFT_YEN (CTRL+SHIFT+0x001c) /* CTRL+\ */ +#define CTRSFT_RAG (CTRL+SHIFT+0x001d) /* CTRL+] */ +#define CTRSFT_HAT (CTRL+SHIFT+0x001e) /* CTRL+^ */ +#define CTRSFT__ (CTRL+SHIFT+0x001f) /* CTRL+_ */ +#define SFTCTR_AT CTRSFT_AT /* CTRL+@ */ +#define SFTCTR_A CTRSFT_A +#define SFTCTR_B CTRSFT_B +#define SFTCTR_C CTRSFT_C +#define SFTCTR_D CTRSFT_D +#define SFTCTR_E CTRSFT_E +#define SFTCTR_F CTRSFT_F +#define SFTCTR_G CTRSFT_G +#define SFTCTR_H CTRSFT_H +#define SFTCTR_I CTRSFT_I +#define SFTCTR_J CTRSFT_J +#define SFTCTR_K CTRSFT_K +#define SFTCTR_L CTRSFT_L +#define SFTCTR_M CTRSFT_M +#define SFTCTR_N CTRSFT_N +#define SFTCTR_O CTRSFT_O +#define SFTCTR_P CTRSFT_P +#define SFTCTR_Q CTRSFT_Q +#define SFTCTR_R CTRSFT_R +#define SFTCTR_S CTRSFT_S +#define SFTCTR_T CTRSFT_T +#define SFTCTR_U CTRSFT_U +#define SFTCTR_V CTRSFT_V +#define SFTCTR_W CTRSFT_W +#define SFTCTR_X CTRSFT_X +#define SFTCTR_Y CTRSFT_Y +#define SFTCTR_Z CTRSFT_Z +#define SFTCTR_KL CTRSFT_KL /* CTRL+[ */ +#define SFTCTR_YEN CTRSFT_YEN /* CTRL+\ */ +#define SFTCTR_RAG CTRSFT_RAG /* CTRL+] */ +#define SFTCTR_HAT CTRSFT_HAT /* CTRL+^ */ +#define SFTCTR__ CTRSFT__ /* CTRL+_ */ + +/************************************************************************/ +/* AAJ$B%-!<%3!<%II=(B($BFHJ)H/2;%-!<%\!<%IMQ2>A[J8;z%-!<%3!<%ICMDj5A(B) */ +/************************************************************************/ +#define TDRJSTATE_DEAD 0x00 /* $BDV$j;z2?$b$7$J$$(B */ +#define TDRJSTATE_ACST 0x01 /* $BDV$j;z!Z!-![$K$9$k(B */ +#define TDRJSTATE_ACSC 0x02 /* $BDV$j;z!Z!.![$K$9$k(B */ +#define TDRJSTATE_ACSY 0x03 /* $BDV$j;z!Z!0![$K$9$k(B */ +#define TDRJSTATE_UMRT 0x04 /* $BDV$j;z!Z!/![$K$9$k(B */ +#define VMOJI_TDRJSTATE_DEAD (VMOJIKEY+TDRJSTATE_DEAD) +#define VMOJI_TDRJSTATE_ACST (VMOJIKEY+TDRJSTATE_ACST) +#define VMOJI_TDRJSTATE_ACSC (VMOJIKEY+TDRJSTATE_ACSC) +#define VMOJI_TDRJSTATE_ACSY (VMOJIKEY+TDRJSTATE_ACSY) +#define VMOJI_TDRJSTATE_UMRT (VMOJIKEY+TDRJSTATE_UMRT) + +#define HATU_AE 0xe6 /* * ae 1$B%-!<(B */ +#define HATU_A1 0xbb /* a 2$B%-!<(B */ +#define HATU_O 0xa4 /* o 3$B%-!<(B */ +#define HATU_A2 0xb4 /* ^ 4$B%-!<(B */ +#define HATU_A3 0xa7 /* 5$B%-!<(B */ +#define HATU_A4 0xab /* 6$B%-!<(B */ +#define HATU_E 0xb0 /* $B&E(B 7$B%-!<(B */ +#define HATU_TH 0xb7 /* $B&H(B 8$B%-!<(B */ +#define HATU_Z 0xf0 /* * 9$B%-!<(B */ +#define HATU_S 0xb8 /* S 0$B%-!<(B */ +#define HATU_A5 0xbe /* $B'Y(B ^$B%-!<(B */ +#define HATU_NG 0xbf /* ng \$B%-!<(B */ +#define HATU_COLON 0xae /* : @$B%-!<(B */ +#define VMOJI_HATU_AE HATU_AE +#define VMOJI_HATU_A1 (VMOJIKEY+HATU_A1) +#define VMOJI_HATU_O (VMOJIKEY+HATU_O) +#define VMOJI_HATU_A2 (VMOJIKEY+HATU_A2) +#define VMOJI_HATU_A3 (VMOJIKEY+HATU_A3) +#define VMOJI_HATU_A4 (VMOJIKEY+HATU_A4) +#define VMOJI_HATU_E (VMOJIKEY+HATU_E) +#define VMOJI_HATU_TH (VMOJIKEY+HATU_TH) +#define VMOJI_HATU_Z HATU_Z +#define VMOJI_HATU_S (VMOJIKEY+HATU_S) +#define VMOJI_HATU_A5 (VMOJIKEY+HATU_A5) +#define VMOJI_HATU_NG (VMOJIKEY+HATU_NG) +#define VMOJI_HATU_COLON (VMOJIKEY+HATU_COLON) + +#define FUTU_OE 0x9c /* oe \$B%-!<(B */ +#define FUTU_OE2 0x8c /* OE |$B%-!<(B */ +#define VMOJI_FUTU_OE (VMOJIKEY+FUTU_OE) +#define VMOJI_FUTU_OE2 (VMOJIKEY+FUTU_OE2) diff -r 000000000000 -r 92745d501b9a lib/Xatoklib/misc.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/Xatoklib/misc.c Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,144 @@ +/* + * Copyright 1999 Justsystem Corporation, Japan. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, + * provided that the above copyright notice appear in all copies and that + * both that copyright notice and this permission notice appear in + * supporting documentation, and that the name of Justsystem Corporation + * not be used in advertising or publicity pertaining to distribution + * of the software without specific, written prior permission. Justsystem + * Corporation makes no representations about the suitability of this + * software for any purpose. It is provided "as is" without express + * or implied warranty. + * + * Author: Atsushi Irisawa + */ + +#ifndef lint +static char rcsid[] = "$Id: misc.c,v 1.2 1999/08/24 09:01:09 ishisone Exp $" ; +#endif /* !lint */ + +#include + +/* Page */ +/* + * [$B4X?tL>(B] + * wcs2euc( ) + * [$BI=Bj(B] + * WCHAR $B7?$+$i(BEUC$BJ8;zNs$X$NJQ49(B + * [$B8F=P7A<0(B] + * int wcs2euc( wchar *wbuf, int wlen, unsigned char *euc ) + * + * [$B0z?t(B] + * $B7?(B : $BL>(B $B>N(B : I O : $B@b(B $BL@(B + * wchar : *wbuf : i : WCHAR $B7?J8;zNs(B + * int : wlen : i : wchar $B7?J8;zNs$ND9$5(B + * unsigned char : *euc : o : EUC $BJ8;zNs3JG> 8 ; + if ( c ) { + *euc++ = c ; + n++ ; + } + else if (( *wbuf & 0xff ) & 0x80 ) { + *euc++ = 0x8e ; + n++ ; + } + *euc++ = *wbuf & 0xff ; + wbuf++ ; + n++ ; + } + *euc = 0 ; + + return n ; +} +/* Page */ +/* + * [$B4X?tL>(B] + * euc2wcs( ) + * [$BI=Bj(B] + * EUC$BJ8;zNs$+$i(B wchar $B7?J8;zNs$X$NJQ49(B + * [$B8F=P7A<0(B] + * int euc2wcs( unsigned char *euc, int elen, wchar *wbuf ) + * + * [$B0z?t(B] + * $B7?(B : $BL>(B $B>N(B : I O : $B@b(B $BL@(B + * unsigned char : *euc : i : EUC $BJ8;zNs(B + * int : elen : i : EUC $BJ8;zNs$ND9$5(B + * wchar : *wbuf : o : wchar $B7?J8;zNs3JGo$K#1(B + * + * [$B;HMQ4X?t(B] + * $B$J$7(B + * [$B5!G=(B] + * unsigined char $B7?$N(BEUC $BJ8;zNs$r(Bwchar $B7?$KJQ49$9$k!#(B + * EUC $BJ8;zNs$K$O!"(B0x8f $B$NFCJL$J%3!<%I$,4^$^$l$F$$$k$N$G(B + * wchar $B$KJQ49$9$k;~$K8DJL=hM}$r$9$k!#(B + */ +int euc2wcs(euc, elen, wbuf) +unsigned char *euc; +int elen; +wchar *wbuf; +{ + int lb = 0, hb = 0 ; + int i ; + int n = 0 ; + int isSkip ; + + for( i = 0 ; i < elen ; i++ ) { + isSkip = 0 ; + if ( *euc == 0x8e ) { + euc++ ; + hb = *euc ; + lb = 0 ; + i++ ; + } + else if ( *euc & 0x80 ) { + if ( *euc == 0x8f ) { + isSkip=1 ; + } + else { + lb = *euc ; + euc++ ; + hb = *euc ; + i++ ; + } + } + else { + hb = *euc ; + lb = 0 ; + } + euc++ ; + if ( !isSkip ) { + *wbuf = (( lb << 8 ) | hb ) & 0xffff ; + wbuf++ ; + n++ ; + } + } + + *wbuf = 0 ; + return n ; +} +/* End of misc.c */ diff -r 000000000000 -r 92745d501b9a lib/Xatoklib/segment.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/Xatoklib/segment.c Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,450 @@ +/* + * Copyright 1999 Justsystem Corporation, Japan. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, + * provided that the above copyright notice appear in all copies and that + * both that copyright notice and this permission notice appear in + * supporting documentation, and that the name of Justsystem Corporation + * not be used in advertising or publicity pertaining to distribution + * of the software without specific, written prior permission. Justsystem + * Corporation makes no representations about the suitability of this + * software for any purpose. It is provided "as is" without express + * or implied warranty. + * + * Author: Atsushi Irisawa + */ + +#ifndef lint +static char rcsid[] = "$Id: segment.c,v 1.3 1999/08/24 09:05:27 ishisone Exp $" ; +#endif /* !lint */ + +#include +#include +/* Page */ +/* + * [$B4X?tL>(B] + * XatokGetModeStr( ) + * [$BI=Bj(B] + * $B%b!<%IJ8;zNs$N(B $B>N(B : I O : $B@b(B $BL@(B + * _XatokRecPtr : abuf : i/o : kinput2$BMQJQ49%P%C%U%!(B + * int : *length : o : $BJ8;zNs$ND9$5(B + * + * [$BJV$jCM(B] + * $B%b!<%IJ8;zNs3JGmode.length ; + n = *length ; + +#ifdef ATOK_DEBUG + printf( "GET \245\342\241\274\245\311 : "/*=GET $B%b!<%I(B : =*/ ) ; + for ( i = 0 ; i < n ; i++ ) { + printf( "0x%x ", abuf->mode.name[i] ) ; + } + printf( "\n" ) ; +#endif /* ATOK_DEBUG */ + + return abuf->mode.name ; +} + +/* Page */ +/* + * [$B4X?tL>(B] + * XatokGetSegmentPosition( ) + * [$BI=Bj(B] + * $B%+%l%s%H%;%0%a%s%H$N(B $B>N(B : I O : $B@b(B $BL@(B + * _XatokRecPtr : acomm : i/o : kinput2$BMQJQ49%P%C%U%!(B + * + * [$BJV$jCM(B] + * 0 : + * 1 : + * + * [$B;HMQ4X?t(B] + * $B$J$7(B + * [$B5!G=(B] + * $B8=:_$N%+%l%s%H%;%0%a%s%H$r.$5$1$l$P$=$N%;%0%a%s%H$,!"(B + * $B8F$P$l$?;~$N%;%0%a%s%H$H$J$k!#(B + * $B%;%0%a%s%H$,8:>/$7$F(B($BJ8@a$r1d$P$7$?>l9g$J$I(B) + * $B8=:_$N%]%8%7%g%s$,%;%0%a%s%H?t$h$jBg$-$1$l$P!"(B + * $B:G8e$N%;%0%a%s%H$,(B $B%+%l%s%H%]%8%7%g%s$H$J$k!#(B + */ +int XatokGetSegmentPosition(abuf, nsegp, ncharp) +_XatokRecPtr abuf; +int *nsegp; +int *ncharp; +{ + int ret = 0 ; + + if ( abuf->cur_seg < abuf->nbr_of_seg ) { + *nsegp = abuf->cur_seg ; + *ncharp = abuf->segments[abuf->cur_seg].offset ; + } + else if ( abuf->cur_seg > 0 ) { + *nsegp = abuf->nbr_of_seg - 1 ; + *ncharp = abuf->segments[abuf->cur_seg].offset ; + ret = 1 ; + } + else { + *nsegp = 0 ; + *ncharp = 0 ; + ret = 1 ; + } + + return ret ; +} + +/* Page */ +/* + * [$B4X?tL>(B] + * XatokGetSegmentNumber( ) + * [$BI=Bj(B] + * $B%;%0%a%s%H?t$N(B $B>N(B : I O : $B@b(B $BL@(B + * _XatokRecPtr : acomm : i/o : kinput2$BMQJQ49%P%C%U%!(B + * + * [$BJV$jCM(B] + * N : $B%;%0%a%s%H?t(B + * + * [$B;HMQ4X?t(B] + * $B$J$7(B + * [$B5!G=(B] + * $B8=:_$N%;%0%a%s%H?t$rnbr_of_seg ; + + return nbr ; +} + +/* Page */ +/* + * [$B4X?tL>(B] + * XatokGetSegmentRec( ) + * [$BI=Bj(B] + * $B;XDj%;%0%a%s%H$N%G!<%?(B $B>N(B : I O : $B@b(B $BL@(B + * _XatokRecPtr : acomm : i : kinput2$BMQJQ49%P%C%U%!(B + * int : n : i : $B;XDj%;%0%a%s%HHV9f(B + * int : *len : o : $B;XDj%;%0%a%s%H$NJ8;zNs$ND9$5(B + * int : *attr : o : $B;XDj%;%0%a%s%H$NB0@-(B + * + * [$BJV$jCM(B] + * $B;XDj%;%0%a%s%H$NJ8;zNs(B + * + * [$B;HMQ4X?t(B] + * $B$J$7(B + * [$B5!G=(B] + * $B;XDj$5$l$?%;%0%a%s%H$NJ8;zNs$*$h$S$=$NJ8;zNs$ND9$5!"(B + * $BI=<(B0@-$rcur_seg == n ) { + *attr = ICAttrConverted | ICAttrCurrentSegment ; + } + else if ( n < abuf->cur_seg ) { + *attr = ICAttrConverted ; + } + else { + *attr = ICAttrConverted ; + } + + *len = abuf->segments[n].length ; + data = abuf->segments[n].string ; + + return data ; +} +/* Page */ +/* + * [$B4X?tL>(B] + * XatokGetConvertedLength( ) + * [$BI=Bj(B] + * $BJQ497k2LJ8;zNs$ND9$5(B $B>N(B : I O : $B@b(B $BL@(B + * _XatokRecPtr : abuf : i : kinput2$BMQJQ49%P%C%U%!(B + * + * [$BJV$jCM(B] + * N : $BJ8;zNs$ND9$5(B + * + * [$B;HMQ4X?t(B] + * $B$J$7(B + * [$B5!G=(B] + * $BJQ497k2LJ8;zNs$ND9$5$rnbr_of_seg ; i++ ) { + n += abuf->segments[i].length ; + } + return n ; +} + +/* Page */ +/* + * [$B4X?tL>(B] + * XatokGetConvertedString( ) + * [$BI=Bj(B] + * $BJQ497k2LJ8;zNs$N(B $B>N(B : I O : $B@b(B $BL@(B + * _XatokRecPtr : abuf : i : kinput2$BMQJQ49%P%C%U%!(B + * wchar : *wstr : o : $Bnbr_of_seg ; i++ ) { + w2 = abuf->segments[i].string ; + while( *w2 ) { + *w1 = *w2 ; + w1++ ; + w2++ ; + n++ ; + } + } + *w1 = 0 ; + return n ; +} +/* Page */ +/* + * [$B4X?tL>(B] + * XatokShiftRight( ) + * [$BI=Bj(B] + * $B%;%0%a%s%H%G!<%?$N1&(BROTATE + * [$B8F=P7A<0(B] + * int XatokShiftRight( _XatokRecPtr abuf ) + * + * [$B0z?t(B] + * $B7?(B : $BL>(B $B>N(B : I O : $B@b(B $BL@(B + * _XatokRecPtr : abuf : i/o : kinput2$BMQJQ49%P%C%U%!(B + * + * [$BJV$jCM(B] + * 1 : $B>o$K#1(B + * + * [$B;HMQ4X?t(B] + * $B$J$7(B + * [$B5!G=(B] + * $B%;%0%a%s%H%G!<%?$r1&$K(B ROTATE$B$9$k!#(B + * $B1&$N(BROTATE$B$H$O(B $B%;%0%a%s%H$NG[Ns$N%$%s%G%C%/%9$,>.$5$$%G!<%?$r(B + * $B#1$DBg$-$$=j$K0\$9$H$$$&;v$G$"$k!#(B + * $B#1HVBg$-$$=j$O!"@hF,$K0\$k!#(B + */ +int XatokShiftRight(abuf) +_XatokRecPtr abuf; +{ + _XatokSegment tmpseg ; + _XatokSegment *sp ; + int offset ; + int nseg ; + int i ; + + nseg = abuf->nbr_of_seg ; + offset = abuf->offset ; + sp = abuf->segments ; + + tmpseg.string = sp[nseg].string ; + tmpseg.length = sp[nseg].length ; + tmpseg.size = sp[nseg].size ; + tmpseg.offset = sp[nseg].offset ; + + sp = &abuf->segments[nseg] ; + for( i = nseg ; i > offset ; i-- ) { + sp->string = ( sp - 1 )->string ; + sp->length = ( sp - 1 )->length ; + sp->size = ( sp - 1 )->size ; + sp->offset = ( sp - 1 )->offset ; + sp-- ; + } + sp = &abuf->segments[offset] ; + sp->string = tmpseg.string ; + sp->length = tmpseg.length ; + sp->size = tmpseg.size ; + sp->offset = tmpseg.offset ; + + abuf->offset++ ; + abuf->nbr_of_seg++ ; + abuf->cur_seg++ ; + + return 1 ; +} + + +/* Page */ +/* + * [$B4X?tL>(B] + * XatokShiftLeft( ) + * [$BI=Bj(B] + * $B%;%0%a%s%H%G!<%?$N:8(BROTATE + * [$B8F=P7A<0(B] + * int XatokShiftLeft( _XatokRecPtr abuf ) + * + * [$B0z?t(B] + * $B7?(B : $BL>(B $B>N(B : I O : $B@b(B $BL@(B + * _XatokRecPtr : abuf : i/o : kinput2$BMQJQ49%P%C%U%!(B + * + * [$BJV$jCM(B] + * 1 : $B>o$K#1(B + * + * [$B;HMQ4X?t(B] + * $B$J$7(B + * [$B5!G=(B] + * $B%;%0%a%s%H%G!<%?$r:8$K(B ROTATE$B$9$k!#(B + * $B:8$N(BROTATE$B$H$O(B $B%;%0%a%s%H$NG[Ns$N%$%s%G%C%/%9$,Bg$-$$%G!<%?$r(B + * $B#1$D>.$5$$=j$K0\$9$H$$$&;v$G$"$k!#(B + * $B#1HV>.$5$$=j$O!"(BOFFSET$B$K0\$k!#(B + */ +int XatokShiftLeft(abuf) +_XatokRecPtr abuf; +{ + _XatokSegment tmpseg ; + _XatokSegment *sp ; + int offset ; + int i ; + + offset = abuf->offset ; + + sp = abuf->segments ; + tmpseg.string = sp[0].string ; + tmpseg.length = sp[0].length ; + tmpseg.size = sp[0].size ; + tmpseg.offset = sp[0].offset ; + + for( i = 0 ; i < offset - 1 ; i++ ) { + sp->string = ( sp + 1 )->string ; + sp->length = ( sp + 1 )->length ; + sp->size = ( sp + 1 )->size ; + sp->offset = ( sp + 1 )->offset ; + sp++ ; + } + abuf->segments[offset-1].string = tmpseg.string ; + abuf->segments[offset-1].length = tmpseg.length ; + abuf->segments[offset-1].size = tmpseg.size ; + abuf->segments[offset-1].offset = tmpseg.offset ; + + return 1 ; +} +/* Page */ +/* + * [$B4X?tL>(B] + * XatokShiftLeftAll( ) + * [$BI=Bj(B] + * $BA4%;%0%a%s%H%G!<%?$N:8(BROTATE + * [$B8F=P7A<0(B] + * int XatokShiftLeftAll( _XatokRecPtr abuf ) + * + * [$B0z?t(B] + * $B7?(B : $BL>(B $B>N(B : I O : $B@b(B $BL@(B + * _XatokRecPtr : abuf : i/o : kinput2$BMQJQ49%P%C%U%!(B + * + * [$BJV$jCM(B] + * 1 : $B>o$K#1(B + * + * [$B;HMQ4X?t(B] + * $B$J$7(B + * [$B5!G=(B] + * $B%;%0%a%s%H%G!<%?$r:8$K(B ROTATE$B$9$k!#(B + * $B:8$N(BROTATE$B$H$O(B $B%;%0%a%s%H$NG[Ns$N%$%s%G%C%/%9$,Bg$-$$%G!<%?$r(B + * $B#1$D>.$5$$=j$K0\$9$H$$$&;v$G$"$k!#(B + */ +int XatokShiftLeftAll(abuf) +_XatokRecPtr abuf; +{ + _XatokSegment tmpseg ; + _XatokSegment *sp ; + int offset ; + int nseg ; + int i ; + + nseg = abuf->nbr_of_seg ; + sp = abuf->segments ; + tmpseg.string = sp->string ; + tmpseg.length = sp->length ; + tmpseg.size = sp->size ; + tmpseg.offset = sp->offset ; + for( i = 0 ; i < nseg - 1 ; i++ ) { + sp->string = ( sp + 1 )->string ; + sp->length = ( sp + 1 )->length ; + sp->size = ( sp + 1 )->size ; + sp->offset = ( sp + 1 )->offset ; + sp++ ; + } + sp = &abuf->segments[nseg-1] ; + sp->string = tmpseg.string ; + sp->length = tmpseg.length ; + sp->size = tmpseg.size ; + sp->offset = tmpseg.offset ; + + abuf->offset-- ; + abuf->nbr_of_seg-- ; + abuf->cur_seg-- ; +} + +/* End of segment.c */ diff -r 000000000000 -r 92745d501b9a lib/Xatoklib/sysline.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/Xatoklib/sysline.c Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,191 @@ +/* + * Copyright 1999 Justsystem Corporation, Japan. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, + * provided that the above copyright notice appear in all copies and that + * both that copyright notice and this permission notice appear in + * supporting documentation, and that the name of Justsystem Corporation + * not be used in advertising or publicity pertaining to distribution + * of the software without specific, written prior permission. Justsystem + * Corporation makes no representations about the suitability of this + * software for any purpose. It is provided "as is" without express + * or implied warranty. + * + * Author: Atsushi Irisawa + */ + +#ifndef lint +static char rcsid[] = "$Id: sysline.c,v 1.2 1999/08/24 09:01:10 ishisone Exp $" ; +#endif /* !lint */ + +#include +#include +#include +#include +#include +#include + +#include + +/* Page */ +/* + * [$B4X?tL>(B] + * auxSyslineCtrl( ) + * [$BI=Bj(B] + * $B%G!<%?$NAw?.(B + * [$B8F=P7A<0(B] + * int auxSyslineCtrl( _XatokRecPtr acomm, int isdecision ) + * + * [$B0z?t(B] + * $B7?(B : $BL>(B $B>N(B : I O : $B@b(B $BL@(B + * _XatokRecPtr : acomm : i/o : kinput2$BMQJQ49%P%C%U%!(B + * int : isdecision : i : $B3NDj%G!<%?%U%i%0(B + * + * + * [$BJV$jCM(B] + * 0 : AUX $B%&%#%s%I%&7QB3(B + * 1 : AUX $B%&%#%s%I%&=*N;(B + * + * [$B;HMQ4X?t(B] + * $B$J$7(B + * [$B5!G=(B] + * SYSLINE$B%G!<%?$N%U%i%0$,(B ATOK12CE $B%(%s%8%s$G@_Dj$5$l$F$$$k>l9g$K(B + * $B%7%9%F%`9T$r?75,$K3+$/!"%7%9%F%`9T$NJ8;zNs$rJQ99$9$k!"(B + * $B%7%9%F%`9T$rJD$8$k$J$I$N!"I=<($r$I$N$h$&$K9T$J$&$+$rH=CG$9$k(B + * $B%U%!%s%/%7%g%s$G$"$j!"I=<($r4IM}$7$F$$$k%b%8%e!<%k$h$j(B + * $B8F$S=P$5$l$k!#(B + */ +int auxSyslineCtrl(acomm, isdecision) +_XatokRecPtr acomm; +int isdecision; /* $B3NDjJ8;z$,$"$k$+$J$$$+!)(B */ +{ + int status = 0 ; + +#ifdef ATOK_DEBUG + printf( "GUIDE isdecision %d\n", isdecision ) ; + printf( "GUIDE VAL %d\n", acomm->guide_OpenIndex ) ; + printf( "GUIDE CLOSE VAL %d\n", acomm->guide_closeEventIndex ) ; + printf( "GUIDE OPEN VAL %d\n", acomm->guide_openEventIndex ) ; +#endif + if ( acomm->guide_openEventIndex & CEGUIDEINDX_ERROR ) { + /* printf( "CEGUIDEINDX_ERROR\n" ) ; */ + acomm->convStatus |= M_SYSLINE ; + if ( acomm->aux_isopened ) { + acomm->menuStatus = ICAuxChange ; + } + else { + acomm->menuStatus = ICAuxStart ; + } + acomm->aux_isopened = 1 ; + } + else if ( acomm->guide_OpenIndex & CEGUIDEINDX_CODE ) { + /* printf( "CEGUIDEINDX_CODE\n" ) ; */ + acomm->convStatus |= M_SYSLINE ; + if ( acomm->aux_isopened ) { + acomm->menuStatus = ICAuxChange ; + } + else { + acomm->menuStatus = ICAuxStart ; + } + acomm->aux_isopened = 1 ; + } + else if ( acomm->guide_OpenIndex & CEGUIDEINDX_KIGOU ) { + /* printf( "CEGUIDEINDX_CODE\n" ) ; */ + acomm->convStatus |= M_SYSLINE ; + if ( acomm->aux_isopened ) { + acomm->menuStatus = ICAuxChange ; + } + else { + acomm->menuStatus = ICAuxStart ; + } + acomm->aux_isopened = 1 ; + status = isdecision ; + } + else { + /* printf( "SYSLINE OTHER\n" ) ; */ + + acomm->convStatus ^= M_SYSLINE ; /* 0616 */ + acomm->aux_isopened = 0 ; + acomm->menuStatus = ICAuxEnd ; + status = 1 ; + } + return status ; +} +/* Page */ +/* + * [$B4X?tL>(B] + * auxSyslineString( ) + * AtokNetSend( ) + * [$BI=Bj(B] + * $B%7%9%F%`9TJ8;zNs$N:n@.!#(B + * [$B8F=P7A<0(B] + * int auxSyslineString( _XatokRecPtr acomm, menuAux *mAux, + * wchar *echoStr, int *echoLen, int *revLen, int *revPos ) + * + * [$B0z?t(B] + * $B7?(B : $BL>(B $B>N(B : I O : $B@b(B $BL@(B + * _XatokRecPtr : acomm : i/o : kinput2$BMQJQ49%P%C%U%!(B + * menuAux : *mAux: : $B8=:_L$;HMQ(B + * wchar : *echoStr: o : $BI=<(J8;zNs(B + * int : *echoLen: o : $BI=<(J8;zNs$ND9$5(B + * int : *revLen : o : $BH?E>3+;O0LCV(B + * int : *revPos : o : $BH?E>J8;zNsD9$5(B + * + * + * [$BJV$jCM(B] + * -1 : $BAw?.%(%i!<(B + * N : $BAw?.%P%$%H?t(B + * + * [$B;HMQ4X?t(B] + * $B$J$7(B + * [$B5!G=(B] + * $B%7%9%F%`9T$KI=<($9$kJ8;zNs$r:n@.$7!"H?E>I=<(0LCV!"H?E>I=<($N(B + * $BD9$5$r5a$a$k!#(B + */ + +int auxSyslineString(acomm, mAux, echoStr, echoLen, revLen, revPos) +_XatokRecPtr acomm; +menuAux *mAux; +wchar *echoStr; +int *echoLen; +int *revLen; +int *revPos; +{ + int wsize = sizeof( wchar ) ; + int isreverse = 0 ; + int rev = 0 ; + int i ; + + *revPos = 0 ; + *revLen = 0 ; + + memcpy( acomm->aux_echoStr, acomm->sysLineStr, acomm->sysLineLen * wsize ) ; + + *echoLen = acomm->sysLineLen ; + for ( i = 0 ; i < acomm->sysLineLen ; i++ ) { + switch( acomm->sysAttrPtr[i] ) { + case ATCOLINDX_SYSLINEBACK : + case ATCOLINDX_SYSLINEINPUT : + case ATCOLINDX_SYSLINEINPUTCUR : + case ATCOLINDX_SYSLINENOTSELECTITEM : + case ATCOLINDX_SYSLINEHOSOKU : + case ATCOLINDX_SYSLINEGUIDEMESSAGE : + if ( isreverse ) { + goto done; + } + rev++ ; + break ; + case ATCOLINDX_SYSLINESELECTITEM : + isreverse = 1 ; + ( *revLen ) ++ ; + break ; + } + } +done: + if ( isreverse ) { + *revPos = rev ; + } + return 1 ; +} +/* End of sysline.c */ diff -r 000000000000 -r 92745d501b9a lib/XimpProto.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/XimpProto.c Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,3013 @@ +#ifndef lint +static char *rcsid = "$Id: XimpProto.c,v 1.49 1999/05/18 08:53:21 ishisone Exp $"; +#endif +/*- + * Copyright (c) 1991 Software Research Associates, Inc. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Software Research Associates not be + * used in advertising or publicity pertaining to distribution of the + * software without specific, written prior permission. Software Research + * Associates makes no representations about the suitability of this software + * for any purpose. It is provided "as is" without express or implied + * warranty. + * + * Author: Makoto Ishisone, Software Research Associates, Inc., Japan + */ + +#include +#include + +/* this widget needs X11R5 header files... */ +#if defined(XlibSpecificationRelease) && XlibSpecificationRelease >= 5 + +#include +#include +#include +#include +#include "XIMProto.h" +#include "XimpProtoP.h" +#include "ConvMgr.h" +#include "InputConv.h" +#include "OverConv.h" +#include "OffConv.h" +#include "OnConv.h" +#include "MyDispatch.h" +#include "AsyncErr.h" +#include "ParseKey.h" + + +#define DEBUG_VAR debug_XimpProtocol +#include "DebugPrint.h" + + +#define PROTOCOL_VERSION_STR "XIMP.3.5" +#define SERVER_NAME "kinput2" +#define SERVER_VERSION "1" +#define VENDOR_NAME "SRA" + + +#define PREEDIT_MASK (XIMP_PRE_AREA_MASK|XIMP_PRE_FG_MASK|XIMP_PRE_BG_MASK|\ + XIMP_PRE_COLORMAP_MASK|XIMP_PRE_BGPIXMAP_MASK|\ + XIMP_PRE_LINESP_MASK|XIMP_PRE_CURSOR_MASK|\ + XIMP_PRE_AREANEED_MASK|XIMP_PRE_SPOTL_MASK) +#define STATUS_MASK (XIMP_STS_AREA_MASK|XIMP_STS_FG_MASK|XIMP_STS_BG_MASK|\ + XIMP_STS_COLORMAP_MASK|XIMP_STS_BGPIXMAP_MASK|\ + XIMP_STS_LINESP_MASK|XIMP_STS_CURSOR_MASK|\ + XIMP_STS_AREANEED_MASK|XIMP_STS_WINDOW_MASK) + +#define MIN_LINE_SPACING 2 +#define MIN_AREA_WIDTH 16 +#define MIN_AREA_HEIGHT 10 + + +/*- resource table -*/ +static XtResource resources[] = { +#define offset(field) XtOffset(XimpProtocolWidget, ximp.field) + { XtNlocaleName, XtCLocaleName, XtRString, sizeof(String), + offset(localename), XtRImmediate, (XtPointer)NULL }, + { XtNserverName, XtCServerName, XtRString, sizeof(String), + offset(servername), XtRString, (XtPointer)SERVER_NAME }, + { XtNforceDefaultServer, XtCForceDefaultServer, XtRBoolean, sizeof(Boolean), + offset(forceDefaultServer), XtRImmediate, (XtPointer)False }, + { XtNconversionStartKeys, XtCConversionStartKeys, XtRString, sizeof(String), + offset(convkeys), XtRImmediate, (XtPointer)NULL }, + { XtNinputObjectClass, XtCClass, XtRPointer, sizeof(WidgetClass), + offset(inputObjClass), XtRImmediate, (XtPointer)NULL }, + { XtNdisplayObjectClass, XtCClass, XtRPointer, sizeof(WidgetClass), + offset(displayObjClass), XtRImmediate, (XtPointer)NULL }, + { XtNdefaultFontList, XtCFontList, XtRString, sizeof(String), + offset(defaultfontlist), XtRImmediate, (XtPointer)NULL }, + { XtNforeground, XtCForeground, XtRPixel, sizeof (Pixel), + offset(foreground), XtRString, XtDefaultForeground }, + { XtNstatusWidth, XtCStatusWidth, XtRDimension, sizeof(Dimension), + offset(statuswidth), XtRImmediate, (XtPointer)0 }, +#undef offset +}; + +static void XimpMessageProc(); +static void SelectionRequestProc(); +static void SelectionClearProc(); + +/*- action table -*/ +static XtActionsRec actions[] = { + { "ximp-message", XimpMessageProc }, + { "selection-request", SelectionRequestProc }, + { "selection-clear", SelectionClearProc }, +}; + +/*- default translation -*/ +static char translations[] = + "_XIMP_PROTOCOL: ximp-message()\n\ + : selection-request()\n\ + : selection-clear()"; + + +/*- static function declarations -*/ +static void ClassInitialize(); +static void Initialize(); +static void Destroy(); +static void Realize(); + +static void getAtoms(); +static int ownSelection(); + +static ConvClient *findClient(); +static ConvClient *newClient(); +static Widget attachConverter(); +static void detachConverter(); +static void deleteClient(); + +static Boolean isCorrectClientEvent(); +static Boolean isCorrectWindowID(); +static void initializeError(); +static void checkLocale(); +static void fillInDefaultAttributes(); +static void computeAreaForStartup(); +static void computeAreaForQuery(); +static unsigned long makeConvAttributes(); +static void getFonts(); + +static void setProperty(); +static void setKeyProperty(); +static void getAttributes(); +static void getFocusProperty(); +static void getPreeditFontProperty(); +static void getStatusFontProperty(); +static void getPreeditProperty(); +static void getStatusProperty(); +static Boolean readProperty(); +static void setAttributes(); +static void setFocusProperty(); +static void setPreeditFontProperty(); +static void setStatusFontProperty(); +static void setPreeditProperty(); +static void setStatusProperty(); +static void writeProperty(); + +static void sendClientMessage8(); +static void sendClientMessage32(); +static void sendKeyEvent(); +static void sendErrorEvent(); +static void sendCreateRefusal(); + +static void fixCallback(); +static void fixProc(); +static void endCallback(); +static void endProc(); +static void unusedEventCallback(); + +static void ximpCreateMessageProc(); +static void ximpDestroyMessageProc(); +static void ximpBeginMessageProc(); +static void ximpEndMessageProc(); +static void ximpSetFocusMessageProc(); +static void ximpUnsetFocusMessageProc(); +static void ximpMoveMessageProc(); +static void ximpResetMessageProc(); +static void ximpSetValueMessageProc(); +static void ximpGetValueMessageProc(); +static void ximpKeyPressMessageProc(); +static void ximpExtensionMessageProc(); + +static void ClientDead(); + +static void preeditStartCallback(); +static void preeditDoneCallback(); +static void preeditDrawCallback(); +static void preeditCaretCallback(); +static void statusStartCallback(); +static void statusDoneCallback(); +static void statusDrawCallback(); +static void preeditStart(); +static void preeditDone(); +static void preeditDraw(); +static void preeditCaret(); +static void statusStart(); +static void statusDone(); +static void statusDraw(); + +/*- XimpProtocolClassRec -*/ +XimpProtocolClassRec ximpProtocolClassRec = { + { /* core fields */ + /* superclass */ (WidgetClass) &widgetClassRec, + /* class_name */ "XimpProtocol", + /* widget_size */ sizeof(XimpProtocolRec), + /* class_initialize */ ClassInitialize, + /* class_part_initialize */ NULL, + /* class_inited */ FALSE, + /* initialize */ Initialize, + /* initialize_hook */ NULL, + /* realize */ Realize, + /* actions */ actions, + /* num_actions */ XtNumber(actions), + /* resources */ resources, + /* num_resources */ XtNumber(resources), + /* xrm_class */ NULLQUARK, + /* compress_motion */ TRUE, + /* compress_exposure */ TRUE, + /* compress_enterleave */ TRUE, + /* visible_interest */ FALSE, + /* destroy */ Destroy, + /* resize */ NULL, + /* expose */ NULL, + /* set_values */ NULL, + /* set_values_hook */ NULL, + /* set_values_almost */ XtInheritSetValuesAlmost, + /* get_values_hook */ NULL, + /* accept_focus */ NULL, + /* version */ XtVersion, + /* callback_private */ NULL, + /* tm_table */ translations, + /* query_geometry */ XtInheritQueryGeometry, + /* display_accelerator */ XtInheritDisplayAccelerator, + /* extension */ NULL + }, + { /* ximpprotocol fields */ + /* ximp_dummy */ 0 + } +}; + +WidgetClass ximpProtocolWidgetClass = (WidgetClass)&ximpProtocolClassRec; + +static XimpInputStyle XimpStyles[] = { + { XIMPreeditPosition|XIMStatusArea, overthespot_style }, + { XIMPreeditPosition|XIMStatusNothing, overthespot_style }, + { XIMPreeditArea|XIMStatusArea, offthespot_style }, + { XIMPreeditCallbacks|XIMStatusCallbacks, onthespot_style }, + { XIMPreeditCallbacks|XIMStatusNothing, onthespot_style }, + { XIMPreeditNothing|XIMStatusNothing, separate_style }, + { 0 }, +}; + +/* + *+ Core class methods + */ + +/*- ClassInitialize: set supported locale list -*/ +static void +ClassInitialize() +{ +} + +/*- Initialize: intern Atoms, get default fonts, etc. -*/ +/* ARGSUSED */ +static void +Initialize(req, new, args, num_args) +Widget req; +Widget new; +ArgList args; +Cardinal *num_args; +{ + XimpProtocolWidget xpw = (XimpProtocolWidget)new; + + if (xpw->ximp.localename == NULL) { + initializeError(new, XtNlocaleName); + } else if (xpw->ximp.inputObjClass == NULL) { + initializeError(new, XtNinputObjectClass); + } else if (xpw->ximp.displayObjClass == NULL) { + initializeError(new, XtNdisplayObjectClass); + } + + checkLocale(xpw, xpw->ximp.localename); + xpw->ximp.localename = XtNewString(xpw->ximp.localename); + + xpw->ximp.servername = XtNewString(xpw->ximp.servername); + + xpw->ximp.clients = NULL; + xpw->ximp.freeclients = NULL; + xpw->ximp.icid = 1; + xpw->ximp.propid = 0; + xpw->ximp.callbackpropid = 0; + + if (xpw->ximp.defaultfontlist != NULL) { + TRACE(("enter default fontlist <%s> into cache\n", xpw->ximp.defaultfontlist)); + /* extract fonts from default font list and enter them into cache */ + xpw->ximp.defaultfontlist = XtNewString(xpw->ximp.defaultfontlist); + xpw->ximp.deffonts = FontBankGet(xpw->ximp.fontbank, + xpw->ximp.defaultfontlist, + &xpw->ximp.numdeffonts); + } else { + xpw->ximp.deffonts = NULL; + xpw->ximp.numdeffonts = 0; + } + + getAtoms(xpw); +} + +/*- Destroy: free allocated memory -*/ +static void +Destroy(w) +Widget w; +{ + XimpProtocolWidget xpw = (XimpProtocolWidget)w; + ConvClient *client; + + XtFree(xpw->ximp.localename); + XtFree(xpw->ximp.servername); + if (xpw->ximp.defaultfontlist != NULL) XtFree(xpw->ximp.defaultfontlist); + + while (xpw->ximp.clients != NULL) { + statusDone(xpw->ximp.clients); + endProc(xpw->ximp.clients, False); + deleteClient(xpw->ximp.clients); + /* + * since deleteClient() removes the given client from client list + * and insert it in free list, following commented statement is + * not necessary. + * + * xpw->ximp.clients = xpw->ximp.clients->next; + */ + } + + /* + * now, all the clients are deleted and moved into free list. + */ + client = xpw->ximp.freeclients; + while (client != NULL) { + ConvClient *ccp = client; + client = client->next; + XtFree((char *)ccp); + } + + /* + * free cached fontlist + */ + if (xpw->ximp.numdeffonts > 0) { + FontBankFreeFonts(xpw->ximp.fontbank, + xpw->ximp.deffonts, + xpw->ximp.numdeffonts); + } + FontBankDestroy(xpw->ximp.fontbank); +} + +/*- Realize: own selection -*/ +static void +Realize(w, mask, value) +Widget w; +XtValueMask *mask; +XSetWindowAttributes *value; +{ + XimpProtocolWidget xpw = (XimpProtocolWidget)w; + CoreWidgetClass super = (CoreWidgetClass)XtClass(w)->core_class.superclass; + + (*super->core_class.realize)(w, mask, value); + + setProperty(xpw); + + if (!ownSelection(xpw)) { + String params[1]; + Cardinal num_params; + + params[0] = XtClass(w)->core_class.class_name; + num_params = 1; + XtAppWarningMsg(XtWidgetToApplicationContext(w), + "selectionError", "ownSelection", "WidgetError", + "%s: can't own selection", params, &num_params); + + XtDestroyWidget(w); + } else { + DPRINT(("\tselection owner: 0x%lx (%ld)\n", XtWindow(w), XtWindow(w))); + } +} + +/* + *+ atom handling + */ + +/*- getAtoms: intern atoms -*/ +static void +getAtoms(xpw) +XimpProtocolWidget xpw; +{ + Display *dpy = XtDisplay((Widget)xpw); + char buf[256]; + +#define MAKEATOM(s) XInternAtom(dpy, s, False) + (void)sprintf(buf, "_XIMP_%s", xpw->ximp.localename); + xpw->ximp.selAtom1 = MAKEATOM(buf); + (void)sprintf(buf, "_XIMP_%s@%s.%d", + xpw->ximp.localename, + xpw->ximp.servername, + DefaultScreen(XtDisplay((Widget)xpw))); + xpw->ximp.selAtom2 = MAKEATOM(buf); + + xpw->ximp.ctextAtom = XA_COMPOUND_TEXT(dpy); + + xpw->ximp.ximpVersionAtom = MAKEATOM("_XIMP_VERSION"); + xpw->ximp.ximpStyleAtom = MAKEATOM("_XIMP_STYLE"); + xpw->ximp.ximpKeysAtom = MAKEATOM("_XIMP_KEYS"); + xpw->ximp.ximpServerNameAtom = MAKEATOM("_XIMP_SERVERNAME"); + xpw->ximp.ximpServerVersionAtom = MAKEATOM("_XIMP_SERVERVERSION"); + xpw->ximp.ximpVendorNameAtom = MAKEATOM("_XIMP_VENDORNAME"); + xpw->ximp.ximpExtensionsAtom = MAKEATOM("_XIMP_EXTENSIONS"); + xpw->ximp.ximpProtocolAtom = MAKEATOM("_XIMP_PROTOCOL"); + xpw->ximp.ximpFocusAtom = MAKEATOM("_XIMP_FOCUS"); + xpw->ximp.ximpPreeditAtom = MAKEATOM("_XIMP_PREEDIT"); + xpw->ximp.ximpStatusAtom = MAKEATOM("_XIMP_STATUS"); + xpw->ximp.ximpPreeditFontAtom = MAKEATOM("_XIMP_PREEDITFONT"); + xpw->ximp.ximpStatusFontAtom = MAKEATOM("_XIMP_STATUSFONT"); + xpw->ximp.ximpExtXimpBackFrontAtom = MAKEATOM("_XIMP_EXT_XIMP_BACK_FRONT"); + xpw->ximp.ximpPreeditDrawDataAtom = MAKEATOM("_XIMP_PREEDIT_DRAW_DATA"); + xpw->ximp.ximpFeedbacksAtom = MAKEATOM("_XIMP_FEEDBACKS"); + +#undef MAKEATOM +} + +/*- ownSelection: own conversion selection -*/ +static int +ownSelection(xpw) +XimpProtocolWidget xpw; +{ + Display *dpy = XtDisplay((Widget)xpw); + Window w = XtWindow((Widget)xpw); + + TRACE(("ximpProtocol:ownSelection()\n")); + + if (xpw->ximp.forceDefaultServer || + XGetSelectionOwner(dpy, xpw->ximp.selAtom1) == None) { + TRACE(("\tdefault server\n")); + XSetSelectionOwner(dpy, xpw->ximp.selAtom1, w, CurrentTime); + } + TRACE(("\tspecific server\n")); + XSetSelectionOwner(dpy, xpw->ximp.selAtom2, w, CurrentTime); + + return XGetSelectionOwner(dpy, xpw->ximp.selAtom2) == w; +} + +/* + *+ client data handling + */ + +/*- findClient: get clientdata of given client -*/ +static ConvClient * +findClient(xpw, id) +XimpProtocolWidget xpw; +int id; +{ + register ConvClient *ccp = xpw->ximp.clients; + + while (ccp != NULL) { + if (ccp->id == id) return ccp; + ccp = ccp->next; + } + + return NULL; +} + +/*- newClient: get a clientdata for new client -*/ +static ConvClient * +newClient(xpw, client) +XimpProtocolWidget xpw; +Window client; +{ + ConvClient *ccp; + + if (xpw->ximp.freeclients != NULL) { + /* get one from free list */ + ccp = xpw->ximp.freeclients; + xpw->ximp.freeclients = ccp->next; + } else { + char buf[30]; + + ccp = XtNew(ConvClient); + (void)sprintf(buf, "_XIMP_STRING_%d", xpw->ximp.propid++); + ccp->property = XInternAtom(XtDisplay((Widget)xpw), buf, False); + (void)sprintf(buf, "_XIMP_CALLBACKS_%d", xpw->ximp.callbackpropid++); + ccp->preeditdata = XInternAtom(XtDisplay((Widget)xpw), buf, False); + (void)sprintf(buf, "_XIMP_CALLBACKS_%d", xpw->ximp.callbackpropid++); + ccp->preedittext = XInternAtom(XtDisplay((Widget)xpw), buf, False); + (void)sprintf(buf, "_XIMP_CALLBACKS_%d", xpw->ximp.callbackpropid++); + ccp->preeditfeedback = XInternAtom(XtDisplay((Widget)xpw), buf, False); + (void)sprintf(buf, "_XIMP_CALLBACKS_%d", xpw->ximp.callbackpropid++); + ccp->statustext = XInternAtom(XtDisplay((Widget)xpw), buf, False); + (void)sprintf(buf, "_XIMP_CALLBACKS_%d", xpw->ximp.callbackpropid++); + ccp->statusfeedback = XInternAtom(XtDisplay((Widget)xpw), buf, False); + } + ccp->id = xpw->ximp.icid++; + + ccp->version = NULL; + ccp->style = separate_style; /* default */ + ccp->protocolwidget = (Widget)xpw; + ccp->conversion = NULL; + ccp->reqwin = client; + ccp->focuswin = client; /* default */ + ccp->xpattrs.fontlist = NULL; + ccp->xsattrs.fontlist = NULL; + ccp->xattrmask = 0L; + ccp->defaultsfilledin = False; + ccp->esm = ESMethodSelectFocus; /* default */ + ccp->fonts = NULL; + ccp->num_fonts = 0; + ccp->status_fonts = NULL; + ccp->num_status_fonts = 0; + ccp->resetting = False; + ccp->event = NULL; + ccp->ximstyle = XIMPreeditNothing|XIMStatusNothing; /* default */ + ccp->in_preedit = False; + ccp->in_status = False; + + ccp->next = xpw->ximp.clients; + xpw->ximp.clients = ccp; + + return ccp; +} + +/*- attachConverter: attach converter to the client -*/ +static Widget +attachConverter(ccp) +ConvClient *ccp; +{ + WidgetClass class; + XimpProtocolWidget xpw = (XimpProtocolWidget)ccp->protocolwidget; + + TRACE(("attachConverter(client window=0x%lx)\n", ccp->reqwin)); + if (ccp->conversion != NULL) return ccp->conversion; + + if (ccp->style == overthespot_style) { + class = overTheSpotConversionWidgetClass; + } else if (ccp->style == onthespot_style) { + class = onTheSpotConversionWidgetClass; + } else if (ccp->style == offthespot_style) { + class = offTheSpotConversionWidgetClass; + } else { + class = separateConversionWidgetClass; + } + + ccp->conversion = CMGetConverter(XtParent(ccp->protocolwidget), + ccp->reqwin, class, + xpw->ximp.inputObjClass, + xpw->ximp.displayObjClass); + + return ccp->conversion; +} + +/*- detachConverter: detach converter from client -*/ +static void +detachConverter(ccp) +ConvClient *ccp; +{ + TRACE(("detachConverter(client window=0x%lx)\n", ccp->reqwin)); + + XtRemoveCallback(ccp->conversion, XtNtextCallback, + fixCallback, (XtPointer)ccp); + XtRemoveCallback(ccp->conversion, XtNendCallback, + endCallback, (XtPointer)ccp); + XtRemoveCallback(ccp->conversion, XtNunusedEventCallback, + unusedEventCallback, (XtPointer)ccp); + if (ccp->style == onthespot_style) { + XtRemoveCallback(ccp->conversion, XtNpreeditStartCallback, + preeditStartCallback, (XtPointer)ccp); + XtRemoveCallback(ccp->conversion, XtNpreeditDoneCallback, + preeditDoneCallback, (XtPointer)ccp); + XtRemoveCallback(ccp->conversion, XtNpreeditDrawCallback, + preeditDrawCallback, (XtPointer)ccp); + XtRemoveCallback(ccp->conversion, XtNpreeditCaretCallback, + preeditCaretCallback, (XtPointer)ccp); + XtRemoveCallback(ccp->conversion, XtNstatusStartCallback, + statusStartCallback, (XtPointer)ccp); + XtRemoveCallback(ccp->conversion, XtNstatusDoneCallback, + statusDoneCallback, (XtPointer)ccp); + XtRemoveCallback(ccp->conversion, XtNstatusDrawCallback, + statusDrawCallback, (XtPointer)ccp); + } + + CMReleaseConverter(XtParent(ccp->protocolwidget), ccp->conversion); + ccp->conversion = NULL; +} + +/*- deleteClient: delete specified client -*/ +static void +deleteClient(client) +ConvClient *client; +{ + XimpProtocolWidget xpw = (XimpProtocolWidget)client->protocolwidget; + ConvClient *ccp, *ccp0; + + TRACE(("deleteClient(client window=0x%lx)\n", client->reqwin)); + + if (client->conversion != NULL) detachConverter(client); + if (client->num_fonts > 0) { + FontBankFreeFonts(xpw->ximp.fontbank, + client->fonts, client->num_fonts); + } + if (client->num_status_fonts > 0) { + FontBankFreeFonts(xpw->ximp.fontbank, + client->status_fonts, client->num_status_fonts); + } + if (client->xpattrs.fontlist != NULL && + client->xpattrs.fontlist != xpw->ximp.defaultfontlist) { + XFree(client->xpattrs.fontlist); + } + if (client->xsattrs.fontlist != NULL) { + XFree(client->xsattrs.fontlist); + } + if (client->version != NULL) XtFree(client->version); + + for (ccp = xpw->ximp.clients, ccp0 = NULL; + ccp != NULL; + ccp0 = ccp, ccp = ccp->next) { + if (ccp == client) { + if (ccp0 == NULL) { + xpw->ximp.clients = ccp->next; + } else { + ccp0->next = ccp->next; + } + /* put it back to free list */ + client->next = xpw->ximp.freeclients; + xpw->ximp.freeclients = client; + return; + } + } + DPRINT(("deleteClient: cannot find the client in the client list!\n")); +} + +/* + *+ utility functions + */ + +/*- isCorrectClientEvent: is the event in correct format? -*/ +static Boolean +isCorrectClientEvent(xpw, event) +XimpProtocolWidget xpw; +XEvent *event; +{ + XClientMessageEvent *ev = &(event->xclient); + + return (event->type == ClientMessage && + ev->window == XtWindow((Widget)xpw) && + ev->message_type == xpw->ximp.ximpProtocolAtom && + ev->format == 32); +} + +/*- isCorrectWindowID: is the given window ID valid? -*/ +static Boolean +isCorrectWindowID(w, window, widthp, heightp) +Widget w; +Window window; +Dimension *widthp; +Dimension *heightp; +{ + XWindowAttributes attr; + int status; + XAEHandle h; + + h = XAESetIgnoreErrors(XtDisplay(w)); + status = XGetWindowAttributes(XtDisplay(w), window, &attr); + XAEUnset(h); + + if (status == 0) return False; + + if (widthp != NULL) *widthp = attr.width; + if (heightp != NULL) *heightp = attr.height; + return True; +} + +/*- initializeError: display error message when resource isn't specified -*/ +static void +initializeError(w, resname) +Widget w; +String resname; +{ + String params[2]; + Cardinal num_params; + + params[0] = XtClass(w)->core_class.class_name; + params[1] = resname; + num_params = 2; + XtAppErrorMsg(XtWidgetToApplicationContext(w), + "initializeError", "noResource", "WidgetError", + "%s: resource %s must be specified at widget creation", + params, &num_params); +} + +/*- checkLocale: check specified locale is supported -*/ +static void +checkLocale(xpw, name) +XimpProtocolWidget xpw; +String name; +{ + XimpProtocolWidgetClass class = (XimpProtocolWidgetClass)XtClass((Widget)xpw); + FontBank fontbank; + + TRACE(("checkLocale(localename=%s)\n", name)); + + fontbank = FontBankCreate(XtDisplay((Widget)xpw), name); + if (fontbank == NULL) { + /* not supported locale name */ + String params[2]; + Cardinal num_params; + + params[0] = class->core_class.class_name; + params[1] = name; + num_params = 2; + XtAppErrorMsg(XtWidgetToApplicationContext((Widget)xpw), + "initializeError", "localeNotSupported", "WidgetError", + "%s: specified locale %s is not supported (yet)", + params, &num_params); + } else { + xpw->ximp.fontbank = fontbank; + } +} + +/*- fillInDefaultAttributes: fill in unspecified attributes -*/ +static void +fillInDefaultAttributes(client) +ConvClient *client; +{ + XimpProtocolWidget xpw = (XimpProtocolWidget)client->protocolwidget; + XimpPreEditAttributes *xpattr = &client->xpattrs; + XimpStatusAttributes *xsattr = &client->xsattrs; + unsigned long xmask = client->xattrmask; + + if (client->defaultsfilledin) return; + + /* + * Compute reasonable default values for the unspecified + * attributes except Area and AreaNeeded. + */ + TRACE(("fillInDefaultAttributes()\n")); + if (!(xmask & XIMP_FOCUS_WIN_MASK)) { + client->focuswin = client->reqwin; + client->focuswidth = client->reqwinwidth; + client->focusheight = client->reqwinheight; + } + + if (!(xmask & XIMP_PRE_FONT_MASK)) { + xpattr->fontlist = xpw->ximp.defaultfontlist; + getFonts(client, xpattr->fontlist, 1); + client->xattrmask |= XIMP_PRE_FONT_MASK; + } + if (!(xmask & XIMP_STS_FONT_MASK)) { + /* Default is same as preedit font */ + xsattr->fontlist = XtNewString(xpattr->fontlist); + getFonts(client, xsattr->fontlist, 0); + client->xattrmask |= XIMP_STS_FONT_MASK; + } + + if (!(xmask & XIMP_PRE_FG_MASK)) { + xpattr->foreground = xpw->ximp.foreground; + } + if (!(xmask & XIMP_PRE_BG_MASK)) { + xpattr->background = xpw->core.background_pixel; + } + if (!(xmask & XIMP_PRE_COLORMAP_MASK)) { + xpattr->colormap = xpw->core.colormap; + } + if (!(xmask & XIMP_PRE_BGPIXMAP_MASK)) { + xpattr->bgpixmap = None; + } + if (!(xmask & XIMP_PRE_LINESP_MASK)) { + Cardinal i; + XFontStruct *font; + int maxascent = 0, maxdescent = 0; + + for (i = 0; i < client->num_fonts; i++) { + font = client->fonts[i]; + if (maxascent < font->ascent) maxascent = font->ascent; + if (maxdescent < font->descent) maxdescent = font->descent; + } + xpattr->linespacing = maxascent + maxdescent; + } + if (!(xmask & XIMP_PRE_CURSOR_MASK)) { + xpattr->cursor = None; /* ie use parent's cursor */ + } + if (!(xmask & XIMP_PRE_SPOTL_MASK)) { + xpattr->spotx = xpattr->spoty = 0; + } + if (!(xmask & XIMP_STS_FG_MASK)) { + xsattr->foreground = xpattr->foreground; + } + if (!(xmask & XIMP_STS_BG_MASK)) { + xsattr->background = xpattr->background; + } + if (!(xmask & XIMP_STS_COLORMAP_MASK)) { + xsattr->colormap = xpattr->colormap; + } + if (!(xmask & XIMP_STS_BGPIXMAP_MASK)) { + xsattr->bgpixmap = xpattr->bgpixmap; + } + if (!(xmask & XIMP_STS_LINESP_MASK)) { + xsattr->linespacing = xpattr->linespacing; + } + if (!(xmask & XIMP_STS_CURSOR_MASK)) { + xsattr->cursor = xpattr->cursor; + } + if (!(xmask & XIMP_STS_WINDOW_MASK)) { + xsattr->statuswin = None; + } + + client->defaultsfilledin = True; +} + +/*- computeAreaForStartup: compute Area for conversion startup -*/ +static void +computeAreaForStartup(client) +ConvClient *client; +{ + XimpPreEditAttributes *xpattr = &client->xpattrs; + XimpStatusAttributes *xsattr = &client->xsattrs; + unsigned long mask = client->xattrmask; + + TRACE(("computeAreaForStartup(client=0x%lx)\n", client->reqwin)); + + if (client->style == separate_style || + client->style == onthespot_style || + client->style == overthespot_style) { + /* + * These styles don't need status nor preedit area. + * The separate style simpley ignores them, and the + * over-the-spot style uses default value if not specified. + */ + return; + } + + if ((mask & XIMP_STS_AREA_MASK) && (mask & XIMP_PRE_AREA_MASK)) return; + + /* + * Compute default status/pre-edit area based on the AreaNeeded values. + */ + computeAreaForQuery(client); + + if (!(mask & XIMP_STS_AREA_MASK)) { + xsattr->areax = 0; + xsattr->areay = client->reqwinheight - xsattr->neededheight; + xsattr->areawidth = xsattr->neededwidth; + xsattr->areaheight = xsattr->neededheight; + } + if (!(mask & XIMP_PRE_AREA_MASK)) { + xpattr->areax = xsattr->areax + xsattr->areawidth; + xpattr->areay = client->reqwinheight - xpattr->neededheight; + xpattr->areawidth = xpattr->neededwidth; + xpattr->areaheight = xpattr->neededheight; + } +} + +/*- computeAreaForQuery: compute Area and AreaNeeded for query from clients -*/ +static void +computeAreaForQuery(client) +ConvClient *client; +{ + XimpProtocolWidget xpw = (XimpProtocolWidget)client->protocolwidget; + XimpPreEditAttributes *xpattr = &client->xpattrs; + XimpStatusAttributes *xsattr = &client->xsattrs; + unsigned long mask = client->xattrmask; + int width, height; + int maxwidth, maxheight; + int fontheight; + + TRACE(("computeAreaForQuery(client=0x%lx)\n", client->reqwin)); + + if (client->style == overthespot_style || + client->style == offthespot_style) { + + /* + * Get the size of the request window again. + * The size was checked when XIMP_CREATE message was received, + * but it is possible that the size has changed since then. + */ + (void)isCorrectWindowID(client->protocolwidget, client->reqwin, + &client->reqwinwidth, &client->reqwinheight); + } + + /* + * Compute the dimensions of the status region. + */ + if (client->style == overthespot_style || + client->style == offthespot_style) { + + /* + * Compute AreaNeeded value. + */ + fontheight = xsattr->linespacing + 2; + maxwidth = maxheight = 0; + if (mask & XIMP_STS_AREANEED_MASK) { + maxwidth = xsattr->neededwidth; + maxheight = xsattr->neededheight; + TRACE(("\tstatus areaNeeded was: (%d,%d)\n", maxwidth, maxheight)); + } + + if (xpw->ximp.statuswidth > 0) { + width = xpw->ximp.statuswidth; + } else { + width = client->reqwinwidth / 5; /* wild guess */ + if (width < fontheight * 3) { + width = fontheight * 3; /* another wild guess */ + } + } + height = fontheight; + + if (maxwidth > 0 && width > maxwidth) width = maxwidth; + if (maxheight > 0 && height > maxheight) height = maxheight; + if (width < MIN_AREA_WIDTH) width = MIN_AREA_WIDTH; + if (height < MIN_AREA_HEIGHT) height = MIN_AREA_HEIGHT; + + xsattr->neededwidth = width; + xsattr->neededheight = height; + TRACE(("\tstatus areaNeeded is now: (%d, %d)\n", width, height)); + + /* + * If client has not specified the status area yet, + * supply default value. + */ + if (!(mask & XIMP_STS_AREA_MASK)) { + xsattr->areax = 0; + xsattr->areay = client->reqwinheight - xsattr->neededheight; + xsattr->areawidth = xsattr->neededwidth; + xsattr->areaheight = xsattr->neededheight; + } + } + + /* + * Compute the dimensions of the pre-edit region. + */ + if (client->style == offthespot_style) { + /* + * Compute AreaNeeded value. + */ + fontheight = xpattr->linespacing + 2; + maxwidth = maxheight = 0; + if (mask & XIMP_PRE_AREANEED_MASK) { + maxwidth = xpattr->neededwidth; + maxheight = xpattr->neededheight; + TRACE(("\tpreedit areaNeeded was: (%d,%d)\n", maxwidth, maxheight)); + } + + width = client->reqwinwidth - xsattr->neededwidth; + height = fontheight; + + if (maxwidth > 0 && width > maxwidth) width = maxwidth; + if (maxheight > 0 && height > maxheight) height = maxheight; + if (width < MIN_AREA_WIDTH) width = MIN_AREA_WIDTH; + if (height < MIN_AREA_HEIGHT) height = MIN_AREA_HEIGHT; + + xpattr->neededwidth = width; + xpattr->neededheight = height; + TRACE(("\tpreedit areaNeeded is now: (%d, %d)\n", width, height)); + + /* + * If client has not specified the status area yet, + * supply default value. + */ + if (!(mask & XIMP_PRE_AREA_MASK)) { + xpattr->areax = xsattr->neededwidth; + xpattr->areay = client->reqwinheight - xpattr->neededheight; + xpattr->areawidth = xpattr->neededwidth; + xpattr->areaheight = xpattr->neededheight; + } + } else if (client->style == overthespot_style) { + /* + * No need to calculate AreaNeeded value, which is + * ignored by the client. Just calculate default + * Area if not specified. + */ + if (!(mask & XIMP_PRE_AREA_MASK)) { + xpattr->areax = 0; + xpattr->areay = 0; + xpattr->areawidth = client->focuswidth; + xpattr->areaheight = client->focusheight; + } + } +} + +/*- makeConvAttributes: -*/ +static unsigned long +makeConvAttributes(client, attr) +ConvClient *client; +ConversionAttributes *attr; +{ + XimpPreEditAttributes *xpattr = &client->xpattrs; + XimpStatusAttributes *xsattr = &client->xsattrs; + unsigned long xmask = client->xattrmask; + unsigned long mask; + + TRACE(("makeConvAttributes()\n")); + mask = 0L; + + /* focus window */ + attr->focuswindow = client->focuswin; + mask |= CAFocusWindow; + + if (client->style == overthespot_style || + client->style == offthespot_style) { + + /* client area */ + if (client->style == offthespot_style || + (xmask & XIMP_PRE_AREA_MASK)) { + attr->clientarea.x = xpattr->areax; + attr->clientarea.y = xpattr->areay; + attr->clientarea.width = xpattr->areawidth; + attr->clientarea.height = xpattr->areaheight; + mask |= CAClientArea; + } + + /* foreground/background */ + attr->foreground = xpattr->foreground; + attr->background = xpattr->background; + mask |= CAColor; + + /* colormap */ + if (xmask & XIMP_PRE_COLORMAP_MASK) { + attr->colormap = xpattr->colormap; + mask |= CAColormap; + } + + /* background pixmap */ + if (xmask & XIMP_PRE_BGPIXMAP_MASK) { + attr->background_pixmap = xpattr->bgpixmap; + mask |= CABackgroundPixmap; + } + + /* line spacing */ + if (xmask & XIMP_PRE_LINESP_MASK) { + attr->linespacing = xpattr->linespacing; + mask |= CALineSpacing; + } + + /* cursor */ + if (xmask & XIMP_PRE_CURSOR_MASK) { + attr->cursor = xpattr->cursor; + mask |= CACursor; + } + + /* status area */ + /* offTheSpotConversion doesn't allow status area left unspecified */ + if (client->style == offthespot_style || + (xmask & XIMP_STS_AREA_MASK)) { + attr->statusarea.x = xsattr->areax; + attr->statusarea.y = xsattr->areay; + attr->statusarea.width = xsattr->areawidth; + attr->statusarea.height = xsattr->areaheight; + mask |= CAStatusArea; + } + + /* font */ + attr->fonts = client->fonts; + attr->num_fonts = client->num_fonts; + attr->status_fonts = client->status_fonts; + attr->num_status_fonts = client->num_status_fonts; + mask |= CAFonts|CAStatusFonts; + } + + if (client->style == overthespot_style) { + /* spot location */ + if (xmask & XIMP_PRE_SPOTL_MASK) { + attr->spotx = xpattr->spotx; + attr->spoty = xpattr->spoty; + mask |= CASpotLocation; + } + } + return mask; +} + +/*- getFonts: get fonts from specified fontnamelist -*/ +static void +getFonts(client, fontnamelist, preedit) +ConvClient *client; +String fontnamelist; +int preedit; +{ + XimpProtocolWidget xpw = (XimpProtocolWidget)client->protocolwidget; + XFontStruct **fonts; + int num_fonts; + + TRACE(("getFonts(%s)\n", preedit ? "preedit" : "status")); + TRACE(("\tfontnamelist: %s\n", fontnamelist)); + + fonts = FontBankGet(xpw->ximp.fontbank, fontnamelist, &num_fonts); + if (preedit) { + client->fonts = fonts; + client->num_fonts = num_fonts; + } else { + client->status_fonts = fonts; + client->num_status_fonts = num_fonts; + } +} + + +/* + *+ property handling + */ + +/*- setProperty: set information properties -*/ +static void +setProperty(xpw) +XimpProtocolWidget xpw; +{ + Display *dpy = XtDisplay((Widget)xpw); + Window win = XtWindow((Widget)xpw); + XimpInputStyle *xisp; + unsigned long styles[20]; + Cardinal nstyles; + unsigned long extensions[10]; + Cardinal nextensions; + + TRACE(("setProperty()\n")); + +#define SETPROPERTY(p, t, f, d, n) \ + XChangeProperty(dpy, win, p, t, f, PropModeReplace, (unsigned char *)d, n) + + SETPROPERTY(xpw->ximp.ximpVersionAtom, XA_STRING, 8, + PROTOCOL_VERSION_STR, strlen(PROTOCOL_VERSION_STR)); + SETPROPERTY(xpw->ximp.ximpServerNameAtom, XA_STRING, 8, + SERVER_NAME, strlen(xpw->ximp.servername)); + SETPROPERTY(xpw->ximp.ximpServerVersionAtom, XA_STRING, 8, + SERVER_VERSION, strlen(SERVER_VERSION)); + SETPROPERTY(xpw->ximp.ximpVendorNameAtom, XA_STRING, 8, + VENDOR_NAME, strlen(VENDOR_NAME)); + + for (xisp = XimpStyles, nstyles = 0; xisp->ximstyle != 0; + xisp++, nstyles++) { + styles[nstyles] = xisp->ximstyle; + } + SETPROPERTY(xpw->ximp.ximpStyleAtom, xpw->ximp.ximpStyleAtom, 32, + styles, nstyles); + + nextensions = 0; + extensions[nextensions++] = xpw->ximp.ximpExtXimpBackFrontAtom; + SETPROPERTY(xpw->ximp.ximpExtensionsAtom, xpw->ximp.ximpExtensionsAtom, 32, + extensions, nextensions); + + setKeyProperty(xpw); + +#undef SETPROPERTY +} + +/*- setKeyProperty: set _XIM_KEYS property -*/ +static void +setKeyProperty(xpw) +XimpProtocolWidget xpw; +{ + long data[100]; /* enough */ + char line[256]; /* enough */ + Display *dpy = XtDisplay((Widget)xpw); + int nkeys = 0; + String p, q; + int c, n; + ICTriggerKey *keys, *ekeys; + + if ((p = xpw->ximp.convkeys) != NULL) { + TRACE(("setKeyProperty(%s)\n", p)); + do { + KeySym keysym; + long mods, chk_mods; + + q = line; + while ((c = *p++) != '\0' && c != '\n') { + *q++ = c; + } + *q = '\0'; + if (ParseKeyEvent(line, &keysym, &mods, &chk_mods)) { + data[nkeys * 3] = mods; + data[nkeys * 3 + 1] = chk_mods; + data[nkeys * 3 + 2] = keysym; + nkeys++; + } + } while (c != '\0'); + } + + n = ICGetTriggerKeysOfInputObjectClass(xpw->ximp.inputObjClass, &keys); + for (ekeys = keys + n ; + keys < ekeys && nkeys < (sizeof(data) / sizeof(long)) / 3 ; keys++) { + data[nkeys * 3] = keys->modifiers; + data[nkeys * 3 + 1] = keys->modifiermask; + data[nkeys * 3 + 2] = keys->keysym; + nkeys++; + } + + XChangeProperty(dpy, XtWindow((Widget)xpw), xpw->ximp.ximpKeysAtom, + xpw->ximp.ximpKeysAtom, 32, PropModeReplace, + (unsigned char *)data, nkeys * 3); +} + +/*- getVersionProperty: get _XIMP_VERSION property -*/ +static void +getVersionProperty(client) +ConvClient *client; +{ + XimpProtocolWidget xpw = (XimpProtocolWidget)client->protocolwidget; + String data; + unsigned long len; + + TRACE(("getVersionProperty()\n")); + if (!readProperty(client, xpw->ximp.ximpVersionAtom, XA_STRING, 8, + (unsigned char **)&data, &len)) { + DPRINT(("can't read _XIMP_VERSION property\n")); + client->version = NULL; + return; + } + TRACE(("\tclient version is %s\n", data)); + + /* what to do? */ + + client->version = data; +} + +/*- getAttributes: read properties and set conversion attributes -*/ +static void +getAttributes(client, mask) +ConvClient *client; +unsigned long mask; +{ + if (mask & XIMP_FOCUS_WIN_MASK) { + getFocusProperty(client); + } + if (mask & XIMP_PRE_FONT_MASK) { + getPreeditFontProperty(client); + } + if (mask & XIMP_STS_FONT_MASK) { + getStatusFontProperty(client); + } + if (mask & PREEDIT_MASK) { + getPreeditProperty(client, mask & PREEDIT_MASK); + } + if (mask & STATUS_MASK) { + getStatusProperty(client, mask & STATUS_MASK); + } +} + +/*- getFocusProperty: get _XIMP_FOCUS property -*/ +static void +getFocusProperty(client) +ConvClient *client; +{ + XimpProtocolWidget xpw = (XimpProtocolWidget)client->protocolwidget; + unsigned char *data; + unsigned long len; + Window focus; + Dimension w, h; + + TRACE(("getFocusProperty()\n")); + if (!readProperty(client, xpw->ximp.ximpFocusAtom, XA_WINDOW, 32, + &data, &len)) { + DPRINT(("can't read _XIMP_FOCUS property\n")); + return; + } else if (len != 1) { + DPRINT(("length of _XIMP_FOCUS property is not 1\n")); + XtFree((char *)data); + return; + } + + focus = *(Window *)data; + XtFree((char *)data); + TRACE(("\tfocus window=0x%lx\n", focus)); + + if (!isCorrectWindowID((Widget)xpw, focus, &w, &h)) { + DPRINT(("specified focus window doesn't exist\n")); + sendErrorEvent(client, XIMP_BadFocusWindow); + return; + } + + client->focuswin = focus; + client->focuswidth = w; + client->focusheight = h; + client->xattrmask |= XIMP_FOCUS_WIN_MASK; +} + +/*- getPreeditFontProperty: get _XIMP_PREEDITFONT property -*/ +static void +getPreeditFontProperty(client) +ConvClient *client; +{ + XimpProtocolWidget xpw = (XimpProtocolWidget)client->protocolwidget; + char *data; + unsigned long len; + + TRACE(("getPreeditFontProperty()\n")); + if (!readProperty(client, xpw->ximp.ximpPreeditFontAtom, XA_STRING, 8, + (unsigned char **)&data, &len)) { + DPRINT(("can't read _XIMP_PREEDITFONT property\n")); + return; + } + + if (client->xpattrs.fontlist != NULL) { + if (!strcmp(data, client->xpattrs.fontlist)) { + XtFree(data); + return; + } + if (client->xpattrs.fontlist != xpw->ximp.defaultfontlist) { + XtFree(client->xpattrs.fontlist); + } + } + client->xpattrs.fontlist = data; + client->xattrmask |= XIMP_PRE_FONT_MASK; + + /* extract fonts to be used */ + getFonts(client, data, 1); +} + +/*- getStatusFontProperty: get _XIMP_STATUSFONT property -*/ +static void +getStatusFontProperty(client) +ConvClient *client; +{ + XimpProtocolWidget xpw = (XimpProtocolWidget)client->protocolwidget; + unsigned char *data; + unsigned long len; + + TRACE(("getStatusFontProperty()\n")); + if (!readProperty(client, xpw->ximp.ximpStatusFontAtom, XA_STRING, 8, + &data, &len)) { + DPRINT(("can't read _XIMP_STATUSFONT property\n")); + return; + } + + if (client->xsattrs.fontlist != NULL) { + if (!strcmp(data, client->xsattrs.fontlist)) { + XtFree(data); + return; + } + if (client->xsattrs.fontlist != xpw->ximp.defaultfontlist) { + XtFree(client->xsattrs.fontlist); + } + } + client->xsattrs.fontlist = (String)data; + client->xattrmask |= XIMP_STS_FONT_MASK; + + /* extract fonts to be used */ + getFonts(client, data, 0); +} + +/*- getPreeditProperty: get _XIMP_PREEDIT property -*/ +static void +getPreeditProperty(client, mask) +ConvClient *client; +unsigned long mask; +{ + XimpProtocolWidget xpw = (XimpProtocolWidget)client->protocolwidget; + XimpPreEditAttributes *xpattr = &client->xpattrs; + unsigned long *data; + unsigned long len; + + TRACE(("getPreeditProperty()\n")); + if (!readProperty(client, xpw->ximp.ximpPreeditAtom, + xpw->ximp.ximpPreeditAtom, 32, + (unsigned char **)&data, &len)) { + DPRINT(("can't read _XIMP_PREEDIT property\n")); + return; + } else if (len < 14) { + DPRINT(("length of _XIMP_PREEDIT property is less than 14(%ld)\n",len)); + XtFree((char *)data); + return; + } + + client->xattrmask |= mask; + + /* data[0]-data[3]: Area.{x,y,width,height} */ + if (mask & XIMP_PRE_AREA_MASK) { + xpattr->areax = data[0]; + xpattr->areay = data[1]; + xpattr->areawidth = data[2]; + xpattr->areaheight = data[3]; + if (xpattr->areawidth == 0 || xpattr->areaheight == 0) { + client->xattrmask &= ~XIMP_PRE_AREA_MASK; + DPRINT(("invalid area specified:\n")); + } + TRACE(("\tArea: (%ld,%ld)-(%ld,%ld)\n",data[0],data[1],data[2],data[3])); + } + /* data[4]: Foreground */ + if (mask & XIMP_PRE_FG_MASK) { + xpattr->foreground = data[4]; + TRACE(("\tForeground: %ld\n", data[4])); + } + /* data[5]: Background */ + if (mask & XIMP_PRE_BG_MASK) { + xpattr->background = data[5]; + TRACE(("\tBackground: %ld\n", data[5])); + } + /* data[6]: Colormap */ + if (mask & XIMP_PRE_COLORMAP_MASK) { + xpattr->colormap = data[6]; + TRACE(("\tColormap: 0x%lx\n", data[6])); + } + /* data[7]: BackgroundPixmap */ + if (mask & XIMP_PRE_BGPIXMAP_MASK) { + xpattr->bgpixmap = data[7]; + TRACE(("\tBackgroundPixmap: 0x%lx\n", data[7])); + } + /* data[8]: LineSpacing */ + if (mask & XIMP_PRE_LINESP_MASK) { + if (data[8] < MIN_LINE_SPACING) { + client->xattrmask &= ~XIMP_PRE_LINESP_MASK; + DPRINT(("specified line spacing is too small (%ld)\n", data[8])); + } else { + xpattr->linespacing = data[8]; + TRACE(("\tLineSpacing: %ld\n", data[8])); + } + } + /* data[9]: Cursor */ + if (mask & XIMP_PRE_CURSOR_MASK) { + xpattr->cursor = data[9]; + TRACE(("\tCursor: 0x%lx\n", data[9])); + } + /* data[10]-data[11]: AreaNeeded.{width,height} */ + if (mask & XIMP_PRE_AREANEED_MASK) { + xpattr->neededwidth = data[10]; + xpattr->neededheight = data[11]; + TRACE(("\tAreaNeeded: %ld,%ld\n", data[10], data[11])); + } + /* data[12]-data[13]: SpotLocation.{x,y} */ + if (mask & XIMP_PRE_SPOTL_MASK) { + xpattr->spotx = data[12]; + xpattr->spoty = data[13]; + TRACE(("\tSpotLocation: %ld,%ld\n", data[12], data[13])); + } + + XtFree((char *)data); +} + +/*- getStatusProperty: get _XIMP_STATUS property -*/ +static void +getStatusProperty(client, mask) +ConvClient *client; +unsigned long mask; +{ + XimpProtocolWidget xpw = (XimpProtocolWidget)client->protocolwidget; + XimpStatusAttributes *xsattr = &client->xsattrs; + unsigned long *data; + unsigned long len; + + TRACE(("getStatusProperty()\n")); + if (!readProperty(client, xpw->ximp.ximpStatusAtom, + xpw->ximp.ximpStatusAtom, 32, + (unsigned char **)&data, &len)) { + DPRINT(("can't read _XIMP_STATUS property\n")); + return; + } else if (len < 12) { + DPRINT(("length of _XIMP_STATUS property is less than 12(%ld)\n",len)); + XtFree((char *)data); + return; + } + + client->xattrmask |= mask; + + /* data[0]-data[3]: Area.{x,y,width,height} */ + if (mask & XIMP_STS_AREA_MASK) { + xsattr->areax = data[0]; + xsattr->areay = data[1]; + xsattr->areawidth = data[2]; + xsattr->areaheight = data[3]; + if (xsattr->areawidth == 0 || xsattr->areaheight == 0) { + client->xattrmask &= ~XIMP_STS_AREA_MASK; + DPRINT(("invalid area specified:\n")); + } + TRACE(("\tArea: (%ld,%ld)-(%ld,%ld)\n", + data[0],data[1],data[2],data[3])); + } + /* data[4]: Foreground */ + if (mask & XIMP_STS_FG_MASK) { + xsattr->foreground = data[4]; + TRACE(("\tForeground: %ld\n", data[4])); + } + /* data[5]: Background */ + if (mask & XIMP_STS_BG_MASK) { + xsattr->background = data[5]; + TRACE(("\tBackground: %ld\n", data[5])); + } + /* data[6]: Colormap */ + if (mask & XIMP_STS_COLORMAP_MASK) { + xsattr->colormap = data[6]; + TRACE(("\tColormap: 0x%lx\n", data[6])); + } + /* data[7]: BackgroundPixmap */ + if (mask & XIMP_STS_BGPIXMAP_MASK) { + xsattr->bgpixmap = data[7]; + TRACE(("\tBackgroundPixmap: 0x%lx\n", data[7])); + } + /* data[8]: LineSpacing */ + if (mask & XIMP_STS_LINESP_MASK) { + if (data[8] < MIN_LINE_SPACING) { + client->xattrmask &= ~XIMP_STS_LINESP_MASK; + DPRINT(("specified line spacing is too small (%ld)\n", data[8])); + } else { + xsattr->linespacing = data[8]; + TRACE(("\tLineSpacing: %ld\n", data[8])); + } + } + /* data[9]: Cursor */ + if (mask & XIMP_STS_CURSOR_MASK) { + xsattr->cursor = data[9]; + TRACE(("\tCursor: 0x%lx\n", data[9])); + } + /* data[10]-data[11]: AreaNeeded.{width,height} */ + if (mask & XIMP_STS_AREANEED_MASK) { + xsattr->neededwidth = data[10]; + xsattr->neededheight = data[11]; + TRACE(("\tAreaNeeded: %ld,%ld\n", data[10], data[11])); + } + /* data[12]: StatusWindowID -- not suppoted by kinput2 */ + if (len > 12 && (mask & XIMP_STS_WINDOW_MASK)) { + xsattr->statuswin = None; /* ignore specified value */ + TRACE(("\tStatusWindow(not supported): 0x%lx\n", data[12])); + } + + XtFree((char *)data); +} + +/*- readProperty: read specified property of the client window -*/ +static Boolean +readProperty(client, prop, type, format, datapp, lenp) +ConvClient *client; +Atom prop; +Atom type; +int format; +unsigned char **datapp; +unsigned long *lenp; +{ + Atom realtype; + int realformat; + unsigned long bytesafter; + + *datapp = NULL; + /* + * generally, XGetWindowProperty can generate BadAtom, BadValue and + * BadWindow errors. but in this case, none of those errors can occur. + * atoms are valid, offset 0 won't cause BadValue, and window ID is + * already validated. (strictly speaking, there's a chance of getting + * BadWindow if the client window destroyed after it was validated. + * let's forget it for a while :-) so we don't have to be careful to + * errors. + */ + (void)XGetWindowProperty(XtDisplay(client->protocolwidget), + client->reqwin, + prop, 0L, 1000L, True, type, + &realtype, &realformat, lenp, + &bytesafter, datapp); + if (realtype == None) { + /* specified property doesn't exist */ + sendErrorEvent(client, XIMP_BadProperty); + return False; + } else if (realtype != type) { + /* wrong type */ + sendErrorEvent(client, XIMP_BadPropertyType); + return False; + } else if (realformat != format) { + /* wrong format */ + if (*datapp != NULL) XtFree((char *)*datapp); + *datapp = NULL; + /* there's no XIMP_BadFormat error. use XIMP_BadPropertyType instead */ + sendErrorEvent(client, XIMP_BadPropertyType); + return False; + } + return True; +} + +/*- setAttributes: set properties according to the conversion attributes -*/ +static void +setAttributes(client, mask) +ConvClient *client; +unsigned long mask; +{ + if (mask & XIMP_FOCUS_WIN_MASK) { + setFocusProperty(client); + } + if (mask & XIMP_PRE_FONT_MASK) { + setPreeditFontProperty(client); + } + if (mask & XIMP_STS_FONT_MASK) { + setStatusFontProperty(client); + } + if (mask & PREEDIT_MASK) { + setPreeditProperty(client, mask); + } + if (mask & STATUS_MASK) { + setStatusProperty(client, mask); + } +} + +/*- setFocusProperty: set _XIMP_FOCUS property -*/ +static void +setFocusProperty(client) +ConvClient *client; +{ + XimpProtocolWidget xpw = (XimpProtocolWidget)client->protocolwidget; + + TRACE(("setFocusProperty()\n")); + writeProperty(client, xpw->ximp.ximpFocusAtom, XA_WINDOW, 32, + (unsigned char *)&client->focuswin, 1); +} + +/*- setPreeditFontProperty: set _XIMP_PREEDITFONT property -*/ +static void +setPreeditFontProperty(client) +ConvClient *client; +{ + XimpProtocolWidget xpw = (XimpProtocolWidget)client->protocolwidget; + + TRACE(("setPreeditFontProperty()\n")); + writeProperty(client, xpw->ximp.ximpPreeditFontAtom, XA_STRING, 8, + (unsigned char *)client->xpattrs.fontlist, + strlen(client->xpattrs.fontlist)); +} + +/*- setStatusFontProperty: set _XIMP_STATUSFONT property -*/ +static void +setStatusFontProperty(client) +ConvClient *client; +{ + XimpProtocolWidget xpw = (XimpProtocolWidget)client->protocolwidget; + + TRACE(("setStatusFontProperty()\n")); + writeProperty(client, xpw->ximp.ximpStatusFontAtom, XA_STRING, 8, + (unsigned char *)client->xsattrs.fontlist, + strlen(client->xsattrs.fontlist)); +} + +/*- setPreeditProperty: set _XIMP_PREEDIT property -*/ +static void +setPreeditProperty(client, mask) +ConvClient *client; +unsigned long mask; +{ + XimpProtocolWidget xpw = (XimpProtocolWidget)client->protocolwidget; + XimpPreEditAttributes *xpattr = &client->xpattrs; + long data[14]; + + TRACE(("setPreeditProperty()\n")); + + /* data[0]-data[3]: Area.{x,y,width,height} */ + if (mask & XIMP_PRE_AREA_MASK) { + data[0] = xpattr->areax; + data[1] = xpattr->areay; + data[2] = xpattr->areawidth; + data[3] = xpattr->areaheight; + } + /* data[4]: Foreground */ + if (mask & XIMP_PRE_FG_MASK) { + data[4] = xpattr->foreground; + } + /* data[5]: Background */ + if (mask & XIMP_PRE_BG_MASK) { + data[5] = xpattr->background; + } + /* data[6]: Colormap */ + if (mask & XIMP_PRE_COLORMAP_MASK) { + data[6] = xpattr->colormap; + } + /* data[7]: BackgroundPixmap */ + if (mask & XIMP_PRE_BGPIXMAP_MASK) { + data[7] = xpattr->bgpixmap; + } + /* data[8]: LineSpacing */ + if (mask & XIMP_PRE_LINESP_MASK) { + data[8] = xpattr->linespacing; + } + /* data[9]: Cursor */ + if (mask & XIMP_PRE_CURSOR_MASK) { + data[9] = xpattr->cursor; + } + /* data[10]-data[11]: AreaNeeded.{width,height} */ + if (mask & XIMP_PRE_AREANEED_MASK) { + data[10] = xpattr->neededwidth; + data[11] = xpattr->neededheight; + } + /* data[12]-data[13]: SpotLocation.{x,y} */ + if (mask & XIMP_PRE_SPOTL_MASK) { + data[12] = xpattr->spotx; + data[13] = xpattr->spoty; + } + + writeProperty(client, xpw->ximp.ximpPreeditAtom, + xpw->ximp.ximpPreeditAtom, 32, + (unsigned char *)data, 14); +} + +/*- setStautsProperty: set _XIMP_STATUS property -*/ +static void +setStatusProperty(client, mask) +ConvClient *client; +unsigned long mask; +{ + XimpProtocolWidget xpw = (XimpProtocolWidget)client->protocolwidget; + XimpStatusAttributes *xsattr = &client->xsattrs; + long data[13]; + + TRACE(("setStatusProperty()\n")); + + /* data[0]-data[3]: Area.{x,y,width,height} */ + if (mask & XIMP_STS_AREA_MASK) { + data[0] = xsattr->areax = data[0]; + data[1] = xsattr->areay = data[1]; + data[2] = xsattr->areawidth = data[2]; + data[3] = xsattr->areaheight = data[3]; + } + /* data[4]: Foreground */ + if (mask & XIMP_STS_FG_MASK) { + data[4] = xsattr->foreground; + } + /* data[5]: Background */ + if (mask & XIMP_STS_BG_MASK) { + data[5] = xsattr->background; + } + /* data[6]: Colormap */ + if (mask & XIMP_STS_COLORMAP_MASK) { + data[6] = xsattr->colormap; + } + /* data[7]: BackgroundPixmap */ + if (mask & XIMP_STS_BGPIXMAP_MASK) { + data[7] = xsattr->bgpixmap; + } + /* data[8]: LineSpacing */ + if (mask & XIMP_STS_LINESP_MASK) { + data[8] = xsattr->linespacing; + } + /* data[9]: Cursor */ + if (mask & XIMP_STS_CURSOR_MASK) { + data[9] = xsattr->cursor; + } + /* data[10]-data[11]: AreaNeeded.{width,height} */ + if (mask & XIMP_STS_AREANEED_MASK) { + data[10] = xsattr->neededwidth; + data[11] = xsattr->neededheight; + } + /* data[12]: StatusWindowID -- not suppoted by kinput2 */ + if (mask & XIMP_STS_WINDOW_MASK) { + data[12] = xsattr->statuswin; + } + + writeProperty(client, xpw->ximp.ximpStatusAtom, + xpw->ximp.ximpStatusAtom, 32, + (unsigned char *)data, 13); +} + +/*- writeProperty: write specified property of the client window -*/ +static void +writeProperty(client, prop, type, format, datap, len) +ConvClient *client; +Atom prop; +Atom type; +int format; +unsigned char *datap; +int len; +{ + /* + * generally, XChangeWindowProperty can generate BadAlloc, BadAtom, + * BadMatch, BadValue and BadWindow errors. but in this case, none of + * those errors except BadAlloc can occur. atoms and values to be + * specified are valid (at least if the program is correct :-), mode + * PropModeReplace won't cause BadMatch, and window ID is already + * validated. so, if we assume amount of memory is infinite :-), we + * don't have to be careful to errors. + */ + (void)XChangeProperty(XtDisplay(client->protocolwidget), + client->reqwin, prop, type, format, + PropModeReplace, datap, len); +} + +/* + *+ event sending + */ + +/*- sendClientMessage8: send a clientmessage event (format=8) -*/ +static void +sendClientMessage8(client, str, len) +ConvClient *client; +char *str; +int len; +{ + XimpProtocolWidget xpw = (XimpProtocolWidget)client->protocolwidget; + XEvent event; + + event.xclient.type = ClientMessage; + event.xclient.window = client->focuswin; + event.xclient.message_type = xpw->ximp.ximpProtocolAtom; + event.xclient.format = 8; + + /* client ID must be stored in network byte order (ie MSB first) */ + event.xclient.data.b[0] = (client->id >> 24) & 0xff; + event.xclient.data.b[1] = (client->id >> 16) & 0xff; + event.xclient.data.b[2] = (client->id >> 8) & 0xff; + event.xclient.data.b[3] = client->id & 0xff; + + event.xclient.data.b[4] = len; + + (void)strncpy(&event.xclient.data.b[5], str, 20 - 5); + + XSendEvent(XtDisplay((Widget)xpw), event.xclient.window, + False, NoEventMask, &event); +} + +/*- sendClientMessage32: send a clientmessage event (format=32) -*/ +static void +sendClientMessage32(client, type, l1, l2, l3, l4) +ConvClient *client; +int type; +unsigned long l1, l2, l3, l4; +{ + XimpProtocolWidget xpw = (XimpProtocolWidget)client->protocolwidget; + XEvent event; + + event.xclient.type = ClientMessage; + event.xclient.window = client->focuswin; + event.xclient.message_type = xpw->ximp.ximpProtocolAtom; + event.xclient.format = 32; + event.xclient.data.l[0] = type; + event.xclient.data.l[1] = l1; + event.xclient.data.l[2] = l2; + event.xclient.data.l[3] = l3; + event.xclient.data.l[4] = l4; + + XSendEvent(XtDisplay((Widget)xpw), event.xclient.window, + False, NoEventMask, &event); +} + +/*- sendKeyEvent: send unused keypress event via clientmessage event -*/ +static void +sendKeyEvent(client, keyevent) +ConvClient *client; +XKeyEvent *keyevent; +{ + TRACE(("sendKeyEvent()\n")); + sendClientMessage32(client, XIMP_KEYPRESS, client->id, + (unsigned long)keyevent->keycode, + (unsigned long)keyevent->state, 0L); +} + +/*- sendErrorEvent: send error event via clientmessage event -*/ +static void +sendErrorEvent(client, error) +ConvClient *client; +int error; +{ + sendClientMessage32(client, XIMP_ERROR, client->id, + client->event->serial, (unsigned long)error, 0L); +} + +/*- sendCreateRefusal: send rejecting message to a CREATE request -*/ +static void +sendCreateRefusal(xpw, window) +XimpProtocolWidget xpw; +Window window; +{ + XEvent event; + + event.xclient.type = ClientMessage; + event.xclient.window = window; + event.xclient.message_type = xpw->ximp.ximpProtocolAtom; + event.xclient.format = 32; + event.xclient.data.l[0] = XIMP_CREATE_RETURN; + event.xclient.data.l[1] = 0L; + event.xclient.data.l[2] = 0L; + event.xclient.data.l[3] = 0L; + event.xclient.data.l[4] = 0L; + + XSendEvent(XtDisplay((Widget)xpw), window, False, NoEventMask, &event); +} + +/* + *+ callback procedures + */ + +/*- fixCallback: fix callback -*/ +/* ARGSUSED */ +static void +fixCallback(w, client_data, call_data) +Widget w; +XtPointer client_data; +XtPointer call_data; +{ + CCTextCallbackArg *arg = (CCTextCallbackArg *)call_data; + ConvClient *ccp = (ConvClient *)client_data; + + TRACE(("fixCallback(reqwin=0x%lx, length=%d)\n",ccp->reqwin, arg->length)); + fixProc(ccp, arg); +} + +/*- fixProc: do actual fix processing -*/ +static void +fixProc(client, arg) +ConvClient *client; +CCTextCallbackArg *arg; +{ + XimpProtocolWidget xpw = (XimpProtocolWidget)client->protocolwidget; + + /* check encoding and format */ + if (arg->encoding != xpw->ximp.ctextAtom || arg->format != 8) { + /* + * since every conversion object must support COMPOUND_TEXT, + * it is a serious error. + */ + String params[2]; + Cardinal num_params; + + params[0] = XtClass((Widget)xpw)->core_class.class_name; + params[1] = xpw->ximp.inputObjClass->core_class.class_name; + num_params = 2; + + XtAppErrorMsg(XtWidgetToApplicationContext(client->protocolwidget), + "encodingError", "convertedString", "WidgetError", + "%s: encoding of the converted string is not COMPOUND_STRING. check inputObject %s", + params, &num_params); + } + + /* + * normaly, converted string can be sent to client either via + * ClientMessage event or via property. + * the strategy used here is as follows: + * if the string is short enough to fit in a event, + * use ClientMessage. else, use property. + * however in case of reset, the string must be sent via property. + */ +#define MAX_BYTES_IN_A_EVENT (20 - 4 - 1) + + if (!client->resetting && arg->length <= MAX_BYTES_IN_A_EVENT) { + TRACE(("\tsending string via event\n")); + sendClientMessage8(client, arg->text, arg->length); + } else { + TRACE(("\tsending string via property\n")); + XChangeProperty(XtDisplay((Widget)xpw), XtWindow((Widget)xpw), + client->property, arg->encoding, arg->format, + PropModeAppend, (unsigned char *)arg->text, arg->length); + /* when resetting, XIMP_READPROP event should not be sent */ + if (!client->resetting) { + TRACE(("\tsending XIMP_READPROP message\n")); + sendClientMessage32(client, XIMP_READPROP, + client->id, client->property, 0L, 0L); + } + } +#undef MAX_BYTES_IN_A_EVENT +} + +/*- endCallback: conversion end callback -*/ +/* ARGSUSED */ +static void +endCallback(w, client_data, call_data) +Widget w; +XtPointer client_data; +XtPointer call_data; +{ + ConvClient *ccp = (ConvClient *)client_data; + int abort = (int)call_data; + + TRACE(("endCallback(reqwin=0x%lx,abort=%s)\n", ccp->reqwin, abort?"True":"False")); + endProc(ccp, abort); +} + +/*- endProc: conversion end processing -*/ +static void +endProc(client, abort) +ConvClient *client; +int abort; +{ + if (client->conversion == NULL) return; + + preeditDone(client); + + if (!abort) { + TRACE(("\tsending XIMP_PROCESS_END message\n")); + sendClientMessage32(client, XIMP_PROCESS_END, + client->id, 0L, 0L, 0L); + } + detachConverter(client); +} + +/*- unusedEventCallback: unused key event callback -*/ +/* ARGSUSED */ +static void +unusedEventCallback(w, client_data, call_data) +Widget w; +XtPointer client_data; +XtPointer call_data; +{ + ConvClient *ccp = (ConvClient *)client_data; + XKeyEvent *ev = (XKeyEvent *)call_data; + + TRACE(("unusedEventCallback(reqwin=0x%lx)\n", ccp->reqwin)); + sendKeyEvent(ccp, ev); +} + +/* + *+ ClientMessage event handler + */ + +/*- ximpCreateMessageProc: XIMP_CREATE message handler -*/ +static void +ximpCreateMessageProc(xpw, ev) +XimpProtocolWidget xpw; +XClientMessageEvent *ev; +{ + Window reqwin; + XIMStyle inputstyle; + unsigned long attrmask; + ConvClient *client; + XimpInputStyle *styles = XimpStyles; + Dimension w, h; + + TRACE(("ximpCreateMessageProc(window=0x%lx)\n", ev->data.l[1])); + + reqwin = ev->data.l[1]; + + /* check validity of the client window ID */ + if (!isCorrectWindowID((Widget)xpw, reqwin, &w, &h)) { + DPRINT(("\tspecified window doesn't exist!\n")); + return; + } + + inputstyle = ev->data.l[2]; + + /* check specified input style */ + while (styles->ximstyle != inputstyle) { + if (styles->ximstyle == 0L) { + /* + * client is requesting an input style which kinput2 + * doesn't support + */ + DPRINT(("\tclient wants unspported input style\n")); + sendCreateRefusal(xpw, reqwin); + return; + } + styles++; + } + +#ifdef DEBUG + if (DEBUG_CONDITION) { + printf("\tinputstyle: Preedit"); + if (styles->ximstyle & XIMPreeditArea) printf("Area"); + if (styles->ximstyle & XIMPreeditCallbacks) printf("Callbacks"); + if (styles->ximstyle & XIMPreeditPosition) printf("Position"); + if (styles->ximstyle & XIMPreeditNothing) printf("Nothing"); + if (styles->ximstyle & XIMPreeditNone) printf("None"); + printf(", Status"); + if (styles->ximstyle & XIMStatusArea) printf("Area"); + if (styles->ximstyle & XIMStatusCallbacks) printf("Callbacks"); + if (styles->ximstyle & XIMStatusNothing) printf("Nothing"); + if (styles->ximstyle & XIMStatusNone) printf("None"); + printf("\n"); + } +#endif + client = newClient(xpw, reqwin); + client->reqwinwidth = w; + client->reqwinheight = h; + client->event = ev; + client->style = styles->cstyle; + client->ximstyle = styles->ximstyle; + + attrmask = ev->data.l[3]; + + getVersionProperty(client); + + /* get conversion attributes */ + getAttributes(client, attrmask); + + /* watch for client destroy */ + MyAddEventHandler(XtDisplay((Widget)xpw), reqwin, + DestroyNotify, StructureNotifyMask, + ClientDead, (XtPointer)client); + + TRACE(("\tsending XIMP_CREATE_RETURN message\n")); + sendClientMessage32(client, XIMP_CREATE_RETURN, client->id, 0L, 0L, 0L); + + statusStart(client); +} + +/*- ximpDestroyMessageProc: XIMP_DESTROY message handler -*/ +static void +ximpDestroyMessageProc(xpw, ev) +XimpProtocolWidget xpw; +XClientMessageEvent *ev; +{ + ConvClient *client; + int id; + + TRACE(("ximpDestroyMessageProc()\n")); + + id = ev->data.l[1]; + if ((client = findClient(xpw, id)) == NULL) { + DPRINT(("\tinvalid ID\n")); + return; + } + client->event = ev; + + MyRemoveEventHandler(XtDisplay((Widget)xpw), client->reqwin, DestroyNotify, + ClientDead, (XtPointer)client); + + statusDone(client); + if (client->conversion != NULL) { + CControlEndConversion(client->conversion); + endProc(client, False); + } + deleteClient(client); +} + +/*- ximpBeginMessageProc: XIMP_BEGIN message handler -*/ +static void +ximpBeginMessageProc(xpw, ev) +XimpProtocolWidget xpw; +XClientMessageEvent *ev; +{ + ConvClient *client; + int id; + ConversionAttributes attrs; + unsigned long attrmask; + + TRACE(("ximpBeginMessageProc()\n")); + + id = ev->data.l[1]; + if ((client = findClient(xpw, id)) == NULL) { + DPRINT(("\tinvalid ID\n")); + return; + } + client->event = ev; + if (client->conversion != NULL) { + /* already converting */ + DPRINT(("\tclient already in conversion mode\n")); + /* should we send XIMP_BadProtocol error event? */ + return; + } + + if (attachConverter(client) == NULL) { + /* + * since no appropriate error code is defined, + * use BadAlloc... + */ + sendErrorEvent(client, XIMP_BadAlloc); + /* + * to let the client select key events again, + * send XIMP_PROCESS_END message. + */ + sendClientMessage32(client, XIMP_PROCESS_END, + client->id, 0L, 0L, 0L); + return; + } + + XtAddCallback(client->conversion, XtNtextCallback, + fixCallback, (XtPointer)client); + XtAddCallback(client->conversion, XtNendCallback, + endCallback, (XtPointer)client); + XtAddCallback(client->conversion, XtNunusedEventCallback, + unusedEventCallback, (XtPointer)client); + if (client->style == onthespot_style) { + XtAddCallback(client->conversion, XtNpreeditStartCallback, + preeditStartCallback, (XtPointer)client); + XtAddCallback(client->conversion, XtNpreeditDoneCallback, + preeditDoneCallback, (XtPointer)client); + XtAddCallback(client->conversion, XtNpreeditDrawCallback, + preeditDrawCallback, (XtPointer)client); + XtAddCallback(client->conversion, XtNpreeditCaretCallback, + preeditCaretCallback, (XtPointer)client); + XtAddCallback(client->conversion, XtNstatusStartCallback, + statusStartCallback, (XtPointer)client); + XtAddCallback(client->conversion, XtNstatusDoneCallback, + statusDoneCallback, (XtPointer)client); + XtAddCallback(client->conversion, XtNstatusDrawCallback, + statusDrawCallback, (XtPointer)client); + } + + fillInDefaultAttributes(client); + computeAreaForStartup(client); + attrmask = makeConvAttributes(client, &attrs); + + /* start conversion */ + XtVaSetValues(client->conversion, XtNeventSelectMethod, client->esm, NULL); + CControlStartConversion(client->conversion, client->reqwin, + attrmask, &attrs); + + TRACE(("\tsending XIMP_PROCESS_BEGIN message\n")); + sendClientMessage32(client, XIMP_PROCESS_BEGIN, client->id, 0L, 0L, 0L); + + preeditStart(client); +} + +/*- ximpEndMessageProc: XIMP_END message handler -*/ +static void +ximpEndMessageProc(xpw, ev) +XimpProtocolWidget xpw; +XClientMessageEvent *ev; +{ + ConvClient *client; + int id; + + TRACE(("ximpEndMessageProc()\n")); + + id = ev->data.l[1]; + if ((client = findClient(xpw, id)) == NULL) { + DPRINT(("\tinvalid ID\n")); + return; + } + client->event = ev; + if (client->conversion == NULL) { + /* not converting now */ + DPRINT(("\tclient isn't in conversion mode\n")); + /* should we send XIMP_BadProtocol error event? */ + return; + } + + CControlEndConversion(client->conversion); + endProc(client, False); +} + +/*- ximpSetFocusMessageProc: XIMP_SETFOCUS message handler -*/ +static void +ximpSetFocusMessageProc(xpw, ev) +XimpProtocolWidget xpw; +XClientMessageEvent *ev; +{ + ConvClient *client; + int id; + + TRACE(("ximpSetFocusMessageProc()\n")); + + id = ev->data.l[1]; + if ((client = findClient(xpw, id)) == NULL) { + DPRINT(("\tinvalid ID\n")); + return; + } + client->event = ev; + /* what to do? */ + + statusStart(client); + if (client->conversion != NULL) { + CControlChangeFocus(client->conversion, 1); + } +} + +/*- ximpUnsetFocusMessageProc: XIMP_UNSETFOCUS message handler -*/ +static void +ximpUnsetFocusMessageProc(xpw, ev) +XimpProtocolWidget xpw; +XClientMessageEvent *ev; +{ + ConvClient *client; + int id; + + TRACE(("ximpUnsetFocusMessageProc()\n")); + + id = ev->data.l[1]; + if ((client = findClient(xpw, id)) == NULL) { + DPRINT(("\tinvalid ID\n")); + return; + } + client->event = ev; + /* what to do? */ + + if (client->conversion != NULL) { + CControlChangeFocus(client->conversion, 0); + } + statusDone(client); +} + +/*- ximpMoveMessageProc: XIMP_MOVE message handler -*/ +static void +ximpMoveMessageProc(xpw, ev) +XimpProtocolWidget xpw; +XClientMessageEvent *ev; +{ + ConvClient *client; + int id; + ConversionAttributes attrs; + + TRACE(("ximpMoveMessageProc()\n")); + + id = ev->data.l[1]; + if ((client = findClient(xpw, id)) == NULL) { + DPRINT(("\tinvalid ID\n")); + return; + } + client->event = ev; + client->xpattrs.spotx = ev->data.l[2]; + client->xpattrs.spoty = ev->data.l[3]; + client->xattrmask |= XIMP_PRE_SPOTL_MASK; + if (client->conversion != NULL) { + attrs.spotx = client->xpattrs.spotx; + attrs.spoty = client->xpattrs.spoty; + CControlChangeAttributes(client->conversion, CASpotLocation, &attrs); + } +} + +/*- ximpResetMessageProc: XIMP_RESET message handler -*/ +static void +ximpResetMessageProc(xpw, ev) +XimpProtocolWidget xpw; +XClientMessageEvent *ev; +{ + ConvClient *client; + int id; + Widget inputobj; + + TRACE(("ximpResetMessageProc()\n")); + + id = ev->data.l[1]; + if ((client = findClient(xpw, id)) == NULL) { + DPRINT(("\tinvalid ID\n")); + return; + } + client->event = ev; + client->resetting = True; + + if (client->conversion == NULL) { + XChangeProperty(XtDisplay((Widget)xpw), XtWindow((Widget)xpw), + client->property, xpw->ximp.ctextAtom, 8, + PropModeAppend, (unsigned char *)"", 0); + } else { + /* + * get input object by asking conversion widget of XtNinputObject + * resource. however, it is not recommended since protocol widget + * should interact with input object only through conversion + * widget. + */ + CCTextCallbackArg arg; + + XtVaGetValues(client->conversion, XtNinputObject, &inputobj, NULL); + arg.encoding = xpw->ximp.ctextAtom; + if (ICGetConvertedString(inputobj, &arg.encoding, &arg.format, + &arg.length, &arg.text) >= 0) { + fixProc(client, &arg); + } else { + /* there's no string */ + XChangeProperty(XtDisplay((Widget)xpw), XtWindow((Widget)xpw), + client->property, xpw->ximp.ctextAtom, 8, + PropModeAppend, (unsigned char *)"", 0); + } + ICClearConversion(inputobj); + } + + TRACE(("\tsending XIMP_RESET_RETURN message\n")); + sendClientMessage32(client, XIMP_RESET_RETURN, client->id, + client->property, 0L, 0L); +} + +/*- ximpSetValueMessageProc: XIMP_SETVALUE message handler -*/ +static void +ximpSetValueMessageProc(xpw, ev) +XimpProtocolWidget xpw; +XClientMessageEvent *ev; +{ + ConvClient *client; + unsigned long mask; + ConversionAttributes attrs; + unsigned long attrmask; + int id; + + TRACE(("ximpSetValueMessageProc()\n")); + + id = ev->data.l[1]; + if ((client = findClient(xpw, id)) == NULL) { + DPRINT(("\tinvalid ID\n")); + return; + } + mask = ev->data.l[2]; + client->event = ev; + getAttributes(client, mask); + if (client->conversion != NULL) { + attrmask = makeConvAttributes(client, &attrs); + CControlChangeAttributes(client->conversion, attrmask, &attrs); + } +} + +/*- ximpChangeMessageProc: XIMP_CHANGE message handler -*/ +static void +ximpChangeMessageProc(xpw, ev) +XimpProtocolWidget xpw; +XClientMessageEvent *ev; +{ + ConvClient *client; + Atom atom; + unsigned long mask; + ConversionAttributes attrs; + unsigned long attrmask; + int id; + + TRACE(("ximpChangeMessageProc()\n")); + + id = ev->data.l[1]; + if ((client = findClient(xpw, id)) == NULL) { + DPRINT(("\tinvalid ID\n")); + return; + } + atom = (Atom)ev->data.l[2]; + + if (atom == xpw->ximp.ximpFocusAtom) { + mask = XIMP_FOCUS_WIN_MASK; + } else if (atom == xpw->ximp.ximpPreeditAtom) { + mask = PREEDIT_MASK; + } else if (atom == xpw->ximp.ximpStatusAtom) { + mask = STATUS_MASK; + } else if (atom == xpw->ximp.ximpPreeditFontAtom) { + mask = XIMP_PRE_FONT_MASK; + } else if (atom == xpw->ximp.ximpStatusFontAtom) { + mask = XIMP_STS_FONT_MASK; + } else { + /* invalid property name */ + sendErrorEvent(client, XIMP_BadProperty); + return; + } + + client->event = ev; + getAttributes(client, mask); + if (client->conversion != NULL) { + attrmask = makeConvAttributes(client, &attrs); + CControlChangeAttributes(client->conversion, attrmask, &attrs); + } +} + +/*- ximpGetValueMessageProc: XIMP_GETVALUE message handler -*/ +static void +ximpGetValueMessageProc(xpw, ev) +XimpProtocolWidget xpw; +XClientMessageEvent *ev; +{ + ConvClient *client; + unsigned long mask; + int id; + + TRACE(("ximpGetValueMessageProc()\n")); + + id = ev->data.l[1]; + if ((client = findClient(xpw, id)) == NULL) { + DPRINT(("\tinvalid ID\n")); + return; + } + mask = ev->data.l[2]; + client->event = ev; + + fillInDefaultAttributes(client); + computeAreaForQuery(client); + setAttributes(client, mask); + + TRACE(("\tsending XIMP_GETVALUE_RETURN message\n")); + sendClientMessage32(client, XIMP_GETVALUE_RETURN, client->id, 0L, 0L, 0L); +} + +/*- ximpKeyPressMessageProc: XIMP_KEYPRESS message handler -*/ +static void +ximpKeyPressMessageProc(xpw, ev) +XimpProtocolWidget xpw; +XClientMessageEvent *ev; +{ + ConvClient *client; + int id; + XKeyEvent keyevent; + + TRACE(("ximpKeyPressMessageProc()\n")); + + id = ev->data.l[1]; + if ((client = findClient(xpw, id)) == NULL) { + DPRINT(("\tinvalid ID\n")); + return; + } + client->event = ev; + + if (client->conversion == NULL) return; + + /* make a fake keypress event */ + keyevent.type = KeyPress; + keyevent.serial = ev->serial; + keyevent.send_event = True; + keyevent.display = ev->display; + keyevent.window = client->focuswin; + keyevent.root = DefaultRootWindow(ev->display); + /* hope conversion object won't check this field */ + keyevent.subwindow = None; + /* hope conversion object won't check this field */ + keyevent.time = 0; /* hope conversion object won't check this field */ + keyevent.x = 0; + keyevent.y = 0; + keyevent.x_root = 0; + keyevent.y_root = 0; + keyevent.state = ev->data.l[3]; + keyevent.keycode = ev->data.l[2]; + keyevent.same_screen = True; + + /* call action routine */ + XtCallActionProc(client->conversion, "to-inputobj", (XEvent *)&keyevent, + (String *)NULL, (Cardinal)0); +} + +/*- ximpExtensionMessageProc: XIMP_Extension message handler -*/ +static void +ximpExtensionMessageProc(xpw, ev) +XimpProtocolWidget xpw; +XClientMessageEvent *ev; +{ + ConvClient *client; + Atom extatom; + int id; + + TRACE(("ximpExtensionMessageProc()\n")); + + id = ev->data.l[1]; + if ((client = findClient(xpw, id)) == NULL) { + DPRINT(("\tinvalid ID\n")); + return; + } + extatom = ev->data.l[2]; /* extension name */ + client->event = ev; + + if (extatom == xpw->ximp.ximpExtXimpBackFrontAtom) { + TRACE(("\t_XIMP_EXT_XIMP_BACK_FRONT extension -- ")); + if (client->conversion != NULL) { + /* invalid */ + DPRINT(("invalid (now in conversion mode)\n")); + return; + } + if (ev->data.l[3] != 0) { + /* backend method */ + TRACE(("backend\n")); + client->esm = ESMethodNone; + } else { + TRACE(("frontend\n")); + client->esm = ESMethodSelectFocus; + } + } else { + DPRINT(("\tunknown extension atom -- %ld", extatom)); + sendErrorEvent(client, XIMP_BadAtom); + } +} + +/*- XimpMessageProc: _XIMP_PROTOCOL message event handler -*/ +/* ARGSUSED */ +static void +XimpMessageProc(w, event, args, num_args) +Widget w; +XEvent *event; +String *args; +Cardinal *num_args; +{ + XimpProtocolWidget xpw = (XimpProtocolWidget)w; + XClientMessageEvent *ev = &event->xclient; + ConvClient *client; + + TRACE(("XimpMessageProc()\n")); + /* is it a correct event? */ + if (!isCorrectClientEvent(xpw, event)) { + /*ignore */ + DPRINT(("got invalid clientmessage event.\n")); + return; + } + switch((int)ev->data.l[0]) { + case XIMP_CREATE: ximpCreateMessageProc(xpw, ev); break; + case XIMP_DESTROY: ximpDestroyMessageProc(xpw, ev); break; + case XIMP_BEGIN: ximpBeginMessageProc(xpw, ev); break; + case XIMP_END: ximpEndMessageProc(xpw, ev); break; + case XIMP_SETFOCUS: ximpSetFocusMessageProc(xpw, ev); break; + case XIMP_UNSETFOCUS: ximpUnsetFocusMessageProc(xpw, ev); break; + case XIMP_KEYPRESS: ximpKeyPressMessageProc(xpw, ev); break; + case XIMP_SETVALUE: ximpSetValueMessageProc(xpw, ev); break; + case XIMP_CHANGE: ximpChangeMessageProc(xpw, ev); break; + case XIMP_GETVALUE: ximpGetValueMessageProc(xpw, ev); break; + case XIMP_MOVE: ximpMoveMessageProc(xpw, ev); break; + case XIMP_RESET: ximpResetMessageProc(xpw, ev); break; + case XIMP_EXTENSION: ximpExtensionMessageProc(xpw, ev); break; + case XIMP_PREEDITSTART_RETURN: break; + case XIMP_PREEDITCARET_RETURN: break; + default: + DPRINT(("\tunknown command code (%ld) ignored\n", ev->data.l[0])); + /* assume ev->data.l[1] contains ICID */ + if ((client = findClient(xpw, (int)ev->data.l[1])) != NULL) { + client->event = ev; + sendErrorEvent(client, XIMP_BadProtocol); + } + break; + } +} + +/* + *+ other event handler + */ + +/*- SelectionRequestProc: SelectionRequest event handler -*/ +/*ARGSUSED*/ +static void +SelectionRequestProc(w, event, args, num_args) +Widget w; +XEvent *event; +String *args; /* not used */ +Cardinal *num_args; /* not used */ +{ + XSelectionRequestEvent *ev = &(event->xselectionrequest); + XEvent repl; + String params[1]; + Cardinal num_params; + + repl.xselection.type = SelectionNotify; + repl.xselection.requestor = ev->requestor; + repl.xselection.selection = ev->selection; + repl.xselection.target = ev->target; + repl.xselection.property = None; + repl.xselection.time = ev->time; + + params[0] = XtClass(w)->core_class.class_name; + num_params = 1; + XtAppWarningMsg(XtWidgetToApplicationContext(w), + "selectionError", "SelectionRequest", "WidgetError", + "%s: SelectionRequest event received", + params, &num_params); + + XSendEvent(ev->display, ev->requestor, False, NoEventMask, &repl); +} + +/*- SelectionClearProc: SelectionClear event handler -*/ +/* ARGSUSED */ +static void +SelectionClearProc(w, event, args, num_args) +Widget w; +XEvent *event; +String *args; +Cardinal *num_args; +{ + XimpProtocolWidget xpw = (XimpProtocolWidget)w; + XSelectionClearEvent *ev = (XSelectionClearEvent *)event; + ConvClient *ccp; + String params[1]; + Cardinal num_params; + + /* Selection owner changed */ + + if (ev->selection == xpw->ximp.selAtom1) { + /* someone has become a new default server */ + xpw->ximp.selAtom1 = None; + return; + } else if (ev->selection != xpw->ximp.selAtom2) { + TRACE(("XimpProtocol:SelectionClearProc() SelectionClear event for unknown selection received\n")); + return; + } + + /* + * send ConversionEnd event to the clients before exit + */ + for (ccp = xpw->ximp.clients; ccp; ccp = ccp->next) { + if (ccp->reqwin != None) { + statusDone(ccp); + endProc(ccp, False); + } + } + + params[0] = XtClass(w)->core_class.class_name; + num_params = 1; + XtAppWarningMsg(XtWidgetToApplicationContext(w), + "selectionError", "SelectionClear", "WidgetError", + "%s: SelectionClear event received", + params, &num_params); + + XtDestroyWidget(w); +} + +/*- ClientDead: DestroyNotify event handler -*/ +static void +ClientDead(ev, data) +XEvent *ev; +XtPointer data; +{ + ConvClient *ccp = (ConvClient *)data; + + TRACE(("ClientDead(window=0x%lx)\n", ev->xdestroywindow.window)); + if (ev->type != DestroyNotify || + ev->xdestroywindow.window != ccp->reqwin) return; + + MyRemoveAllEventHandler(ev->xany.display, ccp->reqwin); + deleteClient(ccp); +} + +/* + *+ on-the-spot callback procedures + */ + +/*- preeditStartCallback: preedit start -*/ +/* ARGSUSED */ +static void +preeditStartCallback(w, client_data, call_data) +Widget w; +XtPointer client_data; +XtPointer call_data; +{ + ConvClient *ccp = (ConvClient *)client_data; + TRACE(("preeditStartCallback(reqwin=0x%lx)\n", ccp->reqwin)); + preeditStart(ccp); +} + +/*- preeditDoneCallback: preedit done -*/ +/* ARGSUSED */ +static void +preeditDoneCallback(w, client_data, call_data) +Widget w; +XtPointer client_data; +XtPointer call_data; +{ + ConvClient *ccp = (ConvClient *)client_data; + TRACE(("preeditDoneCallback(reqwin=0x%lx)\n", ccp->reqwin)); + preeditDone(ccp); +} + +/*- preeditDrawCallback: preedit draw -*/ +/* ARGSUSED */ +static void +preeditDrawCallback(w, client_data, call_data) +Widget w; +XtPointer client_data; +XtPointer call_data; +{ + ConvClient *ccp = (ConvClient *)client_data; + OCCPreeditDrawArg *arg = (OCCPreeditDrawArg *)call_data; + TRACE(("preeditDrawCallback(reqwin=0x%lx, length=%d)\n", ccp->reqwin, arg->text_length)); + preeditDraw(ccp, arg); +} + +/*- preeditCaretCallback: preedit caret -*/ +/* ARGSUSED */ +static void +preeditCaretCallback(w, client_data, call_data) +Widget w; +XtPointer client_data; +XtPointer call_data; +{ + ConvClient *ccp = (ConvClient *)client_data; + int caret = (int)call_data; + TRACE(("preeditCaretCallback(reqwin=0x%lx, caret=%d)\n",ccp->reqwin,caret)); + preeditCaret(ccp, caret); +} + +/*- statusStartCallback: status start -*/ +/* ARGSUSED */ +static void +statusStartCallback(w, client_data, call_data) +Widget w; +XtPointer client_data; +XtPointer call_data; +{ + ConvClient *ccp = (ConvClient *)client_data; + TRACE(("statusStartCallback(reqwin=0x%lx)\n", ccp->reqwin)); + statusStart(ccp); +} + +/*- statusDoneCallback: status done -*/ +/* ARGSUSED */ +static void +statusDoneCallback(w, client_data, call_data) +Widget w; +XtPointer client_data; +XtPointer call_data; +{ + ConvClient *ccp = (ConvClient *)client_data; + TRACE(("statusDoneCallback(reqwin=0x%lx)\n", ccp->reqwin)); + statusDone(ccp); +} + +/*- statusDrawCallback: status draw -*/ +/* ARGSUSED */ +static void +statusDrawCallback(w, client_data, call_data) +Widget w; +XtPointer client_data; +XtPointer call_data; +{ + ConvClient *ccp = (ConvClient *)client_data; + OCCPreeditDrawArg *arg = (OCCPreeditDrawArg *)call_data; + TRACE(("statusDrawCallback(reqwin=0x%lx, length=%d)\n", ccp->reqwin, arg->text_length)); + statusDraw(ccp, arg); +} + +/*- preeditStart: do preedit start -*/ +static void +preeditStart(client) +ConvClient *client; +{ + TRACE(("preeditStart(reqwin=0x%lx)\n", client->reqwin)); + if (!(client->ximstyle & XIMPreeditCallbacks)) + return; + if (!client->in_preedit) { + TRACE(("\tsending XIMP_PREEDITSTART message\n")); + sendClientMessage32(client, XIMP_PREEDITSTART, client->id, 0L, 0L, 0L); + client->in_preedit = True; + } +} + +/*- preeditDone: do preedit done -*/ +static void +preeditDone(client) +ConvClient *client; +{ + TRACE(("preeditDone(reqwin=0x%lx)\n", client->reqwin)); + if (!(client->ximstyle & XIMPreeditCallbacks)) + return; + if (client->in_preedit) { + TRACE(("\tsending XIMP_PREEDITDONE message\n")); + sendClientMessage32(client, XIMP_PREEDITDONE, client->id, 0L, 0L, 0L); + client->in_preedit = False; + } +} + +/*- preeditDraw: do actual preedit draw -*/ +static void +preeditDraw(client, data) +ConvClient *client; +OCCPreeditDrawArg *data; +{ + XimpProtocolWidget xpw = (XimpProtocolWidget)client->protocolwidget; + Display *xd = XtDisplay((Widget)xpw); + Window xw = XtWindow((Widget)xpw); + unsigned long *feedbacks; + Boolean allsamefb; + int i; + + if (!(client->ximstyle & XIMPreeditCallbacks)) + return; + + preeditStart(client); + + /* check encoding and format */ + if (data->encoding != xpw->ximp.ctextAtom || data->format != 8) { + /* + * since every conversion object must support COMPOUND_TEXT, + * it is a serious error. + */ + String params[2]; + Cardinal num_params; + + params[0] = XtClass((Widget)xpw)->core_class.class_name; + params[1] = xpw->ximp.inputObjClass->core_class.class_name; + num_params = 2; + + XtAppErrorMsg(XtWidgetToApplicationContext(client->protocolwidget), + "encodingError", "preeditString", "WidgetError", + "%s: encoding of the preedit string is not COMPOUND_STRING. check inputObject %s", + params, &num_params); + } + + feedbacks = data->attrs; + allsamefb = True; + if (data->attrs_length > 0) { + unsigned long check = data->attrs[0]; + for (i = 0; i < data->attrs_length; i++) { + if (feedbacks[i] != check) allsamefb = False; + } + } + +#define MAX_BYTES_IN_A_EVENT (20 - 4 - 1) + if (data->text_length <= MAX_BYTES_IN_A_EVENT) { + if (!allsamefb) { + TRACE(("\tsending feedbacks via property\n")); + XChangeProperty(xd, xw, client->preeditfeedback, + xpw->ximp.ximpFeedbacksAtom, 32, PropModeAppend, + (unsigned char *)feedbacks, data->attrs_length); + } + if (!client->resetting) { + unsigned long fb = (data->attrs_length > 0 ? feedbacks[0] : 0); + int status = 0; + + if (data->text_length == 0) + status |= 0x1; /* no_text */ + if (data->attrs_length == 0) + status |= 0x2; /* no_feedback */ + if (!allsamefb) + status |= 0x4; /* feedbacks_via_property */ + + TRACE(("\tsending XIMP_PREEDITDRAW_CM message\n")); + sendClientMessage32( + client, XIMP_PREEDITDRAW_CM, client->id, + (status << 16) | (data->caret & 0xffff), + (data->chg_first << 16) | (data->chg_length & 0xffff), + (allsamefb ? fb : client->preeditfeedback)); + + if (data->text_length > 0) { + TRACE(("\tsending string via event\n")); + sendClientMessage8(client, data->text, data->text_length); + } + } + } + else { + long atoms[3]; + atoms[0] = data->caret; + atoms[1] = data->chg_first; + atoms[2] = data->chg_length; + TRACE(("\tsending preedit data via property\n")); + XChangeProperty(xd, xw, client->preeditdata, + xpw->ximp.ximpPreeditDrawDataAtom, 32, PropModeAppend, + (unsigned char *)atoms, 3); + TRACE(("\tsending string via property\n")); + XChangeProperty(xd, xw, client->preedittext, + data->encoding, data->format, PropModeAppend, + (unsigned char *)data->text, data->text_length); + TRACE(("\tsending feedbacks via property\n")); + XChangeProperty(xd, xw, client->preeditfeedback, + xpw->ximp.ximpFeedbacksAtom, 32, PropModeAppend, + (unsigned char *)feedbacks, data->attrs_length); + if (!client->resetting) { + TRACE(("\tsending XIMP_PREEDITDRAW message\n")); + sendClientMessage32(client, XIMP_PREEDITDRAW, client->id, + client->preeditdata, client->preedittext, + client->preeditfeedback); + } + } +#undef MAX_BYTES_IN_A_EVENT +} + +/*- preeditCaret: do actual preedit caret -*/ +static void +preeditCaret(client, caret) +ConvClient *client; +int caret; +{ + XimpProtocolWidget xpw = (XimpProtocolWidget)client->protocolwidget; + + TRACE(("\tsending XIMP_PREEDITCARET message\n")); + if (!(client->ximstyle & XIMPreeditCallbacks)) + return; + sendClientMessage32(client, XIMP_PREEDITCARET, client->id, + caret, (long)XIMAbsolutePosition, (long)XIMPrimary); +} + +/*- statusStart: do status start -*/ +static void +statusStart(client) +ConvClient *client; +{ + TRACE(("statusStart(reqwin=0x%lx)\n", client->reqwin)); + if (!(client->ximstyle & XIMStatusCallbacks)) + return; + if (!client->in_status) { + TRACE(("\tsending XIMP_STATUSSTART message\n")); + sendClientMessage32(client, XIMP_STATUSSTART, client->id, 0L, 0L, 0L); + client->in_status = True; + } +} + +/*- statusDone: do status done -*/ +static void +statusDone(client) +ConvClient *client; +{ + TRACE(("statusDone(reqwin=0x%lx)\n", client->reqwin)); + if (!(client->ximstyle & XIMStatusCallbacks)) + return; + if (client->in_status) { + TRACE(("\tsending XIMP_STATUSDONE message\n")); + sendClientMessage32(client, XIMP_STATUSDONE, client->id, 0L, 0L, 0L); + client->in_status = False; + } +} + +/*- statusDraw: do actual status draw -*/ +static void +statusDraw(client, data) +ConvClient *client; +OCCPreeditDrawArg *data; +{ + XimpProtocolWidget xpw = (XimpProtocolWidget)client->protocolwidget; + Display *xd = XtDisplay((Widget)xpw); + Window xw = XtWindow((Widget)xpw); + int type = 0; /* text type */ + + if (!(client->ximstyle & XIMStatusCallbacks)) + return; + + statusStart(client); + + /* check encoding and format */ + if (data->encoding != xpw->ximp.ctextAtom || data->format != 8) { + /* + * since every conversion object must support COMPOUND_TEXT, + * it is a serious error. + */ + String params[2]; + Cardinal num_params; + + params[0] = XtClass((Widget)xpw)->core_class.class_name; + params[1] = xpw->ximp.inputObjClass->core_class.class_name; + num_params = 2; + + XtAppErrorMsg(XtWidgetToApplicationContext(client->protocolwidget), + "encodingError", "statusString", "WidgetError", + "%s: encoding of the status string is not COMPOUND_STRING. check inputObject %s", + params, &num_params); + } + +#define MAX_BYTES_IN_A_EVENT (20 - 4 - 1) + if (data->text_length <= MAX_BYTES_IN_A_EVENT) { + int feedback = 0; + if (!client->resetting) { + TRACE(("\tsending XIMP_STATUSDRAW_CM message\n")); + sendClientMessage32(client, XIMP_STATUSDRAW_CM, client->id, + type, feedback, 0L); + TRACE(("\tsending string via event\n")); + sendClientMessage8(client, data->text, data->text_length); + } + } + else { + int i; + int *feedbacks = (int *)XtMalloc(data->attrs_length * sizeof(int)); + for (i = 0; i < data->attrs_length; i++) feedbacks[i] = 0; + TRACE(("\tsending string via property\n")); + XChangeProperty(xd, xw, client->statustext, + data->encoding, data->format, PropModeAppend, + (unsigned char *)data->text, data->text_length); + TRACE(("\tsending feedbacks via property\n")); + XChangeProperty(xd, xw, client->statusfeedback, + xpw->ximp.ximpFeedbacksAtom, 32, PropModeAppend, + (unsigned char *)feedbacks, data->attrs_length); + if (!client->resetting) { + TRACE(("\tsending XIMP_STATUSDRAW message\n")); + sendClientMessage32(client, XIMP_STATUSDRAW, client->id, + type, client->statustext, + client->statusfeedback); + } + /* feedbacks $B$r(B free $B$7$F$*$/(B */ + XtFree((char *)feedbacks); + } +#undef MAX_BYTES_IN_A_EVENT +} + + +#endif /* defined(XlibSpecificationRelease) && XlibSpecificationRelease >= 5 */ diff -r 000000000000 -r 92745d501b9a lib/Xsj3clib/Imakefile --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/Xsj3clib/Imakefile Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,43 @@ +#include "../../Kinput2.conf" + + SRCS = buffer.c \ + candidate.c \ + code.c \ + connect.c \ + conv.c \ + dict.c \ + func.c \ + libif.c \ + mode.c \ + segment.c \ + sj3ctype.c \ + sjrc.c \ + symbol.c \ + table.c \ + util.c + + OBJS = buffer.o \ + candidate.o \ + code.o \ + connect.o \ + conv.o \ + dict.o \ + func.o \ + libif.o \ + mode.o \ + segment.o \ + sj3ctype.o \ + sjrc.o \ + symbol.o \ + table.o \ + util.o + + SJ3INCS = -I$(SJ3SRC)/sj3lib -I$(SJ3SRC) + LOCAL_INCLUDES = -I../../include + INCLUDES = $(LOCAL_INCLUDES) $(SJ3INCS) + + DEFINES = -DSJ3DEFPATH=\"$(SJ3DEF_DIR)/\" -DTHROUGH_CONT + +NormalLibraryObjectRule() +NormalLibraryTarget(Xsj3clib,$(OBJS)) +DependTarget() diff -r 000000000000 -r 92745d501b9a lib/Xsj3clib/buffer.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/Xsj3clib/buffer.c Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,904 @@ +#ifndef lint +static char *rcsid = "$Header: /net/sras32/mnt3/home/mgr/ishisone/lib/cvsroot/kinput2/src/lib/Xsj3clib/buffer.c,v 2.7 1998/07/21 09:21:15 ishisone Exp $"; +#endif +/* + * Copyright 1991 Sony Corporation + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Sony not be used in advertising or + * publicity pertaining to distribution of the software without specific, + * written prior permission. Sony makes no representations about the + * suitability of this software for any purpose. It is provided "as is" + * without express or implied warranty. + * + * SONY DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL SONY + * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ +/* + * Author: Naoshi Suzuki, SONY Corporation. (nao@sm.sony.co.jp) + */ + +#include +#include +#include +#include "common.h" +#include "util.h" +#include "func.h" +#include "segment.h" +#include "table.h" + +Xsj3cBuf Xsj3cCreateBuffer(); +void Xsj3cFreeBuffer(); +void Xsj3cClearBuffer(); +void Xsj3cFixBuffer(); +void Xsj3cFlushBuffer(); + +int _Xsj3cSetKeyTable(); +extern int _Xsj3cSetGuide(); + +static void _Xsj3cFreeModeStr(); +static Xsj3cKeyTable *_Xsj3cAllocKeyTable(); +static Xsj3cKeyTable *_Xsj3cGetFreeKeyTable(); +static void _Xsj3cAddFreeKeyTable(); +static void _Xsj3cFreeAllKeyTable(); +static int _Xsj3cSetKeySym(); +static long _Xsj3cGetModMask(); + +static Xsj3cKeyTable *keynowtp = NULL, *keymaxtp = NULL; +static Xsj3cKeyTable *firstkeytp = NULL, *freekeytp = NULL; +static int refcount = 0; + +static struct _sjrcdeftable { + char *key[2]; + char *value[10]; +} def_guide_table[] = { + "guide", "hiragana", /* $B$+$J(B */ "\202\251\202\310", + "", "", "", "", "", "", "", "", "", + "guide", "zkatakana", /* $BA4%+%J(B*/ "\221\123\203\112\203\151", + "", "", "", "", "", "", "", "", "", + "guide", "hkatakana", /* $BH>%+%J(B*/ "\224\274\203\112\203\151", + "", "", "", "", "", "", "", "", "", + "guide", "halpha",/* ABC */ "\101\102\103", + "", "", "", "", "", "", "", "", "", + "guide", "zalpha",/* $B#A#B#C(B */ "\202\140\202\141\202\142", + "", "", "", "", "", "", "", "", "", + "guide", "sjis", /* Shift-JIS */ "\123\150\151\146\164\55\112\111\123", + "", "", "", "", "", "", "", "", "", + "guide", "euc", /* $B#E#U#C(B */ "\202\144\202\164\202\142", + "", "", "", "", "", "", "", "", "", + "guide", "jis", /* $B#J#I#S(B */ "\202\151\202\150\202\162", + "", "", "", "", "", "", "", "", "", + "guide", "kuten", /* $B6hE@(B */ "\213\346\223\137", + "", "", "", "", "", "", "", "", "", + "guide", "toroku", /* $BEPO?(B */ "\223\157\230\136", + "", "", "", "", "", "", "", "", "", + "guide", "syoukyo", /* $B>C5n(B */ "\217\301\213\216", + "", "", "", "", "", "", "", "", "", + "guide", "kanji", /* $B4A;z(B */ "\212\277\216\232", + "", "", "", "", "", "", "", "", "", + "guide", "edit", /* $BJT=8(B */ "\225\322\217\127", + "", "", "", "", "", "", "", "", "", + "guide", "candidate",/* $B0lMw(B */ "\210\352\227\227", + "", "", "", "", "", "", "", "", "", + "guide", "symbol",/* $B5-9f(B */ "\213\114\215\206", + "", "", "", "", "", "", "", "", "", + "guide", "hinsi", /* $BIJ;l(B */ "\225\151\216\214", + "", "", "", "", "", "", "", "", "", + "guide", "quote", /* $B0zMQ(B */ "\210\370\227\160", + "", "", "", "", "", "", "", "", "", +}; + +static Xsj3cKeyTable defkeys[] = { + "henkan", XK_Select, FlushModeMask, _Xsj3cConvert, NONE,NULL,NULL, + "convert", XK_Select, FlushModeMask, _Xsj3cConvert, NONE,NULL,NULL, + "muhen", XK_Cancel, ConvedModeMask|ShiftMask, + _Xsj3cUnConvert, NONE,NULL,NULL, + "unconvert",XK_Cancel, ConvedModeMask|ShiftMask, + _Xsj3cUnConvert, NONE,NULL,NULL, + "fix", XK_Execute, FlushModeMask|DictModeMask, + _Xsj3cFix, NONE,NULL,NULL, + "kettei", XK_KP_Enter,FlushModeMask, _Xsj3cFix, NONE,NULL,NULL, + "flush", XK_Escape, FlushModeMask, _Xsj3cFix, NONE,NULL,NULL, + "return", XK_Return, AllModeMask, _Xsj3cReturn, NONE,NULL,NULL, + "halpha", XK_F6, AllModeMask, _Xsj3cModeHAlpha, NONE,NULL,NULL, + "zalpha", XK_F7, AllModeMask, _Xsj3cModeZAlpha, NONE,NULL,NULL, + "hkatakana",XK_F8, AllModeMask, _Xsj3cModeHKata, NONE,NULL,NULL, + "zkatakana",XK_F9, AllModeMask, _Xsj3cModeZKata, NONE,NULL,NULL, + "hiragana", XK_F10, AllModeMask, _Xsj3cModeHira, NONE,NULL,NULL, + "tohalpha", XK_F16, FlushModeMask|ShiftMask, + _Xsj3cToHAlpha, NONE,NULL,NULL, + "tozalpha", XK_F17, FlushModeMask|ShiftMask, + _Xsj3cToZAlpha, NONE,NULL,NULL, + "tohkatakana",XK_F18, FlushModeMask|ShiftMask, + _Xsj3cToHKata, NONE,NULL,NULL, + "tozkatakana",XK_F19, FlushModeMask|ShiftMask, + _Xsj3cToZKata, NONE,NULL,NULL, + "tohiragana",XK_F20, FlushModeMask|ShiftMask, + _Xsj3cToHira, NONE,NULL,NULL, + "zenkaku", XK_F4, FlushModeMask, _Xsj3cZenkaku, NONE,NULL,NULL, + "hankaku", XK_F3, FlushModeMask, _Xsj3cHankaku, NONE,NULL,NULL, + "toupper", XK_u, FlushModeMask|ControlMask, + _Xsj3cToUpper, NONE,NULL,NULL, + "tolower", XK_l, FlushModeMask|ControlMask, + _Xsj3cToLower, NONE,NULL,NULL, + "sjis", XK_F15, NoInputModeMask|FlushModeMask|ShiftMask, + _Xsj3cModeSJIS, NONE,NULL,NULL, + "euc", XK_F14, NoInputModeMask|FlushModeMask|ShiftMask, + _Xsj3cModeEUC, NONE,NULL,NULL, + "jis", XK_F13, NoInputModeMask|FlushModeMask|ShiftMask, + _Xsj3cModeJIS, NONE,NULL,NULL, + "kuten", XK_F12, NoInputModeMask|FlushModeMask|ShiftMask, + _Xsj3cModeKuten, NONE,NULL,NULL, + "code", XK_F5, NoInputModeMask|FlushModeMask, + _Xsj3cCodeRollDown, NONE,NULL,NULL, + "toggle", XK_Tab, AllModeMask, _Xsj3cModeRollDown, NONE,NULL,NULL, + "modedown", XK_Tab, AllModeMask, _Xsj3cModeRollDown, NONE,NULL,NULL, + "toggleback",XK_Tab, AllModeMask|ShiftMask, + _Xsj3cModeRollUp, NONE,NULL,NULL, + "modeup", XK_Tab, AllModeMask|ShiftMask, + _Xsj3cModeRollUp, NONE,NULL,NULL, + "nextmode", XK_Tab, FlushModeMask|ControlMask, + _Xsj3cNextMode, NONE,NULL,NULL, + "prevmode", XK_Tab, FlushModeMask|ControlMask|ShiftMask, + _Xsj3cPrevMode, NONE,NULL,NULL, + "muhenkan", XK_Cancel, NoInputModeMask|FlushModeMask, + _Xsj3cModeToggle, NONE,NULL,NULL, + "right", XK_Right, AllModeMask, _Xsj3cForward, NONE,NULL,NULL, + "forward", XK_Right, AllModeMask, _Xsj3cForward, NONE,NULL,NULL, + "left", XK_Left, AllModeMask, _Xsj3cBackward, NONE,NULL,NULL, + "backward", XK_Left, AllModeMask, _Xsj3cBackward, NONE,NULL,NULL, + "top", XK_a, FlushModeMask|DictModeMask|ControlMask, + _Xsj3cTop, NONE,NULL,NULL, + "end", XK_e, FlushModeMask|DictModeMask|ControlMask, + _Xsj3cEnd, NONE,NULL,NULL, + "bottom", XK_e, FlushModeMask|DictModeMask|ControlMask, + _Xsj3cEnd, NONE,NULL,NULL, + "up", XK_Up, SelectModeMask, _Xsj3cUp, NONE,NULL,NULL, + "down", XK_Down, SelectModeMask, _Xsj3cDown, NONE,NULL,NULL, + "first", XK_Up, OutputModeMask|ControlMask, + _Xsj3cFirst, NONE,NULL,NULL, + "last", XK_Down, OutputModeMask|ControlMask, + _Xsj3cLast, NONE,NULL,NULL, + "nextp", XK_Select, SelectModeMask, _Xsj3cNextPage, NONE,NULL,NULL, + "prevp", XK_Cancel, SelectModeMask, _Xsj3cPrevPage, NONE,NULL,NULL, + "wrap", XK_Down, ConvedModeMask|ShiftMask, + _Xsj3cNext, NONE,NULL,NULL, + "next", XK_Down, ConvedModeMask|ShiftMask, + _Xsj3cNext, NONE,NULL,NULL, + "wrapback", XK_Up, ConvedModeMask|ShiftMask, + _Xsj3cPrev, NONE,NULL,NULL, + "prev", XK_Up, ConvedModeMask|ShiftMask, + _Xsj3cPrev, NONE,NULL,NULL, + "select", XK_Execute, SelectModeMask, _Xsj3cSelect, NONE,NULL,NULL, + "cancel", XK_Escape, SelectModeMask|DictModeMask, + _Xsj3cCancel, NONE,NULL,NULL, + "cancel", XK_Cancel, FlushModeMask|ShiftMask, + _Xsj3cCancel, NONE,NULL,NULL, + "kakucyou", XK_Up, FlushModeMask|DictModeMask, + _Xsj3cExpand, NONE,NULL,NULL, + "expand", XK_Up, FlushModeMask|DictModeMask, + _Xsj3cExpand, NONE,NULL,NULL, + "syukusyou",XK_Down, FlushModeMask|DictModeMask, + _Xsj3cShrink, NONE,NULL,NULL, + "shrink", XK_Down, FlushModeMask|DictModeMask, + _Xsj3cShrink, NONE,NULL,NULL, + "backspace",XK_BackSpace,FlushModeMask|SelectModeMask|DictModeMask, + _Xsj3cBackSpace, NONE,NULL,NULL, + "delete", XK_Delete, FlushModeMask|SelectModeMask|DictModeMask, + _Xsj3cDelete, NONE,NULL,NULL, + "delafter", XK_k, FlushModeMask|ControlMask, + _Xsj3cDelAfter, NONE,NULL,NULL, + "start", XK_Kanji, AllModeMask|ShiftMask, + _Xsj3cStart, NONE,NULL,NULL, + "reconnect",XK_Kanji, AllModeMask|ShiftMask|Mod1Mask, + _Xsj3cReConnect, NONE,NULL,NULL, + "saihenkan",XK_Select, NoInputModeMask|ControlMask, + _Xsj3cReConvert, NONE,NULL,NULL, + "recovert", XK_Select, NoInputModeMask|ControlMask, + _Xsj3cReConvert, NONE,NULL,NULL, + "edit", XK_Select, ConvedModeMask|Mod1Mask, + _Xsj3cEdit, NONE,NULL,NULL, + "toroku", XK_F1, ConvedModeMask, _Xsj3cDRegBegin, NONE,NULL,NULL, + "register", XK_F1, ConvedModeMask, _Xsj3cDRegBegin, NONE,NULL,NULL, + "syoukyo", XK_F2, ConvedModeMask, _Xsj3cDClearBegin, NONE,NULL,NULL, + "eliminate",XK_F2, ConvedModeMask, _Xsj3cDClearBegin, NONE,NULL,NULL, + "symbol", XK_Escape, NoInputModeMask|FlushModeMask|ShiftMask, + _Xsj3cSymbolBegin, NONE,NULL,NULL, + "quote", XK_q, NoInputModeMask|FlushModeMask|ControlMask, + _Xsj3cQuote, NONE,NULL,NULL, + "flushbefore",NoSymbol, NULL, _Xsj3cFlushBefore, NONE,NULL,NULL, + "bell", NoSymbol, NULL, _Xsj3cBell, NONE,NULL,NULL, + "sjrc", NoSymbol, NULL, _Xsj3cSjrc, NONE,NULL,NULL, + "kill", NoSymbol, NULL, _Xsj3cKill, NONE,NULL,NULL, + "kana", NoSymbol, NULL, _Xsj3cKana, NONE,NULL,NULL, + "null", NoSymbol, NULL, _Xsj3cNull, NONE,NULL,NULL, + "ignore", NoSymbol, NULL, _Xsj3cIgnore, NONE,NULL,NULL, + NULL, NULL, NULL, NULL, NONE,NULL,NULL +}; + +#define KEYTBMAX (BUFSIZ/sizeof(Xsj3cKeyTable) - 1) + +/* + * _Xsj3cAllocKeyTable() + * Allocate memmory for key-function conversion table. + */ +static Xsj3cKeyTable * +_Xsj3cAllocKeyTable() +{ + register Xsj3cKeyTable *keytp; + + if (keynowtp == NULL || keynowtp > keymaxtp) { + keytp = (Xsj3cKeyTable *)malloc(BUFSIZ); + if (keytp == NULL) + return (NULL); + else + bzero((char *)keytp, BUFSIZ); + if (!firstkeytp) + firstkeytp = keytp; + keynowtp = keytp; + keymaxtp = keynowtp + KEYTBMAX; + keynowtp++; + } else { + keytp = keynowtp; + keynowtp++; + } + keytp->keyword = NULL; + keytp->ksym = NoSymbol; + keytp->func = NULL; + keytp->inputsame = 0; + keytp->prev = NULL; + keytp->next = NULL; + return (keytp); +} + +/* + * _Xsj3cAddFreeKeyTable() + * Add key-function conversion table to free list. + */ +static void +_Xsj3cAddFreeKeyTable(keytp) + register Xsj3cKeyTable *keytp; +{ + if (!keytp) + return; + if (freekeytp) + keytp->prev = freekeytp; + else + keytp->prev = NULL; + freekeytp = keytp; + keytp->keyword = NULL; + keytp->ksym = NoSymbol; + keytp->func = NULL; + keytp->inputsame = 0; + keytp->next = NULL; +} + +/* + * _Xsj3cGetFreeKeyTable() + * Get key-function conversion table from free list. + */ +static Xsj3cKeyTable * +_Xsj3cGetFreeKeyTable() +{ + register Xsj3cKeyTable *keytp; + + if (keytp = freekeytp) + freekeytp = keytp->prev; + return (keytp); +} + +static void +_Xsj3cFreeAllKeyTable() +{ + register Xsj3cKeyTable *keytp, *keytq; + + keytq = firstkeytp; + while (keytq) { + keytp = keytq; + keytq = keytp + KEYTBMAX; + if (keytq); + keytq = keytq->next; + free(keytp); + } + firstkeytp = NULL; + freekeytp = NULL; +} + +/* + * _Xsj3cSetKeyTable() + * Read sjrc's .key.[function] entry and set key-function conversion table. + */ +int +_Xsj3cSetKeyTable(buf, table) + Xsj3cBuf buf; + Sjrctable table; +{ + register Xsj3cKeyTable *keytp, *keytq, *keytr; + Xsj3cKeyTable *keytf, dummy; + KeySym ksym; + Xsj3ccMode modmask; + Xsj3cFlag inputsame; + + if (!_Xsj3cSetKeySym(table->value, &ksym, &modmask, &inputsame)) + return 0; + keytp = &dummy; + keytp->next= buf->key; + while (keytp->next != NULL) { + keytp = keytp->next; + if (keytp->ksym == NoSymbol ||(keytp->ksym == ksym && + (keytp->modmask & ~AllModeMask) == (modmask & ~AllModeMask) + && ((keytp->modmask & AllModeMask) & modmask))) { + keytq = keytp->next; + keytf = keytp; + if (keytp == buf->key) { /* top of list */ + buf->key = keytq; + keytq->prev = NULL; + } else if (!keytq) { /* last of list */ + keytp = keytp->prev; + keytp->next = NULL; + } else { + keytp = keytp->prev; + keytp->next = keytq; + keytq->prev = keytp; + } + _Xsj3cAddFreeKeyTable(keytf); + } + } + if (!table->key[1]) + return 0; + else if (ksym == NoSymbol || _Xsj3cCmp(table->key[1], "ignore")) + return 1; + + keytr = keytp; + keytq = defkeys; + while (keytq->keyword != NULL) { + if (_Xsj3cCmp(table->key[1], keytq->keyword)) { + if (!(keytp = _Xsj3cGetFreeKeyTable())) { + if (!(keytp = _Xsj3cAllocKeyTable())) { + Xsj3cWarning("can't allocate keysym to func table"); + return 0; + } + } + keytr->next = keytp; + keytp->prev = keytr; + keytp->keyword = keytq->keyword; + keytp->ksym = ksym; + keytp->modmask = modmask; + keytp->func = keytq->func; + keytp->inputsame = inputsame; + keytr = keytp; + keytp->next = NULL; + if (keytp->keyword == NULL) { + Xsj3cWarning("keyword %s is not supported",table->key[1]); + return 0; + } + } + keytq++; + } + return 1; +} + +/* + * _Xsj3cSetKeySym() + * Read values of the .key.[function] entry and set keysym + * and modifier/conversion-mode mask. + */ +static int +_Xsj3cSetKeySym(string, ksym, modmask, inputsame) + char **string; + KeySym *ksym; + Xsj3ccMode *modmask; + Xsj3cFlag *inputsame; +{ + register char *p; + int sub, ret; + + *modmask = 0; + *ksym = NoSymbol; + p = *string; + + /* ModMask and KeySym field */ + if (p) { + if(*p == '^') { /* sj2/sj3 control keybind compatibility */ + if (++p) { + if (isupper(*p)) { + sub = *p - 'A'; + *ksym = XK_a + sub; + } else if (islower(*p)) { + sub = *p - 'a'; + *ksym = XK_a + sub; + } else if (*p >= '\\' && *p <= '_') { + sub = *p - '\\'; + *ksym = XK_backslash + sub; + } else if (*p >= '!' && *p <= '>') { + sub = *p - '!'; + *ksym = XK_exclam + sub; + } else { + Xsj3cWarning("wrong keybind in sjrc file"); + } + *modmask = ControlMask|AllModeMask; + } + } else if(*p == 'X') { /* sjx keybind compatibility */ + if (!strncmp(p, "XK_", 3)) { + p += 3; + *modmask = AllModeMask; + *ksym = XStringToKeysym(p); + } else { + *modmask = AllModeMask; + Xsj3cWarning("wrong keybind in sjrc file"); + } + } else if(*p == '\033') { /* escape keybind compatibility */ + *ksym = XK_Escape; + *modmask = AllModeMask; + } else if(*p == '\177') { /* delete keybind compatibility */ + *ksym = XK_Delete; + *modmask = AllModeMask; + } else if ((ret = _Xsj3cGetModMask(*string)) >= 0) { + *modmask = ret; + if (++string) + *ksym = XStringToKeysym(*string); + else + Xsj3cWarning("wrong keybind in sjrc file"); + } else { + Xsj3cWarning("wrong keybind in sjrc file"); + } + } else { + *modmask = AllModeMask; + } + + /* Through function field */ + p = *(++string); + if (p) { + if (_Xsj3cCmp(p, "off")) + *inputsame = OFF; + else if (_Xsj3cCmp(p, "on")) + *inputsame = ON; + else + *inputsame = NONE; + } else { + *inputsame = NONE; + } + return 1; +} + +/* + * _Xsj3cGetModMask() + * Read strings and convert to modifier/conversion-mode mask. + */ +static long +_Xsj3cGetModMask(p) + register char *p; +{ + char mode[256]; + register char *q; + int ret = AllModeMask, mask = AllModeMask; + Xsj3ccMode conversion = 0; + + while (*p != '\0') { + q = mode; + while (*p != '\0' && *p != '|') { + *q++ = *p++; + } + if (*p != '\0') + p++; + *q = '\0'; + q = mode; + if (*q == 'n') { + continue; + } else if (*q == 's') { + ret |= ShiftMask; + continue; + } else if (*q == 'c') { + ret |= ControlMask; + continue; + } else if (*q == 'm') { + if (*(++q) != '\0') { + while (*q != '\0') + q++; + switch(*(--q)) { + case '1': + ret |= Mod1Mask; + break; + case '2': + ret |= Mod2Mask; + break; + case '3': + ret |= Mod3Mask; + break; + case '4': + ret |= Mod4Mask; + break; + case '5': + ret |= Mod5Mask; + break; + default: + ret |= Mod1Mask; + break; + } + } else + ret |= Mod1Mask; + continue; + } else if (*q == 'l') { + ret |= LockMask; + continue; + } else if (*q == 'k') { + ret |= KanaMask; + continue; + } else if (*q == 'N') { + conversion |= NoInputModeMask; + continue; + } else if (*q == 'I') { + conversion |= InputModeMask; + continue; + } else if (*q == 'i') { /* for compatibility */ + conversion |= InputModeMask; + continue; + } else if (*q == 'u') { /* for compatibility */ + conversion |= ConvedModeMask; + continue; + } else if (*q == 'U') { /* for compatibility */ + conversion |= ConvedModeMask; + continue; + } else if (*q == 'C') { + conversion |= ConvedModeMask; + continue; + } else if (*q == 'v') { /* for compatibility */ + conversion |= SelectModeMask; + continue; + } else if (*q == 'V') { /* for compatibility */ + conversion |= SelectModeMask; + continue; + } else if (*q == 'S') { + conversion |= SelectModeMask; + continue; + } else if (*q == 'o') { /* for compatibility */ + conversion |= OutputModeMask; + continue; + } else if (*q == 'O') { + conversion |= OutputModeMask; + continue; + } else if (*q == 'd') { /* for compatibility */ + conversion |= DictModeMask; + continue; + } else if (*q == 'D') { + conversion |= DictModeMask; + continue; + } else if (*q == 'f') { /* for compatibility */ + conversion |= FlushModeMask; + continue; + } else if (*q == 'F') { + conversion |= FlushModeMask; + continue; + } else if (*q == 'a') { /* for compatibility */ + conversion |= AllModeMask; + continue; + } else if (*q == 'A') { + conversion |= AllModeMask; + continue; + } else { + Xsj3cWarning("Ilegal keybind modmask %s in sjrc file",mode); + ret = -1; + } + } + if (conversion) { + ret &= ~mask; + ret |= conversion; + } + return ret; +} + +/* + * Xsj3cCreateBuffer() + * Allocate Xsj3cBuf type structure and initialize all flags and buffers. + */ +Xsj3cBuf +Xsj3cCreateBuffer() +{ + Xsj3cBuf buf; + Xsj3cKeyTable *keytp, *keytq, *keytr; + register int i, back_lang; + + /* Allocate buffer fields */ + + if ((buf = (Xsj3cBuf)malloc(sizeof(Xsj3cBufRec))) == NULL) { + return (Xsj3cBuf)NULL; + } + bzero(buf, sizeof(Xsj3cBufRec)); + + /* Default definition for uninitialized field */ + + buf->convmode = NoInputModeMask; + buf->server = SERVER_SJ3; + if ((buf->input = (Xsj3cSeg *)calloc(BUNBUFSIZ, sizeof(Xsj3cSeg))) + == NULL) { + return (Xsj3cBuf)NULL; + } + bzero(buf->input, BUNBUFSIZ * sizeof(Xsj3cSeg)); + buf->backup = NULL; + buf->current = NULL; + buf->segnum = 0; + buf->backsegnum = 0; + buf->curseg = 0; + buf->convedsegnum = 0; + + buf->inputmode = MODE_HIRA; + buf->dispmode = MODE_HIRA; + + buf->dict = NULL; + + buf->candidate = NULL; + buf->hinsi = NULL; + buf->symbol = NULL; + + buf->candnum = 0; + buf->curcand = 0; + buf->cursymbol = 0; + buf->curhinsi = 0; + buf->selectstatus = SELECT_CAND; + buf->n_select = 0; + buf->candseg = 0; + + buf->rktable = NULL; + buf->hktable = NULL; + buf->zhtable = NULL; + buf->plosive = NULL; + buf->rkdouble = NULL; + + /* Initialize common (with sj2/sj3/sjx) flags area */ + /* Make keysym to function hash table */ + for (keytp = defkeys, i = 0; keytp->keyword != NULL; keytp++) { + if (!(keytq = _Xsj3cGetFreeKeyTable())) { + if (!(keytq = _Xsj3cAllocKeyTable())) { + Xsj3cWarning("can't allocate keysym to func table"); + return (Xsj3cBuf)NULL; + } + } + if (!i++) { + buf->key = keytq; + keytq->prev = NULL; + } else { + keytr->next = keytq; + keytq->prev = keytr; + } + keytq->keyword = keytp->keyword; + keytq->ksym = keytp->ksym; + keytq->modmask = keytp->modmask; + keytq->func = keytp->func; + keytq->inputsame = keytp->inputsame; + keytr = keytq; + } + keytq->next = NULL; + + for (i = 0; i < MODE_INROT_NUM; i++) + buf->inmoderot[i]= i; + buf->inmoderotnum = MODE_INROT_NUM; + for (i = 0; i < MODE_OUTROT_NUM; i++) + buf->outmoderot[i]= i; + buf->outmoderotnum = MODE_OUTROT_NUM; + for (i = 0; i < MODE_CODE_NUM; i++) + buf->defcode[i]= MODE_SJIS + i; + buf->coderotnum = MODE_CODE_NUM; + buf->muhenmode = MODE_HALPHA; + buf->togglemode = MODE_HIRA; + buf->dotoggle = ON; + buf->throughflg = 0; + + buf->rcfile = NULL; + back_lang = in_lang; + in_lang = JP_SJIS; + for (i = 0; i < MODE_STR_NUM; i++) { + _Xsj3cSetGuide(buf, &def_guide_table[i]); + } + in_lang = back_lang; + + buf->gakusyuu = ON; + buf->rkbell = OFF; + buf->flushaconv = OFF; + buf->sj3serv = NULL; + buf->setnormal = NULL; + buf->throughnext = NULL; + + /* Initialize Xsj3clib original flags area */ + buf->sj3serv2 = NULL; + buf->alphaconv = OFF; + buf->backdisplay = OFF; + buf->beginlastseg = ON; + buf->expandkconv = SEG_CONVED; + buf->shrinkkconv = SEG_CONVED; + buf->expandmconv = SEG_NOCONV; + buf->shrinkmconv = SEG_NOCONV; + buf->shrinkall = OFF; + buf->flushiconv = ON; + buf->flushsconv = NONE; + buf->flusheconv = ON; + buf->henkanseg = ALL; + buf->muhenseg = ONE; + buf->delchange = ONE; + buf->flushchange = ONE; + for ( i = 0; i < MODE_CONV_NUM; i++) + buf->modeconv[i] = SEG_CONVED; + buf->moveloop = OFF; + buf->movebyseg = SEG_CONVED; + buf->jumpbyseg = SEG_CONVED; + buf->delbyseg = SEG_CONVED; + buf->killbyseg = SEG_CONVED; + buf->muhencurlast = OFF; + buf->editcurlast = OFF; + buf->flushcurlast = OFF; + buf->convedunderline = ON; + buf->dispmodechange = OFF; + buf->dellastmove = ON; + buf->kanaonly = OFF; + buf->inputsame = ON; + buf->cntrlsame = OFF; + buf->selectconv = ON; + buf->beforeconv = OFF; + buf->lastdoubleconv = OFF; + buf->selectcount = 0; + buf->selectback = OFF; + buf->candpadding = OFF; + + refcount++; + return (buf); +} + +/* + * _Xsj3cFreeModeStr() + * Free memory of mode guide strings. + */ +static void +_Xsj3cFreeModeStr(buf) + Xsj3cBuf buf; +{ + register int i; + + for (i = 0; i < MODE_STR_NUM; i++) { + if (buf->modestr[i]) + free(buf->modestr[i]); + buf->modestr[i] = NULL; + } +} + +/* + * Xsj3cFreeBuffer() + * Free all data buffers. + */ +void +Xsj3cFreeBuffer(buf) + Xsj3cBuf buf; +{ + register int i; + + _Xsj3cFreeModeStr(buf); + if (!refcount) + _Xsj3cFreeAllKeyTable(); + if (buf->input) { + for (i = 0; i < buf->segnum + 1; i++) { + Xsj3cFreeSegment(buf->input[i]); + buf->input[i] = NULL; + } + free(buf->input); + buf->input = NULL; + } + if (buf->backup) { + for (i = 0; i < buf->backsegnum + 1; i++) { + Xsj3cFreeSegment(buf->backup[i]); + buf->backup[i] = NULL; + } + free(buf->backup); + buf->backup = NULL; + } + free(buf); +} + +/* + * Xsj3cClearBuffer() + * Clear buffers. + */ +void +Xsj3cClearBuffer(buf) + Xsj3cBuf buf; +{ + register int i; + + for (i = 0; i < buf->segnum + 1; i++) { + Xsj3cFreeSegment(buf->input[i]); + buf->input[i] = NULL; + } + buf->convmode = InputModeMask; + buf->curseg = 0; + buf->segnum = 0; + buf->convedsegnum = 0; + buf->dispmode = buf->inputmode; +} + +/* + * Xsj3cFixBuffer() + * Fix and backup buffers. + */ +void +Xsj3cFixBuffer(buf) + Xsj3cBuf buf; +{ + register int i; + int j; + + if (buf->backup) { + for (i = 0; i < buf->backsegnum + 1; i++) { + Xsj3cFreeSegment(buf->backup[i]); + buf->backup[i] = NULL; + } + free(buf->backup); + buf->backup = NULL; + } + if (buf->convmode & InputModeMask) { + j = buf->input[buf->curseg]->cur - 1; + if (j >= 0 && buf->input[buf->curseg]->yomi[j] < 256 && + iscntrl((unsigned char)buf->input[buf->curseg]->yomi[j])) { + unsigned char tmp[RBUFSIZ]; + + _Xsj3cExtractChar(buf, buf->input[buf->curseg], tmp, 1); + _Xsj3cStoreYomi(buf, buf->input[buf->curseg], j); + if (!buf->input[buf->curseg]->num) { + buf->segnum--; + Xsj3cFreeSegment(buf->input[buf->curseg]); + buf->input[buf->curseg] = NULL; + for (i = buf->curseg; i < buf->segnum; i++) { + buf->input[i] = buf->input[i + 1]; + } + buf->input[buf->segnum] = NULL; + } + } + buf->convmode = NoInputModeMask; + } else if (buf->convmode & ~NoInputModeMask) { + j = buf->input[buf->curseg]->dnum - 1; + if (j >= 0 && buf->input[buf->curseg]->disp[j] < 256 && + iscntrl((unsigned char)buf->input[buf->curseg]->disp[j])) { + buf->input[buf->curseg]->dnum--; + buf->input[buf->curseg]->disp[j] = '\0'; + } + if (buf->convmode != SelectModeMask) /* For symbol input */ + buf->convmode = NoInputModeMask; + } + buf->backup = buf->input; + buf->backsegnum = buf->segnum; + buf->input = NULL; + if ((buf->input = (Xsj3cSeg *)calloc(BUNBUFSIZ, + sizeof(Xsj3cSeg))) == NULL) { + Xsj3cError("Cannot allocate for input buffers"); + } + buf->curseg = 0; + buf->segnum = 0; + buf->convedsegnum = 0; + buf->dispmode = buf->inputmode; +} + +/* + * Xsj3cFlushBuffer() + * Flush and backup buffers. + */ +void +Xsj3cFlushBuffer(buf) + Xsj3cBuf buf; +{ + register int tmpsegnum; + register Xsj3cSeg *segp; + + segp = buf->backup; + buf->backup = buf->input; + buf->input = segp; + tmpsegnum = buf->backsegnum; + buf->backsegnum = buf->segnum; + buf->segnum = tmpsegnum; + buf->curseg = 0; + buf->convmode = InputModeMask; + buf->convedsegnum = 0; + buf->dispmode = buf->inputmode; +} diff -r 000000000000 -r 92745d501b9a lib/Xsj3clib/candidate.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/Xsj3clib/candidate.c Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,321 @@ +#ifndef lint +static char *rcsid = "$Id: candidate.c,v 2.2 1992/03/18 09:44:48 nao Exp $"; +#endif +/* + * Copyright 1991 Sony Corporation + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Sony not be used in advertising or + * publicity pertaining to distribution of the software without specific, + * written prior permission. Sony makes no representations about the + * suitability of this software for any purpose. It is provided "as is" + * without express or implied warranty. + * + * SONY DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL SONY + * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ +/* + * Author: Naoshi Suzuki, SONY Corporation. (nao@sm.sony.co.jp) + */ + +#include "common.h" +#include "util.h" + +extern Xsj3cCVServerIF serverIF[SERVER_NUM]; + +Xsj3cCand _Xsj3cCandidateInit(); +int Xsj3cGetCandidateNum(); +Xsj3cCand Xsj3cGetCandidates(); +wchar *Xsj3cGetCandidate(); +int Xsj3cSetCandidate(); +void Xsj3cEndCandidate(); + +/* + * _Xsj3cCandidateInit() + * Initialize candidate list of current segment. + * No alloca() used. + */ +Xsj3cCand +_Xsj3cCandidateInit(buf) + Xsj3cBuf buf; +{ + register int i, j, num, padnum; + Xsj3csMode padmode[2]; + unsigned char *knjbuf; + SJ3_DOUON *mbcand; + + if (buf->candidate) { + return (buf->candidate); + } + i = 0; + buf->curcand = 0; + if ((knjbuf = (unsigned char *) + malloc(buf->input[buf->curseg]->size * sizeof(wchar))) == NULL) { + Xsj3cWarning("Cannot allocate for candidate yomi buffer"); + return (NULL); + } + _Xsj3cwPStomPS(buf, knjbuf, buf->input[buf->curseg]->yomi); + num = buf->candnum = serverIF[buf->server].func[FUNC_CANDNUM](knjbuf); + if (num < 0) { + Xsj3cWarning("sj3serv is down. reconnect please"); + if (buf->convmode & SelectModeMask) + buf->convmode = ConvedModeMask; + free(knjbuf); + return ((Xsj3cCand)NULL); + } else if (num > 0) { + mbcand = (SJ3_DOUON *)calloc(num, sizeof(SJ3_DOUON)); + if (!mbcand) { + Xsj3cWarning("Cannot allocate memory for candidate list"); + if (buf->convmode & SelectModeMask) + buf->convmode = ConvedModeMask; + free(knjbuf); + return ((Xsj3cCand)NULL); + } + num = buf->candnum + = serverIF[buf->server].func[FUNC_CANDIDATE](knjbuf, mbcand); + if (num <= 0) { + if (num < 0) { + Xsj3cWarning("sj3serv is down. reconnect please."); + } else { + Xsj3cWarning("There is no candidate."); + goto candpad; + } + if (buf->convmode & SelectModeMask) + buf->convmode = ConvedModeMask; + free(mbcand); + free(knjbuf); + return ((Xsj3cCand)NULL); + } else { + if ((buf->candidate = (Xsj3cCand) + calloc(num, sizeof(Xsj3cCandRec))) == NULL) { + Xsj3cWarning("Cannot allocate memory for candidate list"); + if (buf->convmode & SelectModeMask) + buf->convmode = ConvedModeMask; + free(knjbuf); + free(mbcand); + buf->candnum = -1; + return ((Xsj3cCand)NULL); + } + while (i < num) { + buf->candidate[i].len = _Xsj3cmPStowOUT(buf, + buf->candidate[i].data, mbcand[i].ddata); + buf->candidate[i].dcid = mbcand[i].dcid; + i++; + } + if (buf->candnum > 1) { + serverIF[buf->server].func[FUNC_LOCK](); + locked[buf->server]++; + } else { + bzero(&buf->candidate[0].dcid, + sizeof(buf->candidate[0].dcid)); + } + } + free(mbcand); + if (buf->candpadding) + goto candpad; + else + free(knjbuf); + } else { +candpad: + if (buf->input[buf->curseg]->num > CANDBUFSIZ - 1) { + free(knjbuf); + return (buf->candidate); + } + switch(buf->input[buf->curseg]->cursegmode) { + case MODE_HIRA: + padnum = 1; + padmode[0] = MODE_ZKATA; + break; + case MODE_ZKATA: + padnum = 1; + padmode[0] = MODE_HIRA; + break; + default: + padnum = 2; + padmode[0] = MODE_HIRA; + padmode[1] = MODE_ZKATA; + break; + } + if (buf->candnum != 1 + || buf->input[buf->curseg]->cursegmode == MODE_HIRA) + num += (padnum + 1); + else + num += padnum; + if (buf->candidate) + buf->candidate = (Xsj3cCand)realloc(buf->candidate, + num * sizeof(Xsj3cCandRec)); + else + buf->candidate = (Xsj3cCand)calloc(num, sizeof(Xsj3cCandRec)); + if (!buf->candidate) { + Xsj3cWarning("Cannot allocate memory for candidate list"); + free(knjbuf); + buf->candnum = -1; + return ((Xsj3cCand)NULL); + } + if (buf->candnum > 1 + || buf->input[buf->curseg]->cursegmode == MODE_HIRA) { + _Xsj3cwPStowOUT(buf, buf->candidate[i].data, + buf->input[buf->curseg]->yomi); + buf->candidate[i].len = buf->input[buf->curseg]->num; + bzero(&buf->candidate[i].dcid, sizeof(buf->candidate[i].dcid)); + i++; + } else if (!buf->candnum) { + _Xsj3cWcpy(buf->candidate[i].data, buf->input[buf->curseg]->disp); + buf->candidate[i].len = buf->input[buf->curseg]->dnum; + bzero(&buf->candidate[i].dcid, sizeof(buf->candidate[i].dcid)); + i++; + } + for (j = 0; j < padnum; i++, j++) { + Xsj3cModeConv(buf, knjbuf, padmode[j], + buf->input[buf->curseg]->size); + buf->candidate[i].len + = _Xsj3cmPStowOUT(buf, buf->candidate[i].data, knjbuf); + bzero(&buf->candidate[i].dcid, + sizeof(buf->candidate[i].dcid)); + } + free(knjbuf); + buf->candnum = num; + } + buf->candseg = buf->curseg; + return (buf->candidate); +} + +/* + * Xsj3cGetCandidateNum() + * If list is already initialized, return candidate number, + * else initialize list and return candidate number + * when it succeeded in initializing list. + * If sj3serv is down or failed to allocate memory, return -1. + */ +int +Xsj3cGetCandidateNum(buf, cur) + Xsj3cBuf buf; + int *cur; +{ + if (!buf->candidate) { + buf->candidate = _Xsj3cCandidateInit(buf); + } + *cur = buf->curcand; + return (buf->candnum); +} + +/* + * Xsj3cGetCandidates() + * Return candidate data. + */ +Xsj3cCand +Xsj3cGetCandidates(buf) + Xsj3cBuf buf; +{ + if (!buf->candidate) { + buf->candidate = _Xsj3cCandidateInit(buf); + } + return (buf->candidate); +} + +/* + * Xsj3cGetCandidate() + * Return the appointed (by 2nd argument) candidate. + */ +wchar * +Xsj3cGetCandidate(buf, n, len) + Xsj3cBuf buf; + int n; + int *len; +{ + if (!buf->candidate) { + buf->candidate = _Xsj3cCandidateInit(buf); + } + *len = buf->candidate[n].len; + return (buf->candidate[n].data); +} + +/* + * Xsj3cSetCandidate() + * Set the selected candidate strings to the buffers. + */ +int +Xsj3cSetCandidate(buf, sel_candidate, changed, flush) + Xsj3cBuf buf; + int sel_candidate; + int *changed; + int *flush; +{ + register wchar *p, *q; + register i, same = 1; + + *flush = OFF; + *changed = OFF; + if (sel_candidate >= buf->candnum) + return -1; + p = buf->candidate[sel_candidate].data; + q = buf->input[buf->curseg]->disp; + i = buf->input[buf->curseg]->dnum; + while (i--) { + if (*p++ != *q++) { + same = 0; + break; + } + } + if ((!same || buf->curcand != sel_candidate) && + buf->candseg < buf->segnum && buf->input[buf->candseg]) { + buf->input[buf->candseg]->dnum + = buf->candidate[sel_candidate].len; + _Xsj3cWcpy(buf->input[buf->candseg]->disp, + buf->candidate[sel_candidate].data); + *changed = ON; + if (buf->gakusyuu) + buf->input[buf->candseg]->change = ON; + buf->curcand = sel_candidate; + } else { + *changed = OFF; + } + return 0; +} + +/* + * Xsj3cEndCandidate() + * SelectMode: End candidate select mode(SelectMode) and back to ConvedMode. + * ConvedModeMask: Free buffer of candidates and unlock sj3serv. + */ +void +Xsj3cEndCandidate(buf, sync) + Xsj3cBuf buf; + int sync; +{ + if (!((buf->convmode & SelectModeMask) + && buf->selectstatus == SELECT_CAND)) { + if (buf->candnum > 1) { + if (sync) { + if ((serverIF[buf->server].func[FUNC_STUDY] + (&buf->candidate[buf->curcand].dcid)) < 0) { + Xsj3cWarning("sj3serv is down. reconnect please"); + } + } + if (locked[buf->server] > 0) { + if (!(--locked[buf->server])) + serverIF[buf->server].func[FUNC_UNLOCK](); + } + } + free (buf->candidate); + buf->candidate = NULL; + buf->curcand = 0; + buf->candnum = 0; + } else { + if ((buf->flushsconv == OFF) && buf->input[buf->segnum] && + buf->input[buf->segnum]->num) { + buf->curseg = buf->segnum; + buf->segnum++; + buf->convmode = InputModeMask; + } else { + buf->convmode = ConvedModeMask; + } + } +} diff -r 000000000000 -r 92745d501b9a lib/Xsj3clib/code.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/Xsj3clib/code.c Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,126 @@ +#ifndef lint +static char *rcsid = "$Id: code.c,v 2.1 1993/09/21 09:43:46 nao Exp $"; +#endif +/* + * Copyright 1991 Sony Corporation + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Sony not be used in advertising or + * publicity pertaining to distribution of the software without specific, + * written prior permission. Sony makes no representations about the + * suitability of this software for any purpose. It is provided "as is" + * without express or implied warranty. + * + * SONY DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL SONY + * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ +/* + * Author: Naoshi Suzuki, SONY Corporation. (nao@sm.sony.co.jp) + */ + +#include "common.h" + +#define WMASK 0x7f7f +#define WMSB 0x8080 + +wchar _Xsj3csjis2euc(); +wchar _Xsj3ceuc2sjis(); +wchar _Xsj3csjis2jis(); +wchar _Xsj3cjis2sjis(); +wchar _Xsj3cjis2euc(); +wchar _Xsj3ceuc2jis(); + +wchar +_Xsj3csjis2euc (c) + register wchar c; +{ + register int high, low; + + if (c >= 0xf040) + return 0; + high = (c >> 8) & 0xff; + low = c & 0xff; + if (high > 0x9f) + high -= 0x40; + if (low > 0x9e) + return (((high << 9) | low) - 0x5ffe); + if (low > 0x7f) + low--; + return (((high << 9) | low) - 0x609f); +} + +wchar +_Xsj3ceuc2sjis (c) + register wchar c; +{ + register int high, low; + + high = (c >> 8) & 0xff; + low = c & 0xff; + if (!(high & 1)) + low -= 0x02; + else if (low < 0xe0) + low -= 0x61; + else + low -= 0x60; + high = ((high - 0xa1) >> 1) + (high < 0xdf ? 0x81 : 0xc1); + return ((high << 8) | low); +} + +wchar +_Xsj3csjis2jis (c) + register wchar c; +{ + register int high, low; + + if (c >= 0xf040) + return 0; + high = (c >> 8) & 0xff; + low = c & 0xff; + if (high > 0x9f) + high -= 0x40; + if (low > 0x9e) + return (((high << 9) | low) - 0xe07e); + if (low > 0x7f) + low--; + return (((high << 9) | low) - 0xe11f); +} + +wchar +_Xsj3cjis2sjis (c) + register wchar c; +{ + register int high, low; + + high = (c >> 8) & 0xff; + low = c & 0xff; + if (!(high & 1)) + low += 0x7e; + else if (low < 0x60) + low += 0x1f; + else + low += 0x20; + high = ((high - 0x21) >> 1) + (high < 0x5f ? 0x81 : 0xc1); + return ((high << 8) | low); +} + +wchar +_Xsj3cjis2euc (c) + register wchar c; +{ + return (c | WMSB); +} + +wchar +_Xsj3ceuc2jis (c) + register wchar c; +{ + return (c & WMASK); +} diff -r 000000000000 -r 92745d501b9a lib/Xsj3clib/common.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/Xsj3clib/common.h Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,189 @@ +/* $Id: common.h,v 2.2 1993/09/21 14:31:39 nao Exp $ */ +/* + * Copyright 1991 Sony Corporation + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Sony not be used in advertising or + * publicity pertaining to distribution of the software without specific, + * written prior permission. Sony makes no representations about the + * suitability of this software for any purpose. It is provided "as is" + * without express or implied warranty. + * + * SONY DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL SONY + * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ +/* + * Author: Naoshi Suzuki, SONY Corporation. (nao@sm.sony.co.jp) + */ + +#include "Xsj3clib.h" +#include +#if defined(XlibSpecificationRelease) && XlibSpecificationRelease > 4 +#include +#endif + +/* + * define for conversion server + */ +#define SERVER_SJ3 0 +#define SERVER_NUM 1 + +/* + * define for conversion mode + */ +#define NoInputModeMask (1<<16) +#define InputModeMask (1<<17) +#define ConvedModeMask (1<<18) +#define SelectModeMask (1<<19) +#define DictModeMask (1<<20) +#define AllModeMask (InputModeMask|ConvedModeMask|SelectModeMask \ + |DictModeMask|NoInputModeMask) +#define OutputModeMask (ConvedModeMask|SelectModeMask) +#define FlushModeMask (InputModeMask|ConvedModeMask) + +/* + * Define for segment status InputMode/ConvedMode + */ +#define SEG_NOCONV (1L<<0) +#define SEG_CONVED (1L<<1) + +/* + * Define for permittion to edit(input) + */ +#define SEG_EDIT (1L<<0) +#define SEG_NOEDIT (1L<<1) + +/* + * define for maximum size + */ +#define INPUT_YOMI_MAX 255 +#define DICT_YOMI_MAX 31 + +/* + * define for result of conversion + */ +#define CONV_FAILED -1 +#define CONV_UNFIXED 0 +#define CONV_FIXED 1 + +/* + * define for flags on/off + */ +#undef OFF +#define OFF 0L +#undef ON +#define ON (1L<<0) +#define ONE (1L<<0) +#define THROUGH (1L<<0) +#define ALL (1L<<1) +#define NONE (1L<<1) +#define QUOTE (1L<<1) +#define AFTER (1L<<2) +#define EDIT (1L<<2) + +/* + * define for mode of dictionary handling + */ +#define REG_STATE (1L<<0) +#define CLR_STATE (1L<<1) + +/* + * define for message in DictMode(sj3) + */ +#define SJ3_DICT_INPUT 128 +#define SJ3_DICT_YOMI 129 +#define SJ3_DICT_HINSI 130 +#define SJ3_DICT_CONFIRM 131 +#define SJ3_TOUROKU_SUCCESSED 132 +#define SJ3_SYOUKYO_SUCCESSED 133 +#define SJ3_NO_YOMI_STR 134 +#define SJ3_LONG_YOMI_STR 135 + +/* + * Define for SelectMode status + */ +#define SELECT_CAND 0 +#define SELECT_SYMBOL 1 +#define SELECT_HINSI 2 + +/* + * Define for status of dictionary handling + */ +#define DICT_INPUT 0 +#define DICT_HINSI 1 +#define DICT_CONFIRM 2 +#define DICT_END 3 + +/* + * Define for DictMode messages + */ +#define DICT_STR_MODE 0 +#define DICT_STR_MSG1 1 +#define DICT_STR_YOMI 2 +#define DICT_STR_MSG2 3 +#define DICT_STR_HINSI 4 +#define DICT_STR_MSG3 5 +#define DICT_STR_NUM 6 + +/* + * Define for NULL + */ +#ifndef NULL +#define NULL 0 +#endif + +/* + * define for reading set-up file. + */ +#define OPEN_FAILED 1 +#define READ_FAILED -1 +#define ALLOC_FAILED -2 +#define OK 0 + +#define SKIP(p) { while (*p == '\t' || *p == ' ') p++; } +#define CHECK_END(p) { if (*p == '\n' || *p == '#') return (READ_FAILED); } + +/* + * define for reading set-up files. + */ +#define SO 0x0e +#define SI 0x0f +#define ESC 0x1b +#define SS2 0x8e +#define SS3 0x8f +#define MASK 0x7f +#define MSB 0x80 + +/* + * define for conversion interface function. + */ +#define FUNC_OPEN 0 +#define FUNC_CLOSE 1 +#define FUNC_CONV 2 +#define FUNC_CANDNUM 3 +#define FUNC_CANDIDATE 4 +#define FUNC_REGISTER 5 +#define FUNC_CLEAR 6 +#define FUNC_STUDY 7 +#define FUNC_STUDY2 8 +#define FUNC_LOCK 9 +#define FUNC_UNLOCK 10 + +#define FUNC_NUM 11 + +typedef struct _sjrctable { + unsigned char *key[2]; + unsigned char *value[10]; +} SjrcRec, *Sjrctable; + +typedef struct _Xsj3cCVServerIF { + int lang; + int (*func[FUNC_NUM])(); +} Xsj3cCVServerIF; diff -r 000000000000 -r 92745d501b9a lib/Xsj3clib/connect.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/Xsj3clib/connect.c Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,232 @@ +#ifndef lint +static char *rcsid = "$Id: connect.c,v 2.0 1992/02/13 18:33:14 nao Exp $"; +#endif +/* + * Copyright 1991 Sony Corporation + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Sony not be used in advertising or + * publicity pertaining to distribution of the software without specific, + * written prior permission. Sony makes no representations about the + * suitability of this software for any purpose. It is provided "as is" + * without express or implied warranty. + * + * SONY DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL SONY + * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ +/* + * Author: Naoshi Suzuki, SONY Corporation. (nao@sm.sony.co.jp) + */ + +#include "common.h" +#include "util.h" + +extern Xsj3cCVServerIF serverIF[SERVER_NUM]; + +int Xsj3cOpen(); +void Xsj3cClose(); +void Xsj3cConnect(); + +static void _Xsj3cOpenError(); +static void _Xsj3cCloseError(); + +static int connected[SERVER_NUM]= {0}; + +/* + * Xsj3cOpen() + * Connect to sj3serv(kana-kanji conversion server). + */ +int +Xsj3cOpen(buf, host, user, force, second) + Xsj3cBuf buf; + char *host; + char *user; + int force; + int second; +{ + extern char *getenv(); + char *p; + char hostname[SERVER_NUM][32]; + int value; + + if (connected[buf->server] && !force) { + return CONNECT_OK; + } + if (host) { + if (user) { + if ((value = serverIF[buf->server].func[FUNC_OPEN](host, user)) + != SJ3_NORMAL_END) { + _Xsj3cOpenError(value); + if (value == SJ3_SERVER_DEAD || value == SJ3_CONNECT_ERROR) + return CONNECT_FAIL; + } + } else { + Xsj3cError("can't connect sj3serv by null user"); + return CONNECT_FAIL; + } + } else { + if (user) { + hostname[buf->server][0] = '\0'; + if (buf->server == SERVER_SJ3) { + if (!second) { + if ((p = getenv("SJ3SERV")) && *p != '\0') { + strcpy(hostname[buf->server], p); + } else if (buf->sj3serv) { + strcpy(hostname[buf->server], buf->sj3serv); + } + } else { + if ((p = getenv("SJ3SERV2")) && *p != '\0') { + strcpy(hostname[buf->server], p); + } else if (buf->sj3serv2) { + strcpy(hostname[buf->server], buf->sj3serv2); + } + } + } + if ((value = serverIF[buf->server].func[FUNC_OPEN](hostname, user)) + != SJ3_NORMAL_END) { + _Xsj3cOpenError(value); + if (value == SJ3_SERVER_DEAD || value == SJ3_CONNECT_ERROR) + return CONNECT_FAIL; + } + } else { + Xsj3cError("can't connect sj3serv by null user"); + return CONNECT_FAIL; + } + } + locked[buf->server] = 0; + connected[buf->server] = 1; + return CONNECT_OK; +} + +/* + * Xsj3cConnect() + * Disconnect to sj3serv and reonnect to sj3serv. + */ +void +Xsj3cConnect(buf, host, host2, user) + Xsj3cBuf buf; + char *host; + char *host2; + char *user; +{ + serverIF[buf->server].func[FUNC_UNLOCK](); + Xsj3cClose(buf, ON); + if ((Xsj3cOpen(buf, host, user, OFF, OFF)) != CONNECT_OK) { + Xsj3cWarning("Failed to connect first server. try to second server"); + if ((Xsj3cOpen(buf, host2, user, OFF, ON)) != CONNECT_OK) { + Xsj3cError("Failed to connect seconON server."); + } + } +} + +/* + * Xsj3cClose() + * Disconnect to sj3serv. + */ +void +Xsj3cClose(buf, force) + Xsj3cBuf buf; + int force; +{ + int value; + + if (connected[buf->server]) { + if ((value = serverIF[buf->server].func[FUNC_CLOSE]()) + != SJ3_NORMAL_END && !force) { + _Xsj3cCloseError(value); + } + connected[buf->server] = 0; + } +} + +/* + * _Xsj3cOpenError() + * Print error messages for connecting to sj3serv. + */ +static void +_Xsj3cOpenError(error) + int error; +{ + switch (error) { + case SJ3_SERVER_DEAD: + Xsj3cWarning("sj3_open: server died in connecting"); + break; + case SJ3_CONNECT_ERROR: + Xsj3cWarning("sj3_open: connected to server error"); + break; + case SJ3_ALREADY_CONNECTED: + Xsj3cWarning("sj3_open: already connected to server"); + break; + case SJ3_CANNOT_OPEN_MDICT: + Xsj3cWarning("sj3_open: can't open main dictionaries"); + break; + case SJ3_CANNOT_OPEN_UDICT: + Xsj3cWarning("sj3_open: can't open user dictionaries"); + break; + case SJ3_CANNOT_OPEN_STUDY: + Xsj3cWarning("sj3_open: can't open files for study"); + break; + case SJ3_CANNOT_MAKE_UDIR: + Xsj3cWarning("sj3_open: can't make directries for user"); + break; + case SJ3_CANNOT_MAKE_UDICT: + Xsj3cWarning("sj3_open: can't make user dictionaries"); + break; + case SJ3_CANNOT_MAKE_STUDY: + Xsj3cWarning("sj3_open: can't make files for study"); + break; + default: + Xsj3cWarning("sj3_open: unknown error"); + break; + } +} + +/* + * _Xsj3cCloseError() + * Print error messages for disconnecting to sj3serv. + */ +static void +_Xsj3cCloseError(error) + int error; +{ + switch (error) { + case SJ3_SERVER_DEAD: + Xsj3cWarning("sj3_close: server died in disconnecting"); + break; + case SJ3_DISCONNECT_ERROR: + Xsj3cWarning("sj3_close: server internal error"); + break; + case SJ3_NOT_CONNECTED: + Xsj3cWarning("sj3_close: already disconnected to server"); + break; + case SJ3_NOT_OPENED_MDICT: + Xsj3cWarning("sj3_close: main dictionaries are not opend"); + break; + case SJ3_NOT_OPENED_UDICT: + Xsj3cWarning("sj3_close: user dictionaries are not opend"); + break; + case SJ3_NOT_OPENED_STUDY: + Xsj3cWarning("sj3_close: files for study are not opend"); + break; + case SJ3_CLOSE_MDICT_ERROR: + Xsj3cWarning("sj3_close: can't close main dictionaries"); + break; + case SJ3_CLOSE_UDICT_ERROR: + Xsj3cWarning("sj3_close: can't close user dictionaries"); + break; + case SJ3_CLOSE_STUDY_ERROR: + Xsj3cWarning("sj3_close: can't close files for study"); + break; + default: + Xsj3cWarning("sj3_close: unknown error"); + break; + } +} + diff -r 000000000000 -r 92745d501b9a lib/Xsj3clib/conv.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/Xsj3clib/conv.c Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,1365 @@ +#ifndef lint +static char *rcsid = "$Id: conv.c,v 2.12 1993/09/21 09:43:15 nao Exp $"; +#endif +/* + * Copyright 1991 Sony Corporation + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Sony not be used in advertising or + * publicity pertaining to distribution of the software without specific, + * written prior permission. Sony makes no representations about the + * suitability of this software for any purpose. It is provided "as is" + * without express or implied warranty. + * + * SONY DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL SONY + * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ +/* + * Author: Naoshi Suzuki, SONY Corporation. (nao@sm.sony.co.jp) + */ + +#include +#include "common.h" +#include "sj3ctype.h" +#include "util.h" +#include "segment.h" +#include "mode.h" +#include "func.h" + +extern Xsj3cCVServerIF serverIF[SERVER_NUM]; + +unsigned char *Xsj3cGetPreeditArea(); +Xsj3cEvent Xsj3cKeyConv(); + +int _Xsj3cRomaConv(); +int _Xsj3cKanaConv(); + +static Xsj3cEvent _Xsj3cStrConv(); +static Xsj3cEvent _Xsj3cCtrlConv(); +static Xsj3cEvent _Xsj3cThrough(); +static Xsj3cEvent _Xsj3cDirect(); +static int _Xsj3cCodeConv(); + +/* + * Xsj3cGetPreeditArea() + * Get area for pre-edit string. + */ +unsigned char * +Xsj3cGetPreeditArea(buf, len) + register Xsj3cBuf buf; + register int *len; +{ + register Xsj3cSeg seg; + + if (buf->convmode == DictModeMask) { + /* $B<-=q%b!<%I$N>l9g$O<-=qFI$_MQ$NF~NO$r9T$&(B */ + seg = buf->dict->seg; + } else if (buf->convmode != SelectModeMask) { + if (buf->input[buf->curseg] + && buf->input[buf->curseg]->status == SEG_CONVED) { + /* $B8=J8@a$,JQ49:Q$_$N>l9g(B */ + + buf->convmode = ConvedModeMask; + switch (buf->flushiconv) { + case ON: + /* FlushInConversion on $B$N;~$O8=:_JQ49Cf$N(B */ + /* $BJ8$r3NDj$7$F?75,$NJ8$NF~NO$r9T$&(B */ + + if (!buf->backup) { + if ((buf->backup = (Xsj3cSeg *)calloc(BUNBUFSIZ, + sizeof(Xsj3cSeg))) == NULL) { + Xsj3cError("Cannot allocate for backup buffers"); + } + } + if (seg = buf->backup[0]) { + *seg->str = '\0'; + seg->sp = seg->str; + *seg->oldstr = '\0'; + seg->oldlen = 0; + seg->n_roma = 0; + seg->n_kana = -1; + } else + seg = buf->backup[0] = (Xsj3cSeg)Xsj3cCreateSegment(buf); + break; + case EDIT: + /* FlushInConversion edit $B$N;~$O%+%l%s%H(B */ + /* $BJ8@a$X$NF~NO$r9T$&(B */ + + if (!(seg = buf->input[buf->curseg])) { + seg = buf->input[buf->curseg] + = (Xsj3cSeg)Xsj3cCreateSegment(buf); + } else { + *seg->str = '\0'; + seg->sp = seg->str; + *seg->oldstr = '\0'; + seg->oldlen = 0; + seg->n_roma = 0; + seg->n_kana = -1; + } + break; + case OFF: + case NONE: + default: + /* FlushInConversion none/off $B$N>l9g!"?7$?$J(B*/ + /* $BJ8@a$NFI$_J8;zNs$NF~NO$r9T$&(B */ + + if (seg = buf->input[buf->segnum]) { + Xsj3cClearSegment(buf, buf->input[buf->segnum]); + } else { + seg = buf->input[buf->segnum] + = (Xsj3cSeg)Xsj3cCreateSegment(buf); + } + break; + } + } else if (buf->segnum > 0) { + /* $B8=J8@a$,L$JQ49$GF~NOJ8;z$,$"$k>l9g(B */ + + buf->convmode = InputModeMask; + if (buf->input[buf->curseg] + && (buf->input[buf->curseg]->edit & SEG_NOEDIT)) { + /* $BJ8;zF~NO$r5v$5$l$F$$$J$$J8@a$N>l9g(B */ + switch (buf->flushiconv) { + case ON: + /* FlushInConversion on $B$N;~$O8=:_JQ49Cf$N(B */ + /* $BJ8$r3NDj$7$F?75,$NJ8$NF~NO$r9T$&(B */ + + if (!buf->backup) { + if ((buf->backup = (Xsj3cSeg *)calloc(BUNBUFSIZ, + sizeof(Xsj3cSeg))) == NULL) { + Xsj3cError("Cannot allocate for backup buffers"); + } + } + if (seg = buf->backup[0]) { + *seg->str = '\0'; + seg->sp = seg->str; + *seg->oldstr = '\0'; + seg->oldlen = 0; + seg->n_roma = 0; + seg->n_kana = -1; + } else + seg = buf->backup[0] + = (Xsj3cSeg)Xsj3cCreateSegment(buf); + break; + case EDIT: + if (!(seg = buf->input[buf->curseg])) + seg = buf->input[buf->curseg] + = (Xsj3cSeg)Xsj3cCreateSegment(buf); + break; + case OFF: + case NONE: + default: + if (seg = buf->input[buf->segnum]) { + Xsj3cClearSegment(buf, buf->input[buf->segnum]); + } else + seg = buf->input[buf->segnum] + = (Xsj3cSeg)Xsj3cCreateSegment(buf); + } + } else { + /* $B%+%l%s%HJ8@a$X$NF~NO$r9T$&(B */ + + if (!(seg = buf->input[buf->curseg])) + seg = buf->input[buf->curseg] + = (Xsj3cSeg)Xsj3cCreateSegment(buf); + } + } else { + /* $BF~NOJ8;z$,$J$$>l9g(B */ + + buf->convmode = NoInputModeMask; + /* New segment(first segment) */ + if (seg = buf->input[buf->curseg]) + Xsj3cClearSegment(buf, buf->input[buf->curseg]); + else + seg = buf->input[buf->curseg] + = (Xsj3cSeg)Xsj3cCreateSegment(buf); + } + } else { + /* SelectMode */ + switch (buf->selectstatus) { + case SELECT_CAND: + /* $B8uJdA*Br$N>l9g(B */ + + switch (buf->flushsconv) { + case ON: + /* FlushSelectConversion on $B$N;~$O8=:_JQ49(B */ + /* $BCf$NJ8$r3NDj$7$F?75,$NJ8$NF~NO$r9T$&(B */ + + if (!buf->backup) { + if ((buf->backup = (Xsj3cSeg *)calloc(BUNBUFSIZ, + sizeof(Xsj3cSeg))) == NULL) { + Xsj3cError("Cannot allocate for backup buffers"); + } + } + if (seg = buf->backup[0]) { + *seg->str = '\0'; + seg->sp = seg->str; + *seg->oldstr = '\0'; + seg->oldlen = 0; + seg->n_roma = 0; + seg->n_kana = -1; + } else { + seg = buf->backup[0] = (Xsj3cSeg)Xsj3cCreateSegment(buf); + } + break; + case EDIT: + /* FlushSelectConversion edit $B$N>l9g!"L5(B */ + /* $BJQ49>uBV$K$7$F%+%l%s%HJ8@a$X$NF~NO$r9T$&(B */ + + if (!(seg = buf->input[buf->curseg])) { + seg = buf->input[buf->curseg] + = (Xsj3cSeg)Xsj3cCreateSegment(buf); + } else { + *seg->str = '\0'; + seg->sp = seg->str; + *seg->oldstr = '\0'; + seg->oldlen = 0; + seg->n_roma = 0; + seg->n_kana = -1; + } + break; + case OFF: + case NONE: + default: + /* FlushSelectConversion none/off $B$N>l9g!"(B */ + /* $B?7$?$JJ8@a$NFI$_J8;zNs$NF~NO$r9T$&(B */ + + if (seg = buf->input[buf->segnum]) { + Xsj3cClearSegment(buf, buf->input[buf->segnum]); + } else { + seg = buf->input[buf->segnum] + = (Xsj3cSeg)Xsj3cCreateSegment(buf); + } + break; + } + break; + case SELECT_HINSI: + /* $BIJ;lA*Br$N>l9g(B */ + + seg = buf->dict->seg; + break; + case SELECT_SYMBOL: + default: + /* $B5-9fA*Br$N>l9g(B */ + + if (seg = buf->input[buf->segnum]) { + Xsj3cClearSegment(buf, buf->input[buf->segnum]); + } else { + seg = buf->input[buf->segnum] + = (Xsj3cSeg)Xsj3cCreateSegment(buf); + } + break; + } + } + *len = RBUFSIZ - (seg->sp - seg->str); + buf->current = seg; + return (seg->sp); +} + +#define IsKanaKey(ks) ((unsigned)(ks) < 0xff00 && ((unsigned)(ks) & 0x0400)) +#define IsLatin1Key(ks) ((unsigned)(ks) < 0x0100) + +/* + * Xsj3cKeyConv() + * Convert string or keysym and do function. + */ +Xsj3cEvent +Xsj3cKeyConv(buf, n, mod, ks) + Xsj3cBuf buf; + int n; + unsigned long mod; + KeySym ks; +{ + register Xsj3cKeyTable *keytp; + Xsj3cSeg seg = buf->current; + Xsj3cEvent ret = KEY_NULL; + unsigned char *tmpsp; + register int i, doflg; + + /* KeySym/Modifier$B!"8=:_$NJQ49%b!<%I$H3F%U%!%s%/%7%g%s(B */ + /* $B$NBP1~%F!<%V%k$r%5!<%A$7$F9gCW$9$k$b$N$,$"$l$P%U%!%s(B */ + /* $B%/%7%g%s$rkey, doflg = 0; keytp != NULL; keytp = keytp->next) { + /* KeySym */ + if (ks == keytp->ksym && + /* Modifier Key */ + (keytp->modmask & ~AllModeMask) == mod && + /* Conversion mode */ + (keytp->modmask & buf->convmode) == buf->convmode) { + /* Do function */ + doflg++; + + /* .key.func $B$NBh#3%U%#!<%k%I$,(B off $B$N;~$O%U%!%s%/%7%g%s(B */ + /* $B$N$_inputsame) { + if (keytp->inputsame != ON) + goto dofunc; + } else { + if (!keytp->inputsame) + goto dofunc; + } + break; + } + } + + /* LookupString $B$N7k2L$O(B NULL terminate */ + /* $B$7$F$$$J$$$N$G(B NULL terminate $B$5$;$k(B */ + tmpsp = seg->sp; + i = n; + while(i--) { + if (iscntrl(*tmpsp)) { + if (buf->throughflg == QUOTE) { + ret |= KEY_CONTROL; + tmpsp++; + continue; + } + /* ControlSameTime off $B$N>l9g$O(B */ + /* $B%U%!%s%/%7%g%s$N$_cntrlsame) + goto dofunc; + else { + ret = _Xsj3cCtrlConv(buf, *tmpsp); + if (buf->cntrlsame) + goto dofunc; + else + return (ret); + } + } + tmpsp++; + } + *tmpsp = '\0'; + + if (!n || !(IsKanaKey(ks)||(IsLatin1Key(ks)))) { + /* $B%F%-%9%H$KJQ49$G$-$J$+$C$?>l9g$O(B */ + /* $B%U%!%s%/%7%g%s$N$_convmode) { + case SelectModeMask: + + switch (buf->selectstatus) { + case SELECT_CAND: + /* $B8uJdA*Br$N>l9g(B */ + + switch (buf->flushsconv) { + case ON: + ret |= (KEY_SELECT_END|KEY_TEXT_CHANGE); + for (i = 1; i < buf->backsegnum + 1; i++) { + Xsj3cFreeSegment(buf->backup[i]); + buf->backup[i] = NULL; + } + seg->yomi[0] = '\0'; + seg->disp[0] = '\0'; + seg->num = 0; + seg->cur = 0; + seg->dnum = 0; + seg->status = SEG_NOCONV; + seg->cursegmode = buf->inputmode; + seg->change = OFF; + seg->edit = SEG_NOEDIT; + bzero(&seg->dcid, sizeof(seg->dcid)); + buf->backsegnum = 1; + ret |= KEY_TEXT_FLUSH; + if (buf->dispmodechange) { + buf->dispmode = buf->inputmode; + ret |= KEY_MODE_CHANGE; + } + break; + case EDIT: + ret |= (KEY_SELECT_END|KEY_TEXT_CHANGE); + if (buf->curseg == buf->segnum) + buf->segnum++; + else { + ret |= _Xsj3cUnConvSeg(buf, ONE, buf->editcurlast); + _Xsj3cStoreYomi(buf, buf->input[buf->curseg], 0); + } + break; + case OFF: + ret |= (KEY_SELECT_END|KEY_TEXT_CHANGE); + if (buf->dispmodechange) { + buf->dispmode = buf->convedsegnum ? MODE_EDIT : + buf->inputmode; + ret |= KEY_MODE_CHANGE; + } + break; + case NONE: + default: + goto dofunc; + } + break; + case SELECT_HINSI: + /* $BIJ;lA*Br$N>l9g(B */ + + ret |= (KEY_DICT_CHANGE|KEY_SELECT_ABORT); + buf->dict->status = DICT_INPUT; + if (buf->dispmodechange) { + buf->dispmode = + (buf->dict->mode == REG_STATE ? MODE_TOROKU : MODE_SYOUKYO); + ret |= KEY_MODE_CHANGE; + } + break; + case SELECT_SYMBOL: + default: + /* $B5-9fA*Br$N>l9g(B */ + goto dofunc; + } + break; + case DictModeMask: + if (buf->dict->status != DICT_INPUT) { + /* $B<-=qEPO?!?>C5n%b!<%I$G$h$_F~NO;~$G$J$$(B */ + /* $B$H$-$O$rJV$7$F$J$K$b$7$J$$!#(B */ + goto dofunc; + } + ret |= KEY_DICT_CHANGE; + seg->edit = SEG_EDIT; + ret = _Xsj3cStrConv(buf, seg, ks, n, ret); + _Xsj3cFlushDictMsg(buf); + goto dofunc; + case ConvedModeMask: + ret |= KEY_TEXT_CHANGE; + if (buf->candidate) + Xsj3cEndCandidate(buf, ON); + switch (buf->flushiconv) { + case ON: + for (i = 1; i < buf->backsegnum + 1; i++) { + Xsj3cFreeSegment(buf->backup[i]); + buf->backup[i] = NULL; + } + seg->yomi[0] = '\0'; + seg->disp[0] = '\0'; + seg->num = 0; + seg->cur = 0; + seg->dnum = 0; + seg->status = SEG_NOCONV; + seg->cursegmode = buf->inputmode; + seg->change = OFF; + seg->edit = SEG_NOEDIT; + bzero(&seg->dcid, sizeof(seg->dcid)); + buf->backsegnum = 1; + ret |= KEY_TEXT_FLUSH; + if (buf->dispmodechange) { + buf->dispmode = buf->inputmode; + ret |= KEY_MODE_CHANGE; + } + break; + case OFF: + buf->curseg = buf->segnum; + buf->segnum++; + if (buf->dispmodechange) { + buf->dispmode = + (buf->convedsegnum ? MODE_EDIT : buf->inputmode); + ret |= KEY_MODE_CHANGE; + } + break; + case EDIT: + if (buf->curseg == buf->segnum) + buf->segnum++; + else { + ret |= _Xsj3cUnConvSeg(buf, ONE, buf->editcurlast); + _Xsj3cStoreYomi(buf, seg, 0); + } + break; + case NONE: + default: + goto dofunc; + } + break; + case InputModeMask: + ret |= KEY_TEXT_CHANGE; + if (buf->input[buf->curseg]->edit & SEG_NOEDIT) { + switch (buf->flushiconv) { + case ON: + for (i = 1; i < buf->backsegnum + 1; i++) { + Xsj3cFreeSegment(buf->backup[i]); + buf->backup[i] = NULL; + } + seg->yomi[0] = '\0'; + seg->disp[0] = '\0'; + seg->num = 0; + seg->cur = 0; + seg->dnum = 0; + seg->status = SEG_NOCONV; + seg->cursegmode = buf->inputmode; + seg->change = OFF; + seg->edit = SEG_NOEDIT; + bzero(&seg->dcid, sizeof(seg->dcid)); + buf->backsegnum = 1; + ret |= KEY_TEXT_FLUSH; + break; + case OFF: + buf->curseg = buf->segnum; + buf->segnum++; + if (buf->dispmodechange) { + buf->dispmode = buf->convedsegnum ? MODE_EDIT : + buf->inputmode; + ret |= KEY_MODE_CHANGE; + } + break; + case EDIT: + if (buf->curseg == buf->segnum) + buf->segnum++; + break; + case NONE: + default: + goto dofunc; + } + } else if (buf->curseg == buf->segnum) + buf->segnum++; + break; + case NoInputModeMask: + if (buf->curseg == buf->segnum) + buf->segnum++; + if (buf->throughflg == THROUGH) { + ret |= _Xsj3cThrough(buf, seg, n); + buf->throughflg = OFF; + goto dofunc; + } + ret |= KEY_TEXT_CHANGE; + break; + default: + Xsj3cWarning ("Unknown conversion mode"); + goto dofunc; + } + + seg->edit = SEG_EDIT; + ret = _Xsj3cStrConv(buf, seg, ks, n, ret); + +dofunc: + if (doflg && !(ret & KEY_TEXT_FLUSH)) { + ret |= ((*(keytp->func))(buf)); + if (!buf->cntrlsame) + ret |= KEY_FUNC; + } + return (ret); +} + +/* + * _Xsj3cStrConv() + * Convert pre-edit strings and store results to yomi/disp buffer. + */ +static Xsj3cEvent +_Xsj3cStrConv(buf, seg, ks, n, ret) + Xsj3cBuf buf; + Xsj3cSeg seg; + KeySym ks; + int n; + Xsj3cEvent ret; +{ + register unsigned char *tmpsp; + unsigned char tmp1[YBUFSIZ]; + unsigned char tmp2[YBUFSIZ]; + unsigned char kanabuf[YBUFSIZ]; + wchar wcs[RBUFSIZ]; + register int i; + int change_pos; + int change_roma = 0; + + if (buf->throughflg == QUOTE) { + ret |= _Xsj3cDirect(buf, seg, n); + buf->throughflg = OFF; + return (ret); + } + if (seg->num > seg->size - YBUFSIZ) + Xsj3cResizeSegment(seg, seg->size + KANABUFSIZ); + + switch (buf->inputmode) { + case MODE_HIRA: + case MODE_ZKATA: + case MODE_HKATA: + /* $B$R$i$,$J!?A43Q%+%?%+%J!?H>3Q%+%?%+%JF~NO%b!<%I$N>l9g(B */ + if (IsKanaKey(ks) || (IsLatin1Key(ks) && buf->kanaonly)) { + + /* $B$+$JF~NO$N>l9g(B */ + int len; + + if (seg->n_roma) { + + /* $B$+$J%P%C%U%!(B(seg->str)$B$K%m!<%^;zF~NO;~$N(B */ + /* $BJ8;zNs$,;D$C$F$$$k>l9g$O$=$l$r:o=|$9$k(B */ + i = n; + tmpsp = seg->sp; + while (i--) { + *(tmpsp - seg->n_roma) = *tmpsp; + tmpsp++; + } + *(tmpsp - seg->n_roma) = '\0'; + seg->sp = seg->sp - seg->n_roma; + seg->n_roma = 0; + } + if (buf->inputmode == MODE_HKATA) { + + /* $BH>3Q%+%?%+%JF~NO%b!<%I$N$H$-$O(B */ + /* $BJQ49$r9T$o$J$$$GFI$_%P%C%U%!$K%3%T!<(B */ + if (IsKanaKey(ks)) + strcpy(tmp1, seg->sp); + else + _Xsj3cHAlphaToHKata(buf, tmp1, seg->sp); + seg->sp = seg->str; + *seg->oldstr= '\0'; + seg->n_kana = -1; + change_pos = seg->cur; + _Xsj3cInsertChar(buf, seg, tmp1, strlen(tmp1)); + + } else { + /* $B$R$i$,$J!?A43Q%+%?%+%JF~NO%b!<%I$N;~$OH>3Q(B */ + /* $B%+%?%+%J"*$R$i$,$J!?A43Q%+%?%+%JJQ49$r9T$&(B */ + if (IsLatin1Key(ks)) { + strcpy(tmp2, seg->sp); + _Xsj3cHAlphaToHKata(buf, seg->sp, tmp2); + } + if ((seg->value = _Xsj3cKanaConv(buf, seg, seg->str, + tmp1, buf->inputmode)) > 0) { + + /* $BH>3Q%+%?%+%J"*$R$i$,$JJQ49$,@.8y$7$?>l9g(B */ + /* $BBy2;!?H>By2;$N>l9g(B */ + seg->sp = seg->str; + if (seg->n_kana > 0) { + _Xsj3cExtractChar(buf, seg, tmp2, seg->n_kana); + strcpy(seg->oldstr, seg->str); + tmpsp = seg->oldstr; + while(*tmpsp != '\0') + tmpsp++; + *(tmpsp - seg->n_kana) = '\0'; + } else { + *seg->oldstr = '\0'; + } + seg->n_kana = 0; + } else if (seg->value == 0) { + + /* $BH>3Q%+%?%+%J"*$R$i$,$J!?A43Q%+%?%+%J(B */ + /* $BJQ49$N7k2L$,ITDj$N>l9g(B */ + if (seg->n_kana > 0) + _Xsj3cExtractChar(buf, seg, tmp2, seg->n_kana); + tmpsp = seg->sp + n - 1; + seg->sp = seg->str; + *seg->sp = *tmpsp; + *(++seg->sp) = '\0'; + seg->n_kana = 1; + *seg->oldstr = '\0'; + } else { + + /* $BH>3Q%+%?%+%J"*$R$i$,$JJQ49$,@.8y$7$?>l9g(B */ + /* $BBy2;!?H>By2;$G$J$$>l9g(B */ + if (seg->n_kana > 0) + _Xsj3cExtractChar(buf, seg, tmp2, seg->n_kana); + seg->sp = seg->str; + *seg->oldstr = '\0'; + seg->n_kana = 0; + } + change_pos = seg->cur; + len = _Xsj3cmPStowPS(buf, wcs, tmp1); + _Xsj3cInsertWchar(seg, wcs, len); + } + seg->n_roma = 0; + + } else if (IsLatin1Key(ks)) { + + /* $B%m!<%^;zF~NO$N>l9g(B */ + + if (seg->n_kana > 0) { + + /* $B%m!<%^;z%P%C%U%!(B(seg->str)$B$K$+$JF~NO;~$N(B */ + /* $BJ8;zNs$,;D$C$F$$$k>l9g$O$=$l$r:o=|$9$k(B */ + i = n; + tmpsp = seg->sp; + while (i--) { + *(tmpsp - seg->n_kana) = *tmpsp; + tmpsp++; + } + *(tmpsp - seg->n_kana) = '\0'; + seg->sp = seg->sp - seg->n_kana; + seg->n_kana = -1; + } + + /* $BF~NO%b!<%I$K4X78$J$/$+$JJQ49$r9T$&(B */ + + if ((seg->value = _Xsj3cRomaConv(buf->rktable, + seg->str, kanabuf)) > 0) { + + /* ROMA->$B$+$J(B $BJQ49$,@.8y$7$?>l9g(B */ + if (buf->alphaconv) { + /* AlphabetConversion $B%j%=!<%9$,(B on */ + /* $B$@$C$?$iA43Q$rH>3Q$KJQ49$9$k(B */ + + _Xsj3cExtractChar(buf, seg, tmp1, seg->n_roma); + _Xsj3cZAlphaToHAlpha(buf, seg->oldstr, tmp1); + } else { + _Xsj3cExtractChar(buf, seg, seg->oldstr, seg->n_roma); + } + change_pos = seg->cur; + if (buf->inputmode == MODE_HIRA) { + + /* $B$R$i$,$JF~NO%b!<%I$N$H$-$O$=$N$^$^(B */ + /* $BFI$_%P%C%U%!$K%3%T!<(B */ + seg->oldlen = _Xsj3cmPStowPS(buf, wcs, kanabuf); + } else if (buf->inputmode == MODE_ZKATA) { + + /* $BA43Q%+%?%+%JF~NO%b!<%I$N$H$-$O(B */ + /* $B$R$i$,$J$rA43Q%+%?%+%J$KJQ49(B */ + _Xsj3cHiraToZKata(buf, tmp1, kanabuf); + seg->oldlen = _Xsj3cmPStowPS(buf, wcs, tmp1); + } else { + + /* $BH>3Q%+%?%+%JF~NO%b!<%I$N;~$O$R$i$,$J(B */ + /* $B!?A43Q%+%?%+%J$rH>3Q%+%?%+%J$KJQ49(B */ + _Xsj3cZKanaToHKata(buf, tmp1, kanabuf); + seg->oldlen = _Xsj3cmPStowPS(buf, wcs, tmp1); + } + _Xsj3cInsertWchar(seg, wcs, seg->oldlen); + seg->n_roma = 0; + + /* $BJQ49$G$-$J$$J8;z$,%m!<%^;z%P%C%U%!$K;D$C$F(B */ + /* $B$$$?$i!JNc!V$C!W$KJQ49$5$l$k>l9gEy!K(B */ + /* $B$+$J%P%C%U%!$N:G8e$K$=$NJ8;z$rIUM?$9$k(B */ + if (*seg->str != '\0') { + _Xsj3cInsertChar(buf, seg, seg->str, strlen(seg->str)); + seg->sp = seg->str; + while (*seg->sp != '\0') { + seg->sp++; + seg->n_roma++; + } + change_roma = seg->n_roma; + } else { + seg->sp = seg->str; + } + + } else if (seg->value == 0) { + + /* ROMA$B"*$+$JJQ49$N7k2L$,ITDj$N>l9g(B */ + change_pos = seg->cur; + _Xsj3cInsertChar(buf, seg, seg->sp, n); + i = n; + while (i--) { + seg->sp++; + seg->n_roma++; + } + change_roma = n; + + } else { + /* ROMA$B"*$+$J(B $BJQ49$N7k2L$,IT@.8y$N>l9g(B */ + /* $B:G8e$NF~NO$,%m!<%^$+$JJQ49$N8uJd$H(B */ + /* $B$7$FM-8z$+$I$&$+D4$Y$k(B */ + + change_pos = seg->cur; + if ((seg->value = _Xsj3cRomaConv(buf->rktable, seg->sp, + kanabuf)) > 0) { + /* $B:G8e$NF~NO$,%m!<%^$+$JJQ49$N8uJd$H$7$F(B */ + /* $BM-8z$J>l9g(B */ + + if (buf->inputmode == MODE_HIRA) { + + /* $B$R$i$,$JF~NO%b!<%I$N$H$-$O$=$N$^$^(B */ + /* $BFI$_%P%C%U%!$K%3%T!<(B */ + seg->oldlen = _Xsj3cmPStowPS(buf, wcs, kanabuf); + } else if (buf->inputmode == MODE_ZKATA) { + + /* $BA43Q%+%?%+%JF~NO%b!<%I$N$H$-$O(B */ + /* $B$R$i$,$J$rA43Q%+%?%+%J$KJQ49(B */ + _Xsj3cHiraToZKata(buf, tmp1, kanabuf); + seg->oldlen = _Xsj3cmPStowPS(buf, wcs, tmp1); + } else { + + /* $BH>3Q%+%?%+%JF~NO%b!<%I$N;~$O$R$i$,$J(B */ + /* $B!?A43Q%+%?%+%J$rH>3Q%+%?%+%J$KJQ49(B */ + _Xsj3cZKanaToHKata(buf, tmp1, kanabuf); + seg->oldlen = _Xsj3cmPStowPS(buf, wcs, tmp1); + } + _Xsj3cInsertWchar(seg, wcs, seg->oldlen); + seg->n_roma = 0; + + /* $BJQ49$G$-$J$$J8;z$,%m!<%^;z%P%C%U%!$K;D$C$F(B */ + /* $B$$$?$i!JNc!V$C!W$KJQ49$5$l$k>l9gEy!K(B */ + /* $B$+$J%P%C%U%!$N:G8e$K$=$NJ8;z$rIUM?$9$k(B */ + if (*seg->str != '\0') { + _Xsj3cInsertChar(buf, seg, seg->str, strlen(seg->str)); + seg->sp = seg->str; + while (*seg->sp != '\0') { + seg->sp++; + seg->n_roma++; + } + change_roma = seg->n_roma; + } else { + seg->sp = seg->str; + } + } else if (seg->value == 0) { + /* $B%m!<%^$+$JJQ49$N8uJd$H$7$FL$Dj$N>l9g(B */ + /* $B:G8e$NF~NOJ8;z$r%m!<%^"*$+$JJQ49MQ$N(B */ + /* $B%P%C%U%!(B(seg->str)$B$K;D$9(B */ + + change_pos = seg->cur; + _Xsj3cInsertChar(buf, seg, seg->sp, n); + *seg->oldstr = '\0'; + tmpsp = seg->str; + *seg->str = *seg->sp; + seg->sp = seg->str; + i = n; + while (i--) + *tmpsp++ = *seg->sp++; + *tmpsp = '\0'; + seg->n_roma = n; + change_roma = seg->n_roma; + } else { + /* $B%m!<%^$+$JJQ49$N8uJd$H$7$FL58z$J>l9g(B */ + + _Xsj3cInsertChar(buf, seg, seg->sp, n); + *seg->oldstr = '\0'; + seg->n_roma = 0; + *seg->str = '\0'; + seg->sp = seg->str; + + /* rkbell $B%j%=!<%9$,(B on $B$K@_Dj$5$l$F(B */ + /* $B$$$k>l9g%Y%k$rLD$i$9(B */ + if (buf->rkbell) + ret |= KEY_BELL; + change_roma = n; + } + } + + /* AlphabetConversion $B%j%=!<%9$,(B on */ + /* $B$@$C$?$iH>3Q%m!<%^;z$rA43Q%m!<%^;z$KJQ49$9$k(B */ + if (buf->alphaconv && buf->inputmode != MODE_HKATA + && change_roma) { + _Xsj3cExtractChar(buf, seg, tmp1, change_roma); + _Xsj3cHAlphaToZKana(buf, tmp2, tmp1); + _Xsj3cInsertChar(buf, seg, tmp2, change_roma); + } + /* $B$+$JF~NO%b!<%I$G$J$$$H$-$O(B -1 */ + seg->n_kana = -1; + } else { + return (KEY_NULL); + } + break; + + case MODE_HALPHA: + + /* $BH>3Q%"%k%U%!%Y%C%H(B $BF~NO%b!<%I$N>l9g(B */ + if (IsKanaKey(ks)) + return (KEY_BELL); + change_pos = seg->cur; + _Xsj3cInsertChar(buf, seg, seg->sp, n); + seg->sp = seg->str; + seg->n_roma = 0; + seg->n_kana = -1; + break; + + case MODE_ZALPHA: + + /* $BA43Q%"%k%U%!%Y%C%H(B $BF~NO%b!<%I$N>l9g(B */ + if (IsKanaKey(ks)) + return (KEY_BELL); + _Xsj3cHAlphaToZAlpha(buf, tmp1, seg->sp); + seg->sp = seg->str; + change_pos = seg->cur; + _Xsj3cInsertChar(buf, seg, tmp1, n); + seg->n_roma = 0; + seg->n_kana = -1; + break; + + case MODE_SJIS: + case MODE_EUC: + case MODE_JIS: + case MODE_KUTEN: + + /* $B%3!<%IF~NO%b!<%I$N>l9g(B */ + tmpsp = seg->str; + while (*tmpsp != '\0') { + if (!isxdigit(*tmpsp) + || (buf->inputmode == MODE_KUTEN && !isdigit(*tmpsp))) + return (KEY_BELL); + tmpsp++; + } + + /* $B%3!<%I"*$R$i$,$J!?A43Q%+%?%+%J!?5-9f!?4A;z$NJQ49$r9T$&(B */ + if ((seg->value = _Xsj3cCodeConv(buf, seg->str, + kanabuf, buf->inputmode)) > 0) { + + /* $B%3!<%IJQ49$K@.8y$7$?>l9g(B */ + if (buf->alphaconv) { + /* AlphabetConversion $B%j%=!<%9$,(B on $B$@$C$?$i(B */ + /* $BA43Q?t;z$rH>3Q?t;z$KJQ49$9$k(B */ + _Xsj3cExtractChar(buf, seg, tmp1, seg->n_roma); + _Xsj3cZAlphaToHAlpha(buf, seg->oldstr, tmp1); + } else { + _Xsj3cExtractChar(buf, seg, seg->oldstr, seg->n_roma); + } + change_pos = seg->cur; + seg->oldlen = (strlen(kanabuf) + 1)/ sizeof(wchar); + _Xsj3cInsertChar(buf, seg, kanabuf, seg->oldlen); + seg->cursegmode = MODE_HIRA; + seg->n_roma = 0; + seg->sp = seg->str; + } else if (seg->value == 0) { + + /* $B%3!<%IJQ49$N7k2L$,ITDj$N>l9g(B */ + change_pos = seg->cur; + if (buf->alphaconv) { + /* AlphabetConversion $B%j%=!<%9$,(B on $B$@$C$?$i(B */ + /* $BH>3Q?t;z$rA43Q?t;z$KJQ49$9$k(B */ + _Xsj3cHAlphaToZKana(buf, tmp1, seg->sp); + _Xsj3cInsertChar(buf, seg, tmp1, n); + } else { + _Xsj3cInsertChar(buf, seg, seg->sp, n); + } + i = n; + while (i--) { + seg->n_roma++; + seg->sp++; + } + } else { + + /* $B%3!<%IJQ49$N7k2L$,<:GT$N>l9g(B */ + _Xsj3cExtractChar(buf, seg, tmp1, seg->n_roma); + change_pos = seg->cur; + seg->sp = seg->str; + seg->n_roma = 0; + if (seg->num == 0 && buf->convmode != DictModeMask) { + Xsj3cFreeSegment(seg); + seg = NULL; + buf->segnum--; + for (i = buf->curseg; i < buf->segnum; i++) { + buf->input[i] = buf->input[i + 1]; + } + buf->input[buf->segnum] = NULL; + return ret; + } + if (buf->rkbell) + ret |= KEY_BELL; + } + seg->n_kana = -1; + break; + + default: + Xsj3cWarning("Illegal current mode"); + return (KEY_BELL); + } + + /* $BI=<(MQJ8;zNs$X%3%T!<$9$k(B */ + _Xsj3cStoreYomi(buf, seg, change_pos); + return ret; +} + +/* + * _Xsj3cKanaConv() + * Kana input mode dispatch routine. + */ +int +_Xsj3cKanaConv(buf, seg, hkana, zkana, mode) + Xsj3cBuf buf; + Xsj3cSeg seg; + unsigned char *hkana, *zkana; + Xsj3csMode mode; +{ + register int len, zlen; + register wchar s; + + if (mode == MODE_HIRA) { + if (buf->alphaconv) + _Xsj3cHankakuToHira(buf, zkana, hkana); + else + _Xsj3cHKataToHira(buf, zkana, hkana); + } else { + if (buf->alphaconv) + _Xsj3cHankakuToZKata(buf, zkana, hkana); + else + _Xsj3cHKataToZKata(buf, zkana, hkana); + } + len = 0; + while (*hkana != '\0') { + hkana++; + len++; + } + if (isdakuon(*(hkana - 1))) { + return 0; + } else { + zlen = 0; + while (*zkana != '\0') { + zkana++; + zlen++; + } + if (zlen > 1) { + s = (*(zkana - 2) << 8) + (*(zkana - 1) & 0xff); + if (seg->n_kana && (iszdakuten(s, serverIF[buf->server].lang) + || !isdakuten(*(hkana - 1)))) + return -1; + else + return len; + } else { + return -1; + } + } +} + +/* + * _Xsj3cCodeConv() + * Code input mode dispatch routine. + */ +static int +_Xsj3cCodeConv(buf, code, kanji, mode) + Xsj3cBuf buf; + register unsigned char *code; + register unsigned char *kanji; + Xsj3csMode mode; +{ + register int i, j, len; + register wchar k, (*conv)(); + register unsigned char c1, c2; + unsigned char kbuf[4]; + + if ((len = strlen(code)) < 4 && (mode == MODE_EUC || mode == MODE_KUTEN)) + return CONV_UNFIXED; + else if ((len < 2 || len == 3) && (mode == MODE_SJIS || mode == MODE_JIS)) + return CONV_UNFIXED; + + k = 0; + for (j = 0; j < 4 && *code != '\0'; code++, j++) { + if (isdigit(*code)) + i = *code - '0'; + else if (islower(*code)) + i = 10 + *code - 'a'; + else if (isupper(*code)) + i = 10 + *code - 'A'; + else + return CONV_FAILED; + kbuf[j] = i; + k += i << ((3 - j) * 4); + } + switch (mode) { + case MODE_SJIS: + if (len == 4 && issjis1(c1 = (k >> 8)) && issjis2(c2 = (k & 0xff))) { + if (conv = CodeConvFunc[JP_SJIS][serverIF[buf->server].lang]) { + k = conv(k); + *kanji++ = k >> 8; + *kanji++ = k & 0xff; + *kanji = '\0'; + } else { + *kanji++ = c1; + *kanji++ = c2; + *kanji = '\0'; + } + } else if (iskana(k >> 8)) { + *kanji++ = k >> 8; + *kanji = '\0'; + } else { + if (len < 4) + return CONV_UNFIXED; + else + return CONV_FAILED; + } + break; + case MODE_EUC: + if (iseuc(k >> 8) && iseuc(k & 0xff)) { + if (conv = CodeConvFunc[JP_EUC][serverIF[buf->server].lang]) + k = conv(k); + *kanji++ = k >> 8; + *kanji++ = k & 0xff; + *kanji = '\0'; + } else if (iseuckana(k >> 8) && iskana2(k & 0xff)) { + *kanji++ = k & 0xff; + *kanji = '\0'; + } else { + return CONV_FAILED; + } + break; + case MODE_JIS: + if (len == 4 && isjis(c1 = (k >> 8)) && isjis(c2 = (k & 0xff))) { + if (conv = CodeConvFunc[JP_JIS8][serverIF[buf->server].lang]) { + k = conv(k); + *kanji++ = k >> 8; + *kanji++ = k & 0xff; + *kanji = '\0'; + } else { + *kanji++ = c1; + *kanji++ = c2; + *kanji = '\0'; + } + } else if (iskana(k >> 8)) { + *kanji++ = k >> 8; + *kanji = '\0'; + } else { + if (len < 4) + return CONV_UNFIXED; + else + return CONV_FAILED; + } + break; + case MODE_KUTEN: + conv = CodeConvFunc[JP_JIS8][serverIF[buf->server].lang]; + c1 = kbuf[0] * 10 + kbuf[1]; + c2 = kbuf[2] * 10 + kbuf[3]; + k = (c1 << 8) + c2; + k = conv(k + 0x2020); + if (iskan1(c1 = (k >> 8), serverIF[buf->server].lang) + && iskan2(c2 = (k & 0xff), serverIF[buf->server].lang)) { + *kanji++ = c1; + *kanji++ = c2; + *kanji = '\0'; + } else { + return CONV_FAILED; + } + break; + default: + Xsj3cWarning("Illegal mode"); + return CONV_FAILED; + } + + return CONV_FIXED; +} + +#define MATCH 0 +#define NOT 1 + +/* + * _Xsj3cRomaConv() + * Get roman characters from the second argument and put back hiragana or + * katakana characters to the third argument in conversion table. + * If roman characters (third argument) mach with the "roma" entry in table, + * put back the "str" entry to the third argument and the "yomi" entry + * to the third argument, then it returns number of converted roman + * characters. + * If not but any letters of roman characters is match with the "roma" + * entry in table and the number of roman characters is less than + * the number of the letters of "roma" entry, put back the same to + * the third argument and nothing to the third argument, then it returns + * zero. + * Then last (not converted case) it returns minus 1. + * Any arguments must be null('\0') terminated. + * First argument is pointer to conversion table; + */ +int +_Xsj3cRomaConv(rktable, roma, yomi) + Xsj3cRKTable *rktable; + register unsigned char *roma; + register unsigned char *yomi; +{ + Xsj3cRKTable *rktp; + register unsigned char *p, *q; + unsigned char tmp[RBUFSIZ]; + int match, result = CONV_FAILED; + register int len; + + if (!roma || (len = strlen(roma)) == 0) + return (CONV_FAILED); + for (rktp = rktable; rktp != NULL; rktp = rktp->next) { + if (!rktp->roma) { + continue; + } + p = roma; + q = rktp->roma; + if (len > rktp->rlen) { + if (*q++ == *p++) { + match = MATCH; + while (*q != '\0') { + if (*q != *p) { + match = NOT; + break; + } + q++; + p++; + } + if (match == NOT) { + continue; + } + if (result < 0) { + result = rktp->rlen; + strcpy(yomi, rktp->yomi); + strcpy(tmp, p); + } else { + continue; + } + } else { + continue; + } + } else { + if (*p++ == *q++) { + match = MATCH; + while (*p != '\0') { + if (*p++ != *q++) { + match = NOT; + break; + } + } + if (match == NOT) { + continue; + } + if (*q != '\0') { + result = CONV_UNFIXED; + continue; + } else if (result == CONV_UNFIXED) { + continue; + } else { + result = rktp->rlen; + strcpy(yomi, rktp->yomi); + strcpy(tmp, rktp->str); + } + } else { + continue; + } + } + } + if (result > 0) + strcpy(roma, tmp); + return (result); +} + +/* + * _Xsj3cCtrlConv() + * + * Through all control events. + * Put the control code (now only HT & NL) after current position, + * then fix all segments. + * Put the control code (now only HT & NL) after current segment, + * then fix all segments and end convertion. + * Does Nothing. + * + * DisplayModeChange on: Change the display mode string. + * ThroughNext code: + * SetNormal code: + */ +static Xsj3cEvent +_Xsj3cCtrlConv(buf, code) + Xsj3cBuf buf; + unsigned char code; +{ + unsigned char ch[2]; + register unsigned char *c; + int change_pos; + register int i; + + if (code == '\t' || code == '\n') + goto compound_text; + if (buf->throughnext) { + c = buf->throughnext; + while (*c != '\0') { + if (*c == code) { + buf->throughflg = THROUGH; + if (buf->dispmodechange) { + buf->dispmode = buf->inputmode; +#ifdef THROUGH_CONT + return (KEY_TEXT_CLEAR|KEY_CONTROL|KEY_MODE_CHANGE); + } else { + return (KEY_TEXT_CLEAR|KEY_CONTROL); +#else /* THROUGH_CONT */ + return (KEY_NULL); + } else { + return (KEY_NULL); +#endif /* THROUGH_CONT */ + } + } + c++; + } + } + if (buf->setnormal) { + c = buf->setnormal; + while (*c != '\0') { + if (*c == code) { + if (buf->dispmodechange) { + buf->dispmode = buf->inputmode; +#ifdef THROUGH_CONT + return (KEY_TEXT_FIXED|KEY_CONTROL|KEY_HENKAN_END + |KEY_MODE_CHANGE); + } else { + return (KEY_TEXT_FIXED|KEY_CONTROL|KEY_HENKAN_END); +#else /* THROUGH_CONT */ + return (KEY_NULL); + } else { + return (KEY_NULL); +#endif /* THROUGH_CONT */ + } + } + c++; + } + } + /* Through all control events by XtNunusedEventCallback */ + return (KEY_NULL); + + /* Push by compound text */ +compound_text: + switch (buf->convmode) { + case NoInputModeMask: + buf->convmode = InputModeMask; + case InputModeMask: + if (buf->segnum == buf->curseg) + buf->segnum++; + ch[0] = code; + ch[1] = '\0'; + change_pos = buf->input[buf->curseg]->cur; + _Xsj3cInsertChar(buf, buf->input[buf->curseg], ch, 1); + _Xsj3cStoreYomi(buf, buf->input[buf->curseg], change_pos); + if (buf->dispmodechange) { + buf->dispmode = buf->inputmode; + return (KEY_TEXT_FIXED|KEY_TEXT_CHANGE|KEY_MODE_CHANGE); + } else + return (KEY_TEXT_FIXED|KEY_TEXT_CHANGE); + case ConvedModeMask: + i = buf->input[buf->curseg]->dnum; + buf->input[buf->curseg]->disp[i++] = code; + buf->input[buf->curseg]->disp[i] = '\0'; + buf->input[buf->curseg]->dnum++; + if (buf->dispmodechange) { + buf->dispmode = buf->inputmode; + return (KEY_TEXT_FIXED|KEY_TEXT_CHANGE|KEY_MODE_CHANGE); + } else + return (KEY_TEXT_FIXED|KEY_TEXT_CHANGE); + case DictModeMask: + case SelectModeMask: + default: + return (KEY_NULL); + } +} + +/* + * _Xsj3cThrough() + * Store characters to yomi/disp buffer and fix. + */ +static Xsj3cEvent +_Xsj3cThrough(buf, seg, n) + Xsj3cBuf buf; + Xsj3cSeg seg; + int n; +{ + int change_pos; + + change_pos = seg->cur; + _Xsj3cInsertChar(buf, seg, seg->str, n); + _Xsj3cStoreYomi(buf, seg, change_pos); + return (KEY_TEXT_FIXED); +} + +/* + * _Xsj3cDirect() + * Store characters to yomi/disp buffer. + * + * DisplayModeChange on: Change the display mode string. + */ +static Xsj3cEvent +_Xsj3cDirect(buf, seg, n) + Xsj3cBuf buf; + Xsj3cSeg seg; + int n; +{ + Xsj3cEvent ret = KEY_TEXT_CHANGE; + int change_pos; + + change_pos = seg->cur; + _Xsj3cInsertChar(buf, seg, seg->str, n); + _Xsj3cStoreYomi(buf, seg, change_pos); + *seg->str = '\0'; + seg->sp = seg->str; + *seg->oldstr = '\0'; + seg->oldlen = 0; + seg->n_roma = 0; + seg->n_kana = -1; + if (buf->dispmodechange) { + buf->dispmode = (buf->convedsegnum == buf->segnum ? MODE_KANJI : + (buf->convedsegnum ? MODE_EDIT : buf->inputmode)); + ret |= KEY_MODE_CHANGE; + } + return (ret); +} diff -r 000000000000 -r 92745d501b9a lib/Xsj3clib/dict.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/Xsj3clib/dict.c Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,674 @@ +#ifndef lint +static char *rcsid = "$Id: dict.c,v 2.0 1992/02/13 18:33:19 nao Exp $"; +#endif +/* + * Copyright 1991 Sony Corporation + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Sony not be used in advertising or + * publicity pertaining to distribution of the software without specific, + * written prior permission. Sony makes no representations about the + * suitability of this software for any purpose. It is provided "as is" + * without express or implied warranty. + * + * SONY DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL SONY + * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ +/* + * Author: Naoshi Suzuki, SONY Corporation. (nao@sm.sony.co.jp) + */ + +#include "common.h" +#include "util.h" +#include "segment.h" + +extern Xsj3cCVServerIF serverIF[SERVER_NUM]; +extern wchar *_Xsj3cStoreWchar(); + +void _Xsj3cFlushDictMsg(); +Xsj3cDictData _Xsj3cCreateDictData(); +void _Xsj3cFreeDictData(); + +int Xsj3cGetDictMsgNum(); +Xsj3cDictMsg Xsj3cGetDictMsgs(); +wchar *Xsj3cGetDictMsg(); +void Xsj3cDictRegister(); +void Xsj3cDictClear(); +void Xsj3cEndDict(); + +Xsj3cHinsi _Xsj3cHinsiInit(); +int Xsj3cGetHinsiNum(); +Xsj3cHinsi Xsj3cGetHinsis(); +wchar *Xsj3cGetHinsi(); +int Xsj3cSetHinsi(); +void Xsj3cEndHinsi(); + +static Xsj3cDictMsg _Xsj3cDictMsgInit(); +static void _Xsj3cSetDictMsg(); + +static Xsj3cDictMsg dictmsglist[SERVER_NUM] = {NULL}; +static int dictmsgnum[SERVER_NUM] = {0}; + +static Xsj3cHinsi hinsilist[SERVER_NUM] = {NULL}; +static int hinsinum[SERVER_NUM] = {0}; + +typedef struct _dict_hinsi { + int code; + char *string; +} Sj3HinsiRec, *Sj3HinsiPtr; + +static Sj3HinsiRec sj3_hinsi_list[] = { + SJ3_H_NRMNOUN, "\225\201\222\312\226\274\216\214", + SJ3_H_PRONOUN, "\221\343\226\274\216\214", + SJ3_H_LNAME, "\225\143\216\232", + SJ3_H_FNAME, "\226\274\221\117", + SJ3_H_LOCNAME, "\222\156\226\274", + SJ3_H_PREFIC, "\214\247\201\136\213\346\226\274", + SJ3_H_RENTAI, "\230\101\221\314\216\214", + SJ3_H_CONJUNC, "\220\332\221\261\216\214", + SJ3_H_SUBNUM, "\217\225\220\224\216\214", + SJ3_H_NUMERAL, "\220\224\216\214", + SJ3_H_PREFIX, "\220\332\223\252\214\352", + SJ3_H_POSTFIX, "\220\332\224\366\214\352", + SJ3_H_ADVERB, "\225\233\216\214", + SJ3_H_ADJECT, "\214\140\227\145\216\214", + SJ3_H_ADJVERB, "\214\140\227\145\223\256\216\214", + SJ3_H_SILVERB, "\203\124\225\317\223\256\216\214", + SJ3_H_ZILVERB, "\203\125\225\317\223\256\216\214", + SJ3_H_ONEVERB, "\210\352\222\151\223\256\216\214", + SJ3_H_KAVERB, "\203\112\215\163\214\334\222\151\223\256\216\214", + SJ3_H_GAVERB, "\203\113\215\163\214\334\222\151\223\256\216\214", + SJ3_H_SAVERB, "\203\124\215\163\214\334\222\151\223\256\216\214", + SJ3_H_TAVERB, "\203\136\215\163\214\334\222\151\223\256\216\214", + SJ3_H_NAVERB, "\203\151\215\163\214\334\222\151\223\256\216\214", + SJ3_H_BAVERB, "\203\157\215\163\214\334\222\151\223\256\216\214", + SJ3_H_MAVERB, "\203\175\215\163\214\334\222\151\223\256\216\214", + SJ3_H_RAVERB, "\203\211\215\163\214\334\222\151\223\256\216\214", + SJ3_H_WAVERB, "\203\217\215\163\214\334\222\151\223\256\216\214", + SJ3_H_SINGLE, "\222\120\212\277\216\232", +}; + +typedef struct _dict_status { + Xsj3cdMode state; + Xsj3cdMode value; + char *string; +} Sj3DictStatusRec, *Sj3DictStatusPtr; + +static Sj3DictStatusRec sj3_dict_status[] = { + REG_STATE|CLR_STATE, SJ3_DICT_INPUT, + " \224\315\210\315\216\167\222\350/\223\307\202\335\223\374\227\ +\315:[\223\307\202\335]", + /* $BHO0O;XDj(B/$BFI$_F~NO(B:[$BFI$_(B] */ + REG_STATE|CLR_STATE, SJ3_DICT_YOMI, + " [\223\307\202\335]", + /* [$BFI$_(B] */ + REG_STATE|CLR_STATE, SJ3_DICT_HINSI, + " [\225\151\216\214]", + /* [$BIJ;l(B] */ + REG_STATE|CLR_STATE, SJ3_DICT_CONFIRM, + " [ok ?]", + /* [ok ?] */ + REG_STATE, SJ3_TOUROKU_SUCCESSED, + ":\223\157\230\136\202\265\202\334\202\265\202\275", + /* $BEPO?$7$^$7$?(B */ + CLR_STATE, SJ3_SYOUKYO_SUCCESSED, + ":\217\301\213\216\202\265\202\334\202\265\202\275", + /* $B>C5n$7$^$7$?(B */ + REG_STATE|CLR_STATE, SJ3_NO_YOMI_STR, + ":\223\307\202\335\225\266\216\232\227\361\202\252\202\240\202\350\ +\202\334\202\271\202\361", + /* $BFI$_J8;zNs$,$"$j$^$;$s(B */ + REG_STATE|CLR_STATE, SJ3_LONG_YOMI_STR, + ":\223\307\202\335\225\266\216\232\227\361\202\252\222\267\202\267\ +\202\254\202\334\202\267", + /* $BFI$_J8;zNs$,D9$9$.$^$9(B */ + REG_STATE|CLR_STATE, SJ3_DICT_ERROR, + ":\216\253\217\221\202\326\202\314\217\221\202\253\215\236\202\335\ +\202\252\217\157\227\210\202\334\202\271\202\361", + /* $B<-=q$X$N=q$-9~$_$,=PMh$^$;$s(B */ + REG_STATE|CLR_STATE, SJ3_DICT_LOCKED, + ":\216\253\217\221\202\252\203\215\203\142\203\116\202\263\202\352\ +\202\304\202\242\202\334\202\267", + /* $B<-=q$,%m%C%/$5$l$F$$$^$9(B */ + REG_STATE|CLR_STATE, SJ3_BAD_YOMI_STR, + ":\223\307\202\335\225\266\216\232\227\361\202\311\225\163\220\263\ +\202\310\225\266\216\232\202\252\212\334\202\334\202\352\202\304\202\242\ +\202\334\202\267", + /* $BFI$_J8;zNs$KIT@5$JJ8;z$,4^$^$l$F$$$^$9(B */ + REG_STATE|CLR_STATE, SJ3_BAD_KANJI_STR, + ":\212\277\216\232\225\266\216\232\227\361\202\311\225\163\220\263\ +\202\310\225\266\216\232\202\252\212\334\202\334\202\352\202\304\202\242\ +\202\351\202\251\222\267\202\267\202\254\202\334\202\267", + /* $B4A;zJ8;zNs$KIT@5$JJ8;z$,4^$^$l$F$$$k$+D9$9$.$^$9(B */ + REG_STATE|CLR_STATE, SJ3_BAD_HINSI_CODE, + ":\225\151\216\214\203\122\201\133\203\150\202\252\225\163\220\263\ +\202\305\202\267", + /* $BIJ;l%3!<%I$,IT@5$G$9(B */ + REG_STATE, SJ3_WORD_EXIST, + ":\223\157\230\136\215\317\202\314\217\156\214\352\202\305\202\267", + /* $BEPO?:Q$N=O8l$G$9(B */ + CLR_STATE, SJ3_WORD_NOT_EXIST, + ":\217\156\214\352\202\252\223\157\230\136\202\263\202\352\202\304\ +\202\242\202\334\202\271\202\361", + /* $B=O8l$,EPO?$5$l$F$$$^$;$s(B */ + REG_STATE, SJ3_DOUON_FULL, + ":\202\261\202\352\210\310\217\343\223\257\211\271\214\352\202\360\ +\223\157\230\136\202\305\202\253\202\334\202\271\202\361", + /* $B$3$l0J>eF12;8l$rEPO?$G$-$^$;$s(B */ + REG_STATE, SJ3_DICT_FULL, + ":\202\261\202\352\210\310\217\343\216\253\217\221\202\311\223\157\ +\230\136\202\305\202\253\202\334\202\271\202\361", + /* $B$3$l0J>e<-=q$KEPO?$G$-$^$;$s(B */ + REG_STATE, SJ3_INDEX_FULL, + ":\202\261\202\352\210\310\217\343 INDEX \202\311\223\157\230\136\202\ +\305\202\253\202\334\202\271\202\361", + /* $B$3$l0J>e(B INDEX $B$KEPO?$G$-$^$;$s(B */ + REG_STATE, SJ3_TOUROKU_FAILED, + ":\216\253\217\221\202\326\202\314\223\157\230\136\202\311\216\270\ +\224\163\202\265\202\334\202\265\202\275", + /* $B<-=q$X$NEPO?$K<:GT$7$^$7$?(B */ + CLR_STATE, SJ3_SYOUKYO_FAILED, + ":\216\253\217\221\202\251\202\347\202\314\217\301\213\216\202\311\ +\216\270\224\163\202\265\202\334\202\265\202\275", + /* $B<-=q$+$i$N>C5n$K<:GT$7$^$7$?(B */ +}; + +/* + * _Xsj3cCreateDictData() + */ +Xsj3cDictData +_Xsj3cCreateDictData(buf, mode) + Xsj3cBuf buf; + Xsj3cdMode mode; +{ + register Xsj3cDictData dict; + + if (buf->dict) + return buf->dict; + if ((dict = (Xsj3cDictData)malloc(sizeof(Xsj3cDictDataRec))) == NULL) + Xsj3cError("Failed to allocate data for DictMode."); + if ((dict->seg = (Xsj3cSeg)Xsj3cCreateSegment(buf)) == NULL) + Xsj3cError("Failed to allocate segment for dictionary."); + if ((dict->msg = (Xsj3cDictMsg) + calloc(DICT_STR_NUM, sizeof(Xsj3cDictMsgRec))) == NULL) + Xsj3cError("Failed to allocate message buffer for dictionary."); + dict->mode = mode; + dict->status = DICT_INPUT; + dict->value = SJ3_DICT_INPUT; + dict->n_dict = 0; + return (dict); +} + +/* + * _Xsj3cFreeDictData() + */ +void +_Xsj3cFreeDictData(buf) + Xsj3cBuf buf; +{ + if (!buf->dict) + return ; + Xsj3cFreeSegment(buf->dict->seg); + buf->dict->seg = NULL; + free (buf->dict->msg); + free (buf->dict); + buf->dict = NULL; +} + +/* + * _Xsj3cDictMsgInit() + */ +static Xsj3cDictMsg +_Xsj3cDictMsgInit(buf) + Xsj3cBuf buf; +{ + wchar data[KANABUFSIZ]; + register int i; + + if (dictmsglist[buf->server]) { + return (dictmsglist[buf->server]); + } + switch(buf->server) { + case SERVER_SJ3: + default: + dictmsgnum[SERVER_SJ3] + = sizeof(sj3_dict_status)/sizeof(Sj3DictStatusRec); + break; + } + if ((dictmsglist[buf->server] = + (Xsj3cDictMsg)calloc(dictmsgnum[buf->server], + sizeof(Sj3DictStatusRec))) == NULL) { + Xsj3cError("Failed to allocate hinsi data"); + } + switch(buf->server) { + case SERVER_SJ3: + default: + for (i = 0; i < dictmsgnum[SERVER_SJ3]; i++) { + dictmsglist[buf->server][i].len = _Xsj3cmPStowOUT(buf, data, + (unsigned char *)sj3_dict_status[i].string); + dictmsglist[buf->server][i].data + = _Xsj3cStoreWchar(data, dictmsglist[buf->server][i].len + 1); + dictmsglist[buf->server][i].attr = SEG_NORMAL; + if (!dictmsglist[buf->server][i].data) + Xsj3cError("Failed to allocate hinsi data"); + } + break; + } + return (dictmsglist[buf->server]); +} + +/* + * Xsj3cGetDictMsgNum() + */ +int +Xsj3cGetDictMsgNum(buf) + Xsj3cBuf buf; +{ + switch (buf->dict->status) { + case DICT_INPUT: + case DICT_HINSI: + if (buf->dict->seg->num > 0) + return (DICT_STR_YOMI + 1); + else + return (DICT_STR_MSG1 + 1); + case DICT_CONFIRM: + if (buf->dict->mode == REG_STATE) + return (DICT_STR_NUM); + else + return (DICT_STR_MSG2 + 1); + case DICT_END: + if (buf->dict->seg->num > 0) { + if (buf->curhinsi < 0) + return (DICT_STR_MSG2 + 1); + else + return (DICT_STR_NUM); + } else { + return (DICT_STR_MSG1 + 1); + } + default: + return (NULL); + } +} + +/* + * _Xsj3cFlushDictMsg() + */ +void +_Xsj3cFlushDictMsg(buf) + Xsj3cBuf buf; +{ + if (!dictmsglist[buf->server]) { + dictmsglist[buf->server] = _Xsj3cDictMsgInit(buf); + } + + switch (buf->dict->status) { + case DICT_INPUT: + case DICT_HINSI: + if (buf->dict->seg->num > 0) { + _Xsj3cSetDictMsg(buf, DICT_STR_YOMI); + } else { + _Xsj3cSetDictMsg(buf, DICT_STR_MODE); + _Xsj3cSetDictMsg(buf, DICT_STR_MSG1); + } + break; + case DICT_CONFIRM: + if (buf->dict->mode == REG_STATE) { + _Xsj3cSetDictMsg(buf, DICT_STR_MSG1); + _Xsj3cSetDictMsg(buf, DICT_STR_MSG2); + _Xsj3cSetDictMsg(buf, DICT_STR_HINSI); + _Xsj3cSetDictMsg(buf, DICT_STR_MSG3); + } else { + _Xsj3cSetDictMsg(buf, DICT_STR_MSG1); + _Xsj3cSetDictMsg(buf, DICT_STR_MSG2); + } + break; + case DICT_END: + if (buf->dict->seg->num > 0) { + if (buf->dict->seg->num > DICT_YOMI_MAX) { + _Xsj3cSetDictMsg(buf, DICT_STR_MSG2); + } else { + if (buf->dict->mode == REG_STATE) { + _Xsj3cSetDictMsg(buf, DICT_STR_MSG1); + _Xsj3cSetDictMsg(buf, DICT_STR_MSG3); + } else { + if (buf->curhinsi < 0) { + _Xsj3cSetDictMsg(buf, DICT_STR_MSG2); + } else { + _Xsj3cSetDictMsg(buf, DICT_STR_MSG1); + _Xsj3cSetDictMsg(buf, DICT_STR_MSG2); + _Xsj3cSetDictMsg(buf, DICT_STR_HINSI); + _Xsj3cSetDictMsg(buf, DICT_STR_MSG3); + } + } + } + } else { + _Xsj3cSetDictMsg(buf, DICT_STR_MSG1); + } + break; + default: + break; + } +} + +/* + * Xsj3cGetDictMsgs() + */ +Xsj3cDictMsg +Xsj3cGetDictMsgs(buf) + Xsj3cBuf buf; +{ + return (buf->dict->msg); +} + +/* + * Xsj3cGetDictMsg() + */ +wchar * +Xsj3cGetDictMsg(buf, n, len, attr) + Xsj3cBuf buf; + int n; + int *len; + int *attr; +{ + *attr = buf->dict->msg[n].attr; + *len = buf->dict->msg[n].len; + return (buf->dict->msg[n].data); +} + +static void +_Xsj3cSetDictMsg(buf, n) + Xsj3cBuf buf; + Xsj3cdMode n; +{ + Xsj3csMode mode; + register int i; + int value; + + switch (n) { + case DICT_STR_MODE: + mode = (buf->dict->mode == REG_STATE ? MODE_TOROKU : MODE_SYOUKYO); + buf->dict->msg[DICT_STR_MODE].data = buf->modestr[mode]; + buf->dict->msg[DICT_STR_MODE].len = buf->modelen[mode]; + buf->dict->msg[DICT_STR_MODE].attr = SEG_REVERSED; + return; + case DICT_STR_MSG1: + if (buf->dict->status == DICT_INPUT) { + value = SJ3_DICT_INPUT; + } else { + if (buf->dict->seg->num > 0) + value = SJ3_DICT_YOMI; + else + value = buf->dict->value; + } + break; + case DICT_STR_YOMI: + buf->dict->msg[DICT_STR_YOMI].data = buf->dict->seg->disp; + buf->dict->msg[DICT_STR_YOMI].len = buf->dict->seg->dnum; + buf->dict->msg[DICT_STR_YOMI].attr = SEG_UNDER_LINE; + return; + case DICT_STR_MSG2: + if (buf->dict->mode == CLR_STATE && buf->dict->status == DICT_CONFIRM) { + value = SJ3_DICT_CONFIRM; + } else { + if (buf->curhinsi < 0) + value = buf->dict->value; + else + value = SJ3_DICT_HINSI; + } + break; + case DICT_STR_HINSI: + buf->dict->msg[DICT_STR_HINSI].data = buf->hinsi[buf->curhinsi].data; + buf->dict->msg[DICT_STR_HINSI].len = buf->hinsi[buf->curhinsi].len; + buf->dict->msg[DICT_STR_HINSI].attr = SEG_NORMAL; + return; + case DICT_STR_MSG3: + if (buf->dict->mode == REG_STATE && buf->dict->status == DICT_CONFIRM) { + value = SJ3_DICT_CONFIRM; + } else { + value = buf->dict->value; + } + break; + default: + value = buf->dict->value; + break; + } + + switch(buf->server) { + case SERVER_SJ3: + default: + for (i = 0; i < dictmsgnum[SERVER_SJ3]; i++) { + if ((buf->dict->mode & sj3_dict_status[i].state) && + value == sj3_dict_status[i].value) + break; + } + break; + } + if (i >= dictmsgnum[buf->server]) + Xsj3cError("Cannot find message for now status %s.",_Xsj3cItoa(value)); + else + buf->dict->msg[n] = dictmsglist[buf->server][i]; +} + +void +Xsj3cDictRegister(buf) + Xsj3cBuf buf; +{ + wchar disp[KANABUFSIZ]; + unsigned char kana[KANJIBUFSIZ], kanji[KANJIBUFSIZ]; + register int i; + + disp[0] = '\0'; + for (i = buf->curseg; i <= buf->curseg + buf->dict->n_dict; i++) { + _Xsj3cWcat(disp, buf->input[i]->disp); + } + buf->dict->n_dict = 0; + _Xsj3cwOUTtomPS(buf, kanji, disp); + if (buf->gakusyuu) + _Xsj3cClearDcid(buf); + _Xsj3cwPStomPS(buf, kana, buf->dict->seg->yomi); + + switch (buf->server) { + case SERVER_SJ3: + default: + if ((buf->dict->value + = serverIF[buf->server].func[FUNC_REGISTER](kana, kanji, + sj3_hinsi_list[buf->curhinsi].code)) == 0) { + buf->dict->value = SJ3_TOUROKU_SUCCESSED; + } else if (buf->dict->value < 0) { + Xsj3cWarning("sj3serv is down. reconnect please"); + buf->dict->value = SJ3_TOUROKU_FAILED; + } + break; + } + _Xsj3cFlushDictMsg(buf); +} + +void +Xsj3cDictClear(buf) + Xsj3cBuf buf; +{ + wchar disp[KANABUFSIZ]; + unsigned char kana[KANJIBUFSIZ], kanji[KANJIBUFSIZ]; + register int i; + Sj3HinsiPtr hp; + + disp[0] = '\0'; + for (i = buf->curseg; i <= buf->curseg + buf->dict->n_dict; i++) { + _Xsj3cWcat(disp, buf->input[i]->disp); + } + buf->dict->n_dict = 0; + _Xsj3cwOUTtomPS(buf, kanji, disp); + if (buf->gakusyuu) + _Xsj3cClearDcid(buf); + _Xsj3cwPStomPS(buf, kana, buf->dict->seg->yomi); + + switch (buf->server) { + case SERVER_SJ3: + default: + for (hp = sj3_hinsi_list, i = 0; hp->code > 0; hp++, i++) { + if ((buf->dict->value + = serverIF[buf->server].func[FUNC_CLEAR](kana, kanji, + hp->code)) == 0) { + buf->dict->value = SJ3_SYOUKYO_SUCCESSED; + buf->curhinsi = i; + _Xsj3cFlushDictMsg(buf); + return; + } else if (buf->dict->value < 0) { + Xsj3cWarning("sj3serv is down. reconnect please"); + buf->dict->value = SJ3_SYOUKYO_FAILED; + buf->curhinsi = -1; + _Xsj3cFlushDictMsg(buf); + return; + } else if (buf->dict->value != SJ3_WORD_NOT_EXIST) { + buf->curhinsi = -1; + _Xsj3cFlushDictMsg(buf); + return; + } + } + break; + } + + buf->curhinsi = -1; + _Xsj3cFlushDictMsg(buf); + return; +} + +/* + * Xsj3cEndDict() + * End dictionary mode(DictMode) and back to ConvedMode. + */ +void +Xsj3cEndDict(buf) + Xsj3cBuf buf; +{ + _Xsj3cFreeDictData(buf); + buf->convmode = ConvedModeMask; +} + +/* + * _Xsj3cHinsiInit() + * Initialize hinsi data. + */ +Xsj3cHinsi +_Xsj3cHinsiInit(buf) + Xsj3cBuf buf; +{ + wchar data[KANABUFSIZ]; + register int i; + + if (hinsilist[buf->server]) { + return(hinsilist[buf->server]); + } + + switch (buf->server) { + case SERVER_SJ3: + default: + hinsinum[SERVER_SJ3]= sizeof(sj3_hinsi_list)/sizeof(Sj3HinsiRec); + break; + } + + if ((hinsilist[buf->server] + = (Xsj3cHinsi)calloc(hinsinum[buf->server], sizeof(Xsj3cHinsiRec))) + == NULL) { + Xsj3cError("Failed to allocate hinsi data"); + } + + switch (buf->server) { + case SERVER_SJ3: + default: + for (i = 0; i < hinsinum[buf->server]; i++) { + hinsilist[buf->server][i].len = _Xsj3cmPStowOUT(buf, data, + (unsigned char *)sj3_hinsi_list[i].string); + hinsilist[buf->server][i].data + = _Xsj3cStoreWchar(data, hinsilist[buf->server][i].len + 1); + if (!hinsilist[buf->server][i].data) + Xsj3cError("Failed to allocate hinsi data"); + } + break; + } + + return (hinsilist[buf->server]); +} + +/* + * Xsj3cGetHinsiNum() + * Return hinsi data total number. + */ +int +Xsj3cGetHinsiNum(buf, cur) + Xsj3cBuf buf; + int *cur; +{ + if (!buf->hinsi) { + buf->hinsi = _Xsj3cHinsiInit(buf); + } + *cur = 0; + return (hinsinum[buf->server]); +} + +/* + * Xsj3cGetHinsis() + * Return hinsi data structure. + */ +Xsj3cHinsi +Xsj3cGetHinsis(buf) + Xsj3cBuf buf; +{ + if (!buf->hinsi) { + buf->hinsi = _Xsj3cHinsiInit(buf); + } + return (buf->hinsi); +} + +/* + * Xsj3cGetHinsi() + * Set the appointed (by 1st argument) hinsi to 2nd argument. + */ +wchar * +Xsj3cGetHinsi(buf, n, len) + Xsj3cBuf buf; + int n; + int *len; +{ + if (!buf->hinsi) { + buf->hinsi = _Xsj3cHinsiInit(buf); + } + *len = buf->hinsi[n].len; + return (buf->hinsi[n].data); +} + +/* + * Xsj3cSetHinsi() + * Set the selected hinsi. + */ +int +Xsj3cSetHinsi(buf, sel_hinsi, changed, flush) + Xsj3cBuf buf; + int sel_hinsi; + int *changed; + int *flush; +{ + buf->curhinsi = sel_hinsi; + _Xsj3cFlushDictMsg(buf); + *changed = OFF; + *flush = OFF; + return 0; +} + +/* + * Xsj3cEndHinsi() + * End hinsi select mode(SelectMode) and back to ConvedMode. + */ +void +Xsj3cEndHinsi(buf) + Xsj3cBuf buf; +{ + buf->convmode = DictModeMask; +} diff -r 000000000000 -r 92745d501b9a lib/Xsj3clib/func.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/Xsj3clib/func.c Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,3968 @@ +#ifndef lint +static char *rcsid = "$Id: func.c,v 2.3 1993/09/21 09:42:57 nao Exp $"; +#endif +/* + * Copyright 1991 Sony Corporation + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Sony not be used in advertising or + * publicity pertaining to distribution of the software without specific, + * written prior permission. Sony makes no representations about the + * suitability of this software for any purpose. It is provided "as is" + * without express or implied warranty. + * + * SONY DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL SONY + * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ +/* + * Author: Naoshi Suzuki, SONY Corporation. (nao@sm.sony.co.jp) + */ + +#include +#include "common.h" +#include "sj3ctype.h" +#include "util.h" +#include "func.h" + +extern Xsj3cCVServerIF serverIF[SERVER_NUM]; +extern void Xsj3cRCInit(); +extern int _Xsj3cRomaConv(); +extern int _Xsj3cKanaConv(); +extern Xsj3cCand _Xsj3cCandidateInit(); +extern void _Xsj3cFlushDictMsg(); +extern Xsj3cDictData _Xsj3cCreateDictData(); + +Xsj3cEvent _Xsj3cConvert(); +Xsj3cEvent _Xsj3cUnConvert(); +Xsj3cEvent _Xsj3cFix(); +Xsj3cEvent _Xsj3cReturn(); + +Xsj3cEvent _Xsj3cModeHAlpha(); +Xsj3cEvent _Xsj3cModeZAlpha(); +Xsj3cEvent _Xsj3cModeHKata(); +Xsj3cEvent _Xsj3cModeZKata(); +Xsj3cEvent _Xsj3cModeHira(); +Xsj3cEvent _Xsj3cToHAlpha(); +Xsj3cEvent _Xsj3cToZAlpha(); +Xsj3cEvent _Xsj3cToHKata(); +Xsj3cEvent _Xsj3cToZKata(); +Xsj3cEvent _Xsj3cToHira(); +Xsj3cEvent _Xsj3cZenkaku(); +Xsj3cEvent _Xsj3cHankaku(); +Xsj3cEvent _Xsj3cToUpper(); +Xsj3cEvent _Xsj3cToLower(); +Xsj3cEvent _Xsj3cModeSJIS(); +Xsj3cEvent _Xsj3cModeEUC(); +Xsj3cEvent _Xsj3cModeJIS(); +Xsj3cEvent _Xsj3cModeKuten(); +Xsj3cEvent _Xsj3cCodeRollDown(); +Xsj3cEvent _Xsj3cModeRollDown(); +Xsj3cEvent _Xsj3cModeRollUp(); +Xsj3cEvent _Xsj3cNextMode(); +Xsj3cEvent _Xsj3cPrevMode(); +Xsj3cEvent _Xsj3cModeToggle(); + +Xsj3cEvent _Xsj3cForward(); +Xsj3cEvent _Xsj3cBackward(); +Xsj3cEvent _Xsj3cTop(); +Xsj3cEvent _Xsj3cEnd(); +Xsj3cEvent _Xsj3cUp(); +Xsj3cEvent _Xsj3cDown(); +Xsj3cEvent _Xsj3cFirst(); +Xsj3cEvent _Xsj3cLast(); +Xsj3cEvent _Xsj3cNextPage(); +Xsj3cEvent _Xsj3cPrevPage(); +Xsj3cEvent _Xsj3cNext(); +Xsj3cEvent _Xsj3cPrev(); +Xsj3cEvent _Xsj3cSelect(); +Xsj3cEvent _Xsj3cCancel(); + +Xsj3cEvent _Xsj3cExpand(); +Xsj3cEvent _Xsj3cShrink(); + +Xsj3cEvent _Xsj3cBackSpace(); +Xsj3cEvent _Xsj3cDelete(); +Xsj3cEvent _Xsj3cDelAfter(); + +Xsj3cEvent _Xsj3cStart(); +Xsj3cEvent _Xsj3cReConnect(); +Xsj3cEvent _Xsj3cReConvert(); +Xsj3cEvent _Xsj3cEdit(); + +Xsj3cEvent _Xsj3cDRegBegin(); +Xsj3cEvent _Xsj3cDClearBegin(); + +Xsj3cEvent _Xsj3cSymbolBegin(); + +Xsj3cEvent _Xsj3cQuote(); +Xsj3cEvent _Xsj3cBell(); +Xsj3cEvent _Xsj3cKana(); +Xsj3cEvent _Xsj3cSjrc(); +Xsj3cEvent _Xsj3cKill(); +Xsj3cEvent _Xsj3cNull(); +Xsj3cEvent _Xsj3cIgnore(); + +Xsj3cEvent _Xsj3cUnConvSeg(); + +static Xsj3cEvent _Xsj3cDeleteSeg(); +static Xsj3cEvent _Xsj3cDeleteChar(); +static Xsj3cEvent _Xsj3cBackSpaceChar(); +static Xsj3cEvent _Xsj3cExpandNoConv(); +static Xsj3cEvent _Xsj3cShrinkNoConv(); + +/* + * _Xsj3cConvert() [henkan/convert] + * + * Do kana-kanji conversion. + * If character mode of current segment is zenkaku-hiragana, + * pop up candidate panel, else convert to zenkaku-hiragana. + * Rings bell. + * + * BeginConversionLast none: Set current segment out of segments. + * BeginConversionLast off: Set current segment to the first segment. + * BeginConversionLast on: Set current segment to the last segment. + * DisplayModeChange on: Change the display mode string. + * HenkanSegment all: Convert all segments. + * HenkanSegment after: Convert segments after current segment. + * HenkanSegment one: Convert current segment. + * BeforeSelectConversion on: Convert current segment to hiragana + * and need one more step to display candidates. + * BeforeConversion on: Convert current segment to hiragana before + * Kana-Kanji conversion. + * BeforeSelectCount: Work like "next/wrap" before popup candidate panel + * at [ConvedMode]. + * LastDoubleConversion on: Before Kana-Kanji conversion, convert current + * segment to current character mode. + */ +Xsj3cEvent +_Xsj3cConvert(buf) + Xsj3cBuf buf; +{ + unsigned char knjbuf[KANJIBUFSIZ]; + unsigned char kanabuf[KANJIBUFSIZ]; + Xsj3cEvent ret = KEY_NULL; + SJ3_BUNSETU bun[BUNBUFSIZ]; + int i, value; + register int conved, begin, end; + + if (buf->segnum && buf->curseg >= buf->segnum) { + buf->curseg = buf->segnum - 1; + if (buf->input[buf->curseg] && + (buf->input[buf->curseg]->status & SEG_CONVED)) + buf->convmode = ConvedModeMask; + else + buf->convmode = InputModeMask; + ret = KEY_TEXT_CHANGE; + } + if ((buf->convmode & (InputModeMask|ConvedModeMask)) + && buf->curseg < buf->segnum) { + if (buf->convmode & ConvedModeMask) { + if (buf->selectconv && + buf->input[buf->curseg]->cursegmode != MODE_HIRA) { + ret |= _Xsj3cModeChange(buf, MODE_HIRA, ON); + buf->convedsegnum--; + buf->input[buf->curseg]->status = SEG_NOCONV; + } else { + if (buf->selectcount > 0) { + int cur; + if (!buf->candidate) + Xsj3cGetCandidateNum(buf, &cur); + if (buf->selectcount < buf->candnum) { + if (buf->n_select < buf->selectcount) { + buf->n_select++; + return(_Xsj3cNext(buf)); + } + } + } + buf->convmode = SelectModeMask; + ret |= KEY_CAND_START; + if (buf->dispmodechange) { + buf->dispmode = MODE_CAND; + ret |= KEY_MODE_CHANGE; + } + buf->selectstatus = SELECT_CAND; + buf->n_select = 0; + return (ret); + } + } else if (buf->beforeconv) { + register wchar *p; + p = buf->input[buf->curseg]->yomi; + while (*p != '\0') { + if (!ishira(*p, serverIF[buf->server].lang)) { + ret |= _Xsj3cModeChange(buf, MODE_HIRA, ON); + break; + } + p++; + } + } else if (buf->lastdoubleconv && *buf->rkdouble != '\0') { + register unsigned char *p, q; + i = buf->input[buf->curseg]->num - 1; + q = buf->input[buf->curseg]->yomi[i] & 0xff; + p = buf->rkdouble; + while (*p != '\0') { + if (*p == q) { + ret |= _Xsj3cModeChange(buf, + buf->input[buf->curseg]->cursegmode, ON); + break; + } + p++; + } + } + ret |= KEY_TEXT_CHANGE; + switch (buf->henkanseg) { + case ALL: + begin = 0; + end = buf->segnum; + break; + case AFTER: + begin = buf->curseg; + end = buf->segnum; + break; + case ONE: + default: + begin = buf->curseg; + end = buf->curseg + 1; + break; + } + + conved = buf->convedsegnum; + if (!buf->input[begin]->num) { + return (ret); + } + for (i = begin; i < end; i += value) { + if (buf->input[i]->status == SEG_CONVED) { + value = 1; + continue; + } + if (buf->input[i]->num > INPUT_YOMI_MAX || !buf->input[i]->num) { + Xsj3cWarning("Too long or short segment[%d].", i); + ret |= KEY_BELL; + value = 1; + continue; + } + buf->input[i]->n_roma = 0; + buf->input[i]->n_kana = -1; + *buf->input[i]->str = '\0'; + buf->input[i]->sp = buf->input[i]->str; + *buf->input[i]->oldstr = '\0'; + _Xsj3cwPStomPS(buf, kanabuf, buf->input[i]->yomi); + value = serverIF[buf->server].func[FUNC_CONV] + (kanabuf, bun, knjbuf, KANJIBUFSIZ); + if (value <= 0) { + if (value < 0) + Xsj3cWarning("sj3serv is down. reconnect please"); + else + Xsj3cWarning("Too long segment[%d]. Could not convert.", i); + ret |= KEY_BELL; + value = 1; + continue; + } + _Xsj3cStoreKanji(buf, bun, i, value, OFF); + buf->convedsegnum += value; + buf->segnum += (--value); + } + if (buf->henkanseg != ONE || !conved) { + switch (buf->beginlastseg) { + case NONE: + buf->curseg = buf->segnum; + break; + case ON: + buf->curseg = buf->segnum - 1; + break; + case OFF: + buf->curseg = 0; + break; + default: + buf->curseg = 0; + break; + } + } + if (buf->dispmodechange) { + buf->dispmode = (buf->convedsegnum == buf->segnum ? MODE_KANJI : + (buf->convedsegnum ? MODE_EDIT : buf->inputmode)); + ret |= KEY_MODE_CHANGE; + } + return ret; + } else { +#ifdef THROUGH_CONT + return (KEY_BELL); +#else /* THROUGH_CONT */ + if (buf->cntrlsame) + return (KEY_BELL); + else + return (KEY_TEXT_CHANGE|KEY_BELL); /* dummy */ +#endif /* THROUGH_CONT */ + } +} + +/* + * _Xsj3cUnConvert() [muhen/unconvert] + * + * Unconvert segments. + * pop down the panel candidate(symbol/hinsi) panel and + * unconvert segments. + * Pop down Auxpanel and unconvert segments. + * Does nothing. + * + * DisplayModeChange on: Change the display mode string. + * MuhenkanCursorLast on: Set cursor position to bottom of segment. + * MuhenkanCursorLast off: Set cursor position to top of segment. + * MuhenkanSegment all: Unconvert all segments. + * MuhenkanSegment after: Unconvert segments after current segment. + * MuhenkanSegment one: Unconvert current segment. + */ +Xsj3cEvent +_Xsj3cUnConvert(buf) + Xsj3cBuf buf; +{ + Xsj3cEvent ret = KEY_NULL; + + if (buf->convmode & SelectModeMask) { + ret |= KEY_SELECT_ABORT; + if (buf->selectstatus == SELECT_HINSI) { + ret |= KEY_DICT_END; + } + } else if (buf->convmode & DictModeMask) { + ret |= KEY_DICT_END; + } else if (buf->convmode & NoInputModeMask) { +#ifdef THROUGH_CONT + return (KEY_NULL); +#else /* THROUGH_CONT */ + if (buf->cntrlsame) + return (KEY_NULL); + else + return (KEY_TEXT_CHANGE); /* dummy */ +#endif /* THROUGH_CONT */ + } + buf->convmode = InputModeMask; + ret |= _Xsj3cUnConvSeg(buf, buf->muhenseg, buf->muhencurlast); + _Xsj3cStoreYomi(buf, buf->input[buf->curseg], 0); + return (ret); +} + +/* + * _Xsj3cUnConvSeg() + * Change current segment back to non converted + * and set converion mode to InputMode. + */ +Xsj3cEvent +_Xsj3cUnConvSeg(buf, muhenseg, muhencurlast) + Xsj3cBuf buf; + Xsj3cFlag muhenseg, muhencurlast; +{ + register int i, begin, end, unconved = 0; + Xsj3cEvent ret = KEY_TEXT_CHANGE; + + buf->n_select = 0; + if (buf->candidate) + Xsj3cEndCandidate(buf, OFF); + switch (muhenseg) { + case ALL: + begin = 0; + end = buf->segnum; + break; + case AFTER: + begin = buf->curseg; + end = buf->segnum; + break; + case ONE: + default: + begin = buf->curseg; + end = buf->curseg + 1; + break; + } + for (i = begin; i < end; i++) { + if (buf->input[begin]->status == SEG_NOCONV) + unconved++; + else + break; + } + if (unconved == (end - begin)) { +#ifdef THROUGH_CONT + return (KEY_NULL); +#else /* THROUGH_CONT */ + if (buf->cntrlsame) + return (KEY_NULL); + else + return (KEY_TEXT_CHANGE); /* dummy */ +#endif /* THROUGH_CONT */ + } + for (i = begin + 1; i < end; i++) { + _Xsj3cWcat(buf->input[begin]->yomi, buf->input[i]->yomi); + buf->input[begin]->num += buf->input[i]->num; + } + buf->input[begin]->cur = buf->input[begin]->num; + for (i = begin + 1; i < end; i++) { + Xsj3cFreeSegment(buf->input[i]); + buf->input[i] = NULL; + } + Xsj3cFreeSegment(buf->input[buf->segnum]); + buf->input[buf->segnum] = NULL; + buf->segnum -= (end - begin - 1); + buf->curseg = begin; + buf->convedsegnum -= (end - begin); + if (!buf->convedsegnum) { + if (buf->gakusyuu) + _Xsj3cClearDcid(buf); + if (buf->dispmodechange) { + buf->dispmode = buf->inputmode; + ret |= KEY_MODE_CHANGE; + } + } else if (buf->dispmodechange) { + buf->dispmode = ((buf->segnum + && buf->convedsegnum == buf->segnum) ? MODE_KANJI : + (buf->convedsegnum ? MODE_EDIT : buf->inputmode)); + ret |= KEY_MODE_CHANGE; + } + buf->input[begin]->change = OFF; + buf->input[begin]->status = SEG_NOCONV; + if (!(buf->movebyseg & SEG_NOCONV)) + buf->input[begin]->edit = SEG_EDIT; + if (muhencurlast) + buf->input[begin]->cur = buf->input[begin]->num; + else + buf->input[begin]->cur = 0; + return (ret); +} + +/* + * _Xsj3cFix() [kettei/flush/fix] + * + * Fix all segments. + * the candidate(symbol) panel. + * Select reversed candidate(symbol/hinsi) + * in the candidate(symbol/hinsi) panel and pop down the panel. + * (DICT_INPUT) Decide current yomi character string. + * (DICT_CONFIRM) Confirm to register/eliminate word. + * (DICT_END) Pop down Auxpanel + * Does nothing. + * + * DisplayModeChange on: Change the display mode string. + */ +Xsj3cEvent +_Xsj3cFix(buf) + Xsj3cBuf buf; +{ + switch (buf->convmode) { + case SelectModeMask: + if (buf->selectstatus == SELECT_HINSI) { + buf->dict->status = DICT_CONFIRM; + if (buf->dispmodechange) { + buf->dispmode = + (buf->dict->mode == REG_STATE ? MODE_TOROKU : MODE_SYOUKYO); + return (KEY_SELECT_END|KEY_DICT_CHANGE|KEY_MODE_CHANGE); + } else + return (KEY_SELECT_END|KEY_DICT_CHANGE); + } else { + if (buf->dispmodechange) { + buf->dispmode = buf->inputmode; + return (KEY_TEXT_FIXED|KEY_TEXT_CHANGE + |KEY_SELECT_END|KEY_MODE_CHANGE); + } else + return (KEY_TEXT_FIXED|KEY_TEXT_CHANGE|KEY_SELECT_END); + } + case DictModeMask: + switch (buf->dict->status) { + case DICT_INPUT: + if (buf->dict->seg->num > 0) { + if (buf->dict->seg->num > DICT_YOMI_MAX) { + buf->dict->status = DICT_END; + buf->curhinsi = -1; + buf->dict->value = SJ3_LONG_YOMI_STR; + _Xsj3cFlushDictMsg(buf); + return(KEY_DICT_CHANGE); + } else { + if (buf->dict->mode == REG_STATE) { + buf->dict->status = DICT_HINSI; + buf->selectstatus = SELECT_HINSI; + buf->convmode = SelectModeMask; + _Xsj3cFlushDictMsg(buf); + if (buf->dispmodechange) { + buf->dispmode = MODE_HINSI; + return (KEY_HINSI_START|KEY_MODE_CHANGE); + } else + return (KEY_HINSI_START); + } else { + buf->dict->status = DICT_CONFIRM; + _Xsj3cFlushDictMsg(buf); + return (KEY_DICT_CHANGE); + } + } + } else { + buf->dict->status = DICT_END; + buf->curhinsi = -1; + buf->dict->value = SJ3_NO_YOMI_STR; + _Xsj3cFlushDictMsg(buf); + return(KEY_DICT_CHANGE); + } + case DICT_CONFIRM: + buf->dict->status = DICT_END; + return (buf->dict->mode == REG_STATE ? + KEY_DICT_REGISTER : KEY_DICT_CLEAR); + case DICT_END: + if (buf->dispmodechange) { + buf->dispmode + = (buf->convedsegnum == buf->segnum ? MODE_KANJI : + (buf->convedsegnum ? MODE_EDIT : buf->inputmode)); + return(KEY_DICT_END|KEY_TEXT_CHANGE|KEY_MODE_CHANGE); + } else + return(KEY_DICT_END|KEY_TEXT_CHANGE); + default: +#ifdef THROUGH_CONT + return (KEY_BELL); +#else /* THROUGH_CONT */ + if (buf->cntrlsame) + return (KEY_BELL); + else + return (KEY_TEXT_CHANGE|KEY_BELL); /* dummy */ +#endif /* THROUGH_CONT */ + } + case NoInputModeMask: +#ifdef THROUGH_CONT + return (KEY_NULL); +#else /* THROUGH_CONT */ + if (buf->cntrlsame) + return (KEY_NULL); + else + return (KEY_TEXT_CHANGE); /* dummy */ +#endif /* THROUGH_CONT */ + case InputModeMask: + case ConvedModeMask: + default: + if (buf->dispmodechange) { + buf->dispmode = buf->inputmode; + return (KEY_TEXT_FIXED|KEY_TEXT_CHANGE|KEY_MODE_CHANGE); + } else + return (KEY_TEXT_FIXED|KEY_TEXT_CHANGE); + } +} + +/* + * _Xsj3cReturn() [return] + * + * Put the carriage return after current position + * and fix all segments. + * Put the carriage return after current segment + * and fix all segments. + * Select reversed candidate(symbol/hinsi) + * in the candidate(symbol/hinsi) panel and pop down the panel. + * (DICT_INPUT) Decide current yomi character string. + * (DICT_CONFIRM) Confirm to register/eliminate word. + * (DICT_END) Pop down Auxpanel + * + * DisplayModeChange on: Change the display mode string. + */ +Xsj3cEvent +_Xsj3cReturn(buf) + Xsj3cBuf buf; +{ + unsigned char ch[2]; + int change_pos; + register int i; + + switch (buf->convmode) { + case NoInputModeMask: + buf->convmode = InputModeMask; + case InputModeMask: + if (buf->segnum == buf->curseg) + buf->segnum++; + ch[0] = '\r'; + ch[1] = '\0'; + change_pos = buf->input[buf->curseg]->cur; + _Xsj3cInsertChar(buf, buf->input[buf->curseg], ch, 1); + _Xsj3cStoreYomi(buf, buf->input[buf->curseg], change_pos); + if (buf->dispmodechange) { + buf->dispmode = buf->inputmode; + return (KEY_TEXT_FIXED|KEY_TEXT_CHANGE|KEY_MODE_CHANGE); + } else + return (KEY_TEXT_FIXED|KEY_TEXT_CHANGE); + case ConvedModeMask: + i = buf->input[buf->curseg]->dnum; + buf->input[buf->curseg]->disp[i++] = '\n'; + buf->input[buf->curseg]->disp[i] = '\0'; + buf->input[buf->curseg]->dnum++; + if (buf->dispmodechange) { + buf->dispmode = buf->inputmode; + return (KEY_TEXT_FIXED|KEY_TEXT_CHANGE|KEY_MODE_CHANGE); + } else + return (KEY_TEXT_FIXED|KEY_TEXT_CHANGE); + case DictModeMask: + switch (buf->dict->status) { + case DICT_INPUT: + if (buf->dict->seg->num) { + if (buf->dict->seg->num > DICT_YOMI_MAX) { + buf->dict->status = DICT_END; + buf->curhinsi = -1; + buf->dict->value = SJ3_LONG_YOMI_STR; + _Xsj3cFlushDictMsg(buf); + return(KEY_DICT_CHANGE); + } else { + if (buf->dict->mode == REG_STATE) { + buf->dict->status = DICT_HINSI; + buf->selectstatus = SELECT_HINSI; + buf->convmode = SelectModeMask; + _Xsj3cFlushDictMsg(buf); + if (buf->dispmodechange) { + buf->dispmode = MODE_HINSI; + return (KEY_HINSI_START|KEY_MODE_CHANGE); + } else + return (KEY_HINSI_START); + } else { + buf->dict->status = DICT_CONFIRM; + _Xsj3cFlushDictMsg(buf); + return (KEY_DICT_CHANGE); + } + } + } else { + buf->dict->status = DICT_END; + buf->curhinsi = -1; + buf->dict->value = SJ3_NO_YOMI_STR; + _Xsj3cFlushDictMsg(buf); + return(KEY_DICT_CHANGE); + } + case DICT_CONFIRM: + buf->dict->status = DICT_END; + return (buf->dict->mode == REG_STATE ? + KEY_DICT_REGISTER : KEY_DICT_CLEAR); + case DICT_END: + if (buf->dispmodechange) { + buf->dispmode + = (buf->convedsegnum == buf->segnum ? MODE_KANJI : + (buf->convedsegnum ? MODE_EDIT : buf->inputmode)); + return(KEY_DICT_END|KEY_TEXT_CHANGE|KEY_MODE_CHANGE); + } else + return(KEY_DICT_END|KEY_TEXT_CHANGE); + default: +#ifdef THROUGH_CONT + return (KEY_BELL); +#else /* THROUGH_CONT */ + if (buf->cntrlsame) + return (KEY_BELL); + else + return (KEY_TEXT_CHANGE|KEY_BELL); /* dummy */ +#endif /* THROUGH_CONT */ + } + case SelectModeMask: + if (buf->selectstatus == SELECT_HINSI) { + buf->dict->status = DICT_CONFIRM; + if (buf->dispmodechange) { + buf->dispmode = + (buf->dict->mode == REG_STATE ? MODE_TOROKU : MODE_SYOUKYO); + return (KEY_SELECT_END|KEY_DICT_CHANGE|KEY_MODE_CHANGE); + } else + return (KEY_SELECT_END|KEY_DICT_CHANGE); + } else { + if (buf->dispmodechange) { + buf->dispmode = (buf->convedsegnum == buf->segnum ? MODE_KANJI : + (buf->convedsegnum ? MODE_EDIT : buf->inputmode)); + return (KEY_SELECT_END|KEY_MODE_CHANGE); + } else + return (KEY_SELECT_END); + } + default: +#ifdef THROUGH_CONT + return (KEY_BELL); +#else /* THROUGH_CONT */ + if (buf->cntrlsame) + return (KEY_BELL); + else + return (KEY_TEXT_CHANGE|KEY_BELL); /* dummy */ +#endif /* THROUGH_CONT */ + } +} + +/* + * _Xsj3cModeHAlpha() [halpha] + * + * Change character mode + * to "hankaku-ascii". + * Ring bell. + * + * ModeConversion on: Convert character mode of current segment + * to "hankaku-ascii". + * ModeConversion off: Change character mode of input mode. + */ +Xsj3cEvent +_Xsj3cModeHAlpha(buf) + Xsj3cBuf buf; +{ + Xsj3cFlag conv; + + if (!buf->segnum) { + if (buf->modeconv[MODE_HALPHA] >> 2) { +#ifdef THROUGH_CONT + return (KEY_NULL); +#else /* THROUGH_CONT */ + if (buf->cntrlsame) + return (KEY_NULL); + else + return (KEY_TEXT_CHANGE); /* dummy */ +#endif /* THROUGH_CONT */ + } else + conv = OFF; + } else if (buf->input[buf->curseg] && + buf->input[buf->curseg]->status & buf->modeconv[MODE_HALPHA]) { + conv = ON; + } else { + conv = OFF; + } + return (_Xsj3cModeChange(buf, MODE_HALPHA, conv)); +} + +/* + * _Xsj3cModeZAlpha() [zalpha] + * + * Change character mode + * to "zenkaku-ascii". + * Ring bell. + * + * ModeConversion on: Convert character mode of current segment + * to "zenkaku-ascii". + * ModeConversion off: Change character mode of input mode. + */ +Xsj3cEvent +_Xsj3cModeZAlpha(buf) + Xsj3cBuf buf; +{ + Xsj3cFlag conv; + + if (!buf->segnum) { + if (buf->modeconv[MODE_ZALPHA] >> 2) { +#ifdef THROUGH_CONT + return (KEY_NULL); +#else /* THROUGH_CONT */ + if (buf->cntrlsame) + return (KEY_NULL); + else + return (KEY_TEXT_CHANGE); /* dummy */ +#endif /* THROUGH_CONT */ + } else + conv = OFF; + } else if (buf->input[buf->curseg] && + buf->input[buf->curseg]->status & buf->modeconv[MODE_ZALPHA]) { + conv = ON; + } else { + conv = OFF; + } + return (_Xsj3cModeChange(buf, MODE_ZALPHA, conv)); +} + +/* + * _Xsj3cModeHKata() [hkatakana] + * + * Change character mode + * to "hankaku-katakana". + * Ring bell. + * + * ModeConversion on: Convert character mode of current segment + * to "hankaku-katakana". + * ModeConversion off: Change character mode of input mode. + */ +Xsj3cEvent +_Xsj3cModeHKata(buf) + Xsj3cBuf buf; +{ + Xsj3cFlag conv; + + if (!buf->segnum) { + if (buf->modeconv[MODE_HKATA] >> 2) { +#ifdef THROUGH_CONT + return (KEY_NULL); +#else /* THROUGH_CONT */ + if (buf->cntrlsame) + return (KEY_NULL); + else + return (KEY_TEXT_CHANGE); /* dummy */ +#endif /* THROUGH_CONT */ + } else + conv = OFF; + } else if (buf->input[buf->curseg] && + buf->input[buf->curseg]->status & buf->modeconv[MODE_HKATA]) { + conv = ON; + } else { + conv = OFF; + } + return (_Xsj3cModeChange(buf, MODE_HKATA, conv)); +} + +/* + * _Xsj3cModeZKata() [zkatakana] + * + * Change character mode + * to "zenkaku-katakana". + * Ring bell. + * + * ModeConversion on: Convert character mode of current segment + * to "zenkaku-katakana". + * ModeConversion off: Change character mode of input mode. + */ +Xsj3cEvent +_Xsj3cModeZKata(buf) + Xsj3cBuf buf; +{ + Xsj3cFlag conv; + + if (!buf->segnum) { + if (buf->modeconv[MODE_ZKATA] >> 2) { +#ifdef THROUGH_CONT + return (KEY_NULL); +#else /* THROUGH_CONT */ + if (buf->cntrlsame) + return (KEY_NULL); + else + return (KEY_TEXT_CHANGE); /* dummy */ +#endif /* THROUGH_CONT */ + } else + conv = OFF; + } else if (buf->input[buf->curseg] && + buf->input[buf->curseg]->status & buf->modeconv[MODE_ZKATA]) { + conv = ON; + } else { + conv = OFF; + } + return (_Xsj3cModeChange(buf, MODE_ZKATA, conv)); +} + + +/* + * _Xsj3cModeHira() [hiragana] + * + * Change character mode + * to "hiragana". + * Ring bell. + * + * ModeConversion on: Convert character mode of current segment to "hiragana". + * ModeConversion off: Change character mode of input mode. + */ +Xsj3cEvent +_Xsj3cModeHira(buf) + Xsj3cBuf buf; +{ + Xsj3cFlag conv; + + if (!buf->segnum) { + if (buf->modeconv[MODE_HIRA] >> 2) { +#ifdef THROUGH_CONT + return (KEY_NULL); +#else /* THROUGH_CONT */ + if (buf->cntrlsame) + return (KEY_NULL); + else + return (KEY_TEXT_CHANGE); /* dummy */ +#endif /* THROUGH_CONT */ + } else + conv = OFF; + } else if (buf->input[buf->curseg] && + buf->input[buf->curseg]->status & buf->modeconv[MODE_HIRA]) { + conv = ON; + } else { + conv = OFF; + } + return (_Xsj3cModeChange(buf, MODE_HIRA, conv)); +} + +/* + * _Xsj3cToHAlpha() [tohalpha] + * + * Convert character mode + * to "hankaku-ascii". + * Ring bell. + */ +Xsj3cEvent +_Xsj3cToHAlpha(buf) + Xsj3cBuf buf; +{ + return (_Xsj3cModeChange(buf, MODE_HALPHA, ON)); +} + +/* + * _Xsj3cToZAlpha() [tozalpha] + * + * Convert character mode + * to "zenkaku-ascii". + * Ring bell. + */ +Xsj3cEvent +_Xsj3cToZAlpha(buf) + Xsj3cBuf buf; +{ + return (_Xsj3cModeChange(buf, MODE_ZALPHA, ON)); +} + +/* + * _Xsj3cToHKata() [tohkatakana] + * + * Convert character mode + * to "hankaku-katakana". + * Ring bell. + */ +Xsj3cEvent +_Xsj3cToHKata(buf) + Xsj3cBuf buf; +{ + return (_Xsj3cModeChange(buf, MODE_HKATA, ON)); +} + +/* + * _Xsj3cToZKata() [tozkatakana] + * + * Convert character mode + * to "zenkaku-katakana". + * Ring bell. + */ +Xsj3cEvent +_Xsj3cToZKata(buf) + Xsj3cBuf buf; +{ + return (_Xsj3cModeChange(buf, MODE_ZKATA, ON)); +} + + +/* + * _Xsj3cToHira() [tohiragana] + * + * Convert character mode + * to "hiragana". + * Ring bell. + */ +Xsj3cEvent +_Xsj3cToHira(buf) + Xsj3cBuf buf; +{ + return (_Xsj3cModeChange(buf, MODE_HIRA, ON)); +} + +/* + * _Xsj3cToZenkaku() [zenkaku] + * + * Convert current segment + * character mode to zenkaku. + * Ring bell. + */ +Xsj3cEvent +_Xsj3cZenkaku(buf) + Xsj3cBuf buf; +{ + return (_Xsj3cModeChange(buf, MODE_ZENKAKU, ON)); +} + +/* + * _Xsj3cToHankaku() [zenkaku] + * + * Convert current segment + * character mode to hankaku. + * Ring bell. + */ +Xsj3cEvent +_Xsj3cHankaku(buf) + Xsj3cBuf buf; +{ + return (_Xsj3cModeChange(buf, MODE_HANKAKU, ON)); +} + +/* + * _Xsj3cToUpper() [toupper] + * + * Convert current segment + * character mode to upper case. + * Ring bell. + */ +Xsj3cEvent +_Xsj3cToUpper(buf) + Xsj3cBuf buf; +{ + return (_Xsj3cModeChange(buf, MODE_UPPER, ON)); +} + +/* + * _Xsj3cToLower() [tolower] + * + * Convert current segment + * character mode to lower case. + * Ring bell. + */ +Xsj3cEvent +_Xsj3cToLower(buf) + Xsj3cBuf buf; +{ + return (_Xsj3cModeChange(buf, MODE_LOWER, ON)); +} + +/* + * _Xsj3cModeSJIS() [sjis] + * + * If now input + * code is not "Shift-JIS", change to Shift-JIS code input mode, + * else change to initialized input mode. + * Ring bell. + */ +Xsj3cEvent +_Xsj3cModeSJIS(buf) + Xsj3cBuf buf; +{ + if (buf->convmode & SelectModeMask) + return (KEY_BELL); + if (buf->inputmode != MODE_SJIS) { + buf->dispmode = buf->inputmode = MODE_SJIS; + return (_Xsj3cModeClear(buf)); + } else { + buf->dispmode = buf->inputmode = buf->inmoderot[0]; + return (_Xsj3cModeClear(buf)); + } +} + +/* + * _Xsj3cModeEUC() [euc] + * + * If now input code is not "EUC", + * change to EUC code input mode, else change to initialized input mode. + * Ring bell. + */ +Xsj3cEvent +_Xsj3cModeEUC(buf) + Xsj3cBuf buf; +{ + if (buf->convmode & SelectModeMask) + return (KEY_BELL); + if (buf->inputmode != MODE_EUC) { + buf->dispmode = buf->inputmode = MODE_EUC; + return (_Xsj3cModeClear(buf)); + } else { + buf->dispmode = buf->inputmode = buf->inmoderot[0]; + return (_Xsj3cModeClear(buf)); + } +} + +/* + * _Xsj3cModeJIS() [jis] + * + * If now input code is not "JIS", + * change to JIS code input mode, else change to initialized input mode. + * Ring bell. + */ +Xsj3cEvent +_Xsj3cModeJIS(buf) + Xsj3cBuf buf; +{ + if (buf->convmode & SelectModeMask) + return (KEY_BELL); + if (buf->inputmode != MODE_JIS) { + buf->dispmode = buf->inputmode = MODE_JIS; + return (_Xsj3cModeClear(buf)); + } else { + buf->dispmode = buf->inputmode = buf->inmoderot[0]; + return (_Xsj3cModeClear(buf)); + } +} + +/* + * _Xsj3cModeKuten() [kuten] + * + * If now input code is not "kuten", + * change to kuten code input mode, else change to initialized input mode. + * Ring bell. + */ +Xsj3cEvent +_Xsj3cModeKuten(buf) + Xsj3cBuf buf; +{ + if (buf->convmode & SelectModeMask) + return (KEY_BELL); + if (buf->inputmode != MODE_KUTEN) { + buf->dispmode = buf->inputmode = MODE_KUTEN; + return (_Xsj3cModeClear(buf)); + } else { + buf->dispmode = buf->inputmode = buf->inmoderot[0]; + return (_Xsj3cModeClear(buf)); + } +} + +/* + * _Xsj3cCodeRollDown() [code] + * + * Rotate down input code. + * Ring bell. + */ +Xsj3cEvent +_Xsj3cCodeRollDown(buf) + Xsj3cBuf buf; +{ + register int i; + + if (buf->convmode & ~SelectModeMask) { + i = 0; + while (i < buf->coderotnum) { + if (buf->inputmode == buf->defcode[i++]) { + buf->dispmode = buf->inputmode = buf->defcode[i]; + break; + } + } + if (i >= buf->coderotnum) { + buf->dispmode = buf->inputmode = buf->defcode[0]; + } + return (_Xsj3cModeClear(buf)); + } else { + return (KEY_BELL); + } +} + +/* + * _Xsj3cModeRollDown() [toggle/modedown] + * + * + * Rotate down character mode to next mode. + * Ring bell. + * + * ModeConversion on: Convert character mode of current segment to next. + * ModeConversion off: Rotate character mode of input mode. + */ +Xsj3cEvent +_Xsj3cModeRollDown(buf) + Xsj3cBuf buf; +{ + register int i; + Xsj3csMode premode, postmode; + Xsj3cFlag conv; + + if (!buf->segnum) { + if (buf->modeconv[MODE_ROLLDOWN] >> 2) { +#ifdef THROUGH_CONT + return (KEY_NULL); +#else /* THROUGH_CONT */ + if (buf->cntrlsame) + return (KEY_NULL); + else + return (KEY_TEXT_CHANGE); /* dummy */ +#endif /* THROUGH_CONT */ + } else + conv = OFF; + } else if (buf->input[buf->curseg] && + buf->input[buf->curseg]->status & buf->modeconv[MODE_ROLLDOWN]) { + conv = ON; + } else { + conv = OFF; + } + if (conv) { + return (_Xsj3cNextMode(buf)); + } else { + premode = buf->inputmode; + i = 0; + while (i < buf->inmoderotnum) { + if (premode == buf->inmoderot[i++]) { + postmode = buf->inmoderot[i]; + break; + } + } + if (i >= buf->inmoderotnum) + postmode = buf->inmoderot[0]; + return(_Xsj3cModeChange(buf, postmode, OFF)); + } +} + +/* + * _Xsj3cModeRollUp() [toggleback/modeup] + * + * + * Rotate up character mode to previous mode. + * Ring bell. + * + * ModeConversion on: Convert character mode of current segment to next. + * ModeConversion off: Rotate character mode of input mode. + */ +Xsj3cEvent +_Xsj3cModeRollUp(buf) + Xsj3cBuf buf; +{ + register int i; + Xsj3csMode premode, postmode; + Xsj3cFlag conv; + + if (!buf->segnum) { + if (buf->modeconv[MODE_ROLLDOWN] >> 2) { +#ifdef THROUGH_CONT + return (KEY_NULL); +#else /* THROUGH_CONT */ + if (buf->cntrlsame) + return (KEY_NULL); + else + return (KEY_TEXT_CHANGE); /* dummy */ +#endif /* THROUGH_CONT */ + } else + conv = OFF; + } else if (buf->input[buf->curseg] && + buf->input[buf->curseg]->status & buf->modeconv[MODE_ROLLDOWN]) { + conv = ON; + } else { + conv = OFF; + } + if (conv) { + return (_Xsj3cPrevMode(buf)); + } else { + premode = buf->inputmode; + i = buf->inmoderotnum - 1; + while (i < buf->inmoderotnum) { + if (premode == buf->inmoderot[i--]) { + postmode = buf->inmoderot[i]; + break; + } + } + if (i < 0) + postmode = buf->inmoderot[buf->inmoderotnum - 1]; + return(_Xsj3cModeChange(buf, postmode, OFF)); + } +} + +/* + * _Xsj3cNextMode() [nextmode] + * + * + * Change current segment character mode to next mode. + * Ring bell. + */ +Xsj3cEvent +_Xsj3cNextMode(buf) + Xsj3cBuf buf; +{ + register int i; + Xsj3csMode premode, postmode, aftermode = MODE_HIRA; + Xsj3cEvent ret; + + if (buf->convmode & NoInputModeMask) { +#ifdef THROUGH_CONT + return (KEY_NULL); +#else /* THROUGH_CONT */ + if (buf->cntrlsame) + return (KEY_NULL); + else + return (KEY_TEXT_CHANGE); /* dummy */ +#endif /* THROUGH_CONT */ + } + premode = buf->input[buf->curseg]->cursegmode; + i = 0; + while (i < buf->outmoderotnum) { + if (premode == buf->outmoderot[i++]) { + postmode = buf->outmoderot[i]; + break; + } + } + if (i >= buf->outmoderotnum) { + aftermode = premode; + premode = _Xsj3cCheckMode(buf, buf->input[buf->curseg]); + i = 0; + while (i < buf->outmoderotnum) { + if (premode == buf->outmoderot[i++]) { + postmode = buf->outmoderot[i]; + break; + } + } + if (i >= buf->outmoderotnum) + postmode = buf->outmoderot[0]; + } + ret = _Xsj3cModeChange(buf, postmode, ON); + if ((aftermode == MODE_UPPER || aftermode == MODE_LOWER) + && (postmode == MODE_ZALPHA || postmode == MODE_HALPHA)) { + ret |= _Xsj3cModeChange(buf, aftermode, ON); + } + return (ret); +} + +/* + * _Xsj3cPrevMode() [prevmode] + * + * + * Change current segment character mode to previous mode. + * Ring bell. + */ +Xsj3cEvent +_Xsj3cPrevMode(buf) + Xsj3cBuf buf; +{ + register int i; + Xsj3csMode premode, postmode, aftermode = MODE_HIRA; + Xsj3cEvent ret; + + if (buf->convmode & NoInputModeMask) { +#ifdef THROUGH_CONT + return (KEY_NULL); +#else /* THROUGH_CONT */ + if (buf->cntrlsame) + return (KEY_NULL); + else + return (KEY_TEXT_CHANGE); /* dummy */ +#endif /* THROUGH_CONT */ + } + premode = buf->input[buf->curseg]->cursegmode; + i = buf->outmoderotnum - 1; + while (i >= 0) { + if (premode == buf->outmoderot[i--]) { + postmode = buf->outmoderot[i]; + break; + } + } + if (i < 0) { + aftermode = premode; + premode = _Xsj3cCheckMode(buf, buf->input[buf->curseg]); + i = buf->outmoderotnum - 1; + while (i >= 0) { + if (premode == buf->outmoderot[i--]) { + postmode = buf->outmoderot[i]; + break; + } + } + if (i < 0) + postmode = buf->outmoderot[buf->outmoderotnum - 1]; + } + ret = _Xsj3cModeChange(buf, postmode, ON); + if ((aftermode == MODE_UPPER || aftermode == MODE_LOWER) + && (postmode == MODE_ZALPHA || postmode == MODE_HALPHA)) { + ret |= _Xsj3cModeChange(buf, aftermode, ON); + } + return(ret); +} + +/* + * _Xsj3cModeToggle() [muhenkan] + * + * Emulating of sj2/sj3/sjx's muhenkan stroke. + * Change input character mode to "MuhenkanMode". + * Converts current segment character input mode first to + * hiragana, second to zenkaku-katakana , third to "MuhenkanInEdit". + * Does nothing. + * + * MuhenkanMode mode: Mode of toggling in InputMode after input chacter mode + * is changed to hiragana. + * MuhenkanInEdit mode: Mode of toggling in ConvedMode after segment is + * converted to hiragana and zenkaku-katakana. + * MuhenkanToggle off: Stop toggling in InputMode. + */ +Xsj3cEvent +_Xsj3cModeToggle(buf) + Xsj3cBuf buf; +{ + register int i; + register wchar (*conv)(); + unsigned char *mbs; + Xsj3cEvent ret; + Xsj3cSeg seg = buf->input[buf->curseg]; + + if (buf->convmode & ~(SelectModeMask|DictModeMask)) { + if (buf->convmode & ConvedModeMask ||((buf->convmode & InputModeMask) + && (seg->edit & SEG_NOEDIT))) { + if ((mbs = (unsigned char *)malloc(seg->size * 2 * sizeof(wchar))) + == NULL) + Xsj3cError("Cannot allocate for mode conversion buffer"); + + switch (seg->cursegmode) { + case MODE_HIRA: + if (seg->num != seg->dnum) { + ret = _Xsj3cModeChange(buf, MODE_HIRA, ON); + } else { + if (conv = + CodeConvFunc[serverIF[buf->server].lang][out_lang]) { + register wchar w1, w2; + for (i = 0;i < seg->dnum; i++) { + w1 = seg->yomi[i]; + if (iskan1(w1 >> 8, serverIF[buf->server].lang) && + iskan2(w1 & 0xff, serverIF[buf->server].lang)) + w2 = conv(w1); + else + w2 = w1; + if (w2 != seg->disp[i]) + break; + } + } else { + for (i = 0;i < seg->dnum;i++) { + if (seg->disp[i] != seg->yomi[i]) + break; + } + } + if (i < seg->dnum) + ret = _Xsj3cModeChange(buf, MODE_HIRA, ON); + else { + ret = _Xsj3cModeChange(buf, MODE_ZKATA, ON); + } + } + break; + case MODE_ZKATA: + ret = _Xsj3cModeChange(buf, buf->togglemode, ON); + break; + default: + ret = _Xsj3cModeChange(buf, MODE_HIRA, ON); + break; + } + free(mbs); + return(ret); + } else { + if (buf->inputmode == MODE_HIRA) + return (_Xsj3cModeChange(buf, buf->muhenmode, OFF)); + else if (buf->dotoggle) + return (_Xsj3cModeChange(buf, MODE_HIRA, OFF)); + else { +#ifdef THROUGH_CONT + return (KEY_NULL); +#else /* THROUGH_CONT */ + if (buf->cntrlsame) + return (KEY_NULL); + else + return (KEY_TEXT_CHANGE); /* dummy */ +#endif /* THROUGH_CONT */ + } + } + } else { + return (KEY_BELL); + } +} + +/* + * _Xsj3cForward() [right/forward] + * + * Move to next segment or next character position. + * Move reversed segment to next segment if not expanded. + * Move to right candidate(symbol/hinsi) + * in the candidate(symbol/hinsi) panel. + * Does nothing. + * + * MovebySegment on: Move by segment. + * MovebySegment off: Move by character. + * BeginConversionLast none: Allow to move out of segments. + * MoveSegmentLoop on: Loop back to the first segment. + */ +Xsj3cEvent +_Xsj3cForward(buf) + Xsj3cBuf buf; +{ + Xsj3cEvent ret = KEY_TEXT_CHANGE; + + switch (buf->convmode) { + case ConvedModeMask: + buf->n_select = 0; + if (buf->candidate) + Xsj3cEndCandidate(buf, ON); + case InputModeMask: + buf->input[buf->curseg]->n_roma = 0; + buf->input[buf->curseg]->n_kana = -1; + *buf->input[buf->curseg]->oldstr = '\0'; + *buf->input[buf->curseg]->str = '\0'; + buf->input[buf->curseg]->sp = buf->input[buf->curseg]->str; + if (buf->input[buf->curseg]->status & buf->movebyseg + && (buf->input[buf->curseg]->edit & SEG_NOEDIT)) { + if (buf->beginlastseg == NONE) { + if (buf->curseg < buf->segnum) + buf->curseg++; + else if (buf->moveloop) + buf->curseg = 0; + } else { + if (buf->curseg < buf->segnum - 1) + buf->curseg++; + else if (buf->moveloop) + buf->curseg = 0; + } + } else { + if (buf->curseg < buf->segnum + && buf->input[buf->curseg]->status == SEG_CONVED) + ret |= _Xsj3cUnConvSeg(buf, ONE, OFF); + _Xsj3cStoreYomi(buf, buf->input[buf->curseg], 0); + if (buf->input[buf->curseg]->cur < buf->input[buf->curseg]->num) { + buf->input[buf->curseg]->cur++; + } else { + if (buf->beginlastseg == NONE) { + if (buf->curseg < buf->segnum) { + buf->curseg++; + if (buf->curseg < buf->segnum) + buf->input[buf->curseg]->cur = 0; + } else if (buf->moveloop) { + buf->curseg = 0; + buf->input[buf->curseg]->cur = 0; + } + } else { + if (buf->curseg < buf->segnum - 1) { + buf->curseg++; + buf->input[buf->curseg]->cur = 0; + } else if (buf->moveloop) { + buf->curseg = 0; + buf->input[buf->curseg]->cur = 0; + } + } + } + } + return ret; + case DictModeMask: + if (buf->dict->n_dict) { + return (KEY_BELL); + } else { + if (buf->curseg < buf->segnum - 1 ) + buf->curseg++; + else + buf->curseg = buf->segnum - 1; + return (ret); + } + case SelectModeMask: + return (KEY_SELECT_RIGHT); + case NoInputModeMask: + default: +#ifdef THROUGH_CONT + return (KEY_NULL); +#else /* THROUGH_CONT */ + if (buf->cntrlsame) + return (KEY_NULL); + else + return (KEY_TEXT_CHANGE); /* dummy */ +#endif /* THROUGH_CONT */ + } +} + +/* + * _Xsj3cBackward() [left/backward] + * + * Move to previous segment or + * previous character position. + * Move reversed segment to previous segment if not expanded. + * Move to left candidate(symbol/hinsi) + * in the candidate(symbol/hinsi) panel. + * Does nothing. + * + * MovebySegment on: Move by segment. + * MovebySegment off: Move by character. + * MoveSegmentLoop on: Loop back to the last segment. + */ +Xsj3cEvent +_Xsj3cBackward(buf) + Xsj3cBuf buf; +{ + Xsj3cEvent ret = KEY_TEXT_CHANGE; + + switch (buf->convmode) { + case ConvedModeMask: + buf->n_select = 0; + if (buf->candidate) + Xsj3cEndCandidate(buf, ON); + case InputModeMask: + if (buf->curseg < buf->segnum) { + buf->input[buf->curseg]->n_roma = 0; + buf->input[buf->curseg]->n_kana = -1; + *buf->input[buf->curseg]->oldstr = '\0'; + *buf->input[buf->curseg]->str = '\0'; + buf->input[buf->curseg]->sp = buf->input[buf->curseg]->str; + if (buf->input[buf->curseg]->status & buf->movebyseg + && (buf->input[buf->curseg]->edit & SEG_NOEDIT)) { + if (buf->curseg > 0) + buf->curseg--; + else if (buf->moveloop) { + if (buf->beginlastseg == NONE) + buf->curseg = buf->segnum; + else + buf->curseg = buf->segnum - 1; + } + } else { + if (buf->curseg < buf->segnum + && buf->input[buf->curseg]->status == SEG_CONVED) + ret |= _Xsj3cUnConvSeg(buf, ONE, ON); + _Xsj3cStoreYomi(buf, buf->input[buf->curseg], 0); + if (buf->input[buf->curseg]->cur > 0) { + buf->input[buf->curseg]->cur--; + } else { + if (buf->curseg > 0) { + buf->curseg--; + buf->input[buf->curseg]->cur + = buf->input[buf->curseg]->num; + } else if (buf->moveloop) { + if (buf->beginlastseg == NONE) + buf->curseg = buf->segnum; + else { + buf->curseg = buf->segnum - 1; + buf->input[buf->curseg]->cur + = buf->input[buf->curseg]->num; + } + } + } + } + return (ret); + } else if (buf->curseg > 0) { + buf->curseg--; + return (ret); + } else { + return (KEY_NULL); + } + case DictModeMask: + if (buf->dict->n_dict) { + return (KEY_BELL); + } else { + if (buf->curseg > 0) + buf->curseg--; + else + buf->curseg = 0; + return (ret); + } + case SelectModeMask: + return (KEY_SELECT_LEFT); + case NoInputModeMask: + default: +#ifdef THROUGH_CONT + return (KEY_NULL); +#else /* THROUGH_CONT */ + if (buf->cntrlsame) + return (KEY_NULL); + else + return (KEY_TEXT_CHANGE); /* dummy */ +#endif /* THROUGH_CONT */ + } +} + +/* + * _Xsj3cTop() [top] + * + * Move to the first segment or top of current segment. + * Move reversed segment to the first segment if not expanded. + * Move to first candidate(symbol/hinsi) + * in popuped candidate(symbol/hinsi) panel. + * Does nothing. + * + * JumpbySegment on: Move by segment. + * JumpbySegment off: Move by character. + */ +Xsj3cEvent +_Xsj3cTop(buf) + Xsj3cBuf buf; +{ + switch (buf->convmode) { + case ConvedModeMask: + buf->n_select = 0; + if (buf->candidate) + Xsj3cEndCandidate(buf, ON); + case InputModeMask: + if (buf->curseg < buf->segnum) { + buf->input[buf->curseg]->n_roma = 0; + buf->input[buf->curseg]->n_kana = -1; + *buf->input[buf->curseg]->oldstr = '\0'; + *buf->input[buf->curseg]->str = '\0'; + buf->input[buf->curseg]->sp = buf->input[buf->curseg]->str; + if (buf->input[buf->curseg]->status & buf->jumpbyseg + && (buf->input[buf->curseg]->edit & SEG_NOEDIT)) { + buf->curseg = 0; + } else if (buf->curseg < buf->segnum) { + buf->input[buf->curseg]->cur = 0; + } + return KEY_TEXT_CHANGE; + } else if (buf->segnum > 0) { + buf->curseg = 0; + return KEY_TEXT_CHANGE; + } else { + return KEY_NULL; + } + case DictModeMask: + if (buf->dict->n_dict) { + return (KEY_BELL); + } else { + buf->curseg = 0; + return (KEY_TEXT_CHANGE); + } + case SelectModeMask: + return (KEY_SELECT_LEFTMOST); + case NoInputModeMask: + default: +#ifdef THROUGH_CONT + return (KEY_NULL); +#else /* THROUGH_CONT */ + if (buf->cntrlsame) + return (KEY_NULL); + else + return (KEY_TEXT_CHANGE); /* dummy */ +#endif /* THROUGH_CONT */ + } +} + +/* + * _Xsj3cEnd() [end] + * + * Move to the last segment or top of current segment. + * Move reversed segment to the last segment if not expanded. + * Move to last candidate(symbol/hinsi) + * in popuped candidate(symbol/hinsi) panel. + * Does nothing. + * + * JumpbySegment on: Move by segment. + * JumpbySegment off: Move by character. + * BeginConversionLast none: Allow to move out of segments. + */ +Xsj3cEvent +_Xsj3cEnd(buf) + Xsj3cBuf buf; +{ + switch (buf->convmode) { + case ConvedModeMask: + buf->n_select = 0; + if (buf->candidate) + Xsj3cEndCandidate(buf, ON); + case InputModeMask: + if (buf->curseg >= buf->segnum) + return KEY_NULL; + buf->input[buf->curseg]->n_roma = 0; + buf->input[buf->curseg]->n_kana = -1; + *buf->input[buf->curseg]->oldstr = '\0'; + *buf->input[buf->curseg]->str = '\0'; + buf->input[buf->curseg]->sp = buf->input[buf->curseg]->str; + if (buf->input[buf->curseg]->status & buf->jumpbyseg + && (buf->input[buf->curseg]->edit & SEG_NOEDIT)) { + if (buf->beginlastseg == NONE) + buf->curseg = buf->segnum; + else + buf->curseg = buf->segnum - 1; + } else { + buf->input[buf->curseg]->cur = buf->input[buf->curseg]->num; + } + return KEY_TEXT_CHANGE; + case DictModeMask: + if (buf->dict->n_dict) { + return (KEY_BELL); + } else { + buf->curseg = buf->segnum - 1; + return (KEY_TEXT_CHANGE); + } + case SelectModeMask: + return (KEY_SELECT_RIGHTMOST); + case NoInputModeMask: + default: +#ifdef THROUGH_CONT + return (KEY_NULL); +#else /* THROUGH_CONT */ + if (buf->cntrlsame) + return (KEY_NULL); + else + return (KEY_TEXT_CHANGE); /* dummy */ +#endif /* THROUGH_CONT */ + } +} + +/* + * _Xsj3cUp() [up] + * + * Move to above candidate(symbol/hinsi) + * in the candidate(symbol/hinsi) panel. + * Rings bell. + */ +Xsj3cEvent +_Xsj3cUp(buf) + Xsj3cBuf buf; +{ + if (buf->convmode & SelectModeMask) + return (KEY_SELECT_UP); + else +#ifdef THROUGH_CONT + return (KEY_BELL); +#else /* THROUGH_CONT */ + if (buf->cntrlsame) + return (KEY_BELL); + else + return (KEY_TEXT_CHANGE|KEY_BELL); /* dummy */ +#endif /* THROUGH_CONT */ +} + +/* + * _Xsj3cDown() [down] + * + * Move to below candidate(symbol/hinsi) + * in the candidate(symbol/hinsi) panel. + * Rings bell. + */ +Xsj3cEvent +_Xsj3cDown(buf) + Xsj3cBuf buf; +{ + if (buf->convmode & SelectModeMask) + return (KEY_SELECT_DOWN); + else +#ifdef THROUGH_CONT + return (KEY_BELL); +#else /* THROUGH_CONT */ + if (buf->cntrlsame) + return (KEY_BELL); + else + return (KEY_TEXT_CHANGE|KEY_BELL); /* dummy */ +#endif /* THROUGH_CONT */ +} + +/* + * _Xsj3cFirst() [first] + * + * Set top candidate the current segment. + * Move to first candidate(symbol/hinsi) + * in all candidate(symbol/hinsi) pages. + * Rings bell. + */ +Xsj3cEvent +_Xsj3cFirst(buf) + Xsj3cBuf buf; +{ + int changed, flush; + + if (buf->convmode & ConvedModeMask) { + if (!buf->candidate) + if ((buf->candidate = _Xsj3cCandidateInit(buf)) == NULL) + return (KEY_NULL); + Xsj3cSetCandidate(buf, 0, &changed, &flush); + return KEY_TEXT_CHANGE; + } else if (buf->convmode & SelectModeMask) { + return (KEY_SELECT_FIRST); + } else { +#ifdef THROUGH_CONT + return (KEY_BELL); +#else /* THROUGH_CONT */ + if (buf->cntrlsame) + return (KEY_BELL); + else + return (KEY_TEXT_CHANGE|KEY_BELL); /* dummy */ +#endif /* THROUGH_CONT */ + } +} + +/* + * _Xsj3cLast() [last] + * + * Set bottom candidate the current segment. + * Move to last candidate(symbol/hinsi) + * in all candidate(symbol/hinsi) pages. + * Rings bell. + */ +Xsj3cEvent +_Xsj3cLast(buf) + Xsj3cBuf buf; +{ + int changed, flush; + + if (buf->convmode & ConvedModeMask) { + if (!buf->candidate) + if ((buf->candidate = _Xsj3cCandidateInit(buf)) == NULL) + return (KEY_NULL); + Xsj3cSetCandidate(buf, buf->candnum - 1, &changed, &flush); + return (KEY_TEXT_CHANGE); + } else if (buf->convmode & SelectModeMask) { + return (KEY_SELECT_LAST); + } else { +#ifdef THROUGH_CONT + return (KEY_BELL); +#else /* THROUGH_CONT */ + if (buf->cntrlsame) + return (KEY_BELL); + else + return (KEY_TEXT_CHANGE|KEY_BELL); /* dummy */ +#endif /* THROUGH_CONT */ + } +} + +/* + * _Xsj3cNextPage() [nextp] + * Change contents of the candidate(symbol/hinsi) panel + * to the next page. + * Rings bell. + */ +Xsj3cEvent +_Xsj3cNextPage(buf) + Xsj3cBuf buf; +{ + if (buf->convmode & SelectModeMask) + return (KEY_SELECT_NEXTP); + else +#ifdef THROUGH_CONT + return (KEY_BELL); +#else /* THROUGH_CONT */ + if (buf->cntrlsame) + return (KEY_BELL); + else + return (KEY_TEXT_CHANGE|KEY_BELL); /* dummy */ +#endif /* THROUGH_CONT */ +} + +/* + * _Xsj3cPrevPage() [prevp] + * Change contents of the candidate(symbol/hinsi) panel + * to the previous page. + * Rings bell. + */ +Xsj3cEvent +_Xsj3cPrevPage(buf) + Xsj3cBuf buf; +{ + if (buf->convmode & SelectModeMask) + return (KEY_SELECT_PREVP); + else +#ifdef THROUGH_CONT + return (KEY_BELL); +#else /* THROUGH_CONT */ + if (buf->cntrlsame) + return (KEY_BELL); + else + return (KEY_TEXT_CHANGE|KEY_BELL); /* dummy */ +#endif /* THROUGH_CONT */ +} + +/* + * _Xsj3cNext() [next] + * + * Set next candidate the current segment. + * Move to right(next) candidate(symbol/hinsi) + * in the candidate(symbol/hinsi) panel. + * Rings bell. + */ +Xsj3cEvent +_Xsj3cNext(buf) + Xsj3cBuf buf; +{ + int changed, flush; + + if (buf->convmode & ConvedModeMask) { + if (!buf->candidate) + if ((buf->candidate = _Xsj3cCandidateInit(buf)) == NULL) + return (KEY_NULL); + if (buf->curcand == buf->candnum - 1) + Xsj3cSetCandidate(buf, 0, &changed, &flush); + else + Xsj3cSetCandidate(buf, buf->curcand + 1, &changed, &flush); + return KEY_TEXT_CHANGE; + } else if (buf->convmode & SelectModeMask) { + return (KEY_SELECT_RIGHT); + } else { +#ifdef THROUGH_CONT + return (KEY_BELL); +#else /* THROUGH_CONT */ + if (buf->cntrlsame) + return (KEY_BELL); + else + return (KEY_TEXT_CHANGE|KEY_BELL); /* dummy */ +#endif /* THROUGH_CONT */ + } +} + +/* + * _Xsj3cPrev() [prev] + * + * Set previous candidate the current segment. + * Move to left(previous) candidate(symbol/hinsi) + * in the candidate(symbol/hinsi) panel. + * Rings bell. + */ +Xsj3cEvent +_Xsj3cPrev(buf) + Xsj3cBuf buf; +{ + int changed, flush; + + if (buf->convmode & ConvedModeMask) { + if (!buf->candidate) + if ((buf->candidate = _Xsj3cCandidateInit(buf)) == NULL) + return (KEY_NULL); + if (!buf->curcand) + Xsj3cSetCandidate(buf, buf->candnum - 1, &changed, &flush); + else + Xsj3cSetCandidate(buf, buf->curcand - 1, &changed, &flush); + return KEY_TEXT_CHANGE; + } else if (buf->convmode & SelectModeMask) { + return (KEY_SELECT_LEFT); + } else { +#ifdef THROUGH_CONT + return (KEY_BELL); +#else /* THROUGH_CONT */ + if (buf->cntrlsame) + return (KEY_BELL); + else + return (KEY_TEXT_CHANGE|KEY_BELL); /* dummy */ +#endif /* THROUGH_CONT */ + } +} + +/* + * _Xsj3cSelect() [select] + * + * Select reversed candidate(symbol/hinsi) + * in the candidate(symbol/hinsi) panel and pop down the panel. + * Rings bell. + * Select now selected candidate(symbol) in the candidate(symbol) panel. + */ +Xsj3cEvent +_Xsj3cSelect(buf) + Xsj3cBuf buf; +{ + if (buf->convmode & SelectModeMask) { + if (buf->selectstatus == SELECT_HINSI) { + buf->dict->status = DICT_CONFIRM; + if (buf->dispmodechange) { + buf->dispmode = + (buf->dict->mode == REG_STATE ? MODE_TOROKU : MODE_SYOUKYO); + return (KEY_SELECT_END|KEY_DICT_CHANGE|KEY_MODE_CHANGE); + } else + return (KEY_SELECT_END|KEY_DICT_CHANGE); + } else { + if (buf->dispmodechange) { + buf->dispmode = (buf->convedsegnum == buf->segnum ? MODE_KANJI : + (buf->convedsegnum ? MODE_EDIT : buf->inputmode)); + return (KEY_SELECT_END|KEY_MODE_CHANGE); + } else + return (KEY_SELECT_END); + } + } else if (buf->convmode & DictModeMask) { + if (buf->dict->status == DICT_CONFIRM) { + buf->dict->status = DICT_END; + _Xsj3cFlushDictMsg(buf); + if (buf->dict->mode == REG_STATE) + return(KEY_DICT_REGISTER); + else + return(KEY_DICT_CLEAR); + } else { + return (KEY_BELL); + } + } else { +#ifdef THROUGH_CONT + return (KEY_BELL); +#else /* THROUGH_CONT */ + if (buf->cntrlsame) + return (KEY_BELL); + else + return (KEY_TEXT_CHANGE|KEY_BELL); /* dummy */ +#endif /* THROUGH_CONT */ + } +} + +/* + * _Xsj3cCancel() [cancel] + * + * Clear all segments. + * Pop down candidate(symbol/hinsi) panel. + * (DICT_INPUT) Pop down Auxpanel. + * (DICT_CONFIRM/DICT_END) Return back to DICT_INPUT status. + * Does nothing. + * + * DisplayModeChange on: Change the display mode string. + */ +Xsj3cEvent +_Xsj3cCancel(buf) + Xsj3cBuf buf; +{ + int i; + + switch (buf->convmode) { + case ConvedModeMask: + buf->n_select = 0; + if (buf->candidate) + Xsj3cEndCandidate(buf, OFF); + case InputModeMask: + if (buf->gakusyuu) + _Xsj3cClearDcid(buf); + buf->convedsegnum = 0; + for (i = 1; i < buf->segnum + 1; i++) { + Xsj3cFreeSegment(buf->input[i]); + buf->input[i] = NULL; + } + if (buf->input[0]) + Xsj3cClearSegment(buf, buf->input[0]); + buf->convedsegnum = 0; + buf->segnum = 0; + buf->curseg = 0; + if (buf->dispmodechange) { + buf->dispmode = buf->inputmode; + return (KEY_TEXT_CHANGE|KEY_MODE_CHANGE); + } else + return (KEY_TEXT_CHANGE); + case SelectModeMask: + if (buf->selectstatus == SELECT_HINSI) { + buf->dict->status = DICT_INPUT; + _Xsj3cFlushDictMsg(buf); + if (buf->dispmodechange) { + buf->dispmode = (buf->dict->mode == REG_STATE ? + MODE_TOROKU : MODE_SYOUKYO); + return (KEY_SELECT_ABORT|KEY_MODE_CHANGE); + } else + return (KEY_SELECT_ABORT); + } else { + if (buf->dispmodechange) { + buf->dispmode = (buf->convedsegnum == buf->segnum ? MODE_KANJI : + (buf->convedsegnum ? MODE_EDIT : buf->inputmode)); + return (KEY_SELECT_ABORT|KEY_MODE_CHANGE); + } else + return (KEY_SELECT_ABORT); + } + case DictModeMask: + if (buf->dict->status == DICT_CONFIRM + || buf->dict->status == DICT_END) { + buf->dict->status = DICT_INPUT; + _Xsj3cFlushDictMsg(buf); + return(KEY_DICT_CHANGE); + } else { + if (buf->dispmodechange) { + buf->dispmode = (buf->convedsegnum == buf->segnum ? MODE_KANJI: + (buf->convedsegnum ? MODE_EDIT : buf->inputmode)); + return (KEY_DICT_END|KEY_TEXT_CHANGE|KEY_MODE_CHANGE); + } else { + return (KEY_DICT_END|KEY_TEXT_CHANGE); + } + } + case NoInputModeMask: +#ifdef THROUGH_CONT + return (KEY_NULL); +#else /* THROUGH_CONT */ + if (buf->cntrlsame) + return (KEY_NULL); + else + return (KEY_TEXT_CHANGE); /* dummy */ +#endif /* THROUGH_CONT */ + default: + return (KEY_TEXT_CHANGE); + } +} + +/* + * _Xsj3cExpand() [kakucyou/expand] + * + * Expand the current segment by getting in + * the first character of the next segment. + * Increase the reversed segments by adding the next segment. + * Rings bell. + * + * ExpandModeConversion on: Change the expanded segment's character mode. + * ExpandKanjiConversion on: Do kana-kanji conversion for current + * and next segment. + */ +Xsj3cEvent +_Xsj3cExpand(buf) + Xsj3cBuf buf; +{ + int nextseg = buf->curseg + 1, value = 0; + Xsj3cFlag conv = 0, modematch = 0; + register int i; + unsigned char tmp[YBUFSIZ]; + unsigned char *kanabuf; + unsigned char knjbuf[KANJIBUFSIZ]; + SJ3_BUNSETU bun[BUNBUFSIZ]; + + if (buf->convmode & DictModeMask) { + return (_Xsj3cExpandNoConv(buf)); + } else if ((buf->convmode & SelectModeMask) || nextseg >= buf->segnum + || !buf->input[nextseg]->num) { + /* $B8=J8@a$,:G8e$NJ8@a$N;~$O3HD%$G$-$J$$!#(B */ +#ifdef THROUGH_CONT + return (KEY_BELL); +#else /* THROUGH_CONT */ + if (buf->cntrlsame) + return (KEY_BELL); + else + return (KEY_TEXT_CHANGE|KEY_BELL); /* dummy */ +#endif /* THROUGH_CONT */ + } else if (buf->convmode & ConvedModeMask) { + buf->n_select = 0; + if (buf->candidate) + Xsj3cEndCandidate(buf, OFF); + } else if (buf->convmode & ~InputModeMask) { +#ifdef THROUGH_CONT + return (KEY_BELL); +#else /* THROUGH_CONT */ + if (buf->cntrlsame) + return (KEY_BELL); + else + return (KEY_TEXT_CHANGE|KEY_BELL); /* dummy */ +#endif /* THROUGH_CONT */ + } + + /* temporary $B$N%P%C%U%!$r:n@.$9$k(B */ + if ((kanabuf = (unsigned char *) + malloc(buf->input[buf->curseg]->size * sizeof(wchar))) == NULL) + Xsj3cError("Cannot allocate for temporary buffer"); + + /* $Binput[nextseg]->cur = 1; + _Xsj3cExtractChar(buf, buf->input[nextseg], tmp, 1); + if (buf->input[nextseg]->status & SEG_CONVED) + buf->convedsegnum--; + + if (buf->input[nextseg]->cursegmode == buf->input[buf->curseg]->cursegmode) + modematch++; + if (!buf->input[nextseg]->num) { + + /* $Bl9g!"J8@a?t$r#1$D8:$8(B */ + /* $B99$K!"input[buf->segnum]); + buf->input[buf->segnum] = NULL; + buf->segnum--; + Xsj3cFreeSegment(buf->input[nextseg]); + buf->input[nextseg] = NULL; + if (nextseg < buf->segnum) { + for ( i = nextseg; i < buf->segnum; i++) { + buf->input[i] = buf->input[i + 1]; + } + } + buf->input[buf->segnum] = NULL; + } else { + + /* $Be$"$C$?>l9g(B ExpandKanjiConversion */ + /* on $B$N;~$O:FEY$+$J4A;zJQ49JQ49$9$k(B */ + if (buf->expandkconv & buf->input[nextseg]->status) { + if (buf->input[nextseg]->num < INPUT_YOMI_MAX) { + _Xsj3cwPStomPS(buf, kanabuf, buf->input[nextseg]->yomi); + value = serverIF[buf->server].func[FUNC_CONV] + (kanabuf, bun, knjbuf, KANJIBUFSIZ); + } else { + Xsj3cWarning("Too long segment[num = %d]",nextseg); + } + if (value > 0) { + _Xsj3cStoreKanji(buf, bun, nextseg, value, ON); + buf->segnum += (value - 1); + buf->convedsegnum += value; + } else { + if (value < 0) + Xsj3cWarning("sj3serv is down. reconnect please"); + _Xsj3cStoreYomi(buf, buf->input[nextseg], 0); + buf->input[nextseg]->status = SEG_NOCONV; + if (!(buf->movebyseg & SEG_NOCONV)) + buf->input[nextseg]->edit = SEG_EDIT; + } + } else { + _Xsj3cStoreYomi(buf, buf->input[nextseg], 0); + buf->input[nextseg]->status = SEG_NOCONV; + if (!(buf->movebyseg & SEG_NOCONV)) + buf->input[nextseg]->edit = SEG_EDIT; + } + if (buf->gakusyuu) + buf->input[nextseg]->change = ON; + } + + /* $B%+%l%s%HJ8@a$N:G8e$Kinput[buf->curseg]->cur = buf->input[buf->curseg]->num; + _Xsj3cInsertChar(buf, buf->input[buf->curseg], tmp, 1); + + if (buf->input[buf->curseg]->status & SEG_CONVED) + buf->convedsegnum--; + + /* ExpandModeConversion on $B$N;~$O9g$o$;$?ItJ,$N(B */ + /* $BJ8;zexpandmconv & buf->input[buf->curseg]->status) && !modematch) { + Xsj3cSeg seg = buf->input[buf->curseg]; + + conv++; + _Xsj3cwPStomPS(buf, kanabuf, seg->yomi); + Xsj3cModeConv(buf, kanabuf, seg->cursegmode, seg->size); + seg->num = _Xsj3cmPStowPSn(buf, seg->yomi, kanabuf, seg->size); + if (seg->num > seg->size - YBUFSIZ) { + Xsj3cResizeSegment(seg, seg->size * 2); + seg->num = _Xsj3cmPStowPS(buf, seg->yomi, kanabuf); + } + seg->cur = seg->num; + } + + /* ExpandKanjiConversion on $B$N;~$O%+%l%s%H(B */ + /* $BJ8@a$r:FEY$+$J4A;zJQ49JQ49$9$k(B */ + if (buf->expandkconv & buf->input[buf->curseg]->status) { + value = 0; + if (!conv) + _Xsj3cwPStomPS(buf, kanabuf, buf->input[buf->curseg]->yomi); + if (buf->input[buf->curseg]->num < INPUT_YOMI_MAX) { + value = serverIF[buf->server].func[FUNC_CONV] + (kanabuf, bun, knjbuf, KANJIBUFSIZ); + } else { + Xsj3cWarning("Too long segment[num = %d]",buf->curseg); + } + if (value > 0) { + buf->convedsegnum++; + buf->input[buf->curseg]->status = SEG_CONVED; + buf->input[buf->curseg]->edit = SEG_NOEDIT; + buf->input[buf->curseg]->dnum + = _Xsj3cmPStowOUT(buf, buf->input[buf->curseg]->disp, knjbuf); + if (buf->gakusyuu) + buf->input[buf->curseg]->dcid = bun[0].dcid; + if (value > 1) { + int changed, flush; + if ((buf->candidate = _Xsj3cCandidateInit(buf)) == NULL) { + Xsj3cWarning("sj3serv maybe down, or any trouble"); + } else { + Xsj3cSetCandidate(buf, 0, &changed, &flush); + } + } + } else { + if (value < 0) + Xsj3cWarning("sj3serv is down. reconnect please"); + _Xsj3cStoreYomi(buf, buf->input[buf->curseg], 0); + buf->input[buf->curseg]->status = SEG_NOCONV; + if (!(buf->movebyseg & SEG_NOCONV)) + buf->input[buf->curseg]->edit = SEG_EDIT; + } + } else { + value = 1; + _Xsj3cStoreYomi(buf, buf->input[buf->curseg], 0); + buf->input[buf->curseg]->status = SEG_NOCONV; + if (!(buf->movebyseg & SEG_NOCONV)) + buf->input[buf->curseg]->edit = SEG_EDIT; + } + + /* temporary $B$N%P%C%U%!$r3+J|$9$k(B */ + free(kanabuf); + + /* $BJ8@aD93X=,$N$?$a$N%U%i%0$rN)$F$k(B */ + if (buf->gakusyuu) + buf->input[buf->curseg]->change = ON; + + if (value > 0) + return KEY_TEXT_CHANGE; + else + return (KEY_TEXT_CHANGE|KEY_BELL); +} + +/* + * _Xsj3cExpandNoConv() + * Expand current segment by adding next segment. + */ +static Xsj3cEvent +_Xsj3cExpandNoConv(buf) + Xsj3cBuf buf; +{ + if (buf->curseg + buf->dict->n_dict < buf->segnum - 1) { + buf->dict->n_dict++; + return KEY_TEXT_CHANGE; + } else { + return KEY_BELL; + } +} + +/* + * _Xsj3cShrink() + * + * Shrink the current segment by pushing + * the last character to the next segment. + * Decrease reversed segments by getting off the last segment. + * Rings bell. + * + * ShrinkModeConversion on: Change the next segment's character mode. + * ShrinkKanjiConversion on: Do kana-kanji conversion for + * current and next segments. + * ShrinkAll on: When there is only one character in current segment, + * combine with the previous segment + * unless current segment is the first segment. + * ShrinkAll off: When there is only one character in current segment, + * ring bell. + */ +Xsj3cEvent +_Xsj3cShrink(buf) + Xsj3cBuf buf; +{ + int nextseg = buf->curseg + 1; + int prevseg = buf->curseg - 1, value = 0; + Xsj3cFlag conv1 = 0, conv2 = 0; + register int i, size; + unsigned char tmp[YBUFSIZ]; + unsigned char *kanabuf1, *kanabuf2; + unsigned char knjbuf[KANJIBUFSIZ]; + SJ3_BUNSETU bun[BUNBUFSIZ]; + Xsj3cFlag erase_seg_flg = 0; + + if (buf->convmode & DictModeMask) + return (_Xsj3cShrinkNoConv(buf)); + else if ((buf->convmode & (SelectModeMask|NoInputModeMask)) + || nextseg > buf->segnum) +#ifdef THROUGH_CONT + return (KEY_BELL); +#else /* THROUGH_CONT */ + if (buf->cntrlsame) + return (KEY_BELL); + else + return (KEY_TEXT_CHANGE|KEY_BELL); /* dummy */ +#endif /* THROUGH_CONT */ + else if (buf->input[buf->curseg]->num > 1 || (buf->shrinkall + && buf->input[buf->curseg]->num > 0 && buf->curseg)) { + /* $B%+%l%s%HJ8@a$,#2J8;z0J>e$"$k>l9g!"$^$?$O#1J8;z(B */ + /* $B$"$k>l9g$G(B .ShrinkAll on $B$G8=J8@a$,:G=i$NJ8@a$G(B */ + /* $B$J$$>l9g!"%+%l%s%HJ8@a$N:G8e$N#1J8;z$rn_select = 0; + if (buf->candidate) + Xsj3cEndCandidate(buf, OFF); + buf->input[buf->curseg]->cur = buf->input[buf->curseg]->num; + _Xsj3cExtractChar(buf, buf->input[buf->curseg], tmp, 1); + + /* .ShrinkAll on $B$G8=J8@a$,#1J8;z$7$+$J$+$C$?>l9g(B */ + /* $BA0J8@a$H9g@a$9$k$3$H$r;X<($9$k%U%i%0$r(B ON $B$K$9$k(B */ + if (!buf->input[buf->curseg]->num) + erase_seg_flg++; + } else { +#ifdef THROUGH_CONT + return (KEY_BELL); +#else /* THROUGH_CONT */ + if (buf->cntrlsame) + return (KEY_BELL); + else + return (KEY_TEXT_CHANGE|KEY_BELL); /* dummy */ +#endif /* THROUGH_CONT */ + } + + /* temporary $B$N%P%C%U%!$r:n@.$9$k(B */ + if (buf->input[nextseg]) + size = buf->input[nextseg]->size; + else + size = KANABUFSIZ; + if ((kanabuf2 = (unsigned char *)malloc(size * sizeof(wchar))) == NULL) + Xsj3cError("Cannot allocate for temporary buffer"); + + if (buf->curseg) + size = buf->input[prevseg]->size; + else + size = KANABUFSIZ; + if ((kanabuf1 = (unsigned char *)malloc(size * sizeof(wchar))) == NULL) + Xsj3cError("Cannot allocate for temporary buffer"); + + + if (buf->input[buf->curseg]->status & SEG_CONVED) + buf->convedsegnum--; + if (buf->shrinkall && buf->curseg && erase_seg_flg) { + /* .ShrinkAll on $B$GA0J8@a$H9g@a$9$k$3$H$r;X<($9$k(B */ + /* $B%U%i%0$,(B ON $B$N;~!"%+%l%s%HJ8@a$+$iinput[prevseg]->cur = buf->input[prevseg]->num; + _Xsj3cInsertChar(buf, buf->input[prevseg], tmp, 1); + + /* ShrinkModeConversion on $B$N;~$O9g$o$;$?ItJ,$N(B */ + /* $BJ8;zshrinkmconv & buf->input[prevseg]->status) + && buf->input[prevseg]->cursegmode + != buf->input[buf->curseg]->cursegmode) { + Xsj3cSeg seg = buf->input[prevseg]; + + conv1++; + _Xsj3cwPStomPS(buf, kanabuf1, seg->yomi); + Xsj3cModeConv(buf, kanabuf1, seg->cursegmode, seg->size); + seg->num = _Xsj3cmPStowPSn(buf, seg->yomi, kanabuf1, seg->size); + if (seg->num > buf->input[buf->curseg - 1]->size - YBUFSIZ) { + Xsj3cResizeSegment(seg, seg->size * 2); + seg->num = _Xsj3cmPStowPS(buf, seg->yomi, kanabuf1); + } + seg->cur = seg->num; + } + + /* $BJ8@a?t$r8:$8%+%l%s%HJ8@a$NNN0h$r3+J|$9$k(B */ + Xsj3cFreeSegment(buf->input[buf->segnum]); + buf->input[buf->segnum] = NULL; + buf->segnum--; + Xsj3cFreeSegment(buf->input[buf->curseg]); + buf->input[buf->curseg] = NULL; + if (nextseg <= buf->segnum) { + for ( i = buf->curseg; i < buf->segnum; i++) { + buf->input[i] = buf->input[i + 1]; + } + } + buf->input[buf->segnum] = NULL; + buf->curseg--; + } else { + /* $B%+%l%s%HJ8@a$,#2J8;z0J>e$@$C$?>l9g(B */ + + if (nextseg < buf->segnum) { + /* $B%+%l%s%HJ8@a$,:G8e$NJ8@a$G$J$$;~!"(B */ + /* $Binput[nextseg]->cur = 0; + _Xsj3cInsertChar(buf, buf->input[nextseg], tmp, 1); + if (buf->input[nextseg]->status & SEG_CONVED) + buf->convedsegnum--; + + /* ShrinkModeConversion on $B$N;~$OJ,N%$7$?(B */ + /* $BItJ,$NJ8;zshrinkmconv & buf->input[nextseg]->status) + && buf->input[nextseg]->cursegmode + != buf->input[buf->curseg]->cursegmode) { + Xsj3cSeg seg = buf->input[nextseg]; + + conv2++; + _Xsj3cwPStomPS(buf, kanabuf2, seg->yomi); + Xsj3cModeConv(buf, kanabuf2, seg->cursegmode, seg->size); + seg->num = _Xsj3cmPStowPSn(buf, seg->yomi, kanabuf2, seg->size); + if (seg->num > seg->size - YBUFSIZ) { + Xsj3cResizeSegment(seg, seg->size * 2); + seg->num = _Xsj3cmPStowPS(buf, seg->yomi, kanabuf2); + } + seg->cur = seg->num; + } + } else { + /* $B%+%l%s%HJ8@a$,:G8e$NJ8@a$N;~!"J8@a$r#1$DA}$d$7$F(B */ + /* $Binput[nextseg]) { + if ((buf->input[nextseg] + = (Xsj3cSeg)Xsj3cCreateSegment(buf)) == NULL) { + Xsj3cError("Failed to allocate segment"); + } + } else + Xsj3cClearSegment(buf, buf->input[nextseg]); + _Xsj3cInsertChar(buf, buf->input[nextseg], tmp, 1); + buf->input[nextseg]->change = OFF; + buf->input[nextseg]->edit = buf->input[buf->curseg]->edit; + buf->input[nextseg]->status = buf->input[buf->curseg]->status; + if (buf->input[nextseg]->status & SEG_CONVED) + buf->convedsegnum--; + buf->segnum++; + buf->input[nextseg]->cursegmode + = buf->input[buf->curseg]->cursegmode; + buf->input[nextseg]->dcid = buf->input[buf->curseg]->dcid; + } + + /* ShrinkKanjiConversion on $B$N;~$OJ,N%$7$?(B */ + /* $BItJ,$r9g$o$;$Fshrinkkconv & buf->input[nextseg]->status) { + if (!conv2) + _Xsj3cwPStomPS(buf, kanabuf2, buf->input[nextseg]->yomi); + if (buf->input[nextseg]->num < INPUT_YOMI_MAX) { + value = serverIF[buf->server].func[FUNC_CONV] + (kanabuf2, bun, knjbuf, KANJIBUFSIZ); + } else { + Xsj3cWarning("Too long segment[num = %d]",nextseg); + } + if (value > 0) { + _Xsj3cStoreKanji(buf, bun, nextseg, value, ON); + buf->segnum += (value - 1); + buf->convedsegnum += value; + } else { + if (value < 0) + Xsj3cWarning("sj3serv is down. reconnect please"); + _Xsj3cStoreYomi(buf, buf->input[nextseg], 0); + buf->input[nextseg]->status = SEG_NOCONV; + if (!(buf->movebyseg & SEG_NOCONV)) + buf->input[nextseg]->edit = SEG_EDIT; + } + } else { + _Xsj3cStoreYomi(buf, buf->input[nextseg], 0); + buf->input[nextseg]->status = SEG_NOCONV; + if (!(buf->movebyseg & SEG_NOCONV)) + buf->input[nextseg]->edit = SEG_EDIT; + } + if (buf->gakusyuu) + buf->input[nextseg]->change = ON; + } + + /* ExpandKanjiConversion on $B$N;~$O%+%l%s%H(B */ + /* $BJ8@a$r:FEY$+$J4A;zJQ49JQ49$9$k(B */ + if (buf->shrinkkconv & buf->input[buf->curseg]->status) { + value = 0; + if (!conv1) + _Xsj3cwPStomPS(buf, kanabuf1, buf->input[buf->curseg]->yomi); + if (buf->input[buf->curseg]->num < INPUT_YOMI_MAX) { + value = serverIF[buf->server].func[FUNC_CONV] + (kanabuf1, bun, knjbuf, KANJIBUFSIZ); + } else { + Xsj3cWarning("Too long segment[num = %d]",buf->curseg); + } + if (value > 0) { + buf->convedsegnum++; + buf->input[buf->curseg]->status = SEG_CONVED; + buf->input[buf->curseg]->edit = SEG_NOEDIT; + buf->input[buf->curseg]->dnum + = _Xsj3cmPStowOUT(buf, buf->input[buf->curseg]->disp, knjbuf); + if (buf->gakusyuu) + buf->input[buf->curseg]->dcid = bun[0].dcid; + } else { + if (value < 0) + Xsj3cWarning("sj3serv is down. reconnect please"); + _Xsj3cStoreYomi(buf, buf->input[buf->curseg], 0); + buf->input[buf->curseg]->status = SEG_NOCONV; + if (!(buf->movebyseg & SEG_NOCONV)) + buf->input[buf->curseg]->edit = SEG_EDIT; + } + } else { + value = 1; + _Xsj3cStoreYomi(buf, buf->input[buf->curseg], 0); + buf->input[buf->curseg]->status = SEG_NOCONV; + if (!(buf->movebyseg & SEG_NOCONV)) + buf->input[buf->curseg]->edit = SEG_EDIT; + } + + /* temporary $B$N%P%C%U%!$r3+J|$9$k(B */ + free(kanabuf1); + free(kanabuf2); + + /* $BJ8@aD93X=,$N$?$a$N%U%i%0$rN)$F$k(B */ + if (buf->gakusyuu) + buf->input[buf->curseg]->change = ON; + + if (value > 0) + return KEY_TEXT_CHANGE; + else + return (KEY_TEXT_CHANGE|KEY_BELL); +} + +/* + * _Xsj3cShrinkNoConv() + * Shrink current segment by reducing last segment. + */ +static Xsj3cEvent +_Xsj3cShrinkNoConv(buf) + Xsj3cBuf buf; +{ + if (buf->dict->n_dict) { + buf->dict->n_dict--; + return KEY_TEXT_CHANGE; + } else { + return (KEY_BELL); + } +} + +/* + * _Xsj3cBackSpace() + * + * Delete previous segment or character. + * Delete previous character for yomi. + * Popdown the panel and delete previous segment or character. + * Does nothing. + * + * DeleteBySegment on: Delete previous segment. + * DeleteBySegment off: Delete previous character. + * DeleteChangeSegment all: Unconvert all segments when "DeleteBySegment" + * is off. + * DeleteChangeSegment one: Unconvert segments after previous segment + * when "DeleteBySegment" is off. + * DeleteChangeSegment after: Unconvert previous segment + * when "DeleteBySegment" is off. + * SelectBackSpaceMove on: Move target segment to current segment. + */ +Xsj3cEvent +_Xsj3cBackSpace(buf) + Xsj3cBuf buf; +{ + Xsj3cEvent ret = KEY_NULL; + + if (buf->convmode & SelectModeMask) { + /* SelectMode $B$N;~$O8uJdA*Br!?5-9fA*Br(B */ + /* $B%&%#%s%I%&$r%]%C%W%@%&%s(B */ + ret |= KEY_SELECT_ABORT; + if (buf->selectstatus == SELECT_HINSI) { + buf->convmode = DictModeMask; + buf->dict->status = DICT_INPUT; + } else if (buf->selectstatus == SELECT_CAND) { + buf->convmode = ConvedModeMask; + if (buf->selectback) + buf->curseg++; + } else { + buf->convmode = InputModeMask; + if (!buf->segnum) + return(ret); + } + } else if (buf->convmode & NoInputModeMask) { + /* $BJ8@a(B(segement)$B?t$,(B 0$B$N$H$-$OL5;k$9$k(B */ +#ifdef THROUGH_CONT + return (KEY_NULL); +#else /* THROUGH_CONT */ + if (buf->cntrlsame) + return (KEY_NULL); + else + return (KEY_TEXT_CHANGE); /* dummy */ +#endif /* THROUGH_CONT */ + } + + switch(buf->convmode) { + case InputModeMask: + if ((buf->input[buf->curseg]->edit & SEG_NOEDIT) && + (buf->delbyseg & buf->input[buf->curseg]->status)) { + if (buf->curseg > 0) { + buf->curseg--; + return(_Xsj3cDeleteSeg(buf, ret, buf->dellastmove)); + } else { + return (KEY_BELL); + } + } else { + if (buf->input[buf->curseg]->cur == 0 && buf->curseg > 0) { + buf->curseg--; + if ((buf->input[buf->curseg]->edit & SEG_NOEDIT) && + buf->delbyseg & buf->input[buf->curseg]->status) + return(_Xsj3cDeleteSeg(buf, ret, buf->dellastmove)); + else { + ret |= _Xsj3cUnConvSeg(buf, buf->delchange, ON); + _Xsj3cStoreYomi(buf, buf->input[buf->curseg], 0); + } + } + return(_Xsj3cBackSpaceChar(buf, buf->input[buf->curseg], ret) + & ~KEY_DICT_CHANGE); + } + case ConvedModeMask: + if (buf->curseg > 0) { + buf->curseg--; + } else { + return (KEY_BELL); + } + if (buf->delbyseg & buf->input[buf->curseg]->status) { + return(_Xsj3cDeleteSeg(buf, ret, buf->dellastmove)); + } else { + ret |= _Xsj3cUnConvSeg(buf, buf->delchange, ON); + _Xsj3cStoreYomi(buf, buf->input[buf->curseg], 0); + return(_Xsj3cBackSpaceChar(buf, buf->input[buf->curseg], ret) + & ~KEY_DICT_CHANGE); + } + case DictModeMask: + /* DictMode $B$N;~(B */ + if (buf->dict->status == DICT_INPUT) { + ret = _Xsj3cBackSpaceChar(buf, buf->dict->seg, ret) + & ~KEY_TEXT_CHANGE; + _Xsj3cFlushDictMsg(buf); + return(ret); + } else { + return(KEY_NULL); + } + default: + return(ret); + } +} + +/* + * _Xsj3cDelete() + * + * Delete current segment or character. + * Delete the character of current position. + * Popdown the panel and delete current segment or character. + * Rings bell. + * + * DeleteBySegment on: Delete current segment. + * DeleteBySegment off: Delete current character. + * DeleteChangeSegment all: Unconvert all segments when "DeleteBySegment" + * is off. + * DeleteChangeSegment one: Unconvert segments after current segment + * when "DeleteBySegment" is off. + * DeleteChangeSegment after: Unconvert current segment + * when "DeleteBySegment" is off. + * DeleteLastMove on: Move current segment to previous + * after deleting last segment. + */ +Xsj3cEvent +_Xsj3cDelete(buf) + Xsj3cBuf buf; +{ + Xsj3cEvent ret = KEY_NULL; + + if (buf->convmode & SelectModeMask) { + ret |= KEY_SELECT_ABORT; + if (buf->selectstatus == SELECT_HINSI) { + buf->convmode = DictModeMask; + buf->dict->status = DICT_INPUT; + } else if (buf->selectstatus == SELECT_CAND) { + buf->convmode = ConvedModeMask; + } else { + buf->convmode = InputModeMask; + if (buf->curseg >= buf->segnum) { + return (ret); + } + } + /* SelectMode $B$N;~$O8uJdA*Br!?5-9fA*Br(B */ + /* $B%&%#%s%I%&$r%]%C%W%@%&%s(B */ + } else if (buf->convmode & NoInputModeMask) { +#ifdef THROUGH_CONT + return (KEY_NULL); +#else /* THROUGH_CONT */ + if (buf->cntrlsame) + return (KEY_NULL); + else + return (KEY_TEXT_CHANGE); /* dummy */ +#endif /* THROUGH_CONT */ + } else if (buf->curseg >= buf->segnum) { + /* $B$"$k$$$O%+%l%s%HJ8@aHV9f$,J8@a?t$h$j(B */ + /* $B>.$5$/$J$$;~$O%Y%k$rLD$i$9(B */ +#ifdef THROUGH_CONT + return (KEY_BELL); +#else /* THROUGH_CONT */ + if (buf->cntrlsame) + return (KEY_BELL); + else + return (KEY_TEXT_CHANGE|KEY_BELL); /* dummy */ +#endif /* THROUGH_CONT */ + } + + switch(buf->convmode) { + case InputModeMask: + if ((buf->input[buf->curseg]->edit & SEG_NOEDIT) && + (buf->delbyseg & buf->input[buf->curseg]->status)) { + return(_Xsj3cDeleteSeg(buf, ret, buf->dellastmove)); + } else { + if (buf->input[buf->curseg]->num == buf->input[buf->curseg]->cur + && buf->curseg < buf->segnum - 1) { + buf->curseg++; + if ((buf->input[buf->curseg]->edit & SEG_NOEDIT) && + buf->delbyseg & buf->input[buf->curseg]->status) + return(_Xsj3cDeleteSeg(buf, ret, buf->dellastmove)); + else { + ret |= _Xsj3cUnConvSeg(buf, buf->delchange, OFF); + _Xsj3cStoreYomi(buf, buf->input[buf->curseg], 0); + } + } + return(_Xsj3cDeleteChar(buf, buf->input[buf->curseg], ret) + & ~KEY_DICT_CHANGE); + } + case ConvedModeMask: + if (buf->delbyseg & buf->input[buf->curseg]->status) { + return(_Xsj3cDeleteSeg(buf, ret, buf->dellastmove)); + } else { + ret |= _Xsj3cUnConvSeg(buf, buf->delchange, OFF); + _Xsj3cStoreYomi(buf, buf->input[buf->curseg], 0); + return(_Xsj3cDeleteChar(buf, buf->input[buf->curseg], ret) + & ~KEY_DICT_CHANGE); + } + case DictModeMask: + /* DictMode $B$N;~(B */ + if (buf->dict->status == DICT_INPUT) { + ret = _Xsj3cDeleteChar(buf, buf->dict->seg, ret) + & ~KEY_TEXT_CHANGE; + _Xsj3cFlushDictMsg(buf); + return(ret); + } else { + return(KEY_NULL); + } + default: + return(ret); + } +} + +/* + * _Xsj3cBackSpaceChar() + * Delete last character of string buffers. + */ +static Xsj3cEvent +_Xsj3cBackSpaceChar(buf, seg, ret) + Xsj3cBuf buf; + Xsj3cSeg seg; + Xsj3cEvent ret; +{ + unsigned char tmp[YBUFSIZ]; + wchar wcs[RBUFSIZ]; + int change_pos, len; + register int i; + + if (seg->cur > 0) { + /* $B%+!<%=%k0LCV$h$jA0$KI=<(J8;zNs$,B8:_$9$k$H$-(B */ + + if (buf->backdisplay) { + + /* .BackDisplay on $B$N;~(B */ + + change_pos = seg->cur - 1; + if (seg->n_roma) { + /* $B$R$i$,$J!?A43Q%+%?%+%J!?H>3Q%+%?%+%JF~NO%b!<%I$N(B */ + /* $B$H$-$G%m!<%^;z%P%C%U%!$KJ8;z$,;D$C$F$$$k$H$-(B */ + /* $B$^$:0lJ8;z:o=|$9$k(B */ + _Xsj3cExtractChar(buf, seg, tmp, 1); + change_pos = seg->cur; + if (*seg->oldstr != '\0' && seg->value < 0) { + /* $BB`Hr%P%C%U%!$KJ8;z$,$"$C$FD>A0$N%m!<%^;z$+$J(B */ + /* $BJQ49$N7k2L$,JQ49ITG=$N>l9g$OB`Hr%P%C%U%!$N(B */ + /* $BJ8;z$r%m!<%^;z%P%C%U%!$K%3%T!<$9$k(B */ + strcpy(seg->str, seg->oldstr); + seg->n_roma = strlen(seg->oldstr); + seg->sp = seg->str; + seg->sp += seg->n_roma; + *(seg->sp) = '\0'; + *seg->oldstr = '\0'; + } else { + /* $B%m!<%^;zF~NO$GD>A0$NJQ497k2L>uBV$,ITDj$N$H$-(B */ + /* $B$O$H$-$O%m!<%^;z%P%C%U%!$NH>3Q%"%k%U%!%Y%C%H(B */ + /* $B$r#1J8;z:o=|$7!"FI$_%P%C%U%!$dI=<(%P%C%U%!$N(B */ + /* $B%"%k%U%!%Y(B $B%C%H$b#1J8;z>C5n$9$k(B */ + seg->sp--; + *seg->sp = '\0'; + seg->n_roma--; + } + } else if (seg->n_kana > 0) { + /* $B$+$JF~NO$G$R$i$,$J!?A43Q%+%?%+%JF~NO%b!<%I$N;~$G(B */ + /* $B$+$J%P%C%U%!$KJ8;z$,;D$C$F$$$k;~$O$+$J%P%C%U%!Cf(B */ + /* $B$N%+%J$HFI$_%P%C%U%!!"I=<(%P%C%U%!Cf$N$R$i$,$JA4(B */ + /* $B3Q%+%?%+%J$r#1J8;z>C5n$7!"99$K$b$J8;zA0$NA43Q(B */ + /* $B$+$J$rH>3Q%+%?%+%J$KJQ49$7$F$+$J%P%C%U%!$KF~$l$k(B */ + _Xsj3cExtractChar(buf, seg, tmp, 1); + change_pos = seg->cur; + seg->sp = seg->str; + *seg->str = '\0'; + if (seg->cur > 0 && + (ishira(seg->yomi[seg->cur - 1], serverIF[buf->server].lang) || + iskata(seg->yomi[seg->cur - 1], serverIF[buf->server].lang))) { + wcs[0] = seg->yomi[seg->cur - 1]; + wcs[1] = '\0'; + _Xsj3cwPStomPS(buf, tmp, wcs); + _Xsj3cZKanaToHKata(buf, seg->str, tmp); + if (isdakuon(*seg->str) + && strlen(seg->str) == 1) { + *(++seg->sp) = '\0'; + seg->n_kana = 1; + } else { + seg->n_kana = 0; + } + } else { + seg->n_kana = 0; + } + } else { + /* $B%m!<%^;zF~NO;~$N%m!<%^;z%P%C%U%!$d$+$JF~NO;~$N(B */ + /* $B$+$J%P%C%U%!$KJ8;z$,;D$C$F$$$J$$$H$-(B */ + if (*seg->oldstr != '\0' && + iskan1(seg->yomi[seg->cur - 1] >> 8, serverIF[buf->server].lang) + && iskan2(seg->yomi[seg->cur - 1] & 0xff, + serverIF[buf->server].lang)) { + /* $BB`Hr%P%C%U%!$KJ8;z$,$"$C$F:o=|$9$k:G8e$N(B */ + /* $BJ8;z$,A43QJ8;z$N$H$-(B */ + if (seg->n_kana < 0) { + /* $B%m!<%^;zF~NO!?%3!<%IF~NO$N>l9g!"#1J8;z:o(B */ + /* $B=|$7$FB`Hr%P%C%U%!$NJ8;z$r%3%T!<$9$k(B */ + strcpy(seg->str, seg->oldstr); + seg->n_roma = strlen(seg->oldstr); + _Xsj3cExtractChar(buf, seg, tmp, seg->oldlen); + change_pos = seg->cur; + if (buf->alphaconv && buf->inputmode != MODE_HKATA) { + _Xsj3cHAlphaToZKana(buf, tmp, seg->oldstr); + _Xsj3cInsertChar(buf, seg, tmp, seg->n_roma); + } else { + _Xsj3cInsertChar(buf, seg, seg->oldstr, + seg->n_roma); + } + seg->sp = seg->str; + seg->sp += seg->n_roma; + } else { + /* $B$+$JF~NO$N>l9g#1J8;z:o=|$7$FB`Hr%P%C%U%!(B */ + /* $BJ8;z$r%3%T!<$7$=$NJ8;z$r:FEY$+$JJQ49$9$k(B */ + _Xsj3cExtractChar(buf, seg, tmp, 1); + change_pos = seg->cur; + seg->sp = seg->str; + strcpy(seg->str, seg->oldstr); + if ((seg->value = _Xsj3cKanaConv(buf, seg, seg->str, + tmp, buf->inputmode)) > 0) { + seg->n_kana = 0; + } else if (seg->value == 0) { + seg->n_kana = 1; + *(++seg->sp) = '\0'; + len = _Xsj3cmPStowPS(buf, wcs, tmp); + _Xsj3cInsertWchar(seg, wcs, len); + } else { + seg->n_kana = 0; + } + } + *seg->oldstr = '\0'; + seg->oldlen = 0; + } else if (*seg->oldstr != '\0') { + /* $B%3!<%IF~NO$GH>3Q$KJQ49$5$l$k;~(B */ + /* $B$^$?$OH>%+%J%b!<%I$N;~(B */ + strcpy(seg->str, seg->oldstr); + seg->n_roma = strlen(seg->oldstr); + _Xsj3cExtractChar(buf, seg, tmp, seg->oldlen); + change_pos = seg->cur; + if (buf->alphaconv && buf->inputmode != MODE_HKATA) { + _Xsj3cHAlphaToZKana(buf, tmp, seg->oldstr); + _Xsj3cInsertChar(buf, seg, tmp, seg->n_roma); + } else { + _Xsj3cInsertChar(buf, seg, seg->oldstr, + seg->n_roma); + } + seg->sp = seg->str; + seg->sp += seg->n_roma; + *seg->oldstr = '\0'; + seg->oldlen = 0; + } else { + /* $BB`Hr%P%C%U%!$KJ8;z$,;D$C$F$$$J$$$H$-(B */ + _Xsj3cExtractChar(buf, seg, tmp, 1); + change_pos = seg->cur; + *seg->str = '\0'; + seg->sp = seg->str; + if (seg->n_kana >= 0) { + if (seg->cur > 0 && (ishira(seg->yomi[seg->cur - 1], + serverIF[buf->server].lang) || + iskata(seg->yomi[seg->cur - 1], + serverIF[buf->server].lang))) { + /* $B$+$JF~NO$N$H$-$O99$K#1J8;zA0(B */ + /* $B$NA43Q$+$J$rH>3Q%+%?%+%J$KJQ(B */ + /* $B49$7$F$+$J%P%C%U%!$KF~$l$k(B */ + wcs[0] = seg->yomi[seg->cur - 1]; + wcs[1] = '\0'; + _Xsj3cwPStomPS(buf, tmp, wcs); + _Xsj3cZKanaToHKata(buf, seg->str, tmp); + if (isdakuon(*seg->str) + && strlen(seg->str) == 1) { + *(++seg->sp) = '\0'; + seg->n_kana = 1; + } else { + seg->n_kana = 0; + *seg->str = '\0'; + } + } else { + seg->n_kana = 0; + } + } else { + seg->n_kana = -1; + } + } + } + } else { + /* .BackDisplay off $B$N;~(B */ + + _Xsj3cExtractChar(buf, seg, tmp, 1); + change_pos = seg->cur; + if (seg->n_roma) { + /* $B%m!<%^;zF~NO$G%m!<%^;z%P%C%U%!$KJ8;z$,$"$k>l9g(B */ + seg->sp--; + *seg->sp = '\0'; + seg->n_roma--; + } else if (seg->n_kana >= 0) { + /* $B$+$JF~NO$N$H$-$O99$K#1J8;zA0$NA43Q$+$J(B */ + /* $B$rH>3Q%+%?%+%J$KJQ49$7$F!"$=$l$,By2;(B */ + /* $B8uJd$@$C$?$i$+$J%P%C%U%!$KF~$l$k(B */ + *seg->str = '\0'; + seg->sp = seg->str; + if (seg->cur > 0 && (ishira(seg->yomi[seg->cur - 1], + serverIF[buf->server].lang) || + iskata(seg->yomi[seg->cur - 1], + serverIF[buf->server].lang))) { + wcs[0] = seg->yomi[seg->cur - 1]; + wcs[1] = '\0'; + _Xsj3cwPStomPS(buf, tmp, wcs); + _Xsj3cZKanaToHKata(buf, seg->str, tmp); + if (isdakuon(*seg->str) + && strlen(seg->str) == 1) { + *(++seg->sp) = '\0'; + seg->n_kana = 1; + } else { + seg->n_kana = 0; + *seg->str = '\0'; + } + } else { + seg->n_kana = 0; + } + } else { + *seg->str = '\0'; + seg->sp = seg->str; + seg->n_kana = -1; + } + } + _Xsj3cStoreYomi(buf, seg, change_pos); + if (seg->num < seg->size - KANABUFSIZ - YBUFSIZ) + Xsj3cResizeSegment(seg, seg->size - KANABUFSIZ); + if (seg->num == 0 && (buf->convmode & ~DictModeMask)) { + Xsj3cFreeSegment(buf->input[buf->segnum]); + buf->input[buf->segnum] = NULL; + buf->segnum--; + Xsj3cFreeSegment(seg); + seg = NULL; + for (i = buf->curseg; i < buf->segnum; i++) { + buf->input[i] = buf->input[i + 1]; + } + buf->input[buf->segnum] = NULL; + } + if (buf->dispmodechange) { + buf->dispmode = ((buf->segnum && + buf->convedsegnum == buf->segnum) ? MODE_KANJI : + (buf->convedsegnum ? MODE_EDIT : buf->inputmode)); + ret |= KEY_MODE_CHANGE; + } + if (buf->curseg && buf->curseg == buf->segnum && buf->dellastmove) + buf->curseg--; + + return(ret|KEY_TEXT_CHANGE|KEY_DICT_CHANGE); + } else { + /* $B%+!<%=%k0LCV$h$jA0$KI=<(J8;zNs$,$J$$$H$-(B */ +#ifdef THROUGH_CONT + return (KEY_BELL); +#else /* THROUGH_CONT */ + if (buf->cntrlsame) + return (KEY_BELL); + else + return (KEY_TEXT_CHANGE|KEY_BELL); /* dummy */ +#endif /* THROUGH_CONT */ + } +} + +/* + * _Xsj3cDeleteChar() + * Delete next character of string buffers. + */ +static Xsj3cEvent +_Xsj3cDeleteChar(buf, seg, ret) + Xsj3cBuf buf; + Xsj3cSeg seg; + Xsj3cEvent ret; +{ + unsigned char tmp[YBUFSIZ]; + int change_pos; + register int i; + + if (seg->cur < seg->num) { + /* $B%+!<%=%k0LCV$h$j8e$m$KI=<(J8;zNs$,B8:_$9$k$H$-(B */ + + change_pos = seg->cur; + seg->cur++; + _Xsj3cExtractChar(buf, seg, tmp, 1); + _Xsj3cStoreYomi(buf, seg, change_pos); + if (seg->num < seg->size - KANABUFSIZ - YBUFSIZ) + Xsj3cResizeSegment(seg, seg->size - KANABUFSIZ); + if (seg->num == 0 && (buf->convmode & ~DictModeMask)) { + Xsj3cFreeSegment(buf->input[buf->segnum]); + buf->input[buf->segnum] = NULL; + buf->segnum--; + Xsj3cFreeSegment(seg); + seg = NULL; + for (i = buf->curseg; i < buf->segnum; i++) { + buf->input[i] = buf->input[i + 1]; + } + buf->input[buf->segnum] = NULL; + if (buf->dispmodechange) { + buf->dispmode = ((buf->segnum && + buf->convedsegnum == buf->segnum) ? MODE_KANJI : + (buf->convedsegnum ? MODE_EDIT : buf->inputmode)); + ret |= KEY_MODE_CHANGE; + } + if (buf->curseg && buf->curseg == buf->segnum && buf->dellastmove) + buf->curseg--; + } + return(ret|KEY_TEXT_CHANGE|KEY_DICT_CHANGE); + } else { + /* $B%+!<%=%k0LCV$h$j8e$m$KI=<(J8;zNs$,$J$$$H$-(B */ + + return(KEY_NULL); + } +} + +/* + * _Xsj3cDeleteSeg() + * Delete current segment. + */ +static Xsj3cEvent +_Xsj3cDeleteSeg(buf, ret, move) + Xsj3cBuf buf; + Xsj3cEvent ret; + Xsj3cFlag move; +{ + register int i; + + buf->n_select = 0; + if ((buf->convmode & ConvedModeMask) && buf->candidate) + Xsj3cEndCandidate(buf, OFF); + if (buf->segnum <= buf->curseg) { + return (ret); + } + Xsj3cFreeSegment(buf->input[buf->segnum]); + buf->input[buf->segnum] = NULL; + buf->segnum--; + if (!buf->segnum) { + /* $BJ8@a?t$,(B 0 $B$K$J$C$?$H$-$OJQ49MQJ8;z(B */ + /* $B%P%C%U%!$r%/%j%"$7$F(B InputMode $B$K$9$k(B */ + + buf->convedsegnum = 0; + buf->curseg = 0; + Xsj3cClearSegment(buf, buf->input[0]); + } else if (buf->curseg == buf->segnum) { + + if (buf->input[buf->curseg]->status & SEG_CONVED) { + buf->convedsegnum--; + if (!buf->convedsegnum && buf->gakusyuu) { + _Xsj3cClearDcid(buf); + } + } + Xsj3cFreeSegment(buf->input[buf->curseg]); + buf->input[buf->curseg] = NULL; + /* $BJQ49Cf$NJ8>O$N:G8e$NJ8@a$N;~$O8=J8@a$r$R$H$DA0$K$:$i$9(B */ + if (move) + buf->curseg--; + } else if (buf->curseg < buf->segnum) { + /* $B:G8e$NJ8@a$G$J$$$N;~$O0J9_$NJ8@a$r(B */ + /* $B$R$H$D$:$DA0$K$:$i$9(B */ + + if (buf->input[buf->curseg]->status & SEG_CONVED) { + buf->convedsegnum--; + if (!buf->convedsegnum && buf->gakusyuu) { + _Xsj3cClearDcid(buf); + } + } + Xsj3cFreeSegment(buf->input[buf->curseg]); + buf->input[buf->curseg] = NULL; + for (i = buf->curseg; i < buf->segnum; i++) { + buf->input[i] = buf->input[i + 1]; + } + buf->input[buf->segnum] = NULL; + } + if (buf->dispmodechange) { + buf->dispmode = ((buf->segnum && + buf->convedsegnum == buf->segnum) ? MODE_KANJI : + (buf->convedsegnum ? MODE_EDIT : buf->inputmode)); + ret |= KEY_MODE_CHANGE; + } + ret |= KEY_TEXT_CHANGE; + return(ret); +} + +/* + * _Xsj3cDelAfter() + * + * Delete current segment and all segments after + * current segment or cursor position. + * Delete all yomi strings. + * Popdown the panel and delete strings after current segment + * or cursor position. + * Rings bell. + * + * DeleteBySegment on: Delete current segment and all segments after current. + * DeleteBySegment off: Delete strings after current cursor position + * in current segment. + * DeleteLastMove on: Move current segment to previous + * after deleting last segment. + */ +Xsj3cEvent +_Xsj3cDelAfter(buf) + Xsj3cBuf buf; +{ + Xsj3cEvent ret = KEY_NULL; + register int i, begin; + int del_num; + unsigned char *tmp; + + if (buf->convmode & SelectModeMask) { + if (buf->selectstatus == SELECT_HINSI || buf->curseg >= buf->segnum) { + if (buf->selectstatus == SELECT_HINSI) + buf->dict->status = DICT_INPUT; + if (buf->dispmodechange) { + buf->dispmode = + (buf->dict->mode == REG_STATE ? MODE_TOROKU : MODE_SYOUKYO); + return (KEY_SELECT_ABORT|KEY_MODE_CHANGE); + } else + return (KEY_SELECT_ABORT); + } else { + ret |= KEY_SELECT_ABORT; + } + /* SelectMode $B$N;~$O8uJdA*Br!?5-9fA*Br(B */ + /* $B%&%#%s%I%&$r%]%C%W%@%&%s(B */ + } else if (buf->convmode & (NoInputModeMask|DictModeMask)) { +#ifdef THROUGH_CONT + return (KEY_NULL); +#else /* THROUGH_CONT */ + if (buf->cntrlsame) + return (KEY_NULL); + else + return (KEY_TEXT_CHANGE); /* dummy */ +#endif /* THROUGH_CONT */ + } else if (buf->curseg >= buf->segnum) { + /* $B$"$k$$$O%+%l%s%HJ8@aHV9f$,J8@a?t$h$j(B */ + /* $B>.$5$/$J$$;~$O%Y%k$rLD$i$9(B */ +#ifdef THROUGH_CONT + return (KEY_BELL); +#else /* THROUGH_CONT */ + if (buf->cntrlsame) + return (KEY_BELL); + else + return (KEY_TEXT_CHANGE|KEY_BELL); /* dummy */ +#endif /* THROUGH_CONT */ + } + + ret |= KEY_TEXT_CHANGE; + if (buf->killbyseg & buf->input[buf->curseg]->status) { + if (buf->input[buf->curseg]->edit & SEG_NOEDIT) { + begin = buf->curseg; + } else { + if (!buf->input[buf->curseg]->cur) { + begin = buf->curseg; + } else { + begin = buf->curseg + 1; + if (buf->input[buf->curseg]->cur + < buf->input[buf->curseg]->num) { + del_num = buf->input[buf->curseg]->num + - buf->input[buf->curseg]->cur; + buf->input[buf->curseg]->cur = buf->input[buf->curseg]->num; + if ((tmp = (unsigned char *) + malloc(buf->input[buf->curseg]->size + * sizeof(wchar))) == NULL) + Xsj3cError("Cannot allocate for temporary buffer"); + _Xsj3cExtractChar(buf, buf->input[buf->curseg], tmp, del_num); + free(tmp); + _Xsj3cStoreYomi(buf, buf->input[buf->curseg], + buf->input[buf->curseg]->cur); + } + } + } + for (i = begin; i < buf->segnum + 1; i++) { + if (buf->input[i]->status & SEG_CONVED) + buf->convedsegnum--; + Xsj3cFreeSegment(buf->input[i]); + buf->input[i] = NULL; + } + buf->segnum = begin; + if (begin == buf->curseg && buf->dellastmove && buf->curseg) + buf->curseg--; + if (buf->dispmodechange) { + buf->dispmode = ((buf->segnum && + buf->convedsegnum == buf->segnum) ? MODE_KANJI : + (buf->convedsegnum ? MODE_EDIT : buf->inputmode)); + ret |= KEY_MODE_CHANGE; + } + if (buf->gakusyuu && !buf->convedsegnum) + _Xsj3cClearDcid(buf); + } else { + if (buf->input[buf->curseg]->edit & SEG_NOEDIT + || !buf->input[buf->curseg]->cur) { + ret |= _Xsj3cDeleteSeg(buf, ret, buf->dellastmove); + } else { + if (buf->input[buf->curseg]->cur + < buf->input[buf->curseg]->num) { + del_num = buf->input[buf->curseg]->num + - buf->input[buf->curseg]->cur; + buf->input[buf->curseg]->cur = buf->input[buf->curseg]->num; + if ((tmp = (unsigned char *) + malloc(buf->input[buf->curseg]->size + * sizeof(wchar))) == NULL) + Xsj3cError("Cannot allocate for temporary buffer"); + _Xsj3cExtractChar(buf, buf->input[buf->curseg], tmp, del_num); + free(tmp); + _Xsj3cStoreYomi(buf, buf->input[buf->curseg], + buf->input[buf->curseg]->cur); + } + } + } + + return(ret); +} + +/* + * _Xsj3cStart() + * + * If now on converting, + * fix all segments, then end kana-kanji converting. + * + * FlushEndConversion on: Flush converting strings before ending. + * DisplayModeChange on: Change the display mode string. + */ +Xsj3cEvent +_Xsj3cStart(buf) + Xsj3cBuf buf; +{ + Xsj3cEvent ret = KEY_HENKAN_END; + register int i; + + if (buf->dispmodechange) { + buf->dispmode = buf->inputmode; + } + switch(buf->convmode) { + case ConvedModeMask: + buf->n_select = 0; + if (buf->candidate) + Xsj3cEndCandidate(buf, OFF); + case InputModeMask: + break; + case SelectModeMask: + if (buf->flusheconv) + ret |= KEY_SELECT_END; + else + ret |= KEY_SELECT_ABORT; + if (buf->candidate) + Xsj3cEndCandidate(buf, OFF); + buf->n_select = 0; + break; + case DictModeMask: + ret |= KEY_DICT_END; + break; + case NoInputModeMask: + return (KEY_HENKAN_END); + default: + /* Not supported */ + return (KEY_HENKAN_START); + } + if (buf->flusheconv) { + ret |= KEY_TEXT_FIXED; + } else { + for (i = 1; i < buf->segnum + 1; i++) { + Xsj3cFreeSegment(buf->input[i]); + buf->input[i] = NULL; + } + if (buf->input[0]) + Xsj3cClearSegment(buf, buf->input[0]); + buf->segnum = 0; + buf->convedsegnum = 0; + buf->curseg = 0; + } + return ret; +} + +/* + * _Xsj3cReConnect() + * + * Popdown the panel + * and clear all segments, then reonnect to sj3serv. + * + * FlushEndConversion on: Flush converting strings before reconnecting. + * DisplayModeChange on: Change the display mode string. + */ +Xsj3cEvent +_Xsj3cReConnect(buf) + Xsj3cBuf buf; +{ + Xsj3cEvent ret = KEY_TEXT_CHANGE; + + if (buf->gakusyuu) { + _Xsj3cClearDcid(buf); + } + switch (buf->convmode) { + case ConvedModeMask: + buf->n_select = 0; + if (buf->candidate) + Xsj3cEndCandidate(buf, OFF); + case InputModeMask: + case NoInputModeMask: + ret = KEY_RECONNECT; + break; + case SelectModeMask: + ret = KEY_SELECT_ABORT|KEY_RECONNECT; + buf->n_select = 0; + if (buf->candidate) + Xsj3cEndCandidate(buf, OFF); + break; + case DictModeMask: + ret = KEY_DICT_END|KEY_RECONNECT; + break; + default: + ret = KEY_RECONNECT; + break; + } + if (buf->dispmodechange) { + buf->dispmode = buf->inputmode; + ret |= KEY_MODE_CHANGE; + } + return ret; +} + +/* + * _Xsj3cReConvert() + * + * If there is no string in input buffer, + * copy from backup buffer which saved last fixed or flushed. + * But there is any strings in input buffer or backup buffer is null, + * ring bell. + * Ring bell. + * + * BeginConversionLast on: Set current segment to the last one. + * BeginConversionLast none: Allow to move out of segments. + */ +Xsj3cEvent +_Xsj3cReConvert(buf) + Xsj3cBuf buf; +{ + register int i, conved; + + if ((buf->convmode & NoInputModeMask) && buf->backup) { + buf->segnum = buf->backsegnum; + if (!buf->segnum) +#ifdef THROUGH_CONT + return (KEY_NULL); +#else /* THROUGH_CONT */ + if (buf->cntrlsame) + return (KEY_NULL); + else + return (KEY_TEXT_CHANGE); /* dummy */ +#endif /* THROUGH_CONT */ + for (i = 0, conved = 0; i < buf->segnum; i++) { + if (!buf->input[i]) { + if ((buf->input[i] + = (Xsj3cSeg)Xsj3cCreateSegment(buf)) == NULL) { + Xsj3cError("Failed to allocate segment"); + } + } else { + *buf->input[i]->oldstr = '\0'; + buf->input[i]->oldlen = 0; + *buf->input[i]->str = '\0'; + buf->input[i]->sp = buf->input[i]->str; + buf->input[i]->change = OFF; + buf->input[i]->n_roma = 0; + buf->input[i]->n_kana = -1; + buf->input[i]->value = 0; + } + _Xsj3cWcpy(buf->input[i]->yomi, buf->backup[i]->yomi); + buf->input[i]->num = buf->backup[i]->num; + buf->input[i]->cur = buf->backup[i]->cur; + _Xsj3cWcpy(buf->input[i]->disp, buf->backup[i]->disp); + buf->input[i]->dnum = buf->backup[i]->dnum; + buf->input[i]->dcid = buf->backup[i]->dcid; + buf->input[i]->edit = buf->backup[i]->edit; + buf->input[i]->cursegmode = buf->backup[i]->cursegmode; + if ((buf->input[i]->status = buf->backup[i]->status) == SEG_CONVED) + conved++; + buf->input[i]->size = buf->backup[i]->size; + } + buf->convedsegnum = conved; + switch (buf->beginlastseg) { + case NONE: + buf->curseg = buf->segnum; + break; + case ON: + buf->curseg = buf->segnum - 1; + break; + case OFF: + buf->curseg = 0; + break; + default: + buf->curseg = 0; + break; + } + return (KEY_TEXT_CHANGE); + } else { + return KEY_NULL; + } +} + +/* + * _Xsj3cEdit() [edit] + * + * Unconvert segments. + * pop down the panel candidate(symbol/hinsi) panel and + * unconvert current segment. + * Pop down Auxpanel and unconvert current segment. + * Does nothing. + * + * DisplayModeChange on: Change the display mode string. + * EditCursorLast on: Set cursor position to bottom of segment. + * EditCursorLast off: Set cursor position to top of segment. + */ +Xsj3cEvent +_Xsj3cEdit(buf) + Xsj3cBuf buf; +{ + Xsj3cEvent ret = KEY_NULL; + + if (buf->convmode & SelectModeMask) { + ret |= KEY_SELECT_ABORT; + if (buf->selectstatus == SELECT_HINSI) { + ret |= KEY_DICT_END; + } + } else if (buf->convmode & DictModeMask) { + ret |= KEY_DICT_END; + } else if (buf->convmode & NoInputModeMask) { +#ifdef THROUGH_CONT + return (KEY_NULL); +#else /* THROUGH_CONT */ + if (buf->cntrlsame) + return (KEY_NULL); + else + return (KEY_TEXT_CHANGE); /* dummy */ +#endif /* THROUGH_CONT */ + } + ret |= _Xsj3cUnConvSeg(buf, ONE, buf->editcurlast); + _Xsj3cStoreYomi(buf, buf->input[buf->curseg], 0); + buf->input[buf->curseg]->edit = SEG_EDIT; + return (ret); +} + +/* + * _Xsj3cDRegBegin() + * + * Begin to registr the word in the dictionary. + * Rings bell. + * + * DisplayModeChange on: Change the display mode string. + */ +Xsj3cEvent +_Xsj3cDRegBegin(buf) + Xsj3cBuf buf; +{ + if (buf->convmode & (ConvedModeMask|InputModeMask)) { + buf->n_select = 0; + if (buf->candidate) + Xsj3cEndCandidate(buf, ON); + buf->dict = _Xsj3cCreateDictData(buf, REG_STATE); + buf->convmode = DictModeMask; + _Xsj3cFlushDictMsg(buf); + if (buf->dispmodechange) { + buf->dispmode = MODE_TOROKU; + return (KEY_DICT_START|KEY_MODE_CHANGE); + } else + return (KEY_DICT_START); + } else { +#ifdef THROUGH_CONT + return (KEY_BELL); +#else /* THROUGH_CONT */ + if (buf->cntrlsame) + return (KEY_BELL); + else + return (KEY_TEXT_CHANGE|KEY_BELL); /* dummy */ +#endif /* THROUGH_CONT */ + } +} + +/* + * _Xsj3cDClearBegin() + * + * Begin to eliminate the word in the dictionary. + * Rings bell. + * + * DisplayModeChange on: Change the display mode string. + */ +Xsj3cEvent +_Xsj3cDClearBegin(buf) + Xsj3cBuf buf; +{ + if (buf->convmode & (ConvedModeMask|InputModeMask)) { + buf->n_select = 0; + if (buf->candidate) + Xsj3cEndCandidate(buf, OFF); + buf->dict = _Xsj3cCreateDictData(buf, CLR_STATE); + buf->convmode = DictModeMask; + _Xsj3cFlushDictMsg(buf); + if (buf->dispmodechange) { + buf->dispmode = MODE_SYOUKYO; + return (KEY_DICT_START|KEY_MODE_CHANGE); + } else + return (KEY_DICT_START); + } else { +#ifdef THROUGH_CONT + return (KEY_BELL); +#else /* THROUGH_CONT */ + if (buf->cntrlsame) + return (KEY_BELL); + else + return (KEY_TEXT_CHANGE|KEY_BELL); /* dummy */ +#endif /* THROUGH_CONT */ + } +} + +/* + * _Xsj3cSymbolBegin() + * + * Begin symbol selecting + * and popup the panel. + * Ring bell. + * + * DisplayModeChange on: Change the display mode string. + */ +Xsj3cEvent +_Xsj3cSymbolBegin(buf) + Xsj3cBuf buf; +{ + Xsj3cEvent ret = KEY_SYMBOL_START; + + if (buf->convmode & (InputModeMask|NoInputModeMask|ConvedModeMask)) { + if (buf->dispmodechange) { + buf->dispmode = MODE_SYMBOL; + ret |= KEY_MODE_CHANGE; + } + buf->selectstatus = SELECT_SYMBOL; + buf->convmode = SelectModeMask; + return (ret); + } else { + return (KEY_BELL); + } +} + +/* + * _Xsj3cFlushBefore() + * + * Delete current segment and all segments after + * current segment or cursor position. + * Delete all yomi strings. + * Popdown the panel and delete strings after current segment + * or cursor position. + * Does nothing. + * + * FlushChangeSegment off: Fix strings before current cursor position + * FlushChangeSegment one: Fix strings before current cursor position + * and unconvert one segment. + * FlushChangeSegment all: Fix strings before current cursor position + * and unconvert all segments. + * FlushCursorLast on: Set cursor position to bottom of segment. + * FlushCursorLast off: Set cursor position to top of segment. + */ +Xsj3cEvent +_Xsj3cFlushBefore(buf) + Xsj3cBuf buf; +{ + Xsj3cEvent ret = KEY_NULL; + register int i, j; + int store_num; + unsigned char *tmp; + + if (buf->convmode & SelectModeMask) { + if (buf->selectstatus == SELECT_HINSI || buf->curseg >= buf->segnum) { + if (buf->selectstatus == SELECT_HINSI) + buf->dict->status = DICT_INPUT; + if (buf->dispmodechange) { + buf->dispmode = + (buf->dict->mode == REG_STATE ? MODE_TOROKU : MODE_SYOUKYO); + return (KEY_SELECT_ABORT|KEY_MODE_CHANGE); + } else + return (KEY_SELECT_ABORT); + } else { + ret |= KEY_SELECT_END; + } + /* SelectMode $B$N;~$O8uJdA*Br!?5-9fA*Br(B */ + /* $B%&%#%s%I%&$r%]%C%W%@%&%s(B */ + } else if (buf->convmode & (NoInputModeMask|DictModeMask)) { +#ifdef THROUGH_CONT + return (KEY_NULL); +#else /* THROUGH_CONT */ + if (buf->cntrlsame) + return (KEY_NULL); + else + return (KEY_TEXT_CHANGE); /* dummy */ +#endif /* THROUGH_CONT */ + } else if (buf->curseg >= buf->segnum) { + /* $B$"$k$$$O%+%l%s%HJ8@aHV9f$,J8@a?t$h$j(B */ + /* $B>.$5$/$J$$;~$O%Y%k$rLD$i$9(B */ +#ifdef THROUGH_CONT + return (KEY_BELL); +#else /* THROUGH_CONT */ + if (buf->cntrlsame) + return (KEY_BELL); + else + return (KEY_TEXT_CHANGE|KEY_BELL); /* dummy */ +#endif /* THROUGH_CONT */ + } + + if (!buf->backup) { + if ((buf->backup = (Xsj3cSeg *)calloc(BUNBUFSIZ, + sizeof(Xsj3cSeg))) == NULL) { + Xsj3cError("Cannot allocate for backup buffers"); + } + } else { + for (i = 0; i < buf->backsegnum + 1; i++) { + Xsj3cFreeSegment(buf->backup[i]); + buf->backup[i] = NULL; + } + } + + switch(buf->flushchange) { + case ONE: + ret |= _Xsj3cUnConvSeg(buf, ONE, buf->flushcurlast); + _Xsj3cStoreYomi(buf, buf->input[buf->curseg], 0); + break; + case ALL: + ret |= _Xsj3cUnConvSeg(buf, AFTER, buf->flushcurlast); + _Xsj3cStoreYomi(buf, buf->input[buf->curseg], 0); + buf->input[buf->curseg]->edit = SEG_EDIT; + break; + case OFF: + default: + break; + } + + ret |= (KEY_TEXT_CHANGE|KEY_TEXT_FLUSH); + for (i = buf->curseg, j = 0; i < buf->segnum; i++, j++) { + buf->backup[j] = buf->input[i]; + buf->input[i] = NULL; + } + buf->backsegnum = j; + Xsj3cFreeSegment(buf->input[buf->segnum]); + buf->input[buf->segnum] = NULL; + buf->segnum = buf->curseg; + for (i = 0; i < buf->curseg; i++) + if (buf->input[i]->status & SEG_CONVED) + buf->convedsegnum--; + + if (buf->flushchange == OFF && (buf->backup[0]->edit & SEG_EDIT) + && (buf->backup[0]->cur < buf->backup[0]->num) + && buf->backup[0]->cur) { + /* .FlushChangeSegment $B$,(B off $B$G%+!<%=%k$,C<$K$J$$$H$-(B */ + + buf->backup[0]->cur = buf->backup[0]->num; + if ((tmp = (unsigned char *)malloc(buf->backup[0]->size + * sizeof(wchar))) == NULL) + Xsj3cError("Cannot allocate for temporary buffer"); + store_num = buf->backup[0]->cur; + _Xsj3cExtractChar(buf, buf->backup[0], tmp, buf->backup[0]->cur); + _Xsj3cStoreYomi(buf, buf->backup[0], 0); + if (!buf->input[buf->segnum]) { + if ((buf->input[buf->segnum] + = (Xsj3cSeg)Xsj3cCreateSegment(buf)) == NULL) { + Xsj3cError("Failed to allocate segment."); + } + } else + Xsj3cClearSegment(buf, buf->input[buf->segnum]); + _Xsj3cInsertChar(buf, buf->input[buf->segnum], tmp, store_num); + _Xsj3cStoreYomi(buf, buf->input[buf->segnum], 0); + buf->segnum++; + free(tmp); + } + + if (buf->gakusyuu && !buf->convedsegnum) + _Xsj3cClearDcid(buf); + if (buf->dispmodechange) { + buf->dispmode = ((buf->segnum && + buf->convedsegnum == buf->segnum) ? MODE_KANJI : + (buf->convedsegnum ? MODE_EDIT : buf->inputmode)); + ret |= KEY_MODE_CHANGE; + } + return(ret); +} + +/* + * _Xsj3cQuote() + * + * Set "through flag" + * and input next character unconditionally. + */ +Xsj3cEvent +_Xsj3cQuote(buf) + Xsj3cBuf buf; +{ + Xsj3cEvent ret = KEY_NULL; + + buf->throughflg = QUOTE; + if (buf->dispmodechange) { + buf->dispmode = MODE_QUOTE; + ret |= KEY_MODE_CHANGE; + } +#ifndef THROUGH_CONT + if (!buf->cntrlsame) + ret |= KEY_TEXT_CHANGE; /* dummy */ +#endif /* THROUGH_CONT */ + return (ret); +} + +/* + * _Xsj3cBell() + * + * Rings bell. + */ +Xsj3cEvent +_Xsj3cBell(buf) + Xsj3cBuf buf; +{ +#ifdef THROUGH_CONT + return (KEY_BELL); +#else /* THROUGH_CONT */ + if (buf->cntrlsame) + return (KEY_BELL); + else + return (KEY_TEXT_CHANGE|KEY_BELL); /* dummy */ +#endif /* THROUGH_CONT */ +} + +/* + * _Xsj3cKana() + * + * + * Toggle keyboard input mode between ASCII and Kana. + * + * KanaInputOnly on: Set toggle on in initializing. + */ +Xsj3cEvent +_Xsj3cKana(buf) + Xsj3cBuf buf; +{ + Xsj3cEvent ret = KEY_NULL; + + if ((buf->convmode & DictModeMask)||((buf->convmode & SelectModeMask) + && buf->selectstatus == SELECT_HINSI)) { + buf->dict->seg->n_roma = 0; + buf->dict->seg->n_kana = -1; + *buf->dict->seg->oldstr = '\0'; + *buf->dict->seg->str = '\0'; + buf->dict->seg->sp = buf->dict->seg->str; + } + if (buf->convmode & ~NoInputModeMask) { + buf->input[buf->curseg]->n_roma = 0; + buf->input[buf->curseg]->n_kana = -1; + *buf->input[buf->curseg]->oldstr = '\0'; + *buf->input[buf->curseg]->str = '\0'; + buf->input[buf->curseg]->sp = buf->input[buf->curseg]->str; + } + if (buf->kanaonly) + buf->kanaonly = OFF; + else + buf->kanaonly = ON; +#ifndef THROUGH_CONT + if (!buf->cntrlsame) + ret |= KEY_TEXT_CHANGE; /* dummy */ +#endif /* THROUGH_CONT */ + return ret; +} + +/* + * _Xsj3cSjrc() + * + * Reset customize. + * + * NextRCFile filename: Set file name to read next. + */ +Xsj3cEvent +_Xsj3cSjrc(buf) + Xsj3cBuf buf; +{ + Xsj3cEvent ret = (KEY_TEXT_CHANGE|KEY_MODE_CHANGE); + register int i; + + if (buf->dispmodechange) { + ret |= KEY_MODE_CHANGE; + buf->dispmode = buf->inputmode; + } + switch(buf->convmode) { + case ConvedModeMask: + buf->n_select = 0; + if (buf->candidate) + Xsj3cEndCandidate(buf, OFF); + case InputModeMask: + break; + case SelectModeMask: + buf->n_select = 0; + if (buf->flusheconv) + ret |= KEY_SELECT_END; + else + ret |= KEY_SELECT_ABORT; + if (buf->candidate) + Xsj3cEndCandidate(buf, OFF); + break; + case DictModeMask: + ret |= KEY_DICT_END; + break; + case NoInputModeMask: + default: + break; + } + if (buf->flusheconv) { + ret |= KEY_TEXT_FIXED; + if (buf->gakusyuu) + _Xsj3cFlushDcid(buf); + } else { + for (i = 1; i < buf->segnum + 1; i++) { + Xsj3cFreeSegment(buf->input[i]); + buf->input[i] = NULL; + } + if (buf->input[0]) + Xsj3cClearSegment(buf, buf->input[0]); + buf->segnum = 0; + buf->curseg = 0; + } + if (buf->setnormal) { + free(buf->setnormal); + buf->setnormal = NULL; + } + if (buf->throughnext) { + free(buf->throughnext); + buf->throughnext = NULL; + } + Xsj3cRCInit(buf, NULL, NULL); + return ret; +} + +/* + * _Xsj3cKill() + * + * Exit. + */ +Xsj3cEvent +_Xsj3cKill(buf) + Xsj3cBuf buf; +{ + /* Not Yet */ + return (KEY_NULL); +} + +/* + * _Xsj3cNull() + * + * Does nothing. + */ +Xsj3cEvent +_Xsj3cNull(buf) + Xsj3cBuf buf; +{ + return (KEY_NULL|KEY_CONTROL); +} + +/* + * _Xsj3cIgnore() + * + * Does nothing. + */ +Xsj3cEvent +_Xsj3cIgnore(buf) + Xsj3cBuf buf; +{ + return (KEY_NULL|KEY_CONTROL); +} diff -r 000000000000 -r 92745d501b9a lib/Xsj3clib/func.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/Xsj3clib/func.h Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,97 @@ +/* $Id: func.h,v 2.0 1992/02/13 18:33:24 nao Exp $ */ +/* + * Copyright 1991 Sony Corporation + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Sony not be used in advertising or + * publicity pertaining to distribution of the software without specific, + * written prior permission. Sony makes no representations about the + * suitability of this software for any purpose. It is provided "as is" + * without express or implied warranty. + * + * SONY DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL SONY + * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ +/* + * Author: Naoshi Suzuki, SONY Corporation. (nao@sm.sony.co.jp) + */ + +extern Xsj3cEvent _Xsj3cConvert(); +extern Xsj3cEvent _Xsj3cUnConvert(); +extern Xsj3cEvent _Xsj3cFix(); +extern Xsj3cEvent _Xsj3cReturn(); + +extern Xsj3cEvent _Xsj3cModeHAlpha(); +extern Xsj3cEvent _Xsj3cModeZAlpha(); +extern Xsj3cEvent _Xsj3cModeHKata(); +extern Xsj3cEvent _Xsj3cModeZKata(); +extern Xsj3cEvent _Xsj3cModeHira(); +extern Xsj3cEvent _Xsj3cToHAlpha(); +extern Xsj3cEvent _Xsj3cToZAlpha(); +extern Xsj3cEvent _Xsj3cToHKata(); +extern Xsj3cEvent _Xsj3cToZKata(); +extern Xsj3cEvent _Xsj3cToHira(); +extern Xsj3cEvent _Xsj3cZenkaku(); +extern Xsj3cEvent _Xsj3cHankaku(); +extern Xsj3cEvent _Xsj3cToUpper(); +extern Xsj3cEvent _Xsj3cToLower(); +extern Xsj3cEvent _Xsj3cModeSJIS(); +extern Xsj3cEvent _Xsj3cModeEUC(); +extern Xsj3cEvent _Xsj3cModeJIS(); +extern Xsj3cEvent _Xsj3cModeKuten(); +extern Xsj3cEvent _Xsj3cCodeRollDown(); +extern Xsj3cEvent _Xsj3cModeRollDown(); +extern Xsj3cEvent _Xsj3cModeRollUp(); +extern Xsj3cEvent _Xsj3cNextMode(); +extern Xsj3cEvent _Xsj3cPrevMode(); +extern Xsj3cEvent _Xsj3cModeToggle(); + +extern Xsj3cEvent _Xsj3cForward(); +extern Xsj3cEvent _Xsj3cBackward(); +extern Xsj3cEvent _Xsj3cTop(); +extern Xsj3cEvent _Xsj3cEnd(); +extern Xsj3cEvent _Xsj3cUp(); +extern Xsj3cEvent _Xsj3cDown(); +extern Xsj3cEvent _Xsj3cFirst(); +extern Xsj3cEvent _Xsj3cLast(); +extern Xsj3cEvent _Xsj3cNextPage(); +extern Xsj3cEvent _Xsj3cPrevPage(); +extern Xsj3cEvent _Xsj3cPrev(); +extern Xsj3cEvent _Xsj3cNext(); +extern Xsj3cEvent _Xsj3cSelect(); +extern Xsj3cEvent _Xsj3cCancel(); + +extern Xsj3cEvent _Xsj3cExpand(); +extern Xsj3cEvent _Xsj3cShrink(); + +extern Xsj3cEvent _Xsj3cBackSpace(); +extern Xsj3cEvent _Xsj3cDelete(); +extern Xsj3cEvent _Xsj3cDelAfter(); + +extern Xsj3cEvent _Xsj3cStart(); +extern Xsj3cEvent _Xsj3cReConnect(); +extern Xsj3cEvent _Xsj3cReConvert(); +extern Xsj3cEvent _Xsj3cEdit(); + +extern Xsj3cEvent _Xsj3cDRegBegin(); +extern Xsj3cEvent _Xsj3cDClearBegin(); + +extern Xsj3cEvent _Xsj3cSymbolBegin(); + +extern Xsj3cEvent _Xsj3cQuote(); +extern Xsj3cEvent _Xsj3cFlushBefore(); +extern Xsj3cEvent _Xsj3cBell(); +extern Xsj3cEvent _Xsj3cKana(); +extern Xsj3cEvent _Xsj3cSjrc(); +extern Xsj3cEvent _Xsj3cKill(); +extern Xsj3cEvent _Xsj3cNull(); +extern Xsj3cEvent _Xsj3cIgnore(); + +extern Xsj3cEvent _Xsj3cUnConvSeg(); diff -r 000000000000 -r 92745d501b9a lib/Xsj3clib/libif.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/Xsj3clib/libif.c Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,59 @@ +#ifndef lint +static char *rcsid = "$Id: libif.c,v 2.0 1992/02/13 18:33:26 nao Exp $"; +#endif +/* + * Copyright 1991 Sony Corporation + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Sony not be used in advertising or + * publicity pertaining to distribution of the software without specific, + * written prior permission. Sony makes no representations about the + * suitability of this software for any purpose. It is provided "as is" + * without express or implied warranty. + * + * SONY DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL SONY + * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ +/* + * Author: Naoshi Suzuki, SONY Corporation. (nao@sm.sony.co.jp) + */ + +#include "common.h" + +extern int sj3_open(); +extern int sj3_close(); +extern int sj3_getkan(); +extern int sj3_douoncnt(); +extern int sj3_getdouon(); +extern int sj3_touroku(); +extern int sj3_syoukyo(); +extern int sj3_gakusyuu(); +extern int sj3_gakusyuu2(); +extern int sj3_lockserv(); +extern int sj3_unlockserv(); + +Xsj3cCVServerIF serverIF[SERVER_NUM] = { + { + JP_SJIS, + { + sj3_open, + sj3_close, + sj3_getkan, + sj3_douoncnt, + sj3_getdouon, + sj3_touroku, + sj3_syoukyo, + sj3_gakusyuu, + sj3_gakusyuu2, + sj3_lockserv, + sj3_unlockserv + } + } +}; diff -r 000000000000 -r 92745d501b9a lib/Xsj3clib/mode.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/Xsj3clib/mode.c Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,1194 @@ +#ifndef lint +static char *rcsid = "$Id: mode.c,v 2.6 1993/01/06 10:58:18 nao Exp $"; +#endif +/* + * Copyright 1991 Sony Corporation + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Sony not be used in advertising or + * publicity pertaining to distribution of the software without specific, + * written prior permission. Sony makes no representations about the + * suitability of this software for any purpose. It is provided "as is" + * without express or implied warranty. + * + * SONY DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL SONY + * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ +/* + * Author: Naoshi Suzuki, SONY Corporation. (nao@sm.sony.co.jp) + */ + +#include +#include "common.h" +#include "sj3ctype.h" +#include "util.h" + +extern Xsj3cCVServerIF serverIF[SERVER_NUM]; + +Xsj3cEvent _Xsj3cModeChange(); +Xsj3cEvent _Xsj3cModeClear(); +Xsj3cEvent Xsj3cModeConv(); + +void _Xsj3cHiraToZKata(); +void _Xsj3cHankakuToHira(); +void _Xsj3cHankakuToZKata(); +void _Xsj3cHKataToHira(); +void _Xsj3cHKataToZKata(); +void _Xsj3cZKanaToHKata(); +void _Xsj3cZKataToHira(); +void _Xsj3cHAlphaToZAlpha(); +void _Xsj3cHAlphaToZKana(); +void _Xsj3cHAlphaToHKata(); +void _Xsj3cZAlphaToHAlpha(); + +static void _Xsj3cLowerToUpper(); +static void _Xsj3cUpperToLower(); +static void _Xsj3cRKConvs(); +static void _Xsj3cKRConvs(); + +/* + * _Xsj3cModeChange() + * + * Change current character mode to apointed mode(secound argument) + */ +Xsj3cEvent +_Xsj3cModeChange(buf, mode, conv) + Xsj3cBuf buf; + Xsj3csMode mode; + Xsj3cFlag conv; +{ + Xsj3cEvent ret; + unsigned char *mbs; + + if (buf->convmode != SelectModeMask) { + if (conv) { + Xsj3cSeg seg = buf->input[buf->curseg]; + + if ((mbs = (unsigned char *) + malloc(seg->size * 2 * sizeof(wchar))) == NULL) + Xsj3cError("Cannot allocate for mode conversion buffer"); + _Xsj3cwPStomPS(buf, mbs, seg->yomi); + if ((ret = Xsj3cModeConv(buf, mbs, mode, seg->size)) + & KEY_TEXT_CHANGE) { + seg->num = _Xsj3cmPStowPSn(buf, seg->yomi, mbs, seg->size); + if (seg->num > seg->size - YBUFSIZ) { + Xsj3cResizeSegment(seg, seg->size * 2); + seg->num = _Xsj3cmPStowPS(buf, seg->yomi, mbs); + } + seg->cur = seg->num; + _Xsj3cStoreYomi(buf, seg, 0); + seg->change = OFF; + seg->cursegmode = mode; + } + free(mbs); + } else { + if (buf->inputmode != mode) { + buf->dispmode = buf->inputmode = mode; + return (_Xsj3cModeClear(buf)); + } else { +#ifdef THROUGH_CONT + return (KEY_NULL); +#else /* THROUGH_CONT */ + if (buf->cntrlsame) + return (KEY_NULL); + else + return (KEY_TEXT_CHANGE); /* dummy */ +#endif /* THROUGH_CONT */ + } + } + return ret; + } else { + return (KEY_BELL); + } +} + +/* + * _Xsj3cModeClear() + * Clear romaji/kana buffer after changing mode. + */ +Xsj3cEvent +_Xsj3cModeClear(buf) + Xsj3cBuf buf; +{ + register Xsj3cSeg seg = buf->input[buf->curseg]; + + if (!seg) + return (KEY_MODE_CHANGE); + *seg->str = '\0'; + seg->sp = seg->str; + seg->n_roma = 0; + seg->n_kana = -1; + *seg->oldstr = '\0'; + seg->oldlen = 0; + seg->value = 0; + seg->change = OFF; + seg->cursegmode = MODE_HIRA; + if (buf->flushaconv) + return (KEY_MODE_CHANGE|KEY_TEXT_CLEAR); + else + return (KEY_MODE_CHANGE); +} + +/* + * Xsj3cModeConv() + * Convert current segment to appointed character mode. + */ +Xsj3cEvent +Xsj3cModeConv(buf, string, postmode, size) + Xsj3cBuf buf; + unsigned char *string; + Xsj3csMode postmode; + int size; +{ + Xsj3cEvent ret = KEY_NULL; + unsigned char *tmp1, *tmp2; + + if ((tmp1 = (unsigned char *)malloc(size * 2 * sizeof(wchar))) == NULL) + Xsj3cError("Cannot allocate for mode conversion buffer"); + if ((tmp2 = (unsigned char *)malloc(size * 2 * sizeof(wchar))) == NULL) + Xsj3cError("Cannot allocate for mode conversion buffer"); + + switch (postmode) { + case MODE_HIRA: + _Xsj3cZKanaToHKata(buf, tmp2, string); + _Xsj3cHKataToHira(buf, tmp1, tmp2); + _Xsj3cKRConvs(buf, tmp2, tmp1); + _Xsj3cRKConvs(buf, tmp1, tmp2); + if (buf->alphaconv) + _Xsj3cHankakuToHira(buf, string, tmp1); + else + _Xsj3cZKataToHira(buf, string, tmp1); + ret = KEY_TEXT_CHANGE; + break; + + case MODE_ZKATA: + _Xsj3cZKanaToHKata(buf, tmp2, string); + _Xsj3cHKataToHira(buf, tmp1, tmp2); + _Xsj3cKRConvs(buf, tmp2, tmp1); + _Xsj3cRKConvs(buf, tmp1, tmp2); + if (buf->alphaconv) { + _Xsj3cHiraToZKata(buf, tmp2, tmp1); + _Xsj3cHAlphaToZAlpha(buf, string, tmp2); + } else + _Xsj3cHiraToZKata(buf, string, tmp1); + ret = KEY_TEXT_CHANGE; + break; + + case MODE_HKATA: + _Xsj3cHKataToHira(buf, tmp1, string); + _Xsj3cKRConvs(buf, tmp2, tmp1); + _Xsj3cRKConvs(buf, tmp1, tmp2); + _Xsj3cZKanaToHKata(buf, string, tmp1); + ret = KEY_TEXT_CHANGE; + break; + + case MODE_HALPHA: + _Xsj3cZAlphaToHAlpha(buf, tmp2, string); + _Xsj3cRKConvs(buf, tmp1, tmp2); + _Xsj3cZKanaToHKata(buf, tmp2, tmp1); + _Xsj3cHKataToHira(buf, tmp1, tmp2); + _Xsj3cKRConvs(buf, string, tmp1); + ret = KEY_TEXT_CHANGE; + break; + + case MODE_ZALPHA: + _Xsj3cZAlphaToHAlpha(buf, tmp2, string); + _Xsj3cRKConvs(buf, tmp1, tmp2); + _Xsj3cZKanaToHKata(buf, tmp2, tmp1); + _Xsj3cHKataToHira(buf, tmp1, tmp2); + _Xsj3cKRConvs(buf, tmp2, tmp1); + _Xsj3cHAlphaToZAlpha(buf, string, tmp2); + ret = KEY_TEXT_CHANGE; + break; + + case MODE_HANKAKU: + _Xsj3cZKanaToHKata(buf, tmp1, string); + strcpy(string, tmp1); + ret = KEY_TEXT_CHANGE; + break; + + case MODE_ZENKAKU: + _Xsj3cHankakuToZKata(buf, tmp1, string); + strcpy(string, tmp1); + ret = KEY_TEXT_CHANGE; + break; + + case MODE_UPPER: + _Xsj3cLowerToUpper(buf, string); + ret = KEY_TEXT_CHANGE; + break; + + case MODE_LOWER: + _Xsj3cUpperToLower(buf, string); + ret = KEY_TEXT_CHANGE; + break; + + default: + ret = KEY_BELL; + break; + } + free(tmp1); + free(tmp2); + return (ret); +} + +/* + * _Xsj3cRKConvs() + * Convert romaji to kana in 3rd argument and set to 2nd argument. + */ +static void +_Xsj3cRKConvs(buf, yomi, alpha) + Xsj3cBuf buf; + unsigned char *yomi; + unsigned char *alpha; +{ + unsigned char *p; + register unsigned char *q, *yp, *t; + register int i = 0, rlen = 0, tflg = 0, value; + unsigned char rbuf[RBUFSIZ]; + unsigned char ybuf[YBUFSIZ]; + + yp = yomi; + p = rbuf; + rlen = 0; + + while (*alpha != '\0') { + if (iskan1(*alpha, serverIF[buf->server].lang) + && iskan2(*(alpha + 1), serverIF[buf->server].lang)) { + *yp++ = *alpha++; + *yp++ = *alpha++; + i++; + continue; + } else if (!isascii(*alpha)) { + *yp++ = *alpha++; + i++; + continue; + } + if (i) { + rlen = 0; + p = rbuf; + i = 0; + } + + *p = *alpha++; + *(p + 1) = '\0'; + if (*alpha == '\0') { + t = buf->rkdouble; + while (*t != '\0') { + if (p > rbuf && *(p - 1) == *t) { + break; + } else if (*t == *p) { + *(p + 1) = *p; + *(p + 2) = '\0'; + tflg++; + break; + } + t++; + } + } + if ((value = _Xsj3cRomaConv(buf->rktable, rbuf, ybuf)) > 0) { + q = ybuf; + yp -= rlen; + while (*q != '\0') { + *yp++ = *q++; + } + p = rbuf; + rlen = 0; + while (*p != '\0' && !tflg) { + *yp++ = *p++; + rlen++; + } + } else if (value < 0) { + if ((value = _Xsj3cRomaConv(buf->rktable, p, ybuf)) > 0) { + q = ybuf; + while (*q != '\0') { + *yp++ = *q++; + } + rlen = 0; + while (*p != '\0' && !tflg) { + *yp++ = *p++; + rlen++; + } + } else if (value < 0) { + *yp++ = *p; + rlen = 0; + p = rbuf; + } else { + *yp++ = *p; + q = rbuf; + *q++ = *p++; + *q = '\0'; + rlen = 1; + } + } else { + *yp++ = *p++; + if (rlen++ > 3) { /* non-convert limit = 4: you can change this */ + rlen = 0; + p = rbuf; + } + } + } + *yp = '\0'; +} + +static void +_Xsj3cKRConvs(buf, roma, kana) + Xsj3cBuf buf; + register unsigned char *roma; + register unsigned char *kana; +{ + register unsigned char c, *p, *q, *r, *sp, *t, *d; + register wchar s; + register Xsj3cRKTable *rktp; + register Xsj3cHKTable *hktp; + register Xsj3cZHTable *zhtp; + register int ylen, plen, rlen, i, cont = 0; + register int zenflg = 0, plosflg = 0; + unsigned char tyomi[KANABUFSIZ]; + unsigned char tmp[RBUFSIZ]; + + p = tyomi; + while ((c = *kana++) != '\0') { + if (iskan1(c, serverIF[buf->server].lang) + && iskan2(*kana, serverIF[buf->server].lang)) { + s = (c << 8) + *kana; + if (iskata(s, serverIF[buf->server].lang)) { + for (hktp = buf->hktable; hktp != NULL; hktp = hktp->next) { + if (c == *hktp->zkata) + if (*kana == *(hktp->zkata + 1)) + break; + } + if (hktp != NULL) { + *p++ = *hktp->hira; + *p++ = *(hktp->hira + 1); + } else { + *p++ = c; + *p++ = *kana; + Xsj3cWarning("wrong sjhk table"); + } + + } else if (!ishira(s, serverIF[buf->server].lang)) { + for (zhtp = buf->zhtable; zhtp != NULL; zhtp = zhtp->next) { + if (c == *zhtp->zkana) + if (*kana == *(zhtp->zkana + 1)) + break; + } + if (zhtp != NULL) { + *p++ = *zhtp->halpha; + } else { + for (zhtp = buf->zhtable; zhtp != NULL; zhtp = zhtp->next) { + if (c == *zhtp->zalpha) { + if (*kana == *(zhtp->zalpha + 1)) + break; + } + } + if (zhtp != NULL) { + *p++ = *zhtp->halpha; + } else { + Xsj3cWarning("can't convert to halpha %#x",s); + *p++ = c; + *p++ = *kana; + } + } + } else { + *p++ = c; + *p++ = *kana; + } + kana++; + } else { + *p++ = c; + } + } + *p = '\0'; + p = tyomi; + plen = strlen(tyomi); + + while ((c = *p) != '\0') { + if (iskan1(c, serverIF[buf->server].lang) + && iskan2(*(p + 1), serverIF[buf->server].lang)) { + /* Multi-byte character */ + q = tmp; + *q = '\0'; + ylen = 0; + for (rktp = buf->rktable; rktp->next != NULL; rktp = rktp->next) { + if (ylen < rktp->ylen) { + if (plen >= rktp->ylen + && !strncmp(rktp->yomi, p, rktp->ylen)) { + ylen = rktp->ylen; + plosflg = 0; + if (*(sp = rktp->str) != '\0') { + /* Leaving any character case */ + if (t = buf->plosive) { + while (*t != '\0') { + if (*t++ == *sp) { + plosflg = 1; + break; + } + } + if (plosflg) { + if (*(p + 2) == '\0') { + /* Last of the segment: */ + /* continue to search */ + plosflg = 0; + ylen = 0; + continue; + } else if (iskan1(*(p + 2), + serverIF[buf->server].lang) + && iskan2(*(p + 3), + serverIF[buf->server].lang)) { + /* Next character is zvowel: */ + /* continue to search */ + if (iszvowel((*(p + 2) << 8) | *(p + 3), + serverIF[buf->server].lang)){ + plosflg = 0; + ylen = 0; + continue; + } + } else if (isvowel(*(p + 2))) { + /* Next character is vowel: */ + /* continue to search */ + plosflg = 0; + ylen = 0; + continue; + } + } + } + strcpy(tmp, rktp->roma); + /* Reduce leaved character */ + i = 1; + while (*(++sp) != '\0') + i++; + r = (q + rktp->rlen); + while (*(--sp) == *(--r) && (--i)); + *r = '\0'; + } else if (d = buf->rkdouble) { + /* Double defined by a same character case */ + strcpy(tmp, rktp->roma); + while (*d != '\0') { + if (*d++ == *q) { + if (*q == *(q + 1)) { + /* Last of the segment */ + if (*(p + 2) == '\0') + *(q + 1) = '\0'; + } else if (*(q + 1) == '\0') { + /* Single case: continue to search */ + ylen = 0; + } + break; + } + } + } else { + strcpy(tmp, rktp->roma); + } + } + } + } + if (ylen > 0) { + /* Succeeded in converting. */ + if (!zenflg && !plosflg && !isvowel(*q) + && p > tyomi && (t = buf->plosive)) { + /* Same as plosive table first character */ + if (*t == *(p - 1)) + cont++; + } + if (plosflg) { + cont++; + } else if (cont && !isvowel(*q)) { + /* Correct consonant character of previous plosive */ + sp = roma; + while (cont--) + *(--sp) = *q; + cont = 0; + } else if (cont) { + cont = 0; + } + /* Copy characters to output string */ + plen -= ylen; + p += ylen; + while (*q != '\0') + *roma++ = *q++; + } else { + /* Failed to convert. */ + cont = 0; + /* Normal japanese character(except gaiji) is 2byte. */ + *roma++ = *p++; + *roma++ = *p++; + plen -= 2; + } + zenflg++; + } else { + /* Non multi-byte character */ + sp = p; + while (*sp != '\0' && !(iskan1(*sp, serverIF[buf->server].lang) + && iskan2(*(sp + 1), serverIF[buf->server].lang))) { + sp++; + } + ylen = sp - p; + i = 0; + for (rktp = buf->rktable; rktp->next != NULL; rktp = rktp->next) { + if (rktp->rlen > i) { + r = p; + t = rktp->roma; + while (r < sp && *r++ == *t++) + ; + if ((rlen = r - p) > i) + i = rlen; + } + } + if (i > 0) { + if (!zenflg && !plosflg && !isvowel(*p) && p > tyomi + && (t = buf->plosive)) { + /* Same as plosive table first character */ + if (*t == *(p - 1)) + cont++; + } + if (cont && !isvowel(*p)) { + /* Correct consonant character of previous plosive */ + sp = roma; + while (cont--) + *(--sp) = *p; + cont = 0; + } else if (cont) { + cont = 0; + } + } + /* Copy characters to output string */ + plen -= ylen; + while (ylen--) + *roma++ = *p++; + zenflg = 0; + plosflg = 0; + } + } + *roma = '\0'; + + if (!zenflg && (r = buf->plosive)) { + p--; + while (*r != '\0') { + if (*r == *p) { + t = buf->plosive; + while (*t != '\0') { + if (p > tyomi && *t == *p && *t == *(p - 1)) { + cont++; + break; + } + t++; + } + break; + } + r++; + } + if (*r != '\0') { + /* Correct consonant character of previous plosive */ + sp = (--roma); + while (cont--) + *(--sp) = *p; + } + } else if (zenflg && cont && plosflg) { + q = tmp; + if (*q != '\0') { + /* Correct consonant character of previous plosive */ + sp = (--roma); + while (cont--) { + if (!isvowel(*(--sp))) + *sp = *q; + } + } + } +} + +void +_Xsj3cHiraToZKata(buf, dest, src) + Xsj3cBuf buf; + register unsigned char *dest, *src; +{ + register wchar s; + register unsigned char c; + register Xsj3cHKTable *hktp; + register Xsj3cZHTable *zhtp; + + while ((c = *src++) != '\0') { + if (iskan1(c, serverIF[buf->server].lang) + && iskan2(*src, serverIF[buf->server].lang)) { + s = (c << 8) + *src; + if (ishira(s, serverIF[buf->server].lang)) { + for (hktp = buf->hktable; hktp != NULL; hktp = hktp->next) { + if (c == *hktp->hira) + if (*src == *(hktp->hira + 1)) + break; + } + if (hktp != NULL) { + *dest++ = *hktp->zkata; + *dest++ = *(hktp->zkata + 1); + } else { + *dest++ = c; + *dest++ = *src; + Xsj3cWarning("wrong sjhk table"); + } + } else { + *dest++ = c; + *dest++ = *src; + } + src++; + } else if (isdakuten(c)) { + for (zhtp = buf->zhtable; zhtp != NULL; zhtp = zhtp->next) { + if (c == *zhtp->hkata) + break; + } + if (zhtp != NULL) { + *dest++ = *zhtp->zkana; + *dest++ = *(zhtp->zkana + 1); + } else { + *dest++ = c; + } + } else { + *dest++ = c; + } + } + *dest = '\0'; +} + +void +_Xsj3cHankakuToHira(buf, dest, src) + Xsj3cBuf buf; + register unsigned char *dest, *src; +{ + register unsigned char c; + register Xsj3cHKTable *hktp; + register Xsj3cZHTable *zhtp; + register int len; + unsigned char tmp[RBUFSIZ]; + + while ((c = *src++) != '\0') { + if (iskan1(c, serverIF[buf->server].lang) + && iskan2(*src, serverIF[buf->server].lang)) { + *dest++ = c; + *dest++ = *src++; + continue; + } + if (iskana(c)) { + len = 0; + for (hktp = buf->hktable; hktp != NULL; hktp = hktp->next) { + if (len < hktp->hlen && c == *hktp->hkata) { + if (hktp->hlen > 1) { + if (iskana(*src) && *src == *(hktp->hkata + 1)) { + src++; + len = hktp->hlen; + strcpy(tmp, hktp->hira); + } + } else { + len = 1; + strcpy(tmp, hktp->hira); + } + } + } + if (len) { + strcpy(dest, tmp); + dest += strlen(tmp); + } else { + for (zhtp = buf->zhtable; zhtp != NULL; zhtp = zhtp->next) { + if (c == *zhtp->hkata) + break; + } + if (zhtp != NULL) { + *dest++ = *zhtp->zkana; + *dest++ = *(zhtp->zkana + 1); + } else { + *dest++ = c; + } + } + } else { + for (zhtp = buf->zhtable; zhtp != NULL; zhtp = zhtp->next) { + if (c == *zhtp->hkata) + break; + } + if (zhtp != NULL) { + *dest++ = *zhtp->zkana; + *dest++ = *(zhtp->zkana + 1); + } else { + *dest++ = c; + } + } + } + *dest = '\0'; +} + +void +_Xsj3cHankakuToZKata(buf, dest, src) + Xsj3cBuf buf; + register unsigned char *dest, *src; +{ + register unsigned char c; + register Xsj3cHKTable *hktp; + register Xsj3cZHTable *zhtp; + register int len; + unsigned char tmp[RBUFSIZ]; + + while ((c = *src++) != '\0') { + if (iskan1(c, serverIF[buf->server].lang) + && iskan2(*src, serverIF[buf->server].lang)) { + *dest++ = c; + *dest++ = *src++; + continue; + } + if (iskana(c)) { + len = 0; + for (hktp = buf->hktable; hktp != NULL; hktp = hktp->next) { + if (len < hktp->hlen && c == *hktp->hkata) { + if (hktp->hlen > 1) { + if (iskana(*src) && *src == *(hktp->hkata + 1)) { + src++; + strcpy(tmp, hktp->zkata); + len = hktp->hlen; + } + } else { + strcpy(tmp, hktp->zkata); + len = hktp->hlen; + } + } + } + if (len) { + strcpy(dest, tmp); + dest += strlen(tmp); + } else { + for (zhtp = buf->zhtable; zhtp != NULL; zhtp = zhtp->next) { + if (c == *zhtp->hkata) + break; + } + if (zhtp != NULL) { + *dest++ = *zhtp->zkana; + *dest++ = *(zhtp->zkana + 1); + } else { + *dest++ = c; + } + } + } else { + for (zhtp = buf->zhtable; zhtp != NULL; zhtp = zhtp->next) { + if (c == *zhtp->hkata) + break; + } + if (zhtp != NULL) { + *dest++ = *zhtp->zkana; + *dest++ = *(zhtp->zkana + 1); + } else { + *dest++ = c; + } + } + } + *dest = '\0'; +} + +void +_Xsj3cHKataToHira(buf, dest, src) + Xsj3cBuf buf; + register unsigned char *dest, *src; +{ + register unsigned char c; + register Xsj3cHKTable *hktp; + register Xsj3cZHTable *zhtp; + register int len; + unsigned char tmp[RBUFSIZ]; + + while ((c = *src++) != '\0') { + if (iskan1(c, serverIF[buf->server].lang) + && iskan2(*src, serverIF[buf->server].lang)) { + *dest++ = c; + *dest++ = *src++; + continue; + } + if (iskana(c)) { + len = 0; + for (hktp = buf->hktable; hktp != NULL; hktp = hktp->next) { + if (len < hktp->hlen && c == *hktp->hkata) { + if (hktp->hlen > 1) { + if (iskana(*src) && *src == *(hktp->hkata + 1)) { + src++; + len = hktp->hlen; + strcpy(tmp, hktp->hira); + } + } else { + len = 1; + strcpy(tmp, hktp->hira); + } + } + } + if (len) { + strcpy(dest, tmp); + dest += strlen(tmp); + } else { + for (zhtp = buf->zhtable; zhtp != NULL; zhtp = zhtp->next) { + if (c == *zhtp->hkata) + break; + } + if (zhtp != NULL) { + *dest++ = *zhtp->zkana; + *dest++ = *(zhtp->zkana + 1); + } else { + *dest++ = c; + } + } + } else { + *dest++ = c; + } + } + *dest = '\0'; +} + +void +_Xsj3cHKataToZKata(buf, dest, src) + Xsj3cBuf buf; + register unsigned char *dest, *src; +{ + register unsigned char c; + register Xsj3cHKTable *hktp; + register Xsj3cZHTable *zhtp; + register int len; + unsigned char tmp[RBUFSIZ]; + + while ((c = *src++) != '\0') { + if (iskan1(c, serverIF[buf->server].lang) + && iskan2(*src, serverIF[buf->server].lang)) { + *dest++ = c; + *dest++ = *src++; + continue; + } + if (iskana(c)) { + len = 0; + for (hktp = buf->hktable; hktp != NULL; hktp = hktp->next) { + if (len < hktp->hlen && c == *hktp->hkata) { + if (hktp->hlen > 1) { + if (iskana(*src) && *src == *(hktp->hkata + 1)) { + src++; + strcpy(tmp, hktp->zkata); + len = hktp->hlen; + } + } else { + strcpy(tmp, hktp->zkata); + len = hktp->hlen; + } + } + } + if (len) { + strcpy(dest, tmp); + dest += strlen(tmp); + } else { + for (zhtp = buf->zhtable; zhtp != NULL; zhtp = zhtp->next) { + if (c == *zhtp->hkata) + break; + } + if (zhtp != NULL) { + *dest++ = *zhtp->zkana; + *dest++ = *(zhtp->zkana + 1); + } else { + *dest++ = c; + } + } + } else { + *dest++ = c; + } + } + *dest = '\0'; +} + + +void +_Xsj3cZKanaToHKata(buf, dest, src) + Xsj3cBuf buf; + register unsigned char *dest, *src; +{ + register unsigned char c; + register wchar s; + register Xsj3cHKTable *hktp; + register Xsj3cZHTable *zhtp; + + while ((c = *src++) != '\0') { + if (iskan1(c, serverIF[buf->server].lang) + && iskan2(*src, serverIF[buf->server].lang)) { + s = (c << 8) + *src; + if (ishira(s, serverIF[buf->server].lang)) { + for (hktp = buf->hktable; hktp != NULL; hktp = hktp->next) { + if (c == *hktp->hira) + if (*src == *(hktp->hira + 1)) + break; + } + if (hktp != NULL) { + *dest++ = *hktp->hkata; + if (hktp->hlen > 1) + *dest++ = *(hktp->hkata + 1); + } else { + *dest++ = c; + *dest++ = *src; + Xsj3cWarning("wrong sjhk table"); + } + } else if (iskata(s, serverIF[buf->server].lang)) { + for (hktp = buf->hktable; hktp != NULL; hktp = hktp->next) { + if (c == *hktp->zkata) + if (*src == *(hktp->zkata + 1)) + break; + } + if (hktp != NULL) { + *dest++ = *hktp->hkata; + if (hktp->hlen > 1) + *dest++ = *(hktp->hkata + 1); + } else { + *dest++ = c; + *dest++ = *src; + Xsj3cWarning("wrong sjhk table"); + } + } else { + for (zhtp = buf->zhtable; zhtp != NULL; zhtp = zhtp->next) { + if (c == *zhtp->zkana) + if (*src == *(zhtp->zkana + 1)) + break; + } + if (zhtp != NULL) { + *dest++ = *zhtp->hkata; + } else { + for (zhtp = buf->zhtable; zhtp != NULL; zhtp = zhtp->next) { + if (c == *zhtp->zalpha) + if (*src == *(zhtp->zalpha + 1)) + break; + } + if (zhtp != NULL) { + *dest++ = *zhtp->hkata; + } else { + *dest++ = c; + *dest++ = *src; + } + } + } + src++; + } else { + *dest++ = c; + } + } + *dest = '\0'; +} + +void +_Xsj3cZKataToHira(buf, dest, src) + Xsj3cBuf buf; + register unsigned char *dest, *src; +{ + register wchar s; + register unsigned char c; + register Xsj3cHKTable *hktp; + register Xsj3cZHTable *zhtp; + + while ((c = *src++) != '\0') { + if (iskan1(c, serverIF[buf->server].lang) + && iskan2(*src, serverIF[buf->server].lang)) { + s = (c << 8) + *src; + if (iskata(s, serverIF[buf->server].lang)) { + for (hktp = buf->hktable; hktp != NULL; hktp = hktp->next) { + if (c == *hktp->zkata) + if (*src == *(hktp->zkata + 1)) + break; + } + if (hktp != NULL) { + *dest++ = *hktp->hira; + *dest++ = *(hktp->hira + 1); + } else { + *dest++ = c; + *dest++ = *src; + Xsj3cWarning("wrong sjhk table"); + } + } else { + *dest++ = c; + *dest++ = *src; + } + src++; + } else if (isdakuten(c)) { + for (zhtp = buf->zhtable; zhtp != NULL; zhtp = zhtp->next) { + if (c == *zhtp->hkata) + break; + } + if (zhtp != NULL) { + *dest++ = *zhtp->zkana; + *dest++ = *(zhtp->zkana + 1); + } else { + *dest++ = c; + } + } else { + *dest++ = c; + } + } + *dest = '\0'; +} + +void +_Xsj3cHAlphaToZAlpha(buf, dest, src) + Xsj3cBuf buf; + register unsigned char *dest, *src; +{ + register unsigned char c; + register Xsj3cZHTable *zhtp; + + while ((c = *src++) != '\0') { + if (iskan1(c, serverIF[buf->server].lang) + && iskan2(*src, serverIF[buf->server].lang)) { + *dest++ = c; + *dest++ = *src++; + continue; + } + for (zhtp = buf->zhtable; zhtp != NULL; zhtp = zhtp->next) { + if (c == *zhtp->halpha) + break; + } + if (zhtp != NULL) { + *dest++ = *zhtp->zalpha; + *dest++ = *(zhtp->zalpha + 1); + } else { + *dest++ = c; + } + } + *dest = '\0'; +} + +void +_Xsj3cHAlphaToZKana(buf, dest, src) + Xsj3cBuf buf; + register unsigned char *dest, *src; +{ + register unsigned char c; + register Xsj3cZHTable *zhtp; + + while ((c = *src++) != '\0') { + if (iskan1(c, serverIF[buf->server].lang) + && iskan2(*src, serverIF[buf->server].lang)) { + *dest++ = c; + *dest++ = *src++; + continue; + } + for (zhtp = buf->zhtable; zhtp != NULL; zhtp = zhtp->next) { + if (c == *zhtp->halpha) + break; + } + if (zhtp != NULL) { + *dest++ = *zhtp->zkana; + *dest++ = *(zhtp->zkana + 1); + } else { + *dest++ = c; + } + } + *dest = '\0'; +} + +void +_Xsj3cHAlphaToHKata(buf, dest, src) + Xsj3cBuf buf; + register unsigned char *dest, *src; +{ + register unsigned char c; + register Xsj3cHKTable *hktp; + + while ((c = *src++) != '\0') { + if (iskan1(c, serverIF[buf->server].lang) + && iskan2(*src, serverIF[buf->server].lang)) { + *dest++ = c; + *dest++ = *src++; + continue; + } + for (hktp = buf->hktable; hktp != NULL; hktp = hktp->next) { + if (c == *hktp->halpha) + break; + } + if (hktp != NULL) { + *dest++ = *hktp->hkata; + } else { + *dest++ = c; + } + } + *dest = '\0'; +} + +void +_Xsj3cZAlphaToHAlpha(buf, dest, src) + Xsj3cBuf buf; + register unsigned char *dest, *src; +{ + register unsigned char c; + register Xsj3cZHTable *zhtp; + + while ((c = *src++) != '\0') { + if (iskan1(c, serverIF[buf->server].lang) + && iskan2(*src, serverIF[buf->server].lang)) { + for (zhtp = buf->zhtable; zhtp != NULL; zhtp = zhtp->next) { + if (c == *zhtp->zalpha) + if (*src == *(zhtp->zalpha + 1)) + break; + } + if (zhtp != NULL) { + *dest++ = *zhtp->halpha; + } else { + *dest++ = c; + *dest++ = *src; + } + src++; + } else { + *dest++ = c; + } + } + *dest = '\0'; +} + +static void +_Xsj3cLowerToUpper(buf, str) + Xsj3cBuf buf; + register unsigned char *str; +{ + register unsigned char c; + register wchar s; + + while ((c = *str++) != '\0') { + if (iskan1(c, serverIF[buf->server].lang) + && iskan2(*str, serverIF[buf->server].lang)) { + s = (c << 8) + *str; + if (iszlower(s, serverIF[buf->server].lang)) { + s -= 0x21; + *(str - 1) = (s >> 8); + *str++ = (s & 0xff); + } else { + str++; + } + continue; + } + if (islower(c)) { + *(str - 1) = toupper(c); + } + } +} + +static void +_Xsj3cUpperToLower(buf, str) + Xsj3cBuf buf; + register unsigned char *str; +{ + register unsigned char c; + register wchar s; + + while ((c = *str++) != '\0') { + if (iskan1(c, serverIF[buf->server].lang) + && iskan2(*str, serverIF[buf->server].lang)) { + s = (c << 8) + *str; + if (iszupper(s, serverIF[buf->server].lang)) { + s += 0x21; + *(str - 1) = (s >> 8); + *str++ = (s & 0xff); + } else { + str++; + } + continue; + } + if (isupper(c)) { + *(str - 1) = tolower(c); + } + } +} diff -r 000000000000 -r 92745d501b9a lib/Xsj3clib/mode.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/Xsj3clib/mode.h Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,38 @@ +/* $Id: mode.h,v 2.0 1992/02/13 18:33:30 nao Exp $ */ +/* + * Copyright 1991 Sony Corporation + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Sony not be used in advertising or + * publicity pertaining to distribution of the software without specific, + * written prior permission. Sony makes no representations about the + * suitability of this software for any purpose. It is provided "as is" + * without express or implied warranty. + * + * SONY DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL SONY + * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ +/* + * Author: Naoshi Suzuki, SONY Corporation. (nao@sm.sony.co.jp) + */ + +extern Xsj3cEvent _Xsj3cModeChange(); +extern Xsj3cEvent _Xsj3cModeClear(); +extern Xsj3cEvent Xsj3cModeConv(); + +extern void _Xsj3cHiraToZKata(); +extern void _Xsj3cHKataToHira(); +extern void _Xsj3cHKataToZKata(); +extern void _Xsj3cZKanaToHKata(); +extern void _Xsj3cZKataToHira(); +extern void _Xsj3cHAlphaToZAlpha(); +extern void _Xsj3cHAlphaToZKana(); +extern void _Xsj3cHAlphaToHKata(); +extern void _Xsj3cZAlphaToHAlpha(); diff -r 000000000000 -r 92745d501b9a lib/Xsj3clib/segment.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/Xsj3clib/segment.c Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,301 @@ +#ifndef lint +static char *rcsid = "$Id: segment.c,v 2.0 1992/02/13 18:33:33 nao Exp $"; +#endif +/* + * Copyright 1991 Sony Corporation + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Sony not be used in advertising or + * publicity pertaining to distribution of the software without specific, + * written prior permission. Sony makes no representations about the + * suitability of this software for any purpose. It is provided "as is" + * without express or implied warranty. + * + * SONY DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL SONY + * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ +/* + * Author: Naoshi Suzuki, SONY Corporation. (nao@sm.sony.co.jp) + */ + +#include "common.h" +#include "util.h" + +Xsj3cSeg Xsj3cCreateSegment(); +void Xsj3cFreeSegment(); +void Xsj3cResizeSegment(); +void Xsj3cClearSegment(); + +int Xsj3cGetSegNum(); +int Xsj3cGetPosition(); +wchar *Xsj3cGetModeStr(); +wchar *Xsj3cGetSeg(); +wchar *Xsj3cGetConvertedStr(); +int Xsj3cGetConvertedLength(); + +/* + * Xsj3cCreateSegment() + * Allocate Xsj3cSeg type structure and initialize all flags and buffers. + */ +Xsj3cSeg +Xsj3cCreateSegment(buf) + Xsj3cBuf buf; +{ + Xsj3cSeg seg; + + if (!(seg = (Xsj3cSeg)malloc(sizeof(Xsj3cSegRec)))) { + return (Xsj3cSeg)NULL; + } + bzero (seg, sizeof(Xsj3cSegRec)); + if (!(seg->str = (unsigned char *)malloc(RBUFSIZ))) { + return (Xsj3cSeg)NULL; + } + *seg->str = '\0'; + seg->sp = seg->str; + if (!(seg->oldstr = (unsigned char *)malloc(RBUFSIZ))) { + return (Xsj3cSeg)NULL; + } + *seg->oldstr = '\0'; + seg->size = 0; + seg->yomi = NULL; + seg->disp = NULL; + Xsj3cResizeSegment(seg, KANABUFSIZ); + seg->n_roma = 0; + seg->n_kana = -1; + seg->value = 0; + seg->oldlen = 0; + seg->num = 0; + seg->cur = 0; + seg->status = SEG_NOCONV; + seg->cursegmode = buf->inputmode; + seg->change = OFF; + seg->edit = SEG_NOEDIT; + bzero(&seg->dcid, sizeof(seg->dcid)); + return(seg); +} + +/* + * Xsj3cFreeSegment() + * Free Xsj3cSeg type structure. + */ +void +Xsj3cFreeSegment(seg) + Xsj3cSeg seg; +{ + if (!seg) + return; + if (seg->str) + free(seg->str); + seg->str = NULL; + if (seg->oldstr) + free(seg->oldstr); + seg->oldstr = NULL; + if (seg->yomi) { + free(seg->yomi); + seg->yomi = NULL; + } + if (seg->disp) { + free(seg->disp); + seg->disp = NULL; + } + seg->size = 0; + free(seg); +} + +/* + * Xsj3cResizeSegment() + * Allocate segment buffers. + */ +void +Xsj3cResizeSegment(seg, size) + Xsj3cSeg seg; + int size; +{ + if (seg->size != size) { + if (seg->yomi) { + if (!(seg->yomi = (wchar *)realloc(seg->yomi, + seg->size * sizeof(wchar)))) { + Xsj3cError("Failed to reallocate yomi buffer"); + } + } else { + if (!(seg->yomi = (wchar *)calloc(KANABUFSIZ, sizeof(wchar)))) { + Xsj3cError("Failed to allocate yomi buffer"); + } + } + if (seg->disp) { + if (!(seg->disp = (wchar *)realloc(seg->disp, + seg->size * sizeof(wchar)))) { + Xsj3cError("Failed to reallocate display buffer"); + } + } else { + if (!(seg->disp = (wchar *)calloc(KANABUFSIZ, sizeof(wchar)))) { + Xsj3cError("Failed to allocate display buffer"); + } + } + seg->size = size; + } +} + +/* + * Xsj3cClearSegment() + * Clear segment. + */ +void +Xsj3cClearSegment(buf, seg) + Xsj3cBuf buf; + Xsj3cSeg seg; +{ + *seg->str = '\0'; + seg->sp = seg->str; + *seg->oldstr = '\0'; + seg->oldlen = 0; + Xsj3cResizeSegment(seg, KANABUFSIZ); + *seg->yomi = '\0'; + *seg->disp = '\0'; + seg->cur = 0; + seg->num = 0; + seg->value = 0; + seg->n_roma = 0; + seg->n_kana = -1; + seg->dnum = 0; + seg->status = SEG_NOCONV; + seg->cursegmode = buf->inputmode; + seg->change = OFF; + seg->edit = SEG_NOEDIT; + bzero(&seg->dcid, sizeof(seg->dcid)); +} + +/* + * Xsj3cGetModeStr() + * Return the strings of current mode guide. + */ +wchar * +Xsj3cGetModeStr(buf, len) + Xsj3cBuf buf; + int *len; +{ + *len = buf->modelen[buf->dispmode]; + return(buf->modestr[buf->dispmode]); +} + +#define CURSOR_VISIBLE 1 +#define CURSOR_UNVISIBLE 0 + +/* + * Xsj3cGetPosition() + * Set current segment number to 2nd argument + * and cursor position to 3rd argument. + */ +int +Xsj3cGetPosition(buf, curseg, pos) + Xsj3cBuf buf; + int *curseg; + int *pos; +{ + if (buf->curseg < buf->segnum) { + *curseg = buf->curseg; + *pos = buf->input[buf->curseg]->cur; + if (buf->input[buf->curseg]->status & SEG_CONVED) + return CURSOR_UNVISIBLE; + else + return CURSOR_VISIBLE; + } else if (buf->curseg > 0) { + *curseg = buf->curseg - 1; + *pos = buf->input[buf->curseg - 1]->dnum; + return CURSOR_VISIBLE; + } else { + *curseg = 0; + *pos = 0; + return CURSOR_UNVISIBLE; + } +} + +/* + * Xsj3cGetSegNum() + * Return the number of segments. + */ +int +Xsj3cGetSegNum(buf) + Xsj3cBuf buf; +{ + return(buf->segnum); +} + +/* + * Xsj3cGetSeg() + * Return the appointed segment in buffers. + */ +wchar * +Xsj3cGetSeg(buf, n, len, attr) + Xsj3cBuf buf; + int n; + int *len; + int *attr; +{ + if (buf->convmode & DictModeMask) { + if (n >= buf->curseg && n <= buf->curseg + buf->dict->n_dict) + *attr = SEG_REVERSED; + else if (buf->convedunderline) + *attr = SEG_UNDER_LINE; + else + *attr = SEG_NORMAL; + } else { + if (n == buf->curseg) { + if (SEG_NOEDIT & buf->input[n]->edit) { + *attr = SEG_REVERSED; + } else { + *attr = SEG_UNDER_LINE; + } + } else { + if (buf->input[n]->status & SEG_NOCONV || buf->convedunderline) { + *attr = SEG_UNDER_LINE; + } else { + *attr = SEG_NORMAL; + } + } + } + *len = buf->input[n]->dnum; + return (buf->input[n]->disp); +} + +/* + * Xsj3cGetConvertedStr() + * Set converted strings in buffer. + */ +wchar * +Xsj3cGetConvertedStr(buf, data) + Xsj3cBuf buf; + wchar *data; +{ + register int i; + + _Xsj3cFlushDcid(buf); + if (buf->candidate) + Xsj3cEndCandidate(buf, ON); + *data = '\0'; + for (i = 0; i < buf->segnum ; i++) + _Xsj3cWcat(data, buf->input[i]->disp); + return (data); +} + +/* + * Xsj3cGetConvertedLength() + * Return length of converted strings. + */ +int +Xsj3cGetConvertedLength(buf) + Xsj3cBuf buf; +{ + register int i, len; + + for (i = 0, len = 0; i < buf->segnum ; i++) + len += buf->input[i]->dnum; + return len; +} diff -r 000000000000 -r 92745d501b9a lib/Xsj3clib/segment.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/Xsj3clib/segment.h Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,29 @@ +/* $Id: segment.h,v 2.0 1992/02/13 18:33:35 nao Exp $ */ +/* + * Copyright 1991 Sony Corporation + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Sony not be used in advertising or + * publicity pertaining to distribution of the software without specific, + * written prior permission. Sony makes no representations about the + * suitability of this software for any purpose. It is provided "as is" + * without express or implied warranty. + * + * SONY DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL SONY + * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ +/* + * Author: Naoshi Suzuki, SONY Corporation. (nao@sm.sony.co.jp) + */ + +extern Xsj3cSeg Xsj3cCreateSegment(); +extern void Xsj3cFreeSegment(); +extern void Xsj3cResizeSegment(); +extern void Xsj3cClearSegment(); diff -r 000000000000 -r 92745d501b9a lib/Xsj3clib/sj3ctype.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/Xsj3clib/sj3ctype.c Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,82 @@ +#ifndef lint +static char *rcsid = "$Id: sj3ctype.c,v 2.2 1993/01/21 10:54:39 nao Exp $"; +#endif +/* + * Copyright 1991 Sony Corporation + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Sony not be used in advertising or + * publicity pertaining to distribution of the software without specific, + * written prior permission. Sony makes no representations about the + * suitability of this software for any purpose. It is provided "as is" + * without express or implied warranty. + * + * SONY DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL SONY + * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ +/* + * Author: Naoshi Suzuki, SONY Corporation. (nao@sm.sony.co.jp) + */ + +#include "common.h" + +unsigned char kan1[4][4] = { + 0x81, 0x9f, 0xe0, 0xfc, + 0xa1, 0xfe, 0xa1, 0xfe, + NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL +}; + +unsigned char kan2[4][4] = { + 0x40, 0x7e, 0x80, 0xfc, + 0xa1, 0xfe, 0xa1, 0xfe, + NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL +}; + +wchar hira[2][2] = { + 0x829f, 0x82f1, + 0xa4a1, 0xa4f3 +}; + +wchar kata[2][3] = { + 0x8340, 0x8396, 0x837f, + 0xa5a1, 0xa5f6, NULL +}; + +wchar zalpha[2][2] = { + 0x8260, 0x829a, + 0xa3c1, 0xa3fa +}; + +wchar zupper[2][2] = { + 0x8260, 0x8279, + 0xa3c1, 0xa3da +}; + +wchar zlower[2][2] = { + 0x8281, 0x829a, + 0xa3e1, 0xa3fa +}; + +wchar zplosive[2][2] = { + 0x82c1, 0x8362, + 0xa4c3, 0xa5c3 +}; + +wchar zdakuten[2][2] = { + 0x814a, 0x814b, + 0xa1ab, 0xa1ac +}; + +wchar zvowel[2][4] = { + 0x829f, 0x82a8, 0x8340, 0x8349, + 0xa4a1, 0xa4aa, 0xa5a1, 0xa5aa +}; diff -r 000000000000 -r 92745d501b9a lib/Xsj3clib/sj3ctype.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/Xsj3clib/sj3ctype.h Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,109 @@ +/* $Id: sj3ctype.h,v 2.2 1992/10/20 08:50:46 nao Exp $ */ +/* + * Copyright 1991 Sony Corporation + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Sony not be used in advertising or + * publicity pertaining to distribution of the software without specific, + * written prior permission. Sony makes no representations about the + * suitability of this software for any purpose. It is provided "as is" + * without express or implied warranty. + * + * SONY DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL SONY + * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ +/* + * Author: Naoshi Suzuki, SONY Corporation. (nao@sm.sony.co.jp) + */ + +#ifndef _sj3ctype_h +#define _sj3ctype_h + +extern unsigned char kan1[4][4]; +extern unsigned char kan2[4][4]; +extern wchar hira[2][2]; +extern wchar kata[2][3]; +extern wchar zalpha[2][2]; +extern wchar zupper[2][2]; +extern wchar zlower[2][2]; +extern wchar zplosive[2][2]; +extern wchar zdakuten[2][2]; +extern wchar zvowel[2][10]; + +#ifndef iskan1 +#define iskan1(c, l) ((kan1[l][0]<=(c) && (c)<=kan1[l][1]) \ + || (kan1[l][2]<=(c) && (c)<=kan1[l][3])) +#endif +#ifndef iskan2 +#define iskan2(c, l) ((kan2[l][0]<=(c) && (c)<=kan2[l][1]) \ + || (kan2[l][2]<=(c) && (c)<=kan2[l][3])) +#endif +#ifndef ishira +#define ishira(c, l) (hira[l][0]<=(c) && (c)<=hira[l][1]) +#endif +#ifndef iskata +#define iskata(c, l) (kata[l][0]<=(c) && (c)<=kata[l][1]\ + && (c)!=kata[l][2]) +#endif +#ifndef iszalpha +#define iszalpha(c, l) (zalpha[l][0]<=(c) && (c)<=zalpha[l][1]) +#endif +#ifndef iszupper +#define iszupper(c, l) (zupper[l][0]<=(c) && (c)<=zupper[l][1]) +#endif +#ifndef iszlower +#define iszlower(c, l) (zlower[l][0]<=(c) && (c)<=zlower[l][1]) +#endif +#ifndef isplosive +#define isplosive(c, l) ((c)==zplosive[l][0] || (c)==zplosive[l][1]) +#endif +#ifndef iszdakuten +#define iszdakuten(c, l) ((c)==zdakuten[l][0] || (c)==zdakuten[l][1]) +#endif +#ifndef iszvowel +#define iszvowel(c, l) ((zvowel[l][0]<=(c) && (c)<=zvowel[l][1]) || \ + (zvowel[l][2]<=(c) && (c)<=zvowel[l][3])) +#endif + +#ifndef issjis1 +#define issjis1(x) ((0x81<=(x) && (x)<=0x9f) || (0xe0<=(x) && (x)<=0xfc)) +#endif +#ifndef issjis2 +#define issjis2(x) ((0x40<=(x) && (x)<=0x7e) || (0x80<=(x) && (x)<=0xfc)) +#endif +#ifdef iskana +#undef iskana +#endif +#define iskana(x) (0xa1<=(x) && (x)<=0xdf) +#ifndef iskana2 +#define iskana2(x) (0xa1<=(x) && (x)<=0xdf) +#endif +#ifndef iseuc +#define iseuc(x) (0xa1<=(x) && (x)<=0xfe) +#endif +#ifndef iseuckana +#define iseuckana(x) ((x)==0x8e) +#endif +#ifndef isjis +#define isjis(x) (0x21<=(x) && (x)<=0x7e) +#endif + +#ifndef isvowel +#define isvowel(x) ((x)==0x61 || (x)==0x65 || (x)==0x69 || (x)==0x6f || \ + (x)==0x75 || (x)==0x41 || (x)==0x45 || (x)==0x49 || (x)==0x4f || (x)==0x55) +#endif +#ifndef isdakuten +#define isdakuten(x) (0xde<=(x) && (x)<=0xdf) +#endif +#ifndef isdakuon +#define isdakuon(x) (((x)>=0xb6 && (x)<=0xc4) || ((x)>=0xca && (x)<=0xce)) +#endif + +#endif /* _sj3ctype_h */ diff -r 000000000000 -r 92745d501b9a lib/Xsj3clib/sjrc.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/Xsj3clib/sjrc.c Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,1678 @@ +#ifndef lint +static char *rcsid = "$Id: sjrc.c,v 2.3 1993/01/06 10:56:56 nao Exp $"; +#endif +/* + * Copyright 1991 Sony Corporation + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Sony not be used in advertising or + * publicity pertaining to distribution of the software without specific, + * written prior permission. Sony makes no representations about the + * suitability of this software for any purpose. It is provided "as is" + * without express or implied warranty. + * + * SONY DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL SONY + * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ +/* + * Author: Naoshi Suzuki, SONY Corporation. (nao@sm.sony.co.jp) + */ + +#include +#include +#include "common.h" +#include "sj3ctype.h" +#include "util.h" +#include "table.h" + +void Xsj3cRCInit(); + +static int _Xsj3cReadRC(); + +extern int _Xsj3cSetKeyTable(); +static int _Xsj3cSetInputMode(); +static int _Xsj3cSetPrintMode(); +static int _Xsj3cSetDefCode(); +static int _Xsj3cSetMuhenkan(); +static int _Xsj3cSetMuEdit(); +static int _Xsj3cSetMToggle(); +int _Xsj3cSetGuide(); +static int _Xsj3cSetBStudy(); +static int _Xsj3cSetRkeBell(); +static int _Xsj3cSetFlushAfterConv(); +static int _Xsj3cSetSj3Serv(); +static int _Xsj3cSetNormal(); +static int _Xsj3cSetThroughNext(); + +static int _Xsj3cSetSj3Serv2(); +static int _Xsj3cSetFlushInConv(); +static int _Xsj3cSetFlushSelectConv(); +static int _Xsj3cSetFlushEndConv(); +static int _Xsj3cSetAlphaConv(); +static int _Xsj3cSetBackDisplay(); +static int _Xsj3cSetSegLast(); +static int _Xsj3cSetExpandMConv(); +static int _Xsj3cSetShrinkMConv(); +static int _Xsj3cSetExpandKConv(); +static int _Xsj3cSetShrinkKConv(); +static int _Xsj3cSetShrinkAll(); +static int _Xsj3cSetConvSeg(); +static int _Xsj3cSetUnconvSeg(); +static int _Xsj3cSetDelChange(); +static int _Xsj3cSetFlushChange(); +static int _Xsj3cSetModeConv(); +static int _Xsj3cSetMoveLoop(); +static int _Xsj3cSetModeBySeg(); +static int _Xsj3cSetJumpBySeg(); +static int _Xsj3cSetDelBySeg(); +static int _Xsj3cSetKillBySeg(); +static int _Xsj3cSetMuhenCursorLast(); +static int _Xsj3cSetEditCursorLast(); +static int _Xsj3cSetFlushCursorLast(); +static int _Xsj3cSetUnderLine(); +static int _Xsj3cSetDispMChange(); +static int _Xsj3cSetDelLastMove(); +static int _Xsj3cSetKanaInput(); +static int _Xsj3cSetInputSame(); +static int _Xsj3cSetCntrlSame(); +static int _Xsj3cSetSelectConv(); +static int _Xsj3cSetBeforeConv(); +static int _Xsj3cSetLastDoubleConv(); +static int _Xsj3cSetSelectCount(); +static int _Xsj3cSetSelectBackMove(); +static int _Xsj3cSetCandidatePad(); +static int _Xsj3cSetNextRCFile(); +static int _Xsj3cSetIncludeRCFile(); + +static struct functable { + char *keyword; + int (*func)(); +} funcs[] = { + "key", _Xsj3cSetKeyTable, + "escape", _Xsj3cSetKeyTable, + "sjxkey", _Xsj3cSetKeyTable, + "ki2key", _Xsj3cSetKeyTable, + "initialmode", _Xsj3cSetInputMode, + "defaultcode", _Xsj3cSetDefCode, + "muhenkanmode", _Xsj3cSetMuhenkan, + "muhenkaninedit", _Xsj3cSetMuEdit, + "muhenkantoggle", _Xsj3cSetMToggle, + "guide", _Xsj3cSetGuide, + "bstudy", _Xsj3cSetBStudy, + "rkerrbell", _Xsj3cSetRkeBell, + "flushafterconversion", _Xsj3cSetFlushAfterConv, + "server", _Xsj3cSetSj3Serv, + "sj3serv", _Xsj3cSetSj3Serv, + "setnormal", _Xsj3cSetNormal, + "throughnext", _Xsj3cSetThroughNext, + "sj3serv2", _Xsj3cSetSj3Serv2, + "flushinconversion", _Xsj3cSetFlushInConv, + "flushselectconversion", _Xsj3cSetFlushSelectConv, + "flushendconversion", _Xsj3cSetFlushEndConv, + "alphabetconversion", _Xsj3cSetAlphaConv, + "backdisplay", _Xsj3cSetBackDisplay, + "beginconversionlast", _Xsj3cSetSegLast, + "expandmodeconversion", _Xsj3cSetExpandMConv, + "shrinkmodeconversion", _Xsj3cSetShrinkMConv, + "expandkanjiconversion", _Xsj3cSetExpandKConv, + "shrinkkanjiconversion", _Xsj3cSetShrinkKConv, + "shrinkall", _Xsj3cSetShrinkAll, + "henkansegment", _Xsj3cSetConvSeg, + "muhenkansegment", _Xsj3cSetUnconvSeg, + "deletechangesegment", _Xsj3cSetDelChange, + "flushchangesegment", _Xsj3cSetFlushChange, + "modeconversion", _Xsj3cSetModeConv, + "moveloop", _Xsj3cSetMoveLoop, + "movebysegment", _Xsj3cSetModeBySeg, + "jumpbysegment", _Xsj3cSetJumpBySeg, + "deletebysegment", _Xsj3cSetDelBySeg, + "killbysegment", _Xsj3cSetKillBySeg, + "muhenkancursorlast", _Xsj3cSetMuhenCursorLast, + "editkancursorlast", _Xsj3cSetEditCursorLast, + "flushkancursorlast", _Xsj3cSetFlushCursorLast, + "convertedunderline", _Xsj3cSetUnderLine, + "displaymodechange", _Xsj3cSetDispMChange, + "deletelastmove", _Xsj3cSetDelLastMove, + "kanainputonly", _Xsj3cSetKanaInput, + "inputsametime", _Xsj3cSetInputSame, + "controlsametime", _Xsj3cSetCntrlSame, + "printmode", _Xsj3cSetPrintMode, + "beforeselectconversion", _Xsj3cSetSelectConv, + "beforeconversion", _Xsj3cSetBeforeConv, + "lastdoubleconversion", _Xsj3cSetLastDoubleConv, + "beforeselectcount", _Xsj3cSetSelectCount, + "selectbackspacemove", _Xsj3cSetSelectBackMove, + "candidatepadding", _Xsj3cSetCandidatePad, + "nextrcfile", _Xsj3cSetNextRCFile, + "include", _Xsj3cSetIncludeRCFile, + NULL, NULL +}; + +static int inc_cnt; + +#define END -1 +#define COMMENT 0 +#define NORMAL 1 +#define BAD 2 +#define OTHERS 3 +#define SERIAL "nwp511" +#define SERIAL2 "nwp517" +#define SERIAL3 "nwp-511" + +/* + * Xsj3cRCInit() + * Decide sjrc file to read, then read it and set resources. + */ +void +Xsj3cRCInit(buf, sjrc, home) + Xsj3cBuf buf; + char *sjrc; + char *home; +{ + extern char *getenv(); + register char *p; + SjrcRec rctable; + struct functable *functp; + FILE *fp; + register int line; + int status; + + if (!buf->rcfile) { + if ((buf->rcfile = (char *)malloc(BUFSIZ)) == NULL) + Xsj3cError("Can't allocate sjrc file"); + *buf->rcfile = '\0'; + + /* Get sjrc file and open */ + if (sjrc) { + if ((fp = fopen(sjrc, "r")) == NULL) + Xsj3cError("can't open sjrc file %s", sjrc); + strcpy(buf->rcfile, sjrc); + } else { + if ((p = getenv("SJRC")) && *p != '\0') { + if (*p != '/') { + if (home) + strcpy(buf->rcfile, home); + strcat(buf->rcfile, "/"); + } + strcat(buf->rcfile, p); + } else if (home) { + strcpy(buf->rcfile, home); + strcat(buf->rcfile, "/.sjrc"); + } else { + strcpy(buf->rcfile, SJ3DEFPATH); + strcat(buf->rcfile, DEF_SJRC_FILE); + } + if ((fp = fopen(buf->rcfile, "r")) == NULL) { + strcpy(buf->rcfile, SJ3DEFPATH); + strcat(buf->rcfile, DEF_SJRC_FILE); + if ((fp = fopen(buf->rcfile, "r")) == NULL) { + Xsj3cError("can't open sjrc file %s", buf->rcfile); + } + } + } + } else { + if ((fp = fopen(buf->rcfile, "r")) == NULL) { + Xsj3cWarning("can't open sjrc file %s", buf->rcfile); + return; + } + } + + /* Read sjrc file and set buffer fields */ + inc_cnt = 0; + for (line = 0; (status = + _Xsj3cReadRC(fp, &rctable)) != END; line++) { + functp = funcs; + if (status == NORMAL) { + while (functp->keyword != NULL) { + if (_Xsj3cCmp(rctable.key[0], functp->keyword)) { + if (!(*(functp->func))(buf, &rctable)) + Xsj3cWarning("wrong format in sjrc file. %s:%d", + buf->rcfile, line + 1); + break; + } + functp++; + } + } else if (status == COMMENT || status == OTHERS) { + continue; + } else { + Xsj3cWarning("bad line in sjrc file. %s:%d", buf->rcfile, line); + continue; + } + } + fclose(fp); +} + +/* + * _Xsj3cReadRC() + * Read sjrc file. (Non memory copy version) + */ +static int +_Xsj3cReadRC(fp, rctable) + FILE *fp; + Sjrctable rctable; +{ + static unsigned char buf[256]; + register int i, j, k, end, byte2 = 0, kana = 0; + + if ((fgets (buf, sizeof(buf), fp)) == NULL) + return END; + + if (buf[0] == '\n' || buf[0] == '#' || buf[0] == '\0' ) + return COMMENT; + + for (i = 0, k = 0, end = 0; buf[i] != ' ' && buf[i] != '\t' && + buf[i] != '#' && buf[i] != '\n';) { + for (j = i; buf[i] != ' ' && buf[i] != '\t' + && buf[i] != '#' && buf[i] != '\n' && buf[i] != '.'; i++); + if (j == i && buf[i] == '.' ) { + i++; + continue; + } + if (buf[i] == '#' || buf[i] == '\n' ) + return BAD; + if (buf[i] == '\t' || buf[i] == ' ' ) + end++; + buf[i++] = '\0'; + if (!strcmp(&buf[j],SERIAL) || !strcmp(&buf[j],SERIAL2) + || !strcmp(&buf[j],SERIAL3)) + return OTHERS; + rctable->key[k++] = &buf[j]; + if (end) + break; + } + if ( k < 1) + return BAD; + for (; k < 2;) + rctable->key[k++] = NULL; + while(buf[i] == ' ' || buf[i] == '\t') i++; + if (in_lang == JP_SJIS || in_lang == JP_EUC) { + for (k = 0, end = 0; buf[i] != '\n';) { + for (j = i; buf[i] != '\n' ; i+=2) { + if (iskan1(buf[i], in_lang)) { + if (iskan2(buf[i + 1], in_lang)) + continue; + else if (buf[i + 1] == '#' || buf[i + 1] == ' ' + || buf[i + 1] == '\t'|| buf[i + 1] == '\n') { + i++; + break; + } else + continue; + } else if (buf[i] == '#' || buf[i] == ' ' || buf[i] == '\t') { + break; + } else if (buf[i] == '.') { + if (i > 0 && buf[i - 1] == '\\') { + continue; + } else + break; + } else if (buf[i + 1] == '#' || buf[i + 1] == ' ' + || buf[i + 1] == '\t' || buf[i + 1] == '\n') { + i++; + break; + } else if (buf[i + 1] == '.') { + if (buf[i] == '\\') { + continue; + } else { + i++; + break; + } + } else + continue; + } + if (buf[i] == '#' || buf[i] == '\n' ) + end++; + buf[i++] = '\0'; + rctable->value[k++] = &buf[j]; + if (end) + break; + while(buf[i] == ' ' || buf[i] == '\t') i++; + } + } else { + for (k = 0, end = 0; buf[i] != '\n';) { + for (j = i; buf[i] != '\n'; i++) { + if (buf[i] == ESC) { + if (buf[i + 1] == '#' || buf[i + 1] == ' ' || + buf[i + 1] == '\t'|| buf[i + 1] == '.' || + buf[i + 1] == '\n') { + i++; + break; + } else if (byte2) + byte2 = 0; + else + byte2++; + i += 2; + continue; + } else if (buf[i] == SO || buf[i] == SI) { + if (buf[i + 1] == '#' || buf[i + 1] == ' ' || + buf[i + 1] == '\t'|| buf[i + 1] == '.' || + buf[i + 1] == '\n') { + i++; + break; + } else if (buf[i] == SI) + kana = 0; + else + kana++; + continue; + } else if (byte2 || kana) + continue; + if (buf[i] == '#' || buf[i] == ' ' || buf[i] == '\t') { + break; + } else if (buf[i] == '.') { + if (i > 0 && buf[i - 1] == '\\') { + continue; + } else + break; + } else + continue; + } + if (buf[i] == '#' || buf[i] == '\n' ) + end++; + buf[i++] = '\0'; + rctable->value[k++] = &buf[j]; + if (end) + break; + while(buf[i] == ' ' || buf[i] == '\t') i++; + } + } + if ( k < 1) + return BAD; + for (; k < 10;) + rctable->value[k++] = NULL; + return NORMAL; +} + +/* + * _Xsj3cSetInputMode() + * Set a parameter by .initialmode entry. + */ +static int +_Xsj3cSetInputMode(buf, table) + Xsj3cBuf buf; + Sjrctable table; +{ + register int i, j; + + for (i = 0, j = 0; i < MODE_INROT_NUM; i++, j++) { + if (table->value[j]) { + if (_Xsj3cCmp(table->value[j], "hiragana")) { + buf->inmoderot[i] = MODE_HIRA; + } else if (_Xsj3cCmp(table->value[j], "zkatakana")) { + buf->inmoderot[i] = MODE_ZKATA; + } else if (_Xsj3cCmp(table->value[j], "hkatakana")) { + buf->inmoderot[i] = MODE_HKATA; + } else if (_Xsj3cCmp(table->value[j], "halpha")) { + buf->inmoderot[i] = MODE_HALPHA; + } else if (_Xsj3cCmp(table->value[j], "zalpha")) { + buf->inmoderot[i] = MODE_ZALPHA; + } else if (_Xsj3cCmp(table->value[j], "jis")) { + buf->inmoderot[i] = MODE_JIS; + } else if (_Xsj3cCmp(table->value[j], "sjis")) { + buf->inmoderot[i] = MODE_SJIS; + } else if (_Xsj3cCmp(table->value[j], "kuten")) { + buf->inmoderot[i] = MODE_KUTEN; + } else if (_Xsj3cCmp(table->value[j], "euc")) { + buf->inmoderot[i] = MODE_EUC; + } else { + if (!_Xsj3cCmp(table->value[j], "unbuff") + && !_Xsj3cCmp(table->value[j], "buffer") + && !_Xsj3cCmp(table->value[j], "unbuffer") + && !_Xsj3cCmp(table->value[j], "direct")) + Xsj3cWarning("Unknown input mode \"%s\"",table->value[j]); + i--; + continue; + } + } else { + break; + } + } + if ((buf->inmoderotnum = i) > 0) + return 1; + else + return 0; +} + +/* + * _Xsj3cSetPrintMode() + * Set a parameter by .PrintMode entry. + */ +static int +_Xsj3cSetPrintMode(buf, table) + Xsj3cBuf buf; + Sjrctable table; +{ + register int i, j; + + for (i = 0, j = 0; i < MODE_OUTROT_NUM; i++, j++) { + if (table->value[j]) { + if (_Xsj3cCmp(table->value[j], "hiragana")) { + buf->outmoderot[i] = MODE_HIRA; + } else if (_Xsj3cCmp(table->value[j], "zkatakana")) { + buf->outmoderot[i] = MODE_ZKATA; + } else if (_Xsj3cCmp(table->value[j], "hkatakana")) { + buf->outmoderot[i] = MODE_HKATA; + } else if (_Xsj3cCmp(table->value[j], "halpha")) { + buf->outmoderot[i] = MODE_HALPHA; + } else if (_Xsj3cCmp(table->value[j], "zalpha")) { + buf->outmoderot[i] = MODE_ZALPHA; + } else if (_Xsj3cCmp(table->value[j], "hankaku")) { + buf->outmoderot[i] = MODE_HANKAKU; + } else if (_Xsj3cCmp(table->value[j], "zenkaku")) { + buf->outmoderot[i] = MODE_ZENKAKU; + } else if (_Xsj3cCmp(table->value[j], "upper")) { + buf->outmoderot[i] = MODE_UPPER; + } else if (_Xsj3cCmp(table->value[j], "lower")) { + buf->outmoderot[i] = MODE_LOWER; + } else { + Xsj3cWarning("Unknown print mode \"%s\"",table->value[j]); + i--; + continue; + } + } else { + break; + } + } + if ((buf->outmoderotnum = i) > 0) + return 1; + else + return 0; +} + +/* + * _Xsj3cSetDefCode() + * Set a parameter by .defaultcode entry. + */ +static int +_Xsj3cSetDefCode(buf, table) + Xsj3cBuf buf; + Sjrctable table; +{ + register int i; + + for (i = 0; i < MODE_CODE_NUM; i++) { + if (table->value[i]) { + if (_Xsj3cCmp(table->value[i], "jis")) { + buf->defcode[i] = MODE_JIS; + } else if (_Xsj3cCmp(table->value[i], "sjis")) { + buf->defcode[i] = MODE_SJIS; + } else if (_Xsj3cCmp(table->value[i], "kuten")) { + buf->defcode[i] = MODE_KUTEN; + } else if (_Xsj3cCmp(table->value[i], "euc")) { + buf->defcode[i] = MODE_EUC; + } else { + Xsj3cWarning("Unknown input code"); + break; + } + } else { + break; + } + } + if ((buf->coderotnum = i) > 0) + return 1; + else + return 0; +} + +/* + * _Xsj3cSetMuhenkan() + * Set a parameter by .MuhenkanMode entry. + */ +static int +_Xsj3cSetMuhenkan(buf, table) + Xsj3cBuf buf; + Sjrctable table; +{ + if (table->value[0]) { + if (_Xsj3cCmp(table->value[0], "hiragana")) { + buf->muhenmode = MODE_HIRA; + } else if (_Xsj3cCmp(table->value[0], "zkatakana")) { + buf->muhenmode = MODE_ZKATA; + } else if (_Xsj3cCmp(table->value[0], "hkatakana")) { + buf->muhenmode = MODE_HKATA; + } else if (_Xsj3cCmp(table->value[0], "halpha")) { + buf->muhenmode = MODE_HALPHA; + } else if (_Xsj3cCmp(table->value[0], "zalpha")) { + buf->muhenmode = MODE_ZALPHA; + } else if (_Xsj3cCmp(table->value[0], "jis")) { + buf->muhenmode = MODE_JIS; + } else if (_Xsj3cCmp(table->value[0], "sjis")) { + buf->muhenmode = MODE_SJIS; + } else if (_Xsj3cCmp(table->value[0], "kuten")) { + buf->muhenmode = MODE_KUTEN; + } else if (_Xsj3cCmp(table->value[0], "euc")) { + buf->muhenmode = MODE_EUC; + } else { + Xsj3cWarning("Invalid muhenkan mode \"%s\"",table->value[0]); + } + } + return 1; +} + +/* + * _Xsj3cSetMuEdit() + * Set a parameter by .MuhenkanInEdit entry. + */ +static int +_Xsj3cSetMuEdit(buf, table) + Xsj3cBuf buf; + Sjrctable table; +{ + if (table->value[0]) { + if (_Xsj3cCmp(table->value[0], "hiragana")) { + buf->togglemode = MODE_HIRA; + } else if (_Xsj3cCmp(table->value[0], "zkatakana")) { + buf->togglemode = MODE_ZKATA; + } else if (_Xsj3cCmp(table->value[0], "hkatakana")) { + buf->togglemode = MODE_HKATA; + } else if (_Xsj3cCmp(table->value[0], "halpha")) { + buf->togglemode = MODE_HALPHA; + } else if (_Xsj3cCmp(table->value[0], "zalpha")) { + buf->togglemode = MODE_ZALPHA; + } else if (_Xsj3cCmp(table->value[0], "jis")) { + buf->togglemode = MODE_JIS; + } else if (_Xsj3cCmp(table->value[0], "sjis")) { + buf->togglemode = MODE_SJIS; + } else if (_Xsj3cCmp(table->value[0], "kuten")) { + buf->togglemode = MODE_KUTEN; + } else if (_Xsj3cCmp(table->value[0], "euc")) { + buf->togglemode = MODE_EUC; + } else { + Xsj3cWarning("Unknown toggle mode"); + } + } + + return 1; +} + +/* + * _Xsj3cSetMToggle() + * Set a parameter by .MuhenkanToggle entry. + */ +static int +_Xsj3cSetMToggle(buf, table) + Xsj3cBuf buf; + Sjrctable table; +{ + if (!table->value[0]) + return 0; + if (_Xsj3cCmp(table->value[0],"on")) + buf->dotoggle = ON; + else + buf->dotoggle = OFF; + return 1; +} + +/* + * _Xsj3cSetGuide() + * Set a parameter by .guide entry. + */ +int +_Xsj3cSetGuide(buf, table) + Xsj3cBuf buf; + Sjrctable table; +{ + Xsj3csMode mode; + wchar data[KANABUFSIZ]; + + if (table->key[1] && table->value[0]) { + if (_Xsj3cCmp(table->key[1], "hiragana")) { + mode = MODE_HIRA; + } else if (_Xsj3cCmp(table->key[1], "zkatakana")) { + mode = MODE_ZKATA; + } else if (_Xsj3cCmp(table->key[1], "hkatakana")) { + mode = MODE_HKATA; + } else if (_Xsj3cCmp(table->key[1], "halpha")) { + mode = MODE_HALPHA; + } else if (_Xsj3cCmp(table->key[1], "zalpha")) { + mode = MODE_ZALPHA; + } else if (_Xsj3cCmp(table->key[1], "jis")) { + mode = MODE_JIS; + } else if (_Xsj3cCmp(table->key[1], "sjis")) { + mode = MODE_SJIS; + } else if (_Xsj3cCmp(table->key[1], "kuten")) { + mode = MODE_KUTEN; + } else if (_Xsj3cCmp(table->key[1], "euc")) { + mode = MODE_EUC; + } else if (_Xsj3cCmp(table->key[1], "toroku")) { + mode = MODE_TOROKU; + } else if (_Xsj3cCmp(table->key[1], "register")) { + mode = MODE_TOROKU; + } else if (_Xsj3cCmp(table->key[1], "syoukyo")) { + mode = MODE_SYOUKYO; + } else if (_Xsj3cCmp(table->key[1], "eliminate")) { + mode = MODE_SYOUKYO; + } else if (_Xsj3cCmp(table->key[1], "kanji")) { + mode = MODE_KANJI; + } else if (_Xsj3cCmp(table->key[1], "edit")) { + mode = MODE_EDIT; + } else if (_Xsj3cCmp(table->key[1], "candidate")) { + mode = MODE_CAND; + } else if (_Xsj3cCmp(table->key[1], "symbol")) { + mode = MODE_SYMBOL; + } else if (_Xsj3cCmp(table->key[1], "hinsi")) { + mode = MODE_HINSI; + } else if (_Xsj3cCmp(table->key[1], "quote")) { + mode = MODE_QUOTE; + } else { + Xsj3cWarning("Unknown display mode key \"%s\"",table->key[1]); + return 0; + } + _Xsj3cmINtowOUT(buf->rcfile, table->value[0], data, + &buf->modelen[mode]); + if (!buf->modestr[mode]) { + if (!(buf->modestr[mode] + = (wchar *)malloc((buf->modelen[mode] + 1) * sizeof(wchar)))) + Xsj3cError("Cannot allocate for mode string"); + } else { + if (!(buf->modestr[mode] = (wchar *)realloc(buf->modestr[mode], + (buf->modelen[mode] + 1) * sizeof(wchar)))) + Xsj3cError("Cannot reallocate for mode string"); + } + _Xsj3cWcpy(buf->modestr[mode], data); + return 1; + } else { + return 0; + } +} + +/* + * _Xsj3cSetBStudy() + * Set a parameter by .bstudy entry. + */ +static int +_Xsj3cSetBStudy(buf, table) + Xsj3cBuf buf; + Sjrctable table; +{ + if (!table->value[0]) + return 0; + if (_Xsj3cCmp(table->value[0],"on")) + buf->gakusyuu = ON; + else + buf->gakusyuu = OFF; + return 1; +} + +/* + * _Xsj3cSetFlushAfterConv() + * Set a parameter by .flushafterconversion entry. + */ +static int +_Xsj3cSetFlushAfterConv(buf, table) + Xsj3cBuf buf; + Sjrctable table; +{ + if (!table->value[0]) + return 0; + if (_Xsj3cCmp(table->value[0],"on")) + buf->flushaconv = ON; + else + buf->flushaconv = OFF; + return 1; +} + +/* + * _Xsj3cSetFlushInConv() + * Set a parameter by .FlushInConversion entry. + */ +static int +_Xsj3cSetFlushInConv(buf, table) + Xsj3cBuf buf; + Sjrctable table; +{ + if (!table->value[0]) + return 0; + if (_Xsj3cCmp(table->value[0],"on")) + buf->flushiconv = ON; + else if (_Xsj3cCmp(table->value[0],"off")) + buf->flushiconv = OFF; + else if (_Xsj3cCmp(table->value[0],"edit")) + buf->flushiconv = EDIT; + else + buf->flushiconv = NONE; + return 1; +} + +/* + * _Xsj3cSetFlushSelectConv() + * Set a parameter by .FlushSelectConversion entry. + */ +static int +_Xsj3cSetFlushSelectConv(buf, table) + Xsj3cBuf buf; + Sjrctable table; +{ + if (!table->value[0]) + return 0; + if (_Xsj3cCmp(table->value[0],"on")) + buf->flushsconv = ON; + else if (_Xsj3cCmp(table->value[0],"off")) + buf->flushsconv = OFF; + else if (_Xsj3cCmp(table->value[0],"edit")) + buf->flushsconv = EDIT; + else + buf->flushsconv = NONE; + return 1; +} + +/* + * _Xsj3cSetFlushEndConv() + * Set a parameter by .FlushEndConversion entry. + */ +static int +_Xsj3cSetFlushEndConv(buf, table) + Xsj3cBuf buf; + Sjrctable table; +{ + if (!table->value[0]) + return 0; + if (_Xsj3cCmp(table->value[0],"on")) + buf->flusheconv = ON; + else + buf->flusheconv = OFF; + return 1; +} + +/* + * _Xsj3cSetRkeBell() + * Set a parameter by .rkerrbell entry. + */ +static int +_Xsj3cSetRkeBell(buf, table) + Xsj3cBuf buf; + Sjrctable table; +{ + if (!table->value[0]) + return 0; + if (_Xsj3cCmp(table->value[0],"on")) + buf->rkbell = ON; + else + buf->rkbell = OFF; + return 1; +} + +/* + * _Xsj3cSetSj3Serv() + * Set a parameter by .server entry. + */ +static int +_Xsj3cSetSj3Serv(buf, table) + Xsj3cBuf buf; + Sjrctable table; +{ + if (table->value[0]) { + static char hostname1[32]; + _Xsj3cReadAscii(buf->rcfile, table->value[0], hostname1); + buf->sj3serv = hostname1; + return 1; + } + return 0; +} + +/* + * _Xsj3cSetNormal() + * Set a parameter by .SetNormal entry. + */ +static int +_Xsj3cSetNormal(buf, table) + Xsj3cBuf buf; + Sjrctable table; +{ + if (table->value[0] && iscntrl(*table->value[0])) { + register unsigned char *c; + register int len; + if (buf->setnormal) { + c = buf->setnormal; + while (*c != '\0') { + if (*c == *table->value[0]) + return 1; /* same code */ + c++; + } + len = c - buf->setnormal; + buf->setnormal = (unsigned char *)realloc(buf->setnormal, len + 2); + *(buf->setnormal + len) = *table->value[0]; + *(buf->setnormal + len + 1) = '\0'; + } else { + buf->setnormal = (unsigned char *)malloc(2); + c = buf->setnormal; + *c++ = *table->value[0]; + *c = '\0'; + } + return 1; + } + return 0; +} + +/* + * _Xsj3cSetThroughNext() + * Set a parameter by .ThroughtNext entry. + */ +static int +_Xsj3cSetThroughNext(buf, table) + Xsj3cBuf buf; + Sjrctable table; +{ + if (table->value[0] && iscntrl(*table->value[0])) { + register unsigned char *c; + int len; + if (buf->throughnext) { + c = buf->throughnext; + while (*c != '\0') { + if (*c == *table->value[0]) + return 1; /* same code */ + c++; + } + len = c - buf->throughnext; + buf->throughnext + = (unsigned char *)realloc(buf->throughnext, len + 2); + *(buf->throughnext + len) = *table->value[0]; + *(buf->throughnext + len + 1) = '\0'; + } else { + buf->throughnext = (unsigned char *)malloc(2); + c = buf->throughnext; + *c++ = *table->value[0]; + *c = '\0'; + } + return 1; + } + return 0; +} + +/* + * _Xsj3cSetSj3Serv2() + * Set a parameter by .sj3serv2 entry. + */ +static int +_Xsj3cSetSj3Serv2(buf, table) + Xsj3cBuf buf; + Sjrctable table; +{ + if (table->value[0]) { + static char hostname2[32]; + _Xsj3cReadAscii(buf->rcfile, table->value[0], hostname2); + buf->sj3serv2 = hostname2; + return 1; + } + return 0; +} + +/* + * _Xsj3cSetAlphaConv() + * Set a parameter by .AlphabetConversion entry. + */ +static int +_Xsj3cSetAlphaConv(buf, table) + Xsj3cBuf buf; + Sjrctable table; +{ + if (!table->value[0]) + return 0; + if (_Xsj3cCmp(table->value[0],"on")) + buf->alphaconv = ON; + else + buf->alphaconv = OFF; + return 1; +} + +/* + * _Xsj3cSetBackDisplay() + * Set a parameter by .BackDisplay entry. + */ +static int +_Xsj3cSetBackDisplay(buf, table) + Xsj3cBuf buf; + Sjrctable table; +{ + if (!table->value[0]) + return 0; + if (_Xsj3cCmp(table->value[0],"on")) + buf->backdisplay = ON; + else + buf->backdisplay = OFF; + return 1; +} + +/* + * _Xsj3cSetSegLast() + * Set a parameter by .BeginConversionLast entry. + */ +static int +_Xsj3cSetSegLast(buf, table) + Xsj3cBuf buf; + Sjrctable table; +{ + if (!table->value[0]) + return 0; + if (_Xsj3cCmp(table->value[0],"on")) + buf->beginlastseg = ON; + else if (_Xsj3cCmp(table->value[0],"off")) + buf->beginlastseg = OFF; + else + buf->beginlastseg = NONE; + return 1; +} + +/* + * _Xsj3cSetShrinkAll() + * Set a parameter by .ShrinkAll entry. + */ +static int +_Xsj3cSetShrinkAll(buf, table) + Xsj3cBuf buf; + Sjrctable table; +{ + if (!table->value[0]) + return 0; + if (_Xsj3cCmp(table->value[0],"on")) + buf->shrinkall = ON; + else + buf->shrinkall = OFF; + return 1; +} + +/* + * _Xsj3cSetDelChange() + * Set a parameter by .DeleteChangeSegment entry. + */ +static int +_Xsj3cSetDelChange(buf, table) + Xsj3cBuf buf; + Sjrctable table; +{ + if (!table->value[0]) + return 0; + if (_Xsj3cCmp(table->value[0],"all")) + buf->delchange = ALL; + else if (_Xsj3cCmp(table->value[0],"after")) + buf->delchange = AFTER; + else + buf->delchange = ONE; + return 1; +} + +/* + * _Xsj3cSetFlushChange() + * Set a parameter by .FlushChangeSegment entry. + */ +static int +_Xsj3cSetFlushChange(buf, table) + Xsj3cBuf buf; + Sjrctable table; +{ + if (!table->value[0]) + return 0; + if (_Xsj3cCmp(table->value[0],"all")) + buf->flushchange = ALL; + else + buf->flushchange = ONE; + return 1; +} + +/* + * _Xsj3cSetExpandKConv() + * Set a parameter by .ExpandKanjiConversion entry. + */ +static int +_Xsj3cSetExpandKConv(buf, table) + Xsj3cBuf buf; + Sjrctable table; +{ + Xsj3cFlag input, conved; + + if (!(table->value[0] && table->value[1])) + return 0; + if (_Xsj3cCmp(table->value[0],"on")) + input = ON; + else + input = OFF; + if (_Xsj3cCmp(table->value[1],"on")) + conved = ON; + else + conved = OFF; + buf->expandkconv = (conved << 1) + input; + return 1; +} + +/* + * _Xsj3cSetShrinkKConv() + * Set a parameter by .ShrinkKanjiConversion entry. + */ +static int +_Xsj3cSetShrinkKConv(buf, table) + Xsj3cBuf buf; + Sjrctable table; +{ + Xsj3cFlag input, conved; + + if (!(table->value[0] && table->value[1])) + return 0; + if (_Xsj3cCmp(table->value[0],"on")) + input = ON; + else + input = OFF; + if (_Xsj3cCmp(table->value[1],"on")) + conved = ON; + else + conved = OFF; + buf->shrinkkconv = (conved << 1) + input; + return 1; +} + +/* + * _Xsj3cSetExpandMConv() + * Set a parameter by .ExpandModeConversion entry. + */ +static int +_Xsj3cSetExpandMConv(buf, table) + Xsj3cBuf buf; + Sjrctable table; +{ + Xsj3cFlag input, conved; + + if (!(table->value[0] && table->value[1])) + return 0; + if (_Xsj3cCmp(table->value[0],"on")) + input = ON; + else + input = OFF; + if (_Xsj3cCmp(table->value[1],"on")) + conved = ON; + else + conved = OFF; + buf->expandmconv = (conved << 1) + input; + return 1; +} + +/* + * _Xsj3cSetShrinkMConv() + * Set a parameter by .ShrinkModeConversion entry. + */ +static int +_Xsj3cSetShrinkMConv(buf, table) + Xsj3cBuf buf; + Sjrctable table; +{ + Xsj3cFlag input, conved; + + if (!(table->value[0] && table->value[1])) + return 0; + if (_Xsj3cCmp(table->value[0],"on")) + input = ON; + else + input = OFF; + if (_Xsj3cCmp(table->value[1],"on")) + conved = ON; + else + conved = OFF; + buf->shrinkmconv = (conved << 1) + input; + return 1; +} + +/* + * _Xsj3cSetMoveLoop() + * Set a parameter by .MoveLoop entry. + */ +static int +_Xsj3cSetMoveLoop(buf, table) + Xsj3cBuf buf; + Sjrctable table; +{ + if (!table->value[0]) + return 0; + if (_Xsj3cCmp(table->value[0],"on")) + buf->moveloop = ON; + else + buf->moveloop = OFF; + return 1; +} + +/* + * _Xsj3cSetJumpBySeg() + * Set a parameter by .JumpBySegment entry. + */ +static int +_Xsj3cSetJumpBySeg(buf, table) + Xsj3cBuf buf; + Sjrctable table; +{ + Xsj3cFlag input, conved; + + if (!(table->value[0] && table->value[1])) + return 0; + if (_Xsj3cCmp(table->value[0],"on")) + input = ON; + else + input = OFF; + if (_Xsj3cCmp(table->value[1],"on")) + conved = ON; + else + conved = OFF; + buf->jumpbyseg = (conved << 1) + input; + return 1; +} + +/* + * _Xsj3cSetModeBySeg() + * Set a parameter by .MoveBySegment entry. + */ +static int +_Xsj3cSetModeBySeg(buf, table) + Xsj3cBuf buf; + Sjrctable table; +{ + Xsj3cFlag input, conved; + + if (!(table->value[0] && table->value[1])) + return 0; + if (_Xsj3cCmp(table->value[0],"on")) + input = ON; + else + input = OFF; + if (_Xsj3cCmp(table->value[1],"on")) + conved = ON; + else + conved = OFF; + buf->movebyseg = (conved << 1) + input; + return 1; +} + +/* + * _Xsj3cSetDelBySeg() + * Set a parameter by .DeleteBySegment entry. + */ +static int +_Xsj3cSetDelBySeg(buf, table) + Xsj3cBuf buf; + Sjrctable table; +{ + Xsj3cFlag input, conved; + + if (!(table->value[0] && table->value[1])) + return 0; + if (_Xsj3cCmp(table->value[0],"on")) + input = ON; + else + input = OFF; + if (_Xsj3cCmp(table->value[1],"on")) + conved = ON; + else + conved = OFF; + buf->delbyseg = (conved << 1) + input; + return 1; +} + +/* + * _Xsj3cSetKillBySeg() + * Set a parameter by .KillBySegment entry. + */ +static int +_Xsj3cSetKillBySeg(buf, table) + Xsj3cBuf buf; + Sjrctable table; +{ + Xsj3cFlag input, conved; + + if (!(table->value[0] && table->value[1])) + return 0; + if (_Xsj3cCmp(table->value[0],"on")) + input = ON; + else + input = OFF; + if (_Xsj3cCmp(table->value[1],"on")) + conved = ON; + else + conved = OFF; + buf->killbyseg = (conved << 1) + input; + return 1; +} + +/* + * _Xsj3cSetMuhenCursorLast() + * Set a parameter by .MuhenkanCursorLast entry. + */ +static int +_Xsj3cSetMuhenCursorLast(buf, table) + Xsj3cBuf buf; + Sjrctable table; +{ + if (!table->value[0]) + return 0; + if (_Xsj3cCmp(table->value[0],"on")) + buf->muhencurlast = ON; + else + buf->muhencurlast = OFF; + return 1; +} + +/* + * _Xsj3cSetEditCursorLast() + * Set a parameter by .EditCursorLast entry. + */ +static int +_Xsj3cSetEditCursorLast(buf, table) + Xsj3cBuf buf; + Sjrctable table; +{ + if (!table->value[0]) + return 0; + if (_Xsj3cCmp(table->value[0],"on")) + buf->editcurlast = ON; + else + buf->editcurlast = OFF; + return 1; +} + +/* + * _Xsj3cSetFlushCursorLast() + * Set a parameter by .FlushCursorLast entry. + */ +static int +_Xsj3cSetFlushCursorLast(buf, table) + Xsj3cBuf buf; + Sjrctable table; +{ + if (!table->value[0]) + return 0; + if (_Xsj3cCmp(table->value[0],"on")) + buf->flushcurlast = ON; + else + buf->flushcurlast = OFF; + return 1; +} + +/* + * _Xsj3cSetUnconvSeg() + * Set a parameter by .MuhenkanSegment entry. + */ +static int +_Xsj3cSetUnconvSeg(buf, table) + Xsj3cBuf buf; + Sjrctable table; +{ + if (!table->value[0]) + return 0; + if (_Xsj3cCmp(table->value[0],"all")) + buf->muhenseg = ALL; + else if (_Xsj3cCmp(table->value[0],"after")) + buf->muhenseg = AFTER; + else + buf->muhenseg = ONE; + return 1; +} + +/* + * _Xsj3cSetConvSeg() + * Set a parameter by .HenkanSegment entry. + */ +static int +_Xsj3cSetConvSeg(buf, table) + Xsj3cBuf buf; + Sjrctable table; +{ + if (!table->value[0]) + return 0; + if (_Xsj3cCmp(table->value[0],"all")) + buf->henkanseg = ALL; + else if (_Xsj3cCmp(table->value[0],"after")) + buf->henkanseg = AFTER; + else + buf->henkanseg = ONE; + return 1; +} + +/* + * _Xsj3cSetModeConv() + * Set a parameter by .ModeConversion entry. + */ +static int +_Xsj3cSetModeConv(buf, table) + Xsj3cBuf buf; + Sjrctable table; +{ + Xsj3csMode mode; + Xsj3cFlag input, conved, noinput; + + if (table->key[1] && table->value[0] && table->value[1] && + table->value[2]) { + if (_Xsj3cCmp(table->key[1], "hiragana")) { + mode = MODE_HIRA; + } else if (_Xsj3cCmp(table->key[1], "zkatakana")) { + mode = MODE_ZKATA; + } else if (_Xsj3cCmp(table->key[1], "hkatakana")) { + mode = MODE_HKATA; + } else if (_Xsj3cCmp(table->key[1], "halpha")) { + mode = MODE_HALPHA; + } else if (_Xsj3cCmp(table->key[1], "zalpha")) { + mode = MODE_ZALPHA; + } else if (_Xsj3cCmp(table->key[1], "rollup")) { + mode = MODE_ROLLUP; + } else if (_Xsj3cCmp(table->key[1], "rolldown")) { + mode = MODE_ROLLDOWN; + } else { + Xsj3cWarning("Unknown conversion mode"); + } + if (_Xsj3cCmp(table->value[0],"on")) + input = ON; + else + input = OFF; + if (_Xsj3cCmp(table->value[1],"on")) + conved = ON; + else + conved = OFF; + if (_Xsj3cCmp(table->value[2],"on")) + noinput = ON; + else + noinput = OFF; + buf->modeconv[mode] = (noinput << 2) + (conved << 1) + input; + return 1; + } else { + return 0; + } +} + +/* + * _Xsj3cSetUnderLine() + * Set a parameter by .ConvertedUnderLine entry. + */ +static int +_Xsj3cSetUnderLine(buf, table) + Xsj3cBuf buf; + Sjrctable table; +{ + if (!table->value[0]) + return 0; + if (_Xsj3cCmp(table->value[0],"on")) + buf->convedunderline = ON; + else + buf->convedunderline = OFF; + return 1; +} + +/* + * _Xsj3cSetDispMChange() + * Set a parameter by .DisplayModeChange entry. + */ +static int +_Xsj3cSetDispMChange(buf, table) + Xsj3cBuf buf; + Sjrctable table; +{ + if (!table->value[0]) + return 0; + if (_Xsj3cCmp(table->value[0],"on")) + buf->dispmodechange = ON; + else + buf->dispmodechange = OFF; + return 1; +} + +/* + * _Xsj3cSetDelLastMove() + * Set a parameter by .DeleteLastMove entry. + */ +static int +_Xsj3cSetDelLastMove(buf, table) + Xsj3cBuf buf; + Sjrctable table; +{ + if (!table->value[0]) + return 0; + if (_Xsj3cCmp(table->value[0],"on")) + buf->dellastmove = ON; + else + buf->dellastmove = OFF; + return 1; +} + +/* + * _Xsj3cSetKanaInput() + * Set a parameter by .KanaInputOnly entry. + */ +static int +_Xsj3cSetKanaInput(buf, table) + Xsj3cBuf buf; + Sjrctable table; +{ + if (!table->value[0]) + return 0; + if (_Xsj3cCmp(table->value[0],"on")) + buf->kanaonly = ON; + else + buf->kanaonly = OFF; + return 1; +} + +/* + * _Xsj3cSetInputSame() + * Set a parameter by .InputSameTime entry. + */ +static int +_Xsj3cSetInputSame(buf, table) + Xsj3cBuf buf; + Sjrctable table; +{ + if (!table->value[0]) + return 0; + if (_Xsj3cCmp(table->value[0],"on")) + buf->inputsame = ON; + else + buf->inputsame = OFF; + return 1; +} + +/* + * _Xsj3cSetCntrlSame() + * Set a parameter by .CntrlSameTime entry. + */ +static int +_Xsj3cSetCntrlSame(buf, table) + Xsj3cBuf buf; + Sjrctable table; +{ + if (!table->value[0]) + return 0; + if (_Xsj3cCmp(table->value[0],"on")) + buf->cntrlsame = ON; + else + buf->cntrlsame = OFF; + return 1; +} + +/* + * _Xsj3cSetSelectConv() + * Set a parameter by .BeforeSelectConversion entry. + */ +static int +_Xsj3cSetSelectConv(buf, table) + Xsj3cBuf buf; + Sjrctable table; +{ + if (!table->value[0]) + return 0; + if (_Xsj3cCmp(table->value[0],"on")) + buf->selectconv = ON; + else + buf->selectconv = OFF; + return 1; +} + +/* + * _Xsj3cSetBeforeConv() + * Set a parameter by .BeforeConversion entry. + */ +static int +_Xsj3cSetBeforeConv(buf, table) + Xsj3cBuf buf; + Sjrctable table; +{ + if (!table->value[0]) + return 0; + if (_Xsj3cCmp(table->value[0],"on")) + buf->beforeconv = ON; + else + buf->beforeconv = OFF; + return 1; +} + +/* + * _Xsj3cSetLastDoubleConv() + * Set a parameter by .BeforeConversion entry. + */ +static int +_Xsj3cSetLastDoubleConv(buf, table) + Xsj3cBuf buf; + Sjrctable table; +{ + if (!table->value[0]) + return 0; + if (_Xsj3cCmp(table->value[0],"on")) + buf->lastdoubleconv = ON; + else + buf->lastdoubleconv = OFF; + return 1; +} + +/* + * _Xsj3cSetSelectCount() + * Set a parameter by .SelectCount entry. + */ +static int +_Xsj3cSetSelectCount(buf, table) + Xsj3cBuf buf; + Sjrctable table; +{ + register unsigned char *p; + + if (!table->value[0]) + return 0; + p = table->value[0]; + while (*p != '\0') { + if (!isdigit(*p++)) + return 0; + } + buf->selectcount = atoi(table->value[0]); + return 1; +} + +/* + * _Xsj3cSetSelectBackMove() + * Set a parameter by .SelectBackSpaceMove entry. + */ +static int +_Xsj3cSetSelectBackMove(buf, table) + Xsj3cBuf buf; + Sjrctable table; +{ + if (!table->value[0]) + return 0; + if (_Xsj3cCmp(table->value[0],"on")) + buf->selectback = ON; + else + buf->selectback = OFF; + return 1; +} + +/* + * _Xsj3cSetCandidatePad() + * Set a parameter by .CandidatePadding entry. + */ +static int +_Xsj3cSetCandidatePad(buf, table) + Xsj3cBuf buf; + Sjrctable table; +{ + if (!table->value[0]) + return 0; + if (_Xsj3cCmp(table->value[0],"on")) + buf->candpadding = ON; + else + buf->candpadding = OFF; + return 1; +} + +/* + * _Xsj3cSetNextRCFile() + * Set a parameter by .NextRCFile entry. + */ +static int +_Xsj3cSetNextRCFile(buf, table) + Xsj3cBuf buf; + Sjrctable table; +{ + char file[BUFSIZ]; + + if (table->value[0]) { + strcpy (file, buf->rcfile); + _Xsj3cReadAscii(file, table->value[0], buf->rcfile); + return 1; + } + return 0; +} + +/* + * _Xsj3cSetIncludeRCFile() + * Set a parameter by .include entry. + */ +static int +_Xsj3cSetIncludeRCFile(buf, table) + Xsj3cBuf buf; + Sjrctable table; +{ + char file[BUFSIZ], name[BUFSIZ]; + SjrcRec rctable; + struct functable *functp; + FILE *fp; + register int line; + int status; + + inc_cnt++; + if (inc_cnt > SJRC_INCLUDE_MAX) { + Xsj3cWarning("sjrc include nesting too deep"); + return 0; + } + if (table->value[0]) { + /* Get include file and open */ + _Xsj3cReadAscii(table->value[0], table->value[0], name); + strcpy(file, name); + if ((fp = fopen(file, "r")) == NULL) { + strcpy(file, SJ3DEFPATH); + strcat(file, name); + if ((fp = fopen(file, "r")) == NULL) { + Xsj3cWarning("can't open include sjrc file %s", file); + return 0; + } + } + } else { + return 0; + } + + /* Read sjrc file and set buffer fields */ + for (line = 0; (status = + _Xsj3cReadRC(fp, &rctable)) != END; line++) { + functp = funcs; + if (status == NORMAL) { + while (functp->keyword != NULL) { + if (_Xsj3cCmp(rctable.key[0], functp->keyword)) { + if (!(*(functp->func))(buf, &rctable)) + Xsj3cWarning("wrong format in include sjrc file. %s:%d", + file, line + 1); + break; + } + functp++; + } + } else if (status == COMMENT || status == OTHERS) { + continue; + } else { + Xsj3cWarning("bad line in sjrc include file. %s:%d", + file, line + 1); + continue; + } + } + fclose(fp); + return 1; +} diff -r 000000000000 -r 92745d501b9a lib/Xsj3clib/symbol.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/Xsj3clib/symbol.c Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,310 @@ +#ifndef lint +static char *rcsid = "$Id: symbol.c,v 2.0 1992/02/13 18:33:43 nao Exp $"; +#endif +/* + * Copyright 1991 Sony Corporation + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Sony not be used in advertising or + * publicity pertaining to distribution of the software without specific, + * written prior permission. Sony makes no representations about the + * suitability of this software for any purpose. It is provided "as is" + * without express or implied warranty. + * + * SONY DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL SONY + * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ +/* + * Author: Naoshi Suzuki, SONY Corporation. (nao@sm.sony.co.jp) + */ + +#include +#include "common.h" +#include "util.h" +#include "func.h" +#include "table.h" + +Xsj3cSymbol _Xsj3cSymbolInit(); +int Xsj3cGetSymbolNum(); +Xsj3cSymbol Xsj3cGetSymbols(); +wchar *Xsj3cGetSymbol(); +int Xsj3cSetSymbol(); +void Xsj3cEndSymbol(); + +static int _Xsj3cReadSymbol(); + +static Xsj3cSymbol symbollist = NULL; +static int symbolnum = 0; + +/* + * _Xsj3cSymbolInit() + * Decide sjsb file to read, then read it and make table for symbles. + */ +Xsj3cSymbol +_Xsj3cSymbolInit(sjsb, home) + char *sjsb; + char *home; +{ + extern char *getenv(); + register char *p; + char sbfile[BUFSIZ]; + int value; + + if (symbollist) { + return(symbollist); + } + if (sjsb) { + if ((value = _Xsj3cReadSymbol(sjsb)) > 0) + Xsj3cError("can't open sjsb file %s", sjsb); + else if ( value < 0 ) + Xsj3cError("read failed sjsb file %s", sjsb); + } else { + sbfile[0] = '\0'; + if ((p = getenv("SJSB")) && *p != '\0') { + if (*p != '/') { + if (home) + strcpy(sbfile, home); + strcat(sbfile, "/"); + } + strcat(sbfile, p); + } else if (home) { + strcpy(sbfile, home); + strcat(sbfile, "/.sjsb"); + } else { + strcpy(sbfile, SJ3DEFPATH); + strcat(sbfile, DEF_SJSB_FILE); + } + if ((value = _Xsj3cReadSymbol(sbfile)) > 0) { + strcpy(sbfile, SJ3DEFPATH); + strcat(sbfile, DEF_SJSB_FILE); + if ((value = _Xsj3cReadSymbol(sbfile)) > 0) { + Xsj3cError("can't open sjsb file %s", sbfile); + } else if ( value < 0 ) { + Xsj3cError("read failed sjsb file %s", sbfile); + } + } else if ( value < 0 ) { + Xsj3cError("read failed sjsb file %s", sbfile); + } + } + return(symbollist); +} + +/* + * _Xsj3cReadSymbol() + * Read sjsb file that is symbol table file. + * Make symbol table and return it. + */ +static int +_Xsj3cReadSymbol(file) + char *file; +{ + FILE *fp; + unsigned char line[256]; + unsigned char *p; + int len; + wchar data[RBUFSIZ]; + register int i, j; + + if ((fp = fopen(file, "r")) == NULL) { + return (OPEN_FAILED); + } + + i = 0; + while (fgets(line, sizeof(line), fp) != NULL) { + if (line[0] != '#' && line[0] != '\n') + i++; + } + + symbolnum = i; + if ((symbollist = (Xsj3cSymbol)calloc(i, sizeof(Xsj3cSymbolRec))) == NULL) { + return (ALLOC_FAILED); + } + + rewind(fp); + + j = 0; + while (fgets(line, sizeof(line), fp) != NULL && j < i) { + p = line; + while (*p != '\n' && *p != '#') { + p += _Xsj3cmINtowOUT(file, p, data, &len); + SKIP(p); + if (data[0] == '\0') + break; + symbollist[j].data = _Xsj3cStoreWchar(data, len + 1); + symbollist[j].len = len; + if (!symbollist[j].data) + return (ALLOC_FAILED); + j++; + } + } + fclose(fp); + return (OK); +} + +/* + * Xsj3cGetSymbolNum() + * Set the appointed (by 2nd argument) symbol to 3rd argument. + */ +int +Xsj3cGetSymbolNum(buf, cur) + Xsj3cBuf buf; + int *cur; +{ + if (!buf->symbol) { + buf->symbol = _Xsj3cSymbolInit(NULL, NULL); + } + *cur = buf->cursymbol; + return (symbolnum); +} + +/* + * Xsj3cGetSymbols() + * Set the appointed (by 2nd argument) symbol to 3rd argument. + */ +Xsj3cSymbol +Xsj3cGetSymbols(buf) + Xsj3cBuf buf; +{ + if (!buf->symbol) { + buf->symbol = _Xsj3cSymbolInit(NULL, NULL); + } + return (buf->symbol); +} + +/* + * Xsj3cGetSymbol() + * Set the appointed (by 2nd argument) symbol to 3rd argument. + */ +wchar * +Xsj3cGetSymbol(buf, n, len) + Xsj3cBuf buf; + int n; + int *len; +{ + if (!buf->symbol) { + buf->symbol = _Xsj3cSymbolInit(NULL, NULL); + } + *len = buf->symbol[n].len; + return (buf->symbol[n].data); +} + +/* + * Xsj3cSetSymbol() + * Set the selected symbol to the buffers. + */ +int +Xsj3cSetSymbol(buf, sel_symbol, changed, flush) + Xsj3cBuf buf; + int sel_symbol; + int *changed; + int *flush; +{ + Xsj3cSeg seg; + int change_pos; + register int i; + wchar symbol[RBUFSIZ]; + + if (buf->segnum && buf->input[buf->curseg] + && (buf->input[buf->curseg]->edit & SEG_NOEDIT)) { + /* $B8=J8@a$,JQ49:Q$_$N>l9g(B */ + if (buf->candidate) + Xsj3cEndCandidate(buf, ON); + /* FlushInConverion on $B$N;~$O3NDj$9$k(B */ + switch (buf->flushiconv) { + case ON: + for (i = 1; i < buf->backsegnum + 1; i++) { + Xsj3cFreeSegment(buf->backup[i]); + buf->backup[i] = NULL; + } + if (!buf->backup) { + if ((buf->backup = (Xsj3cSeg *)calloc(BUNBUFSIZ, + sizeof(Xsj3cSeg))) == NULL) { + Xsj3cError("Cannot allocate for backup buffers"); + } + } + if (seg = buf->backup[0]) { + Xsj3cClearSegment(buf, seg); + } else + seg = buf->backup[0] = (Xsj3cSeg)Xsj3cCreateSegment(buf); + buf->backsegnum = 1; + *flush = ON; + break; + case EDIT: + if (!(seg = buf->input[buf->curseg])) + seg = buf->input[buf->curseg] + = (Xsj3cSeg)Xsj3cCreateSegment(buf); + *seg->str = '\0'; + seg->sp = seg->str; + *seg->oldstr = '\0'; + seg->oldlen = 0; + seg->n_roma = 0; + seg->n_kana = -1; + if (buf->curseg == buf->segnum) + buf->segnum++; + else { + _Xsj3cUnConvSeg(buf, ONE, buf->muhencurlast); + _Xsj3cStoreYomi(buf, seg, 0); + } + *flush = OFF; + break; + case OFF: + if (seg = buf->input[buf->segnum]) { + Xsj3cClearSegment(buf, seg); + } else { + seg = buf->input[buf->segnum] + = (Xsj3cSeg)Xsj3cCreateSegment(buf); + } + buf->curseg = buf->segnum; + buf->segnum++; + *flush = OFF; + break; + case NONE: + default: + *flush = OFF; + *changed = OFF; + return 0; + } + } else { + seg = buf->input[buf->curseg]; + if (buf->curseg == buf->segnum) { + buf->segnum++; + } + if (!seg) { + seg = buf->input[buf->curseg] = (Xsj3cSeg)Xsj3cCreateSegment(buf); + } else { + *seg->str = '\0'; + seg->sp = seg->str; + seg->n_roma = 0; + seg->n_kana = -1; + *seg->oldstr = '\0'; + seg->oldlen = 0; + } + } + seg->edit = SEG_EDIT; + change_pos = seg->cur; + _Xsj3cwOUTtowPS(buf, symbol, buf->symbol[sel_symbol].data); + _Xsj3cInsertWchar(seg, symbol, buf->symbol[sel_symbol].len); + _Xsj3cStoreYomi(buf, seg, change_pos); + buf->cursymbol = sel_symbol; + *changed = ON; + + return 0; +} + +/* + * Xsj3cEndSymbol() + * End symbol input mode(SelectMode) and back to InputMode. + */ +void +Xsj3cEndSymbol(buf) + Xsj3cBuf buf; +{ + buf->convmode = InputModeMask; +} diff -r 000000000000 -r 92745d501b9a lib/Xsj3clib/table.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/Xsj3clib/table.c Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,897 @@ +#ifndef lint +static char *rcsid = "$Id: table.c,v 2.3 1993/09/21 09:42:45 nao Exp $"; +#endif +/* + * Copyright 1991 Sony Corporation + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Sony not be used in advertising or + * publicity pertaining to distribution of the software without specific, + * written prior permission. Sony makes no representations about the + * suitability of this software for any purpose. It is provided "as is" + * without express or implied warranty. + * + * SONY DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL SONY + * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ +/* + * Author: Naoshi Suzuki, SONY Corporation. (nao@sm.sony.co.jp) + */ + +#include +#include +#include "common.h" +#include "sj3ctype.h" +#include "util.h" + +extern Xsj3cCVServerIF serverIF[SERVER_NUM]; +extern Xsj3cSymbol _Xsj3cSymbolInit(); +extern Xsj3cHinsi _Xsj3cHinsiInit(); + +Xsj3cRKTable *_Xsj3cRKInit(); +Xsj3cHKTable *_Xsj3cHKInit(); +Xsj3cZHTable *_Xsj3cZHInit(); +unsigned char *_Xsj3cSetPlosive(); +unsigned char *_Xsj3cSetDouble(); +void Xsj3cInitializeTables(); + +int _Xsj3cmINtowOUT(); +int _Xsj3cReadAscii(); +wchar *_Xsj3cStoreWchar(); + +static Xsj3cRKTable *_Xsj3cAllocRKTable(); +static Xsj3cHKTable *_Xsj3cAllocHKTable(); +static Xsj3cZHTable *_Xsj3cAllocZHTable(); + +static unsigned char *_Xsj3cStoreChar(); + +static int _Xsj3cmINtomPS(); + +static int _Xsj3cReadRK(); +static int _Xsj3cReadHK(); +static int _Xsj3cReadZH(); + +static unsigned char *chnowp = NULL, *chmaxp = NULL; +static wchar *wnowp = NULL, *wmaxp = NULL; + +static Xsj3cRKTable *rktable[2] = {NULL, NULL}; +static Xsj3cHKTable *hktable[2] = {NULL, NULL}; +static Xsj3cZHTable *zhtable[2] = {NULL, NULL}; +static unsigned char *plosive[2] = {NULL, NULL}; +static unsigned char *rkdouble[2] = {NULL, NULL}; + +static Xsj3cRKTable *rknowtp = NULL, *rkmaxtp = NULL; +static Xsj3cHKTable *hknowtp = NULL, *hkmaxtp = NULL; +static Xsj3cZHTable *zhnowtp = NULL, *zhmaxtp = NULL; + +static unsigned char * +_Xsj3cStoreChar(ch, len) + unsigned char *ch; + int len; +{ + register unsigned char *chp; + + if (chnowp == NULL || chnowp + len > chmaxp) { + chp = (unsigned char *)malloc(BUFSIZ); + if (chp == NULL) + return (NULL); + chnowp = chp; + chmaxp = chnowp + (BUFSIZ/sizeof(unsigned char)); + strcpy (chp, ch); + chnowp += len; + return (chp); + } else { + chp = chnowp; + strcpy (chp, ch); + chnowp += len; + return (chp); + } +} + +wchar * +_Xsj3cStoreWchar(wch, len) + wchar *wch; + int len; +{ + register wchar *wp; + + if (wnowp == NULL || wnowp + len > wmaxp) { + wp = (wchar *)malloc(BUFSIZ); + if (wp == NULL) + return (NULL); + wnowp = wp; + wmaxp = wnowp + (BUFSIZ/sizeof(wchar)); + (void)_Xsj3cWcpy (wp, wch); + wnowp += len; + return (wp); + } else { + wp = wnowp; + (void)_Xsj3cWcpy (wp, wch); + wnowp += len; + return (wp); + } +} + +static int +_Xsj3cmINtomPS(buf, file, src, dest) + Xsj3cBuf buf; + char *file; + register unsigned char *src, *dest; +{ + register unsigned char c; + register wchar s, (*conv)(); + register int i = 0, kanji = OFF, kana = OFF; + + conv = CodeConvFunc[in_lang][serverIF[buf->server].lang]; + while ((*src != '\t' && *src != '\n' + && *src != ' ' && *src != '#')||(kanji || kana)) { + c = *src++; + switch (c) { + case ESC: + c = *src++; + if (c == '$') { + c = *src++; + i++; + if (c == 'B' || c == '@') { + kanji++; + i++; + } else + goto badcode; + } else if (c == '(') { + c = *src++; + i++; + if (c == 'J' || c == 'B' || c == 'H') { + kanji = OFF; + i++; + } else if (c == '$' && *src == 'B') { + src++; + kanji++; + i++; + } else + goto badcode; + } else if (c == '&' && !strcmp("@\033$B", src)) { + src += 4; + i += 5; + kanji++; + } else + goto badcode; + break; + case SI: + kana = OFF; + break; + case SO: + kana++; + break; + case '\\': + if (!kanji & !kana) { + *dest++ = *src++; + i++; + break; + } + default: + if (kanji) { + s = (c << 8) + (*src++ & 0x7f); + s = conv(s); + *dest++ = (s >> 8) & 0xff; + *dest++ = s & 0xff; + i++; + } else if (iskan1(c, in_lang) && iskan2(*src, in_lang)) { + if (conv) { + s = (c << 8) + (*src++ & 0xff); + s = conv(s); + *dest++ = (s >> 8) & 0xff; + *dest++ = s & 0xff; + } else { + *dest++ = c; + *dest++ = *src++; + } + i++; + } else if (iskana(c)) { + if (in_lang == JP_SJIS || in_lang == JP_JIS8) + *dest++ = c; + else if (in_lang == JP_EUC && iseuckana(c) && iskana2(*src)) { + *dest++ = *src++; + i++; + } else + goto badcode; + } else if (iseuckana(c) && iskana2(*src)) { + if (in_lang == JP_EUC) + *dest++ = *src++; + else + goto badcode; + i++; + } else if (kana) { + *dest++ = (c | MSB); + } else if (isascii(c)) { + *dest++ = c; + } else { +badcode: + Xsj3cError("There is bad code %s in %s",_Xsj3cXtoa(c),file); + } + break; + } + i++; + } + *dest = '\0'; + return (i); +} + +int +_Xsj3cReadAscii(file, src, dest) + char *file; + register unsigned char *src, *dest; +{ + register int i = 0, kana = OFF; + + while ((*src != '\t' && *src != ' ' + && *src != '\0' && *src != '\n' && *src != '#')|| kana) { + if (kana) { + *dest++ = (*src++ | MSB); + } if (*src == '\\') { + src++; + i++; + *dest++ = *src++; + } else if (isascii(*src)) { + *dest++ = *src++; + } else if (isdakuten(*src)) { + *dest++ = *src++; + } else if (iseuckana(*src) && isdakuten(*(src + 1))) { + src++; + i++; + *dest++ = *src++; + } else if (*src == SO) { + src++; + kana++; + } else if (*src == SI) { + src++; + kana = OFF; + } else { + int n = *src; + Xsj3cError("There is bad code %s in %s",_Xsj3cXtoa(n),file); + } + i++; + } + *dest = '\0'; + return (i); +} + +int +_Xsj3cmINtowOUT(file, src, dest, len) + char *file; + register unsigned char *src; + register wchar *dest; + register int *len; +{ + register unsigned char c; + register int i = 0, kanji = OFF, kana = OFF; + register wchar (*conv)(); + + *len = 0; + conv = CodeConvFunc[in_lang][out_lang]; + while ((*src != '\t' && *src != ' ' && *src != '\0' + && *src != '\n' && *src != '#')||(kanji || kana)) { + c = *src++; + switch (c) { + case ESC: + c = *src++; + if (c == '$') { + c = *src++; + i++; + if (c == 'B' || c == '@') { + kanji++; + i++; + } else + goto badcode; + } else if (c == '(') { + c = *src++; + i++; + if (c == 'J' || c == 'B' || c == 'H') { + kanji = OFF; + i++; + } else if (c == '$' && *src == 'B') { + src++; + kanji++; + i++; + } else + goto badcode; + } else if (c == '&' && !strcmp("@\033$B", src)) { + src += 4; + i += 5; + kanji++; + } else + goto badcode; + break; + case SI: + kana = OFF; + break; + case SO: + kana++; + break; + case '\\': + if (!kanji && !kana) { + *dest++ = *src++; + i++; + break; + } + default: + if (kanji || (iskan1(c, in_lang) && iskan2(*src, in_lang))) { + if (conv) + *dest++ = conv((c << 8) + (*src++ & 0xff)); + else + *dest++ = (c << 8) + (*src++ & 0xff); + i++; + } else if (iskana(c)) { + if (in_lang == JP_SJIS || in_lang == JP_JIS8) + *dest++ = c; + else if (in_lang == JP_EUC && iseuckana(c) && iskana2(*src)) { + *dest++ = *src++; + i++; + } else + goto badcode; + } else if (iseuckana(c) && iskana2(*src)) { + if (in_lang == JP_EUC) + *dest++ = *src++; + else + goto badcode; + i++; + } else if (kana) { + *dest++ = (c | MSB); + } else if (isascii(c)) { + *dest++ = c; + } else { +badcode: + Xsj3cError("There is bad code %s in %s",_Xsj3cXtoa(c),file); + } + (*len)++; + break; + } + i++; + } + *dest = '\0'; + return (i); +} + +/* + * Xsj3cInitializeTables() + * Read definition files and initialize conversion tables. + */ +void +Xsj3cInitializeTables(buf, home, sjrk, sjhk, sjzh, sjsb) + Xsj3cBuf buf; + char *home; + char *sjrk, *sjhk, *sjzh, *sjsb; +{ + buf->rktable = _Xsj3cRKInit(buf, sjrk, home); + buf->hktable = _Xsj3cHKInit(buf, sjhk, home); + buf->zhtable = _Xsj3cZHInit(buf, sjzh, home); + buf->symbol = _Xsj3cSymbolInit(sjsb, home); + buf->plosive = _Xsj3cSetPlosive(buf); + buf->rkdouble = _Xsj3cSetDouble(buf); + buf->hinsi = _Xsj3cHinsiInit(buf); +} + +/* + * _Xsj3cRKInit() + * Decide sjrk file to read, then read it and make table for roman-kana + * conversion table. + */ +Xsj3cRKTable * +_Xsj3cRKInit(buf, sjrk, home) + Xsj3cBuf buf; + char *sjrk; + char *home; +{ + extern char *getenv(); + register char *p; + char rkfile[BUFSIZ]; + int value, error; + + if (rktable[serverIF[buf->server].lang]) + return (rktable[serverIF[buf->server].lang]); + + if (sjrk) { + if ((value = _Xsj3cReadRK(buf, sjrk, &error)) > 0 ) + Xsj3cError("can't open sjrk file %s", sjrk); + else if (value < 0) + Xsj3cError("read failed line %s sjrk file %s", + _Xsj3cItoa(error), sjrk); + } else { + rkfile[0] = '\0'; + if ((p = getenv("SJRK")) && *p != '\0') { + if (*p != '/') { + if (home) + strcpy(rkfile, home); + strcat(rkfile, "/"); + } + strcat(rkfile, p); + } else if (home) { + strcpy(rkfile, home); + strcat(rkfile, "/.sjrk"); + } else { + strcpy(rkfile, SJ3DEFPATH); + strcat(rkfile, DEF_SJRK_FILE); + } + if ((value = _Xsj3cReadRK(buf, rkfile, &error)) > 0 ) { + strcpy(rkfile, SJ3DEFPATH); + strcat(rkfile, DEF_SJRK_FILE); + if ((value = _Xsj3cReadRK(buf, rkfile, &error)) > 0 ) { + Xsj3cError("can't open sjrk file %s", rkfile); + } else if (value < 0) { + Xsj3cError("read failed line %s sjrk file %s", + _Xsj3cItoa(error), rkfile); + } + } else if (value < 0) { + Xsj3cError("read failed line %s sjrk file %s", + _Xsj3cItoa(error), rkfile); + } + } + return (rktable[serverIF[buf->server].lang]); +} + +#define RKTBMAX (BUFSIZ/sizeof(Xsj3cRKTable)) + +static Xsj3cRKTable * +_Xsj3cAllocRKTable() +{ + register Xsj3cRKTable *rktp; + + if (rknowtp == NULL || rknowtp > rkmaxtp) { + rktp = (Xsj3cRKTable *)malloc(sizeof(Xsj3cRKTable) * RKTBMAX); + if (rktp == NULL) + return (NULL); + rknowtp = rktp; + rkmaxtp = rknowtp + RKTBMAX - 1; + rknowtp++; + } else { + rktp = rknowtp; + rknowtp++; + } + rktp->roma = NULL; + rktp->yomi = NULL; + rktp->str = NULL; + rktp->rlen = 0; + rktp->ylen = 0; + rktp->next = NULL; + return (rktp); +} + +/* + * _Xsj3cReadRK() + * Read sjrk file like a format sj3's roman-kana conversion file, + * and make conversion table. + * But this routine distinguishes upper-case and lower-case. + * It's a big difference. + */ +static int +_Xsj3cReadRK(buf, file, error) + Xsj3cBuf buf; + register char *file; + register int *error; +{ + register FILE *fp; + unsigned char line[256]; + unsigned char *p; + unsigned char roma[RBUFSIZ], yomi[YBUFSIZ], str[RBUFSIZ]; + register int begin = 0, rlen, ylen; + register Xsj3cRKTable *rktp, *rktq, *rktr; + + if ((fp = fopen(file, "r")) == NULL) + return (OPEN_FAILED); + + *error = 1; + rktp = rktable[serverIF[buf->server].lang] = _Xsj3cAllocRKTable(); + while (fgets(line, sizeof(line), fp) != NULL) { + p = line; + while (*p != '\n' && *p != '#') { + p += _Xsj3cReadAscii(file, p, roma); + CHECK_END(p); + SKIP(p); + p += _Xsj3cmINtomPS(buf, file, p, yomi); + SKIP(p); + p += _Xsj3cReadAscii(file, p, str); + if (roma[0] == '\0' || yomi[0] == '\0') + break; + if (begin++) { + rktr = _Xsj3cAllocRKTable(); + if (!rktr) { + Xsj3cWarning("can't allocate roman-kana conversion table"); + return (ALLOC_FAILED); + } + rktp = rktq->next = rktr; + } + rktp->roma = _Xsj3cStoreChar(roma, (rlen = strlen(roma)) + 1); + rktp->yomi = _Xsj3cStoreChar(yomi, (ylen = strlen(yomi)) + 1); + rktp->str = _Xsj3cStoreChar(str, strlen(str) + 1); + if (!rktp->roma || !rktp->yomi || !rktp->str) { + Xsj3cWarning("can't allocate roman-kana conversion table"); + return(ALLOC_FAILED); + } + rktp->rlen = rlen; + rktp->ylen = ylen; + rktq = rktp; + } + (*error)++; + } + rktp->next = NULL; + fclose(fp); + return (OK); +} + +/* + * _Xsj3cHKInit() + * Decide sjhk file to read, then read it and make hiragana-katakana + * conversion table. + */ +Xsj3cHKTable * +_Xsj3cHKInit(buf, sjhk, home) + Xsj3cBuf buf; + char *sjhk; + char *home; +{ + extern char *getenv(); + register char *p; + char hkfile[BUFSIZ]; + int value, error; + + if (hktable[serverIF[buf->server].lang]) + return (hktable[serverIF[buf->server].lang]); + + if (sjhk) { + if ((value = _Xsj3cReadHK(buf, sjhk, &error)) > 0 ) + Xsj3cError("can't open sjhk file %s", sjhk); + else if (value < 0) + Xsj3cError("read failed line %s sjhk file %s", + _Xsj3cItoa(error), sjhk); + } else { + hkfile[0] = '\0'; + if ((p = getenv("SJHK")) && *p != '\0') { + if (*p != '/') { + if (home) + strcpy(hkfile, home); + strcat(hkfile, "/"); + } + strcat(hkfile, p); + } else if (home) { + strcpy(hkfile, home); + strcat(hkfile, "/.sjhk"); + } else { + strcpy(hkfile, SJ3DEFPATH); + strcat(hkfile, DEF_SJHK_FILE); + } + if ((value = _Xsj3cReadHK(buf, hkfile, &error)) > 0 ) { + strcpy(hkfile, SJ3DEFPATH); + strcat(hkfile, DEF_SJHK_FILE); + if ((value = _Xsj3cReadHK(buf, hkfile, &error)) > 0 ) { + Xsj3cError("can't open sjhk file %s", hkfile); + } else if (value < 0) { + Xsj3cError("read failed line %s sjhk file %s", + _Xsj3cItoa(error), hkfile); + } + } else if (value < 0) { + Xsj3cError("read failed line %s sjhk file %s", + _Xsj3cItoa(error), hkfile); + } + } + return (hktable[serverIF[buf->server].lang]); +} + +#define HKTBMAX (BUFSIZ/sizeof(Xsj3cHKTable)) + +static Xsj3cHKTable * +_Xsj3cAllocHKTable() +{ + register Xsj3cHKTable *hktp; + + if (hknowtp == NULL || hknowtp > hkmaxtp) { + hktp = (Xsj3cHKTable *)malloc(sizeof(Xsj3cHKTable) * HKTBMAX); + if (hktp == NULL) + return (NULL); + hknowtp = hktp; + hkmaxtp = hknowtp + HKTBMAX - 1; + hknowtp++; + } else { + hktp = hknowtp; + hknowtp++; + } + hktp->hira = NULL; + hktp->zkata = NULL; + hktp->hkata = NULL; + hktp->halpha = NULL; + hktp->hlen = 0; + hktp->next = NULL; + return (hktp); +} + +static int +_Xsj3cReadHK(buf, file, error) + Xsj3cBuf buf; + register char *file; + register int *error; +{ + register FILE *fp; + unsigned char line[256]; + unsigned char *p; + unsigned char zhira[RBUFSIZ], zkata[YBUFSIZ]; + unsigned char hkata[RBUFSIZ], halpha[RBUFSIZ]; + register int begin = 0, hkata_len, halpha_len; + register Xsj3cHKTable *hktp, *hktq, *hktr; + + if ((fp = fopen(file, "r")) == NULL) + return (OPEN_FAILED); + + *error = 1; + hktp = hktable[serverIF[buf->server].lang] = _Xsj3cAllocHKTable(); + while (fgets(line, sizeof(line), fp) != NULL) { + p = line; + while (*p != '\n' && *p != '#') { + p += _Xsj3cmINtomPS(buf, file, p, zhira); + CHECK_END(p); + SKIP(p); + p += _Xsj3cmINtomPS(buf, file, p, zkata); + CHECK_END(p); + SKIP(p); + p += _Xsj3cmINtomPS(buf, file, p, hkata); + CHECK_END(p); + SKIP(p); + p += _Xsj3cReadAscii(file, p, halpha); + if (zhira[0] == '\0' || zkata[0] == '\0' + || hkata[0] == '\0' || halpha[0] == '\0') + break; + if (begin++) { + hktr = _Xsj3cAllocHKTable(); + if (!hktr) { + Xsj3cWarning("can't allocate hiragana-katakana conversion table"); + return (ALLOC_FAILED); + } + hktp = hktq->next = hktr; + } + hktp->hira = _Xsj3cStoreChar(zhira, strlen(zhira) + 1); + hktp->zkata = _Xsj3cStoreChar(zkata, strlen(zkata) + 1); + hktp->hkata = _Xsj3cStoreChar(hkata, + (hkata_len = strlen(hkata)) + 1); + hktp->halpha = _Xsj3cStoreChar(halpha, + (halpha_len = strlen(halpha)) + 1); + if (!hktp->hira || !hktp->zkata || !hktp->hkata || !hktp->halpha) { + Xsj3cWarning("can't allocate hiragana-katakana conversion table"); + return(ALLOC_FAILED); + } + hktp->hlen = hkata_len; + if (hkata_len != halpha_len) + return (READ_FAILED); + hktq = hktp; + } + (*error)++; + } + hktp->next = NULL; + fclose(fp); + return (OK); +} + +/* + * _Xsj3cZHInit() + * Decide sjzh file to read, then read it and make hankaku-zenkaku + * conversion table. + */ +Xsj3cZHTable * +_Xsj3cZHInit(buf, sjzh, home) + Xsj3cBuf buf; + char *sjzh; + char *home; +{ + extern char *getenv(); + register char *p; + char zhfile[BUFSIZ]; + int value, error; + + if (zhtable[serverIF[buf->server].lang]) + return (zhtable[serverIF[buf->server].lang]); + + if (sjzh) { + if ((value = _Xsj3cReadZH(buf, sjzh, &error)) > 0 ) + Xsj3cError("can't open sjzh file %s", sjzh); + else if (value < 0) + Xsj3cError("read failed line %s sjzk file %s", + _Xsj3cItoa(error), sjzh); + } else { + zhfile[0] = '\0'; + if ((p = getenv("SJZH")) && *p != '\0') { + if (*p != '/') { + if (home) + strcpy(zhfile, home); + strcat(zhfile, "/"); + } + strcat(zhfile, p); + } else if (home) { + strcpy(zhfile, home); + strcat(zhfile, "/.sjzh"); + } else { + strcpy(zhfile, SJ3DEFPATH); + strcat(zhfile, DEF_SJZH_FILE); + } + if ((value = _Xsj3cReadZH(buf, zhfile, &error)) > 0 ) { + strcpy(zhfile, SJ3DEFPATH); + strcat(zhfile, DEF_SJZH_FILE); + if ((value = _Xsj3cReadZH(buf, zhfile, &error)) > 0 ) { + Xsj3cError("can't open sjzh file %s", zhfile); + } else if (value < 0) { + Xsj3cError("read failed line %s sjzk file %s", + _Xsj3cItoa(error), zhfile); + } + } else if (value < 0) { + Xsj3cError("read failed line %s sjzk file %s", + _Xsj3cItoa(error), zhfile); + } + } + return (zhtable[serverIF[buf->server].lang]); +} + +#define ZHTBMAX (BUFSIZ/sizeof(Xsj3cZHTable)) + +static Xsj3cZHTable * +_Xsj3cAllocZHTable() +{ + register Xsj3cZHTable *zhtp; + + if (zhnowtp == NULL || zhnowtp > zhmaxtp) { + zhtp = (Xsj3cZHTable *)malloc(sizeof(Xsj3cZHTable) * ZHTBMAX); + if (zhtp == NULL) + return (NULL); + zhnowtp = zhtp; + zhmaxtp = zhnowtp + ZHTBMAX - 1; + zhnowtp++; + } else { + zhtp = zhnowtp; + zhnowtp++; + } + zhtp->zkana = NULL; + zhtp->hkata = NULL; + zhtp->halpha = NULL; + zhtp->zalpha = NULL; + zhtp->next = NULL; + return (zhtp); +} + +static int +_Xsj3cReadZH(buf, file, error) + Xsj3cBuf buf; + char *file; + register int *error; +{ + register FILE *fp; + unsigned char line[256]; + unsigned char *p; + unsigned char hanalpha[RBUFSIZ], zenalpha[YBUFSIZ]; + unsigned char zkana[RBUFSIZ], hkata[RBUFSIZ]; + register int begin = 0; + register Xsj3cZHTable *zhtp, *zhtq, *zhtr; + + if ((fp = fopen(file, "r")) == NULL) + return (OPEN_FAILED); + + *error = 1; + zhtp = zhtable[serverIF[buf->server].lang] = _Xsj3cAllocZHTable(); + while (fgets(line, sizeof(line), fp) != NULL) { + p = line; + while (*p != '\n' && *p != '#') { + p += _Xsj3cReadAscii(file, p, hanalpha); + CHECK_END(p); + SKIP(p); + p += _Xsj3cmINtomPS(buf, file, p, zenalpha); + CHECK_END(p); + SKIP(p); + p += _Xsj3cmINtomPS(buf, file, p, zkana); + CHECK_END(p); + SKIP(p); + p += _Xsj3cmINtomPS(buf, file, p, hkata); + if (hanalpha[0] == '\0' || zenalpha[0] == '\0' + || zkana[0] == '\0' || hkata[0] == '\0') + break; + if (begin++) { + zhtr = _Xsj3cAllocZHTable(); + if (!zhtr) { + Xsj3cWarning("can't allocate zen/hankaku conversion table"); + return (ALLOC_FAILED); + } + zhtp = zhtq->next = zhtr; + } + zhtp->halpha = _Xsj3cStoreChar(hanalpha, strlen(hanalpha) + 1); + zhtp->zalpha = _Xsj3cStoreChar(zenalpha, strlen(zenalpha) + 1); + zhtp->zkana = _Xsj3cStoreChar(zkana, strlen(zkana) + 1); + zhtp->hkata = _Xsj3cStoreChar(hkata, strlen(hkata) + 1); + if (!zhtp->halpha || !zhtp->zalpha + || !zhtp->zkana || !zhtp->hkata) { + Xsj3cWarning("can't allocate zen/han-kaku conversion table"); + return(ALLOC_FAILED); + } + zhtq = zhtp; + } + (*error)++; + } + zhtp->next = NULL; + fclose(fp); + return (OK); +} + +/* + * _Xsj3cSetPlosive() + * Set roman-kana plosive conversion data. + */ +unsigned char * +_Xsj3cSetPlosive(buf) + Xsj3cBuf buf; +{ + register Xsj3cRKTable *rktp; + register int i; + register wchar s; + unsigned char tmp[KANABUFSIZ]; + + if (plosive[serverIF[buf->server].lang]) + return(plosive[serverIF[buf->server].lang]); + if (!rktable[serverIF[buf->server].lang]) + Xsj3cError("Null roman-kana conversion table"); + i = 0; + for (rktp = rktable[serverIF[buf->server].lang]; + rktp->next != NULL; rktp = rktp->next) { + if (*rktp->str != '\0') { + s = (*rktp->yomi << 8) + *(rktp->yomi + 1); + if (isplosive(s, serverIF[buf->server].lang)) { + tmp[i] = *rktp->str; + i++; + } + } + } + tmp[i] = '\0'; + if ((plosive[serverIF[buf->server].lang] + = _Xsj3cStoreChar(tmp, strlen(tmp) + 1)) == NULL) + Xsj3cError("can't allocate for roma-kana plosive conversion table"); + return(plosive[serverIF[buf->server].lang]); +} + +/* + * _Xsj3cSetDouble() + * Set roman-kana double conversion data. + */ +unsigned char * +_Xsj3cSetDouble(buf) + Xsj3cBuf buf; +{ + register Xsj3cRKTable *rktp, *rktp2; + register int i; + unsigned char tmp[KANABUFSIZ]; + + if (rkdouble[serverIF[buf->server].lang]) + return(rkdouble[serverIF[buf->server].lang]); + if (!rktable[serverIF[buf->server].lang]) + Xsj3cError("Null roman-kana conversion table"); + i = 0; + for (rktp = rktable[serverIF[buf->server].lang]; + rktp->next != NULL; rktp = rktp->next) { + if (rktp->rlen == 1) { + if (isvowel(*rktp->roma)) + continue; + tmp[i] = *rktp->roma; + for (rktp2 = rktable[serverIF[buf->server].lang]; + rktp2->next != NULL; rktp2 = rktp2->next) { + if (rktp2->rlen == 2 && *(rktp2->roma + 1) == tmp[i] + && *(rktp2->roma) == tmp[i]) { + if (!strcmp(rktp->yomi, rktp2->yomi)) { + i++; + break; + } + } + } + } + } + tmp[i] = '\0'; + if ((rkdouble[serverIF[buf->server].lang] + = _Xsj3cStoreChar(tmp, strlen(tmp) + 1)) == NULL) + Xsj3cError("can't allocate for roma-kana double conversion table"); + return(rkdouble[serverIF[buf->server].lang]); +} diff -r 000000000000 -r 92745d501b9a lib/Xsj3clib/table.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/Xsj3clib/table.h Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,34 @@ +/* $Id: table.h,v 2.0 1992/02/13 18:33:47 nao Exp $ */ +/* + * Copyright 1991 Sony Corporation + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Sony not be used in advertising or + * publicity pertaining to distribution of the software without specific, + * written prior permission. Sony makes no representations about the + * suitability of this software for any purpose. It is provided "as is" + * without express or implied warranty. + * + * SONY DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL SONY + * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ +/* + * Author: Naoshi Suzuki, SONY Corporation. (nao@sm.sony.co.jp) + */ + +extern int _Xsj3cmINtowOUT(); +extern int _Xsj3cReadAscii(); +extern wchar *_Xsj3cStoreWchar(); + +extern Xsj3cRKTable *_Xsj3cRKInit(); +extern Xsj3cHKTable *_Xsj3cHKInit(); +extern Xsj3cZHTable *_Xsj3cZHInit(); +extern unsigned char *_Xsj3cSetPlosive(); +extern unsigned char *_Xsj3cSetDouble(); diff -r 000000000000 -r 92745d501b9a lib/Xsj3clib/util.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/Xsj3clib/util.c Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,814 @@ +#ifndef lint +static char *rcsid = "$Id: util.c,v 2.2 1993/09/21 09:42:34 nao Exp $"; +#endif +/* + * Copyright 1991 Sony Corporation + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Sony not be used in advertising or + * publicity pertaining to distribution of the software without specific, + * written prior permission. Sony makes no representations about the + * suitability of this software for any purpose. It is provided "as is" + * without express or implied warranty. + * + * SONY DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL SONY + * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ +/* + * Author: Naoshi Suzuki, SONY Corporation. (nao@sm.sony.co.jp) + */ + +#include +#include +#include "common.h" +#include "sj3ctype.h" +#include "segment.h" + +extern Xsj3cCVServerIF serverIF[SERVER_NUM]; + +int in_lang = JP_EUC; +int out_lang = JP_EUC; +int locked[SERVER_NUM] = {0}; +Xsj3ccMode KanaMask = 0; + +void Xsj3cSetInLang(); +void Xsj3cSetOutLang(); +void Xsj3cError(); +void Xsj3cWarning(); + +int _Xsj3cwPStowOUT(); +int _Xsj3cwOUTtowPS(); +int _Xsj3cmPStowPS(); +int _Xsj3cmPStowOUT(); +int _Xsj3cmPStowPSn(); +int _Xsj3cmPStowOUTn(); +void _Xsj3cwPStomPS(); +void _Xsj3cwOUTtomPS(); + +int _Xsj3cCmp(); +int _Xsj3cWcpy(); +void _Xsj3cWcat(); +int _Xsj3cWlen(); +char *_Xsj3cItoa(); +char *_Xsj3cXtoa(); + +void _Xsj3cInsertChar(); +void _Xsj3cInsertWchar(); +void _Xsj3cExtractChar(); +void _Xsj3cStoreYomi(); +int _Xsj3cStoreKanji(); + +void _Xsj3cFlushDcid(); +void _Xsj3cClearDcid(); + +Xsj3csMode _Xsj3cCheckMode(); + +extern wchar _Xsj3csjis2euc(); +extern wchar _Xsj3csjis2jis(); +extern wchar _Xsj3ceuc2sjis(); +extern wchar _Xsj3ceuc2jis(); +extern wchar _Xsj3cjis2sjis(); +extern wchar _Xsj3cjis2euc(); + +wchar (*CodeConvFunc[4][4])() = { + NULL, _Xsj3csjis2euc, _Xsj3csjis2jis, _Xsj3csjis2jis, + _Xsj3ceuc2sjis, NULL, _Xsj3ceuc2jis, _Xsj3ceuc2jis, + _Xsj3cjis2sjis, _Xsj3cjis2euc, NULL, NULL, + _Xsj3cjis2sjis, _Xsj3cjis2euc, NULL, NULL +}; + +/* + * Xsj3cSetInLang() + * Set input LANG + */ +void +Xsj3cSetInLang(lang) + int lang; +{ + in_lang = lang; +} + +/* + * Xsj3cSetOutLang() + * Set output LANG + */ +void +Xsj3cSetOutLang(lang) + int lang; +{ + out_lang = lang; +} + +/* + * Xsj3cSetKanaMod() + * Set output LANG + */ +void +Xsj3cSetKanaMod(mod) + unsigned long mod; +{ + KanaMask = mod; +} + +/* + * Xsj3cWarning() + * Print warning messages. (limit of 10 args) + */ +/*VARARGS1*/ +void +Xsj3cWarning(message, s0, s1, s2, s3, s4, s5, s6, s7, s8, s9) + char *message; + char *s0, *s1, *s2, *s3, *s4, *s5, *s6, *s7, *s8, *s9; +{ + (void)fprintf(stderr, "Xsj3cWarning: "); + if (message && *message) { + (void)fprintf(stderr, message, s0, s1, s2, s3, s4, s5, s6, s7, s8, s9); + (void)fprintf(stderr, "\n"); + } + return; +} + +/* + * Xsj3cError() + * Print error messages and exit. (limit of 10 args) + */ +/*VARARGS1*/ +void +Xsj3cError(message, s0, s1, s2, s3, s4, s5, s6, s7, s8, s9) + char *message; + char *s0, *s1, *s2, *s3, *s4, *s5, *s6, *s7, *s8, *s9; +{ + (void)fprintf(stderr, "Xsj3cError: "); + if (message && *message) { + (void)fprintf(stderr, message, s0, s1, s2, s3, s4, s5, s6, s7, s8, s9); + (void)fprintf(stderr, "\n"); + } + exit(1); +} + +/* + * _Xsj3cwPStowOUT() + * Convert string(unsigned short) code from process code to out_lang. + */ +int +_Xsj3cwPStowOUT(buf, p, q) + Xsj3cBuf buf; + register wchar *p, *q; +{ + register int i = 0; + register wchar (*conv)(); + + if (p == NULL) + return i; + if (conv = CodeConvFunc[serverIF[buf->server].lang][out_lang]) { + while (*q != '\0') { + i++; + if (iskan1(*q >> 8, serverIF[buf->server].lang) + && iskan2(0xff & *q, serverIF[buf->server].lang)) { + *p++ = conv(*q++); + continue; + } else if (iseuckana(*q >> 8)) { + *p++ = 0xff & *q++; + continue; + } + *p++ = *q++; + } + } else { + while (*p++ = *q++) i++; + return i; + } + *p = '\0'; + return i; +} + +/* + * _Xsj3cwOUTtowPS() + * Convert string(unsigned short) code from out_lang to process code. + */ +int +_Xsj3cwOUTtowPS(buf, p, q) + Xsj3cBuf buf; + register wchar *p, *q; +{ + register int i = 0; + register wchar (*conv)(); + + if (p == NULL) + return i; + if (conv = CodeConvFunc[out_lang][serverIF[buf->server].lang]) { + while (*q != '\0') { + i++; + if (*q & 0xff00) { + *p++ = conv(*q++); + continue; + } + *p++ = *q++; + } + } else { + while (*p++ = *q++) i++; + return i; + } + *p = '\0'; + return i; +} + +/* + * _Xsj3cCmp() + * Compare 2 words in lower and if they are matched, return True(1). + * Unless they are matched, return False(0). + */ +int +_Xsj3cCmp(s1, s2) + register char *s1, *s2; +{ + register char c1, c2; + + while (*s1 != '\0') { + c1 = *s1++; + c2 = *s2++; + if (tolower(c1) != tolower(c2)) + return 0; + } + if (s2 && *s2 != '\0') + return 0; + return 1; +} + +/* + * _Xsj3cmPStowPS() + * Multi bytes character(2nd arg.) to wide character(1st arg.) + * conversion routine. (Only for Shift-JIS code) + */ +int +_Xsj3cmPStowPS(buf, w, m) + Xsj3cBuf buf; + register wchar *w; + register unsigned char *m; +{ + register unsigned char c; + register int i = 0; + + while ((c = *m++) != '\0') { + if (iskan1(c, serverIF[buf->server].lang) + && iskan2(*m, serverIF[buf->server].lang)) { + *w++ = (c << 8) + *m++; + } else { + *w++ = 0xff & c; + } + i++; + } + *w = '\0'; + return i; +} + +/* + * _Xsj3cmPStowOUT() + * Multi bytes character(2nd arg.) to wide character(1st arg.) + * conversion routine. + */ +int +_Xsj3cmPStowOUT(buf, w, m) + Xsj3cBuf buf; + register wchar *w; + register unsigned char *m; +{ + register unsigned char c; + register int i = 0; + register wchar (*conv)(); + + if (conv = CodeConvFunc[serverIF[buf->server].lang][out_lang]) { + while ((c = *m++) != '\0') { + if (iskan1(c, serverIF[buf->server].lang) + && iskan2(*m, serverIF[buf->server].lang)) { + *w++ = conv((c << 8) + *m++); + } else { + *w++ = 0xff & c; + } + i++; + } + } else { + while ((c = *m++) != '\0') { + if (iskan1(c, serverIF[buf->server].lang) + && iskan2(*m, serverIF[buf->server].lang)) { + *w++ = (c << 8) + *m++; + } else { + *w++ = 0xff & c; + } + i++; + } + } + *w = '\0'; + return i; +} + +/* + * _Xsj3cmPStowPSn() + * Multi bytes character(2nd arg.) to wide character(1st arg.) + * conversion routine. (Maximum n(3rd arg.) bytes) + */ +int +_Xsj3cmPStowPSn(buf, w, m, n) + Xsj3cBuf buf; + register wchar *w; + register unsigned char *m; + register int n; +{ + register unsigned char c; + register int i = 0; + + while ((c = *m++) != '\0' && n--) { + if (iskan1(c, serverIF[buf->server].lang) + && iskan2(*m, serverIF[buf->server].lang)) { + *w++ = (c << 8) + *m++; + n--; + } else { + *w++ = 0xff & c; + } + i++; + } + *w = '\0'; + return i; +} + +/* + * _Xsj3cmPStowOUTn() + * Multi bytes character(2nd arg.) to wide character(1st arg.) + * conversion routine. (Maximum n(3rd arg.) bytes) + */ +int +_Xsj3cmPStowOUTn(buf, w, m, n) + Xsj3cBuf buf; + register wchar *w; + register unsigned char *m; + register int n; +{ + register unsigned char c; + register int i = 0; + register wchar (*conv)(); + + if (conv = CodeConvFunc[serverIF[buf->server].lang][out_lang]) { + while ((c = *m++) != '\0' && n--) { + if (iskan1(c, serverIF[buf->server].lang) + && iskan2(*m, serverIF[buf->server].lang)) { + *w++ = conv((c << 8) + *m++); + n--; + } else { + *w++ = 0xff & c; + } + i++; + } + } else { + while ((c = *m++) != '\0' && n--) { + if (iskan1(c, serverIF[buf->server].lang) + && iskan2(*m, serverIF[buf->server].lang)) { + *w++ = (c << 8) + *m++; + n--; + } else { + *w++ = 0xff & c; + } + i++; + } + } + *w = '\0'; + return i; +} + +/* + * _Xsj3cwPStomPS() + * Convert wide character(2nd arg.) to multi bytes characters(1st arg.). + * (Only for Shift-JIS code) + */ +void +_Xsj3cwPStomPS(buf, m, w) + Xsj3cBuf buf; + register unsigned char *m; + register wchar *w; +{ + register unsigned char c1, c2; + + while (*w != '\0') { + c1 = *w >> 8; + c2 = *w & 0xff; + if (iskan1(c1, serverIF[buf->server].lang) + && iskan2(c2, serverIF[buf->server].lang)) { + *m++ = c1; + *m++ = c2; + } else { + *m++ = c2; + } + w++; + } + *m = '\0'; +} + +/* + * _Xsj3cwOUTtomPS() + * Convert wide character(2nd arg.) to multi bytes characters(1st arg.). + */ +void +_Xsj3cwOUTtomPS(buf, m, w) + Xsj3cBuf buf; + register unsigned char *m; + register wchar *w; +{ + register wchar (*conv)(); + register wchar s; + + if (conv = CodeConvFunc[out_lang][serverIF[buf->server].lang]) { + while (*w != '\0') { + if (*w & 0xff00) { + s = conv(*w); + *m++ = s >> 8; + *m++ = s & 0xff; + } else { + *m++ = (*w & 0xff); + } + w++; + } + } else { + while (*w != '\0') { + if (*w & 0xff00) { + *m++ = *w >> 8; + *m++ = *w & 0xff; + } else { + *m++ = *w & 0xff; + } + w++; + } + } + *m = '\0'; +} + +/* + * _Xsj3cWcpy() + * Copy wide characters(2nd arg.) to wide characters(1st arg.) + */ +int +_Xsj3cWcpy(w1, w2) + register wchar *w1, *w2; +{ + register int i = 0; + + while (*w1++ = *w2++) i++; + return i; +} + +/* + * _Xsj3cWcat() + * Appends a copy of wide character(2nd arg.) to + * the end of wide character(1st arg.). + */ +void +_Xsj3cWcat(w1, w2) + register wchar *w1, *w2; +{ + while (*w1++); + w1--; + while (*w1++ = *w2++); +} + +/* + * _Xsj3cWlen() + * Returns the number of characters in 1st arg. + */ +int +_Xsj3cWlen(w) + register wchar *w; +{ + register int i = 0; + + while (*w++) + i++; + return i; +} + +/* + * _Xsj3cItoa() + * Converts digit number to string type and returns it. + */ +char * +_Xsj3cItoa(num) + register int num; +{ + register int i, bnum; + static char ch[24]; + + i = 20; + ch[i]= '\0'; + while (num > 9) { + bnum = num; + num /= 10; + ch[--i] = bnum - num * 10 + '0'; + } + ch[--i] = num + '0'; + return (&ch[i]); +} + +/* + * _Xsj3cXtoa() + * Converts hex number to string type and returns it. + */ +char * +_Xsj3cXtoa(num) + register int num; +{ + register int i, bnum, anum; + static char ch[20]; + + i = 18; + ch[i]= '\0'; + while (num) { + bnum = num; + num >>= 4; + if ((anum = (bnum - (num << 4))) > 9) + ch[--i] = anum + 'W'; + else + ch[--i] = anum + '0'; + } + ch[--i] = 'x'; + ch[--i] = '0'; + return (&ch[i]); +} + +/* + * _Xsj3cInsertChar() + * Convert multi bytes characters(2nd arg.) to wide characters and + * insert them (n characters) to yomi buffer after current position. + * (Only for Shift-JIS code) + */ +void +_Xsj3cInsertChar(buf, seg, m, n) + Xsj3cBuf buf; + register Xsj3cSeg seg; + register unsigned char *m; + register int n; +{ + register unsigned char c; + register int i = seg->num; + + while (i >= seg->cur) { + seg->yomi[i + n] = seg->yomi[i]; + i--; + } + + i = n; + while ((c = *m++) != '\0'&& i--) { + if (iskan1(c, serverIF[buf->server].lang) + && iskan2(*m, serverIF[buf->server].lang)) { + seg->yomi[seg->cur++] = (c << 8) + *m++; + } else { + seg->yomi[seg->cur++] = 0xff & c; + } + } + seg->num += n; +} + +/* + * _Xsj3cInsertWchar() + * insert wide characters to yomi buffer after current position. + * (Only for Shift-JIS code) + */ +void +_Xsj3cInsertWchar(seg, w, n) + register Xsj3cSeg seg; + register wchar *w; + register int n; +{ + register int i = seg->num; + + while (i >= seg->cur) { + seg->yomi[i + n] = seg->yomi[i]; + i--; + } + + i = n; + while (*w != '\0' && i--) { + seg->yomi[seg->cur++] = *w++; + } + seg->num += n; +} + +/* + * _Xsj3cExtractChar() + * Extract n characters before current postsion from yomi buffer + * and convert them to multi bytes character(1st arg.). + * (Only for Shift-JIS code) + */ +void +_Xsj3cExtractChar(buf, seg, m, n) + Xsj3cBuf buf; + register Xsj3cSeg seg; + register unsigned char *m; + register int n; +{ + register int i = seg->cur - n, j = n; + register unsigned char c1, c2; + + while ((seg->yomi[i]) != '\0' && j--) { + c1 = seg->yomi[i] >> 8; + c2 = seg->yomi[i] & 0xff; + if (iskan1(c1, serverIF[buf->server].lang) + && iskan2(c2, serverIF[buf->server].lang)) { + *m++ = c1; + *m++ = c2; + } else { + *m++ = c2; + } + i++; + } + *m = '\0'; + seg->cur -= n; + j = seg->cur; + while (i < seg->num) { + seg->yomi[j++] = seg->yomi[i++]; + } + seg->yomi[j] = '\0'; + seg->num -= n; +} + +/* + * _Xsj3cStoreYomi() + * Convert code of internal yomi buffer from Shift-JIS to EUC + * and put it to display yomi buffer. + */ +void +_Xsj3cStoreYomi(buf, seg, pos) + Xsj3cBuf buf; + register Xsj3cSeg seg; + register int pos; +{ + register int i; + register wchar (*conv)(); + + if (conv = CodeConvFunc[serverIF[buf->server].lang][out_lang]) { + for (i = pos; i < seg->num; i++) { + if (seg->yomi[i] & 0xff00) + seg->disp[i] = conv(seg->yomi[i]); + else + seg->disp[i] = seg->yomi[i]; + } + } else { + for (i = pos; i < seg->num; i++) + seg->disp[i] = seg->yomi[i]; + } + seg->disp[i] = '\0'; + seg->dnum = seg->num; +} + +/* + * _Xsj3cStoreKanji() + * Store converted strings to converted display buffers. + * (src-buffer and dest-buffer) + */ +int +_Xsj3cStoreKanji(buf, bun, cur, num, change) + Xsj3cBuf buf; + SJ3_BUNSETU *bun; + int cur, num, change; +{ + register int i, j; + + if (num > 1) { + for (i = buf->segnum - 1; i > cur; i--) { + j = i + num - 1; + buf->input[j] = buf->input[i]; + } + for (i = cur + 1; i < cur + num; i++) + buf->input[i] = NULL; + } + for (i = cur; i < cur + num; i++, bun++) { + if (!buf->input[i]) + buf->input[i] = (Xsj3cSeg)Xsj3cCreateSegment(buf); + else + Xsj3cResizeSegment(buf->input[i], KANABUFSIZ); + buf->input[i]->num = _Xsj3cmPStowPSn(buf, buf->input[i]->yomi, + bun->srcstr, bun->srclen); + if (bun->deststr && bun->destlen) { + buf->input[i]->dnum = _Xsj3cmPStowOUTn(buf, buf->input[i]->disp, + bun->deststr, bun->destlen); + } else { + _Xsj3cStoreYomi(buf, buf->input[i], 0); + } + buf->input[i]->status = SEG_CONVED; + buf->input[i]->cur = 0; + buf->input[i]->change = change; + buf->input[i]->edit = SEG_NOEDIT; + buf->input[i]->dcid = bun->dcid; + buf->input[i]->cursegmode = _Xsj3cCheckMode(buf, buf->input[i]); + } + if (buf->gakusyuu && buf->convmode == InputModeMask) { + serverIF[buf->server].func[FUNC_LOCK](); + locked[buf->server]++; + } else if (!buf->gakusyuu) { + for (i = cur; i < num; i++) + bzero(&(buf->input[i]->dcid), sizeof(buf->input[i]->dcid)); + } +} + +/* + * _Xsj3cCheckMode() + * Check character mode of the yomi buffer of segment. + */ +Xsj3csMode +_Xsj3cCheckMode(buf, seg) + Xsj3cBuf buf; + register Xsj3cSeg seg; +{ + register unsigned char c1, c2; + + c1 = seg->yomi[0] >> 8; + c2 = seg->yomi[0] & 0xff; + if (c2 != '\0') { + if (iskan1(c1, serverIF[buf->server].lang) + && iskan2(c2, serverIF[buf->server].lang)) { + if (iskata(seg->yomi[0], serverIF[buf->server].lang)) + return (MODE_ZKATA); + else if (iszalpha(seg->yomi[0], serverIF[buf->server].lang)) + return (MODE_ZALPHA); + else + return (MODE_HIRA); + } else { + if (iskana(c2)) + return (MODE_HKATA); + else + return (MODE_HALPHA); + } + } else { + return (MODE_HIRA); + } +} + +/* + * _Xsj3cFlushDcid() + * Flush dictionary-id. + */ +void +_Xsj3cFlushDcid(buf) + Xsj3cBuf buf; +{ + register int i; + unsigned char mbs[2][KANJIBUFSIZ]; + + if (buf->gakusyuu) { + for (i = 0; i < buf->segnum; i++) { + if (buf->input[i]->change) { + if (i < buf->segnum - 1) { + _Xsj3cwPStomPS(buf, mbs[0], buf->input[i]->yomi); + _Xsj3cwPStomPS(buf, mbs[1], buf->input[i + 1]->yomi); + if ((serverIF[buf->server].func[FUNC_STUDY2] + (mbs[0], mbs[1], &buf->input[i + 1]->dcid)) < 0) { + Xsj3cWarning("sj3serv is down. reconnect please"); + } + } + if (i) { + if (i == buf->segnum - 1) + _Xsj3cwPStomPS(buf, mbs[0], buf->input[i]->yomi); + _Xsj3cwPStomPS(buf, mbs[1], buf->input[i - 1]->yomi); + if ((serverIF[buf->server].func[FUNC_STUDY2] + (mbs[1], mbs[0], &buf->input[i]->dcid)) < 0) { + Xsj3cWarning("sj3serv is down. reconnect please"); + } + } else if (buf->segnum == 1) { + _Xsj3cwPStomPS(buf, mbs[0], buf->input[0]->yomi); + if ((serverIF[buf->server].func[FUNC_STUDY2] + (mbs[0], mbs[0], &buf->input[0]->dcid)) < 0) { + Xsj3cWarning("sj3serv is down. reconnect please"); + } + } + buf->input[i]->change = OFF; + } + } + buf->convedsegnum = 0; + if (locked[buf->server] > 0) { + if (!(--locked[buf->server])) + serverIF[buf->server].func[FUNC_UNLOCK](); + } + } +} + +/* + * _Xsj3cClearDcid() + * Clear dictionary-id. + */ +void +_Xsj3cClearDcid(buf) + Xsj3cBuf buf; +{ + register int i; + + for (i = 0; i < buf->segnum; i++) { + buf->input[i]->change = OFF; + bzero(&(buf->input[i]->dcid), sizeof(buf->input[i]->dcid)); + } + if (locked[buf->server] > 0) { + if (!(--locked[buf->server])) + serverIF[buf->server].func[FUNC_UNLOCK](); + } +} diff -r 000000000000 -r 92745d501b9a lib/Xsj3clib/util.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/Xsj3clib/util.h Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,60 @@ +/* $Id: util.h,v 2.1 1993/09/21 09:41:39 nao Exp $ */ +/* + * Copyright 1991 Sony Corporation + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Sony not be used in advertising or + * publicity pertaining to distribution of the software without specific, + * written prior permission. Sony makes no representations about the + * suitability of this software for any purpose. It is provided "as is" + * without express or implied warranty. + * + * SONY DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL SONY + * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ +/* + * Author: Naoshi Suzuki, SONY Corporation. (nao@sm.sony.co.jp) + */ + +extern void Xsj3cError(); +extern void Xsj3cWarning(); + +extern int _Xsj3cwPStowOUT(); +extern int _Xsj3cwOUTtowPS(); +extern int _Xsj3cmPStowPS(); +extern int _Xsj3cmPStowOUT(); +extern int _Xsj3cmPStowPSn(); +extern int _Xsj3cmPStowOUTn(); +extern void _Xsj3cwPStomPS(); +extern void _Xsj3cwOUTtomPS(); + +extern int _Xsj3cCmp(); +extern int _Xsj3cWcpy(); +extern void _Xsj3cWcat(); +extern int _Xsj3cWlen(); +extern char *_Xsj3cItoa(); +extern char *_Xsj3cXtoa(); + +extern void _Xsj3cInsertChar(); +extern void _Xsj3cInsertWchar(); +extern void _Xsj3cExtractChar(); +extern void _Xsj3cStoreYomi(); +extern int _Xsj3cStoreKanji(); + +extern void _Xsj3cFlushDcid(); +extern void _Xsj3cClearDcid(); + +extern Xsj3ccMode _Xsj3cCheckMode(); + +extern int in_lang, out_lang; +extern int locked[SERVER_NUM]; +extern unsigned long KanaMask; + +extern wchar (*CodeConvFunc[4][4])(); diff -r 000000000000 -r 92745d501b9a lib/asyncerr.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/asyncerr.c Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,275 @@ +#ifndef lint +static char *rcsid = "$Id: asyncerr.c,v 1.6 1994/08/08 01:20:52 ishisone Exp $"; +#endif +/* + * Copyright (C) 1992, 1994 Software Research Associates, Inc. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Software Research Associates not be + * used in advertising or publicity pertaining to distribution of the + * software without specific, written prior permission. Software Research + * Associates makes no representations about the suitability of this software + * for any purpose. It is provided "as is" without express or implied + * warranty. + * + * Author: Makoto Ishisone, Software Research Associates, Inc., Japan + */ + +/* + * X asyncronous error handler + */ + +#include +#include +#include "AsyncErr.h" + +#ifdef __STDC__ +#include +#else +extern char *malloc(); +#endif + +#ifndef NULL +#define NULL 0 +#endif + +#undef XSetErrorHandler + +typedef struct fe_errdesc_ { + struct fe_errdesc_ *prev; + struct fe_errdesc_ *next; + Display *dpy; + unsigned long from; /* range of the sequence numbers */ + unsigned long to; /* which this handler covers */ + int (*handler)(); /* async handler */ + void (*destroy)(); + XPointer client_data; +} ErrDesc; + +static ErrDesc esentinel = { + &esentinel, + &esentinel, +}; + +#define EHEAD (esentinel.next) +#define ETAIL (esentinel.prev) +#define EEND(p) ((p) == &esentinel) + +static int (*original_handler)(); + +/* + * Some useful handlers + */ + +/* ARGSUSED */ +static int +ignoreErrors(dpy, eev, cldata) +Display *dpy; +XErrorEvent *eev; +XPointer cldata; +{ + /* + * Just ignore any errors. + */ + return 0; +} + +/* ARGSUSED */ +static int +recordErrors(dpy, eev, cldata) +Display *dpy; +XErrorEvent *eev; +XPointer cldata; +{ + /* + * Record the type of the error. + * It assumes that the client data is a pointer to + * an unsigned long int. If error occurs, it does: + * + if the error code is less than 32, set the 'error code'th bit. + * + otherwise (i.e. extension defined error) set the bit 0. + */ + unsigned long *errorbitsp = (unsigned long *)cldata; + + if (eev->error_code < 32) { + *errorbitsp |= (1 << eev->error_code); + } else { + /* other errors */ + *errorbitsp |= 1; + } + + /* don't invoke global handler */ + return 0; +} + +static ErrDesc * +newErrDesc() +{ + return (ErrDesc *)malloc(sizeof(ErrDesc)); +} + +static void +eremove(edp) +ErrDesc *edp; +{ + edp->prev->next = edp->next; + edp->next->prev = edp->prev; +} + +static void +eappend(edp) +ErrDesc *edp; +{ + edp->prev = esentinel.prev; + edp->next = &esentinel; + (esentinel.prev)->next = edp; + esentinel.prev = edp; +} + +static void +removeHandler(edp) +ErrDesc *edp; +{ + if (edp->destroy != NULL) (*edp->destroy)(edp->dpy, edp->client_data); + eremove(edp); + (void)free((char *)edp); +} + +static int +callHandlers(dpy, eev) +Display *dpy; +XErrorEvent *eev; +{ + ErrDesc *edp = EHEAD; + int found = 0; + int call_original = 0; + + while (!EEND(edp)) { + if (edp->dpy == dpy && edp->from <= eev->serial && + (eev->serial < edp->to || edp->from == edp->to)) { + found = 1; + if ((*edp->handler)(dpy, eev, edp->client_data)) call_original = 1; + } + edp = edp->next; + } + return !found || call_original; +} + +static void +removeHandlers(dpy) +Display *dpy; +{ + /* + * Remove obsolete (out of date) handlers. + */ + ErrDesc *edp = EHEAD; + unsigned long last = LastKnownRequestProcessed(dpy); + + while (!EEND(edp)) { + ErrDesc *next = edp->next; + + if (edp->dpy == dpy && edp->to <= last && edp->from != edp->to) { + removeHandler(edp); + } + edp = next; + } +} + +/* + * public functions + */ + +int +XAEHandler(dpy, eev) +Display *dpy; +XErrorEvent *eev; +{ + if (callHandlers(dpy, eev) && original_handler != NULL) { + (void)original_handler(dpy, eev); + } + removeHandlers(dpy); + return 0; /* for lint */ +} + +void +XAEInit() +{ + int (*oldhandler)() = XSetErrorHandler(XAEHandler); + + if (oldhandler != XAEHandler) original_handler = oldhandler; +} + +XErrorHandler +XAESetErrorHandler(handler) +XErrorHandler handler; +{ + int (*oldhandler)(); + + oldhandler = original_handler; + original_handler = handler; + return oldhandler; +} + +XAEHandle +XAESet(dpy, handler, destroy, client_data) +Display *dpy; +int (*handler)(); +void (*destroy)(); +XPointer client_data; +{ + ErrDesc *e; + + /* + * First, remove out-of-date handlers. + */ + removeHandlers(dpy); + + /* + * Allocate new ErrDesc structure. + */ + e = newErrDesc(); + if (e == NULL) return NULL; + + e->dpy = dpy; + e->from = NextRequest(dpy); + e->to = e->from; + e->handler = handler; + e->destroy = destroy; + e->client_data = client_data; + + eappend(e); + + return e; +} + +void +XAEUnset(handle) +XAEHandle handle; +{ + Display *dpy = handle->dpy; + + if (handle != NULL && handle->from == handle->to) { + handle->to = NextRequest(dpy); + if (handle->to <= handle->from) removeHandler(handle); + } + removeHandlers(dpy); +} + +XAEHandle +XAESetIgnoreErrors(dpy) +Display *dpy; +{ + return XAESet(dpy, ignoreErrors, (void (*)())NULL, (XPointer)NULL); +} + +XAEHandle +XAESetRecordErrors(dpy, errorbitsp) +Display *dpy; +unsigned long *errorbitsp; +{ + *errorbitsp = 0L; /* clear all bits */ + return XAESet(dpy, recordErrors, + (void (*)())NULL, (XPointer)errorbitsp); +} diff -r 000000000000 -r 92745d501b9a lib/cachedatom.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/cachedatom.c Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,210 @@ +#ifndef lint +static char *rcsid = "$Id: cachedatom.c,v 1.9 1994/05/17 04:48:01 ishisone Rel $"; +#endif +/* + * Copyright (c) 1991 Software Research Associates, Inc. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Software Research Associates not be + * used in advertising or publicity pertaining to distribution of the + * software without specific, written prior permission. Software Research + * Associates makes no representations about the suitability of this software + * for any purpose. It is provided "as is" without express or implied + * warranty. + * + * Author: Makoto Ishisone, Software Research Associates, Inc., Japan + * + * neither R5 Xlib nor Xmu doesn't do what I want, so I wrote one myself. + */ + +#include +#include "CachedAtom.h" + +#define DEBUG_VAR debug_cachedatom +#include "DebugPrint.h" + +typedef struct _atomrec_ { + Atom atom; /* atom number */ + Display *dpy; + String name; /* for obtaining atom name */ + struct _atomrec_ *nextOfName; /* next element of atom name list */ + struct _atomrec_ *nextOfNumber; /* next element of atom number list */ +} CachedAtomRec; + +typedef struct _cAtomNameRec_ { + String name; /* atom name */ + CachedAtomRec atomrec; /* caution: not a pointer! */ + struct _cAtomNameRec_ *next; /* next entry of the same hash value */ +} CachedAtomNameRec; + +#define NAMEHASHSIZE 128 +#define NUMBERHASHSIZE 128 + +static CachedAtomNameRec *nameHash[NAMEHASHSIZE]; + /* for searching by name */ +static CachedAtomRec *numberHash[NUMBERHASHSIZE]; + /* for searching by number */ + + +/* + * iternal functions + */ + +static int +nameHashFunc(s) +String s; +{ + register String sp = s; + register int c, sum; + + sum = 0; + while ((c = *sp++) != '\0') sum += c; + + return (sum ^ (sp - s)) % NAMEHASHSIZE; +} + +#define numberHashFunc(atom) ((int)((atom) % NUMBERHASHSIZE)) + +static CachedAtomRec * +newAtomRec(dpy, atom, arp, nrp) +Display *dpy; +Atom atom; +CachedAtomRec *arp; /* NULL (create new rec) or &nrp->atomrec */ +CachedAtomNameRec *nrp; +{ + int hashvalue; + + if (arp == NULL) arp = XtNew(CachedAtomRec); + arp->atom = atom; + arp->dpy = dpy; + arp->name = nrp->name; + + if (arp == &(nrp->atomrec)) { + arp->nextOfName = NULL; + } else { + arp->nextOfName = nrp->atomrec.nextOfName; + nrp->atomrec.nextOfName = arp; + } + + /* insert it in numberHash */ + hashvalue = numberHashFunc(atom); + arp->nextOfNumber = numberHash[hashvalue]; + numberHash[numberHashFunc(atom)] = arp; + + return arp; +} + +static CachedAtomNameRec * +newNameRec(name, hashvalue) +String name; +int hashvalue; +{ + CachedAtomNameRec *nrp = XtNew(CachedAtomNameRec); + + nrp->name = XtNewString(name); + nrp->next = nameHash[hashvalue]; + nameHash[hashvalue] = nrp; + return nrp; +} + +/* + * public functions + */ + +Atom +CachedInternAtom(dpy, name, exists) +Display *dpy; +char *name; +Bool exists; +{ + int hashvalue = nameHashFunc(name); + CachedAtomNameRec *nrp = nameHash[hashvalue]; + Atom atom; + + TRACE(("CachedInternAtom(name:%s)... ", name)); + while (nrp != NULL) { + if (!strcmp(nrp->name, name)) { + CachedAtomRec *arp = &(nrp->atomrec); + + do { + if (arp->dpy == dpy) { + TRACE(("found in the cache (%ld)\n", arp->atom)); + return arp->atom; + } + arp = arp->nextOfName; + } while (arp != NULL); + + TRACE(("not in the cache\n")); + if ((atom = XInternAtom(dpy, name, exists)) == None) return None; + (void)newAtomRec(dpy, atom, (CachedAtomRec *)NULL, nrp); + return atom; + } + nrp = nrp->next; + } + + TRACE(("not in the cache\n")); + if ((atom = XInternAtom(dpy, name, exists)) == None) return None; + nrp = newNameRec(name, hashvalue); + (void)newAtomRec(dpy, atom, &(nrp->atomrec), nrp); + + return atom; +} + +String +CachedGetAtomName(dpy, atom) +Display *dpy; +Atom atom; +{ + int hashvalue = numberHashFunc(atom); + CachedAtomRec *arp = numberHash[hashvalue]; + CachedAtomNameRec *nrp; + String name; + + TRACE(("CachedGetAtomName(atom=%ld)... ", atom)); + while (arp != NULL) { + if (arp->atom == atom && arp->dpy == dpy) { + TRACE(("found in the cache (%s)\n", arp->name)); + return arp->name; + } + arp = arp->nextOfNumber; + } + TRACE(("not in the cache\n")); + if ((name = XGetAtomName(dpy, atom)) == NULL) return NULL; + hashvalue = nameHashFunc(name); + nrp = newNameRec(name, hashvalue); + XFree(name); + (void)newAtomRec(dpy, atom, &(nrp->atomrec), nrp); + return nrp->name; +} + +#ifdef DEBUG +void +dumpAtomCache() +{ + int i; + + for (i = 0; i < NAMEHASHSIZE; i++) { + CachedAtomNameRec *nrp = nameHash[i]; + int n = 0; + + while (nrp != NULL) { + n++; + nrp = nrp->next; + } + printf("nameHash[%3d]: %d\n", i, n); + } + for (i = 0; i < NUMBERHASHSIZE; i++) { + CachedAtomRec *arp = numberHash[i]; + int n = 0; + + while (arp != NULL) { + n++; + arp = arp->nextOfNumber; + } + printf("numberHash[%3d]: %d\n", i, n); + } +} +#endif diff -r 000000000000 -r 92745d501b9a lib/cachedfont.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/cachedfont.c Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,271 @@ +#ifndef lint +static char *rcsid = "$Id: cachedfont.c,v 1.13 1994/05/17 10:51:54 ishisone Rel $"; +#endif +/* + * Copyright (c) 1991 Software Research Associates, Inc. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Software Research Associates not be + * used in advertising or publicity pertaining to distribution of the + * software without specific, written prior permission. Software Research + * Associates makes no representations about the suitability of this software + * for any purpose. It is provided "as is" without express or implied + * warranty. + * + * Author: Makoto Ishisone, Software Research Associates, Inc., Japan + */ + +#include +#include +#include +#include "CachedAtom.h" +#include "CachedFont.h" +#include "AsyncErr.h" + +#define DEBUG_VAR debug_cachedfont +#include "DebugPrint.h" + +typedef struct _fontrec_ { + Display *dpy; + String *names; /* full name or aliases... (in lower case) */ + Cardinal num_names; + Atom fontprop; /* 'FONT' property value */ + XFontStruct *font; + int refcnt; + struct _fontrec_ *next; +} FontRec; + +static FontRec *FRP = NULL; + +static FontRec * +LookupByAtom(dpy, atom) +Display *dpy; +Atom atom; +{ + register FontRec *frp; + + for (frp = FRP; frp != NULL; frp = frp->next) { + if (frp->dpy == dpy && frp->fontprop == atom) return frp; + } + return NULL; +} + +static FontRec * +LookupByName(dpy, name) +Display *dpy; +String name; +{ + register FontRec *frp; + register String *names; + register Cardinal i; + + for (frp = FRP; frp != NULL; frp = frp->next) { + if (frp->dpy != dpy) continue; + + for (i = frp->num_names, names = frp->names; i > 0; i--, names++) { + if (!strcmp(*names, name)) return frp; + } + } + return NULL; +} + +static void +AddName(frp, name) +register FontRec *frp; +String name; +{ + String dup = XtNewString(name); + + if (frp->num_names++ == 0) { + frp->names = (String *)XtMalloc(sizeof(String)); + } else { + frp->names = (String *)XtRealloc((char *)frp->names, + sizeof(String) * frp->num_names); + } + frp->names[frp->num_names - 1] = dup; +} + +static void +LoadFont(frp) +register FontRec *frp; +{ + if (frp->font->fid == None) { + frp->font->fid = XLoadFont(frp->dpy, frp->names[0]); + frp->refcnt = 0; /* reset */ + } +} + +static XFontStruct * +AddFont(dpy, name) +Display *dpy; +char *name; +{ + FontRec *frp; + XFontStruct *font; + Atom fontprop; + + font = XLoadQueryFont(dpy, name); + if (font == NULL) return NULL; + + if (!XGetFontProperty(font, XA_FONT, (unsigned long *)&fontprop)) { + /* well, make it by myself */ + DPRINT(("AddFont(): %s doesn't have FONT property\n", name)); + fontprop = CachedInternAtom(dpy, name, False); + } + + if ((frp = LookupByAtom(dpy, fontprop)) != NULL) { + /* already loaded. use it */ + TRACE(("\tfound in the cache (alias name?)\n")); + AddName(frp, name); + frp->refcnt++; + if (frp->font->fid == None) { + frp->font->fid = font->fid; + XFreeFontInfo((char **)NULL, font, 1); + } else { + XFreeFont(dpy, font); + } + return frp->font; + } + + TRACE(("\tnot found in the cache\n")); + frp = XtNew(FontRec); + frp->dpy = dpy; + frp->num_names = 0; + AddName(frp, name); + frp->fontprop = fontprop; + frp->font = font; + frp->refcnt = 1; + frp->next = FRP; + FRP = frp; + + return frp->font; +} + + +/* + * Public functions + */ + +XFontStruct * +CachedLoadQueryFontByName(dpy, name) +Display *dpy; +String name; +{ + FontRec *frp; + XFontStruct *font; + char buf[256]; + char *loweredname = buf; + int len = strlen(name) + 1; + + if (len > sizeof(buf)) loweredname = XtMalloc(len); + + XmuCopyISOLatin1Lowered(loweredname, name); + + TRACE(("CachedLoadQueryFontByName(name=%s)\n", name)); + if ((frp = LookupByName(dpy, loweredname)) != NULL) { + TRACE(("\tfound in the cache\n")); + LoadFont(frp); + frp->refcnt++; + if (loweredname != buf) XtFree(loweredname); + return frp->font; + } + + font = AddFont(dpy, loweredname); + if (loweredname != buf) XtFree(loweredname); + return font; +} + +XFontStruct * +CachedLoadQueryFontByProp(dpy, atom) +Display *dpy; +Atom atom; +{ + FontRec *frp; + XFontStruct *font; + String name; + XAEHandle h; + + TRACE(("CachedLoadQueryFontByProp(atom=%ld)\n", atom)); + if ((frp = LookupByAtom(dpy, atom)) != NULL) { + TRACE(("\tfound in the cache\n")); + LoadFont(frp); + frp->refcnt++; + return frp->font; + } + + /* get fontname */ + /* make it safe... */ + h = XAESetIgnoreErrors(dpy); + name = CachedGetAtomName(dpy, atom); + XAEUnset(h); + + TRACE(("\tnot found. got font name: %s\n", name ? name : "")); + + if (name == NULL) { + font = NULL; + } else { + char buf[256]; + char *loweredname = buf; + int len = strlen(name) + 1; + + if (len > sizeof(buf)) loweredname = XtMalloc(len); + XmuCopyISOLatin1Lowered(loweredname, name); + font = AddFont(dpy, loweredname); + if (loweredname != buf) XtFree(loweredname); + } + return font; +} + +/* ARGSUSED */ +XFontStruct * +CachedLoadFontByFontStruct(dpy, font) +Display *dpy; +XFontStruct *font; +{ + register FontRec *frp; + + TRACE(("CachedLoadFontByFontStruct(fid=%08lx)\n", font->fid)); + for (frp = FRP; frp != NULL; frp = frp->next) { + if (frp->font == font) { + if (frp->refcnt++ == 0) { + /* load it */ + TRACE(("\trefcnt == 0. loading %s again...\n", frp->names[0])); + frp->font->fid = XLoadFont(frp->dpy, frp->names[0]); + } + return font; + } + } + + /* not found */ + TRACE(("\tfont not found in the cache\n")); + return NULL; +} + +/* ARGSUSED */ +void +CachedFreeFont(dpy, font) +Display *dpy; +XFontStruct *font; +{ + register FontRec *frp; + + TRACE(("CachedFreeFont(fid=%08lx)\n", font->fid)); + for (frp = FRP; frp != NULL; frp = frp->next) { + if (frp->font == font) { + if (--frp->refcnt == 0) { + /* unload it, but not free its structure for later use */ + TRACE(("\trefcnt == 0. unloading...\n")); + XUnloadFont(frp->dpy, frp->font->fid); + frp->font->fid = None; + } + return; + } + } + + /* not found. free anyway... */ + TRACE(("\tfont not found in the cache. free anyway...\n")); + XFreeFont(dpy, font); +} diff -r 000000000000 -r 92745d501b9a lib/cconv.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/cconv.c Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,2777 @@ +/* + * cconv.c -- $BF~NOJ8;zJQ49%i%$%V%i%j(B (for X11) + * ver 10.8 + */ + +/* + * Copyright (C) 1988 Software Research Associates, Inc. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Software Research Associates not be + * used in advertising or publicity pertaining to distribution of the + * software without specific, written prior permission. Software Research + * Associates makes no representations about the suitability of this software + * for any purpose. It is provided "as is" without express or implied + * warranty. + * + * Author: Makoto Ishisone, Software Research Associates, Inc., Japan + * ishisone@sra.co.jp + */ + +/* + * $B35MW(B + * + * $BF~NOJ8;zJQ49$O!"$+$J4A;zJQ49$NA0CJ3,$G$"$j!"$=$NL\E*$O%-!<%\!<%I$+$i(B + * $BF~NO$5$l$?%-!<%3!<%I$r2r$C$F!"Bg$-$/J,$1$k$HfIW$@$m$&(B + * version 6.4 88/09/05 + * $B2CF#;a(B@$BEl9)Bg$N0U8+$K$h$j(B redo $B5!G=$rF~$l$k(B + * $B$D$$$G$K(B static function $B$N@k8@$r$D$1$k(B + * $B$$$/$D$+$N4X?t$r(B external $B$+$i(B static $B$KJQ$($k(B + * version 6.5 88/09/07 + * function $B$,J#?t=q$1$k$h$&$K$7$?(B + * $B$=$N$?$a%G!<%?9=B$$rJQ99$9$k(B + * version 6.6 88/10/07 + * $B$J$s$H(B readRuleFile() $B$G%*!<%W%s$7$?%U%!%$%k$r(B + * $BJD$8$k$N$rK:$l$F$$$?(B -- $B$"!<$O$:$+$7$$(B + * $B=>$C$F(B wterm $B$G2?2s$b(B KanjiConvert $B$N(B on/off $B$r7+$jJV$9$H(B + * $B=i4|2=$K<:GT$9$k(B + * version 6.7 88/12/19 + * wstrlen() $B$O$3$N%i%$%V%i%j$GDj5A$9$k$Y$-$b$N$G$O$J$$$N$G30$9(B + * version 6.8 89/07/21 + * $B1F;3;a(B@$B>>2l9g!"(B#0x$B#1#6?J?t(B $B$NFI$_$H$j$K%P%0$,(B + * $B$"$k$3$H$,H=L@(B + * version 7.0 89/08/16 + * jclib $B$N(B Wnn version4 $BBP1~$K$h$j!"JQ49%P%C%U%!$,J#?t;}$F$k$h$&$K(B + * $B$J$C$?(B + * $B$=$l$K9g$o$;$F!"(Bcconv $B$b%P%C%U%!$,J#?t;}$F$k$h$&$K$7$J$1$l$P(B + * $B$J$i$J$$(B + * $B7k6IH>J,0J>e=q$-49$($F$7$^$C$?$h$&$@(B + * version 7.1 89/08/17 + * $B%P%0%U%#%C%/%9(B + * $B%b!<%IJQ99DLCNMQ$N%3!<%k%P%C%/$rDI2C$9$k(B + * version 7.2 89/08/23 + * $B%U%!%s%/%7%g%s%F!<%V%k$O!"$d$O$j(B ccParseRule() $B$G$O$J$/!"(B + * ccCreateBuf() $B$G;XDj$9$k$Y$-$b$N$J$N$G!"$=$N$h$&$KJQ99$9$k(B + * version 7.3 89/08/25 + * lint $B$G7Y9p$,=P$J$$$h$&$K=$@5(B + * dumpAllRules() $B$G$A$c$s$HJQ49%k!<%k$,%@%s%W$5$l$k$h$&$K=$@5(B + * version 7.4 89/08/26 + * ccParseRule() $B$G!"JQ49Dj5A%U%!%$%k$,A0$HF1$8$G$"$l$P(B + * $B%k!<%k$r6&MQ$9$k$h$&$KJQ99(B + * ccParseRule/ccFreeRule $B$G$N(B memory leak $B$N=$@5(B + * version 7.5 89/09/26 + * $BJQ49Dj5A%U%!%$%k$G(B include $B$,;H$($k$h$&$K=$@5(B + * version 7.6 89/09/27 + * include $B$N@bL@$r=q$/$N$rK:$l$F$$$?$N$G$=$l$rDI2C(B + * version 7.7 89/10/26 + * getKey() $B$G(B #$B?t;z(B $B7?$NI=5-$r$7$?;~$K$^$@%P%0$,$"$C$?$N$G=$@5(B + * $B$=$b$=$b$3$NJ}<0$NI=5-$G$O%^%9%/$,;XDj$G$-$J$$$H$$$&:,K\E*$J(B + * $BLdBj$,$"$k$,!"$^$"$3$l$O$$$$$3$H$K$7$F!#(B + * version 8.0 89/10/27 + * R4 contrib $B8~$1$N(B Release $B$K$"$?$C$F%P!<%8%g%sHV9f$r=$@5(B + * version 8.1 89/12/25 + * include $B%U%!%$%k$,$J$+$C$?;~$K%3%"%@%s%W$9$k%P%0$r=$@5(B + * version 8.2 90/02/15 + * X11R4 keyboard group support $BDI2C(B + * version 8.3 90/02/16 + * keyboard group support $B$N7k2L!"Nc$($P(B + * "" shift-Right "" foo + * "" Right "" bar + * $B$H$$$&%k!<%k$,$"$C$?;~!"(Bshift-Right $B$r2!$7$?$K$b$+$+$o$i$:(B + * $B$7$?$N%k!<%k$K%^%C%A$7$F$7$^$&$H$$$&%P%0$r=$@5(B + * $BDj5A%U%!%$%k(B (include $B%U%!%$%k$b4^$`(B) $B$N%5!<%A%Q%9$H$7$F(B + * $B4D6-JQ?t(B CC_DEF_PATH $B$r;H$&$h$&$K=$@5(B + * version 8.4 90/04/17 + * keyboard group support $B$N%3!<%I$N%1%"%l%9%_%9$r=$@5(B + * $BJQ?tL>(B ks1 $B$H(B ks2 $B$r4V0c$($?(B + * version 8.5 90/05/31 + * keyboard group support $B$NIT6q9g$r=$@5(B + * $BL1ED;a(B@$B%"%9%F%C%/$+$i$N%l%]!<%H(B + * version 8.6 91/03/20 + * $B$I$N%k!<%k$K$b%^%C%A$7$J$+$C$?;~$K$O%G%U%)%k%H%"%/%7%g%s$,8F$P$l$k$,!"(B + * $B$3$N=hM}$G(B + * + $B0z?t$,4V0c$C$F$$$?(B + * + XLookupString() $B$N%j%?!<%s%P%j%e!<$,(B 0 $B$N$H$-(B ($B$D$^$j(B + * $B%-!<%$%Y%s%H$KBP1~$9$kJ8;zNs$,$J$+$C$?;~(B) $B$K%G%U%)%k%H(B + * $B%"%/%7%g%s$,8F$P$l$J$+$C$?(B + * $B$H$$$&LdBj$r=$@5(B + * $B%G%U%)%k%H%"%/%7%g%s$,(B NULL $B$N;~!"$I$N%k!<%k$K$b%^%C%A$7$J$1$l$P(B + * ccConvchar() $B$,(B -1 $B$rJV$9$h$&$K=$@5(B + * version 8.7 91/03/25 + * $BA0$N%P!<%8%g%s$N=$@5$K$h$j!"C1$K%7%U%H%-!<$d%3%s%H%m!<%k%-!<$r(B + * $B2!$7$?$@$1$G%G%U%)%k%H%"%/%7%g%s$,8F$P$l$k$h$&$K$J$C$?$,!"$3$l$O(B + * $B%f!<%6$N4|BT$9$kF0:n$G$O$J$$$h$&$J5$$,$9$k$N$G!"(BXLookupString() $B$N(B + * $B%j%?!<%s%P%j%e!<$,(B 0 $B$N;~$K$O%G%U%)%k%H%"%/%7%g%s$r8F$P$J$$$h$&$K(B + * $B:F=$@5(B + * $B$^$?!"%G%U%)%k%H%"%/%7%g%s$,(B NULL $B$G$+$D%k!<%k$K%^%C%A$7$J$$;~$K(B + * ccConvchar() $B$,(B -1 $B$rJV$9$h$&$K$7$?$,!"%G%U%)%k%H%"%/%7%g%s$NCM$K(B + * $B$h$C$F%j%?!<%s%P%j%e!<$,JQ$o$k$N$OJQ$@$7!"(B-1 $B$rJV$9$N$O%(%i!<$,(B + * $B5/$3$C$?$_$?$$$J$N$G!"7k6I%G%U%)%k%H%"%/%7%g%s$,(B NULL $B$G$"$k$+(B + * $B$I$&$+$K4X$o$i$:%^%C%A$7$?;~$O(B 1$B!"%^%C%A$7$J$$;~$O(B 0 $B$rJV$9(B + * $B$h$&$K=$@5(B + * $B$3$NJQ99$K$h$j(B ccConvchar() $B$N%j%?!<%s%P%j%e!<$,(B 0 $B$+$I$&$+%A%'%C%/(B + * $B$7$F$$$?%"%W%j%1!<%7%g%s$OF0$+$J$/$J$k$,!":#$^$G(B ccConvchar() $B$N(B + * $B%j%?!<%s%P%j%e!<$ODj5A$7$F$$$J$+$C$?$N$G$3$l$O$=$N%"%W%j%1!<%7%g%s$N(B + * $B@UG$(B + * version 9.0 91/08/15 + * $BJ8;z$N%G!<%?7?$H$7$F:#$^$G$:$C$H(B wchar_t $B$r;H$C$F$$$?$,!"(Bwchar_t $B$N(B + * $BDj5A$,5!A0$N%U%#!<%k%I$,!"(BSystemV $B7O$N%^%7%s(B + * $B$@$H(B strchr $B$KJQ$o$C$F$7$^$&$N$G(B findex $B$H$$$&L>A0$KJQ99(B + * version 9.2 91/09/23 + * DEBUG $B$,Dj5A$5$l$F$$$k$HJQ49%k!<%k$,%@%s%W$5$l$F$7$^$&$N$O(B kinput2 + * $B$G;HMQ$9$k>l9g:$$k$N$G!"(BDEBUG $B$r(B DEBUG_CCONV $B$KJQ99(B + * version 10.0 91/10/01 + * R5 contrib $B8~$1$N%j%j!<%9$K$"$?$C$F%P!<%8%g%sHV9f$r=$@5(B + * version 10.1 92/06/05 + * Display $B9=B$BN$N(B mode_switch $B$r;2>H$7$F$$$?$,!"(BDisplay $B9=B$BN$O(B + * $BK\Mh(B opaque $B$G$"$j!"Cf$N%a%s%P!<$rD>@\%"%/%;%9$9$k$N$O$^$:$$$N$G(B + * mode_switch $B$NCM$r<+J,$G7W;;$9$k$h$&$KJQ99(B + * version 10.2 94/04/21 + * $B4X?t(B eproc $B$O(B varargs.h/stdarg.h $B$r;H$o$:$K=q$+$l$F$$$?$,!"(B + * $B0\?"@-$KLdBj$,$"$k(B (int $B$H(B long $B$N%5%$%:$,0[$J$k%^%7%s$J$I(B) + * $B$N$G=$@5(B + * version 10.3 97/09/17 + * $B$J$f$?$5$s(B@$BElBg$K$h$k5!G=3HD%%Q%C%A(B ($B%U%!%s%/%7%g%s%G%#%9%Q%C%A%c$N(B + * $BJV$jCM$G;D$j$N4X?t$Ne$NOC$G!"G[I[MQ%=!<%9$O85!9(B JIS $B%3!<%I$K$J$C$F$$$k!#(B + * version 10.7 99/04/02 + * $B=i4|2=;~$N%(%i!<%A%'%C%/$N6/2=!"$H$$$&$+%P%0=$@5!#JQ49%k!<%kDj5A(B + * $B%U%!%$%k$K%k!<%k$,Dj5A$5$l$F$$$J$+$C$?>l9g(B ($B$D$^$j4V0c$C$FA4A3(B + * $BJL$N%U%!%$%k$rFI$_9~$s$G$7$^$C$?>l9g(B) $B$K%(%i!<$K$9$k!#(B + * version 10.8 99/05/07 + * $B<+F03NDj5!G=$,!"JQ49%k!<%kDj5A%U%!%$%k$G$N;XDj$K4X$o$i$:(B + * $B>o$K%*%s$K$J$C$F$7$^$&$H$$$&%P%0$r=$@5!#(B + */ + +/* + * $B;HMQK!(B + * + * $B;HMQK!$O3d9g4JC1$G$"$k!#:G=i$KJQ49%k!<%kDj5A%U%!%$%k$rFI$_9~$`$?$a$K(B + * ccParseRule() $B$r%3!<%k$9$k!#(B + * $B$N%U%!%s%/%7%g%s$r8F$Y$P$h$$!#(B + */ + +/* + * $BJQ49$N;EAH$_(B + * + * $B$3$NF~NOJ8;zJQ49$N;EAH$_$rM}2r$9$k$?$a$N%-!<%o!<%I$OL>JQ49$r$7$F$+$J$rF~NO$9$k%b!<%I!W$H$+(B + * $B!V%"%k%U%!%Y%C%H$rF~NO$9$k%b!<%I!W$H$$$C$?$b$N$G$"$k!#(B + * $B%b!<%I$4$H$K0[$J$kJQ49%k!<%k$,@_Dj$G$-$k!#EvA3%b!<%I$N@ZBX$($b(B + * $BJQ49%k!<%k$H$7$F5-=R$G$-$k!#(B + * + * $B!&JQ49%k!<%k(B + * $BJQ49%k!<%k$O(B4$B$D$N9`L\$+$i9=@.$5$l$k!#(B + * $BF~NO%-!<(B + * $B%3%s%F%-%9%HJ8;zNs(B + * $BJQ497k2LJ8;zNs(B + * $B%U%!%s%/%7%g%s(B + * $B$3$N$&$A!"F~NO%-!<$H%3%s%F%-%9%HJ8;zNs$,%k!<%k$N%^%C%A%s%0$K;H$o$l$k!#(B + * + * $BF~NO%-!<$O%-!<%3!<%I$r;XDj$9$k$b$N$G!"(BX $B$N%-!<%$%Y%s%H%3!<%I$G(B + * $B;XDj$9$kJ}K!$H!"$=$l$r(B XLookupString $B$7$?7k2L$N%-%c%i%/%?%3!<%I$G(B + * $B;XDj$9$kJ}K!$H$N(B2$BDL$j$,$"$k!#(B + * + * $B%3%s%F%-%9%HJ8;zNs$O!"$=$l$^$G$K$I$N$h$&$JJ8;z$,F~NO$5$l$?$+$r(B + * $B;XDj$9$k$b$N$G$"$k!#(B + * + * $BJQ497k2LJ8;zNs$O$=$NL>$NDL$j!"JQ497k2L$N;XDj$G!"%^%C%A$7$?(B + * $B%3%s%F%-%9%H$,$3$NJQ497k2L$KCV$-$+$o$k!#(B + * + * $B%U%!%s%/%7%g%s$O%k!<%k$,%^%C%A$7$?$H$-$K $B$,%U%!%s%/%7%g%s(B + * $B$H$$$&$3$H$K$J$k!#(B + * + * $B!&%3%s%F%-%9%H(B + * $B0J>e$N$h$&$K!"%3%s%F%-%9%H$H$$$&$N$O$=$l$^$G$K$I$N$h$&$JJ8;z$,(B + * $BF~NO$5$l$F$$$J$1$l$P$J$i$J$$$+$r;XDj$9$k$b$N$G$"$k!#(B + * $B$=$l$HF1;~$K$=$NJ8;z$rJQ497k2L$HCV$-JQ$($k$3$H$r;XDj$9$k$b$N(B + * $B$G$b$"$k!#(B + * + * $B%3%s%F%-%9%H$O6uJ8;zNs$G$b$h$$!#$=$N$H$-$K$O$=$l$^$G$K$I$N$h$&$J(B + * $BJ8;z$,F~NO$5$l$?$+$K$+$+$o$i$:!"%^%C%A%s%0$,5/$3$k!#(B + * + * $B%3%s%F%-%9%H$OH>3Q$N>l9gBgJ8;z>.J8;z$r6hJL$7$J$$!#(B + * $B$I$A$i$K$b%^%C%A$9$k!#$?$@$7!"(Bcasesensitive $B$r;XDj$9$k$3$H$G(B + * $BBgJ8;z>.J8;z$r6hJL$9$k$h$&$K$9$k$3$H$b$G$-$k!#(B + * + * autofix $B$r;XDj$9$k$H!"%3%s%F%-%9%H$,$J$$>uBV$G%3%s%F%-%9%H$KJ8(B + * $B;z$,DI2C$5$l$kD>A0$K<+F03NDj%U%!%s%/%7%g%s$,8F$P$l$k!#(B + * + * $B!&JQ49$Nl9g$O!"<+F03NDjMQ$N%3!<%k%P%C%/%k!<%A%s$,(B + * $B8F$P$l$k!#(B + * $B$=$N%k!<%k$K%U%!%s%/%7%g%s$,;XDj$5$l$F$$$l$P%G%#%9%Q%C%AMQ$N(B + * $B%3!<%k%P%C%/%k!<%A%s$,8F$S=P$5$l$k!#(B + * + * $B%U%!%s%/%7%g%s$,B>$N%b!<%I$X$N@ZBX$($@$C$?>l9g$K$O>/$7J#;($G$"$k!#(B + * $B$=$N$H$-$K$O!"$^$:(B EXITMODE $B$H$$$&5?;w%-!<$r0z?t$K$7$F(B ccConvchar() + * $B$,8F$P$l$k!#$3$l$O$"$k%b!<%I$+$iH4$1$k:]$K2?$+=hM}$r$7$?$$!"(B + * $B$H$$$&$H$-$N$?$a$K$"$k!#$=$N8e%+%l%s%H%b!<%I$r?7$7$$%b!<%I$K$7$F!"(B + * $B:#EY$O(B ENTERMODE $B$H$$$&5?;w%-!<$r0z?t$K$7$F(B ccConvchar $B$,8F$P$l$k!#(B + * $B$3$l$K$h$C$F$"$k%b!<%I$KF~$C$?$H$-$N=hM}$r$9$k$3$H$,$G$-$k!#(B + * $B$=$N8e!"%3%s%F%-%9%H$,%/%j%"$5$l!":G8e$K!"%b!<%IJQ99DLCNMQ$N(B + * $B%3!<%k%P%C%/4X?t$,;XDj$5$l$F$$$l$P$=$l$,8F$P$l$k!#(B + */ + +/* + * ccdef $B%U%!%$%k$N=q$-J}(B + * + * $BF~NOJ8;zJQ49Dj5A%U%!%$%k(B (ccdef $B%U%!%$%k$H>JN,$9$k(B) $B$N=q$-J}$r4JC1$K5-$9!#(B + * + * ccdef $B%U%!%$%k$O + * <$B=i4|%b!<%I@k8@(B> + * <$B3F%b!<%I$NJQ49%k!<%k5-=R(B> + * + * <$B%b!<%I@k8@(B> $B$O;HMQ$9$k%b!<%IL>$r@k8@$9$k$b$N$G!"%U%)!<%^%C%H$O $B$O(B cconv $B$,=i4|2=$5$l$?$H$-$N%b!<%I$r;XDj$9$k$b$N$G$"$k!#(B + * $B%U%)!<%^%C%H$O $B$,(B> "<$B%W%m%s%W%H(B>" [fallthrough <$B%b!<%IL>(B>] + * "<$B%3%s%F%-%9%H(B>" <$B%-!<(B> "<$BJQ497k2L(B>" [<$B%U%!%s%/%7%g%s(B>...] + * : + * : + * endmode + * + * <$B%b!<%IL>(B> $B$O(B <$B%b!<%I@k8@(B> $B$G@k8@$7$?%b!<%IL>$G$"$k!#(B + * + * <$B%W%m%s%W%H(B> $B$O%b!<%I$rI=$9J8;zNs$G$"$k!#$3$l$O%+%l%s%H%b!<%I$rI=<($9$k(B + * $B:]$K;HMQ$5$l$k$b$N$G!"4A;z$G$b$h$$!#D9$5$O<+M3$G$"$k$,!"M>$jD9$$$H(B + * $B$9$Y$FI=<($5$l$k$+$I$&$+5?Ld$G$"$k!#(B + * $B$=$N8e$N!"(B[ ] $B$K$/$k$^$l$?ItJ,$O>JN,2DG=$J$3$H$r<($9!#(B + * $B$b$7$"$l$P!"$3$N%b!<%I$G%^%C%A$9$k%k!<%k$,$J$+$C$?$H$-$K$O(B fallthrough $B$G(B + * $B;XDj$5$l$k%b!<%I$N%k!<%k$,0z$-B3$$$FC5$5$l$k!#(B + * + * mode $B$H(B endmode $B$K$O$5$^$l$?ItJ,$,8D!9$NJQ49%k!<%k$G$"$k!#(B + * <$B%3%s%F%-%9%H(B> $B$,%3%s%F%-%9%HJ8;zNs$G$"$k!#$3$3$G$O(B '^' $B$H(B '\' $B$,FC $B$OF~NO$5$l$?%-!<$G!"(BX $B$N%-!<%$%Y%s%H!"%-%c%i%/%?%3!<%I!"(B + * $B%a%?%-%c%i%/%?!"5?;w%-!<$N$$$:$l$+$G;XDj$9$k!#(B + * + * X $B$N%-!<%$%Y%s%H$O!"4pK\E*$K!"(B + * $B%b%G%#%U%!%$%"(B-Keysym$BL>(B + * $B$GI=$9!#Nc$($P!"(B + * Tab + * control-a + * shift-control-space + * $B$J$I$G$"$k!#(B + * + * $B%-%c%i%/%?%3!<%I$r=q$/$K$O!"%7%s%0%k%/%)!<%H$r;HMQ$9$k!#Nc$($P(B + * 'a' + * '^[' + * '\'' + * $B$J$I$G$"$k!#$o$+$k$H;W$&$,!"(B2$BHVL\$O(B ESCAPE$B!"(B3$BHVL\$O%7%s%0%k%/%)!<%H(B + * $B$=$N$b$N$r<($9!#(B + * + * $B%a%?%-%c%i%/%?$OA[E*$KF~NO$5$l$k%-!<(B + * EXITMODE - $B$"$k%b!<%I$+$iH4$1$k$H$-$K2>A[E*$KF~NO$5$l$k%-!<(B + * + * <$BJQ497k2L(B> $B$OJQ497k2L$r;XDj$9$k!#$3$3$G$O(B '&'$B!"(B'/'$B!"(B'^'$B!"(B'\' $B$N(B4$B $B$HF1$8$G$"$k!#(B + * '&' $B$O(B $B%^%C%A$7$?(B <$B%-!<(B> $B$HCV$-49$($i$l$k!#(B<$B%-!<(B> $B$,%$%Y%s%H$N>l9g$K$O(B + * $B$=$N%$%Y%s%H$r(B XLookupString() $B$7$?7k2L$NJ8;zNs$GCV$-49$o$k!#(B + * '/' $B$,=P$F$/$k$H!"$=$3$G%3%s%F%-%9%H$O%/%j%"$5$l$k!#(B + * + * <$B%U%!%s%/%7%g%s(B> $B$O$J$/$F$b$h$$!#$"$l$PJQ49$N8e!"%U%!%s%/%7%g%s$,(B + * $Bl9g$K$O(B + * $B;XDj$5$l$?=g=x$G(B> + * $B$G%+%l%s%H%b!<%I$,JQ$o$k!#$3$N%b!<%IL>$H$7$F(B "PREV" $B$,;HMQ$G$-$k!#(B + * $B$3$l$O0l$DA0$N%b!<%I$rI=$9!#(B + * $B$^$?!":FJQ49$r;XDj$9$k$3$H$b$G$-$k!#(B<$B%U%!%s%/%7%g%s(B>$B$H$7$F(B + * redo + * $B$H=q$/$H!"$b$&0lEY%^%C%A$9$k%k!<%k$r:G=i$+$iC5$7$K$$$/!#$?$@$7$=$NA0$K(B + * <$B%3%s%F%-%9%H(B> $B$,(B <$BJQ497k2L(B> $B$KCV$-49$($i$l$F$$$k$3$H$KCm0U!#$3$N5!G=$r(B + * $B;H$&;~$K$OL58B%k!<%W$K4Y$i$J$$$h$&$KCm0U$7$F%k!<%k$r=q$+$J$1$l$P$J$i$J$$!#(B + * $B0l1~0BA4:v$H$7$F(B redo $B$,(B MAXREDO (=20) $B2s8F$P$l$k$H<:GT$9$k$h$&$K(B + * $B$J$C$F$$$k!#(B + * $BCm0U(B: goto $B$H(B redo $B$N$"$H$K;XDj$5$l$?%U%!%s%/%7%g%s$O$B$H$7$F!"(B + * add-modifier-shift + * add-modifier-control + * add-modifier-lock + * add-modifier-mod1 + * add-modifier-mod2 + * add-modifier-mod3 + * add-modifier-mod4 + * add-modifier-mod5 + * $B$r=q$/$H$N%U%!%$%k$r(B include $BJ8$r;H$C$F%$%s%/%k!<%I$9$k$3$H$,$G$-$k!#(B + * $B=q<0$O(B + * include $B%U%!%$%kL>(B + * $B$G$"$k!#%U%!%$%kL>Cf$K6uGrJ8;z$,4^$^$l$k;~$K$O(B ' $B$+(B " $B$G0O$a$P$h$$!#(B + * $B%U%!%$%kL>$,AjBP%Q%9L>$N;~$K$O$^$:%+%l%s%H%G%#%l%/%H%j$,C5$5$l!"$J$1$l$P(B + * $B4D6-JQ?t(B CC_DEF_PATH $B$,Dj5A$5$l$F$$$l$P$=$l$K;XDj$5$l$?%G%#%l%/%H%j(B + * (':' $B$G6h@Z$C$FJ#?t;XDj$9$k$3$H$,$G$-$k(B) $B$N2<$,C5$5$l!"$=$l$G$b$J$1$l$P(B + * CCDEFPATH (/usr/lib/X11/ccdef/) $B$N2<$,C5$5$l$k!#(B + */ + +/* + * $B%$%s%?!<%U%'%$%9!&%U%!%s%/%7%g%s(B + * + * - $BJQ49%k!<%kFI$_9~$_(B - + * + * ccRule ccParseRule(char *deffile, void (*errprint)()) + * $BF~NOJ8;zJQ49%U%!%$%k$rFI$_9~$`!#(B + * deffile $B$G;XDj$5$l$k%U%!%$%k$+$iJQ49%k!<%k$rFI$_9~$`!#$b$7$b(B + * deffile $B$,(B NULL $B$N;~$O!"4D6-JQ?t(B CC_DEF $B$NCM$,;HMQ$5$l$k!#(B + * deffile $B$,AjBP%Q%9L>$N;~$K$O$^$:%+%l%s%H%G%#%l%/%H%j$N2<$,C5$5$l!"(B + * $B$J$1$l$P!"4D6-JQ?t(B CC_DEF_PATH $B$G;XDj$5$l$?%G%#%l%/%H%j$N2<$,(B + * $BC5$5$l$k!#(BCC_DEF_PATH $B$K$O4D6-JQ?t(B PATH $B$J$I$HF1$8$/J#?t$N(B + * $B%G%#%l%/%H%j$r(B ':' $B$G6h@Z$C$F;XDj$9$k$3$H$,$G$-$k!#(B + * $B$J$1$l$P(B CCDEFPATH (/usr/lib/X11/ccdef) $B$N2<$,C5$5$l$k!#(B + * $BF1$8JQ49%U%!%$%k$KBP$7$FJ#?t2s(B ccParseRule() $B$r9T$J$C$F$b!"(B + * $Bl9g$K$O(B + * stderr $B$X(B fprintf() $B$r;HMQ$7$F=PNO$5$l$k!#(B + * $B@.8y;~$K$OJQ49%k!<%k$r!"<:GT;~$K$O(B NULL $B$rJV$9!#(B + * + * void ccFreeRule(ccRule rule) + * $B;HMQ$7$J$/$J$C$?JQ49%k!<%k$G;H$o$l$F$$$?NN0h$r2rJ|$9$k!#(B + * + * + * - $BJQ49%P%C%U%!:n@.(B - + * + * ccBuf ccCreateBuf(ccRule rule, int contextsize, + * char *functable[], int functablesize, + * void (*default_action)(), void (*insert_char)(), + * void (*delete_char)(), int (*function_dispatch)(), + * void (*mode_notify)(), void (*auto_fix)(), + * caddr_t client_data); + * $BJQ49%P%C%U%!$r:n$j!"$=$l$rJV$9!#(B + * rule $B$G!"$I$NJQ49%k!<%k$r;HMQ$9$k$+;XDj$9$k!#(B + * contextsize $B$K$O%3%s%F%-%9%H$r2?J8;zJ];}$9$k$+$r;XDj$9$k!#(B + * $B$h$[$IFC$N0lMwI=!"(Bfunctablesize $B$O$=$N%5%$%:(B + * $B$G$"$k!#(B + * default_action $B$O!"F~NO$5$l$?%-!<$,$I$N%k!<%k$K$b%^%C%A$7$J$+$C$?(B + * $B$H$-$K8F$P$l$k%U%!%s%/%7%g%s$G$"$k!#(BNULL $B$r;XDj$9$k$H!"%^%C%A(B + * $B$7$J$+$C$?$H$-$K$O2?$b5/$3$i$J$$!#(B + * insert_char, delete_char $B$O$=$l$>$l(B 1$BJ8;zA^F~(B / 1$BJ8;z:o=|MQ$N(B + * $B%U%!%s%/%7%g%s$G$"$k!#(B + * function_dispatch $B$K$O%U%!%s%/%7%g%s%3!<%k$N$?$a$N%G%#%9%Q%C%A(B + * $B%k!<%A%s$r;XDj$9$k!#%G%#%9%Q%C%A4X?t$,(B True $B$rJV$;$P$,(B EUC$B%W%m%;%9%3!<%I$GJV$5$l$k!#(B + * + * + * - $B%P%C%U%!$N;HMQ$7$F$$$k%k!<%k(B - + * + * ccRule ccGetRule(ccBuf buf) + * $B;XDj$5$l$?JQ49%P%C%U%!$,;HMQ$7$F$$$kJQ49%k!<%k$rJV$9!#(B + * + * + * - $B%3%s%F%-%9%H(B - + * + * $B%3%s%F%-%9%H$X$NJ8;z$NDI2C$d:o=|$O!"%k!<%k$K%^%C%A$7$?$H$-$K$O(B + * $B<+F0E*$K9T$J$o$l$k!#$^$?!"%+%l%s%H%b!<%I$NJQ99$K$H$b$J$C$F(B + * $B%3%s%F%-%9%H$O<+F0E*$K%/%j%"$5$l$k!#(B + * $B=>$C$FIaDL$O%f!<%6$,$3$l$i$N%U%!%s%/%7%g%s$r8F$VI,MW$O$J$$!#(B + * $B$?$@$7!"%^%C%A$7$J$+$C$?J8;z$r(B default_action $B$,A^F~$9$k$H$+!"(B + * $B%P%C%/%9%Z!<%9$N=hM}$r9T$J$&!"$J$I$N>l9g$K$O%f!<%6$,(B explicit $B$K(B + * $B8F$VI,MW$,$"$k!#(B + * + * void ccContextAppend(ccBuf buf, int c) + * $B%3%s%F%-%9%H$N:G8e$KJ8;z(B c (EUC $B%W%m%;%9%3!<%I(B)$B$rIU$12C$($k!#(B + * + * void ccContextDelete(ccBuf buf) + * $B%3%s%F%-%9%H$N:G8e$N(B1$BJ8;z$r:o=|$9$k!#(B + * + * void ccContextClear(ccBuf buf) + * $B%3%s%F%-%9%H$r%/%j%"$9$k!#(B + * + * void ccContextSet(ccBuf buf, wchar *cstr) + * $B%3%s%F%-%9%HJ8;zNs$r%;%C%H$9$k!#J8;zNs$O(B null $B%?!<%_%M!<%H$5$l$?(B + * EUC $B%W%m%;%9%3!<%I$G$J$1$l$P$J$i$J$$!#(B + * $BJ8;zNs$ND9$5$,(B ccCreateBuf() $B$G;XDj$5$l$?(B contextsize $B$h$j(B + * $BD9$$$H$-$K$O!":G8e$N(B contextsize $BJ8;z$,%;%C%H$5$l$k!#(B + * + * void ccContextGet(ccBuf buf, wchar *cstr) + * $B8=:_$N%3%s%F%-%9%HJ8;zNs$rJV$9!#J8;zNs$O(B null $B%?!<%_%M!<%H$5$l$?(B + * EUC $B%W%m%;%9%3!<%I$G$"$k!#(B + */ + +/* + * $B%3!<%k%P%C%/%U%!%s%/%7%g%s$H$=$N0z?t(B + * + * $B%G%#%9%Q%C%A%U%!%s%/%7%g%s(B: + * function_dispatch(int func, unsigned char *str, int nbytes, + * caddr_t client_data) + * $B%^%C%A$7$?%k!<%k$K%U%!%s%/%7%g%s$,=q$+$l$F$$$?$H$-$K(B + * $B8F$S=P$5$l$k!#(B + * $B0z?t(B func $B$O!"%U%!%s%/%7%g%sHV9f$G$"$k!#$3$l$O(B + * ccParseRule() $B$N0z?t$H$7$FEO$5$l$?!"(Bfunctable[] $B$N(B + * $B%$%s%G%C%/%9$G$"$k!#(Bstr, nbytes $B$O$3$N(B + * $B%U%!%s%/%7%g%s$r0z$-5/$3$7$?%-!<$NI=$9J8;zNs!#(B + * client_data $B$O(B ccCreateBuf() $B$N;~$K;XDj$5$l$?%G!<%?$G$"$k!#(B + * + * $B%G%U%)%k%H%"%/%7%g%sMQ%U%!%s%/%7%g%s(B: + * default_action(unsigned char *str, int nbytes, caddr_t client_data) + * $B2!$5$l$?%-!<$KBP$7$F%^%C%A$9$k%k!<%k$,$J$+$C$?$H$-$K(B + * $B8F$S=P$5$l$k!#(B + * str, nbytes $B$O%-!<$NI=$9J8;zNs!#(B + * client_data $B$O(B ccCreateBuf() $B$N;~$K;XDj$5$l$?%G!<%?!#(B + * + * $BJ8;zA^F~%U%!%s%/%7%g%s(B: + * insert_char(wchar c, caddr_t client_data) + * $BJQ497k2L$NJ8;z$r%"%W%j%1!<%7%g%s$KEO$9$N$K;HMQ$5$l$k!#(B + * c $B$O(B EUC $B%W%m%;%9%3!<%I$G$"$k!#$3$N%U%!%s%/%7%g%s$O(B + * 1$BJ8;z$4$H$K8F$P$l$k!#(B + * client_data $B$O(B ccCreateBuf() $B$N;~$K;XDj$5$l$?%G!<%?!#(B + * + * $BJ8;z:o=|%U%!%s%/%7%g%s(B: + * delete_char(caddr_t client_data) + * $BJQ497k2L$K$7$?$,$C$F:o=|$9$kJ8;z$,$"$l$P$=$NJ8;z?tJ,(B + * $B$3$N%U%!%s%/%7%g%s$,8F$P$l$k!#(B + * client_data $B$O(B ccCreateBuf() $B$N;~$K;XDj$5$l$?%G!<%?!#(B + * + * $B<+F03NDj%U%!%s%/%7%g%s(B: + * auto_fix(caddr_t client_data) + * $B%3%s%F%-%9%H$,$J$$>uBV$G%3%s%F%-%9%H$KJ8;z$,DI2C$5$l$k(B + * $BD>A0$K8F$P$l$k!#(B + * client_data $B$O(B ccCreateBuf() $B$N;~$K;XDj$5$l$?%G!<%?!#(B + * + * $B%b!<%IJQ99%U%!%s%/%7%g%s(B: + * mode_notify(int newmode, int oldmode, caddr_t client_data) + * $B%+%l%s%H%b!<%I$,JQ99$5$l$?;~$K$3$N%U%!%s%/%7%g%s$,(B + * $B8F$P$l$k!#(Bnewmode $B$,?7$7$$%+%l%s%H%b!<%I!"(Boldmode $B$,(B + * $BA0$N%+%l%s%H%b!<%IHV9f$G$"$k!#(B + * + * $B%(%i! +#include +#include +#include +#include +#include "cconv.h" + +#define uchar unsigned char +#define ushort unsigned short +#define ulong unsigned long + +#define Malloc(size) malloc((unsigned int)(size)) +#define Realloc(p, size) realloc((char *)(p), (unsigned int)(size)) +#define Free(p) { if (p) (void)free((char *)(p)); } + +#define Strcmp(s1, s2) strcmp((char *)(s1), (char *)(s2)) +#define Strncmp(s1, s2, n) strncmp((char *)(s1), (char *)(s2), n) +#define Strcpy(s1, s2) strcpy((char *)(s1), (char *)(s2)) +#define Strcat(s1, s2) strcat((char *)(s1), (char *)(s2)) +#define Strlen(s) strlen((char *)(s)) + +#define EPROC2(efunc, format, a) { \ + char tmp[1024]; \ + (void)sprintf(tmp, format, a); \ + eproc(efunc, tmp); } + +/* $B%-!<%3!<%I$N%(%s%3!<%IJ}K!(B */ +#define RAWKEY (1L<<31) +#define PSEUDO (1L<<30) +#define METAC (1L<<29) +#define META_ASCII 1 /* any ascii character (not useful) */ +#define META_CONTROL 2 /* any control character */ +#define META_RAW 3 /* any key event (not useful) */ +#define META_ANY 4 /* anything (character or event) */ +#define META_FUNC 5 /* any function key event */ +#define META_CURSOR 6 /* any cursor key event */ +#define META_KEYPAD 7 /* any keypad key event */ +#define META_MODIFIER 8 /* any modifier key event */ +#define META_PRINTABLE 9 /* any printable character */ +#define META_NONASCII 10 /* key event that has no ascii interpretation */ + +/* pseudo key code */ +#define ENTERMODE (ulong)(PSEUDO|1) +#define EXITMODE (ulong)(PSEUDO|2) + +/* function code */ +#define ENDFUNC 0xffff +#define MODECHANGE 0x8000 +#define REDO 0x7fff +#define PREVMODE (MODECHANGE|0x1000) +#define FUNC_MODIFIER_SHIFT 0x7ff0 +#define FUNC_MODIFIER_CONTROL 0x7ff1 +#define FUNC_MODIFIER_LOCK 0x7ff2 +#define FUNC_MODIFIER_MOD1 0x7ff3 +#define FUNC_MODIFIER_MOD2 0x7ff4 +#define FUNC_MODIFIER_MOD3 0x7ff5 +#define FUNC_MODIFIER_MOD4 0x7ff6 +#define FUNC_MODIFIER_MOD5 0x7ff7 +#define FUNC_MODIFIER_start FUNC_MODIFIER_SHIFT +#define FUNC_MODIFIER_end FUNC_MODIFIER_MOD5 + +#define MAXREDO 20 + +/* key encoding */ +#define ccEncodeKey(ev) ((ulong)XLookupKeysym(ev, 0) | (ulong)RAWKEY) +#define ccEncodeMask(ev) ((int)((ev)->state & 0xff)) + +#define ccEncodeChar(c) ((ulong)(c)) + +#define NOMODE 0xffff + +#define MATCHED_CHAR 0x8080 /* $B$3$l$O(B EUC $B$H$7$F$O(B illegal $B$J%3!<%I$J$N$G(B + * $BFCJL$JL\E*$KMQ$$$k(B */ +#define CCLEAR_CHAR 0x8081 /* $B>e$KF1$8(B */ + +#define CANONIC(c) (((c) >= 'A' && (c) <= 'Z') ? c += ('a' - 'A') : c) + +/* $B%G!<%?9=B$(B */ +/* $BJQ49%k!<%k(B */ +typedef struct convdesc { + ulong key; /* $BF~NO%-!<(B */ + ushort mask; /* modifier mask (of X KeyEvent) */ + ushort context; /* context$BJ8;zNs(B ($B5U=g$K3JG<$5$l$k(B) */ + ushort result; /* $BJQ497k2LJ8;zNs(B */ + ushort function; /* function $B%Y%/%?$N%$%s%G%C%/%9(B */ +} ConvDesc; + +/* $B%b!<%I$4$H$N%F!<%V%k(B */ +typedef struct { + char *name; /* $B%b!<%IL>(B */ + int nrule; /* $B%k!<%k$N?t(B */ + ConvDesc *cdbuf; /* $B%k!<%k(B */ + wchar *prompt; /* $B%W%m%s%W%HJ8;zNs(B */ + ushort fallthrough; +} ModeTable; + +/* ccParseRule() $B$GFbItI=8=$KJQ49$5$l$?%k!<%k(B */ +typedef struct _ccRule { + char *rulefile; /* $BDj5A%U%!%$%kL>(B */ + ccRule next; /* $B%k!<%k%j%9%H$NH?t(B */ + int nmode; /* $B%b!<%I$N?t(B */ + int initialmode; /* $B=i4|%b!<%I(B */ + ModeTable *modes; /* $B%b!<%I%F!<%V%k(B */ + wchar *strbuf; /* $B%9%H%j%s%0%P%C%U%!(B */ + ushort *funcbuf; /* $B%U%!%s%/%7%g%s%P%C%U%!(B */ + int nfunc; /* $B%U%!%s%/%7%g%s$N?t(B */ + char *funcnamebuf; /* $B%U%!%s%/%7%g%sL>$N%P%C%U%!(B */ + void (*errorfunc)(); /* $B%(%i!<%3!<%k%P%C%/(B */ + int casesensitive; /* $BBgJ8;z>.J8;z$r6hJL$9$k$+$I$&$+(B */ + int autofix; /* $B<+F03NDj$r$9$k$+$I$&$+(B */ +} ccRuleRec; + +static ccRule ccrules; /* $BJQ49%k!<%k$N%j%9%H(B */ + +/* ccCreateBuf() $B$G:n$i$l$kJQ49%P%C%U%!(B */ +typedef struct _ccBuf { + ccRule rule; /* $BJQ49%k!<%k(B */ + short *functbl; + void (*defaultaction)(); /* callback functions */ + void (*insertchar)(); + void (*deletechar)(); + int (*executefunction)(); /* True $B$rJV$;$P=>Mh$I$*$je8B(B */ +#define FUNCNAMESIZE 100 +#define MOREFUNCNAMESIZE 50 +typedef struct { + int nfunc; + ushort funcnames[MAXFUNC]; + char *funcnamebuf; + char *funcnameend; + char *funcnamep; + int funcsize; +} _funcnameRec; + +/* $BDj5A%U%!%$%k(B (for include directive) */ +#define MAXINC 10 +typedef struct { + int findex; + FILE *fp[MAXINC]; +} Files; + +#ifdef __STDC__ +static int wstrlen(wchar *); +static wchar *wrev(wchar *); +static void eproc(void (*)(), char *); +static wchar *promptsave(wchar *); +static int parseLine(uchar *, uchar **, int); +static FILE *openfile(char *); +static int doinclude(uchar *, Files *, void (*)()); +static uchar *getline(uchar *, int, Files *, void (*)()); +static int readRuleFile(ccRule, char *); +static int registMode(ccRule, int, uchar **); +static int newMode(ccRule, Files *, _strbufRec *, _funcbufRec *, + _funcnameRec *, int, uchar **); +static int getDesc(ccRule, uchar *, _funcbufRec *, _funcnameRec *, + ulong *, int *, wchar *, wchar *, int *); +static int getMode(ccRule, uchar *); +static uchar *getQuote(uchar *, wchar *, int); +static int getKey(uchar *, ulong *, int *); +static int getmask(uchar *); +static char *strinc(char *, char *); +static ulong getcode(uchar *); +static int getFunc(ccRule, _funcbufRec *, _funcnameRec *, int, uchar **); +static ccRule findRule(char *); +static void addRule(ccRule); +static void deleteRule(ccRule); +static int wstrsave(_strbufRec *, wchar *); +static int wstralloc(_strbufRec *, int); +static void wstradjust(_strbufRec *); +static ConvDesc *cdalloc(_cdbufRec *); +static void cdadjust(_cdbufRec *); +static int funcalloc(_funcbufRec *, int); +static void funcadjust(_funcbufRec *); +static int funcsearch(_funcnameRec *, char *); +static void funcnameadjust(_funcnameRec *); +static int convchar(ccBuf, ulong, int, char *, int); +static int cconvert(ccBuf, int, ulong, int, int *, char *, int); +static int metamatch(ulong, ulong, int); +static int contextMatch(ccBuf, wchar *); +static void substStr(ccBuf, wchar *, wchar *, char *, int); +#else +static int wstrlen(); +static wchar *wrev(); +static void eproc(); +static wchar *promptsave(); +static int parseLine(); +static int readRuleFile(); +static int registMode(); +static int newMode(); +static int getDesc(); +static int getMode(); +static uchar *getQuote(); +static int getKey(); +static int getmask(); +static char *strinc(); +static ulong getcode(); +static int getFunc(); +static int wstrsave(); +static int wstralloc(); +static void wstradjust(); +static ConvDesc *cdalloc(); +static void cdadjust(); +static int funcalloc(); +static void funcadjust(); +static int funcsearch(); +static void funcnameadjust(); +static int convchar(); +static int cconvert(); +static int metamatch(); +static int contextMatch(); +static void substStr(); +#endif + +/* + * Private Functions + */ + +static int wstrlen(str) +wchar *str; +{ + int len = 0; + + while (*str++) + len++; + return len; +} + +static wchar *wrev(s) +wchar *s; +{ + wchar *str = s; + wchar *end = str; + int c; + + while (*end++) + ; + end -= 2; + while (str < end) { + c = *str; + *str++ = *end; + *end-- = c; + } + return s; +} + +static void eproc(efunc, msg) +void (*efunc)(); +char *msg; +{ + if (efunc == NULL) { + /* stderr $B$K%W%j%s%H(B */ + (void)fprintf(stderr, "%s\n", msg); + } else { + /* $B%(%i!<%O%s%I%i$r8F$V(B */ + (*efunc)(msg); + } +} + +static wchar *promptsave(str) +wchar *str; +{ + int len = (wstrlen(str) + 1) * sizeof(wchar); + wchar *p = (wchar *)Malloc(len); + + if (p != NULL) { + wchar *q = p; + while (*q++ = *str++) + ; + } + return p; +} + +static int parseLine(line, argv, argvsize) +uchar *line; +uchar **argv; +int argvsize; +{ + int c, qc; + int argc; + int state; +#define IN_WORD 1 /* $B%o!<%I$NCf(B */ +#define IN_QUOTE 2 /* $B%o!<%I$NCf$G$5$i$K%/%)!<%H$NCf(B */ + + qc = 0; /* not necessary, but for lint */ + argc = 0; + state = 0; /* $B%o!<%I$N30(B */ + while (c = *line) { + /* $B%/%)!<%H$5$l$F$$$J$$6uGrJ8;z$O!"%o!<%I$r=*$i$;$k(B */ + if (state != IN_QUOTE && (c == ' ' || c == '\t' || c == '\n')) { + /* NULL $B%?!<%_%M!<%H$5$;$k(B */ + *line++ = '\0'; + state = 0; + continue; + } + /* $B%o!<%I$N30$N6uGr0J30$NJ8;z$O!"%o!<%I$N;O$^$j$K$J$k(B */ + if (state == 0) { + if (argc >= argvsize) + return argc; + argv[argc++] = line; + state = IN_WORD; + } + /* $B%P%C%/%9%i%C%7%e$O!"findex > MAXINC - 2) { + eproc(efunc, "include nesting too deep"); + return -1; + } + if (argc < 2) { + eproc(efunc, "missing include filename"); + return -1; + } + name = (char *)argv[1]; + if (*name == '\'' || *name == '"') { + name++; + name[strlen(name) - 1] = '\0'; + } + if ((files->fp[++files->findex] = openfile(name)) == NULL) { + EPROC2(efunc, "can't open %s", name); + --files->findex; + return -1; + } + return 0; +} + +/* getline -- 1$B9TFI$_9~$`(B ($B$=$N:](B include $B$N=hM}$r9T$J$&(B) */ +static uchar *getline(line, linesize, files, efunc) +uchar *line; +int linesize; +Files *files; +void (*efunc)(); +{ + redo: + if (fgets((char *)line, linesize, files->fp[files->findex])) { + register uchar *p = line; + while (*p == ' ' || *p == '\t') + p++; + if (!Strncmp(p, "include", 7)) { + if (doinclude(p, files, efunc) < 0) { + return NULL; + } else { + goto redo; + } + } + return line; + } + (void)fclose(files->fp[files->findex]); + files->findex--; + + if (files->findex >= 0) { + goto redo; + } + + return NULL; +} + +/* readRuleFile -- $BJQ49%k!<%kDj5A%U%!%$%k$rFI$_9~$`(B */ +static int readRuleFile(rule, file) +ccRule rule; +char *file; +{ + FILE *fp; + int moderegistered; + uchar line[256], tmp[256]; + uchar *argv[20]; + int argc; + _strbufRec strrec; + _funcbufRec funcrec; + _funcnameRec fnrec; + Files files; + void (*efunc)() = rule->errorfunc; + int err = 0; + + if ((fp = openfile(file)) == NULL) { + EPROC2(efunc, "can't open file %s", file); + return -1; + } + files.findex = 0; + files.fp[0] = fp; + + moderegistered = 0; + + strrec.strbuf = NULL; + funcrec.funcbuf = NULL; + fnrec.nfunc = 0; + fnrec.funcnamebuf = NULL; + + rule->nmode = 0; + rule->initialmode = -1; + + while (getline(line, sizeof(line), &files, efunc)) { + (void)Strcpy(tmp, line); + if ((argc = parseLine(tmp, argv, 20)) == 0) + continue; + + /* '#' $B$G;O$^$k9T$O%3%a%s%H(B */ + if (*line == '\0' || *line == '\n' || *line == '#') { + continue; + } else if (!moderegistered && argc > 1 && + !Strcmp(argv[0], "defmode")) { + /* $B%b!<%IDj5A9T(B */ + if (registMode(rule, argc, argv) < 0) { + err++; + break; + } + moderegistered++; + } else if (!Strcmp(argv[0], "mode") && argc > 2) { + /* $B$"$k%b!<%I$KBP$9$kJQ49Dj5A(B */ + if (!moderegistered) { + eproc(efunc, "'mode' before 'defmode'"); + err++; + break; + } + if (newMode(rule, &files, &strrec, &funcrec, &fnrec, + argc, argv) < 0) { + err++; + break; + } + } else if (!Strcmp(argv[0], "initialmode") && + argc > 1) { + if (!moderegistered) { + eproc(efunc, "'initialmode' before 'defmode'"); + err++; + break; + } + rule->initialmode = getMode(rule, argv[1]); + } else if (!Strcmp(argv[0], "casesensitive")) { + rule->casesensitive = True; + } else if (!Strcmp(argv[0], "caseinsensitive")) { + rule->casesensitive = False; + } else if (!Strcmp(argv[0], "autofix")) { + rule->autofix = True; + } else if (!Strcmp(argv[0], "noautofix")) { + rule->autofix = False; + } else { + EPROC2(efunc, "syntax error - %s", line); + } + } + + /* Close all opened files. */ + while (files.findex >= 0) { + (void)fclose(files.fp[files.findex--]); + } + + if (err) { + return -1; + } + if (rule->nmode == 0) { + eproc(efunc, "no modes defined"); + return -1; + } + if (!moderegistered) { + eproc(efunc, "'defmode' required"); + return -1; + } + if (rule->initialmode < 0) { + eproc(efunc, "'initialmode' required"); + return -1; + } + + wstradjust(&strrec); + funcadjust(&funcrec); + funcnameadjust(&fnrec); + + rule->strbuf = strrec.strbuf; + rule->funcbuf = funcrec.funcbuf; + rule->funcnamebuf = fnrec.funcnamebuf; + rule->nfunc = fnrec.nfunc; +#ifdef DEBUG_CCONV + dumpAllRules(rule); +#endif + + return 0; +} + +static int registMode(rule, ac, av) +ccRule rule; +int ac; +uchar **av; +{ + int nmode; + ModeTable *modes; + int i; + + ac--, av++; + + nmode = ac; + modes = (ModeTable *)Malloc(nmode * sizeof(ModeTable)); + if (modes == NULL) { + eproc(rule->errorfunc, "can't alloc memory"); + return -1; + } + rule->modes = modes; + + for (i = 0; i < nmode; i++) { + if ((modes[i].name = Malloc(Strlen(av[i]) + 1)) == NULL) { + eproc(rule->errorfunc, "can't alloc memory"); + Free(modes); + return -1; + } + (void)Strcpy(modes[i].name, av[i]); + modes[i].nrule = 0; + modes[i].cdbuf = NULL; + modes[i].prompt = NULL; + modes[i].fallthrough = NOMODE; + } + + rule->nmode = nmode; + return 0; +} + +/* newMode -- $B$"$k%b!<%I$K$D$$$F$N%k!<%k$rFI$_9~$`(B */ +static int newMode(rule, files, srec, frec, fnrec, ac, av) +ccRule rule; +Files *files; +_strbufRec *srec; +_funcbufRec *frec; +_funcnameRec *fnrec; +int ac; +uchar **av; +{ + uchar line[256]; + int mode; + ulong inkey; + int modmask; + wchar prompt[30], context[100], result[100]; + int func; + int ndesc = 0; + ModeTable *mp; + ConvDesc *cdp; + _cdbufRec cdbuf; + void (*efunc)() = rule->errorfunc; + + /* $B%U%)!<%^%C%H$O(B + * "mode <$B%b!<%IL>(B> <"$B%W%m%s%W%HJ8;zNs(B"> [fallthrough <$B%b!<%IL>(B>] + */ + /* $B%b!<%I$N%A%'%C%/(B */ + if ((mode = getMode(rule, av[1])) < 0) { + EPROC2(efunc, "illegal modename: %s", av[1]); + return -1; /* No Such Mode */ + } + mp = &rule->modes[mode]; + + if (getQuote(av[2], prompt, 0) == NULL) { + EPROC2(efunc, "illegal prompt: %s", av[2]); + return -1; + } + mp->prompt = promptsave(prompt); + mp->nrule = 0; + + if (ac > 4 && !Strcmp(av[3], "fallthrough")) { + mp->fallthrough = getMode(rule, av[4]); + } else { + mp->fallthrough = NOMODE; + } + + cdbuf.cdbuf = NULL; + + /* $B%k!<%k$rFI$s$G%9%H%"$9$k(B */ + while (getline(line, sizeof(line), files, efunc)) { + /* '#' $B$G;O$^$k9T$O%3%a%s%H(B */ + if (*line == '\0' || *line == '\n' || *line == '#') + continue; + if (!Strncmp(line, "endmode", 6)) + break; + if (getDesc(rule, line, frec, fnrec, &inkey, &modmask, + context, result, &func)) { + if ((cdp = cdalloc(&cdbuf)) == NULL) { + return -1; + } + + /* $B%k!<%k$N%9%H%"(B */ + cdp->key = inkey; + cdp->mask = modmask; + cdp->context = *context ? wstrsave(srec, wrev(context)) : 0; + cdp->result = *result ? wstrsave(srec, result) : 0; + cdp->function = func; + ndesc++; + } else + EPROC2(efunc, "illegal description - %s", line); + } + + /* $B%k!<%k$,#1$D$b$J$1$l$P%(%i!<$K$9$Y$-$@$m$&(B */ + /* $B$H;W$C$?$,Nc$($P(B ASCII $B%b!<%I$N$H$-$K$O%k!<%k$,#1$D$b$J$$$3$H$,(B + * $B$"$j$&$k(B + */ + + cdadjust(&cdbuf); + + mp->nrule = ndesc; + mp->cdbuf = cdbuf.cdbuf; + + return 0; +} + +static int getDesc(rule, line, frec, fnrec, keyp, maskp, context, result, funcp) +ccRule rule; +uchar *line; +_funcbufRec *frec; +_funcnameRec *fnrec; +ulong *keyp; +int *maskp; +wchar *context; +wchar *result; +int *funcp; +{ + uchar tmp[256]; + uchar *av[20]; + int ac; + void (*efunc)() = rule->errorfunc; + + /* valid description format is: + "context" key "result" [function...] + */ + + (void)Strcpy(tmp, line); + ac = parseLine(tmp, av, 20); + if (ac < 3) { + EPROC2(efunc, "syntax error - %s", line); + return 0; + } + + /* context $B$NFI$_9~$_(B */ + if (getQuote(av[0], context, 0) == NULL) + return 0; + + /* $B%-!<%3!<%I$rFI$_9~$s$G(B */ + if (getKey(av[1], keyp, maskp) < 0) { + EPROC2(efunc, "no such key (%s)", av[1]); + return 0; + } + + /* result $B$rFI$_9~$s$G(B */ + if (getQuote(av[2], result, 1) == NULL) + return 0; + + /* $B%U%!%s%/%7%g%s$N5-=R$,$"$l$P$=$l$rFI$_9~$`(B */ + /* $B$b$7AjEv$9$k%U%!%s%/%7%g%s$,$J$/$F$b%(%i!<$K$7$J$$(B */ + if (ac > 3) { + *funcp = getFunc(rule, frec, fnrec, ac - 3, &av[3]); + } else { + *funcp = 0; + } + + return 1; +} + +static int getMode(rule, str) +ccRule rule; +uchar *str; +{ + ModeTable *modes = rule->modes; + int i; + + for (i = 0; i < rule->nmode; i++) { + if (!Strcmp(str, modes[i].name)) + return i; + } + EPROC2(rule->errorfunc, "undefined mode %s", str); + return -1; +} + +/* getQuote -- $B%/%)!<%F!<%7%g%s5-9f$G0O$^$l$?J8;zNs$rFI$s$G(B wchar $B$K$9$k(B */ +static uchar *getQuote(line, str, metaf) +uchar *line; +wchar *str; +int metaf; /* '&' $B$H(B '/' $B$r%a%?!&%-%c%i%/%?$H$9$k$+$I$&$+(B */ +{ + int c; + int quote; /* quote flag */ + int qc = *line++; /* quote character */ +#define SS2 0x8e +#define SS3 0x8f + + if (qc != '\'' && qc != '"') + return((uchar *)NULL); + + quote = 0; + while ((c = *line++) && c != qc) { + if (c == '\\' && !quote) { + quote = 1; + continue; + } + + if (c == '^' && !quote) { + if (c = *line++) + *str++ = c - '@'; + else + break; + } else if (metaf && c == '&' && !quote) + *str++ = MATCHED_CHAR; + else if (metaf && c == '/' && !quote) + *str++ = CCLEAR_CHAR; + else if (c < 0x80) + *str++ = c; + else if (c == SS2) + *str++ = *line++ | 0x80; + else if (c == SS3) { + c = *line++; + *str++ = (c << 8) | (*line++ & 0x7f) | 0x8000; + } else { + *str++ = (c << 8) | *line++ | 0x8080; + } + } + *str = 0; + + return((c == qc) ? line : (uchar *)NULL); +} + +/* getKey -- $B%-!<%3!<%I$rFI$`(B */ +static int getKey(line, keyp, maskp) +uchar *line; +ulong *keyp; +int *maskp; +{ + /* + * $B%-!<%3!<%I$N5-=RK!$O#2DL$j(B + * 1. ASCII $BI=5-(B + * 'a' + * '^H' + * '\033' + * '\xff' + * + * 2. XKEY $BI=5-(B + * #124 + * #0132 + * #0x58 + * shift-A + * shift-control-meta-HENKAN + * + * pseudo code + * ENTERMODE + * EXITMODE + * + * wild character + * @ascii + * @control + * @raw + * @any + */ + + int key = 0; + + *maskp = 0; + + if (*line == '\'') { /* $B%7%s%0%k%/%)!<%H$G;O$^$k$N$G(B ASCII $BI=5-(B */ + if (*++line == '\\') { + /* '\'' $B$N>l9g(B($B%7%s%0%k%/%)!<%H<+?H(B)$B!"(B + * '\\' $B$N>l9g(B($B%P%C%/%9%i%C%7%e(B) + * '\033' $B$N$h$&$J#8?JI=5-$N>l9g$H(B + * '\x27' $B$N$h$&$J#1#6?JI=5-$N>l9g$,$"$k(B + */ + if (*++line == '\'') /* '\'' */ + key = '\''; + else if (*line == '\\') /* '\\' */ + key = '\\'; + else if (*line == 'x') /* hexadecimal */ + (void)sscanf((char *)++line, "%x", &key); + else /* octal */ + (void)sscanf((char *)line, "%o", &key); + key &= 0xff; + } else if (*line == '^') { + /* '^' ($B%+%l%C%H<+?H(B) $B$^$?$O%3%s%H%m!<%k%3!<%I(B */ + if (*++line == '\'') + key = '^'; + else + key = *line - '@'; + } else { + key = *line; + } + *keyp = key; + } else if (*line == '#') { /* event code */ + if (*++line == '0') { /* octal or hexadecimal */ + if (*(line + 1) == 'x') /* hexadecimal */ + (void)sscanf((char *)line + 2, "%x", &key); + else /* octal */ + (void)sscanf((char *)line, "%o", &key); + } else { + key = atoi((char *)line); + } + *keyp = (ulong)key | (ulong)RAWKEY; + } else if (!Strcmp(line, "ENTERMODE")) { + *keyp = ENTERMODE; + } else if (!Strcmp(line, "EXITMODE")) { + *keyp = EXITMODE; + } else if (*line == '@') { + /* $B%o%$%k%I!&%-%c%i%/%?(B */ + line++; + if (!Strcmp(line, "ascii")) + key = META_ASCII; + else if (!Strcmp(line, "printable")) + key = META_PRINTABLE; + else if (!Strcmp(line, "control")) + key = META_CONTROL; + else if (!Strcmp(line, "raw")) + key = META_RAW; + else if (!Strcmp(line, "any")) + key = META_ANY; + else if (!Strcmp(line, "func")) + key = META_FUNC; + else if (!Strcmp(line, "cursor")) + key = META_CURSOR; + else if (!Strcmp(line, "keypad")) + key = META_KEYPAD; + else if (!Strcmp(line, "modifier")) + key = META_MODIFIER; + else if (!Strcmp(line, "non-ascii")) + key = META_NONASCII; + else + return -1; + *keyp = (ulong)key | (ulong)METAC; + } else { + if ((key = getcode(line)) == 0) + return -1; + *keyp = (ulong)key | (ulong)RAWKEY; + *maskp = getmask(line); + } + return 0; +} + +/* getmask -- $B%b%G%#%U%!%$%"!&%^%9%/$rJV$9(B */ +static int getmask(s) +uchar *s; +{ + int mask = 0; + char buf[256]; + uchar *p; + + if ((p = (uchar *)rindex((char *)s, '-')) == NULL) + return 0; + (void)strncpy(buf, (char *)s, p - s); + buf[p - s] = '\0'; + + if (strinc(buf, "shift")) + mask |= ShiftMask; + if (strinc(buf, "control")) + mask |= ControlMask; + if (strinc(buf, "lock")) + mask |= LockMask; + if (strinc(buf, "mod1")) + mask |= Mod1Mask; + if (strinc(buf, "mod2")) + mask |= Mod2Mask; + if (strinc(buf, "mod3")) + mask |= Mod3Mask; + if (strinc(buf, "mod4")) + mask |= Mod4Mask; + if (strinc(buf, "mod5")) + mask |= Mod5Mask; + return mask; +} + +static char *strinc(s, k) +char *s; +char *k; +{ + register int len = Strlen(k); + + while (s = index(s, *k)) + if (!Strncmp(s, k, len)) + return s; + else + s++; + return NULL; +} + + +/* getcode -- KeySym $B$rJV$9(B */ +static ulong getcode(s) +uchar *s; +{ + register uchar *t; + KeySym keysym; + KeySym XStringToKeysym(); + + if ((t = (uchar *)rindex((char *)s, '-')) == NULL) + t = s; + else + t++; + keysym = XStringToKeysym((char *)t); + if (keysym == NoSymbol) + return (ulong)0; + else + return (ulong)keysym; +} + +static int getFunc(rule, frec, fnrec, n, args) +ccRule rule; +_funcbufRec *frec; +_funcnameRec *fnrec; +int n; +uchar **args; +{ + int i, j; + uchar *func; + uchar *arg; + ushort *fp; + int findex; + void (*efunc)() = rule->errorfunc; + + findex = funcalloc(frec, n + 1); + fp = frec->funcbuf + findex; + + j = 0; + while (n > 0) { + func = *args++; + if (!Strcmp(func, "goto")) { + /* $B%b!<%I$NJQ99(B */ + if (n < 2) + break; /* $B%b!<%IL>$,=q$$$F$J$$(B */ + arg = *args++; + --n; + if (!Strcmp(arg, "PREV")) { + fp[j++] = PREVMODE; + break; + } + if ((i = getMode(rule, arg)) < 0) { + break; + } + fp[j++] = MODECHANGE | i; + break; + } else if (!Strcmp(func, "redo")) { + fp[j++] = REDO; + break; + } else if (!Strncmp(func, "add-modifier-", + sizeof("add-modifier-") - 1)) { + /* $B %d)", MAXFUNC); + } else { + fp[j++] = fnum; + } + } + --n; + } + fp[j++] = ENDFUNC; + frec->funcp = fp + j; /* kludge */ + return findex; +} + +static ccRule +findRule(rulefile) +char *rulefile; +{ + ccRule rule = ccrules; + + while (rule) { + if (rule->rulefile && !strcmp(rulefile, rule->rulefile)) { + return rule; + } + rule = rule->next; + } + return NULL; +} + +static void +addRule(rule) +ccRule rule; +{ + rule->refcnt = 1; + rule->next = ccrules; + ccrules = rule; +} + +static void +deleteRule(rule) +ccRule rule; +{ + ccRule rp = ccrules; + ccRule rp0 = NULL; + + while (rp) { + if (rule == rp) { + if (rp0 == NULL) { + ccrules = rp->next; + } else { + rp0->next = rp->next; + } + return; + } + rp0 = rp; + rp = rp->next; + } +} + +static int wstrsave(srec, str) +_strbufRec *srec; +wchar *str; +{ + int len = wstrlen(str); + int pos; + wchar *p; + + pos = wstralloc(srec, len + 1); + if (pos > 0) { + p = srec->strbuf + pos; + while (len-- > 0) { + *p++ = *str++; + } + *p = 0; + } + return pos; +} + +/* $B%P%C%U%!%"%m%1!<%H%U%!%s%/%7%g%s(B */ + +static int wstralloc(srec, len) +_strbufRec *srec; +int len; +{ + int ret; + + if (srec->strbuf == NULL) { + /* allocate srec->strbuf */ + srec->strbuf = (wchar *)Malloc(STRSIZE * sizeof(wchar)); + if (srec->strbuf == NULL) + return 0; + srec->strend = srec->strbuf + STRSIZE; + srec->strp = srec->strbuf; + *srec->strp++ = 0; /* dummy */ + } + if (srec->strp + len > srec->strend) { + /* allocate more memory */ + int size = (srec->strp + len) - srec->strend; + int offset = srec->strp - srec->strbuf; + wchar *wp; + + if (size < MORESTRSIZE) + size = MORESTRSIZE; + size += srec->strend - srec->strbuf; + wp = (wchar *)Realloc(srec->strbuf, size * sizeof(wchar)); + if (wp == NULL) + return 0; + srec->strp = wp + offset; + srec->strbuf = wp; + srec->strend = wp + size; + } + + ret = srec->strp - srec->strbuf; + srec->strp += len; + + return ret; +} + +static void wstradjust(srec) +_strbufRec *srec; +{ + int size = srec->strp - srec->strbuf; + wchar *wp; + + if (size == 0) return; + wp = (wchar *)Realloc(srec->strbuf, size * sizeof(wchar)); + if (wp != NULL) { + srec->strbuf = wp; + srec->strp = srec->strend = wp + size; + } +} + +static ConvDesc *cdalloc(crec) +_cdbufRec *crec; +{ + ConvDesc *ret; + + if (crec->cdbuf == NULL) { + crec->cdbuf = (ConvDesc *)Malloc(CDSIZE * sizeof(ConvDesc)); + if (crec->cdbuf == NULL) + return NULL; + crec->cdend = crec->cdbuf + CDSIZE; + crec->cdp = crec->cdbuf; + } + if (crec->cdp >= crec->cdend) { + int size = crec->cdend - crec->cdbuf + MORECDSIZE; + int offset = crec->cdp - crec->cdbuf; + ConvDesc *cdp; + + cdp = (ConvDesc *)Realloc(crec->cdbuf, size * sizeof(ConvDesc)); + if (cdp == NULL) { + return NULL; + } + crec->cdp = cdp + offset; + crec->cdbuf = cdp; + crec->cdend = cdp + size; + } + + ret = crec->cdp++; + return ret; +} + +static void cdadjust(crec) +_cdbufRec *crec; +{ + int size = crec->cdp - crec->cdbuf; + ConvDesc *cdp; + + if (size == 0) return; + cdp = (ConvDesc *)Realloc(crec->cdbuf, size * sizeof(ConvDesc)); + if (cdp != NULL) { + crec->cdbuf = cdp; + crec->cdp = crec->cdend = cdp + size; + } +} + +static int funcalloc(frec, n) +_funcbufRec *frec; +int n; +{ + int ret; + + if (frec->funcbuf == NULL) { + /* allocate funcbuf */ + frec->funcbuf = (ushort *)Malloc(FUNCSIZE * sizeof(ushort)); + if (frec->funcbuf == NULL) + return 0; + frec->funcend = frec->funcbuf + FUNCSIZE; + frec->funcp = frec->funcbuf; + *(frec->funcp)++ = ENDFUNC; /* dummy */ + } + if (frec->funcp + n > frec->funcend) { + /* allocate more memory */ + int size = (frec->funcp + n) - frec->funcend; + int offset = frec->funcp - frec->funcbuf; + ushort *up; + + if (size < MOREFUNCSIZE) + size = MOREFUNCSIZE; + size += frec->funcend - frec->funcbuf; + up = (ushort *)Realloc(frec->funcbuf, size * sizeof(ushort)); + if (up == NULL) + return 0; + frec->funcp = up + offset; + frec->funcbuf = up; + frec->funcend = up + size; + } + + ret = frec->funcp - frec->funcbuf; + frec->funcp += n; + + return ret; +} + +static void funcadjust(frec) +_funcbufRec *frec; +{ + int size = frec->funcp - frec->funcbuf; + ushort *fp; + + if (size == 0) return; + fp = (ushort *)Realloc(frec->funcbuf, size * sizeof(ushort)); + if (fp != NULL) { + frec->funcbuf = fp; + frec->funcp = frec->funcend = fp + size; + } +} + +static int funcsearch(fnrec, funcname) +_funcnameRec *fnrec; +char *funcname; +{ + int nfunc = fnrec->nfunc; + ushort *fnames = fnrec->funcnames; + char *fnbuf = fnrec->funcnamebuf; + int i; + int len; + + for (i = 0; i < nfunc; i++) { + if (!strcmp(funcname, fnbuf + *fnames++)) + return i; + } + + if (nfunc >= MAXFUNC) + return -1; + + len = strlen(funcname) + 1; + + /* add new function */ + if (fnrec->funcnamebuf == NULL) { + /* allocate funcnamebuf */ + if ((fnrec->funcnamebuf = Malloc(FUNCNAMESIZE)) == NULL) + return -1; + fnrec->funcnameend = fnrec->funcnamebuf + FUNCNAMESIZE; + fnrec->funcnamep = fnrec->funcnamebuf; + } + if (fnrec->funcnamep + len > fnrec->funcnameend) { + /* allocate more memory */ + int size = (fnrec->funcnamep + len) - fnrec->funcnameend; + int offset = fnrec->funcnamep - fnrec->funcnamebuf; + char *cp; + + if (size < MOREFUNCNAMESIZE) + size = MOREFUNCNAMESIZE; + size += fnrec->funcnameend - fnrec->funcnamebuf; + if ((cp = Realloc(fnrec->funcnamebuf, size)) == NULL) + return 0; + fnrec->funcnamep = cp + offset; + fnrec->funcnamebuf = cp; + fnrec->funcnameend = cp + size; + } + + (void)strcpy(fnrec->funcnamep, funcname); + fnrec->funcnames[nfunc] = fnrec->funcnamep - fnrec->funcnamebuf; + fnrec->funcnamep += len; + + return fnrec->nfunc++; +} + +static void funcnameadjust(fnrec) +_funcnameRec *fnrec; +{ + int size = fnrec->funcnamep - fnrec->funcnamebuf; + char *cp; + + if (size == 0) return; + if (cp = Realloc(fnrec->funcnamebuf, size)) { + fnrec->funcnamebuf = cp; + fnrec->funcnamep = fnrec->funcnameend = cp + size; + } +} + +static int convchar(buf, key, mask, str, len) +ccBuf buf; +ulong key; /* keysym (RAWKEY) or ascii code */ +int mask; /* modifier mask */ +char *str; /* ascii interpretation */ +int len; /* length of str */ +{ + int r; + int func; + int redocount = 0; + ushort *fp; + ccRule rule = buf->rule; + + redo: + /* $B$^$:$O8=:_$N%b!<%I$N%k!<%k$GJQ49$7$F$_$k(B */ + r = cconvert(buf, buf->currentmode, key, mask, &func, str, len); + if (r < 0) { + /* $B%^%C%A$9$k%k!<%k$,8+$D$+$i$J$+$C$?$N$G(B + * fallthrough $B$G;XDj$5$l$k%b!<%I$N%k!<%k$rC5$9(B + */ + int tmpmode = rule->modes[buf->currentmode].fallthrough; + + while (tmpmode != NOMODE) { + r = cconvert(buf, tmpmode, key, mask, &func, str, len); + if (r >= 0) /* $B%^%C%A$7$?(B */ + break; + tmpmode = rule->modes[tmpmode].fallthrough; + } + } + + if (r < 0) + return -1; /* $B$I$l$K$b%^%C%A$7$J$+$C$?(B */ + + if (func == 0) + return 0; /* $B2?$b$7$J$$(B */ + + fp = rule->funcbuf + func; + while ((func = *fp++) != ENDFUNC) { + if (func == REDO) { + if (redocount++ > MAXREDO) + return -1; /* $B$?$V$sL58B%k!<%W(B */ + else + goto redo; /* redo -- $B$b$&0lEY(B */ + } else if (func & MODECHANGE) { /* $B%+%l%s%H%b!<%I$NJQ99(B */ + int tmpmode = buf->currentmode; + + /* pseudo-key $B$NF~NO(B */ + (void)convchar(buf, EXITMODE, 0, (char *)NULL, 0); + + if (func == PREVMODE) { + buf->currentmode = buf->previousmode; + } else { + buf->currentmode = func & ~MODECHANGE; + } + buf->previousmode = tmpmode; + + /* pseudo-key $B$NF~NO(B */ + (void)convchar(buf, ENTERMODE, 0, (char *)NULL, 0); + + /* $B%b!<%I$,JQ$o$C$?;~$K$O%3%s%F%-%9%H$r%/%j%"$9$k(B */ + ccContextClear(buf); + + /* $B%b!<%IJQ99%3!<%k%P%C%/$,$"$l$P8F$S=P$9(B */ + if (buf->modenotify) { + (*buf->modenotify)(buf->currentmode, + buf->previousmode, + buf->client_data); + } + break; + } else if (FUNC_MODIFIER_start <= func && + func <= FUNC_MODIFIER_end) { + /* $Bmodifier |= ShiftMask; break; + case FUNC_MODIFIER_CONTROL: buf->modifier |= ControlMask; break; + case FUNC_MODIFIER_LOCK: buf->modifier |= LockMask; break; + case FUNC_MODIFIER_MOD1: buf->modifier |= Mod1Mask; break; + case FUNC_MODIFIER_MOD2: buf->modifier |= Mod2Mask; break; + case FUNC_MODIFIER_MOD3: buf->modifier |= Mod3Mask; break; + case FUNC_MODIFIER_MOD4: buf->modifier |= Mod4Mask; break; + case FUNC_MODIFIER_MOD5: buf->modifier |= Mod5Mask; break; + } + } else { + int truefunc = buf->functbl[func]; + /* $B%G%#%9%Q%C%A!&%k!<%A%s$r8F$V(B */ + if (truefunc >= 0) { + if (!(*buf->executefunction)(truefunc, str, len, + buf->client_data)) + break; + } + } + } + return 0; +} + +static int cconvert(buf, mode, inkey, mask, func, str, len) +ccBuf buf; +int mode; /* current mode */ +ulong inkey; /* input key (raw/mapped) */ +int mask; +int *func; /* function */ +char *str; +int len; +{ + ccRule rule = buf->rule; + ConvDesc *entry; + ulong key; + int n; + ModeTable *modep; + + if (mode < 0 || mode >= rule->nmode) + return -1; /* No Such Mode */ + + modep = &rule->modes[mode]; + + if ((n = modep->nrule) <= 0) + return -1; /* No Rules */ + + for (entry = modep->cdbuf; --n >= 0; entry++) { + key = entry->key; + if (key & (ulong)METAC) { + /* $B%o%$%k%I%+!<%IJ8;z$N%^%C%A%s%0(B */ + if (!metamatch(key, inkey, len == 0)) + continue; + } else if (key & (ulong)RAWKEY && mask != entry->mask) { + continue; + } else if (key != inkey) { + continue; + } + + /* $B%-!<$,%^%C%A$7$?(B */ + if (contextMatch(buf, rule->strbuf + entry->context)) { + substStr(buf, rule->strbuf + entry->context, + rule->strbuf + entry->result, str, len); + *func = entry->function; + return 0; + } + } + + return -1; /* No Match */ +} + +static int metamatch(rkey, inkey, nonascii) +ulong rkey; +ulong inkey; +int nonascii; +{ + int type = (int)(rkey & 0xff); + + switch (type) { + case META_ASCII: + return !(inkey & (ulong)(RAWKEY|PSEUDO)); + case META_PRINTABLE: + return (0x20 <= inkey && inkey < 0x7f); + case META_CONTROL: + return inkey < 0x20; + case META_RAW: + return inkey & (ulong)RAWKEY; + case META_ANY: + return 1; + case META_FUNC: + return (inkey & (ulong)RAWKEY) && IsFunctionKey(inkey & 0xffff); + case META_CURSOR: + return (inkey & (ulong)RAWKEY) && IsCursorKey(inkey & 0xffff); + case META_KEYPAD: + return (inkey & (ulong)RAWKEY) && IsKeypadKey(inkey & 0xffff); + case META_MODIFIER: + return (inkey & (ulong)RAWKEY) && IsModifierKey(inkey & 0xffff); + case META_NONASCII: + return (inkey & (ulong)RAWKEY) && nonascii; + default: + return 0; + } + /* NOTREACHED */ +} + +static int contextMatch(buf, context) +ccBuf buf; +wchar *context; +{ + wchar *c0 = buf->contextend; + wchar *c1 = buf->context; + int cs = buf->rule->casesensitive; + + if (context == 0 || *context == 0) + return 1; /* $BL5>r7o%^%C%A(B */ + if (c0 - c1 < wstrlen(context)) /* $BD9$5$N%A%'%C%/(B */ + return 0; /* matching fail */ + c0--; + while (*context) { + if ((!cs && CANONIC(*c0) == CANONIC(*context)) || + (cs && *c0 == *context)) + c0--, context++; + else + return 0; /* fail */ + } + return 1; +} + +static void substStr(buf, context, result, str, len) +ccBuf buf; +wchar *context; +wchar *result; +char *str; +int len; +{ + register int c; + int nbytes; + uchar *bufp; + + /* $B%3%s%F%-%9%H$NJ,$r>C$9(B */ + while (*context++) { + ccContextDelete(buf); + (*buf->deletechar)(buf->client_data); + } + + while (c = *result++) { + if (c == MATCHED_CHAR) { + nbytes = len; + bufp = (uchar *)str; + while (nbytes-- > 0) { + c = *bufp++; + /* bufp $B$NCf?H$O(B ASCII $B$+(B $B%+%J$J$N$G(B + * EUC $B%W%m%;%9%3!<%I$X$NJQ49$r$o$6$o$6(B + * $B$d$kI,MW$O$J$$(B + */ + ccContextAppend(buf, c); + (*buf->insertchar)(c, buf->client_data); + } + continue; + } else if (c == CCLEAR_CHAR) { + /* $B%3%s%F%-%9%H$r%/%j%"$9$k(B */ + ccContextClear(buf); + continue; + } + ccContextAppend(buf, c); + (*buf->insertchar)(c, buf->client_data); + } +} + +/* getModeSwitchMask -- mode-switch $B$N%b%G%#%U%!%$%"%^%9%/$rD4$Y$k(B */ +int getModeSwitchMask(dpy) +Display *dpy; +{ + KeyCode modeswkey; + struct modesw { + Display *dpy; + int mode_switch; + struct modesw *next; + } *msp; + static struct modesw *modeswlist; + + for (msp = modeswlist; msp != NULL; msp = msp->next) { + if (dpy == msp->dpy) return msp->mode_switch; + } + msp = (struct modesw *)Malloc(sizeof(struct modesw)); + msp->dpy = dpy; + msp->next = modeswlist; + modeswlist = msp; + + msp->mode_switch = 0; + + if ((modeswkey = XKeysymToKeycode(dpy, XK_Mode_switch)) != 0) { + XModifierKeymap *map = XGetModifierMapping(dpy); + int keypermod = map->max_keypermod; + int modbit; + int i; + + for (modbit = 3; modbit < 8; modbit++) { + for (i = 0; i < keypermod; i++) { + if (map->modifiermap[keypermod * modbit + i] == modeswkey) { + msp->mode_switch = 1 << modbit; + goto found; + } + } + } + found: + XFreeModifiermap(map); + } + + return msp->mode_switch; +} + +/* + * Public Functions + */ + +/* ccParseRule -- $BJQ49Dj5A%U%!%$%k$rFI$_9~$`(B */ +ccRule ccParseRule(deffile, errprint) +char *deffile; /* $BF~NOJ8;zJQ49Dj5A%U%!%$%k(B */ +void (*errprint)(); /* $B%(%i!<%a%C%;!<%8I=<(MQ%3!<%k%P%C%/(B */ +{ + ccRule rule; + extern char *getenv(); + + /* $BJQ49Dj5A%U%!%$%k$NFI$_9~$_(B */ + if (deffile == NULL) { + /* $B4D6-JQ?t(B CC_DEF $B$rD4$Y$k(B */ + if ((deffile = getenv("CC_DEF")) == NULL) { + return (ccRule)NULL; + } + } + + if (rule = findRule(deffile)) { + /* same rule found */ + rule->refcnt++; + return rule; + } + + /* ccRuleRec $B$N%"%m%1!<%H(B */ + if ((rule = (ccRule)Malloc(sizeof(ccRuleRec))) == NULL) { + return (ccRule)NULL; + } + + rule->errorfunc = errprint; + rule->rulefile = Malloc(Strlen(deffile) + 1); + if (rule->rulefile) { + (void)Strcpy(rule->rulefile, deffile); + } + rule->casesensitive = False; + rule->autofix = False; + + if (readRuleFile(rule, deffile) < 0) { + Free(rule); + return (ccRule)NULL; + } + + addRule(rule); + + return rule; +} + +/* ccCreateBuf -- $BJQ49%P%C%U%!$r:n$k(B */ +ccBuf ccCreateBuf(rule, csize, functable, nfunc, + def_action, insert, delete, execute, autofix, modenotify, + data) +ccRule rule; /* $B;HMQ$9$kF~NOJ8;zJQ49%k!<%k(B */ +int csize; /* context size ($BJ8;z?t(B) */ +char *functable[]; /* $B%U%!%s%/%7%g%s!&%F!<%V%k(B */ +int nfunc; /* functable $B$N%(%s%H%j?t(B */ +void (*def_action)(); /* $B%G%U%)%k%H!&%"%/%7%g%s!&%3!<%k%P%C%/(B */ +void (*insert)(); /* $BJ8;zF~NO%3!<%k%P%C%/(B */ +void (*delete)(); /* $BJ8;z:o=|%3!<%k%P%C%/(B */ +int (*execute)(); /* $B%U%!%s%/%7%g%srule = rule; + + /* context $B%P%C%U%!$N%"%m%1!<%H(B */ + if (csize <= 0) csize = 1; + buf->context = (wchar *)Malloc(csize * sizeof(wchar)); + if (buf->context == NULL) { + Free(buf); + return (ccBuf)NULL; + } + buf->contextend = buf->context; + buf->contextsize = csize; + + /* function $B%3%s%P!<%H%F!<%V%k$N%"%m%1!<%H(B */ + buf->functbl = (short *)Malloc(rule->nfunc * sizeof(short)); + if (buf->functbl == NULL) { + Free(buf->context); + Free(buf); + return (ccBuf)NULL; + } + /* ccRule $B$KF~$C$F$$$k%U%!%s%/%7%g%sI=$H!"0z?t$GM?$($i$l$?(B + * $B%U%!%s%/%7%g%sI=$+$i!"(BccRule $BFbIt$N%U%!%s%/%7%g%sHV9f$H(B + * $B:#M?$($i$l$?%U%!%s%/%7%g%sHV9f$H$NBP1~I=$r:n$k(B + */ + funcnamep = rule->funcnamebuf; + functblp = buf->functbl; + for (i = rule->nfunc, functblp = buf->functbl; i > 0; i--, functblp++) { + for (j = 0; j < nfunc; j++) { + if (!strcmp(functable[j], funcnamep)) { + *functblp = j; + break; + } + } + if (j >= nfunc) *functblp = -1; + + while (*funcnamep++) + ; + } + + buf->defaultaction = def_action; + buf->insertchar = insert; + buf->deletechar = delete; + buf->executefunction = execute; + buf->modenotify = modenotify; + buf->autofix = autofix; + buf->client_data = data; + + /* $B%+%l%s%H%b!<%I$N@_Dj(B */ + buf->previousmode = buf->currentmode = rule->initialmode; + + buf->modifier = 0; + + return buf; +} + +/* ccFreeRule -- $B%k!<%k$rrefcnt > 0) return; + + deleteRule(rule); + + for (modep = rule->modes, i = 0; i < rule->nmode; modep++, i++) { + Free(modep->name); + Free(modep->cdbuf); + Free(modep->prompt); + } + Free(rule->rulefile); + Free(rule->modes); + Free(rule->strbuf); + Free(rule->funcbuf); + Free(rule->funcnamebuf); + Free(rule); +} + +/* ccDestroyBuf -- $BJQ49%P%C%U%!$rcontext); + Free(buf->functbl); + Free(buf); +} + +/* ccConvchar -- $BJQ49MQ%U%!%s%/%7%g%s(B */ +int ccConvchar(buf, event) +ccBuf buf; +XKeyPressedEvent *event; /* $B%-!<%$%Y%s%H(B */ +{ + int r; + char str[256]; + char *p; + int nbytes; + int n; + KeySym ks1, ks2; + int mask; + + /* $B$H$j$"$($:(B LookupString $B$7$F$*$/(B */ + nbytes = XLookupString(event, str, sizeof(str), &ks2, 0); + + /* $BF~NO%-!<$r%b%G%#%U%!%$%d$D$-$K$9$k(B */ + if (buf->modifier) { + if (!IsModifierKey(ks2)) { + event->state |= buf->modifier; + buf->modifier = 0; + nbytes = XLookupString(event, str, sizeof(str), &ks2, 0); + } + } + + /* $B$^$:$O%$%Y%s%H%3!<%I$GJQ49$7$F$_$k(B */ + r = -1; + mask = ccEncodeMask(event); + + /* $B$^$:$O%b%G%#%U%!%$%"$r0l:]9MN8$7$J$$(B KeySym $B$r(B + * $B%3!<%I$H$7$FJQ49$7$F$_$k(B + */ + ks1 = (ulong)XLookupKeysym(event, 0); + if (ks1 != NoSymbol) { + r = convchar(buf, (ulong)ks1 | (ulong)RAWKEY, + mask, str, nbytes); + } + + /* $B>e$,%^%C%A$7$J$1$l$P!"(BShift, Lock, ModeSwitch $B$r(B + * $B9MN8$7$?(B KeySym ($B$D$^$j(B XLookupString() $B$,JV$9(B KeySym) $B$,(B + * NoSymbol $B$G$J$1$l$P$=$N%3!<%I$GJQ49$7$F$_$k(B + */ + if (r < 0 && ks2 != NoSymbol) { + int msw = getModeSwitchMask(event->display); + + if (mask & (ShiftMask | LockMask | msw)) { + mask &= ~(ShiftMask | LockMask | msw); + r = convchar(buf, (ulong)ks2 | (ulong)RAWKEY, + mask, str, nbytes); + } + } + + if (r < 0) { + int match = 0; + + if (nbytes == 0) return 0; + + /* ASCII $BI=5-$GJQ49$7$F$_$k(B */ + p = str; + n = nbytes; + while (n-- > 0) { + r = convchar(buf, ccEncodeChar(*p), 0, p, 1); + if (r >= 0) match = 1; + p++; + } + if (!match) { + /* default action $B$N%U%!%s%/%7%g%s$r$h$V(B */ + if (buf->defaultaction != NULL) { + (void)(*buf->defaultaction)(str, nbytes, buf->client_data); + } + return 0; + } + } + return 1; +} + +/* ccGetMode -- $B8=:_$N%b!<%IHV9f$rJV$9(B */ +int ccGetMode(buf) +ccBuf buf; +{ + return buf->currentmode; +} + +/* ccGetModePrompt -- $B8=:_$N%b!<%I$N%W%m%s%W%HJ8;zNs$rJV$9(B */ +wchar *ccGetModePrompt(buf) +ccBuf buf; +{ + return buf->rule->modes[buf->currentmode].prompt; +} + +/* ccGetRule -- $BJQ49%P%C%U%!$G;H$o$l$F$$$kJQ49%k!<%k$rJV$9(B */ +ccRule ccGetRule(buf) +ccBuf buf; +{ + return buf->rule; +} + +/* ccContextAppend -- $B%3%s%F%-%9%H$K(B1$BJ8;z2C$($k(B */ +void ccContextAppend(buf, c) +ccBuf buf; +int c; +{ + wchar *p; + + /* $B<+F03NDj(B */ + if (buf->context == buf->contextend && + buf->rule->autofix && buf->autofix) { + buf->autofix(buf->client_data); + } + + /* $B%3%s%F%-%9%HJ8;zNs$KA^F~(B */ + if (buf->contextend - buf->context < buf->contextsize) { + *buf->contextend++ = c; + } else { + /* $B%3%s%F%-%9%HJ8;zNs$,0lGU$J$N$G(B + * $B@hF,$N#1J8;z$rcontext + 1; + while (p < buf->contextend) { + *(p - 1) = *p; + p++; + } + /* $B$"$$$?=j$KA^F~(B */ + *--p = c; + } +} + +/* ccContextDelete -- $B%3%s%F%-%9%H$r(B1$BJ8;z:o=|$9$k(B */ +void ccContextDelete(buf) +ccBuf buf; +{ + if (buf->contextend > buf->context) + buf->contextend--; +} + +/* ccContextClear -- $B%3%s%F%-%9%H$r%/%j%"$9$k(B */ +void ccContextClear(buf) +ccBuf buf; +{ + /* $B%b!<%I$,JQ$o$C$?;~$K$O<+F0E*$K%/%j%"$5$l$k$,$=$l0J30$K(B + * $B8=:_$N%3%s%F%-%9%H$r6/@)E*$K%/%j%"$7$?$$>l9g$KMQ$$$k(B + */ + buf->contextend = buf->context; +} + +/* ccContextSet -- $B%3%s%F%-%9%H$r%;%C%H$9$k(B */ +void ccContextSet(buf, cstr) +ccBuf buf; +wchar *cstr; +{ + int len = wstrlen(cstr); + wchar *p = buf->context; + + if (len > buf->contextsize) { + cstr += len - buf->contextsize; + len = buf->contextsize; + } + while (len-- > 0) { + *p++ = *cstr++; + } +} + +/* ccContextGet -- $B8=:_$N%3%s%F%-%9%H$rJV$9(B */ +void ccContextGet(buf, cstr) +ccBuf buf; +wchar *cstr; +{ + register wchar *wp = buf->context; + + while (wp < buf->contextend) + *cstr++ = *wp++; + *cstr = 0; +} + + +/* + * Obsolete Functions + */ + +/* ccInit -- $BJQ49%k!<%k$rFI$_9~$s$G%P%C%U%!$r:n$k(B */ +ccBuf ccInit(deffile, contextsize, defactfunc, insertfunc, deletefunc, dofunc, + errprint, functable, functablesize) +char *deffile; +int contextsize; +void (*defactfunc)(); +void (*insertfunc)(); +void (*deletefunc)(); +int (*dofunc)(); +void (*errprint)(); +char *functable[]; +int functablesize; +{ + ccRule rule; + + if ((rule = ccParseRule(deffile, errprint)) == NULL) { + return (ccBuf)NULL; + } + + return ccCreateBuf(rule, contextsize, functable, functablesize, + defactfunc, insertfunc, deletefunc, dofunc, + (void (*)())NULL, (void (*)())NULL, (caddr_t)NULL); +} + +/* ccTerminate -- $BF~NOJ8;zJQ49$r=*N;$9$k(B */ +void ccTerminate(buf) +ccBuf buf; +{ + ccFreeRule(buf->rule); + ccDestroyBuf(buf); +} + + +#ifdef DEBUG_CCONV +/* + * Debug Functions + */ + +static void putws(s) +wchar *s; +{ + unsigned char line[256]; + + (void)convJWStoSJIS(s, line); + fputs(line, stdout); +} + +static void puteuc(s) +uchar *s; +{ + wchar tmp[256]; + + (void)convEUCtoJWS(s, tmp); + putws(tmp); +} + +void dumpRules(rule, mode) +ccRule rule; +int mode; +{ + int nkey; + ModeTable *modep; + ConvDesc *cdp; + wchar *strbuf = rule->strbuf; + ushort *funcbuf = rule->funcbuf; + char **funcnames; + wchar *p, *q; + wchar restmp[256]; + ushort *funcp; + int i, j; + + funcnames = (char **)__builtin_alloca(rule->nfunc * sizeof(char *)); +{ char *cp, **fnp; + cp = rule->funcnamebuf; + fnp = funcnames; + for (i = 0; i < rule->nfunc; i++) { + *fnp++ = cp; + while (*cp++) + ; + } +} + + if (mode < 0 || mode >= rule->nmode) { + printf("No such mode %d\n", mode); + return; + } + modep = &rule->modes[mode]; + + printf("mode: %s (%d) prompt: ", modep->name, mode); + putws(modep->prompt); + if (modep->fallthrough != NOMODE) { + printf(" fallthrough: %d", modep->fallthrough); + } + putchar('\n'); + cdp = modep->cdbuf; + for (i = 0; i < modep->nrule; i++) { + printf("rule[%d]: \"", i); + putws(strbuf + cdp->context); + printf("\"\t"); + if (cdp->key & RAWKEY) { + ulong key = cdp->key & ~RAWKEY; + int mask = cdp->mask; + char *keysymname; + if (mask & ShiftMask) printf("shift-"); + if (mask & ControlMask) printf("control-"); + if (mask & LockMask) printf("lock-"); + if (mask & Mod1Mask) printf("mod1-"); + if (mask & Mod2Mask) printf("mod2-"); + if (mask & Mod3Mask) printf("mod3-"); + if (mask & Mod4Mask) printf("mod4-"); + if (mask & Mod5Mask) printf("mod5-"); + keysymname = XKeysymToString((KeySym)key); + printf(keysymname ? keysymname : ""); + } else if (cdp->key & METAC) { + switch (cdp->key & ~METAC) { + case META_ASCII: printf("@ascii"); break; + case META_CONTROL: printf("@control"); break; + case META_RAW: printf("@raw"); break; + case META_ANY: printf("@any"); break; + case META_FUNC: printf("@func"); break; + case META_CURSOR: printf("@cursor"); break; + case META_KEYPAD: printf("@keypad"); break; + case META_MODIFIER: printf("@modifier"); break; + case META_NONASCII: printf("@non-ascii"); break; + case META_PRINTABLE: printf("@printable"); break; + default: printf(""); + } + } else if (cdp->key & PSEUDO) { + switch (cdp->key) { + case ENTERMODE: printf("ENTERMODE"); break; + case EXITMODE: printf("EXITMODE"); break; + default: printf(""); + } + } else { + putchar('\''); + if (cdp->key >= 0x80) { + printf("\\x%x", cdp->key); + } else if (cdp->key < 0x20) { + putchar('^'); + putchar(cdp->key + '@'); + } else if (cdp->key == 0x7f) { + printf("^?"); + } else { + putchar(cdp->key); + } + putchar('\''); + } + printf("\t\""); + p = restmp; + q = strbuf + cdp->result; + while (*q) { + if (*q == MATCHED_CHAR) { + *p++ = '&'; + } else if (*q == CCLEAR_CHAR) { + *p++ = '/'; + } else { + *p++ = *q; + } + q++; + } + *p = 0; + putws(restmp); + printf("\"\t"); + funcp = funcbuf + cdp->function; + while (*funcp != ENDFUNC) { + if (*funcp == REDO) { + printf("redo "); + } else if (*funcp == PREVMODE) { + printf("goto prev "); + } else if (*funcp & MODECHANGE) { + int gotomode = *funcp & ~MODECHANGE; + if (gotomode < 0 || gotomode >= rule->nmode) { + printf(""); + } else { + printf("goto %s ", + rule->modes[gotomode].name); + } + } else { + if (*funcp >= rule->nfunc) { + printf(" "); + } else { + printf("%s ", funcnames[*funcp]); + } + } + funcp++; + } + putchar('\n'); + cdp++; + } + putchar('\n'); +} + +void dumpAllRules(rule) +ccRule rule; +{ + int i; + + printf("** RULE DUMP **\n"); + printf("number of modes: %d initialmode: %s (%d)\n\n", + rule->nmode, + rule->modes[rule->initialmode].name, + rule->initialmode); + for (i = 0; i < rule->nmode; i++) { + dumpRules(rule, i); + } + fflush(stdout); +} +#endif diff -r 000000000000 -r 92745d501b9a lib/ctext.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/ctext.c Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,457 @@ +/* + * ctext.c -- Compound Text <-> Japanese Wide Character String converter + */ + +/****************************************************************************** + +$B!&;X<((B (designation) + 1byte multi-byte + 94char 96char 94char 96char + ------------------------------------------------------- + G0 : ESC ( F | -none- ESC $ ( F | -none- + G1 : ESC ) F | ESC - F ESC $ ) F | ESC $ - F + +$B!&=*Ce$K=q$+$l$?DL$j!#(B +$B!&(BC0 $B$G;HMQ$G$-$kJ8;z$O!"(BNL TAB ESC $B$N$_$H$9$k!#(B +$B!&(BC1 $B$G;HMQ$G$-$kJ8;z$O(B CSI $B$N$_$H$9$k!#(B +$B!&%F%-%9%H$NIA2hJ}8~$N%7!<%1%s%9$,4^$^$l$k!#(B + $B:8$+$i1&(B + $B1&$+$i:8(B + $B85$NJ}8~$KLa$k(B +******************************************************************************/ + +/* + * Copyright (c) 1989 Software Research Associates, Inc. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Software Research Associates not be + * used in advertising or publicity pertaining to distribution of the + * software without specific, written prior permission. Software Research + * Associates makes no representations about the suitability of this software + * for any purpose. It is provided "as is" without express or implied + * warranty. + * + * Author: Makoto Ishisone, Software Research Associates, Inc., Japan + * ishisone@sra.co.jp + */ + +#ifndef lint +static char *rcsid = "$Id: ctext.c,v 2.6 1999/03/10 08:55:15 ishisone Exp $"; +#endif + +typedef unsigned short wchar; + +#define NULL 0 + +#define CS96 0x100 /* 96chars CS */ +#define MBCS 0x200 /* Multibyte CS */ + +/* convJWStoCT -- Japanese Wide Character String -> COMPOUND_TEXT */ +int +convJWStoCT(wstr, xstr, jisroman) +register wchar *wstr; +register unsigned char *xstr; +int jisroman; /* true $B$J$i$P(B G0 $B$N%-%c%i%/%?%;%C%H$H$7$F(B JIS ROMAN $B$r!"(B + * false $B$J$i$P(B ASCII $B$r;HMQ$9$k(B + */ +/* Wide Character string wstr $B$r(B COMPOUND_TEXT xstr $B$KJQ49$7!"(B + * $BJQ498e$N%P%$%H?t$rJV$9(B($B:G8e$N(B null byte $B$O4^$^$J$$(B)$B!#$b$7(B xstr $B$,(B + * NULL $B$J$i$PJQ49$O$;$:!"J8;z?t$N$_$rJV$9!#(B + */ +{ + register int c; + register int g0, g1; + register int n = 0; + int g0cs; + + g0cs = jisroman ? 'J' : 'B'; + + g0 = 'B'; + g1 = CS96|'A'; + + /* + * G0, G1 $B$O> 8) & 0xff; + *xstr++ = c & 0xff; + } + n += 2; + break; + default: + /* $BL5;k$9$k(B */ + break; + } + } + if (xstr) *xstr = '\0'; + return n; +} + +static unsigned char * +getesc(str, len) +unsigned char *str; +int len; +{ + register int c; + + /* $B%(%9%1!<%W%7!<%1%s%9$N!"%(%9%1!<%W$KB3$/(B + * $BCf4VJ8;z$H=*C 0) { + c = *str; + if (c < 0x20 || 0x2f < c) + break; + len--, str++; + } + /* $B=*C 0) { + c = *str; + if (c < 0x30 || 0x3f < c) + break; + len--, str++; + } + /* $BCf4VJ8;z$O(B 02/00 $B$+$i(B 02/15 $B$^$G(B */ + while (len > 0) { + c = *str; + if (c < 0x20 || 0x2f < c) + break; + len--, str++; + } + /* $B=*C Japanese Wide Character String */ +int +convCTtoJWS(xstr, len, wstr) +register unsigned char *xstr; +int len; +wchar *wstr; +/* COMPOUND_TEXT xstr $B$r(B Wide Character string wstr $B$KJQ49$7!"(B + * $BJQ498e$NJ8;z?t$rJV$9(B($B:G8e$N(B null $BJ8;z$O4^$^$J$$(B)$B!#$b$7(B wstr $B$,(B + * NULL $B$J$i$PJQ49$O$;$:!"J8;z?t$N$_$rJV$9!#(B + */ +{ + register int c; + int nskip; + int n = 0; + int g0, g1, gs; + unsigned char *xstr1; + + /* + * Compound Text $BCf$K$O(B null octet $B$,4^$^$l$k2DG=@-$,$"$k(B + * $B$=$3$GJ8;zNs$ND9$5(B len $B$r0z?t$G;XDj$G$-$k$h$&$K$7$F$"$k$N$@$,!"(B + * 0 $B$"$k$$$OIi$N;~$K$O(B (null octet $B$O$J$$$b$N$H$7$F(B) strlen() $B$G(B + * $BD9$5$rD4$Y$k(B + */ + if (len <= 0) { + len = strlen((char *)xstr); + } + + /* $B=i4|>uBV$O!"(BISO 8859/1 $B$,(B G0/G1 $B$KF~$C$F$$$k(B */ + g0 = 'B'; /* ASCII -> G0 */ + g1 = CS96|'A'; /* Latin/1 right hand part -> G1 */ + + while (len-- > 0) { + switch (c = *xstr++) { + case '\n': /* NEWLINE */ + case '\t': /* TAB */ + if (wstr) *wstr++ = c; + n++; + break; + case 0x9b: /* CSI */ + /* + * CSI $B$N0lHL7A$O(B + * CSI {P} {I} F + * $B%Q%i%a%?(B P $B$O(B 03/00 $B$+$i(B 03/15$B!"(B + * $BCf4VJ8;z(B I $B$O(B 02/00 $B$+$i(B 02/15$B!"(B + * $B=*C G0 */ + g0 = *xstr; + break; + case ')': /* 94chars CS -> G1 */ + g1 = *xstr; + break; + case '-': /* 96chars CS -> G1 */ + g1 = *xstr | CS96; + break; + default: /* ignore */ + break; + } + break; + case 3: /* ESC - I - I - F */ + switch (*xstr++) { + case '$': + switch (*xstr++) { + case '(': /* 94chars MBCS -> G0 */ + g0 = *xstr | MBCS; + break; + case ')': /* 94chars MBCS -> G1 */ + g1 = *xstr | MBCS; + break; + case '-': /* 96chars MBCS -> G1 */ + g1 = *xstr | CS96 | MBCS; + break; + default: /* ignore */ + break; + } + break; + case '%': + if (*xstr++ != '/') { + /* unknown sequence */ + break; + } + /* + * $B%W%i%$%Y!<%H%(%s%3!<%G%#%s%0(B + * $B40A4$KL5;k$9$k(B + * $B$?$@$7$=$N$"$H$KB3$/%G!<%?$r(B + * $B%9%-%C%W$9$kI,MW$,$"$k(B + * ESC-%-/-F-M-L + */ + len -= 2; + if (len < 0) + return -1; + nskip = (*xstr1 & 0x7f) * 128 + + (*(xstr1 + 1) & 0x7f); + if ((len -= nskip) < 0) + return -1; + xstr1 += nskip + 2; + break; + default: + break; + } + break; + default: + break; + } + xstr = xstr1; + break; + default: + if (!(c & 0x60)) { + /* + * NL/TAB/ESC/CSI $B0J30$N(B C0 or C1 + * $B$3$l$OL@$i$+$K%(%i!<(B + */ + return -1; + } + gs = (c & 0x80) ? g1 : g0; + c &= 0x7f; + if (gs & MBCS) { + switch (gs & 0x70) { + case 0x70: /* 4byte/char */ + if (--len < 0) return -1; + c = (c << 8) | (*xstr++ & 0x7f); + case 0x60: /* 3byte/char */ + if (--len < 0) return -1; + c = (c << 8) | (*xstr++ & 0x7f); + case 0x50: /* 2byte/char */ + case 0x40: /* 2byte/char */ + if (--len < 0) return -1; + c = (c << 8) | (*xstr++ & 0x7f); + break; + default: + return -1; + } + } + if (wstr) { + switch (gs) { + case 'B': + case 'J': + *wstr++ = c; + n++; + break; + case 'I': + *wstr++ = 0x80 | c; + n++; + break; + case MBCS|'B': + *wstr++ = 0x8080 | c; + n++; + break; + } + } else { + switch (gs) { + case 'B': + case 'J': + case 'I': + n++; + break; + case MBCS|'B': + n++; + break; + } + } + break; + } + } + if (wstr) *wstr = 0; + return n; +} diff -r 000000000000 -r 92745d501b9a lib/dispatch.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/dispatch.c Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,268 @@ +#ifndef lint +static char *rcsid = "$Id: dispatch.c,v 1.14 1994/05/31 07:48:42 ishisone Rel $"; +#endif + +/* + * a very simple event dispatch library for non-widget windows + * + * 'non-widget window' means windows that have no associated widget, + * e.g. windows created by Xlib directly. + */ + +/* + * Copyright (c) 1990 Software Research Associates, Inc. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Software Research Associates not be + * used in advertising or publicity pertaining to distribution of the + * software without specific, written prior permission. Software Research + * Associates makes no representations about the suitability of this software + * for any purpose. It is provided "as is" without express or implied + * warranty. + * + * Author: Makoto Ishisone, Software Research Associates, Inc., Japan + */ + +#include +#include "MyDispatch.h" +#include "AsyncErr.h" + +#define DEBUG_VAR debug_dispatch +#include "DebugPrint.h" + +typedef struct _handler_ { + int type; /* event type */ + unsigned long mask; /* event mask */ + void (*handler)(); + XtPointer data; + struct _handler_ *next; +} HandlerRec; + +typedef struct { + Boolean dispatching; /* now dispatching */ + Boolean toberemoved; /* this list is to be removed later */ + unsigned long mask; /* event mask */ + HandlerRec *handlers; +} WindowRec; + +static int Initialized = 0; +static XContext Context; + +static void +initialize() +{ + Context = XUniqueContext(); + Initialized = 1; +} + +static void +resetEventMask(dpy, window, wp) +Display *dpy; +Window window; +WindowRec *wp; +{ + register HandlerRec *hp = wp->handlers; + register unsigned long mask = 0L; + + while (hp != NULL) { + mask |= hp->mask; + hp = hp->next; + } + + if (mask != wp->mask) { + XAEHandle h = XAESetIgnoreErrors(dpy); /* keep the operation safe */ + XSelectInput(dpy, window, mask); + XAEUnset(h); + wp->mask = mask; + } +} + +static void +removeAll(dpy, window, wp) +Display *dpy; +Window window; +WindowRec *wp; +{ + register HandlerRec *hp = wp->handlers; + + while (hp != NULL) { + register HandlerRec *hp0 = hp; + hp = hp->next; + XtFree((char *)hp0); + } + + if (wp->mask != 0L) { + XAEHandle h = XAESetIgnoreErrors(dpy); + + /* keep it safe (because the window might not exist any more) */ + XSelectInput(dpy, window, 0L); + XAEUnset(h); + } + + XtFree((char *)wp); + (void)XDeleteContext(dpy, window, Context); +} + +static void +doDispatch(event, list) +XEvent *event; +register HandlerRec *list; +{ + void (*handler)(); + XtPointer data; + register int type = event->type; + + /* + * we must be careful here. the invoked handler might remove + * itself, or remove other handler to be invoked next. + * so we use this somewhat strange recursive call. + */ + while (list != NULL) { + if (list->type == type) { + handler = list->handler; + data = list->data; + doDispatch(event, list->next); + (*handler)(event, data); + return; + } + list = list->next; + } +} + +void +MyDispatchEvent(event) +XEvent *event; +{ + caddr_t data; + + if (!Initialized) initialize(); + + if (!XFindContext(event->xany.display, event->xany.window, + Context, &data)) { + WindowRec *wrec = (WindowRec *)data; + + wrec->dispatching = True; + wrec->toberemoved = False; + + doDispatch(event, wrec->handlers); + + wrec->dispatching = False; + if (wrec->toberemoved) { + removeAll(event->xany.display, event->xany.window, wrec); + } + } +} + +void +MyAddEventHandler(dpy, window, type, mask, func, data) +Display *dpy; +Window window; +int type; +unsigned long mask; +void (*func)(); +XtPointer data; +{ + WindowRec *wp; + HandlerRec *hp; + caddr_t cdata; + + TRACE(("MyAddEventHandler(window=%08lx,type=%d)\n", window, type)); + if (!Initialized) initialize(); + + hp = XtNew(HandlerRec); + hp->type = type; + hp->mask = mask; + hp->handler = func; + hp->data = data; + hp->next = NULL; + + if (!XFindContext(dpy, window, Context, &cdata)) { + wp = (WindowRec *)cdata; + hp->next = wp->handlers; + wp->handlers = hp; + } else { + wp = XtNew(WindowRec); + wp->mask = 0L; + wp->dispatching = False; + wp->handlers = hp; + (void)XSaveContext(dpy, window, Context, (caddr_t)wp); + } + resetEventMask(dpy, window, wp); +} + +void +MyRemoveEventHandler(dpy, window, type, func, data) +Display *dpy; +Window window; +int type; +void (*func)(); +XtPointer data; +{ + caddr_t cdata; + WindowRec *wp; + HandlerRec *hp, *hp0; + + TRACE(("MyRemoveEventHandler(window=%08lx,type=%d)\n", window, type)); + if (!Initialized) initialize(); + if (XFindContext(dpy, window, Context, &cdata) || cdata == NULL) return; + + wp = (WindowRec *)cdata; + hp0 = NULL; + hp = wp->handlers; + + while (hp != NULL) { + if (hp->type == type && hp->handler == func && hp->data == data) { + HandlerRec *tmp = hp; + + hp = hp->next; + if (hp0 == NULL) { + wp->handlers = hp; + } else { + hp0->next = hp; + } + XtFree((char *)tmp); + } else { + hp0 = hp; + hp = hp->next; + } + } + + resetEventMask(dpy, window, wp); + + if (wp->handlers == NULL) { + if (wp->dispatching) { + /* now dispatching. we just mark it to be removed later. */ + wp->toberemoved = True; + } else { + XtFree((char *)wp); + (void)XDeleteContext(dpy, window, Context); + } + } +} + +void +MyRemoveAllEventHandler(dpy, window) +Display *dpy; +Window window; +{ + caddr_t cdata; + WindowRec *wp; + + TRACE(("MyRemoveAllEventHandler(window=%08lx)\n", window)); + if (!Initialized) initialize(); + + if (XFindContext(dpy, window, Context, &cdata) || cdata == NULL) return; + + wp = (WindowRec *)cdata; + + if (wp->dispatching) { + /* now dispatching. we just mark it to be removed later. */ + wp->toberemoved = True; + return; + } else { + removeAll(dpy, window, wp); + } +} diff -r 000000000000 -r 92745d501b9a lib/fontbank.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/fontbank.c Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,323 @@ +#ifndef lint +static char *rcsid = "$Id: fontbank.c,v 1.4 1994/05/17 10:52:15 ishisone Rel $"; +#endif +/* + * Copyright (c) 1991, 1994 Software Research Associates, Inc. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Software Research Associates not be + * used in advertising or publicity pertaining to distribution of the + * software without specific, written prior permission. Software Research + * Associates makes no representations about the suitability of this software + * for any purpose. It is provided "as is" without express or implied + * warranty. + * + * Author: Makoto Ishisone, Software Research Associates, Inc., Japan + */ + +#include +#include +#include "CachedFont.h" +#include "KIFontSet.h" +#include "FontBank.h" + +#define DEBUG_VAR debug_fontbank +#include "DebugPrint.h" + +#define FC_HASH_SIZE 8 + +typedef struct _font_cache_ { + int sum; + char *name; + XFontStruct **fonts; + int num_fonts; + struct _font_cache_ *next; +} FontCache; + +typedef struct _fb_info_ { + char *language; + KICharSet *charsets; + int num_charsets; +} FBInfo; + +typedef struct _fb_rec_ { + Display *dpy; + struct _fb_rec_ *next; + FBInfo *info; + int reference_count; + FontCache *hash[FC_HASH_SIZE]; +} FBRec; + +static FontBank fontBankList = NULL; + +/* + * Language information: + * The FBInfo structure holds information about the character sets + * required for a specific language. Currently, this infomation + * is provided only for Japanese. + */ + +static KICharSetSpec asciiCharSets[] = { + { "iso8859-1", NULL }, /* preferable */ + { "jisx0201.1976-0", NULL }, /* alternative */ + { "iso8859-*", NULL }, /* alternative */ +}; +static KICharSetSpec kanaCharSets[] = { + { "jisx0201.1976-0", NULL }, +}; +static KICharSetSpec kanjiCharSets[] = { + { "jisx0208.1983-0", NULL }, + { "jisx0208.1983-1", NULL }, + { "jisx0208.1990-0", NULL }, + { "jisx0208.1990-1", NULL }, + { "jisx0208.1976-0", NULL }, + { "jisx0208.1976-1", NULL }, +}; +static KICharSet jpCharSets[3] = { + { asciiCharSets, XtNumber(asciiCharSets) }, + { kanaCharSets, XtNumber(kanaCharSets) }, + { kanjiCharSets, XtNumber(kanjiCharSets) }, +}; + +static FBInfo fontBankInfo[] = { + { "ja_JP", jpCharSets, XtNumber(jpCharSets) }, + { NULL } +}; + +static int +getsum(s) +char *s; +{ + unsigned char *p = (unsigned char *)s; + int sum = 0; + + while (*p != '\0') sum += *p++; + return sum; +} + +static FBInfo * +getInfo(lang) +char *lang; +{ + FBInfo *fip; + + for (fip = fontBankInfo; fip->language != NULL; fip++) { + if (!strcmp(fip->language, lang)) return fip; + } + DPRINT(("fonbank: language %s not supported\n", lang)); + return NULL; +} + +static XFontStruct ** +lookupCacheFonts(bank, fontset, num_fontsp) +FontBank bank; +char *fontset; +int *num_fontsp; +{ + FontCache *fc; + int i; + int sum; + + sum = getsum(fontset); + fc = bank->hash[sum % FC_HASH_SIZE]; + + /* lookup cache */ + while (fc != NULL) { + if (fc->sum == sum && !strcmp(fc->name, fontset)) { + /* found */ + *num_fontsp = fc->num_fonts; + for (i = 0; i < *num_fontsp; i++) { + (void)CachedLoadFontByFontStruct(bank->dpy, fc->fonts[i]); + } + return fc->fonts; + } + fc = fc->next; + } + *num_fontsp = 0; + return NULL; +} + +static void +cacheFonts(bank, fontset, fonts, num_fonts) +FontBank bank; +char *fontset; +XFontStruct **fonts; +int num_fonts; +{ + FontCache *fc; + int sum; + + fc = XtNew(FontCache); + fontset = XtNewString(fontset); + sum = getsum(fontset); + + fc->sum = sum; + fc->name = fontset; + fc->fonts = fonts; + fc->num_fonts = num_fonts; + fc->next = bank->hash[sum % FC_HASH_SIZE]; + bank->hash[sum % FC_HASH_SIZE] = fc; +} + +static XFontStruct ** +extractFonts(dpy, fontset, charsets, ncharsets, nfontsp) +Display *dpy; +char *fontset; +KICharSet *charsets; +int ncharsets; +int *nfontsp; +{ + KICharSetFont *kifonts; + KICharSetFont buf[10]; + XFontStruct **fonts, **fp; + + if (ncharsets > 10) { + kifonts = (KICharSetFont *)XtMalloc(ncharsets * sizeof(KICharSetFont)); + } else { + kifonts = buf; + } + *nfontsp = ExtractFontsFromFontSet(dpy, fontset, charsets, + kifonts, ncharsets); + fonts = NULL; + if (*nfontsp > 0) { + int i; + + fonts = (XFontStruct **)XtMalloc(*nfontsp * sizeof(XFontStruct *)); + for (i = 0, fp = fonts; i < ncharsets; i++) { + if (kifonts[i].font != NULL) *fp++ = kifonts[i].font; + } + } + if (kifonts != buf) XtFree((char *)kifonts); + return fonts; +} + +static void +freeCache(bank) +FontBank bank; +{ + FontCache *fc; + int i; + + for (i = 0; i < FC_HASH_SIZE; i++) { + fc = bank->hash[i]; + while (fc != NULL) { + FontCache *next = fc->next; + + XtFree(fc->name); + XtFree((char *)fc->fonts); + XtFree((char *)fc); + fc = next; + } + } +} + + +/* + * Public functions + */ + +FontBank +FontBankCreate(dpy, language) +Display *dpy; +char *language; +{ + FontBank fb; + FBInfo *info; + int i; + + TRACE(("FontBankCreate(language:%s)\n", language)); + + if ((info = getInfo(language)) == NULL) return NULL; + + for (fb = fontBankList; fb != NULL; fb = fb->next) { + if (fb->dpy == dpy && fb->info == info) { + TRACE(("\tfontbank for %s already exists\n", language)); + fb->reference_count++; + return fb; + } + } + + TRACE(("\tcreate fontbank for %s...\n", language)); + fb = XtNew(FBRec); + fb->dpy = dpy; + fb->info = info; + fb->reference_count = 1; + for (i = 0; i < FC_HASH_SIZE; i++) { + fb->hash[i] = NULL; + } + fb->next = fontBankList; + fontBankList = fb; + return fb; +} + +void +FontBankDestroy(bank) +FontBank bank; +{ + TRACE(("FontBankDestroy()\n")); + + if (--(bank->reference_count) <= 0) { + FontBank fb, fb0; + + TRACE(("\tfreeing fontbank...\n")); + fb = fontBankList; + fb0 = NULL; + while (fb != NULL) { + if (fb == bank) { + if (fb0 == NULL) { + fontBankList = fb->next; + } else { + fb0->next = fb->next; + } + freeCache(fb); + XtFree((char *)fb); + return; + } + fb0 = fb; + fb = fb->next; + } + } +} + +XFontStruct ** +FontBankGet(bank, fontset, num_fontsp) +FontBank bank; +char *fontset; +int *num_fontsp; +{ + XFontStruct **fpp; + + TRACE(("FontBankGet(fontset:%s)\n", fontset)); + + if ((fpp = lookupCacheFonts(bank, fontset, num_fontsp)) != NULL) { + TRACE(("\tfontset found in fontbank (numfonts=%d)\n", + *num_fontsp)); + return fpp; + } + + fpp = extractFonts(bank->dpy, fontset, bank->info->charsets, + bank->info->num_charsets, num_fontsp); + + /* enter cache */ + TRACE(("\tcaching fontset (numfonts=%d)\n", *num_fontsp)); + cacheFonts(bank, fontset, fpp, *num_fontsp); + return fpp; +} + +void +FontBankFreeFonts(bank, fonts, num_fonts) +FontBank bank; +XFontStruct **fonts; +int num_fonts; +{ + int i; + + TRACE(("FontBankFreeFonts()\n")); + + for (i = 0; i < num_fonts; i++) { + CachedFreeFont(bank->dpy, fonts[i]); + } +} diff -r 000000000000 -r 92745d501b9a lib/fontset.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/fontset.c Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,372 @@ +#ifndef lint +static char *rcsid = "$Id: fontset.c,v 1.9 1994/06/02 04:59:23 ishisone Rel $"; +#endif +/* + * Copyright (c) 1991 Software Research Associates, Inc. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Software Research Associates not be + * used in advertising or publicity pertaining to distribution of the + * software without specific, written prior permission. Software Research + * Associates makes no representations about the suitability of this software + * for any purpose. It is provided "as is" without express or implied + * warranty. + * + * Author: Makoto Ishisone, Software Research Associates, Inc., Japan + * + * a FontSet handler for kinput2. + */ + +#include +#include +#include +#include "CachedAtom.h" +#include "CachedFont.h" +#include "KIFontSet.h" + +#define DEBUG_VAR debug_fontset +#include "DebugPrint.h" + +typedef struct { + String name; + String xlfdname; +} FSFontName; + +static char noname[] = "no"; + +static int match(); +static Cardinal parseFontSet(); +static Boolean tryCharSet(); +static XFontStruct *csSuppliedMatchFont(); +static XFontStruct *exactMatchFont(); +static XFontStruct *csReplacedMatchFont(); +static String getXLFDName(); + + +/*- match: returns 1 if the specified string matches the pattern -*/ +static int +match(s, p) +register char *s; /* string */ +register char *p; /* pattern */ +{ + register int tmp; + + while ((tmp = *p++) != '\0') { + switch (tmp) { + case '?': + if (*s++ == '\0') return 0; + continue; + case '*': + while ((tmp = match(s, p)) == 0) { + if (*s++ == '\0') return -1; + } + return tmp; + default: + if (*s++ != tmp) return 0; + continue; + } + } + return (*s == '\0'); +} + +/*- countCommas: count number of commas in the string -*/ +static Cardinal +countCommas(s) +String s; +{ + int n = 0; + + while (*s != '\0') { + if (*s++ == ',') n++; + } + return n; +} + +/*- parseFontSet: separate each font in a font name list -*/ +static Cardinal +parseFontSet(spec, basenames) +String spec; /* IN */ +FSFontName *basenames; /* OUT */ +{ + register char *p, *q; + Cardinal nnames; + int c; + + nnames = 0; + p = spec; + for (;;) { + /* skip leading blanks */ + while ((c = *p) != '\0' && (c == ' ' || c == '\t' || c == '\n')) p++; + if (c == '\0') break; + + basenames[nnames++].name = p; + + /* find comma or NUL char */ + for (q = p; (c = *q) != '\0' && c != ','; q++) ; + + /* omit trailing blanks */ + p = q - 1; + while ((c = *p) == ' ' || c == '\t' || c == '\n') *p-- = '\0'; + + if (*q == '\0') break; + *q = '\0'; + p = q + 1; + } + +#ifdef DEBUG + if (DDEBUG_CONDITION(10)) { + if (nnames == 0) { + printf("\tparse error\n"); + } else { + int i; + printf("\t%d elements\n", nnames); + for (i = 0; i < nnames; i++) printf("\t\t%s\n", basenames[i].name); + } + } +#endif + + return nnames; +} + +/*- tryCharSet: apply specified function to the fontnames for getting appropriate font for given character set -*/ +static Boolean +tryCharSet(dpy, cset, extfont, namelist, numlist, func) +Display *dpy; +KICharSet *cset; +KICharSetFont *extfont; +FSFontName *namelist; +Cardinal numlist; +XFontStruct *(*func)(); +{ + KICharSetSpec *specs; + Cardinal i; + XFontStruct *font; + + for (i = 0, specs = cset->specs; i < cset->num_specs; i++, specs++) { + font = (*func)(dpy, specs->pattern, namelist, numlist); + if (font != NULL) { + extfont->charset = specs->pattern; + extfont->cldata = specs->cldata; + extfont->font = font; + return True; + } + } + return False; +} + +static XFontStruct * +exactMatchFont(dpy, csetstr, namelist, numlist) +Display *dpy; +String csetstr; +FSFontName *namelist; +Cardinal numlist; +{ + XFontStruct *font; + + while (numlist-- > 0) { + String name = (namelist++)->name; + String p; + int namelen; + int hyphen; + + if (*name != '-' && *name != '+') continue; /* not an XLFD name */ + + namelen = strlen(name); + for (p = name + namelen - 1, hyphen = 0; p > name; p--) { + if (*p == '-') hyphen++; + if (hyphen == 2) goto found; + } + continue; /* doesn't contain charset part */ + + found: + p++; /* now p points the charset part of the fontname */ + if (match(p, csetstr) > 0 && + (font = CachedLoadQueryFontByName(dpy, name)) != NULL) { + TRACE(("\tmatched in exactMatchFont()\n")); + TRACE(("\t\tcset=%s, font=%s\n", csetstr, name)); + return font; + } + } + return NULL; +} + +static XFontStruct * +csSuppliedMatchFont(dpy, csetstr, namelist, numlist) +Display *dpy; +String csetstr; +FSFontName *namelist; +Cardinal numlist; +{ + XFontStruct *font; + + while (numlist-- > 0) { + String name = (namelist++)->name; + char namebuf[512]; + + if (*name != '-' && *name != '+') continue; /* not an XLFD name */ + + (void)strcpy(namebuf, name); + (void)strcat(namebuf, "-"); + (void)strcat(namebuf, csetstr); + + if ((font = CachedLoadQueryFontByName(dpy, namebuf)) != NULL) { + TRACE(("\tmatched in csSuppliedMatchFont()\n")); + TRACE(("\t\tcset=%s, font=%s\n", csetstr, namebuf)); + return font; + } + } + return NULL; +} + +static XFontStruct * +csReplacedMatchFont(dpy, csetstr, namelist, numlist) +Display *dpy; +String csetstr; +FSFontName *namelist; +Cardinal numlist; +{ + XFontStruct *font; + + while (numlist-- > 0) { + String name = namelist->name; + char namebuf[512]; + String p; + int namelen; + int hyphen; + + if (*name != '-' && *name != '+') { /* non XLFD name */ + if (namelist->xlfdname == NULL || + (namelist->xlfdname == noname && + (namelist->xlfdname = getXLFDName(dpy, name)) == NULL)) { + /* this font doesn't have XLFD name */ + namelist++; + continue; + } + name = namelist->xlfdname; + } + namelist++; + + (void)strcpy(namebuf, name); + namelen = strlen(namebuf); + + /* find charset part of the font name */ + for (p = namebuf + namelen - 1, hyphen = 0; p > namebuf; p--) { + if (*p == '-') hyphen++; + if (hyphen == 2) goto found; + } + continue; /* doesn't contain charset part */ + + found: + p++; /* now p points the charset part of the fontname */ + + /* replace charset part */ + (void)strcpy(p, csetstr); + + if ((font = CachedLoadQueryFontByName(dpy, namebuf)) != NULL) { + TRACE(("\tmatched in csReplacedMatchFont()\n")); + TRACE(("\t\tcset=%s, font=%s\n", csetstr, namebuf)); + return font; + } + } + return NULL; +} + +/*- getXLFDName: obtain XLFD font name from a non XLFD font name -*/ +static String +getXLFDName(dpy, nonxlfdname) +Display *dpy; +String nonxlfdname; +{ + XFontStruct *font; + Atom fontprop; + String name; + + TRACE(("getXLFDName(%s)\n", nonxlfdname)); + font = CachedLoadQueryFontByName(dpy, nonxlfdname); + if (font == NULL) { + DPRINT(("getXLFDName(%s):CachedLoadQueryFontByName() failed\n", + nonxlfdname)); + return NULL; + } + if (!XGetFontProperty(font, XA_FONT, (unsigned long *)&fontprop)) { + /* can't get 'FONT' property. so XLFD name cannot be obtained */ + DPRINT(("getXLFDName(%s): can't get FONT property\n", + nonxlfdname)); + CachedFreeFont(dpy, font); + return NULL; + } + + CachedFreeFont(dpy, font); + name = CachedGetAtomName(dpy, fontprop); + TRACE(("\tgot %s\n", name)); + return (*name == '-' || *name == '+') ? name : NULL; +} + + +/* + * public functions + */ + +int +ExtractFontsFromFontSet(dpy, fontset, charsets, exfonts, numcsets) +Display *dpy; +String fontset; +KICharSet *charsets; +KICharSetFont *exfonts; +Cardinal numcsets; +{ + Cardinal nfonts; + String fsp; + char fsbuf[1024]; + FSFontName *fnp; + FSFontName fnbuf[20]; + int nfound; + int i; + + TRACE(("ExtractFontsFromFontSet(fontset=%s)\n", fontset)); + for (i = 0; i < numcsets; i++) { + exfonts[i].font = NULL; + exfonts[i].charset = NULL; + exfonts[i].cldata = NULL; + } + + if (strlen(fontset) >= sizeof(fsbuf)) { + fsp = XtMalloc((unsigned int)(strlen(fontset) + 1)); + } else { + fsp = fsbuf; + } + XmuCopyISOLatin1Lowered(fsp, fontset); + + if ((nfonts = countCommas(fsp) + 1) >= XtNumber(fnbuf)) { + fnp = (FSFontName *)XtMalloc(nfonts * sizeof(FSFontName)); + } else { + fnp = fnbuf; + } + for (i = 0; i < nfonts; i++) fnp[i].xlfdname = noname; + + if ((nfonts = parseFontSet(fsp, fnp)) == 0) { + if (fsp != fsbuf) XtFree(fsp); + if (fnp != fnbuf) XtFree((char *)fnp); + return 0; + } + + nfound = 0; + for (i = 0; i < numcsets; i++) { + KICharSet *cp = charsets + i; + KICharSetFont *fp = exfonts + i; + + TRACE(("\tfor charset #%d\n", i)); + if (tryCharSet(dpy, cp, fp, fnp, nfonts, exactMatchFont) || + tryCharSet(dpy, cp, fp, fnp, nfonts, csSuppliedMatchFont) || + tryCharSet(dpy, cp, fp, fnp, nfonts, csReplacedMatchFont)) { + nfound++; + } + } + if (fsp != fsbuf) XtFree(fsp); + if (fnp != fnbuf) XtFree((char *)fnp); + + return nfound; +} diff -r 000000000000 -r 92745d501b9a lib/imlib/Imakefile --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/imlib/Imakefile Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,20 @@ +#include "../../Kinput2.conf" + + SRCS = imattr.c imbuf.c imconv.c imdata.c imdispatch.c \ + imic.c improto.c imrequest.c imxport.c + OBJS = imattr.o imbuf.o imconv.o imdata.o imdispatch.o \ + imic.o improto.o imrequest.o imxport.o + + LOCAL_INCLUDES = -I../../include -I. + INCLUDES = $(LOCAL_INCLUDES) + + DEFINES = $(TRANSPORTDEFS) -DXIM_BC /* XIM bug compatibility */ + +NormalLibraryObjectRule() +NormalLibraryTarget(im,$(OBJS)) +DependTarget() + +#ifdef IHaveSubdirs +MakeSubdirs($(SUBDIRS)) +DependSubdirs($(SUBDIRS)) +#endif diff -r 000000000000 -r 92745d501b9a lib/imlib/im.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/imlib/im.h Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,269 @@ +/* $Id: im.h,v 1.13 2002/01/27 11:33:06 ishisone Exp $ */ +/* + * Copyright (c) 1994 Software Research Associates, Inc. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Software Research Associates not be + * used in advertising or publicity pertaining to distribution of the + * software without specific, written prior permission. Software Research + * Associates makes no representations about the suitability of this software + * for any purpose. It is provided "as is" without express or implied + * warranty. + * + * Author: Makoto Ishisone, Software Research Associates, Inc., Japan + */ + +#ifndef _im_h +#define _im_h + +#include +#include +#include +#include +#include + +/* macros defined in the system header file cause problem... */ +#undef major +#undef minor + +#define EXT_DEBUG_VAR debug_IMProtocol +#include "DebugPrint.h" +#include "AsyncErr.h" +#include "FontBank.h" +#include "ConvCtrl.h" + +#include "imprtype.h" +#include "imbuf.h" +#include "imxport.h" +#include "imconst.h" + +/* + * Restrictions of attributes + */ + +#define MIN_LINE_SPACING 2 +#define MIN_AREA_WIDTH 16 +#define MIN_AREA_HEIGHT 10 + +/* + * IMDispatcher -- request dispatcher + */ + +typedef int (*IMDispatcher)(); + + +/* + * IMConnection + */ + +typedef struct _im_connection_ { + /* protocol information */ + int major_protocol_version; + int minor_protocol_version; +#ifdef XIM_BC + int has_length_bug; +#endif + int serial; /* connection serial # (for debug) */ + Widget proto_widget; /* protocol handler widget */ + + /* transport information */ + IMTransport transport; + + int byte_order; /* byte order of the client */ +#define ORDER_UNKNOWN 0 /* order is yet unknown */ +#define ORDER_BIG 1 /* big endian */ +#define ORDER_LITTLE 2 /* little endian */ + + /* communication buffer */ + IMBuffer in_buf; /* input buffer */ + IMBuffer out_buf; /* output buffer */ +#define IM_INBUF(conn) (&(conn)->in_buf) +#define IM_OUTBUF(conn) (&(conn)->out_buf) + + IMDispatcher dispatcher; /* request dispatch procedure */ + + struct _im_im_ *im_list; /* list of IMs on this connection */ + +#ifdef notyet + /* authentication information */ + IMAuth *server_auth; /* server authentication data */ + IMAuth *client_auth; /* client authentication data */ +#endif /* notyet */ + + /* scheduler */ + int schedule; /* type of operation to be performed */ +#define SCHED_WRITE 1 /* flush output buffer */ +#define SCHED_CLOSE 2 /* close down connection gently */ +#define SCHED_SHUTDOWN 4 /* force shut down */ + struct _im_connection_ *queue_next; /* output/close/shutdown queue */ + + struct _im_connection_ *next; +} IMConnection; + + +/* + * IMConverter -- information on the conversion engine + */ +typedef struct { + char **supported_locales; /* list of supported locales */ + int num_locales; + WidgetClass input_object_class; + WidgetClass display_object_class; +} IMConverter; + + +/* + * IMTriggerKey -- conversion trigger key specification + */ +typedef struct { + KeySym keysym; + long modifiers; + long check_modifiers; +} IMTriggerKey; + + +/* + * IMExtensionMask -- bit mask of enabled extensions + */ +typedef unsigned long IMExtensionMask; /* holds up to 32 extensions */ + + +/* + * IMIM -- per-IM structure + */ + +typedef struct _im_im_ { + unsigned int id; /* input-method ID */ + IMConnection *connection; /* connection this IM is on */ + struct _im_im_ *next; + struct _im_im_ *hash_next; /* for hash table */ + IMConverter *converter; /* conversion engine */ + IMExtensionMask mask; /* enabled extensions */ + struct _im_ic_ *ic_list; /* list of all ICs belonging to this IM */ +} IMIM; + + +/* + * IMAttributes and IMPSAttributes -- IC attributes structure + */ + +typedef struct { + unsigned long set_mask; /* shows attrs that have been set */ + unsigned long change_mask; /* shows attrs that have changed */ +#define ATTR_MASK_INPUT_STYLE (1<<0) +#define ATTR_MASK_CLIENT (1<<1) +#define ATTR_MASK_FOCUS (1<<2) +#define ATTR_MASK_PREEDIT_STATE (1<<3) +#define ATTR_MASK_RESET_STATE (1<<4) + XIMStyle input_style; + Window client; /* client window */ + Window focus; /* focus window */ + unsigned long preedit_state; + unsigned long reset_state; +} IMCommonAttributes; + +typedef struct { + unsigned long set_mask; /* shows attrs that have been set */ + unsigned long change_mask; /* shows attrs that have changed */ +#define ATTR_MASK_AREA (1<<0) +#define ATTR_MASK_FOREGROUND (1<<1) +#define ATTR_MASK_BACKGROUND (1<<2) +#define ATTR_MASK_COLORMAP (1<<3) +#define ATTR_MASK_STD_COLORMAP (1<<4) +#define ATTR_MASK_BG_PIXMAP (1<<5) +#define ATTR_MASK_LINESPACE (1<<6) +#define ATTR_MASK_CURSOR (1<<7) +#define ATTR_MASK_AREA_NEEDED (1<<8) +#define ATTR_MASK_FONT_SET (1<<9) +#define ATTR_MASK_SPOT_LOCATION (1<<10) + XRectangle area; + Pixel foreground, background; + Colormap colormap; + Atom std_colormap; + Pixmap bg_pixmap; + Position line_space; + Cursor cursor; + XRectangle area_needed; /* width/height member are unused */ + String font_set; + XPoint spot_location; /* not used by status attr. */ +} IMPSAttributes; + + +/* + * IMPendingEvent -- record of delayed processing event + */ + +typedef struct _im_pending_event_ { + struct _im_ic_ *ic; + int synchronous; + XEvent event; + struct _im_pending_event_ *next; +} IMPendingEvent; + + +/* + * IMWindowProfile -- information about window + */ + +typedef struct { + Dimension width; + Dimension height; + Window root; +} IMWindowProfile; + + +/* + * IMIC -- per-IC structure + */ + +typedef struct _im_ic_ { + unsigned int id; /* input-context ID */ + IMIM *im; /* IM this IC belongs to */ + Widget conversion; /* conversion widget attached + * to this IC */ + struct _im_ic_ *next; + struct _im_ic_ *hash_next; /* for hash list */ + int state; /* current IC state */ +#define IC_SYNCING 0x01 /* waiting for SYNC_REPLY message */ +#define IC_CONVERTING 0x02 /* in conversion mode */ +#define IC_RESETTING 0x04 /* in resetting */ +#define IC_FORWARDING 0x08 /* in forward event */ +#define IC_IN_PREEDIT 0x10 /* in preedit (on-the-spot only) */ +#define IC_IN_STATUS 0x20 /* in status (on-the-spot only) */ +#define IC_DESTROYING 0x40 /* in process of IC destruction */ + IMPendingEvent *pending_events; /* pending events */ + int style; /* input style */ +#define IMSTYLE_SEPARATE 0 /* root window style */ +#define IMSTYLE_OVER_THE_SPOT 1 /* over-the-spot style */ +#define IMSTYLE_OFF_THE_SPOT 2 /* off-the-spot style */ +#define IMSTYLE_ON_THE_SPOT 3 /* on-the-spot style */ + IMCommonAttributes common_attr; /* general attributes */ + IMPSAttributes preedit_attr; /* preedit specific attributes */ + IMPSAttributes status_attr; /* status specific attributes */ + IMWindowProfile client_profile; /* client widow profile */ + IMWindowProfile focus_profile; /* focus window profile */ + XFontStruct **fonts; + int num_fonts; + XFontStruct **status_fonts; + int num_status_fonts; +} IMIC; + + +/* + * IM and IC hash table size + */ + +#define IM_HASH_SIZE 32 +#define IC_HASH_SIZE 128 + + +/* + * Public function declarations + */ + +#include "imfuncs.h" + +#endif /* _im_h */ diff -r 000000000000 -r 92745d501b9a lib/imlib/imattr.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/imlib/imattr.c Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,2711 @@ +#ifndef lint +static char *rcsid = "$Id: imattr.c,v 1.18 2002/01/10 15:04:05 ishisone Exp $"; +#endif +/* + * Copyright (c) 1994 Software Research Associates, Inc. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Software Research Associates not be + * used in advertising or publicity pertaining to distribution of the + * software without specific, written prior permission. Software Research + * Associates makes no representations about the suitability of this software + * for any purpose. It is provided "as is" without express or implied + * warranty. + * + * Author: Makoto Ishisone, Software Research Associates, Inc., Japan + */ + +#include "im.h" + +#ifndef XNSeparatorofNestedList +#define XNSeparatorofNestedList "separatorofNesttedList" +#endif +#ifndef XNPreeditState +#define XNPreeditState "preeditState" +#endif +#ifndef XIMPreeditEnable +#define XIMPreeditEnable 1L +#define XIMPreeditDisable 2L +#endif +#ifndef XNResetState +#define XNResetState "resetState" +#endif +#ifndef XIMInitialState +#define XIMInitialState 1L +#define XIMPreserveState 2L +#endif + +#define PAD4(n) ((((n) + 3) / 4) * 4) + +/* + * List of supported input styles. + */ + +typedef struct { + XIMStyle xim_style; /* X11R5 spec. */ + int conversion_style; /* kinput2 spec. */ +} InputStyle; + +static InputStyle styles[] = { + { XIMPreeditPosition|XIMStatusArea, IMSTYLE_OVER_THE_SPOT }, + { XIMPreeditPosition|XIMStatusNothing, IMSTYLE_OVER_THE_SPOT }, + { XIMPreeditArea|XIMStatusArea, IMSTYLE_OFF_THE_SPOT }, + { XIMPreeditCallbacks|XIMStatusCallbacks, IMSTYLE_ON_THE_SPOT }, + { XIMPreeditCallbacks|XIMStatusNothing, IMSTYLE_ON_THE_SPOT }, + { XIMPreeditNothing|XIMStatusNothing, IMSTYLE_SEPARATE }, + { 0 }, +}; + +#define NEST_NONE 0 +#define NEST_PREEDIT 1 +#define NEST_STATUS 2 + +#define CHECK_ICATTR_SIZE(validsize, code) \ + if (len != validsize) { badSizeError(icp, code); return -1; } + +#undef OP_C +#undef OP_S +#undef OP_G + +#define OP_C 1 /* Create */ +#define OP_S 2 /* SetValues */ +#define OP_G 4 /* GetValues */ + +typedef struct { + char *name; /* attribute name */ + int type; /* type of attribute value */ + int valid_ops; /* valid operations for this attribute */ + int (*set_proc) _Pt_((IMIM *, char *, int)); + int (*get_proc) _Pt_((IMIM *, unsigned int, int)); +} IMAttribute; + +typedef struct { + char *name; /* attribute name */ + int type; /* type of attribute value */ + int valid_ops; /* valid operations for this attribute */ + int (*set_proc) _Pt_((IMIC *, char *, int, int, int, int)); + int (*get_proc) _Pt_((IMIC *, unsigned int, int, int, char *, int)); +} ICAttribute; + + +/* + * IM attributes + */ + +static int getQueryInputStyle _Pt_((IMIM *imp, unsigned int id, int offset)); + +static IMAttribute imAttributes[] = { + { XNQueryInputStyle, TYPE_XIM_STYLES, OP_G, + NULL, getQueryInputStyle }, +}; + +static int numImAttributes = XtNumber(imAttributes); + + +/* + * IC attributes + */ + +static int setInputStyle _Pt_((IMIC *, char *, int, int, int, int)); +static int setClientWindow _Pt_((IMIC *, char *, int, int, int, int)); +static int setFocusWindow _Pt_((IMIC *, char *, int, int, int, int)); +static int setPreeditAttributes _Pt_((IMIC *, char *, int, int, int, int)); +static int setStatusAttributes _Pt_((IMIC *, char *, int, int, int, int)); +static int setArea _Pt_((IMIC *, char *, int, int, int, int)); +static int setAreaNeeded _Pt_((IMIC *, char *, int, int, int, int)); +static int setForeground _Pt_((IMIC *, char *, int, int, int, int)); +static int setBackground _Pt_((IMIC *, char *, int, int, int, int)); +static int setColormap _Pt_((IMIC *, char *, int, int, int, int)); +static int setBgPixmap _Pt_((IMIC *, char *, int, int, int, int)); +static int setLineSpace _Pt_((IMIC *, char *, int, int, int, int)); +static int setCursor _Pt_((IMIC *, char *, int, int, int, int)); +static int setSpotLocation _Pt_((IMIC *, char *, int, int, int, int)); +static int setStdColormap _Pt_((IMIC *, char *, int, int, int, int)); +static int setFontSet _Pt_((IMIC *, char *, int, int, int, int)); +static int setPreeditState _Pt_((IMIC *, char *, int, int, int, int)); +static int setResetState _Pt_((IMIC *, char *, int, int, int, int)); + +static int getPreeditAttributes _Pt_((IMIC *, unsigned int, int, int, char *, int)); +static int getStatusAttributes _Pt_((IMIC *, unsigned int, int, int, char *, int)); +static int getInputStyle _Pt_((IMIC *, unsigned int, int, int, char *, int)); +static int getClientWindow _Pt_((IMIC *, unsigned int, int, int, char *, int)); +static int getFocusWindow _Pt_((IMIC *, unsigned int, int, int, char *, int)); +static int getFilterEvents _Pt_((IMIC *, unsigned int, int, int, char *, int)); +static int getArea _Pt_((IMIC *, unsigned int, int, int, char *, int)); +static int getAreaNeeded _Pt_((IMIC *, unsigned int, int, int, char *, int)); +static int getSpotLocation _Pt_((IMIC *, unsigned int, int, int, char *, int)); +static int getColormap _Pt_((IMIC *, unsigned int, int, int, char *, int)); +static int getStdColormap _Pt_((IMIC *, unsigned int, int, int, char *, int)); +static int getForeground _Pt_((IMIC *, unsigned int, int, int, char *, int)); +static int getBackground _Pt_((IMIC *, unsigned int, int, int, char *, int)); +static int getBgPixmap _Pt_((IMIC *, unsigned int, int, int, char *, int)); +static int getFontSet _Pt_((IMIC *, unsigned int, int, int, char *, int)); +static int getLineSpace _Pt_((IMIC *, unsigned int, int, int, char *, int)); +static int getCursor _Pt_((IMIC *, unsigned int, int, int, char *, int)); +static int getPreeditState _Pt_((IMIC *, unsigned int, int, int, char *, int)); +static int getResetState _Pt_((IMIC *, unsigned int, int, int, char *, int)); + +static ICAttribute icAttributes[] = { + { XNInputStyle, TYPE_CARD32, OP_C|OP_G, + setInputStyle, getInputStyle }, + { XNClientWindow, TYPE_WINDOW, OP_C|OP_S|OP_G, + setClientWindow, getClientWindow }, + { XNFocusWindow, TYPE_WINDOW, OP_C|OP_S|OP_G, + setFocusWindow, getFocusWindow }, + { XNFilterEvents, TYPE_CARD32, OP_G, + NULL, getFilterEvents }, + { XNPreeditAttributes, TYPE_NESTED_LIST, OP_C|OP_S|OP_G, + setPreeditAttributes, getPreeditAttributes }, + { XNStatusAttributes, TYPE_NESTED_LIST, OP_C|OP_S|OP_G, + setStatusAttributes, getStatusAttributes }, + { XNArea, TYPE_XRECTANGLE, OP_C|OP_S|OP_G, + setArea, getArea }, + { XNAreaNeeded, TYPE_XRECTANGLE, OP_C|OP_S|OP_G, + setAreaNeeded, getAreaNeeded }, + { XNSpotLocation, TYPE_XPOINT, OP_C|OP_S|OP_G, + setSpotLocation, getSpotLocation }, + { XNColormap, TYPE_CARD32, OP_C|OP_S|OP_G, + setColormap, getColormap }, + { XNStdColormap, TYPE_CARD32, OP_C|OP_S|OP_G, + setStdColormap, getStdColormap }, + { XNForeground, TYPE_CARD32, OP_C|OP_S|OP_G, + setForeground, getForeground }, + { XNBackground, TYPE_CARD32, OP_C|OP_S|OP_G, + setBackground, getBackground }, + { XNBackgroundPixmap, TYPE_CARD32, OP_C|OP_S|OP_G, + setBgPixmap, getBgPixmap }, + { XNFontSet, TYPE_XFONTSET, OP_C|OP_S|OP_G, + setFontSet, getFontSet }, + { XNLineSpace, TYPE_CARD16, OP_C|OP_S|OP_G, /* should be TYPE_INT16 */ + setLineSpace, getLineSpace }, + { XNCursor, TYPE_CARD32, OP_C|OP_S|OP_G, + setCursor, getCursor }, + { XNSeparatorofNestedList, TYPE_SEPARATOR, OP_G, + NULL, NULL }, + { XNPreeditState, TYPE_CARD32, OP_C|OP_S|OP_G, + setPreeditState, getPreeditState }, + { XNResetState, TYPE_CARD32, OP_C|OP_S|OP_G, + setResetState, getResetState }, +}; + +static int numIcAttributes = XtNumber(icAttributes); + + +static unsigned int getC16 _Pt_((char *data, int order)); +static int getI16 _Pt_((char *data, int order)); +static unsigned long getC32 _Pt_((char *data, int order)); +static int validateClientWindow _Pt_((IMIC *icp)); +static int validateFocusWindow _Pt_((IMIC *icp)); +static void badSizeError _Pt_((IMIC *icp, int code)); +static void unnestedError _Pt_((IMIC *icp)); +static IMPSAttributes *getPSPtr _Pt_((IMIC *icp, int type)); +static int getIMValues _Pt_((IMIM *imp, char *data, int len, int offset)); +static int getICValues _Pt_((IMIC *icp, char *data, int len, int nest, + int offset, int *sepp)); +static int setICValues _Pt_((IMIC *icp, char *data, int len, + int major, int op)); +static int getPSAttributes _Pt_((IMIC *icp, unsigned int id, int nest, + int offset, char *data, int len)); +static void changeFonts _Pt_((IMIC *icp, int preedit)); +static void fillCommonDefault _Pt_((IMIC *icp, unsigned long mask)); +static int getNaturalLineSpace _Pt_((IMIC *icp, int preedit)); +static void fillPSDefault _Pt_((IMIC *icp, int type, unsigned long mask)); +static int validateCommonAttr _Pt_((IMIC *icp, int checkonly)); +static int validatePSAttr _Pt_((IMIC *icp, int type, int checkonly)); +static void changeConversionAttributes _Pt_((IMIC *icp)); +static void computeAreaNeeded _Pt_((IMIC *icp)); +static void computeAreaForQuery _Pt_((IMIC *icp)); + + +/* + * Functions reading out numbers from byte buffer + */ + +static unsigned int +getC16(data, order) +char *data; +int order; +{ + unsigned char *p = (unsigned char *)data; + unsigned int x; + + x = (order == ORDER_BIG) ? ((p[0] << 8) | p[1]) : (p[0] | p[1] << 8); + return x; +} + +static int +getI16(data, order) +char *data; +int order; +{ + unsigned char *p = (unsigned char *)data; + long l; + + l = (order == ORDER_BIG) ? ((p[0] << 8) | p[1]) : (p[0] | p[1] << 8); + return (l < 32768) ? (int)l : (int)(l - 65536L); +} + +static unsigned long +getC32(data, order) +char *data; +int order; +{ + unsigned char *p = (unsigned char *)data; + unsigned long x; + + if (order == ORDER_BIG) { + x = (p[0]<<24) | (p[1]<<16) | (p[2]<<8) | p[3]; + } else { + x = p[0] | (p[1]<<8) | (p[2]<<16) | (p[3]<<24); + } + return x; +} + + +/* + * Functions that check the validity of resources. + */ + +static int +validateClientWindow(icp) +IMIC *icp; +{ + return IMValidateWindow(XtDisplay(icp->im->connection->proto_widget), + icp->common_attr.client, &icp->client_profile); +} + +static int +validateFocusWindow(icp) +IMIC *icp; +{ + IMCommonAttributes *ap = &icp->common_attr; + + /* + * This function assumes that the client window has already + * been validated. + */ + if ((ap->set_mask & ATTR_MASK_CLIENT) && ap->focus == ap->client) { + icp->focus_profile = icp->client_profile; + return 1; + } else { + return IMValidateWindow(XtDisplay(icp->im->connection->proto_widget), + icp->common_attr.focus, &icp->focus_profile); + } +} + + +/* + * Functions submit errors + */ + +static void +badSizeError(icp, code) +IMIC *icp; +int code; +{ + DPRINT(("bad size error for IC #%d\n", icp->id)); + IMSendError(icp->im->connection, code, icp->im->id, icp->id, + "invalid size of attribute value"); +} + +static void +unnestedError(icp) +IMIC *icp; +{ + DPRINT(("unnested error for IC #%d\n", icp->id)); + IMSendError(icp->im->connection, IMBadSomething, icp->im->id, icp->id, + "either preedit or status specification required"); +} + + +/* + * Functions getting IM attributes + */ + +static IMPSAttributes * +getPSPtr(icp, type) +IMIC *icp; +int type; +{ + switch (type) { + case NEST_PREEDIT: return &icp->preedit_attr; + case NEST_STATUS: return &icp->status_attr; + default: return NULL; + } +} + +static int +getIMValues(imp, data, len, offset) +IMIM *imp; +char *data; +int len; +int offset; /* request offset */ +{ + unsigned int id; /* attribute ID */ + IMAttribute *attrp; + IMConnection *conn = imp->connection; + int byte_order = conn->byte_order; + + while (len >= 2) { + id = getC16(data, byte_order); + data += 2; + len -= 2; + + if (id > numImAttributes) { + /* invalid attribute ID */ + IMCancelRequest(conn, offset); + IMSendError(conn, IMBadSomething, imp->id, 0, + "invalid IM attribute ID"); + return -1; + } + + attrp = &imAttributes[id]; + if (!(attrp->valid_ops & OP_G)) { + IMCancelRequest(conn, offset); + IMSendError(conn, IMBadSomething, imp->id, 0, + "invalid operation (IMGetValues) for this attribute"); + return -1; + } + + if ((*attrp->get_proc)(imp, id, offset) < 0) return -1; + } + return 0; +} + +/* ARGSUSED */ +static int +getQueryInputStyle(imp, id, offset) +IMIM *imp; +unsigned int id; +int offset; +{ + IMConnection *conn = imp->connection; + unsigned int num_styles, num_bytes; + InputStyle *stp; + + TRACE(("imlib:getQueryInputStyle()\n")); + + for (num_styles = 0, stp = styles; stp->xim_style != 0; stp++) { + num_styles++; + } + num_bytes = num_styles * 4 + 4; + IMPutC16(conn, id); + IMPutC16(conn, num_bytes); + IMPutC16(conn, num_styles); + IMPutC16(conn, 0); + for (stp = styles; stp->xim_style != 0; stp++) { + IMPutC32(conn, stp->xim_style); + } + return 0; +} + + +/* + * Functions setting IC attributes + */ + +static int +setICValues(icp, data, len, nest, op) +IMIC *icp; +char *data; +int len; +int nest; +int op; +{ + IMConnection *conn = icp->im->connection; + unsigned int imid = icp->im->id; + unsigned int icid = icp->id; + unsigned int id; + unsigned int value_len; + unsigned int attr_len; + char *value; + ICAttribute *attrp; + int byte_order = icp->im->connection->byte_order; + + TRACE(("imlib:setICValues()\n")); + + while (len > 0) { + if (len < 4) { + DPRINT(("attribute data length < 4\n")); + IMSendError(conn, IMBadSomething, imid, icid, "Bad attribute data"); + return -1; + } + id = getC16(data, byte_order); + value_len = getC16(data + 2, byte_order); + attr_len = PAD4(4 + value_len); + + if (attr_len > len) { + DPRINT(("attribute data length > request length\n")); + IMSendError(conn, IMBadSomething, imid, icid, + "Bad attribute length"); + return -1; + } + value = data + 4; + + if (id > numIcAttributes) { + DPRINT(("invalid IC attribute ID %d\n", id)); + IMSendError(conn, IMBadSomething, imid, icid, + "invalid IC attribute ID"); + return -1; + } + attrp = &icAttributes[id]; + if (!(attrp->valid_ops & op)) { + DPRINT(("invalid operation (%s) for IC attr %d\n", + op == OP_C ? "create" : "set", id)); + IMSendError(conn, IMBadSomething, imid, icid, + "invalid operation for this attribute"); + return -1; + } + + /* + * Call attribute set procedure. + */ + if ((*attrp->set_proc)(icp, value, (int)value_len, byte_order, nest, op) < 0) { + /* + * Error has occured. The set procedure has already sent + * appropriate error message, so just return here. + */ + return -1; + } + + data += attr_len; + len -= attr_len; + } + return 0; +} + +/* ARGSUSED */ +static int +setInputStyle(icp, value, len, order, nest, op) +IMIC *icp; +char *value; +int len; +int order; +int nest; +int op; +{ + TRACE(("imlib:setInputStyle()\n")); + + CHECK_ICATTR_SIZE(4, IMBadStyle); + + /* + * InputStyle must be set with CreateIC. + */ + if (op != OP_C) { + DPRINT(("trying to change input style through SetICValues\n")); + IMSendError(icp->im->connection, IMBadStyle, + icp->im->id, icp->id, + "InputStyle cannot be changed by SetICValues"); + return -1; + } + + icp->common_attr.input_style = (XIMStyle)getC32(value, order); + icp->common_attr.set_mask |= ATTR_MASK_INPUT_STYLE; + icp->common_attr.change_mask |= ATTR_MASK_INPUT_STYLE; + TRACE(("\tinput style: %ld\n", icp->common_attr.input_style)); + return 0; +} + +/* ARGSUSED */ +static int +setClientWindow(icp, value, len, order, nest, op) +IMIC *icp; +char *value; +int len; +int order; +int nest; +int op; +{ + TRACE(("imlib:setClientWindow()\n")); + + CHECK_ICATTR_SIZE(4, IMBadClientWindow); + + /* + * ClientWindow cannot be changed. + */ + if (icp->common_attr.set_mask & ATTR_MASK_CLIENT) { + DPRINT(("client window already specified\n")); + IMSendError(icp->im->connection, IMBadClientWindow, + icp->im->id, icp->id, "ClientWindow already set"); + return -1; + } + + icp->common_attr.client = (Window)getC32(value, order); + TRACE(("\tclient window: %08lx\n", icp->common_attr.client)); + + icp->common_attr.set_mask |= ATTR_MASK_CLIENT; + icp->common_attr.change_mask |= ATTR_MASK_CLIENT; + + return 0; +} + +/* ARGSUSED */ +static int +setFocusWindow(icp, value, len, order, nest, op) +IMIC *icp; +char *value; +int len; +int order; +int nest; +int op; +{ + Window focus; + + TRACE(("imlib:setFocusWindow()\n")); + + CHECK_ICATTR_SIZE(4, IMBadFocusWindow); + + focus = (Window)getC32(value, order); + TRACE(("\tfocus window: %08lx\n", focus)); + + if (!(icp->common_attr.set_mask & ATTR_MASK_FOCUS) || + focus != icp->common_attr.focus) { + icp->common_attr.change_mask |= ATTR_MASK_FOCUS; + } + icp->common_attr.focus = focus; + icp->common_attr.set_mask |= ATTR_MASK_FOCUS; + return 0; +} + +/* ARGSUSED */ +static int +setPreeditAttributes(icp, value, len, order, nest, op) +IMIC *icp; +char *value; +int len; +int order; +int nest; +int op; +{ + TRACE(("imlib:setPreeditAttributes()\n")); + return setICValues(icp, value, len, NEST_PREEDIT, op); +} + +/* ARGSUSED */ +static int +setStatusAttributes(icp, value, len, order, nest, op) +IMIC *icp; +char *value; +int len; +int order; +int nest; +int op; +{ + TRACE(("imlib:setStatusAttributes()\n")); + return setICValues(icp, value, len, NEST_STATUS, op); +} + +/* ARGSUSED */ +static int +setArea(icp, value, len, order, nest, op) +IMIC *icp; +char *value; +int len; +int order; +int nest; +int op; +{ + IMPSAttributes *ap; + XRectangle area; + + TRACE(("imlib:setArea()\n")); + + CHECK_ICATTR_SIZE(8, IMBadArea); + + if ((ap = getPSPtr(icp, nest)) == NULL) { + unnestedError(icp); + return -1; + } + + area.x = getI16(value, order); + area.y = getI16(value + 2, order); + area.width = getC16(value + 4, order); + area.height = getC16(value + 6, order); + TRACE(("\tarea: %d, %d, %d, %d\n", + area.x, area.y, area.width, area.height)); + + if (!(ap->set_mask & ATTR_MASK_AREA) || + area.x != ap->area.x || + area.y != ap->area.y || + area.width != ap->area.width || + area.height != ap->area.height) { + ap->change_mask |= ATTR_MASK_AREA; + } + + ap->area.x = area.x; + ap->area.y = area.y; + ap->area.width = area.width; + ap->area.height = area.height; + ap->set_mask |= ATTR_MASK_AREA; + + return 0; +} + +/* ARGSUSED */ +static int +setAreaNeeded(icp, value, len, order, nest, op) +IMIC *icp; +char *value; +int len; +int order; +int nest; +int op; +{ + IMPSAttributes *ap; + XRectangle area; + + TRACE(("imlib:setAreaNeeded()\n")); + + CHECK_ICATTR_SIZE(8, IMBadArea); + + if ((ap = getPSPtr(icp, nest)) == NULL) { + unnestedError(icp); + return -1; + } + + area.width = getC16(value + 4, order); + area.height = getC16(value + 6, order); + TRACE(("\tarea needed: %d, %d\n", area.width, area.height)); + + if (!(ap->set_mask & ATTR_MASK_AREA_NEEDED) || + area.width != ap->area_needed.width || + area.height != ap->area_needed.height) { + ap->change_mask |= ATTR_MASK_AREA_NEEDED; + } + + ap->area_needed.width = area.width; + ap->area_needed.height = area.height; + ap->set_mask |= ATTR_MASK_AREA_NEEDED; + + return 0; +} + +/* ARGSUSED */ +static int +setForeground(icp, value, len, order, nest, op) +IMIC *icp; +char *value; +int len; +int order; +int nest; +int op; +{ + IMPSAttributes *ap; + Pixel fore; + + TRACE(("imlib:setForeground()\n")); + + CHECK_ICATTR_SIZE(4, IMBadForeground); + + if ((ap = getPSPtr(icp, nest)) == NULL) { + unnestedError(icp); + return -1; + } + + fore = getC32(value, order); + TRACE(("\tforeground: %ld\n", fore)); + + if (!(ap->set_mask & ATTR_MASK_FOREGROUND) || fore != ap->foreground) { + ap->change_mask |= ATTR_MASK_FOREGROUND; + } + ap->foreground = fore; + ap->set_mask |= ATTR_MASK_FOREGROUND; + return 0; +} + +/* ARGSUSED */ +static int +setBackground(icp, value, len, order, nest, op) +IMIC *icp; +char *value; +int len; +int order; +int nest; +int op; +{ + IMPSAttributes *ap; + Pixel back; + + TRACE(("imlib:setBackground()\n")); + + CHECK_ICATTR_SIZE(4, IMBadBackground); + + if ((ap = getPSPtr(icp, nest)) == NULL) { + unnestedError(icp); + return -1; + } + + back = getC32(value, order); + TRACE(("\tbackground: %ld\n", back)); + + if (!(ap->set_mask & ATTR_MASK_BACKGROUND) || back != ap->background) { + ap->change_mask |= ATTR_MASK_BACKGROUND; + } + ap->background = back; + ap->set_mask |= ATTR_MASK_BACKGROUND; + return 0; +} + +/* ARGSUSED */ +static int +setColormap(icp, value, len, order, nest, op) +IMIC *icp; +char *value; +int len; +int order; +int nest; +int op; +{ + IMPSAttributes *ap; + Colormap cmap; + + TRACE(("imlib:setColormap()\n")); + + CHECK_ICATTR_SIZE(4, IMBadColormap); + + if ((ap = getPSPtr(icp, nest)) == NULL) { + unnestedError(icp); + return -1; + } + + cmap = getC32(value, order); + TRACE(("\tcolormap: %08lx\n", cmap)); + + if (!(ap->set_mask & ATTR_MASK_COLORMAP) || cmap != ap->colormap) { + ap->change_mask |= ATTR_MASK_COLORMAP; + } + ap->colormap = cmap; + ap->set_mask |= ATTR_MASK_COLORMAP; + return 0; +} + +/* ARGSUSED */ +static int +setBgPixmap(icp, value, len, order, nest, op) +IMIC *icp; +char *value; +int len; +int order; +int nest; +int op; +{ + IMPSAttributes *ap; + Pixmap pixmap; + + TRACE(("imlib:setBgPixmap()\n")); + + CHECK_ICATTR_SIZE(4, IMBadPixmap); + + if ((ap = getPSPtr(icp, nest)) == NULL) { + unnestedError(icp); + return -1; + } + + pixmap = getC32(value, order); + TRACE(("\tbackground pixmap: %08lx\n", pixmap)); + + if (!(ap->set_mask & ATTR_MASK_BG_PIXMAP) || pixmap != ap->bg_pixmap) { + ap->change_mask |= ATTR_MASK_BG_PIXMAP; + } + + ap->bg_pixmap = pixmap; + ap->set_mask |= ATTR_MASK_BG_PIXMAP; + + return 0; +} + +/* ARGSUSED */ +static int +setLineSpace(icp, value, len, order, nest, op) +IMIC *icp; +char *value; +int len; +int order; +int nest; +int op; +{ + IMPSAttributes *ap; + int line_space; + + TRACE(("imlib:setLineSpace()\n")); + + CHECK_ICATTR_SIZE(2, IMBadSomething); + + if ((ap = getPSPtr(icp, nest)) == NULL) { + unnestedError(icp); + return -1; + } + + line_space = getI16(value, order); /* ??? linespacing is 'int' */ + TRACE(("\tline space: %d\n", line_space)); + + if (!(ap->set_mask & ATTR_MASK_LINESPACE) || + line_space != ap->line_space) { + ap->change_mask |= ATTR_MASK_LINESPACE; + } + ap->line_space = line_space; + ap->set_mask |= ATTR_MASK_LINESPACE; + return 0; +} + +/* ARGSUSED */ +static int +setCursor(icp, value, len, order, nest, op) +IMIC *icp; +char *value; +int len; +int order; +int nest; +int op; +{ + IMPSAttributes *ap; + Cursor cursor; + + TRACE(("imlib:setCursor()\n")); + + CHECK_ICATTR_SIZE(4, IMBadCursor); + + if ((ap = getPSPtr(icp, nest)) == NULL) { + unnestedError(icp); + return -1; + } + + cursor = getC32(value, order); + TRACE(("\tcursor: %08lx\n", cursor)); + + if (!(ap->set_mask & ATTR_MASK_CURSOR) || cursor != ap->cursor) { + ap->change_mask |= ATTR_MASK_CURSOR; + } + ap->cursor = cursor; + ap->set_mask |= ATTR_MASK_CURSOR; + return 0; +} + +/* ARGSUSED */ +static int +setSpotLocation(icp, value, len, order, nest, op) +IMIC *icp; +char *value; +int len; +int order; +int nest; +int op; +{ + IMPSAttributes *ap; + XPoint spot; + + TRACE(("imlib:setSpotLocation()\n")); + + CHECK_ICATTR_SIZE(4, IMBadSpotLocation); + + if (nest == NEST_STATUS) { + DPRINT(("spot location specified in a status attribute list\n")); + IMSendError(icp->im->connection, IMBadSpotLocation, + icp->im->id, icp->id, + "spot location isn't a status attribute"); + return -1; + } + + ap = &icp->preedit_attr; + + spot.x = getI16(value, order); + spot.y = getI16(value + 2, order); + TRACE(("\tspot location: %d, %d\n", spot.x, spot.y)); + + if (!(ap->set_mask & ATTR_MASK_SPOT_LOCATION) || + spot.x != ap->spot_location.x || spot.y != ap->spot_location.y) { + ap->change_mask |= ATTR_MASK_SPOT_LOCATION; + } + ap->spot_location.x = spot.x; + ap->spot_location.y = spot.y; + ap->set_mask |= ATTR_MASK_SPOT_LOCATION; + return 0; +} + +/* ARGSUSED */ +static int +setStdColormap(icp, value, len, order, nest, op) +IMIC *icp; +char *value; +int len; +int order; +int nest; +int op; +{ + IMPSAttributes *ap; + Atom colormap_name; + XStandardColormap *stdcolormaps; + Widget w = icp->im->connection->proto_widget; + Display *dpy = XtDisplay(w); + int ncolormaps; + Window root; + XAEHandle h; + int status; + + TRACE(("imlib:setStdColormap()\n")); + + CHECK_ICATTR_SIZE(4, IMBadAtom); + + if ((ap = getPSPtr(icp, nest)) == NULL) { + unnestedError(icp); + return -1; + } + + colormap_name = getC32(value, order); + if (icp->common_attr.set_mask & ATTR_MASK_CLIENT) { + root = icp->client_profile.root; + } else if (icp->common_attr.set_mask & ATTR_MASK_FOCUS) { + root = icp->focus_profile.root; + } else { + /* + * Client has not specified client window yet. + * Reading standard colormap property should been deffered + * until the window is set, but for now... + */ + DDPRINT(2, ("std colormap specified, leaving client window unspecified\n")); + root = RootWindowOfScreen(XtScreen(w)); + } + + h = XAESetIgnoreErrors(dpy); + status = XGetRGBColormaps(dpy, root, + &stdcolormaps, &ncolormaps, colormap_name); + XAEUnset(h); + if (!status || ncolormaps < 0) { + DPRINT(("can't get standard colormap (%ld)\n", colormap_name)); + IMSendError(icp->im->connection, IMBadName, icp->im->id, icp->id, + "invalid standard colormap name"); + return -1; + } + + if (!(ap->set_mask & ATTR_MASK_STD_COLORMAP) || + colormap_name != ap->std_colormap) { + ap->change_mask |= ATTR_MASK_STD_COLORMAP; + } + ap->std_colormap = colormap_name; + ap->colormap = stdcolormaps[0].colormap; + TRACE(("\tstandard colormap: %ld (colormap=%08lx)\n", + colormap_name, ap->colormap)); + + ap->set_mask |= ATTR_MASK_STD_COLORMAP | ATTR_MASK_COLORMAP; + XFree((char *)stdcolormaps); + return 0; +} + +/* ARGSUSED */ +static int +setFontSet(icp, value, len, order, nest, op) +IMIC *icp; +char *value; +int len; +int order; +int nest; +int op; +{ + IMPSAttributes *ap; + unsigned int name_list_len; + char *name_list; + + TRACE(("imlib:setFontSet()\n")); + + if (len < 2) { + badSizeError(icp, IMBadName); + return -1; + } + name_list_len = getC16(value, order); + if (2 + name_list_len > len) { + badSizeError(icp, IMBadName); + return -1; + } + + if ((ap = getPSPtr(icp, nest)) == NULL) { + unnestedError(icp); + return -1; + } + + name_list = XtMalloc(name_list_len + 1); + bcopy(value + 2, name_list, name_list_len); + name_list[name_list_len] = '\0'; + TRACE(("\tfontset: %s\n", name_list)); + + if (ap->set_mask & ATTR_MASK_FONT_SET) { + if (!strcmp(name_list, ap->font_set)) { + XtFree(name_list); + } else { + ap->change_mask |= ATTR_MASK_FONT_SET; + if (ap->font_set != IMDefaultFontSet(icp->im)) { + XtFree(ap->font_set); + } + ap->font_set = name_list; + } + } else { + ap->font_set = name_list; + ap->set_mask |= ATTR_MASK_FONT_SET; + ap->change_mask |= ATTR_MASK_FONT_SET; + } + return 0; +} + +/* ARGSUSED */ +static int +setPreeditState(icp, value, len, order, nest, op) +IMIC *icp; +char *value; +int len; +int order; +int nest; +int op; +{ + IMCommonAttributes *ap = &icp->common_attr; + unsigned long preedit_state; + + TRACE(("imlib:setPreeditState()\n")); + + CHECK_ICATTR_SIZE(4, IMBadSomething); + + if (nest == NEST_STATUS) { + DPRINT(("preedit state specified in a status attribute list\n")); + IMSendError(icp->im->connection, IMBadSomething, + icp->im->id, icp->id, + "preedit state isn't a status attribute"); + return -1; + } + + preedit_state = getC32(value, order); + + ap->set_mask |= ATTR_MASK_PREEDIT_STATE; + ap->change_mask |= ATTR_MASK_PREEDIT_STATE; + ap->preedit_state = preedit_state; + return 0; +} + +/* ARGSUSED */ +static int +setResetState(icp, value, len, order, nest, op) +IMIC *icp; +char *value; +int len; +int order; +int nest; +int op; +{ + IMCommonAttributes *ap = &icp->common_attr; + unsigned long reset_state; + + TRACE(("imlib:setResetState()\n")); + + CHECK_ICATTR_SIZE(4, IMBadSomething); + + reset_state = getC32(value, order); + + ap->set_mask |= ATTR_MASK_RESET_STATE; + ap->change_mask |= ATTR_MASK_RESET_STATE; + ap->reset_state = reset_state; + return 0; +} + + +/* + * Functions getting IC attributes + */ + +static int +getICValues(icp, data, len, nest, offset, sepp) +IMIC *icp; +char *data; +int len; +int nest; /* NEST_NONE, NEST_PREEDIT or NEST_STATUS */ +int offset; /* request offset */ +int *sepp; /* Out: true if ended with a nested list separator */ +{ + unsigned int id; /* attribute ID */ + ICAttribute *attrp; + IMConnection *conn = icp->im->connection; + int byte_order = conn->byte_order; + char *org_data = data; + int r; + + TRACE(("imlib:getICValues()\n")); + + while (len >= 2) { + id = getC16(data, byte_order); + data += 2; + len -= 2; + + if (id > numIcAttributes) { + /* invalid attribute ID */ + DPRINT(("invalid IC attribute ID (%d) specified\n", id)); + IMCancelRequest(conn, offset); + IMSendError(conn, IMBadSomething, icp->im->id, icp->id, + "invalid IC attribute ID"); + return -1; + } + + attrp = &icAttributes[id]; + if (attrp->type == TYPE_SEPARATOR) { + /* nested list separator */ + *sepp = 1; + return data - org_data; + } + + if (!(attrp->valid_ops & OP_G)) { + DPRINT(("invalid operation (get) for IC attr %d\n", id)); + IMCancelRequest(conn, offset); + IMSendError(conn, IMBadSomething, icp->im->id, icp->id, + "invalid operation (ICGetValues) for this attribute"); + return -1; + } + + r = (*attrp->get_proc)(icp, id, nest, offset, data, len); + /* + * The return value of get_proc is usually 0, indicating success. + * If it is less than 0, there are some errors. + * If it is greater than 0, + */ + if (r < 0) return -1; + + data += r; /* r is extra offset */ + len -= r; + } + *sepp = 0; + return data - org_data; +} + +/* ARGSUSED */ +static int +getPSAttributes(icp, id, nest, offset, data, len) +IMIC *icp; +unsigned int id; +int nest; +int offset; +char *data; +int len; +{ + IMConnection *conn = icp->im->connection; + unsigned int length; + int length_offset; + int attr_offset; + int nested_separator; + int r; + + IMPutC16(conn, id); + + length_offset = IMWritePos(conn); + IMPutC16(conn, 0); /* dummy -- overwritten afterwards */ + + attr_offset = IMWritePos(conn); + + r = getICValues(icp, data, len, nest, offset, &nested_separator); + if (r < 0) return -1; + if (!nested_separator) { + /* there's no nested list separator */ + DPRINT(("nested list doesn't end with separator\n")); + /* + * X11R6 Xlib sends nested attribute list which has no + * separator at its end. In order to accommodate to it, + * don't send error for that. + */ +#ifdef notdef + IMCancelRequest(conn, offset); + IMSendError(conn, IMBadSomething, icp->im->id, icp->id, + "corrupted nested list"); + return -1; +#endif + } + + /* + * Nested list is written on the output buffer. + * Calculate the length of the list. + */ + length = IMWritePos(conn) - attr_offset; + + /* rewrite attribute length field */ + IMRewriteC16(conn, length_offset, length); + IMPutPad(conn); + + return r; +} + +/* ARGSUSED */ +static int +getPreeditAttributes(icp, id, nest, offset, data, len) +IMIC *icp; +unsigned int id; +int nest; /* unused */ +int offset; +char *data; +int len; +{ + TRACE(("imlib:getPreeditAttributes()\n")); + return getPSAttributes(icp, id, NEST_PREEDIT, offset, data, len); +} + +/* ARGSUSED */ +static int +getStatusAttributes(icp, id, nest, offset, data, len) +IMIC *icp; +unsigned int id; +int nest; /* unused */ +int offset; +char *data; +int len; +{ + TRACE(("imlib:getStatusAttributes()\n")); + return getPSAttributes(icp, id, NEST_STATUS, offset, data, len); +} + +/* ARGSUSED */ +static int +getInputStyle(icp, id, nest, offset, data, len) +IMIC *icp; +unsigned int id; +int nest; +int offset; +char *data; +int len; +{ + IMConnection *conn = icp->im->connection; + + TRACE(("imlib:getInputStyle()\n")); + + /* + * Input style must have been specified, (and validated) + * at IC creation. No need for checking. + */ + IMPutC16(conn, id); /* attribute ID */ + IMPutC16(conn, 4); /* value length */ + IMPutC32(conn, icp->common_attr.input_style); + return 0; +} + +/* ARGSUSED */ +static int +getClientWindow(icp, id, nest, offset, data, len) +IMIC *icp; +unsigned int id; +int nest; +int offset; +char *data; +int len; +{ + IMConnection *conn = icp->im->connection; + + TRACE(("imlib:getClientWindow()\n")); + + if (icp->common_attr.set_mask & ATTR_MASK_CLIENT) { + IMPutC16(conn, id); /* attribute ID */ + IMPutC16(conn, 4); /* value length */ + IMPutC32(conn, icp->common_attr.client); + return 0; + } else { + /* no default is available */ + DPRINT(("getClientWindow without setting client window previously\n")); + IMCancelRequest(conn, offset); + IMSendError(conn, IMBadClientWindow, icp->im->id, icp->id, + "client window not specified yet"); + return -1; + } +} + +/* ARGSUSED */ +static int +getFocusWindow(icp, id, nest, offset, data, len) +IMIC *icp; +unsigned int id; +int nest; +int offset; +char *data; +int len; +{ + IMConnection *conn = icp->im->connection; + + TRACE(("imlib:getFocusWindow()\n")); + + if (!(icp->common_attr.set_mask & ATTR_MASK_FOCUS)) { + /* fill default value */ + fillCommonDefault(icp, (unsigned long)ATTR_MASK_FOCUS); + } + + if (icp->common_attr.set_mask & ATTR_MASK_FOCUS) { + IMPutC16(conn, id); /* attribute ID */ + IMPutC16(conn, 4); /* value length */ + IMPutC32(conn, icp->common_attr.focus); + return 0; + } else { + /* + * Couldn't get the default value. That is, neither + * focus window nor client window is specified yet. + */ + DPRINT(("getFocusWindow without setting focus/client window previously\n")); + IMCancelRequest(conn, offset); + IMSendError(conn, IMBadFocusWindow, icp->im->id, icp->id, + "neither of client/focus window not specified yet"); + return -1; + } +} + +/* ARGSUSED */ +static int +getFilterEvents(icp, id, nest, offset, data, len) +IMIC *icp; +unsigned int id; +int nest; +int offset; +char *data; +int len; +{ + IMConnection *conn = icp->im->connection; + + TRACE(("imlib:getFilterEvents()\n")); + + /* We need only Key events */ + IMPutC16(conn, id); /* attribute ID */ + IMPutC16(conn, 4); /* value length */ + IMPutC32(conn, KeyPressMask | KeyReleaseMask); + return 0; +} + +/* ARGSUSED */ +static int +getArea(icp, id, nest, offset, data, len) +IMIC *icp; +unsigned int id; +int nest; +int offset; +char *data; +int len; +{ + IMConnection *conn = icp->im->connection; + IMPSAttributes *ap; + + TRACE(("imlib:getArea()\n")); + + if ((ap = getPSPtr(icp, nest)) == NULL) { + IMCancelRequest(conn, offset); + unnestedError(icp); + return -1; + } + + if (!(ap->set_mask & ATTR_MASK_AREA)) { + fillPSDefault(icp, nest, (unsigned long)ATTR_MASK_AREA); + } + + IMPutC16(conn, id); /* attribute ID */ + IMPutC16(conn, 8); /* value length */ + IMPutI16(conn, ap->area.x); + IMPutI16(conn, ap->area.y); + IMPutC16(conn, ap->area.width); + IMPutC16(conn, ap->area.height); + return 0; +} + +/* ARGSUSED */ +static int +getAreaNeeded(icp, id, nest, offset, data, len) +IMIC *icp; +unsigned int id; +int nest; +int offset; +char *data; +int len; +{ + IMConnection *conn = icp->im->connection; + IMPSAttributes *ap; + + TRACE(("imlib:getAreaNeeded()\n")); + + if ((ap = getPSPtr(icp, nest)) == NULL) { + IMCancelRequest(conn, offset); + unnestedError(icp); + return -1; + } + + /* + * Always call fillPSDefault to get appropriate AreaNeeded value. + */ + fillPSDefault(icp, nest, (unsigned long)ATTR_MASK_AREA_NEEDED); + + TRACE(("\tarea needed: %d, %d, %d, %d\n", + ap->area_needed.x, ap->area_needed.y, + ap->area_needed.width, ap->area_needed.height)); + + IMPutC16(conn, id); /* attribute ID */ + IMPutC16(conn, 8); /* value length */ + IMPutI16(conn, ap->area_needed.x); + IMPutI16(conn, ap->area_needed.y); + IMPutC16(conn, ap->area_needed.width); + IMPutC16(conn, ap->area_needed.height); + return 0; +} + +/* ARGSUSED */ +static int +getSpotLocation(icp, id, nest, offset, data, len) +IMIC *icp; +unsigned int id; +int nest; +int offset; +char *data; +int len; +{ + IMConnection *conn = icp->im->connection; + IMPSAttributes *ap = &icp->preedit_attr; + + TRACE(("imlib:getSpotLocation()\n")); + + if (nest == NEST_STATUS) { + IMCancelRequest(conn, offset); + IMSendError(conn, IMBadSomething, icp->im->id, icp->id, + "spot location isn't a status attribute"); + return -1; + } + + if (!(ap->set_mask & ATTR_MASK_SPOT_LOCATION)) { + fillPSDefault(icp, NEST_PREEDIT, + (unsigned long)ATTR_MASK_SPOT_LOCATION); + } + + IMPutC16(conn, id); /* attribute ID */ + IMPutC16(conn, 4); /* value length */ + IMPutI16(conn, ap->spot_location.x); + IMPutI16(conn, ap->spot_location.y); + return 0; +} + +/* ARGSUSED */ +static int +getColormap(icp, id, nest, offset, data, len) +IMIC *icp; +unsigned int id; +int nest; +int offset; +char *data; +int len; +{ + IMConnection *conn = icp->im->connection; + IMPSAttributes *ap; + + TRACE(("imlib:getColormap()\n")); + + if ((ap = getPSPtr(icp, nest)) == NULL) { + IMCancelRequest(conn, offset); + unnestedError(icp); + return -1; + } + + if (!(ap->set_mask & ATTR_MASK_COLORMAP)) { + fillPSDefault(icp, nest, (unsigned long)ATTR_MASK_COLORMAP); + } + + IMPutC16(conn, id); /* attribute ID */ + IMPutC16(conn, 4); /* value length */ + IMPutC32(conn, ap->colormap); + return 0; +} + +/* ARGSUSED */ +static int +getStdColormap(icp, id, nest, offset, data, len) +IMIC *icp; +unsigned int id; +int nest; +int offset; +char *data; +int len; +{ + IMConnection *conn = icp->im->connection; + IMPSAttributes *ap; + Atom colormap_name; + + TRACE(("imlib:getStdColormap()\n")); + + if ((ap = getPSPtr(icp, nest)) == NULL) { + IMCancelRequest(conn, offset); + unnestedError(icp); + return -1; + } + + if (ap->set_mask & ATTR_MASK_STD_COLORMAP) { + colormap_name = ap->std_colormap; + } else { + /* what to do? */ + colormap_name = None; + DPRINT(("client asks standard colormap, but not specified\n")); + } + + IMPutC16(conn, id); /* attribute ID */ + IMPutC16(conn, 4); /* value length */ + IMPutC32(conn, colormap_name); + return 0; +} + +/* ARGSUSED */ +static int +getForeground(icp, id, nest, offset, data, len) +IMIC *icp; +unsigned int id; +int nest; +int offset; +char *data; +int len; +{ + IMConnection *conn = icp->im->connection; + IMPSAttributes *ap; + + TRACE(("imlib:getForeground()\n")); + + if ((ap = getPSPtr(icp, nest)) == NULL) { + IMCancelRequest(conn, offset); + unnestedError(icp); + return -1; + } + + if (!(ap->set_mask & ATTR_MASK_FOREGROUND)) { + fillPSDefault(icp, nest, (unsigned long)ATTR_MASK_FOREGROUND); + } + + IMPutC16(conn, id); /* attribute ID */ + IMPutC16(conn, 4); /* value length */ + IMPutC32(conn, ap->foreground); + return 0; +} + +/* ARGSUSED */ +static int +getBackground(icp, id, nest, offset, data, len) +IMIC *icp; +unsigned int id; +int nest; +int offset; +char *data; +int len; +{ + IMConnection *conn = icp->im->connection; + IMPSAttributes *ap; + + TRACE(("imlib:getBackground()\n")); + + if ((ap = getPSPtr(icp, nest)) == NULL) { + IMCancelRequest(conn, offset); + unnestedError(icp); + return -1; + } + + if (!(ap->set_mask & ATTR_MASK_BACKGROUND)) { + fillPSDefault(icp, nest, (unsigned long)ATTR_MASK_BACKGROUND); + } + + IMPutC16(conn, id); /* attribute ID */ + IMPutC16(conn, 4); /* value length */ + IMPutC32(conn, ap->background); + return 0; +} + +/* ARGSUSED */ +static int +getBgPixmap(icp, id, nest, offset, data, len) +IMIC *icp; +unsigned int id; +int nest; +int offset; +char *data; +int len; +{ + IMConnection *conn = icp->im->connection; + IMPSAttributes *ap; + + TRACE(("imlib:getBgPixmap()\n")); + + if ((ap = getPSPtr(icp, nest)) == NULL) { + IMCancelRequest(conn, offset); + unnestedError(icp); + return -1; + } + + if (!(ap->set_mask & ATTR_MASK_BG_PIXMAP)) { + fillPSDefault(icp, nest, (unsigned long)ATTR_MASK_BG_PIXMAP); + } + + IMPutC16(conn, id); /* attribute ID */ + IMPutC16(conn, 4); /* value length */ + IMPutC32(conn, ap->bg_pixmap); + return 0; +} + +/* ARGSUSED */ +static int +getFontSet(icp, id, nest, offset, data, len) +IMIC *icp; +unsigned int id; +int nest; +int offset; +char *data; +int len; +{ + IMConnection *conn = icp->im->connection; + IMPSAttributes *ap; + int name_len; + + TRACE(("imlib:getFontSet()\n")); + + if ((ap = getPSPtr(icp, nest)) == NULL) { + IMCancelRequest(conn, offset); + unnestedError(icp); + return -1; + } + + if (!(ap->set_mask & ATTR_MASK_FONT_SET)) { + fillPSDefault(icp, nest, (unsigned long)ATTR_MASK_FONT_SET); + } + + name_len = strlen(ap->font_set); + + IMPutC16(conn, id); /* attribute ID */ + + IMPutC16(conn, (unsigned int)name_len); /* value length */ + IMPutString(conn, ap->font_set, name_len); + IMPutPad(conn); + return 0; +} + +/* ARGSUSED */ +static int +getLineSpace(icp, id, nest, offset, data, len) +IMIC *icp; +unsigned int id; +int nest; +int offset; +char *data; +int len; +{ + IMConnection *conn = icp->im->connection; + IMPSAttributes *ap; + + TRACE(("imlib:getLineSpace()\n")); + + if ((ap = getPSPtr(icp, nest)) == NULL) { + IMCancelRequest(conn, offset); + unnestedError(icp); + return -1; + } + + if (!(ap->set_mask & ATTR_MASK_LINESPACE)) { + fillPSDefault(icp, nest, (unsigned long)ATTR_MASK_LINESPACE); + } + + IMPutC16(conn, id); /* attribute ID */ + IMPutC16(conn, 4); /* value length */ + IMPutC32(conn, (unsigned long)ap->line_space); + return 0; +} + +/* ARGSUSED */ +static int +getCursor(icp, id, nest, offset, data, len) +IMIC *icp; +unsigned int id; +int nest; +int offset; +char *data; +int len; +{ + IMConnection *conn = icp->im->connection; + IMPSAttributes *ap; + + TRACE(("imlib:getCursor()\n")); + + if ((ap = getPSPtr(icp, nest)) == NULL) { + IMCancelRequest(conn, offset); + unnestedError(icp); + return -1; + } + + if (!(ap->set_mask & ATTR_MASK_CURSOR)) { + fillPSDefault(icp, nest, (unsigned long)ATTR_MASK_CURSOR); + } + + IMPutC16(conn, id); /* attribute ID */ + IMPutC16(conn, 4); /* value length */ + IMPutC32(conn, ap->cursor); + return 0; +} + +/* ARGSUSED */ +static int +getPreeditState(icp, id, nest, offset, data, len) +IMIC *icp; +unsigned int id; +int nest; +int offset; +char *data; +int len; +{ + IMConnection *conn = icp->im->connection; + + TRACE(("imlib:getPreeditState()\n")); + + if (nest == NEST_STATUS) { + IMCancelRequest(conn, offset); + IMSendError(conn, IMBadSomething, icp->im->id, icp->id, + "preedit state isn't a status attribute"); + return -1; + } + + IMPutC16(conn, id); /* attribute ID */ + IMPutC16(conn, 4); /* value length */ + IMPutC32(conn, + (icp->state & IC_CONVERTING) ? + XIMPreeditEnable : XIMPreeditDisable); + return 0; +} + +/* ARGSUSED */ +static int +getResetState(icp, id, nest, offset, data, len) +IMIC *icp; +unsigned int id; +int nest; +int offset; +char *data; +int len; +{ + IMConnection *conn = icp->im->connection; + + TRACE(("imlib:getResetState()\n")); + + IMPutC16(conn, id); /* attribute ID */ + IMPutC16(conn, 4); /* value length */ + IMPutC32(conn, icp->common_attr.reset_state); + return 0; +} + +static void +changeFonts(icp, preedit) +IMIC *icp; +int preedit; +{ + FontBank bank = IMFontBank(icp->im); + String font_set; + XFontStruct ***fontsp; + int *num_fontsp; + + TRACE(("imlib:changeFonts()\n")); + + if (preedit) { + font_set = icp->preedit_attr.font_set; + fontsp = &icp->fonts; + num_fontsp = &icp->num_fonts; + } else { + font_set = icp->status_attr.font_set; + fontsp = &icp->status_fonts; + num_fontsp = &icp->num_status_fonts; + } + + /* + * Unload previous fonts. + */ + if (*num_fontsp > 0) { + FontBankFreeFonts(bank, *fontsp, *num_fontsp); + } + + /* + * Load new fonts and store them in the IC structure. + */ + *fontsp = FontBankGet(bank, font_set, num_fontsp); +} + + +/* + * Functions computing default attribute values + */ + +static void +fillCommonDefault(icp, mask) +IMIC *icp; +unsigned long mask; +{ + IMCommonAttributes *ap = &icp->common_attr; + + TRACE(("imlib:fillCommonDefault()\n")); + + /* + * Don't bother with the attributes which have been set. + */ + mask &= ~ap->set_mask; + + /* + * The attributes that have default value are FocusWindow, + * PreeditState and ResetState. + */ + if (mask & ATTR_MASK_FOCUS) { + /* if ClientWindow is not set... no way */ + if (mask & ATTR_MASK_CLIENT) { + ap->focus = ap->client; + ap->set_mask |= ATTR_MASK_FOCUS; + icp->focus_profile = icp->client_profile; + TRACE(("\tdefault focus window: %08lx\n", ap->focus)); + } + } + if (mask & ATTR_MASK_PREEDIT_STATE) { + /* unless the client specified, we should start with disabled state. */ + ap->set_mask |= ATTR_MASK_PREEDIT_STATE; + ap->reset_state = XIMPreeditDisable; + } + if (mask & ATTR_MASK_RESET_STATE) { + /* the default reset state must be the initial state. */ + ap->set_mask |= ATTR_MASK_RESET_STATE; + ap->reset_state = XIMInitialState; + } +} + +static int +getNaturalLineSpace(icp, preedit) +IMIC *icp; +int preedit; +{ + XFontStruct **fonts; + int num_fonts; + int max_ascent = 0, max_descent = 0; + int i; + + changeFonts(icp, preedit); + if (preedit) { + fonts = icp->fonts; + num_fonts = icp->num_fonts; + } else { + fonts = icp->status_fonts; + num_fonts = icp->num_status_fonts; + } + + for (i = 0; i < num_fonts; i++) { + XFontStruct *font = fonts[i]; + if (max_ascent < font->ascent) max_ascent = font->ascent; + if (max_descent < font->descent) max_descent = font->descent; + } + + if (max_ascent + max_descent < MIN_LINE_SPACING) { + return MIN_LINE_SPACING; + } else { + return max_ascent + max_descent; + } +} + +static void +fillPSDefault(icp, type, mask) +IMIC *icp; +int type; /* NEST_PREEDIT or NEST_STATUS */ +unsigned long mask; +{ + IMPSAttributes *ap; + IMConnection *conn = icp->im->connection; + Widget pw = conn->proto_widget; + int preedit; +#ifdef DEBUG + char *typename = (type == NEST_PREEDIT) ? "preedit" : "status"; +#endif + + TRACE(("imlib:fillPSDefault(%s)\n", typename)); + + preedit = (type == NEST_PREEDIT); + ap = preedit ? &icp->preedit_attr : &icp->status_attr; + + /* + * Don't bother with the attributes which have been set. + * But area_needed needs to be computed each time (to get + * correct X and Y coordinates). + */ + mask &= ~ap->set_mask | ATTR_MASK_AREA_NEEDED; + + if (mask & ATTR_MASK_AREA) { + computeAreaForQuery(icp); + ap->set_mask |= ATTR_MASK_AREA; + DDPRINT(5, ("\tdefault %s area: %d,%d,%d,%d\n", typename, + ap->area.x, ap->area.y, ap->area.width, ap->area.height)); + } + if (mask & ATTR_MASK_FOREGROUND) { + ap->foreground = IMDefaultForeground(pw); + ap->set_mask |= ATTR_MASK_FOREGROUND; + DDPRINT(5, ("\tdefault %s foreground: %ld\n", + typename, ap->foreground)); + } + if (mask & ATTR_MASK_BACKGROUND) { + ap->background = IMDefaultBackground(pw); + ap->set_mask |= ATTR_MASK_BACKGROUND; + DDPRINT(5, ("\tdefault %s background: %ld\n", + typename, ap->background)); + } + if (mask & ATTR_MASK_COLORMAP) { + ap->colormap = pw->core.colormap; + ap->set_mask |= ATTR_MASK_COLORMAP; + DDPRINT(5, ("\tdefault %s colormap: %08lx\n", + typename, ap->colormap)); + } + if (mask & ATTR_MASK_STD_COLORMAP) { + /* you can't fill default. what to do? */ + DDPRINT(5, ("\tdefault %s std colormap: N/A\n", typename)); + } + if (mask & ATTR_MASK_BG_PIXMAP) { + ap->bg_pixmap = None; + ap->set_mask |= ATTR_MASK_BG_PIXMAP; + DDPRINT(5, ("\tdefault %s background pixmap: None\n", typename)); + } + if (mask & ATTR_MASK_LINESPACE) { + if (!(ap->set_mask & ATTR_MASK_FONT_SET)) { + fillPSDefault(icp, type, (unsigned long)ATTR_MASK_FONT_SET); + } + ap->line_space = getNaturalLineSpace(icp, type == NEST_PREEDIT); + ap->set_mask |= ATTR_MASK_LINESPACE; + DDPRINT(5, ("\tdefault line space: %d\n", ap->line_space)); + } + if (mask & ATTR_MASK_CURSOR) { + ap->cursor = None; + ap->set_mask |= ATTR_MASK_CURSOR; + DDPRINT(5, ("\tdefault %s cursor: None\n", typename)); + } + if (mask & ATTR_MASK_AREA_NEEDED) { + computeAreaNeeded(icp); + DDPRINT(5, ("\t%s area_needed: %d,%d,%d,%d\n", typename, + ap->area_needed.x, ap->area_needed.y, + ap->area_needed.width, ap->area_needed.height)); + } + if (mask & ATTR_MASK_FONT_SET) { + ap->font_set = IMDefaultFontSet(icp->im); + ap->set_mask |= ATTR_MASK_FONT_SET; + DDPRINT(5, ("\tdefault %s fontset: %s\n", typename, ap->font_set)); + } + if (mask & ATTR_MASK_SPOT_LOCATION) { + ap->spot_location.x = ap->spot_location.y = 0; + ap->set_mask |= ATTR_MASK_SPOT_LOCATION; + DDPRINT(5, ("\tdefault spot location: %d, %d\n", + ap->spot_location.x, ap->spot_location.y)); + } +} + +/* + * Function validating attribute values + */ + +static int +validateCommonAttr(icp, checkonly) +IMIC *icp; +int checkonly; +{ + IMCommonAttributes *ap = &icp->common_attr; + IMConnection *conn = icp->im->connection; + unsigned long mask = ap->change_mask; + int ret = 0; + + TRACE(("imlib:validateCommonAttr()\n")); + + mask &= ap->set_mask; + +#define SENDERROR(code, msg) \ + if (!checkonly && ret == 0) { \ + IMSendError(conn, code, icp->im->id, icp->id, msg); ret = -1; \ + } + + if (mask & ATTR_MASK_INPUT_STYLE) { + XIMStyle xstyle = icp->common_attr.input_style; + InputStyle *isp = styles; + + while (isp->xim_style != 0) { + if (isp->xim_style == xstyle) break; + isp++; + } + if (isp->xim_style == 0) { + DPRINT(("unsupported input style\n")); + ap->set_mask &= ~ATTR_MASK_INPUT_STYLE; + SENDERROR(IMBadStyle, "unsupported input style"); + } else { + icp->style = isp->conversion_style; + } + } + if (mask & ATTR_MASK_CLIENT) { + if (!validateClientWindow(icp)) { + DPRINT(("invalid client window ID\n")); + ap->set_mask &= ~ATTR_MASK_CLIENT; + SENDERROR(IMBadClientWindow, "invalid client window ID"); + } + } + if (mask & ATTR_MASK_FOCUS) { + if (!validateFocusWindow(icp)) { + DPRINT(("invalid focus window ID\n")); + ap->set_mask &= ~ATTR_MASK_FOCUS; + SENDERROR(IMBadFocusWindow, "invalid focus window ID"); + } + } + if (mask & ATTR_MASK_PREEDIT_STATE) { + unsigned long preedit_state = ap->preedit_state; + + if (preedit_state != XIMPreeditEnable && + preedit_state != XIMPreeditDisable) { + DPRINT(("invalid preedit state\n")); + ap->set_mask &= ~ATTR_MASK_PREEDIT_STATE; + SENDERROR(IMBadSomething, "invalid preedit state"); + } + } + if (mask & ATTR_MASK_RESET_STATE) { + unsigned long reset_state = ap->reset_state; + + if (reset_state != XIMInitialState && + reset_state != XIMPreserveState) { + /* + * Xlib document says invalid values should be interpreted as + * XIMInitialState. + */ + DPRINT(("invalid reset state -- forcing initial state\n")); + ap->reset_state = XIMInitialState; + } + } + + return ret; +#undef SENDERROR +} + +static int +validatePSAttr(icp, type, checkonly) +IMIC *icp; +int type; +int checkonly; +{ + /* + * Check validity of preedit/status attribute values. + * 'type' is either NEST_PREEDIT or NEST_STATUS, indicating + * whether preedit or status attributes are to be checked. + * 'mask' is the attribute mask to be checked. + * If all the attributes are valid, this function return 0. + * Otherwise it issues an error message for the first invalid + * value detected, and returns -1. + */ + IMPSAttributes *ap; + IMConnection *conn = icp->im->connection; + unsigned long mask; + int preedit; + int ret = 0; + + TRACE(("imlib:validatePSAttr()\n")); + + preedit = (type == NEST_PREEDIT); + ap = preedit ? &icp->preedit_attr : &icp->status_attr; + + /* do not check unset attributes */ + mask = ap->change_mask & ap->set_mask; + +#define SENDERROR(code, msg) \ + if (!checkonly && ret == 0) { \ + IMSendError(conn, code, icp->im->id, icp->id, msg); ret = -1; \ + } + + if (mask & ATTR_MASK_AREA) { + if (ap->area.width == 0 || ap->area.height == 0) { + ap->set_mask &= ~ATTR_MASK_AREA; + DPRINT(("zero area width/height\n")); + SENDERROR(IMBadArea, "invalid area width/height"); + } + } + +#ifdef notdef + if (mask & ATTR_MASK_COLORMAP) { + } + + if (mask & ATTR_MASK_BG_PIXMAP) { + } +#endif + + if (mask & ATTR_MASK_LINESPACE) { + if (ap->line_space < MIN_LINE_SPACING) { + ap->set_mask &= ~ATTR_MASK_LINESPACE; + /* + * we don't send error message in this case, because + * there exist some applications which send invalid line + * spacing and we don't want to break them. + */ + DPRINT(("line space too small %d\n", ap->line_space)); + } + } + +#ifdef notdef + if (mask & ATTR_MASK_CURSOR) { + /* How should we check it? */ + } +#endif + + if (mask & ATTR_MASK_AREA_NEEDED) { + } +#ifdef notdef + if (mask & ATTR_MASK_FONT_SET) { + } + if (mask & ATTR_MASK_SPOT_LOCATION) { + } +#endif + + return ret; +#undef SENDERROR +} + + +/* + * Functions to extract necessary attributes and make conversion argument + */ + +static void +changeConversionAttributes(icp) +IMIC *icp; +{ + unsigned long mask; + ConversionAttributes attr; + + TRACE(("imlib:changeConversionAttributes()\n")); + mask = IMMakeConvAttributes(icp, &attr); + CControlChangeAttributes(icp->conversion, mask, &attr); +} + +static void +computeAreaNeeded(icp) +IMIC *icp; +{ + IMPSAttributes *pattr = &icp->preedit_attr; + IMPSAttributes *sattr = &icp->status_attr; + IMWindowProfile *cpr = &icp->client_profile; + int width, height; + int min_width, min_height; + int default_status_width; + int font_height; + + TRACE(("computeAreaNeeded()\n")); + + if (icp->style == IMSTYLE_SEPARATE) return; + + /* + * Get the current dimension of the client window. + */ + (void)validateClientWindow(icp); + + /* + * Compute the dimensions of the status region. + */ + fillPSDefault(icp, NEST_STATUS, (unsigned long)ATTR_MASK_LINESPACE); + font_height = sattr->line_space + 2; + width = height = 0; + if (sattr->set_mask & ATTR_MASK_AREA_NEEDED) { + width = sattr->area_needed.width; + height = sattr->area_needed.height; + TRACE(("\tstatus areaNeeded was: (%d,%d)\n", width, height)); + } + + min_width = font_height * 3; + min_height = font_height; + if (min_width < MIN_AREA_WIDTH) min_width = MIN_AREA_WIDTH; + if (min_height < MIN_AREA_HEIGHT) min_height = MIN_AREA_HEIGHT; + + if (width == 0) { + default_status_width = + IMStatusWidth(icp->im->connection->proto_widget); + if (default_status_width > 0) { + width = default_status_width; + } else { + width = cpr->width / 5; /* wild guess */ + } + } + + if (width < min_width) width = min_width; + if (height < min_height) height = min_height; + + sattr->area_needed.x = 0; + sattr->area_needed.y = cpr->height - height; + sattr->area_needed.width = width; + sattr->area_needed.height = height; + TRACE(("\tstatus areaNeeded is now: (%d, %d, %d, %d)\n", + sattr->area_needed.x, sattr->area_needed.y, width, height)); + + /* + * Compute the dimensions of the pre-edit region. + */ + if (icp->style != IMSTYLE_OFF_THE_SPOT) return; + + fillPSDefault(icp, NEST_PREEDIT, (unsigned long)ATTR_MASK_LINESPACE); + font_height = pattr->line_space + 2; + width = height = 0; + if (pattr->set_mask & ATTR_MASK_AREA_NEEDED) { + width = pattr->area_needed.width; + height = pattr->area_needed.height; + TRACE(("\tpreedit areaNeeded was: (%d,%d)\n", + width, height)); + } + + min_width = (cpr->width - sattr->area_needed.width) / 2; + min_height = font_height; + if (min_width < MIN_AREA_WIDTH) min_width = MIN_AREA_WIDTH; + if (min_height < MIN_AREA_HEIGHT) min_height = MIN_AREA_HEIGHT; + + if (width < min_width) width = min_width; + if (height < min_height) height = min_height; + + pattr->area_needed.x = sattr->area_needed.width; + pattr->area_needed.y = cpr->height - height; + pattr->area_needed.width = width; + pattr->area_needed.height = height; + TRACE(("\tpreedit areaNeeded is now: (%d, %d, %d, %d)\n", + pattr->area_needed.x, pattr->area_needed.y, width, height)); +} + +static void +computeAreaForQuery(icp) +IMIC *icp; +{ + IMPSAttributes *pattr = &icp->preedit_attr; + IMPSAttributes *sattr = &icp->status_attr; + + TRACE(("computeAreaForQuery()\n")); + + if (icp->style == IMSTYLE_SEPARATE) return; + + computeAreaNeeded(icp); + + if (!(pattr->set_mask & ATTR_MASK_AREA)) { + if (icp->style == IMSTYLE_OVER_THE_SPOT) { + IMWindowProfile *fpr = &icp->focus_profile; + + pattr->area.x = 0; + pattr->area.y = 0; + pattr->area.width = fpr->width; + pattr->area.height = fpr->height; + } else { /* IMSTYLE_OFF_THE_SPOT */ + pattr->area = pattr->area_needed; + } + } + + if (!(sattr->set_mask & ATTR_MASK_AREA)) { + sattr->area = sattr->area_needed; + } +} + + +/* + * Public functions + */ + +/*- IMPutIMAttrList: write list of supported IM attributes to output buffer -*/ +void +IMPutIMAttrList(imp) +IMIM *imp; +{ + IMConnection *conn = imp->connection; + IMAttribute *iap; + int offset, list_start, list_end; + int n; + + TRACE(("IMPutIMAttrList()\n")); + + offset = IMWritePos(conn); + IMPutC16(conn, 0); /* dummy. overwritten afterwards */ + + list_start = IMWritePos(conn); + for (n = 0, iap = imAttributes; n < numImAttributes; n++, iap++) { + int length; + + IMPutC16(conn, (unsigned int)n); + IMPutC16(conn, (unsigned int)iap->type); + length = strlen(iap->name); + IMPutC16(conn, (unsigned int)length); + IMPutString(conn, iap->name, length); + IMPutPad(conn); + } + list_end = IMWritePos(conn); + IMRewriteC16(conn, offset, (unsigned int)(list_end - list_start)); +} + +/*- IMPutICAttrList: write list of supported IC attributes to output buffer -*/ +void +IMPutICAttrList(imp) +IMIM *imp; +{ + IMConnection *conn = imp->connection; + ICAttribute *iap; + int offset, list_start, list_end; + int n; + + TRACE(("IMPutICAttrList()\n")); + + offset = IMWritePos(conn); + IMPutC16(conn, 0); /* dummy. overwritten afterwards */ + IMPutC16(conn, 0); /* unused */ + + list_start = IMWritePos(conn); + for (n = 0, iap = icAttributes; n < numIcAttributes; n++, iap++) { + int length; + + IMPutC16(conn, (unsigned int)n); + IMPutC16(conn, (unsigned int)iap->type); + length = strlen(iap->name); + IMPutC16(conn, (unsigned int)length); + IMPutString(conn, iap->name, length); + IMPutPad(conn); + } + list_end = IMWritePos(conn); + IMRewriteC16(conn, offset, (unsigned int)(list_end - list_start)); +} + +/* ARGSUSED */ +int +IMSetIMValues(imp, data, len, major) +IMIM *imp; +char *data; +int len; +int major; +{ + TRACE(("IMSetIMValues(): not supported yet\n")); + /* not supported yet */ + + IMSendError(imp->connection, IMBadProtocol, imp->id, 0, + "this protocol is not supported yet"); + return -1; +} + +int +IMGetIMValues(imp, data, len, offset) +IMIM *imp; +char *data; +int len; +int offset; /* request offset */ +{ + IMConnection *conn = imp->connection; + int pos, list_start, list_end; + + TRACE(("IMGetIMValues()\n")); + + pos = IMWritePos(conn); + IMPutC16(conn, 0); /* length of the list. to be overwritten. */ + + list_start = IMWritePos(conn); + + if (getIMValues(imp, data, len, offset) < 0) return -1; + + list_end = IMWritePos(conn); + IMRewriteC16(conn, pos, (unsigned int)(list_end - list_start)); + return 0; +} + +int +IMSetICValues(icp, data, len, major) +IMIC *icp; +char *data; +int len; +int major; +{ + int r1, r2, r3; + + TRACE(("IMSetICValues()\n")); + + /* clear change mask */ + icp->common_attr.change_mask = 0; + icp->preedit_attr.change_mask = 0; + icp->status_attr.change_mask = 0; + + /* read the specified data and set attributes */ + r1 = setICValues(icp, data, len, 0, + (major == XIM_CREATE_IC) ? OP_C : OP_S); + + /* validate attributes */ + r2 = IMValidateICAttributes(icp, (r1 < 0)); + + /* + * If the operation is CREATE_IC, input style attribute must be set. + */ + if (major == XIM_CREATE_IC && + !(icp->common_attr.set_mask & ATTR_MASK_INPUT_STYLE) && + r1 == 0 && r2 == 0) { + DPRINT(("input style not specified by CreateIC\n")); + IMSendError(icp->im->connection, IMBadSomething, icp->im->id, icp->id, + "inputStyle resource must be set"); + r3 = -1; + } else { + r3 = 0; + } + + if (r1 == 0 && r2 == 0) { + /* if conversion is taking place... */ + if (icp->state & IC_CONVERTING) { + changeConversionAttributes(icp); + } + + /* if preedit state is specified... */ + if (icp->common_attr.change_mask & ATTR_MASK_PREEDIT_STATE) { + TRACE(("changing preedit state to %s\n", + (icp->common_attr.preedit_state == XIMPreeditEnable) ? + "enabled" : "disabled")); + if (icp->common_attr.preedit_state == XIMPreeditEnable) { + IMStartConversion(icp); + } else { + IMStopConversion(icp); + } + } + } + + return (r1 < 0 || r2 < 0 || r3 < 0) ? -1 : 0; +} + +int +IMGetICValues(icp, data, len, offset) +IMIC *icp; +char *data; +int len; +int offset; /* request offset */ +{ + int nested_separator; + int r; + IMConnection *conn = icp->im->connection; + int pos, list_start, list_end; + + TRACE(("IMGetICValues()\n")); + + pos = IMWritePos(conn); + IMPutC16(conn, 0); /* dummy. overwritten afterwards */ + IMPutC16(conn, 0); /* unused */ + + list_start = IMWritePos(conn); + + r = getICValues(icp, data, len, NEST_NONE, offset, &nested_separator); + if (r < 0) return -1; + + list_end = IMWritePos(conn); + IMRewriteC16(conn, pos, (unsigned int)(list_end - list_start)); + + if (nested_separator) { + /* + * There must have been some unbalanced NestedListSeparator. + */ + DPRINT(("getICvalues: unmatched separator\n")); + IMCancelRequest(icp->im->connection, offset); + IMSendError(icp->im->connection, IMBadSomething, icp->im->id, icp->id, + "corrupted nested list"); + return -1; + } + return 0; +} + +void +IMFillDefault(icp, common_mask, preedit_mask, status_mask) +IMIC *icp; +unsigned long common_mask; +unsigned long preedit_mask; +unsigned long status_mask; +{ + TRACE(("IMFillDefault()\n")); + + if (common_mask != 0) fillCommonDefault(icp, common_mask); + if (preedit_mask != 0) fillPSDefault(icp, NEST_PREEDIT, preedit_mask); + if (status_mask != 0) fillPSDefault(icp, NEST_STATUS, status_mask); +} + +int +IMValidateWindow(dpy, win, profilep) +Display *dpy; +Window win; +IMWindowProfile *profilep; +{ + Window root; + int x, y; + unsigned int width, height, border, depth; + XAEHandle h; + int s; + + TRACE(("IMValidateWindow(win: %08lx)\n", win)); + + h = XAESetIgnoreErrors(dpy); + s = XGetGeometry(dpy, win, &root, &x, &y, + &width, &height, &border, &depth); + XAEUnset(h); + + if (profilep != NULL && s) { + profilep->width = width; + profilep->height = width; + profilep->root = root; + } + return s; +} + +int +IMValidateICAttributes(icp, checkonly) +IMIC *icp; +int checkonly; +{ + int error_occured; + int r; + + TRACE(("IMValidateICAttributes()\n")); + + /* + * Be careful not to send multiple error messages. + */ + + error_occured = 0; + + r = validateCommonAttr(icp, checkonly); + if (r < 0) error_occured = 1; + + r = validatePSAttr(icp, NEST_PREEDIT, (checkonly && error_occured)); + if (r < 0) error_occured = 1; + + r = validatePSAttr(icp, NEST_STATUS, (checkonly && error_occured)); + if (r < 0) error_occured = 1; + + return error_occured ? -1 : 0; +} + +void +IMFreeICAttributes(icp) +IMIC *icp; +{ + IMPSAttributes *pattr = &icp->preedit_attr; + IMPSAttributes *sattr = &icp->status_attr; + FontBank bank = IMFontBank(icp->im); + + TRACE(("IMFreeICAttributes()\n")); + + if (pattr->set_mask & ATTR_MASK_FONT_SET) XtFree(pattr->font_set); + if (sattr->set_mask & ATTR_MASK_FONT_SET) XtFree(sattr->font_set); + + if (icp->num_fonts > 0) { + FontBankFreeFonts(bank, icp->fonts, icp->num_fonts); + } + if (icp->num_status_fonts > 0) { + FontBankFreeFonts(bank, icp->status_fonts, icp->num_status_fonts); + } +} + +unsigned long +IMMakeConvAttributes(icp, attr) +IMIC *icp; +ConversionAttributes *attr; +{ + IMCommonAttributes *cattr; + IMPSAttributes *pattr, *sattr; + unsigned long cmask; /* changed attributes */ + unsigned long mask; /* attributes to be set */ + + TRACE(("IMMakeConvAttributes()\n")); + mask = 0L; + + cattr = &icp->common_attr; + pattr = &icp->preedit_attr; + sattr = &icp->status_attr; + + /* + * Check changes of common attributes. + */ + cmask = cattr->change_mask; + + /* focus window */ + if (cmask & ATTR_MASK_FOCUS) { + attr->focuswindow = cattr->focus; + mask |= CAFocusWindow; + } + + /* + * Check changes of preedit attributes. + */ + cmask = pattr->change_mask; + + /* client area */ + if (cmask & ATTR_MASK_AREA) { + attr->clientarea.x = pattr->area.x; + attr->clientarea.y = pattr->area.y; + attr->clientarea.width = pattr->area.width; + attr->clientarea.height = pattr->area.height; + mask |= CAClientArea; + } + + /* foreground/background */ + if (cmask & ATTR_MASK_FOREGROUND) { + attr->foreground = pattr->foreground; + mask |= CAColor; + } + if (cmask & ATTR_MASK_BACKGROUND) { + attr->background = pattr->background; + mask |= CAColor; + } + + /* colormap */ + if (cmask & ATTR_MASK_COLORMAP) { + attr->colormap = pattr->colormap; + mask |= CAColormap; + } + + /* background pixmap */ + if (cmask & ATTR_MASK_BG_PIXMAP) { + attr->background_pixmap = pattr->bg_pixmap; + mask |= CABackgroundPixmap; + } + + /* line spacing */ + if (cmask & ATTR_MASK_LINESPACE) { + attr->linespacing = pattr->line_space; + mask |= CALineSpacing; + } + + /* cursor */ + if (cmask & ATTR_MASK_CURSOR) { + attr->cursor = pattr->cursor; + mask |= CACursor; + } + + /* font */ + if (cmask & ATTR_MASK_FONT_SET) { + changeFonts(icp, 1); + attr->fonts = icp->fonts; + attr->num_fonts = icp->num_fonts; + mask |= CAFonts; + } + + /* spot location */ + if ((cmask & ATTR_MASK_SPOT_LOCATION) && + icp->style == IMSTYLE_OVER_THE_SPOT) { + attr->spotx = pattr->spot_location.x; + attr->spoty = pattr->spot_location.y; + mask |= CASpotLocation; + } + + /* + * Check changes of status attributes. + */ + cmask = sattr->change_mask; + + /* status area */ + if (cmask & ATTR_MASK_AREA) { + attr->statusarea.x = sattr->area.x; + attr->statusarea.y = sattr->area.y; + attr->statusarea.width = sattr->area.width; + attr->statusarea.height = sattr->area.height; + mask |= CAStatusArea; + } + + /* font */ + if (cmask & ATTR_MASK_FONT_SET) { + changeFonts(icp, 0); + attr->status_fonts = icp->status_fonts; + attr->num_status_fonts = icp->num_status_fonts; + mask |= CAStatusFonts; + } + + return mask; +} + +void +IMMoveLocation(icp, x, y) +IMIC *icp; +int x; +int y; +{ + TRACE(("IMMoveLocation()\n")); + + icp->preedit_attr.spot_location.x = x; + icp->preedit_attr.spot_location.y = y; + icp->preedit_attr.set_mask |= ATTR_MASK_SPOT_LOCATION; + icp->preedit_attr.change_mask = ATTR_MASK_SPOT_LOCATION; + if (icp->state & IC_CONVERTING) { + changeConversionAttributes(icp); + } +} diff -r 000000000000 -r 92745d501b9a lib/imlib/imbuf.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/imlib/imbuf.c Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,152 @@ +#ifndef lint +static char *rcsid = "$Id: imbuf.c,v 1.7 1994/05/30 10:26:28 ishisone Exp $"; +#endif +/* + * Copyright (c) 1994 Software Research Associates, Inc. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Software Research Associates not be + * used in advertising or publicity pertaining to distribution of the + * software without specific, written prior permission. Software Research + * Associates makes no representations about the suitability of this software + * for any purpose. It is provided "as is" without express or implied + * warranty. + * + * Author: Makoto Ishisone, Software Research Associates, Inc., Japan + */ + +#include +#include +#include "imbuf.h" + +static void +allocIMBuf(ibp, len) +IMBuffer *ibp; +int len; +{ + int newsize; + + if (ibp->size >= len) return; + newsize = ibp->size * 2; + if (newsize < len) newsize = len; + if (ibp->buf == ibp->internal) { + ibp->buf = XtMalloc(newsize); + bcopy(ibp->internal, ibp->buf, ibp->size); + } else { + ibp->buf = XtRealloc(ibp->buf, newsize); + } + ibp->size = newsize; +} + +void +IMBufInit(ibp) +IMBuffer *ibp; +{ + ibp->buf = ibp->internal; + IMBufClear(ibp); +} + +void +IMBufClear(ibp) +IMBuffer *ibp; +{ + if (ibp->buf != NULL && ibp->buf != ibp->internal) XtFree(ibp->buf); + ibp->buf = ibp->internal; + ibp->size = sizeof(ibp->internal); + ibp->start = ibp->end = 0; +} + +void +IMBufAdd(ibp, data, len) +IMBuffer *ibp; +char *data; +int len; +{ + allocIMBuf(ibp, ibp->end + len); + (void)bcopy(data, ibp->buf + ibp->end, len); + ibp->end += len; +} + +void +IMBufOverwrite(ibp, offset, data, len) +IMBuffer *ibp; +int offset; +char *data; +int len; +{ + int dend; + + dend = ibp->start + offset + len; + allocIMBuf(ibp, dend); + (void)bcopy(data, ibp->buf + ibp->start + offset, len); + if (ibp->end < dend) ibp->end = dend; +} + +char * +IMBufAlloc(ibp, len) +IMBuffer *ibp; +int len; +{ + char *p; + + allocIMBuf(ibp, ibp->end + len); + p = ibp->buf + ibp->end; + ibp->end += len; + return p; +} + +void +IMBufDiscard(ibp, len) +IMBuffer *ibp; +int len; +{ + if (len > 0) { + /* discard top of the data */ + ibp->start += len; + } else { + /* discard end of the data */ + ibp->end += len; + } + if (ibp->start >= ibp->end) IMBufClear(ibp); +} + +void +IMBufDiscardNUL(ibp) +IMBuffer *ibp; +{ + while (ibp->start < ibp->end) { + if ((ibp->buf)[ibp->start] != 0) break; + ibp->start++; + } + if (ibp->start >= ibp->end) IMBufClear(ibp); +} + +void +IMBufCompact(ibp) +IMBuffer *ibp; +{ + + if (ibp->buf != ibp->internal) { + int length = IMBUFLEN(ibp); + + if (length <= sizeof(ibp->internal)) { + bcopy(ibp->buf + ibp->start, ibp->internal, length); + XtFree(ibp->buf); + ibp->buf = ibp->internal; + ibp->size = sizeof(ibp->internal); + } else { + bcopy(ibp->buf + ibp->start, ibp->buf, length); + } + ibp->start = 0; + ibp->end = length; + } else if (ibp->start != 0) { + int length = IMBUFLEN(ibp); + + bcopy(ibp->buf + ibp->start, ibp->buf, length); + ibp->start = 0; + ibp->end = length; + } +} diff -r 000000000000 -r 92745d501b9a lib/imlib/imbuf.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/imlib/imbuf.h Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,50 @@ +/* $Id: imbuf.h,v 1.4 1994/05/12 09:01:05 ishisone Exp $ */ +/* + * Copyright (c) 1994 Software Research Associates, Inc. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Software Research Associates not be + * used in advertising or publicity pertaining to distribution of the + * software without specific, written prior permission. Software Research + * Associates makes no representations about the suitability of this software + * for any purpose. It is provided "as is" without express or implied + * warranty. + * + * Author: Makoto Ishisone, Software Research Associates, Inc., Japan + */ + +#ifndef _imbuf_h +#define _imbuf_h + +#include "imprtype.h" + +/* + * IMBuffer -- variable length buffer + */ + +#define IMBUF_INT_SIZE 256 +typedef struct { + char *buf; /* pointer to the buffer */ + int size; /* size of the buffer */ + int start; /* start offset of the data */ + int end; /* end offset of the data */ + char internal[IMBUF_INT_SIZE]; /* internal data buffer */ +} IMBuffer; + +#define IMBUFLEN(ibp) ((ibp)->end - (ibp)->start) +#define IMBUFDATA(ibp) ((ibp)->buf + (ibp)->start) + +extern void IMBufInit _Pt_((IMBuffer *ibp)); +extern void IMBufClear _Pt_((IMBuffer *ibp)); +extern void IMBufAdd _Pt_((IMBuffer *ibp, char *data, int len)); +extern void IMBufOverwrite _Pt_((IMBuffer *ibp, int offset, + char *data, int len)); +extern char *IMBufAlloc _Pt_((IMBuffer *ibp, int len)); +extern void IMBufDiscard _Pt_((IMBuffer *ibp, int len)); +extern void IMBufDiscardNUL _Pt_((IMBuffer *ibp)); +extern void IMBufCompact _Pt_((IMBuffer *ibp)); + +#endif /* _imbuf_h */ diff -r 000000000000 -r 92745d501b9a lib/imlib/imconst.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/imlib/imconst.h Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,144 @@ +/* $Id: imconst.h,v 1.4 1994/06/02 05:01:17 ishisone Exp $ */ + +#ifndef _imconst_h +#define _imconst_h + +/* + * Constants defined by the prototol spec. + */ + +/* Protocol version number */ +#define XIM_MAJOR_PROTOCOL_VERSION 1 +#define XIM_MINOR_PROTOCOL_VERSION 0 + +/* Major code for the core requests */ +#define XIM_CONNECT 1 +#define XIM_CONNECT_REPLY 2 +#define XIM_DISCONNECT 3 +#define XIM_DISCONNECT_REPLY 4 +#define XIM_AUTH_REQUIRED 10 +#define XIM_AUTH_REPLY 11 +#define XIM_AUTH_NEXT 12 +#define XIM_AUTH_SETUP 13 +#define XIM_AUTH_NG 14 +#define XIM_ERROR 20 +#define XIM_OPEN 30 +#define XIM_OPEN_REPLY 31 +#define XIM_CLOSE 32 +#define XIM_CLOSE_REPLY 33 +#define XIM_REGISTER_TRIGGERKEYS 34 +#define XIM_TRIGGER_NOTIFY 35 +#define XIM_TRIGGER_NOTIFY_REPLY 36 +#define XIM_SET_EVENT_MASK 37 +#define XIM_ENCODING_NEGOTIATION 38 +#define XIM_ENCODING_NEGOTIATION_REPLY 39 +#define XIM_QUERY_EXTENSION 40 +#define XIM_QUERY_EXTENSION_REPLY 41 +#define XIM_SET_IM_VALUES 42 +#define XIM_SET_IM_VALUES_REPLY 43 +#define XIM_GET_IM_VALUES 44 +#define XIM_GET_IM_VALUES_REPLY 45 +#define XIM_CREATE_IC 50 +#define XIM_CREATE_IC_REPLY 51 +#define XIM_DESTROY_IC 52 +#define XIM_DESTROY_IC_REPLY 53 +#define XIM_SET_IC_VALUES 54 +#define XIM_SET_IC_VALUES_REPLY 55 +#define XIM_GET_IC_VALUES 56 +#define XIM_GET_IC_VALUES_REPLY 57 +#define XIM_SET_IC_FOCUS 58 +#define XIM_UNSET_IC_FOCUS 59 +#define XIM_FORWARD_EVENT 60 +#define XIM_SYNC 61 +#define XIM_SYNC_REPLY 62 +#define XIM_COMMIT 63 +#define XIM_RESET_IC 64 +#define XIM_RESET_IC_REPLY 65 +#define XIM_GEOMETRY 70 +#define XIM_STR_CONVERSION 71 +#define XIM_STR_CONVERSION_REPLY 72 +#define XIM_PREEDIT_START 73 +#define XIM_PREEDIT_START_REPLY 74 +#define XIM_PREEDIT_DRAW 75 +#define XIM_PREEDIT_CARET 76 +#define XIM_PREEDIT_CARET_REPLY 77 +#define XIM_PREEDIT_DONE 78 +#define XIM_STATUS_START 79 +#define XIM_STATUS_DRAW 80 +#define XIM_STATUS_DONE 81 +#define XIM_PREEDITSTATE 82 + +/* Data representation type */ +#define TYPE_SEPARATOR 0 +#define TYPE_CARD8 1 +#define TYPE_CARD16 2 +#define TYPE_CARD32 3 +#define TYPE_CHAR 4 +#define TYPE_WINDOW 5 +#define TYPE_XIM_STYLES 10 +#define TYPE_XRECTANGLE 11 +#define TYPE_XPOINT 12 +#define TYPE_XFONTSET 13 +#define TYPE_XIM_OPTIONS 14 +#define TYPE_XIM_HOT_KEY_TRIGGERS 15 +#define TYPE_XIM_HOT_KEY_STATE 16 +#define TYPE_XIM_STRING_CONVERSION 17 +#define TYPE_XIM_PREEDIT_STATE 18 +#define TYPE_XIM_RESET_STATE 19 +#define TYPE_XIM_RESET_RETURN 20 +#define TYPE_XIM_STRING_TEXT 21 +#define TYPE_NESTED_LIST 0x7fff + +/* Error code */ +#define IMBadAlloc 1 +#define IMBadStyle 2 +#define IMBadClientWindow 3 +#define IMBadFocusWindow 4 +#define IMBadArea 5 +#define IMBadSpotLocation 6 +#define IMBadColormap 7 +#define IMBadAtom 8 +#define IMBadPixel 9 +#define IMBadPixmap 10 +#define IMBadName 11 +#define IMBadCursor 12 +#define IMBadProtocol 13 +#define IMBadForeground 14 +#define IMBadBackground 15 +#define IMLocaleNotSupported 16 +#define IMBadSomething 999 + +/* common flag */ +#define XIM_FLAG_SYNCHRONOUS 1 + +/* XIM_FORWARD_EVENT flags */ +#define XIM_FLAG_REQUEST_FILTERING 2 +#define XIM_FLAG_REQUEST_LOOKUPSTRING 4 + +/* XIM_COMMIT flags */ +#define XIM_FLAG_X_LOOKUP_CHARS 2 +#define XIM_FLAG_X_LOOKUP_KEYSYM 4 + + +/* + * Constants defined by this implementaion + */ + +/* Major code for extension requests (> 128) */ +#define XIM_EXT_SET_EVENT_MASK 129 +#define XIM_EXT_FORWARD_KEYEVENT 130 +#define XIM_EXT_MOVE 131 + +/* Extension mask */ +#define XIM_EXT_SET_EVENT_MASK_MASK 1 +#define XIM_EXT_FORWARD_KEYEVENT_MASK 2 +#define XIM_EXT_MOVE_MASK 4 + + +/* Transport status code */ +#define TRANSPORT_OK 0 +#define TRANSPORT_EOF 1 +#define TRANSPORT_PARTIAL 2 +#define TRANSPORT_ERROR 3 + +#endif /* _imconst_h */ diff -r 000000000000 -r 92745d501b9a lib/imlib/imconv.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/imlib/imconv.c Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,1011 @@ +#ifndef lint +static char *rcsid = "$Id: imconv.c,v 1.25 2002/01/24 09:07:19 ishisone Exp $"; +#endif +/* + * Copyright (c) 1991, 1994 Software Research Associates, Inc. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Software Research Associates not be + * used in advertising or publicity pertaining to distribution of the + * software without specific, written prior permission. Software Research + * Associates makes no representations about the suitability of this software + * for any purpose. It is provided "as is" without express or implied + * warranty. + * + * Author: Makoto Ishisone, Software Research Associates, Inc., Japan + */ + +#define COMMIT_SYNC +#define STATUS_SYNC +#include "im.h" +#include "ConvMgr.h" +#include "OverConv.h" +#include "OffConv.h" +#include "OnConv.h" +#include "InputConv.h" + +static void fillDefaultAttributesForStartup _Pt_((IMIC *icp)); +static unsigned long makeConvAttributesForStartup _Pt_((IMIC *icp, + ConversionAttributes *attrp)); +static void commitString _Pt_((IMIC *icp, char *str, int len, int sync)); +static void fixCallback _Pt_((Widget w, XtPointer client_data, + XtPointer call_data)); +static void detachConverter _Pt_((IMIC *icp)); +static void endCallback _Pt_((Widget w, XtPointer client_data, + XtPointer call_data)); +static void unusedEventCallback _Pt_((Widget w, XtPointer client_data, + XtPointer call_data)); +static void preeditStartCallback _Pt_((Widget w, XtPointer client_data, + XtPointer call_data)); +static void preeditDoneCallback _Pt_((Widget w, XtPointer client_data, + XtPointer call_data)); +static void preeditDrawCallback _Pt_((Widget w, XtPointer client_data, + XtPointer call_data)); +static void preeditCaretCallback _Pt_((Widget w, XtPointer client_data, + XtPointer call_data)); +static void statusStartCallback _Pt_((Widget w, XtPointer client_data, + XtPointer call_data)); +static void statusDoneCallback _Pt_((Widget w, XtPointer client_data, + XtPointer call_data)); +static void statusDrawCallback _Pt_((Widget w, XtPointer client_data, + XtPointer call_data)); +static void preeditStart _Pt_((IMIC *icp)); +static void preeditDone _Pt_((IMIC *icp)); +static void preeditDraw _Pt_((IMIC *icp, OCCPreeditDrawArg *data)); +static void preeditCaret _Pt_((IMIC *icp, int caret)); +static void statusStart _Pt_((IMIC *icp)); +static void statusDone _Pt_((IMIC *icp)); +static void statusDraw _Pt_((IMIC *icp, OCCPreeditDrawArg *data)); +static void setEventMask _Pt_((IMIC *icp, unsigned long forward_mask, + unsigned long synchronous_mask)); + + +/*- fillDefaultAttributesForStartup: put default necessary for conv. start -*/ +static void +fillDefaultAttributesForStartup(icp) +IMIC *icp; +{ + unsigned long cmask, pmask, smask; + + cmask = ATTR_MASK_FOCUS | ATTR_MASK_PREEDIT_STATE | ATTR_MASK_RESET_STATE; + + switch (icp->style) { + case IMSTYLE_OVER_THE_SPOT: + pmask = ATTR_MASK_FOREGROUND | ATTR_MASK_BACKGROUND | + ATTR_MASK_FONT_SET; + smask = 0; + break; + case IMSTYLE_OFF_THE_SPOT: + pmask = ATTR_MASK_FOREGROUND | ATTR_MASK_BACKGROUND | + ATTR_MASK_FONT_SET | ATTR_MASK_AREA; + smask = ATTR_MASK_AREA; + break; + case IMSTYLE_ON_THE_SPOT: + pmask = 0; + smask = 0; + break; + default: + pmask = 0; + smask = 0; + } + IMFillDefault(icp, cmask, pmask, smask); +} + +/*- makeConvAttributesForStartup: get conv. attrs needed for startup -*/ +static unsigned long +makeConvAttributesForStartup(icp, attrp) +IMIC *icp; +ConversionAttributes *attrp; +{ + icp->common_attr.change_mask = icp->common_attr.set_mask; + icp->preedit_attr.change_mask = icp->preedit_attr.set_mask; + icp->status_attr.change_mask = icp->status_attr.set_mask; + return IMMakeConvAttributes(icp, attrp); +} + +/*- commitString: commmit converted string to client -*/ +static void +commitString(icp, str, len, sync) +IMIC *icp; +char *str; +int len; +int sync; +{ + int offset; + IMConnection *conn = icp->im->connection; + unsigned int flag; + + TRACE(("imlib:commitString()\n")); + + if (DDEBUG_CONDITION(5)) { + unsigned char *p = (unsigned char *)str; + int i; + + /* + * Dump commiting string. + */ + printf("* commit string:\n\t"); + for (i = 0; i < len; i++, p++) { + if (*p == '\033') { + printf("ESC "); + } else if (*p < ' ') { + printf("^%c ", *p + '@'); + } else if (*p == ' ') { + printf("sp "); + } else if (*p >= 0x7f) { + printf("%x ", *p); + } else { + printf("%c ", *p); + } + } + printf("\n"); + } + + flag = XIM_FLAG_X_LOOKUP_CHARS; + if (sync) flag |= XIM_FLAG_SYNCHRONOUS; + + offset = IMPutHeader(conn, XIM_COMMIT, 0, 0); + IMPutC16(conn, icp->im->id); + IMPutC16(conn, icp->id); + IMPutC16(conn, flag); + IMPutC16(conn, (unsigned int)len); + IMPutString(conn, str, len); + IMFinishRequest(conn, offset); +} + +/*- fixCallback: fix callback -*/ +/* ARGSUSED */ +static void +fixCallback(w, client_data, call_data) +Widget w; +XtPointer client_data; +XtPointer call_data; +{ + IMIC *icp = (IMIC *)client_data; + IMConnection *conn = icp->im->connection; + Widget proto = conn->proto_widget; + Atom ctext = IMCtextAtom(proto); + CCTextCallbackArg *arg = (CCTextCallbackArg *)call_data; + + TRACE(("imlib:fixCallback()\n")); + + /* check encoding and format */ + if (arg->encoding != ctext || arg->format != 8) { + /* + * since every conversion object must support COMPOUND_TEXT, + * it is a serious error. + */ + String params[2]; + Cardinal num_params; + WidgetClass ioc = icp->im->converter->input_object_class; + + params[0] = XtClass(proto)->core_class.class_name; + params[1] = ioc->core_class.class_name; + num_params = 2; + + XtAppErrorMsg(XtWidgetToApplicationContext(proto), + "encodingError", "convertedString", "WidgetError", + "%s: encoding of the converted string is not COMPOUND_STRING. check inputObject %s", + params, &num_params); + } + + /* + * Send fixed string via XIM_COMMIT message. + * Since kinput2 uses full-synchronous mode, + * synchronous flag must be turned off. + */ + commitString(icp, arg->text, arg->length, 0); + +#ifdef COMMIT_SYNC + /* + * Send XIM_SYNC_REPLY so that synchronize with clients here. + */ + if (icp->state & IC_FORWARDING) { + icp->state &= ~IC_FORWARDING; + IMSendRequestWithIC(conn, XIM_SYNC_REPLY, 0, icp); + } +#endif /* COMMIT_SYNC */ +} + +/*- detachConverter: detach conversion widget from specified IC -*/ +static void +detachConverter(icp) +IMIC *icp; +{ + Widget conv; + + TRACE(("imlib:detachConverter()\n")); + + conv = icp->conversion; + XtRemoveCallback(conv, XtNtextCallback, fixCallback, (XtPointer)icp); + XtRemoveCallback(conv, XtNendCallback, endCallback, (XtPointer)icp); + XtRemoveCallback(conv, XtNunusedEventCallback, unusedEventCallback, (XtPointer)icp); + if (icp->style == IMSTYLE_ON_THE_SPOT) { + XtRemoveCallback(conv, XtNpreeditStartCallback, preeditStartCallback, + (XtPointer)icp); + XtRemoveCallback(conv, XtNpreeditDoneCallback, preeditDoneCallback, + (XtPointer)icp); + XtRemoveCallback(conv, XtNpreeditDrawCallback, preeditDrawCallback, + (XtPointer)icp); + XtRemoveCallback(conv, XtNpreeditCaretCallback, preeditCaretCallback, + (XtPointer)icp); + XtRemoveCallback(conv, XtNstatusStartCallback, statusStartCallback, + (XtPointer)icp); + XtRemoveCallback(conv, XtNstatusDoneCallback, statusDoneCallback, + (XtPointer)icp); + XtRemoveCallback(conv, XtNstatusDrawCallback, statusDrawCallback, + (XtPointer)icp); + } + + CMReleaseConverter(XtParent(icp->im->connection->proto_widget), conv); + icp->conversion = NULL; +} + +/*- endCallback: conversion end callback -*/ +/* ARGSUSED */ +static void +endCallback(w, client_data, call_data) +Widget w; +XtPointer client_data; +XtPointer call_data; +{ + IMIC *icp = (IMIC *)client_data; + + TRACE(("imlib:endCallback()\n")); + + if (icp->state & IC_CONVERTING) { + detachConverter(icp); + icp->state &= ~IC_CONVERTING; + } +} + +/*- unusedEventCallback: unused key event callback -*/ +/* ARGSUSED */ +static void +unusedEventCallback(w, client_data, call_data) +Widget w; +XtPointer client_data; +XtPointer call_data; +{ + IMIC *icp = (IMIC *)client_data; + IMConnection *conn = icp->im->connection; + XKeyEvent *ev = (XKeyEvent *)call_data; + int offset; + + TRACE(("imlib:unusedEventCallback()\n")); + + if (icp->im->mask & XIM_EXT_FORWARD_KEYEVENT_MASK) { + offset = IMPutHeader(conn, XIM_EXT_FORWARD_KEYEVENT, 0, 0); + IMPutC16(conn, icp->im->id); + IMPutC16(conn, icp->id); + IMPutC16(conn, 0); + IMPutC16(conn, (unsigned int)(ev->serial & 0xffff)); + IMPutC8(conn, ev->type); + IMPutC8(conn, (int)ev->keycode); + IMPutC16(conn, (unsigned int)ev->state); + IMPutC32(conn, ev->time); + IMPutC32(conn, ev->window); + IMFinishRequest(conn, offset); + } else { + offset = IMPutHeader(conn, XIM_FORWARD_EVENT, 0, 0); + IMPutC16(conn, icp->im->id); + IMPutC16(conn, icp->id); + IMPutC16(conn, 0); /* ?? */ + IMPutC16(conn, (unsigned int)((ev->serial >> 16) & 0xffff)); + + IMPutC8(conn, ev->type); + IMPutC8(conn, (int)ev->keycode); + IMPutC16(conn, (unsigned int)(ev->serial & 0xffff)); + IMPutC32(conn, ev->time); + IMPutC32(conn, ev->root); + IMPutC32(conn, ev->window); + IMPutC32(conn, ev->subwindow); + IMPutI16(conn, ev->x_root); + IMPutI16(conn, ev->y_root); + IMPutI16(conn, ev->x); + IMPutI16(conn, ev->y); + IMPutC16(conn, ev->state); + IMPutC8(conn, ev->same_screen); + + IMFinishRequest(conn, offset); + } +} + +/*- preeditStartCallback: preedit start -*/ +/* ARGSUSED */ +static void +preeditStartCallback(w, client_data, call_data) +Widget w; +XtPointer client_data; +XtPointer call_data; +{ + IMIC *icp = (IMIC *)client_data; + + TRACE(("preeditStartCallback(icp=0x%lx)\n", icp)); + + if (!(icp->common_attr.input_style & XIMPreeditCallbacks)) + return; + + preeditStart(icp); +} + +/*- preeditDoneCallback: preedit done -*/ +/* ARGSUSED */ +static void +preeditDoneCallback(w, client_data, call_data) +Widget w; +XtPointer client_data; +XtPointer call_data; +{ + IMIC *icp = (IMIC *)client_data; + + TRACE(("preeditDoneCallback(icp=0x%lx)\n", icp)); + + if (!(icp->common_attr.input_style & XIMPreeditCallbacks)) + return; + + preeditDone(icp); +} + +/*- preeditDrawCallback: preedit draw -*/ +/* ARGSUSED */ +static void +preeditDrawCallback(w, client_data, call_data) +Widget w; +XtPointer client_data; +XtPointer call_data; +{ + IMIC *icp = (IMIC *)client_data; + OCCPreeditDrawArg *arg = (OCCPreeditDrawArg *)call_data; + IMConnection *conn = icp->im->connection; + Widget proto = conn->proto_widget; + Atom ctext = IMCtextAtom(proto); + + TRACE(("preeditDrawCallback(icp=0x%lx, length=%d)\n",icp,arg->text_length)); + + if (!(icp->common_attr.input_style & XIMPreeditCallbacks)) + return; + + /* check encoding and format */ + if (arg->encoding != ctext || arg->format != 8) { + /* + * since every conversion object must support COMPOUND_TEXT, + * it is a serious error. + */ + String params[2]; + Cardinal num_params; + WidgetClass ioc = icp->im->converter->input_object_class; + + params[0] = XtClass(proto)->core_class.class_name; + params[1] = ioc->core_class.class_name; + num_params = 2; + + XtAppErrorMsg(XtWidgetToApplicationContext(proto), + "encodingError", "preeditString", "WidgetError", + "%s: encoding of the preedit string is not COMPOUND_STRING. check inputObject %s", + params, &num_params); + } + + preeditDraw(icp, arg); +} + +/*- preeditCaretCallback: preedit caret -*/ +/* ARGSUSED */ +static void +preeditCaretCallback(w, client_data, call_data) +Widget w; +XtPointer client_data; +XtPointer call_data; +{ + IMIC *icp = (IMIC *)client_data; + int caret = (int)call_data; + + TRACE(("preeditCaretCallback(icp=0x%lx, caret=%d)\n", icp, caret)); + + if (!(icp->common_attr.input_style & XIMPreeditCallbacks)) + return; + + preeditCaret(icp, caret); +} + +/*- statusStartCallback: status start -*/ +/* ARGSUSED */ +static void +statusStartCallback(w, client_data, call_data) +Widget w; +XtPointer client_data; +XtPointer call_data; +{ + IMIC *icp = (IMIC *)client_data; + + TRACE(("statusStartCallback(icp=0x%lx)\n", icp)); + + if (!(icp->common_attr.input_style & XIMStatusCallbacks)) + return; + + statusStart(icp); +} + +/*- statusDoneCallback: status done -*/ +/* ARGSUSED */ +static void +statusDoneCallback(w, client_data, call_data) +Widget w; +XtPointer client_data; +XtPointer call_data; +{ + IMIC *icp = (IMIC *)client_data; + + TRACE(("statusDoneCallback(icp=0x%lx)\n", icp)); + + if (!(icp->common_attr.input_style & XIMStatusCallbacks)) + return; + + statusDone(icp); +} + +/*- statusDrawCallback: status draw -*/ +/* ARGSUSED */ +static void +statusDrawCallback(w, client_data, call_data) +Widget w; +XtPointer client_data; +XtPointer call_data; +{ + IMIC *icp = (IMIC *)client_data; + OCCPreeditDrawArg *arg = (OCCPreeditDrawArg *)call_data; + IMConnection *conn = icp->im->connection; + Widget proto = conn->proto_widget; + Atom ctext = IMCtextAtom(proto); + + TRACE(("statusDrawCallback(icp=0x%lx, length=%d)\n", icp,arg->text_length)); + + if (!(icp->common_attr.input_style & XIMStatusCallbacks)) + return; + + /* check encoding and format */ + if (arg->encoding != ctext || arg->format != 8) { + /* + * since every conversion object must support COMPOUND_TEXT, + * it is a serious error. + */ + String params[2]; + Cardinal num_params; + WidgetClass ioc = icp->im->converter->input_object_class; + + params[0] = XtClass(proto)->core_class.class_name; + params[1] = ioc->core_class.class_name; + num_params = 2; + + XtAppErrorMsg(XtWidgetToApplicationContext(proto), + "encodingError", "statusString", "WidgetError", + "%s: encoding of the status string is not COMPOUND_STRING. check inputObject %s", + params, &num_params); + } + + statusDraw(icp, arg); +} + +/*- preeditStart: do preedit start -*/ +static void +preeditStart(icp) +IMIC *icp; +{ + if (!(icp->state & IC_IN_PREEDIT)) { + int offset; + IMConnection *conn = icp->im->connection; + + TRACE(("imlib:preeditStart()\n")); + + offset = IMPutHeader(conn, XIM_PREEDIT_START, 0, 0); + IMPutC16(conn, icp->im->id); + IMPutC16(conn, icp->id); + IMFinishRequest(conn, offset); + icp->state |= IC_IN_PREEDIT; + } +} + +/*- preeditDone: do preedit done -*/ +static void +preeditDone(icp) +IMIC *icp; +{ + if (icp->state & IC_IN_PREEDIT) { + int offset; + IMConnection *conn = icp->im->connection; + + TRACE(("imlib:preeditDone()\n")); + + offset = IMPutHeader(conn, XIM_PREEDIT_DONE, 0, 0); + IMPutC16(conn, icp->im->id); + IMPutC16(conn, icp->id); + IMFinishRequest(conn, offset); + icp->state &= ~IC_IN_PREEDIT; + } +} + +/*- preeditDraw: do actual preedit draw -*/ +static void +preeditDraw(icp, data) +IMIC *icp; +OCCPreeditDrawArg *data; +{ + IMConnection *conn = icp->im->connection; + int offset; + unsigned int status; + XIMFeedback feedback; + int i; + + if (icp->state & IC_RESETTING) return; + + preeditStart(icp); + + TRACE(("imlib:preeditDraw()\n")); + + if (DDEBUG_CONDITION(5)) { + unsigned char *p = (unsigned char *)data->text; + + /* + * Dump preedit string. + */ + printf("* preedit string:\n\t"); + for (i = 0; i < data->text_length; i++, p++) { + if (*p == '\033') { + printf("ESC "); + } else if (*p < ' ') { + printf("^%c ", *p + '@'); + } else if (*p == ' ') { + printf("sp "); + } else if (*p >= 0x7f) { + printf("%x ", *p); + } else { + printf("%c ", *p); + } + } + printf("\n"); + } + + offset = IMPutHeader(conn, XIM_PREEDIT_DRAW, 0, 0); + IMPutC16(conn, icp->im->id); + IMPutC16(conn, icp->id); + IMPutC32(conn, data->caret); + IMPutC32(conn, data->chg_first); + IMPutC32(conn, data->chg_length); + status = 0; + if (data->text_length == 0) status |= 0x1; /* no string */ + if (data->attrs_length == 0) status |= 0x2; /* no feedback */ + IMPutC32(conn, status); + IMPutC16(conn, (unsigned int)data->text_length); + if (data->text_length > 0) { + IMPutString(conn, data->text, data->text_length); + } + IMPutPad(conn); + IMPutC16(conn, (unsigned int)(data->attrs_length * 4)); + IMPutC16(conn, 0L); /* unused */ + if (data->attrs_length > 0) { + for (i = 0; i < data->attrs_length; i++) { + IMPutC32(conn, data->attrs[i]); + } + } + IMFinishRequest(conn, offset); +} + +/*- preeditCaret: do actual preedit caret -*/ +static void +preeditCaret(icp, caret) +IMIC *icp; +int caret; +{ + IMConnection *conn = icp->im->connection; + int offset; + + if (icp->state & IC_RESETTING) return; + + preeditStart(icp); + + TRACE(("imlib:preeditCaret()\n")); + + offset = IMPutHeader(conn, XIM_PREEDIT_CARET, 0, 0); + IMPutC16(conn, icp->im->id); + IMPutC16(conn, icp->id); + IMPutC32(conn, caret); + IMPutC32(conn, (long)XIMAbsolutePosition); + IMPutC32(conn, (long)XIMPrimary); + IMFinishRequest(conn, offset); +} + +/*- statusStart: do status start -*/ +static void +statusStart(icp) +IMIC *icp; +{ + if (!(icp->state & IC_IN_STATUS)) { + int offset; + IMConnection *conn = icp->im->connection; + + TRACE(("imlib:statusStart()\n")); + + offset = IMPutHeader(conn, XIM_STATUS_START, 0, 0); + IMPutC16(conn, icp->im->id); + IMPutC16(conn, icp->id); + IMFinishRequest(conn, offset); + icp->state |= IC_IN_STATUS; +#ifdef STATUS_SYNC + IMFlush(conn); +#endif /* STATUS_SYNC */ + } +} + +/*- statusDone: do status done -*/ +static void +statusDone(icp) +IMIC *icp; +{ + if (icp->state & IC_IN_STATUS) { + int offset; + IMConnection *conn = icp->im->connection; + + TRACE(("imlib:statusDone()\n")); + + offset = IMPutHeader(conn, XIM_STATUS_DONE, 0, 0); + IMPutC16(conn, icp->im->id); + IMPutC16(conn, icp->id); + IMFinishRequest(conn, offset); + icp->state &= ~IC_IN_STATUS; +#ifdef STATUS_SYNC + IMFlush(conn); +#endif /* STATUS_SYNC */ + } +} + +/*- statusDraw: do actual status draw -*/ +static void +statusDraw(icp, data) +IMIC *icp; +OCCPreeditDrawArg *data; +{ + IMConnection *conn = icp->im->connection; + int offset; + unsigned int status; + + if (icp->state & IC_RESETTING) return; + + statusStart(icp); + + TRACE(("imlib:statusDraw()\n")); + + offset = IMPutHeader(conn, XIM_STATUS_DRAW, 0, 0); + IMPutC16(conn, icp->im->id); + IMPutC16(conn, icp->id); + IMPutC32(conn, 0L); /* text type */ + status = 0; + if (data->text_length == 0) status |= 0x1; /* no string */ + if (data->attrs_length == 0) status |= 0x2; /* no feedback */ + IMPutC32(conn, status); + IMPutC16(conn, (unsigned int)data->text_length); + if (data->text_length > 0) { + IMPutString(conn, data->text, data->text_length); + } + IMPutPad(conn); + IMPutC16(conn, (unsigned int)(data->attrs_length * 32)); + IMPutC16(conn, 0L); /* unused */ + if (data->attrs_length > 0) { + int i; + for (i = 0; i < data->attrs_length; i++) { + IMPutC32(conn, 0L); + } + } + IMFinishRequest(conn, offset); +#ifdef STATUS_SYNC + IMFlush(conn); +#endif /* STATUS_SYNC */ +} + +/*- setEventMask: put XIM_SET_EVENT_MASK request on the output stream -*/ +static void +setEventMask(icp, forward_mask, synchronous_mask) +IMIC *icp; +unsigned long forward_mask; +unsigned long synchronous_mask; +{ + IMConnection *conn = icp->im->connection; + + (void)IMPutHeader(conn, XIM_SET_EVENT_MASK, 0, 12); + IMPutC16(conn, icp->im->id); + IMPutC16(conn, icp->id); + IMPutC32(conn, forward_mask); + IMPutC32(conn, synchronous_mask); + IMSchedule(conn, SCHED_WRITE); +} + + +/* + * Public functions + */ + +int +IMStartConversion(icp) +IMIC *icp; +{ + IMIM *imp = icp->im; + Widget proto = imp->connection->proto_widget; + Widget converter; + WidgetClass class; + unsigned long attrmask; + ConversionAttributes attrs; + + TRACE(("IMStartConversion()\n")); + + if (icp->state & IC_CONVERTING) return 0; + + /* + * Check required attributes i.e. client window. + */ + if (!(icp->common_attr.set_mask & ATTR_MASK_CLIENT)) { + IMSendError(icp->im->connection, IMBadSomething, icp->im->id, icp->id, + "client window required"); + return -1; + } + + /* + * Fill in default values for unspecified attributes. + */ + fillDefaultAttributesForStartup(icp); + + /* + * Get appropriate converter class. + */ + if (icp->style == IMSTYLE_OVER_THE_SPOT) { + class = overTheSpotConversionWidgetClass; + } else if (icp->style == IMSTYLE_OFF_THE_SPOT) { + class = offTheSpotConversionWidgetClass; + } else if (icp->style == IMSTYLE_ON_THE_SPOT) { + class = onTheSpotConversionWidgetClass; + } else { + class = separateConversionWidgetClass; + } + + /* + * Compute conversion attributes to be passed to the converter. + */ + attrmask = makeConvAttributesForStartup(icp, &attrs); + + icp->state &= ~IC_RESETTING; + + /* + * Attach converter to this IC. + */ + converter = CMGetConverter(XtParent(proto), + icp->common_attr.client, class, + imp->converter->input_object_class, + imp->converter->display_object_class); + if (converter == NULL) { + IMSendError(imp->connection, IMBadSomething, imp->id, icp->id, + "can't attach converter to this IC"); + return -1; + } + icp->conversion = converter; + + /* + * Add callback functions. + */ + XtAddCallback(converter, XtNtextCallback, fixCallback, (XtPointer)icp); + XtAddCallback(converter, XtNendCallback, endCallback, (XtPointer)icp); + XtAddCallback(converter, XtNunusedEventCallback, unusedEventCallback, (XtPointer)icp); + if (icp->style == IMSTYLE_ON_THE_SPOT) { + XtAddCallback(converter, XtNpreeditStartCallback, preeditStartCallback, + (XtPointer)icp); + XtAddCallback(converter, XtNpreeditDoneCallback, preeditDoneCallback, + (XtPointer)icp); + XtAddCallback(converter, XtNpreeditDrawCallback, preeditDrawCallback, + (XtPointer)icp); + XtAddCallback(converter, XtNpreeditCaretCallback, preeditCaretCallback, + (XtPointer)icp); + XtAddCallback(converter, XtNstatusStartCallback, statusStartCallback, + (XtPointer)icp); + XtAddCallback(converter, XtNstatusDoneCallback, statusDoneCallback, + (XtPointer)icp); + XtAddCallback(converter, XtNstatusDrawCallback, statusDrawCallback, + (XtPointer)icp); + } + + /* + * Start conversion + */ + /* !!! if front-end method is used, ESMethodSelectFocus should be used */ + XtVaSetValues(converter, XtNeventSelectMethod, ESMethodNone, NULL); + CControlStartConversion(converter, icp->common_attr.client, + attrmask, &attrs); + + icp->state |= IC_CONVERTING; + + if (icp->common_attr.input_style & XIMPreeditCallbacks) + preeditStart(icp); + + /* + * Send XIM_SET_EVENT_MASK to let the client forward the key events. + */ + IMStartForwarding(icp); + + return 0; +} + +void +IMStopConversion(icp) +IMIC *icp; +{ + TRACE(("IMStopConversion()\n")); + + if (!(icp->state & IC_CONVERTING)) return; + + /* + * Terminate conversion. + */ + CControlEndConversion(icp->conversion); + + if (icp->common_attr.input_style & XIMPreeditCallbacks) + preeditDone(icp); + IMStatusDone(icp); + + /* + * Detach converter. + */ + detachConverter(icp); + + /* + * Stop forwarding key events unless this IC is being destroyed. + */ + if (!(icp->state & IC_DESTROYING)) { + IMStopForwarding(icp); + } + + icp->state &= ~IC_CONVERTING; +} + +int +IMResetIC(icp, preedit_strp) +IMIC *icp; +char **preedit_strp; +{ + int num_bytes = 0; + + TRACE(("IMResetIC()\n")); + + *preedit_strp = NULL; + + if (icp->state & IC_CONVERTING) { + /* + * get input object by asking conversion widget of XtNinputObject + * resource. however, it is not recommended since protocol widget + * should interact with input object only through conversion + * widget. + */ + CCTextCallbackArg arg; + Widget input_obj; + Widget w = icp->im->connection->proto_widget; + + XtVaGetValues(icp->conversion, XtNinputObject, &input_obj, NULL); + arg.encoding = IMCtextAtom(w); +#ifdef notdef + if (ICGetConvertedString(input_obj, &arg.encoding, &arg.format, + &arg.length, &arg.text) >= 0) { + num_bytes = arg.length; + *preedit_strp = (char *)arg.text; + } +#else + /* + * Canna seems to have some problem with ICGetConvertedString(). + * Use ICGetPreeditString instead. + */ + if (ICGetPreeditString(input_obj, 0, 0, &arg.encoding, &arg.format, + &arg.length, &arg.text) >= 0) { + num_bytes = arg.length; + *preedit_strp = (char *)arg.text; + } +#endif + ICClearConversion(input_obj); + TRACE(("\twas converting. %d bytes left\n", num_bytes)); + + if (icp->common_attr.reset_state == XIMInitialState) { + /* Force to end the conversion. */ + TRACE(("\tback to the initial state\n")); + IMStopConversion(icp); + } + } + return num_bytes; +} + +void +IMForwardEvent(icp, ev) +IMIC *icp; +XEvent *ev; +{ + TRACE(("IMForwardEvent()\n")); + + if (icp->conversion == NULL) return; + XtCallActionProc(icp->conversion, "to-inputobj", ev, + (String *)NULL, (Cardinal)0); +} + +/* ARGSUSED */ +void +IMSetFocus(icp) +IMIC *icp; +{ + TRACE(("IMSetFocus(ic%d)\n", icp->id)); + if (icp->conversion != NULL) { + CControlChangeFocus(icp->conversion, 1); + } +} + +/* ARGSUSED */ +void +IMUnsetFocus(icp) +IMIC *icp; +{ + TRACE(("IMUnsetFocus(ic%d)\n", icp->id)); + if (icp->conversion != NULL) { + CControlChangeFocus(icp->conversion, 0); + } +} + +/* ARGSUSED */ +void +IMStatusStart(icp) +IMIC *icp; +{ + TRACE(("IMStatusStart(ic%d)\n", icp->id)); + if (!(icp->common_attr.input_style & XIMStatusCallbacks)) + return; + statusStart(icp); +} + +/* ARGSUSED */ +void +IMStatusDone(icp) +IMIC *icp; +{ + TRACE(("IMStatusDone(ic%d)\n", icp->id)); + if (!(icp->common_attr.input_style & XIMStatusCallbacks)) + return; + statusDone(icp); +} + +void +IMStartForwarding(icp) +IMIC *icp; +{ + /* + * Make the client forward key events to us. + */ + TRACE(("IMStartForwarding(ic%d)\n", icp->id)); + +#define FORWARD_MASK (KeyPressMask|KeyReleaseMask) + +#ifdef notdef + if (synchronous) { + setEventMask(icp, FORWARD_MASK, FORWARD_MASK); + } else { + setEventMask(icp, FORWARD_MASK, NoEventMask); + } +#else + /* using full-synchronous method */ + setEventMask(icp, FORWARD_MASK, FORWARD_MASK); +#endif + +#undef FORWARD_MASK +} + +void +IMStopForwarding(icp) +IMIC *icp; +{ + /* + * Make the client stop sending key events. + */ + TRACE(("IMStopForwarding(ic%d)\n", icp->id)); + setEventMask(icp, NoEventMask, NoEventMask); +} diff -r 000000000000 -r 92745d501b9a lib/imlib/imdata.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/imlib/imdata.c Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,348 @@ +#ifndef lint +static char *rcsid = "$Id: imdata.c,v 1.7 1994/06/02 02:20:23 ishisone Exp $"; +#endif +/* + * Copyright (c) 1994 Software Research Associates, Inc. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Software Research Associates not be + * used in advertising or publicity pertaining to distribution of the + * software without specific, written prior permission. Software Research + * Associates makes no representations about the suitability of this software + * for any purpose. It is provided "as is" without express or implied + * warranty. + * + * Author: Makoto Ishisone, Software Research Associates, Inc., Japan + */ + +#include "im.h" + +#define B_GET16(p) (((p)[0]<<8) + (p)[1]) +#define B_GET32(p) (((p)[0]<<24) + ((p)[1]<<16) + ((p)[2]<<8) + (p)[3]) +#define L_GET16(p) ((p)[0] + ((p)[1]<<8)) +#define L_GET32(p) ((p)[0] + ((p)[1]<<8) + ((p)[2]<<16) + ((p)[3] << 24)) + +#define B_PUT16(x, p) (p)[0] = ((x)>>8) & 0xff; (p)[1] = (x) & 0xff +#define B_PUT32(x, p) (p)[0] = ((x)>>24) & 0xff; (p)[1] = ((x)>>16) & 0xff; \ + (p)[2] = ((x)>>8) & 0xff; (p)[3] = (x) & 0xff +#define L_PUT16(x, p) (p)[0] = (x) & 0xff; (p)[1] = ((x)>>8) & 0xff +#define L_PUT32(x, p) (p)[0] = (x) & 0xff; (p)[1] = ((x)>>8) & 0xff; \ + (p)[2] = ((x)>>16) & 0xff; (p)[3] = ((x)>>24) & 0xff; + +int +IMGetC8(conn, offset) +IMConnection *conn; +int offset; +{ + IMBuffer *ibp = IM_INBUF(conn); + int x; + + x = *((unsigned char *)IMBUFDATA(ibp) + offset); + return x; +} + +unsigned int +IMGetC16(conn, offset) +IMConnection *conn; +int offset; +{ + IMBuffer *ibp = IM_INBUF(conn); + unsigned char *p = (unsigned char *)IMBUFDATA(ibp) + offset; + unsigned int x; + + if (conn->byte_order == ORDER_BIG) { + x = B_GET16(p); + } else { + x = L_GET16(p); + } + + return x; +} + +int +IMGetI16(conn, offset) +IMConnection *conn; +int offset; +{ + long x; + + x = (long)IMGetC16(conn, offset); + return (x < 32768) ? (int)x : (int)(x - 65536L); +} + +unsigned long +IMGetC32(conn, offset) +IMConnection *conn; +int offset; +{ + IMBuffer *ibp = IM_INBUF(conn); + unsigned char *p = (unsigned char *)IMBUFDATA(ibp) + offset; + unsigned long x; + + if (conn->byte_order == ORDER_BIG) { + x = B_GET32(p); + } else { + x = L_GET32(p); + } + + return x; +} + +void +IMGetString(conn, offset, buf, len) +IMConnection *conn; +int offset; +char *buf; +int len; +{ + IMBuffer *ibp = IM_INBUF(conn); + char *p = IMBUFDATA(ibp) + offset; + + bcopy(p, buf, len); + buf[len] = '\0'; +} + +void +IMPutC8(conn, x) +IMConnection *conn; +int x; +{ + IMBuffer *ibp = IM_OUTBUF(conn); + unsigned char c = (unsigned char)x; + + IMBufAdd(ibp, (char *)&c, 1); +} + +void +IMPutC16(conn, x) +IMConnection *conn; +unsigned int x; +{ + IMBuffer *ibp = IM_OUTBUF(conn); + unsigned char *p = (unsigned char *)IMBufAlloc(ibp, 2); + + if (conn->byte_order == ORDER_BIG) { + B_PUT16(x, p); + } else { + L_PUT16(x, p); + } +} + +void +IMPutC32(conn, x) +IMConnection *conn; +unsigned long x; +{ + IMBuffer *ibp = IM_OUTBUF(conn); + unsigned char *p = (unsigned char *)IMBufAlloc(ibp, 4); + + if (conn->byte_order == ORDER_BIG) { + B_PUT32(x, p); + } else { + L_PUT32(x, p); + } +} + +void +IMPutI16(conn, x) +IMConnection *conn; +int x; +{ + IMBuffer *ibp = IM_OUTBUF(conn); + unsigned char *p = (unsigned char *)IMBufAlloc(ibp, 2); + + if (conn->byte_order == ORDER_BIG) { + B_PUT16(x, p); + } else { + L_PUT16(x, p); + } +} + +void +IMPutString(conn, s, len) +IMConnection *conn; +char *s; +int len; +{ + if (len < 0) len = strlen(s); + IMBufAdd(&conn->out_buf, s, len); +} + +void +IMPutPad(conn) +IMConnection *conn; +{ + int remainder; + int npad; + static char padding[] = { 0, 0, 0, 0 }; + + if ((remainder = IMBUFLEN(&conn->out_buf) % 4) != 0) { + npad = 4 - remainder; + IMBufAdd(IM_OUTBUF(conn), padding, npad); + } +} + +void +IMRewriteC16(conn, pos, x) +IMConnection *conn; +int pos; +unsigned int x; +{ + IMBuffer *ibp = IM_OUTBUF(conn); + unsigned char p[2]; + + if (conn->byte_order == ORDER_BIG) { + B_PUT16(x, p); + } else { + L_PUT16(x, p); + } + IMBufOverwrite(ibp, pos, (char *)p, 2); +} + +int +IMWritePos(conn) +IMConnection *conn; +{ + IMBuffer *ibp = IM_OUTBUF(conn); + + return IMBUFLEN(ibp); +} + +int +IMPutHeader(conn, major, minor, arglen) +IMConnection *conn; +int major; +int minor; +int arglen; +{ + int offset; + + offset = IMBUFLEN(&conn->out_buf); + arglen = (arglen + 3) / 4; +#ifdef XIM_BC + if (conn->has_length_bug) arglen *= 4; +#endif + IMPutC8(conn, major); + IMPutC8(conn, minor); + IMPutC16(conn, (unsigned int)arglen); + return offset; +} + +void +IMFinishRequest(conn, offset) +IMConnection *conn; +int offset; +{ + IMBuffer *ibp = IM_OUTBUF(conn); + unsigned int arglen; + + /* + * Append padding bytes, if needed. + */ + IMPutPad(conn); + + /* + * Offset points the beginning of the request. + * Following is a Request header which is 4-byte long. + */ + arglen = (unsigned int)((IMBUFLEN(ibp) - offset - 4) / 4); +#ifdef XIM_BC + if (conn->has_length_bug) arglen *= 4; +#endif + + /* + * rewrite the length field of the request header. + */ + IMRewriteC16(conn, offset + 2, arglen); + + IMSchedule(conn, SCHED_WRITE); +} + +void +IMCancelRequest(conn, offset) +IMConnection *conn; +int offset; +{ + IMBuffer *ibp = IM_OUTBUF(conn); + + IMBufDiscard(ibp, offset - IMBUFLEN(ibp)); +} + +void +IMSendSimpleRequest(conn, major, minor) +IMConnection *conn; +int major; +int minor; +{ + IMPutC8(conn, major); + IMPutC8(conn, minor); + /* + * This function (IMSendSimpleRequest) might be called when + * client's byte order is yet unknown, so usually it is unwise to + * call IMPutC16(). But in this particular case where the value + * to be put is zero, it is perfectly ok. + */ + IMPutC16(conn, 0); + IMSchedule(conn, SCHED_WRITE); +} + +void +IMSendRequestWithIC(conn, major, minor, icp) +IMConnection *conn; +int major; +int minor; +IMIC *icp; +{ + (void)IMPutHeader(conn, major, minor, 4); + IMPutC16(conn, icp->im->id); + IMPutC16(conn, icp->id); + IMSchedule(conn, SCHED_WRITE); +} + +void +IMSendError(conn, code, imid, icid, msg) +IMConnection *conn; +int code; +unsigned int imid; +unsigned int icid; +char *msg; +{ + int offset; + int msg_len; + unsigned int valid_flag = 0; + + msg_len = strlen(msg); + + if (imid != 0) valid_flag |= 1; + if (icid != 0) valid_flag |= 2; + + offset = IMPutHeader(conn, XIM_ERROR, 0, 0); + IMPutC16(conn, imid); + IMPutC16(conn, icid); + IMPutC16(conn, valid_flag); + IMPutC16(conn, (unsigned int)code); + IMPutC16(conn, (unsigned int)msg_len); + IMPutC16(conn, 0); + IMPutString(conn, msg, msg_len); + IMFinishRequest(conn, offset); +} + +void +IMSendBadProtocol(conn, msg) +IMConnection *conn; +char *msg; +{ + IMSendError(conn, IMBadProtocol, 0, 0, msg); +} + +void +IMSendBadLength(conn, imid, icid) +IMConnection *conn; +unsigned int imid; +unsigned int icid; +{ + IMSendError(conn, IMBadSomething, imid, icid, "Bad request length"); +} diff -r 000000000000 -r 92745d501b9a lib/imlib/imdispatch.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/imlib/imdispatch.c Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,484 @@ +#ifndef lint +static char *rcsid = "$Id: imdispatch.c,v 1.9 1994/06/02 10:36:07 ishisone Exp $"; +#endif +/* + * Copyright (c) 1994 Software Research Associates, Inc. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Software Research Associates not be + * used in advertising or publicity pertaining to distribution of the + * software without specific, written prior permission. Software Research + * Associates makes no representations about the suitability of this software + * for any purpose. It is provided "as is" without express or implied + * warranty. + * + * Author: Makoto Ishisone, Software Research Associates, Inc., Japan + */ + +#include "im.h" +#include "imreq.h" + +static int checkRequest _Pt_((IMConnection *conn, + int *majorp, int *minorp, int *arglenp)); +static void ServerAuthPhase _Pt_((IMConnection *conn)); +static void CommunicationPhase _Pt_((IMConnection *conn)); +static int initialDispatcher _Pt_((IMConnection *conn)); +static int mainDispatcher _Pt_((IMConnection *conn)); + +/*- checkRequest: read and examine request header -*/ +static int +checkRequest(conn, majorp, minorp, arglenp) +IMConnection *conn; +int *majorp; +int *minorp; +int *arglenp; +{ + IMBuffer *ibp = IM_INBUF(conn); + int len; + + /* check if there is enough data for the request header */ + if (IMBUFLEN(ibp) < 4) return 0; + +#ifdef XIM_BC + if (conn->has_length_bug) { + len = (int)IMGetC16(conn, 2); + } else { + len = (int)IMGetC16(conn, 2) * 4; + } +#else /* XIM_BC */ + len = (int)IMGetC16(conn, 2) * 4; +#endif /* XIM_BC */ + + TRACE(("checkRequest(): length=%d, buflen=%d\n", len, IMBUFLEN(ibp))); + + if (IMBUFLEN(ibp) >= len + 4) { + /* + * All the request data is in the buffer. + * Retrieve the request header, and discard it. + */ + *majorp = IMGetC8(conn, 0); + *minorp = IMGetC8(conn, 1); + *arglenp = len; + IMBufDiscard(ibp, 4); + return 1; + } else { + return 0; + } +} + +#ifdef XIM_BC +/*- countConnectRequestLen: count length of XIM_CONNECT request -*/ +int +countConnectRequestLen(conn) +IMConnection *conn; +{ + IMBuffer *ibp = IM_INBUF(conn); + int data_length = IMBUFLEN(ibp); + int num_proto_names; + int offset; + int i; + + /* + * Encoding of XIM_CONNECT request is: + * + * 4 request header + * 1 CARD8 byte order + * 1 unused + * 2 CARD16 major protocol version + * 2 CARD16 minor protocol version + * 2 CARD16 number of auth protocol names + * N LISTofSTRING auth protocol names + * + * where STRING is: + * 2 CARD16 length (N) + * N LISTofChar string + * p pad, p = Pad(2+N) + */ + + /* skip request header */ + data_length -= 4; + offset = 4; + + if (data_length < 8) return 0; /* incomplete data */ + + /* get the number of auth protocol names */ + num_proto_names = (int)IMGetC16(conn, offset + 6); + + /* skip fixed part */ + data_length -= 8; + offset += 8; + + /* count variable (i.e. list of string) part */ + for (i = 0; i < num_proto_names; i++) { + int str_len, pad_len; + + if (data_length < 2) return 0; /* incomplete data */ + str_len = (int)IMGetC16(conn, offset); + pad_len = (4 - ((2 + str_len) % 4)) % 4; + data_length -= 2 + str_len + pad_len; + offset += 2 + str_len + pad_len; + if (data_length < 0) return 0; /* incomplete data */ + } + + return offset - 4; /* 4 for the header */ +} +#endif /* XIM_BC */ + +/* + * Phase shifters + */ + +/*- ServerAuthPhase: move to server authentication phase -*/ +static void +ServerAuthPhase(conn) +IMConnection *conn; +{ + /* not yet implemented */ + IMSendSimpleRequest(conn, XIM_AUTH_NG, 0); + IMSchedule(conn, SCHED_CLOSE); +} + +/*- CommunicationPhase: move to comunication (i.e. main) phase -*/ +static void +CommunicationPhase(conn) +IMConnection *conn; +{ + IMPutHeader(conn, XIM_CONNECT_REPLY, 0, 4); + IMPutC16(conn, XIM_MAJOR_PROTOCOL_VERSION); + IMPutC16(conn, XIM_MINOR_PROTOCOL_VERSION); + IMSchedule(conn, SCHED_WRITE); + + conn->dispatcher = mainDispatcher; +} + +/* + * Request dispatchers + */ + +/*- initialDispatcher: the initial dispatcher -*/ +static int +initialDispatcher(conn) +IMConnection *conn; +{ + IMBuffer *ibp = IM_INBUF(conn); + int major, minor, arglen; + int major_protocol, minor_protocol; + int num_auth; +#ifdef XIM_BC + int counted_len; + int field_len; +#endif /* XIM_BC */ + + TRACE(("imlib:initialDispatcher(#%d)\n", conn->serial)); + + /* + * The first request must be 'XIM_CONNECT'. + */ + if (conn->byte_order == ORDER_UNKNOWN) { + char *p = IMBUFDATA(ibp); + + /* + * Check the byte-order first. + * In order to do it, we need at least 5 bytes of data. + */ + if (IMBUFLEN(ibp) < 5) return 0; + + /* + * Check the byte-order byte (5th byte of the data). + */ + switch (p[4]) { + case 0x42: /* 'B' -- big endian */ + conn->byte_order = ORDER_BIG; + TRACE(("\tbyte order is big endian\n")); + break; + case 0x6c: /* 'l' -- little endian */ + conn->byte_order = ORDER_LITTLE; + TRACE(("\tbyte order is little endian\n")); + break; + default: /* invalid request */ + /* + * what can we do here? since we don't know the byte order + * of the client, we cannot send error reply. but we can + * send XIM_AUTH_NG, because this request does not have + * byte order dependency. + */ + DDPRINT(2, ("invalid byte order field (%c)\n", p[4])); + goto send_ng; + } + } + +#ifdef XIM_BC + /* + * Xlib implementation of early X11R6 has a bug in the + * length field of request header. The field should + * represent the length of request data as the number + * of 4byte units, but the buggy Xlib puts number of + * bytes instead. + */ + + /* length of data by examining contents */ + counted_len = countConnectRequestLen(conn); /* in bytes */ + if (counted_len == 0) return 0; /* incomplete */ + /* length of data by reading length field */ + field_len = IMGetC16(conn, 2); /* num of 4byte element */ + + /* + * If the request packet comforms to the specification, + * field_len * 4 == counted_len + * but in case of buggy Xlib implementation, + * field_len == counted_len + */ + if (counted_len == field_len * 4) { + conn->has_length_bug = 0; + } else if (counted_len == field_len) { + /* buggy Xlib implementation */ + DPRINT(("connection #%d has length field bug\n", conn->serial)); + conn->has_length_bug = 1; + } else { + /* totally broken */ + DPRINT(("connection #%d is broken\n", conn->serial)); + goto send_ng; + } +#endif + + /* + * See if the entire data of the request is ready. + */ + if (!checkRequest(conn, &major, &minor, &arglen)) return 0; + + /* + * Check the arguments... + */ + if (major != XIM_CONNECT || minor != 0 || arglen < 8) { + DPRINT(("invalid initial request (major=%d, minor=%d, arglen=%d\n", + major, minor, arglen)); + goto send_ng; + } + + major_protocol = (int)IMGetC16(conn, 2); + minor_protocol = (int)IMGetC16(conn, 4); + TRACE(("\tprototol version: major=%d, minor=%d\n", + major_protocol, minor_protocol)); + conn->major_protocol_version = major_protocol; + conn->minor_protocol_version = minor_protocol; + + num_auth = (int)IMGetC16(conn, 6); + TRACE(("\tnumber of auth protocols: %d\n", num_auth)); + + if (major_protocol > XIM_MAJOR_PROTOCOL_VERSION || + (major_protocol == XIM_MAJOR_PROTOCOL_VERSION && + minor_protocol > XIM_MINOR_PROTOCOL_VERSION)) { + DPRINT(("unsupported protocol (%d,%d)\n", + major_protocol, minor_protocol)); + goto send_ng; + } + + if (num_auth > 0) { + ServerAuthPhase(conn); +#ifdef notdef + } else if (do_client_authentication) { + ClientAuthPhase(conn); +#endif + } else { + CommunicationPhase(conn); + } + + IMBufDiscard(ibp, arglen); + + return 1; + + send_ng: + DDPRINT(2, ("send XIM_AUTH_NG to #%d\n", conn->serial)); + IMSendSimpleRequest(conn, XIM_AUTH_NG, 0); + IMSchedule(conn, SCHED_SHUTDOWN); + return 0; +} + +/*- mainDispatcher: main dispatcher -*/ +static int +mainDispatcher(conn) +IMConnection *conn; +{ + IMBuffer *ibp = IM_INBUF(conn); + int major, minor, arglen; + IMRequest *req; + + TRACE(("imlib:mainDispatcher(#%d)\n", conn->serial)); + + /* + * When X transport is used, NUL bytes might appear between + * requests. So discard them first. + */ + IMBufDiscardNUL(ibp); + + /* + * Check if the entire request data is on the input buffer. + */ + if (!checkRequest(conn, &major, &minor, &arglen)) return 0; + + /* + * Check major opcode. + */ + req = IMMainDispatchTable[major]; + if (req == NULL) { + DDPRINT(2, ("bad major opcode(%d)\n", major)); + IMSendBadProtocol(conn, "Invalid major opcode"); + goto ret; + } + + /* + * Then, check minor opcode. + */ + while (req != NULL) { + if (req->minor == minor) break; + req = req->next; + } + if (req == NULL) { + DDPRINT(2, ("bad minor opcode(%d,%d)\n", major, minor)); + IMSendBadProtocol(conn, "Invalid minor opcode"); + goto ret; + } + + /* + * Opcode is valid. Call the request processing routine. + */ + DDPRINT(2, ("** processing %s request...\n", req->name)); + (*req->proc)(conn, major, minor, arglen); + + ret: + /* + * Discard the argument portion. + */ + IMBufDiscard(ibp, arglen); + + return 1; +} + +/* + * Public functions + */ + +void +IMSetInitialDispatcher(conn) +IMConnection *conn; +{ + TRACE(("IMSetInitialDispatcher(#%d)\n", conn->serial)); + conn->dispatcher = initialDispatcher; +} + +void +IMDispatch(conn, cond) +IMConnection *conn; +int cond; +{ + TRACE(("IMDispatch(#%d)\n", conn->serial)); + + switch (cond) { + case TRANSPORT_OK: + /* + * Call dispatcher while data is ready. + */ + while ((*conn->dispatcher)(conn)) + /* empty body */; + + /* + * Do compaction to the input buffer. + */ + IMBufCompact(IM_INBUF(conn)); + break; + + case TRANSPORT_ERROR: + DDPRINT(2, ("transport error\n")); + IMSchedule(conn, SCHED_SHUTDOWN); + break; + + case TRANSPORT_EOF: + DDPRINT(2, ("transport EOF\n")); + IMSchedule(conn, SCHED_CLOSE); + break; + } + + /* + * If there's something to be done (i.e. scheduled), + * do it. + */ + if (!IMQueueEmpty(conn->proto_widget)) { + IMProcessQueue(conn->proto_widget); + } +} + +void +IMSchedule(conn, type) +IMConnection *conn; +int type; +{ + TRACE(("IMSchedule(#%d, %d)\n", conn->serial, type)); + + if (conn->schedule & type) return; /* already scheduled */ + + if (conn->schedule == 0) { + TRACE(("insert into the queue\n")); + IMPushQueue(conn); + } + conn->schedule |= type; +} + +void +IMProcessQueue(w) +Widget w; +{ + IMConnection *conn; + IMConnection *tmp = NULL; + + TRACE(("IMProcessQueue()\n")); + + while ((conn = IMPopQueue(w)) != NULL) { + int schedule; + + schedule = conn->schedule; + conn->schedule = 0; + + if (schedule & SCHED_SHUTDOWN) { + /* + * This connection is dead. Don't need to + * flush output before closing. + */ + IMCloseConnection(conn); + } else { + if (schedule & SCHED_WRITE) { + /* + * Flush output buffer. + */ + int ret; + + ret = IMFlush(conn); + switch (ret) { + case TRANSPORT_ERROR: + IMCloseConnection(conn); + continue; + case TRANSPORT_PARTIAL: + /* to be queued again */ + conn->schedule = schedule; + conn->queue_next = tmp; + tmp = conn; + continue; + } + } + if (schedule & SCHED_CLOSE) { + IMCloseConnection(conn); + } + } + } + + /* reschedule */ + while (tmp != NULL) { + IMConnection *next = tmp->queue_next; + + TRACE(("reschedule #%d\n", tmp->serial)); + IMPushQueue(tmp); + tmp = next; + } +} diff -r 000000000000 -r 92745d501b9a lib/imlib/imfuncs.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/imlib/imfuncs.h Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,157 @@ +/* $Id: imfuncs.h,v 1.11 2002/01/07 15:34:14 ishisone Exp $ */ +/* + * Copyright (c) 1994 Software Research Associates, Inc. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Software Research Associates not be + * used in advertising or publicity pertaining to distribution of the + * software without specific, written prior permission. Software Research + * Associates makes no representations about the suitability of this software + * for any purpose. It is provided "as is" without express or implied + * warranty. + * + * Author: Makoto Ishisone, Software Research Associates, Inc., Japan + */ + +#ifndef _imfuncs_h +#define _imfuncs_h + +#include "imprtype.h" + +/* + * Functions to get/put data (defined in imdata.c) + */ +extern int IMGetC8 _Pt_((IMConnection *conn, int offset)); +extern unsigned int IMGetC16 _Pt_((IMConnection *conn, int offset)); +extern int IMGetI16 _Pt_((IMConnection *conn, int offset)); +extern unsigned long IMGetC32 _Pt_((IMConnection *conn, int offset)); +extern void IMGetString _Pt_((IMConnection *conn, + int offset, char *buf, int len)); + +extern void IMPutC8 _Pt_((IMConnection *conn, int x)); +extern void IMPutC16 _Pt_((IMConnection *conn, unsigned int x)); +extern void IMPutC32 _Pt_((IMConnection *conn, unsigned long x)); +extern void IMPutI16 _Pt_((IMConnection *conn, int x)); +extern void IMPutString _Pt_((IMConnection *conn, char *s, int len)); +extern void IMPutPad _Pt_((IMConnection *conn)); +extern void IMRewriteC16 _Pt_((IMConnection *conn, int pos, unsigned int x)); + +extern int IMWritePos _Pt_((IMConnection *conn)); + +extern int IMPutHeader _Pt_((IMConnection *conn, + int major, int minor, int arglen)); +extern void IMFinishRequest _Pt_((IMConnection *conn, int offset)); +extern void IMCancelRequest _Pt_((IMConnection *conn, int offset)); +extern void IMSendSimpleRequest _Pt_((IMConnection *conn, + int major, int minor)); +extern void IMSendRequestWithIC _Pt_((IMConnection *conn, + int major, int minor, IMIC *icp)); + +extern void IMSendError _Pt_((IMConnection *conn, int code, + unsigned int imid, unsigned int icid, + char *msg)); +extern void IMSendBadProtocol _Pt_((IMConnection *conn, char *msg)); +extern void IMSendBadLength _Pt_((IMConnection *conn, + unsigned int imid, unsigned int icid)); + +/* + * Transport layer functions (defined in imxport.c) + */ +extern int IMCreateTCPService _Pt_((int *portp)); +extern IMConnection *IMTCPConnection _Pt_((Widget protocol, int socket)); +extern int IMCreateUnixService _Pt_((char *path)); +extern IMConnection *IMUnixConnection _Pt_((Widget protocol, int socket)); +extern IMConnection *IMXConnection _Pt_((Widget protocol, XEvent *ev)); +extern int IMFlush _Pt_((IMConnection *conn)); +extern void IMShutdown _Pt_((IMConnection *conn)); +extern void IMCloseConnection _Pt_((IMConnection *conn)); + +/* + * Request dispatch functions (defined in imdispatch.c) + */ +extern void IMSetInitialDispatcher _Pt_((IMConnection *conn)); +extern void IMDispatch _Pt_((IMConnection *conn, int cond)); +extern void IMSchedule _Pt_((IMConnection *conn, int type)); +extern void IMProcessQueue _Pt_((Widget w)); + +/* + * Function to compile request dispatch table (defined in imrequest.c) + */ +extern void IMCompileReq _Pt_((void)); + +/* + * Functions handling IM/IC creation/destruction/lookup (defined in imic.c) + */ +extern IMIM *IMGetIM _Pt_((IMConnection *conn, int arglen)); +extern IMIC *IMGetIC _Pt_((IMConnection *conn, int arglen)); +extern IMIM *IMCreateIM _Pt_((IMConnection *conn, IMConverter *converter)); +extern IMIC *IMCreateIC _Pt_((IMIM *imp)); +extern void IMDestroyIM _Pt_((IMIM *imp)); +extern void IMDestroyIC _Pt_((IMIC *imp)); + +/* + * Functions handling conversion start/stop/etc. (defined in imconv.c) + */ +extern int IMStartConversion _Pt_((IMIC *icp)); +extern void IMStopConversion _Pt_((IMIC *icp)); +extern int IMResetIC _Pt_((IMIC *icp, char **preedit_strp)); +extern void IMForwardEvent _Pt_((IMIC *icp, XEvent *ev)); +extern void IMSetFocus _Pt_((IMIC *icp)); +extern void IMUnsetFocus _Pt_((IMIC *icp)); +extern void IMStatusStart _Pt_((IMIC *icp)); +extern void IMStatusDone _Pt_((IMIC *icp)); +extern void IMStartForwarding _Pt_((IMIC *icp)); +extern void IMStopForwarding _Pt_((IMIC *icp)); + +/* + * Functions dealing with IM/IC attributes (defined in imattr.c) + */ +extern void IMPutIMAttrList _Pt_((IMIM *imp)); +extern void IMPutICAttrList _Pt_((IMIM *imp)); +extern int IMSetIMValues _Pt_((IMIM *imp, char *data, int len, int major)); +extern int IMGetIMValues _Pt_((IMIM *imp, char *data, int len, int offset)); +extern int IMSetICValues _Pt_((IMIC *icp, char *data, int len, int major)); +extern int IMGetICValues _Pt_((IMIC *icp, char *data, int len, int offset)); +extern void IMFillDefault _Pt_((IMIC *icp, + unsigned long common_mask, + unsigned long preedit_mask, + unsigned long status_mask)); +extern int IMValidateWindow _Pt_((Display *dpy, Window win, + IMWindowProfile *profilep)); +extern int IMValidateICAttributes _Pt_((IMIC *icp, int checkonly)); +extern void IMFreeICAttributes _Pt_((IMIC *icp)); +extern unsigned long IMMakeConvAttributes _Pt_((IMIC *icp, + ConversionAttributes *attr)); +extern void IMMoveLocation _Pt_((IMIC *icp, int x, int y)); + +/* + * Functions interfacing imlib and IMProtocol widget (defined in improto.c) + */ +extern void IMRegisterConnection _Pt_((IMConnection *conn)); +extern void IMUnregisterConnection _Pt_((IMConnection *conn)); +extern IMConnection *IMConnectionList _Pt_((Widget w)); +extern void IMPushQueue _Pt_((IMConnection *conn)); +extern IMConnection *IMPopQueue _Pt_((Widget w)); +extern int IMQueueEmpty _Pt_((Widget w)); +extern Pixel IMDefaultForeground _Pt_((Widget w)); +extern Pixel IMDefaultBackground _Pt_((Widget w)); +extern char *IMDefaultFontSet _Pt_((IMIM *imp)); +extern FontBank IMFontBank _Pt_((IMIM *imp)); +extern int IMStatusWidth _Pt_((Widget w)); +extern void IMInitHash _Pt_((Widget w)); +extern IMIM **IMIMHash _Pt_((Widget w)); +extern IMIC **IMICHash _Pt_((Widget w)); +extern unsigned int IMNextIMID _Pt_((Widget w)); +extern unsigned int IMNextICID _Pt_((Widget w)); +extern Atom IMCtextAtom _Pt_((Widget w)); +extern Atom IMKi2CommAtom _Pt_((Widget w)); +extern Atom IMXConnectAtom _Pt_((Widget w)); +extern Atom IMProtocolAtom _Pt_((Widget w)); +extern Atom IMMoreDataAtom _Pt_((Widget w)); +extern IMTriggerKey *IMTriggerKeys _Pt_((IMIM *imp, int *num_triggersp)); +extern IMConverter *IMGetConverter _Pt_((Widget w, char *locale)); + +#endif /* _imfuncs_h */ diff -r 000000000000 -r 92745d501b9a lib/imlib/imic.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/imlib/imic.c Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,396 @@ +#ifndef lint +static char *rcsid = "$Id: imic.c,v 1.12 2002/01/24 09:07:20 ishisone Exp $"; +#endif +/* + * Copyright (c) 1994 Software Research Associates, Inc. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Software Research Associates not be + * used in advertising or publicity pertaining to distribution of the + * software without specific, written prior permission. Software Research + * Associates makes no representations about the suitability of this software + * for any purpose. It is provided "as is" without express or implied + * warranty. + * + * Author: Makoto Ishisone, Software Research Associates, Inc., Japan + */ + +#include "im.h" + +#define IMHASHVAL(imp) ((imp)->id % IM_HASH_SIZE) +#define ICHASHVAL(icp) ((icp)->id % IC_HASH_SIZE) + +static IMIM *id2IM _Pt_((IMConnection *conn, unsigned int id)); +static IMIC *id2IC _Pt_((IMIM *imp, unsigned int id)); +static unsigned int newIMID _Pt_((IMConnection *conn)); +static unsigned int newICID _Pt_((IMIM *imp)); +static void registerIM _Pt_((IMIM *imp)); +static void registerIC _Pt_((IMIC *icp)); +static int unregisterIM _Pt_((IMIM *imp)); +static int unregisterIC _Pt_((IMIC *icp)); +static int removeIM _Pt_((IMIM *imp)); +static int removeIC _Pt_((IMIC *icp)); + +/*- id2IM: input-method ID to IM converter -*/ +static IMIM * +id2IM(conn, id) +IMConnection *conn; +unsigned int id; +{ + IMIM **imHash = IMIMHash(conn->proto_widget); + IMIM *imp; + + imp = imHash[id % IM_HASH_SIZE]; + while (imp != NULL) { + if (imp->id == id) return imp; + imp = imp->hash_next; + } + return NULL; +} + +/*- id2IC: input-context ID to IC converter -*/ +static IMIC * +id2IC(imp, id) +IMIM *imp; +unsigned int id; +{ + IMIC **icHash = IMICHash(imp->connection->proto_widget); + IMIC *icp; + + icp = icHash[id % IC_HASH_SIZE]; + while (icp != NULL) { + if (icp->id == id) return icp; + icp = icp->hash_next; + } + return NULL; +} + +/*- newIMID: return unused input-method ID -*/ +static unsigned int +newIMID(conn) +IMConnection *conn; +{ + Widget w = conn->proto_widget; + unsigned int id, id_start; + + id = id_start = IMNextIMID(w); + do { + if (id2IM(conn, id) == NULL) return id; /* unused ID */ + } while ((id = IMNextIMID(w)) != id_start); + return 0; +} + +/*- newICID: return unused input-context ID -*/ +static unsigned int +newICID(imp) +IMIM *imp; +{ + Widget w = imp->connection->proto_widget; + unsigned int id, id_start; + + id = id_start = IMNextICID(w); + do { + if (id2IC(imp, id) == NULL) return id; /* unused ID */ + } while ((id = IMNextICID(w)) != id_start); + return 0; +} + +/*- registerIM: register IM to hash table -*/ +static void +registerIM(imp) +IMIM *imp; +{ + IMIM **imHash = IMIMHash(imp->connection->proto_widget); + + imp->hash_next = imHash[IMHASHVAL(imp)]; + imHash[IMHASHVAL(imp)] = imp; +} + +/*- registerIC: register IC to hash table -*/ +static void +registerIC(icp) +IMIC *icp; +{ + IMIC **icHash = IMICHash(icp->im->connection->proto_widget); + + icp->hash_next = icHash[ICHASHVAL(icp)]; + icHash[ICHASHVAL(icp)] = icp; +} + +/*- unregisterIM: remove IM from hash table -*/ +static int +unregisterIM(imp) +IMIM *imp; +{ + IMIM **imHash = IMIMHash(imp->connection->proto_widget); + IMIM *p, *q; + + p = imHash[IMHASHVAL(imp)]; + q = NULL; + + while (p != NULL && p != imp) { + q = p; + p = p->hash_next; + } + if (p == NULL) return 0; + + if (q != NULL) { + q->hash_next = p->hash_next; + } else { + imHash[IMHASHVAL(imp)] = p->hash_next; + } + return 1; +} + +/*- unregisterIC: remove IC from hash table -*/ +static int +unregisterIC(icp) +IMIC *icp; +{ + IMIC **icHash = IMICHash(icp->im->connection->proto_widget); + IMIC *p, *q; + + p = icHash[ICHASHVAL(icp)]; + q = NULL; + + while (p != NULL && p != icp) { + q = p; + p = p->hash_next; + } + if (p == NULL) return 0; + + if (q != NULL) { + q->hash_next = p->hash_next; + } else { + icHash[ICHASHVAL(icp)] = p->hash_next; + } + return 1; +} + +/* removeIM: remove IM from IM list which connection holds */ +static int +removeIM(imp) +IMIM *imp; +{ + IMConnection *conn = imp->connection; + IMIM *p, *q; + + p = conn->im_list; + q = NULL; + while (p != NULL) { + if (p == imp) break; + q = p; + p = p->next; + } + + if (p == NULL) return 0; + + if (q == NULL) { + conn->im_list = p->next; + } else { + q->next = p->next; + } + return 1; +} + +/* removeIC: remove IC from IC list which IM holds */ +static int +removeIC(icp) +IMIC *icp; +{ + IMIM *imp = icp->im; + IMIC *p, *q; + + p = imp->ic_list; + q = NULL; + while (p != NULL) { + if (p == icp) break; + q = p; + p = p->next; + } + + if (p == NULL) return 0; + + if (q == NULL) { + imp->ic_list = p->next; + } else { + q->next = p->next; + } + return 1; +} + +/* + * Public functions + */ + +IMIM * +IMGetIM(conn, arglen) +IMConnection *conn; +int arglen; +{ + unsigned int id; + IMIM *imp; + + /* Check argument length */ + if (arglen < 2) { + IMSendError(conn, IMBadSomething, 0, 0, "input-method ID expected"); + return NULL; + } + + id = IMGetC16(conn, 0); + imp = id2IM(conn, id); + if (imp != NULL && imp->connection == conn) return imp; + IMSendError(conn, IMBadSomething, 0, 0, "invalid input-method ID"); + return NULL; +} + +IMIC * +IMGetIC(conn, arglen) +IMConnection *conn; +int arglen; +{ + unsigned int imid, icid; + IMIM *imp; + IMIC *icp; + + /* Check argument length */ + if (arglen < 4) { + IMSendError(conn, IMBadSomething, 0, 0, "input-method ID expected"); + return NULL; + } else if (arglen < 4) { + IMSendError(conn, IMBadSomething, 0, 0, "input-context ID expected"); + return NULL; + } + + imid = IMGetC16(conn, 0); + icid = IMGetC16(conn, 2); + + if ((imp = id2IM(conn, imid)) == NULL || imp->connection != conn) { + IMSendError(conn, IMBadSomething, 0, 0, "invalid input-method ID"); + return NULL; + } + if ((icp = id2IC(imp, icid)) == NULL || icp->im != imp) { + IMSendError(conn, IMBadSomething, 0, 0, "invalid input-context ID"); + return NULL; + } + return icp; +} + +IMIM * +IMCreateIM(conn, converter) +IMConnection *conn; +IMConverter *converter; +{ + IMIM *imp; + + imp = XtNew(IMIM); + + imp->id = newIMID(conn); + imp->connection = conn; + imp->converter = converter; + imp->mask = 0; + imp->ic_list = NULL; + + registerIM(imp); + imp->next = conn->im_list; + conn->im_list = imp; + + return imp; +} + + +IMIC * +IMCreateIC(imp) +IMIM *imp; +{ + IMIC *icp; + + icp = XtNew(IMIC); + + icp->id = newICID(imp); + + /* + * Initialize data + */ + icp->im = imp; + icp->conversion = NULL; + icp->state = 0; + icp->pending_events = NULL; + icp->style = IMSTYLE_SEPARATE; + icp->common_attr.set_mask = icp->common_attr.change_mask = 0; + icp->preedit_attr.set_mask = icp->preedit_attr.change_mask = 0; + icp->status_attr.set_mask = icp->status_attr.change_mask = 0; + icp->fonts = NULL; + icp->num_fonts = 0; + icp->status_fonts = NULL; + icp->num_status_fonts = 0; + + registerIC(icp); + icp->next = imp->ic_list; + imp->ic_list = icp; + + return icp; +} + +void +IMDestroyIM(imp) +IMIM *imp; +{ + IMIC *icp = imp->ic_list; + IMIC *icp_next; + + /* + * Destroy all the ICs belonging to this IM. + */ + while (icp != NULL) { + icp_next = icp->next; + IMDestroyIC(icp); + icp = icp_next; + } + + (void)unregisterIM(imp); + (void)removeIM(imp); + + XtFree((char *)imp); +} + +void +IMDestroyIC(icp) +IMIC *icp; +{ + IMPendingEvent *pending; + + if (icp->state & IC_DESTROYING) return; + icp->state |= IC_DESTROYING; + + /* + * Stop conversion. + */ + if (icp->state & IC_CONVERTING) { + IMStopConversion(icp); + } + + /* + * Free pending event queue. + */ + pending = icp->pending_events; + while (pending != NULL) { + IMPendingEvent *next = pending->next; + + XtFree((char *)pending); + pending = next; + } + + /* + * Free IC attributes. + */ + IMFreeICAttributes(icp); + + (void)unregisterIC(icp); + (void)removeIC(icp); + + XtFree((char *)icp); +} diff -r 000000000000 -r 92745d501b9a lib/imlib/improto.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/imlib/improto.c Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,289 @@ +#ifndef lint +static char *rcsid = "$Id: improto.c,v 1.5 1994/05/31 07:54:04 ishisone Exp $"; +#endif +/* + * Copyright (c) 1994 Software Research Associates, Inc. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Software Research Associates not be + * used in advertising or publicity pertaining to distribution of the + * software without specific, written prior permission. Software Research + * Associates makes no representations about the suitability of this software + * for any purpose. It is provided "as is" without express or implied + * warranty. + * + * Author: Makoto Ishisone, Software Research Associates, Inc., Japan + */ + +#include "im.h" +#include "IMProtoP.h" + +/* + * This library contains interface functions between imlib and + * IMProtocol widget. + */ + +/*- IMRegisterConnection: register connection to the protocol widget -*/ +void +IMRegisterConnection(conn) +IMConnection *conn; +{ + IMProtocolWidget ipw = (IMProtocolWidget)conn->proto_widget; + + conn->next = ipw->imp.connection_list; + ipw->imp.connection_list = conn; +} + +/*- IMUnregisterConnection: unregister connection from the protocol widget -*/ +void +IMUnregisterConnection(conn) +IMConnection *conn; +{ + IMProtocolWidget ipw = (IMProtocolWidget)conn->proto_widget; + IMConnection *p, *q; + + p = ipw->imp.connection_list; + q = NULL; + while (p != NULL) { + if (p == conn) { + if (q == NULL) { + ipw->imp.connection_list = p->next; + } else { + q->next = p->next; + } + /* + * If there are no connections, and the no-more-connections + * flag is set to true, destroy the protocol widget. + */ + if (ipw->imp.connection_list == NULL && + ipw->imp.no_more_connections == True) { + DPRINT(("IMProtocolWidget no longer necessary. killing..\n")); + XtDestroyWidget((Widget)ipw); + } + return; + } + q = p; + p = p->next; + } +} + +/*- IMConnectionList: get connection list -*/ +IMConnection * +IMConnectionList(w) +Widget w; +{ + IMProtocolWidget ipw = (IMProtocolWidget)w; + + return ipw->imp.connection_list; +} + +/*- IMPushQueue: push connection to the scheduler queue -*/ +void +IMPushQueue(conn) +IMConnection *conn; +{ + Widget w = conn->proto_widget; + + conn->queue_next = IM_QUEUE(w); + IM_QUEUE(w) = conn; +} + +/*- IMPopQueue: pop connection from the scheduler queue */ +IMConnection * +IMPopQueue(w) +Widget w; +{ + IMConnection *conn; + + conn = IM_QUEUE(w); + if (conn != NULL) { + IM_QUEUE(w) = conn->queue_next; + conn->queue_next = NULL; + } + return conn; +} + +/*- IMQueueEmpty: returns true if the scheduler queue is empty -*/ +int +IMQueueEmpty(w) +Widget w; +{ + return(IM_QUEUE(w) == NULL); +} + +/*- IMDefaultForeground: get default foreground color -*/ +Pixel +IMDefaultForeground(w) +Widget w; +{ + IMProtocolWidget ipw = (IMProtocolWidget)w; + + return ipw->imp.foreground; +} + +/*- IMDefaultBackground: get default background color -*/ +Pixel +IMDefaultBackground(w) +Widget w; +{ + IMProtocolWidget ipw = (IMProtocolWidget)w; + + return ipw->core.background_pixel; +} + +/*- IMDefaultFontSet: get default font set -*/ +char * +IMDefaultFontSet(imp) +IMIM *imp; +{ + IMProtocolWidget ipw = (IMProtocolWidget)imp->connection->proto_widget; + + return ipw->imp.default_fontlist; +} + +/*- IMFontBank: get font bank for the specified IM -*/ +FontBank +IMFontBank(imp) +IMIM *imp; +{ + IMProtocolWidget ipw = (IMProtocolWidget)imp->connection->proto_widget; + + return ipw->imp.font_bank; +} + +/*- IMStatusWidth: get default status width -*/ +int +IMStatusWidth(w) +Widget w; +{ + IMProtocolWidget ipw = (IMProtocolWidget)w; + + return ipw->imp.status_width; +} + +/*- IMInitHash: initialize IM/IC hash table -*/ +void +IMInitHash(w) +Widget w; +{ + IMIM **impp; + IMIC **icpp; + int i; + + impp = IM_IMHASH(w); + icpp = IM_ICHASH(w); + for (i = 0; i < IM_HASH_SIZE; i++) impp[i] = NULL; + for (i = 0; i < IC_HASH_SIZE; i++) icpp[i] = NULL; + IM_LASTIMID(w) = IM_LASTICID(w) = 0; +} + +/*- IMIMHash: get IM hash table -*/ +IMIM ** +IMIMHash(w) +Widget w; +{ + return IM_IMHASH(w); +} + +/*- IMICHash: get IC hash table -*/ +IMIC ** +IMICHash(w) +Widget w; +{ + return IM_ICHASH(w); +} + +/*- IMNextIMID: return next IMID (it might be used, though) -*/ +unsigned int +IMNextIMID(w) +Widget w; +{ + long id = IM_LASTIMID(w) + 1; /* use long int to avoid overflow */ + + if (id > 65535L) id = 1; + IM_LASTIMID(w) = (unsigned int)id; + return (unsigned int)id; +} + +/*- IMNextICID: return next ICID (it might be used, though) -*/ +unsigned int +IMNextICID(w) +Widget w; +{ + long id = IM_LASTICID(w) + 1; /* use long int to avoid overflow */ + + if (id > 65535L) id = 1; + IM_LASTICID(w) = (unsigned int)id; + return (unsigned int)id; +} + +/*- IMCtextAtom: get COMPOUND_TEXT atom -*/ +Atom +IMCtextAtom(w) +Widget w; +{ + return ATOM_CTEXT(w); +} + +/*- IMKi2CommAtom: get _KINPUT2_COMM atom -*/ +Atom +IMKi2CommAtom(w) +Widget w; +{ + return ATOM_KI2COMM(w); +} + +/*- IMXConnectAtom: get _XIM_XCONNECT atom -*/ +Atom +IMXConnectAtom(w) +Widget w; +{ + return ATOM_XCONNECT(w); +} + +/*- IMProtocolAtom: get _XIM_PROTOCOL atom -*/ +Atom +IMProtocolAtom(w) +Widget w; +{ + return ATOM_PROTOCOL(w); +} + +/*- IMMoreDataAtom: get _XIM_MOREDATA atom -*/ +Atom +IMMoreDataAtom(w) +Widget w; +{ + return ATOM_MOREDATA(w); +} + +/*- IMTriggerKeys: get trigger key list -*/ +IMTriggerKey * +IMTriggerKeys(imp, num_triggersp) +IMIM *imp; +int *num_triggersp; +{ + IMProtocolWidget ipw = (IMProtocolWidget)imp->connection->proto_widget; + + *num_triggersp = ipw->imp.num_trigger_keys; + return ipw->imp.trigger_keys; +} + +/*- getConverter: look up converter for the specified locale -*/ +IMConverter * +IMGetConverter(w, locale) +Widget w; +char *locale; +{ + IMProtocolWidget ipw = (IMProtocolWidget)w; + IMConverter *conv = &ipw->imp.converter; + int i; + + for (i = 0; i < conv->num_locales; i++) { + if (!strcmp(conv->supported_locales[i], locale)) return conv; + } + return NULL; +} diff -r 000000000000 -r 92745d501b9a lib/imlib/imprtype.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/imlib/imprtype.h Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,30 @@ +/* $Id: imprtype.h,v 1.2 1994/05/12 08:56:14 ishisone Exp $ */ +/* + * Copyright (c) 1994 Software Research Associates, Inc. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Software Research Associates not be + * used in advertising or publicity pertaining to distribution of the + * software without specific, written prior permission. Software Research + * Associates makes no representations about the suitability of this software + * for any purpose. It is provided "as is" without express or implied + * warranty. + * + * Author: Makoto Ishisone, Software Research Associates, Inc., Japan + */ + +#ifndef _imprtype_h +#define _imprtype_h + +#include + +#if NeedFunctionPrototypes +#define _Pt_(args) args +#else +#define _Pt_(args) () +#endif + +#endif /* _imprtype_h */ diff -r 000000000000 -r 92745d501b9a lib/imlib/imreq.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/imlib/imreq.h Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,40 @@ +/* $Id: imreq.h,v 1.1 1994/05/16 02:45:36 ishisone Exp $ */ +/* + * Copyright (c) 1994 Software Research Associates, Inc. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Software Research Associates not be + * used in advertising or publicity pertaining to distribution of the + * software without specific, written prior permission. Software Research + * Associates makes no representations about the suitability of this software + * for any purpose. It is provided "as is" without express or implied + * warranty. + * + * Author: Makoto Ishisone, Software Research Associates, Inc., Japan + */ + +#ifndef _imreq_h +#define _imreq_h + +typedef struct _im_request_ { + char *name; /* name of request. + * for extension requests, this is the name of + * the extension. + */ + int major; /* major opcode */ + int minor; /* minor opcode */ + void (*proc)(); /* request handler proc. + * NULL means clients don't send this + * request to servers + * (i.e. server->client request). + */ + IMExtensionMask mask; /* required extension mask */ + struct _im_request_ *next; /* for dispatch table */ +} IMRequest; + +extern IMRequest *IMMainDispatchTable[]; + +#endif /* _imreq_h */ diff -r 000000000000 -r 92745d501b9a lib/imlib/imrequest.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/imlib/imrequest.c Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,1452 @@ +#ifndef lint +static char *rcsid = "$Id: imrequest.c,v 1.19 2002/01/27 11:33:37 ishisone Exp $"; +#endif +/* + * Copyright (c) 1994 Software Research Associates, Inc. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Software Research Associates not be + * used in advertising or publicity pertaining to distribution of the + * software without specific, written prior permission. Software Research + * Associates makes no representations about the suitability of this software + * for any purpose. It is provided "as is" without express or implied + * warranty. + * + * Author: Makoto Ishisone, Software Research Associates, Inc., Japan + */ + +/* in order to include xEvent definition */ +#define NEED_EVENTS +#include + +#include "im.h" +#include "imreq.h" + +/* + * Request handle functions + */ +static void ximDisconnectProc _Pt_((IMConnection *, int, int, int)); +static void ximErrorProc _Pt_((IMConnection *, int, int, int)); +static void ximOpenProc _Pt_((IMConnection *, int, int, int)); +static void ximCloseProc _Pt_((IMConnection *, int, int, int)); +static void ximTriggerNotifyProc _Pt_((IMConnection *, int, int, int)); +static void ximEncodingNegotiationProc _Pt_((IMConnection *, int, int, int)); +static void ximQueryExtensionProc _Pt_((IMConnection *, int, int, int)); +static void ximSetIMValuesProc _Pt_((IMConnection *, int, int, int)); +static void ximGetIMValuesProc _Pt_((IMConnection *, int, int, int)); +static void ximCreateICProc _Pt_((IMConnection *, int, int, int)); +static void ximDestroyICProc _Pt_((IMConnection *, int, int, int)); +static void ximSetICValuesProc _Pt_((IMConnection *, int, int, int)); +static void ximGetICValuesProc _Pt_((IMConnection *, int, int, int)); +static void ximSetICFocusProc _Pt_((IMConnection *, int, int, int)); +static void ximUnsetICFocusProc _Pt_((IMConnection *, int, int, int)); +static void ximForwardEventProc _Pt_((IMConnection *, int, int, int)); +static void ximExtForwardKeyeventProc _Pt_((IMConnection *, int, int, int)); +static void ximSyncProc _Pt_((IMConnection *, int, int, int)); +static void ximSyncReplyProc _Pt_((IMConnection *, int, int, int)); +static void ximResetICProc _Pt_((IMConnection *, int, int, int)); +static void ximExtMoveProc _Pt_((IMConnection *, int, int, int)); + +static void ximAlreadyConnectedProc _Pt_((IMConnection *, int, int, int)); +static void ximShouldNotBeSentProc _Pt_((IMConnection *, int, int, int)); +static void ximAuthPhaseProc _Pt_((IMConnection *, int, int, int)); +static void ximNopProc _Pt_((IMConnection *, int, int, int)); + +/* + * Core request table + */ +static IMRequest coreRequestTbl[] = { + { "CONNECT", XIM_CONNECT, 0, ximAlreadyConnectedProc }, + { "CONNECT-REPLY", XIM_CONNECT_REPLY, 0, ximShouldNotBeSentProc }, + { "DISCONNECT", XIM_DISCONNECT, 0, ximDisconnectProc }, + { "DISCONNECT-REPLY", XIM_DISCONNECT_REPLY, 0, ximShouldNotBeSentProc }, + { "AUTH-REQUIRED", XIM_AUTH_REQUIRED, 0, ximAuthPhaseProc }, + { "AUTH-REPLY", XIM_AUTH_REPLY, 0, ximAuthPhaseProc }, + { "AUTH-NEXT", XIM_AUTH_NEXT, 0, ximAuthPhaseProc }, + { "AUTH-SETUP", XIM_AUTH_SETUP, 0, ximShouldNotBeSentProc }, + { "AUTH-NG", XIM_AUTH_NG, 0, ximAuthPhaseProc }, + { "ERROR", XIM_ERROR, 0, ximErrorProc }, + { "OPEN", XIM_OPEN, 0, ximOpenProc }, + { "OPEN-REPLY", XIM_OPEN_REPLY, 0, ximShouldNotBeSentProc }, + { "CLOSE", XIM_CLOSE, 0, ximCloseProc }, + { "CLOSE-REPLY", XIM_CLOSE_REPLY, 0, ximShouldNotBeSentProc }, + { "SET-EVENT-MASK", XIM_SET_EVENT_MASK, 0, ximShouldNotBeSentProc }, + { "REGISTER-TRIGGERKEYS", XIM_REGISTER_TRIGGERKEYS, 0, + ximShouldNotBeSentProc }, + { "TRIGGER-NOTIFY", XIM_TRIGGER_NOTIFY, 0, ximTriggerNotifyProc }, + { "TRIGGER-NOTIFY-REPLY", XIM_TRIGGER_NOTIFY_REPLY, 0, + ximShouldNotBeSentProc }, + { "ENCODING-NEGOTIATION", XIM_ENCODING_NEGOTIATION, 0, + ximEncodingNegotiationProc }, + { "ENCODING-NEGOTIATION-REPLY", XIM_ENCODING_NEGOTIATION_REPLY, 0, + ximShouldNotBeSentProc }, + { "QUERY-EXTENSION", XIM_QUERY_EXTENSION, 0, ximQueryExtensionProc }, + { "QUERY-EXTENSION-REPLY", XIM_QUERY_EXTENSION_REPLY, 0, + ximShouldNotBeSentProc }, + { "SET-IM-VALUES", XIM_SET_IM_VALUES, 0, ximSetIMValuesProc }, + { "SET-IM-VALUES-REPLY", XIM_SET_IM_VALUES_REPLY, 0, + ximShouldNotBeSentProc }, + { "GET-IM-VALUES", XIM_GET_IM_VALUES, 0, ximGetIMValuesProc }, + { "GET-IM-VALUES-REPLY", XIM_GET_IM_VALUES_REPLY, 0, + ximShouldNotBeSentProc }, + { "CREATE-IC", XIM_CREATE_IC, 0, ximCreateICProc }, + { "CREATE-IC-REPLY", XIM_CREATE_IC_REPLY, 0, ximShouldNotBeSentProc }, + { "DESTROY-IC", XIM_DESTROY_IC, 0, ximDestroyICProc }, + { "DESTROY-IC-REPLY", XIM_DESTROY_IC_REPLY, 0, ximShouldNotBeSentProc }, + { "SET-IC-VALUES", XIM_SET_IC_VALUES, 0, ximSetICValuesProc }, + { "SET-IC-VALUES-REPLY", XIM_SET_IC_VALUES_REPLY, 0, + ximShouldNotBeSentProc }, + { "GET-IC-VALUES", XIM_GET_IC_VALUES, 0, ximGetICValuesProc }, + { "GET-IC-VALUES-REPLY", XIM_GET_IC_VALUES_REPLY, 0, + ximShouldNotBeSentProc }, + { "SET-IC-FOCUS", XIM_SET_IC_FOCUS, 0, ximSetICFocusProc }, + { "UNSET-IC-FOCUS", XIM_UNSET_IC_FOCUS, 0, ximUnsetICFocusProc }, + { "FORWARD-EVENT", XIM_FORWARD_EVENT, 0, ximForwardEventProc }, + { "SYNC", XIM_SYNC, 0, ximSyncProc }, + { "SYNC-REPLY", XIM_SYNC_REPLY, 0, ximSyncReplyProc }, + { "COMMIT", XIM_COMMIT, 0, ximShouldNotBeSentProc }, + { "RESET-IC", XIM_RESET_IC, 0, ximResetICProc }, + { "RESET-IC-REPLY", XIM_RESET_IC_REPLY, 0, ximShouldNotBeSentProc }, + { "GEOMETRY", XIM_GEOMETRY, 0, ximShouldNotBeSentProc }, + { "STR-CONVERSION", XIM_STR_CONVERSION, 0, ximShouldNotBeSentProc }, + { "STR-CONVERSION-REPLY", XIM_STR_CONVERSION_REPLY, 0, + ximShouldNotBeSentProc }, + { "PREEDIT-START", XIM_PREEDIT_START, 0, ximShouldNotBeSentProc }, + { "PREEDIT-START-REPLY", XIM_PREEDIT_START_REPLY, 0, + ximNopProc }, + { "PREEDIT-DRAW", XIM_PREEDIT_DRAW, 0, ximShouldNotBeSentProc }, + { "PREEDIT-CARET", XIM_PREEDIT_CARET, 0, ximShouldNotBeSentProc }, + { "PREEDIT-CARET-REPLY", XIM_PREEDIT_CARET_REPLY, 0, + ximNopProc }, + { "PREEDIT-DONE", XIM_PREEDIT_DONE, 0, ximShouldNotBeSentProc }, + { "PREEDITSTATE", XIM_PREEDITSTATE, 0, ximShouldNotBeSentProc }, + { "STATUS-START", XIM_STATUS_START, 0, ximShouldNotBeSentProc }, + { "STATUS-DRAW", XIM_STATUS_DRAW, 0, ximShouldNotBeSentProc }, + { "STATUS-DONE", XIM_STATUS_DONE, 0, ximShouldNotBeSentProc }, + { NULL, 0, 0, NULL }, +}; + +/* + * Extension request table + */ +static IMRequest extRequestTbl[] = { + { "XIM_EXT_SET_EVENT_MASK", XIM_EXT_SET_EVENT_MASK, 0, + ximShouldNotBeSentProc, XIM_EXT_SET_EVENT_MASK_MASK }, + { "XIM_EXT_FORWARD_KEYEVENT", XIM_EXT_FORWARD_KEYEVENT, 0, + ximExtForwardKeyeventProc, XIM_EXT_FORWARD_KEYEVENT_MASK }, + { "XIM_EXT_MOVE", XIM_EXT_MOVE, 0, + ximExtMoveProc, XIM_EXT_MOVE_MASK }, + { NULL, 0, 0, NULL }, +}; + +/* + * Request dispatch table (global) + */ +IMRequest *IMMainDispatchTable[256]; + + +static void compileTbl _Pt_((IMRequest *req)); +static char *ecode2str _Pt_((int code)); +static void putTriggerkeyList _Pt_((IMIM *imp)); +static int findCtext _Pt_((IMConnection *conn, int arglen)); +static IMRequest *getExtension _Pt_((char *name)); +static void putExtension _Pt_((IMConnection *conn, IMRequest *req)); +static void swapData _Pt_((char *data, char *format)); +static int getEvent _Pt_((IMConnection *conn, unsigned int serial, + int offset, XEvent *ev)); +static void postponeEvent _Pt_((IMIC *icp, int synchronous, XEvent *ev)); +static void handleForwardedEvent _Pt_((IMIC *icp, int synchronous, XEvent *ev)); +static void processPendingEvents _Pt_((IMIC *icp, + IMPendingEvent *pending_event)); + + +/*- compileTbl: assemble IMMainDispatchTbl -*/ +static void +compileTbl(req) +IMRequest *req; +{ + while (req->name != NULL) { + req->next = IMMainDispatchTable[req->major]; + IMMainDispatchTable[req->major] = req; + req++; + } +} + +/*- ximDisconnectProc: handle XIM_DISCONNECT request -*/ +/* ARGSUSED */ +static void +ximDisconnectProc(conn, major, minor, arglen) +IMConnection *conn; +int major; +int minor; +int arglen; +{ + IMIM *imp = conn->im_list; + IMIM *imp_next; + + TRACE(("ximDisconnectProc(#%d)\n", conn->serial)); + + if (arglen != 0) { + DPRINT(("ximDisconnectProc: arglen != 0\n")); + IMSendBadLength(conn, 0, 0); + return; + } + + while (imp != NULL) { + imp_next = imp->next; + IMDestroyIM(imp); + imp = imp_next; + } + IMSendSimpleRequest(conn, XIM_DISCONNECT_REPLY, 0); + IMSchedule(conn, SCHED_CLOSE); +} + +/*- ecode2str: error code to error name string converter -*/ +static char * +ecode2str(code) +int code; +{ + char *s; + + switch (code) { + case IMBadAlloc: s = "BadAlloc"; break; + case IMBadStyle: s = "BadStyle"; break; + case IMBadClientWindow: s = "BadClientWindow"; break; + case IMBadFocusWindow: s = "BadFocusWindow"; break; + case IMBadArea: s = "BadArea"; break; + case IMBadSpotLocation: s = "BadSpotLocation"; break; + case IMBadColormap: s = "BadColormap"; break; + case IMBadAtom: s = "BadAtom"; break; + case IMBadPixel: s = "BadPixel"; break; + case IMBadPixmap: s = "BadPixmap"; break; + case IMBadName: s = "BadName"; break; + case IMBadCursor: s = "BadCursor"; break; + case IMBadProtocol: s = "BadProtocol"; break; + case IMBadForeground: s = "BadForeground"; break; + case IMBadBackground: s = "BadBackground"; break; + case IMLocaleNotSupported: s = "LocaleNotSupported"; break; + case IMBadSomething: s = "BadSomething"; break; + default: s = "? (undefined error code)"; break; + } + return s; +} + +/*- ximErrorProc: handle XIM_Error messsage -*/ +/* ARGSUSED */ +static void +ximErrorProc(conn, major, minor, arglen) +IMConnection *conn; +int major; +int minor; +int arglen; +{ + unsigned int imid, icid; + int flag; + int code; + int msg_len; + char msg[256 + 1]; + + TRACE(("ximErrorProc(#%d)\n", conn->serial)); + + if (arglen < 10) { + DPRINT(("corrupted XIM_ERROR message (arglen < 10) received\n")); + return; + } + imid = IMGetC16(conn, 0); + icid = IMGetC16(conn, 2); + flag = IMGetC16(conn, 4); + code = IMGetC16(conn, 6); + msg_len = IMGetC16(conn, 8); + if (msg_len > 0) { + if (msg_len + 12 > arglen) { + DPRINT(("corrupted XIM_ERROR message (message too long) received\n")); + return; + } + if (msg_len > 256) msg_len = 256; + IMGetString(conn, 12, msg, msg_len); + } + if (DEBUG_CONDITION) { + printf("** XIM_ERROR message received:\n"); + if (flag & 1) { + printf("\t input-method ID: %d\n", imid); + } else { + printf("\t input-method ID: N/A\n"); + } + if (flag & 2) { + printf("\tinput-context ID: %d\n", icid); + } else { + printf("\tinput-context ID: N/A\n"); + } + printf("\t error code: %s\n", ecode2str(code)); + printf("\t error message: %s\n", msg); + } +} + +/*- putTriggerkeyList: put trigger key list on the output stream -*/ +static void +putTriggerkeyList(imp) +IMIM *imp; +{ + IMConnection *conn = imp->connection; + IMTriggerKey *triggers; + int num_triggers; + int i; + + triggers = IMTriggerKeys(imp, &num_triggers); + + IMPutC32(conn, (unsigned long)(12 * num_triggers)); + for (i = 0; i < num_triggers; i++) { + IMPutC32(conn, triggers[i].keysym); + IMPutC32(conn, (unsigned long)triggers[i].modifiers); + IMPutC32(conn, (unsigned long)triggers[i].check_modifiers); + } +} + +/*- ximOpenProc: handle XIM_OPEN request -*/ +/* ARGSUSED */ +static void +ximOpenProc(conn, major, minor, arglen) +IMConnection *conn; +int major; +int minor; +int arglen; +{ + int locale_len; + char localename[256 + 1]; + int offset; + IMConverter *icp; + IMIM *imp; + + TRACE(("ximOpenProc(#%d)\n", conn->serial)); + + if (arglen < 1) { + DPRINT(("ximOpenProc: arglen < 1\n")); + IMSendBadLength(conn, 0, 0); + return; + } + + locale_len = IMGetC8(conn, 0); + if (arglen < locale_len + 1) { + DPRINT(("ximOpenProc: locale too long\n")); + IMSendBadLength(conn, 0, 0); + return; + } + + bcopy(IMBUFDATA(IM_INBUF(conn)) + 1, localename, locale_len); + localename[locale_len] = '\0'; + TRACE(("\tlocalename: %s\n", localename)); + + if ((icp = IMGetConverter(conn->proto_widget, localename)) == NULL) { + DPRINT(("ximOpenProc: unsupported locale %s\n", localename)); + IMSendError(conn, IMLocaleNotSupported, 0, 0, "unknown locale"); + return; + } + + imp = IMCreateIM(conn, icp); + + /* + * Send open reply message. + */ + offset = IMPutHeader(conn, XIM_OPEN_REPLY, 0, 0); + IMPutC16(conn, imp->id); + IMPutIMAttrList(imp); + IMPutICAttrList(imp); + IMFinishRequest(conn, offset); + + /* + * Notify conversion trigger keys. + * + * Note: + * The spec says that XIM_REGISTER_TRIGGERKEYS message should + * be sent to the client bofore XIM_OPEN_REPLY message, in + * order to use dynamic event flow model. However, this + * does not work with current Xlib implementation. So we + * send XIM_REGISTER_TRIGGERKEYS just after XIM_OPEN_REPLY, + * which works fine. + */ + offset = IMPutHeader(conn, XIM_REGISTER_TRIGGERKEYS, 0, 0); + IMPutC16(conn, imp->id); + IMPutC16(conn, 0); + putTriggerkeyList(imp); + IMFinishRequest(conn, offset); +} + +/*- ximCloseProc: handle XIM_CLOSE request -*/ +/* ARGSUSED */ +static void +ximCloseProc(conn, major, minor, arglen) +IMConnection *conn; +int major; +int minor; +int arglen; +{ + IMIM *imp; + + TRACE(("ximCloseProc(#%d)\n", conn->serial)); + + if ((imp = IMGetIM(conn, arglen)) == NULL) return; + if (arglen != 4) { + DPRINT(("ximCloseProc: arglen != 4\n")); + IMSendBadLength(conn, imp->id, 0); + return; + } + + IMPutHeader(conn, XIM_CLOSE_REPLY, 0, 4); + IMPutC16(conn, imp->id); + IMPutPad(conn); + IMSchedule(conn, SCHED_WRITE); + + IMDestroyIM(imp); +} + +/*- ximTriggerNotifyProc: handle XIM_TRIGGER_NOTIFY request -*/ +/* ARGSUSED */ +static void +ximTriggerNotifyProc(conn, major, minor, arglen) +IMConnection *conn; +int major; +int minor; +int arglen; +{ + IMIC *icp; + int flag; + int key_index; + int num_triggers; + + TRACE(("ximTriggerNotifyProc(#%d)\n", conn->serial)); + + if ((icp = IMGetIC(conn, arglen)) == NULL) return; + + if (arglen != 16) { + DPRINT(("ximTriggerNotifyProc: arglen != 16\n")); + IMSendBadLength(conn, icp->im->id, icp->id); + return; + } + + flag = (int)IMGetC32(conn, 4); + key_index = (int)IMGetC32(conn, 8); + TRACE(("\tflag=%d, index=%d\n", flag, key_index)); + + /* + * Check flag and index. Since kinput2 does not + * specifiy off-keys, any off-key notifications + * are invalid. + * The current Xlib implementation (as of pl4) + * specifies incorrect key_index, so index check + * is turned off until the bug is fixed. + */ + + (void)IMTriggerKeys(icp->im, &num_triggers); + if (flag != 0 +#ifndef XIM_BC + || key_index >= num_triggers +#endif /* XIM_BC */ + ) { + /* invalid parameter */ + DPRINT(("ximTriggerNotifyProc: invalid trigger spec.\n")); + IMSendError(conn, IMBadSomething, icp->im->id, icp->id, + "invalid trigger key specification"); + return; + } + + /* + * If we are already in conversion mode, do nothing special. + */ + if (!(icp->state & IC_CONVERTING)) { + /* + * Start conversion. + */ + if (IMStartConversion(icp) < 0) return; + } + + /* + * Send XIM_TRIGGER_NOTIFY_REPLY request. + */ + (void)IMPutHeader(conn, XIM_TRIGGER_NOTIFY_REPLY, 0, 4); + IMPutC16(conn, icp->im->id); + IMPutC16(conn, icp->id); + IMSchedule(conn, SCHED_WRITE); +} + +/*- findCtext: look up COMPOUND_TEXT from encoding list -*/ +static int +findCtext(conn, arglen) +IMConnection *conn; +int arglen; +{ + int offset, name_end; + int encoding_index; + unsigned int name_bytes; + + offset = 2; + name_bytes = IMGetC16(conn, offset); + offset += 2; + name_end = offset + name_bytes; + if (name_end > arglen) return -2; + + /* + * Examine encodings listed by name. + */ + encoding_index = 0; + while (offset < name_end) { + char str_buf[256 + 1]; + int str_len; + + str_len = IMGetC8(conn, offset++); + IMGetString(conn, offset, str_buf, str_len); + if (!strcmp(str_buf, "COMPOUND_TEXT")) { + return encoding_index; + } + offset += str_len; + encoding_index++; + } + + /* + * Encodings listed by detailed data follow, but + * I have no idea what they are. + */ + return -1; +} + +/*- ximEncodingNegotiationProc: handle XIM_ENCODING_NEGOTIATION request -*/ +/* ARGSUSED */ +static void +ximEncodingNegotiationProc(conn, major, minor, arglen) +IMConnection *conn; +int major; +int minor; +int arglen; +{ + IMIM *imp; + int encoding_index; + + TRACE(("ximEncodingNegotiationProc(#%d)\n", conn->serial)); + + if ((imp = IMGetIM(conn, arglen)) == NULL) return; + + if (arglen < 8) { + DPRINT(("ximEncodingNegotiationProc: arglen < 8\n")); + IMSendBadLength(conn, imp->id, 0); + return; + } + + /* + * Always use COMPOUND_TEXT. + */ + if ((encoding_index = findCtext(conn, arglen)) < -1) { + /* bad argument error */ + DPRINT(("ximEncodingNegotiationProc: encoding list corrupted\n")); + IMSendError(conn, IMBadSomething, imp->id, 0, + "corrupted argument"); + return; + } + TRACE(("\tselected encoding index: %d\n", encoding_index)); + + (void)IMPutHeader(conn, XIM_ENCODING_NEGOTIATION_REPLY, 0, 8); + IMPutC16(conn, imp->id); + IMPutC16(conn, 0); + IMPutI16(conn, encoding_index); + IMPutPad(conn); + IMSchedule(conn, SCHED_WRITE); +} + +/*- getExtension: search named extension -*/ +static IMRequest * +getExtension(name) +char *name; +{ + IMRequest *req = extRequestTbl; + + while (req->name != NULL) { + if (!strcmp(req->name, name)) return req; + req++; + } + return NULL; +} + +/*- putExtension: put extension information on the output stream -*/ +static void +putExtension(conn, req) +IMConnection *conn; +IMRequest *req; +{ + int text_length; + + text_length = strlen(req->name); + IMPutC8(conn, req->major); + IMPutC8(conn, req->minor); + IMPutC16(conn, (unsigned int)text_length); + IMPutString(conn, req->name, text_length); + IMPutPad(conn); +} + +/*- ximQueryExtensionProc: handle XIM_QUERY_EXTENSION request -*/ +/* ARGSUSED */ +static void +ximQueryExtensionProc(conn, major, minor, arglen) +IMConnection *conn; +int major; +int minor; +int arglen; +{ + IMIM *imp; + int ext_len; + int cur_off; + int req_offset; + int size_offset; + int list_start, list_end; + + TRACE(("ximQueryExtensionProc(#%d)\n", conn->serial)); + + if ((imp = IMGetIM(conn, arglen)) == NULL) return; + if (arglen < 4) { + DPRINT(("ximQueryExtensionProc: arglen < 4\n")); + IMSendBadLength(conn, imp->id, 0); + return; + } + ext_len = IMGetC16(conn, 2); + if (4 + ext_len > arglen) { + DPRINT(("ximQueryExtensionProc: extension list too long\n")); + IMSendBadLength(conn, imp->id, 0); + return; + } + cur_off = 4; + + req_offset = IMPutHeader(conn, XIM_QUERY_EXTENSION_REPLY, 0, 0); + IMPutC16(conn, imp->id); + size_offset = IMWritePos(conn); + IMPutC16(conn, 0); /* dummy. overwritten afterwards */ + + list_start = IMWritePos(conn); + + if (ext_len == 0) { + IMRequest *ext_req = extRequestTbl; + + while (ext_req->name != NULL) { + putExtension(conn, ext_req); + ext_req++; + } + + } else { + IMRequest *ext_req; + + while (ext_len > 1) { + int str_len; + char ext_name[256 + 1]; + + str_len = IMGetC8(conn, cur_off); + cur_off++; + + if (str_len + 1 > ext_len) { + DPRINT(("ximQueryExtensionProc: extension name too long\n")); + IMCancelRequest(conn, req_offset); + /* BadString */ + IMSendBadLength(conn, imp->id, 0); + return; + } + + IMGetString(conn, cur_off, ext_name, str_len); + TRACE(("\tclient queries %s extension\n", ext_name)); + + if ((ext_req = getExtension(ext_name)) != NULL) { + putExtension(conn, ext_req); + imp->mask |= ext_req->mask; + } + cur_off += str_len; + ext_len -= str_len + 1; + } + } + + list_end = IMWritePos(conn); + IMRewriteC16(conn, size_offset, (unsigned int)(list_end - list_start)); + + IMFinishRequest(conn, req_offset); +} + +/*- ximSetIMValuesProc: handle XIM_SET_IM_VALUES request -*/ +/* ARGSUSED */ +static void +ximSetIMValuesProc(conn, major, minor, arglen) +IMConnection *conn; +int major; +int minor; +int arglen; +{ + IMIM *imp; + char *attr; + int attr_len; + + TRACE(("ximSetIMValuesProc(#%d)\n", conn->serial)); + + if ((imp = IMGetIM(conn, arglen)) == NULL) return; + if (arglen < 4) { + DPRINT(("ximSetIMValuesProc: arglen < 4\n")); + IMSendBadLength(conn, imp->id, 0); + return; + } + + attr_len = IMGetC16(conn, 2); + attr = IMBUFDATA(IM_INBUF(conn)) + 4; + + if (arglen < attr_len + 4) { + DPRINT(("ximSetIMValuesProc: attribute len too long\n")); + IMSendBadLength(conn, imp->id, 0); + return; + } + + if (IMSetIMValues(imp, attr, attr_len, major) < 0) return; + + (void)IMPutHeader(conn, XIM_SET_IM_VALUES_REPLY, 0, 4); + IMPutC16(conn, imp->id); + IMPutPad(conn); + IMSchedule(conn, SCHED_WRITE); +} + +/*- ximGetIMValuesProc: handle XIM_GET_IM_VALUES request -*/ +/* ARGSUSED */ +static void +ximGetIMValuesProc(conn, major, minor, arglen) +IMConnection *conn; +int major; +int minor; +int arglen; +{ + IMIM *imp; + char *attr; + int attr_len; + int offset; + + TRACE(("ximGetIMValuesProc(#%d)\n", conn->serial)); + + if ((imp = IMGetIM(conn, arglen)) == NULL) return; + if (arglen < 4) { + DPRINT(("ximGetIMValuesProc: arglen < 4\n")); + IMSendBadLength(conn, imp->id, 0); + return; + } + + attr_len = IMGetC16(conn, 2); + attr = IMBUFDATA(IM_INBUF(conn)) + 4; + if (arglen < attr_len + 4 || attr_len % 2 == 1) { + DPRINT(("ximGetIMValuesProc: attr_len too long or an odd number\n")); + IMSendBadLength(conn, imp->id, 0); + return; + } + + offset = IMPutHeader(conn, XIM_GET_IM_VALUES_REPLY, 0, 0); + IMPutC16(conn, imp->id); + + if (IMGetIMValues(imp, attr, attr_len, offset) < 0) return; + + IMFinishRequest(conn, offset); +} + +/*- ximCreateICProc: handle XIM_CREATE_IC request -*/ +/* ARGSUSED */ +static void +ximCreateICProc(conn, major, minor, arglen) +IMConnection *conn; +int major; +int minor; +int arglen; +{ + IMIM *imp; + IMIC *icp; + char *attr_data; + int attr_len; + + TRACE(("ximCreateICProc(#%d)\n", conn->serial)); + + if ((imp = IMGetIM(conn, arglen)) == NULL) return; + if (arglen < 4) { + /* BadArglen */ + DPRINT(("ximCreateICProc: arglen < 4\n")); + IMSendBadLength(conn, imp->id, 0); + return; + } + + attr_len = IMGetC16(conn, 2); + attr_data = IMBUFDATA(IM_INBUF(conn)) + 4; + if (arglen < attr_len + 4) { + DPRINT(("ximCreateICProc: attr_len too long\n")); + IMSendBadLength(conn, imp->id, 0); + return; + } + icp = IMCreateIC(imp); + if (IMSetICValues(icp, attr_data, attr_len, major) < 0) { + IMDestroyIC(icp); + return; + } + IMSendRequestWithIC(conn, XIM_CREATE_IC_REPLY, 0, icp); + + IMStatusStart(icp); +} + +/*- ximDestroyICProc: handle XIM_DESTROY_IC request -*/ +/* ARGSUSED */ +static void +ximDestroyICProc(conn, major, minor, arglen) +IMConnection *conn; +int major; +int minor; +int arglen; +{ + IMIC *icp; + unsigned int imid, icid; + + TRACE(("ximDestroyICProc(#%d)\n", conn->serial)); + + if ((icp = IMGetIC(conn, arglen)) == NULL) return; + if (arglen != 4) { + DPRINT(("ximDestroyICProc: arglen != 4\n")); + IMSendBadLength(conn, icp->im->id, icp->id); + return; + } + + /* Save ID of IM/IC before IMDestroyIC() */ + imid = icp->im->id; + icid = icp->id; + + IMStatusDone(icp); + + IMDestroyIC(icp); + + /* IMSendRequestWithIC(conn, XIM_DESTROY_IC_REPLY, 0, icp); */ + IMPutHeader(conn, XIM_DESTROY_IC_REPLY, 0, 4); + IMPutC16(conn, imid); + IMPutC16(conn, icid); + IMSchedule(conn, SCHED_WRITE); +} + +/*- ximSetICValuesProc: handle XIM_SET_IC_VALUES request -*/ +/* ARGSUSED */ +static void +ximSetICValuesProc(conn, major, minor, arglen) +IMConnection *conn; +int major; +int minor; +int arglen; +{ + IMIC *icp; + char *attr; + int attr_len; + + TRACE(("ximSetICValuesProc(#%d)\n", conn->serial)); + + if ((icp = IMGetIC(conn, arglen)) == NULL) return; + if (arglen < 8) { + DPRINT(("ximSetICValuesProc: arglen < 8\n")); + IMSendBadLength(conn, icp->im->id, icp->id); + return; + } + + attr_len = IMGetC16(conn, 4); + attr = IMBUFDATA(IM_INBUF(conn)) + 8; + + if (arglen < attr_len + 8) { + DPRINT(("ximSetICValuesProc: attr_len too long\n")); + IMSendBadLength(conn, icp->im->id, icp->id); + return; + } + + if (IMSetICValues(icp, attr, attr_len, major) < 0) return; + + IMSendRequestWithIC(conn, XIM_SET_IC_VALUES_REPLY, 0, icp); +} + +/*- ximGetICValuesProc: handle XIM_GET_IC_VALUES request -*/ +/* ARGSUSED */ +static void +ximGetICValuesProc(conn, major, minor, arglen) +IMConnection *conn; +int major; +int minor; +int arglen; +{ + IMIC *icp; + char *attr; + int attr_len; + int offset; + + TRACE(("ximGetICValuesProc(#%d)\n", conn->serial)); + + if ((icp = IMGetIC(conn, arglen)) == NULL) return; + if (arglen < 6) { + DPRINT(("ximGetICValuesProc: arglen < 6\n")); + IMSendBadLength(conn, icp->im->id, icp->id); + return; + } + + attr_len = IMGetC16(conn, 4); + attr = IMBUFDATA(IM_INBUF(conn)) + 6; + if (arglen < attr_len + 6 || attr_len % 2 == 1) { + DPRINT(("ximGetICValuesProc: attr_len too long or an odd number\n")); + IMSendBadLength(conn, icp->im->id, icp->id); + return; + } + + offset = IMPutHeader(conn, XIM_GET_IC_VALUES_REPLY, 0, 0); + IMPutC16(conn, icp->im->id); + IMPutC16(conn, icp->id); + + if (IMGetICValues(icp, attr, attr_len, offset) < 0) return; + + IMFinishRequest(conn, offset); +} + +/*- ximSetICFocusProc: handle XIM_SET_IC_FOCUS request -*/ +/* ARGSUSED */ +static void +ximSetICFocusProc(conn, major, minor, arglen) +IMConnection *conn; +int major; +int minor; +int arglen; +{ + IMIC *icp; + + TRACE(("ximSetICFocusProc(#%d)\n", conn->serial)); + + if ((icp = IMGetIC(conn, arglen)) == NULL) return; + if (arglen != 4) { + DPRINT(("ximSetICFocusProc: arglen != 4\n")); + IMSendBadLength(conn, icp->im->id, icp->id); + return; + } + IMStatusStart(icp); + IMSetFocus(icp); +} + +/*- ximUnsetICFocusProc: handle XIM_UNSET_IC_FOCUS request -*/ +/* ARGSUSED */ +static void +ximUnsetICFocusProc(conn, major, minor, arglen) +IMConnection *conn; +int major; +int minor; +int arglen; +{ + IMIC *icp; + + TRACE(("ximUnsetICFocusProc(#%d)\n", conn->serial)); + + if ((icp = IMGetIC(conn, arglen)) == NULL) return; + if (arglen != 4) { + DPRINT(("ximUnsetICFocusProc: arglen != 4\n")); + IMSendBadLength(conn, icp->im->id, icp->id); + return; + } + IMUnsetFocus(icp); + IMStatusDone(icp); +} + +/*- swapData: do byte swapping -*/ +static void +swapData(data, format) +char *data; +char *format; +{ + unsigned char *p = (unsigned char *)data; + int x; + int f; + +#define SWAPB(b1, b2) x = b1; b1 = b2; b2 = x + while ((f = *format++) != '\0') { + switch (f) { + case 'x': + p++; + break; + case 'l': + SWAPB(p[0], p[3]); + SWAPB(p[1], p[2]); + p += 4; + break; + case 's': + SWAPB(p[0], p[1]); + p += 2; + break; + } + } +#undef SWAPB +} + + +/*- getEvent: read a wire event and convert it to XEvent format -*/ +static int +getEvent(conn, serial, offset, ev) +IMConnection *conn; +unsigned int serial; +int offset; +XEvent *ev; +{ + IMBuffer *ibp = IM_INBUF(conn); + xEvent wire_event; + int swap_needed; + int one = 1; + char *onep = (char *)&one; + + /* + * Get wire event from input buffer. + */ + bcopy(IMBUFDATA(ibp) + offset, (char *)&wire_event, sizeof(wire_event)); + + /* + * Do we need byte swapping? + */ + if (*onep == 0) { /* big endian */ + swap_needed = (conn->byte_order == ORDER_LITTLE); + } else { /* little endian */ + swap_needed = (conn->byte_order == ORDER_BIG); + } + +#define SWAPEV(format) if (swap_needed) swapData((char *)&wire_event, format) + + /* + * Get common part of the wire event. + */ + SWAPEV("xxs"); + ev->type = wire_event.u.u.type & 0x7f; + ev->xany.serial = (serial << 16) | wire_event.u.u.sequenceNumber; + ev->xany.display = XtDisplay(conn->proto_widget); + ev->xany.send_event = wire_event.u.u.type > 127; + + /* + * Convert wire format to XEvent format. + */ + switch (ev->type) { + case KeyPress: + case KeyRelease: + SWAPEV("xxxxllllsssssxx"); +#define WIRE wire_event.u.keyButtonPointer + ev->xkey.window = WIRE.event; + ev->xkey.root = WIRE.root; + ev->xkey.subwindow = WIRE.child; + ev->xkey.time = WIRE.time; + ev->xkey.x = cvtINT16toInt(WIRE.eventX); + ev->xkey.y = cvtINT16toInt(WIRE.eventY); + ev->xkey.x_root = cvtINT16toInt(WIRE.rootX); + ev->xkey.y_root = cvtINT16toInt(WIRE.rootY); + ev->xkey.state = WIRE.state; + ev->xkey.keycode = wire_event.u.u.detail; + ev->xkey.same_screen = WIRE.sameScreen; +#undef WIRE + break; + case ButtonPress: + case ButtonRelease: + SWAPEV("xxxxllllsssssxx"); +#define WIRE wire_event.u.keyButtonPointer + ev->xbutton.window = WIRE.event; + ev->xbutton.root = WIRE.root; + ev->xbutton.subwindow = WIRE.child; + ev->xbutton.time = WIRE.time; + ev->xbutton.x = cvtINT16toInt(WIRE.eventX); + ev->xbutton.y = cvtINT16toInt(WIRE.eventY); + ev->xbutton.x_root = cvtINT16toInt(WIRE.rootX); + ev->xbutton.y_root = cvtINT16toInt(WIRE.rootY); + ev->xbutton.state = WIRE.state; + ev->xbutton.button = wire_event.u.u.detail; + ev->xbutton.same_screen = WIRE.sameScreen; +#undef WIRE + break; + case MotionNotify: + SWAPEV("xxxxllllsssssxx"); +#define WIRE wire_event.u.keyButtonPointer + ev->xmotion.window = WIRE.event; + ev->xmotion.root = WIRE.root; + ev->xmotion.subwindow = WIRE.child; + ev->xmotion.time = WIRE.time; + ev->xmotion.x = cvtINT16toInt(WIRE.eventX); + ev->xmotion.y = cvtINT16toInt(WIRE.eventY); + ev->xmotion.x_root = cvtINT16toInt(WIRE.rootX); + ev->xmotion.y_root = cvtINT16toInt(WIRE.rootY); + ev->xmotion.state = WIRE.state; + ev->xmotion.is_hint = wire_event.u.u.detail; + ev->xmotion.same_screen = WIRE.sameScreen; +#undef WIRE + break; + default: + /* + * For now, this function deals only Key/Pointer events. + */ + return 0; + } +#undef SWAPEV + + return 1; /* success */ +} + +/*- postponeEvent: record events for delayed processing -*/ +static void +postponeEvent(icp, synchronous, ev) +IMIC *icp; +int synchronous; +XEvent *ev; +{ + IMPendingEvent *pending; + + pending = XtNew(IMPendingEvent); + pending->ic = icp; + pending->synchronous = synchronous; + bcopy((char *)ev, (char *)&pending->event, sizeof(XEvent)); + pending->next = icp->pending_events; + icp->pending_events = pending; +} + +/*- handleForwardedEvent: deal with forwarded events -*/ +static void +handleForwardedEvent(icp, synchronous, ev) +IMIC *icp; +int synchronous; +XEvent *ev; +{ + IMConnection *conn = icp->im->connection; + + TRACE(("handleForwardedEvent()\n")); + + icp->state |= IC_FORWARDING; + + if (icp->state & IC_SYNCING) { + /* + * We are waiting for SYNC_REPLY message. + * Postpone event processing. + */ + DDPRINT(2, ("forward event processing suspended\n")); + postponeEvent(icp, synchronous, ev); + return; + } + + IMForwardEvent(icp, ev); + +#ifdef notyet + if (synchronous) { + if (!(icp->state & IC_CONVERTING)) { + /* + * Stop forwarding key events. + */ + IMStopForwarding(icp); + } + /* + * All the processing is done. Send XIM_SYNC_REPLY. + */ + IMSendRequestWithIC(conn, XIM_SYNC_REPLY, 0, icp); + } else { + int cur_pos2; + + cur_pos2 = IMWritePos(conn); + if (!(icp->state & IC_CONVERTING)) { + /* + * Stop forwarding key events. + */ + IMStopForwarding(icp); + /* + * Put dummy commit request (for setting sync flag). + */ + } + } +#else + /* + * Currently, kinput2 supports only full synchronous method. + */ + if (!(icp->state & IC_CONVERTING)) { + /* + * Stop forwarding key events. + */ + IMStopForwarding(icp); + } + /* + * All the processing is done. Send XIM_SYNC_REPLY. + */ + if (icp->state & IC_FORWARDING) { + icp->state &= ~IC_FORWARDING; + IMSendRequestWithIC(conn, XIM_SYNC_REPLY, 0, icp); + } +#endif +} + +/*- ximForwardEventProc: handle XIM_FORWARD_EVENT request -*/ +/* ARGSUSED */ +static void +ximForwardEventProc(conn, major, minor, arglen) +IMConnection *conn; +int major; +int minor; +int arglen; +{ + IMIC *icp; + int synchronous; + unsigned int serial; + XEvent event; + + TRACE(("ximForwardEventProc(#%d)\n", conn->serial)); + + if ((icp = IMGetIC(conn, arglen)) == NULL) return; + if (arglen != 40) { + DPRINT(("ximForwardEventProc: arglen != 40\n")); + IMSendBadLength(conn, icp->im->id, icp->id); + return; + } + + synchronous = IMGetC16(conn, 4) & 1; + serial = IMGetC16(conn, 6); + + if (getEvent(conn, serial, 8, &event)) { + handleForwardedEvent(icp, synchronous, &event); + } +} + +/*- ximExtForwardKeyeventProc: handle XIM_EXT_FORWARD_KEYEVENT_MASK request -*/ +/* ARGSUSED */ +static void +ximExtForwardKeyeventProc(conn, major, minor, arglen) +IMConnection *conn; +int major; +int minor; +int arglen; +{ + IMIC *icp; + int synchronous; + int type; + unsigned int serial; + XEvent event; + + TRACE(("ximExtForwardKeyeventProc(#%d)\n", conn->serial)); + + if ((icp = IMGetIC(conn, arglen)) == NULL) return; + + if (!(icp->im->mask & XIM_EXT_FORWARD_KEYEVENT_MASK)) { + DPRINT(("ximExtForwardKeyeventProc: ext_forward_keyevent disabled\n")); + IMSendBadProtocol(conn, "ext_forward_keyevent extension not enabled"); + return; + } + + if (arglen != 16) { + DPRINT(("ximExtForwardKeyeventProc: arglen != 16\n")); + IMSendBadLength(conn, icp->im->id, icp->id); + return; + } + + synchronous = IMGetC16(conn, 4) & 1; + serial = IMGetC16(conn, 6); + type = IMGetC8(conn, 8); + if (type != KeyPress && type != KeyRelease) { + /* Badtype */ + IMSendError(conn, IMBadSomething, icp->im->id, icp->id, + "forwarded event is invalid type"); + return; + } + + event.type = type; + event.xkey.serial = serial; /* ??? */ + event.xkey.keycode = IMGetC8(conn, 9); + event.xkey.state = IMGetC16(conn, 10); + event.xkey.time = IMGetC32(conn, 12); + event.xkey.window = IMGetC32(conn, 16); + event.xkey.root = icp->client_profile.root; + event.xkey.subwindow = None; + event.xkey.x = 0; + event.xkey.y = 0; + event.xkey.x_root = 0; + event.xkey.y_root = 0; + event.xkey.same_screen = True; + + handleForwardedEvent(icp, synchronous, &event); +} + +/*- ximSyncProc: handle XIM_SYNC request -*/ +/* ARGSUSED */ +static void +ximSyncProc(conn, major, minor, arglen) +IMConnection *conn; +int major; +int minor; +int arglen; +{ + IMIC *icp; + + TRACE(("ximSyncProc(#%d)\n", conn->serial)); + + if ((icp = IMGetIC(conn, arglen)) == NULL) return; + if (arglen != 4) { + DPRINT(("ximSyncProc: arglen != 4\n")); + IMSendBadLength(conn, icp->im->id, icp->id); + return; + } + IMSendRequestWithIC(conn, XIM_SYNC_REPLY, 0, icp); +} + +/*- processPendingEvents: process pending events forwarded by the client -*/ +static void +processPendingEvents(icp, pending_event) +IMIC *icp; +IMPendingEvent *pending_event; +{ + /* + * Pending events list is in reverse order. + * Processing is done from the tail of the list, using + * recursive call. + */ + if (pending_event == NULL) return; + processPendingEvents(icp, pending_event->next); + pending_event->next = NULL; + handleForwardedEvent(icp, pending_event->synchronous, + &pending_event->event); + XtFree((char *)pending_event); +} + +/*- ximSyncReplyProc: handle XIM_SYNC_REPLY message -*/ +/* ARGSUSED */ +static void +ximSyncReplyProc(conn, major, minor, arglen) +IMConnection *conn; +int major; +int minor; +int arglen; +{ + IMIC *icp; + + TRACE(("ximSyncReplyProc(#%d)\n", conn->serial)); + + if ((icp = IMGetIC(conn, arglen)) == NULL) return; + if (arglen != 4) { + DPRINT(("ximSyncReplyProc: arglen != 4\n")); + return; + } + if (icp->state & IC_SYNCING) { + icp->state &= ~IC_SYNCING; + processPendingEvents(icp, icp->pending_events); + } +} + +/*- ximResetICProc: handle XIM_RESET_IC message -*/ +/* ARGSUSED */ +static void +ximResetICProc(conn, major, minor, arglen) +IMConnection *conn; +int major; +int minor; +int arglen; +{ + IMIC *icp; + char *text = NULL; + int offset; + int text_length; + + TRACE(("ximResetICProc(#%d)\n", conn->serial)); + + if ((icp = IMGetIC(conn, arglen)) == NULL) return; + if (arglen != 4) { + DPRINT(("ximResetICProc: arglen != 4\n")); + IMSendBadLength(conn, icp->im->id, icp->id); + return; + } + icp->state |= IC_RESETTING; + text_length = IMResetIC(icp, &text); + + offset = IMPutHeader(conn, XIM_RESET_IC_REPLY, 0, 0); + IMPutC16(conn, icp->im->id); + IMPutC16(conn, icp->id); + IMPutC16(conn, (unsigned int)text_length); + if (text_length > 0) IMPutString(conn, text, text_length); + IMFinishRequest(conn, offset); + if (text != NULL) XtFree(text); + icp->state &= ~IC_RESETTING; +} + +/*- ximExtMoveProc: handle XIM_EXT_MOVE request -*/ +/* ARGSUSED */ +static void +ximExtMoveProc(conn, major, minor, arglen) +IMConnection *conn; +int major; +int minor; +int arglen; +{ + IMIC *icp; + int x, y; + + TRACE(("ximExtMoveProc(#%d)\n", conn->serial)); + + if ((icp = IMGetIC(conn, arglen)) == NULL) return; + x = IMGetI16(conn, 4); + y = IMGetI16(conn, 6); + IMMoveLocation(icp, x, y); +} + +/*- ximAlreadyConnectedProc: handle duplicate XIM_CONNECT request -*/ +/* ARGSUSED */ +static void +ximAlreadyConnectedProc(conn, major, minor, arglen) +IMConnection *conn; +int major; +int minor; +int arglen; +{ + TRACE(("ximAlreadyConnectedProc(#%d)\n", conn->serial)); + + DPRINT(("connection #%d sent multiple XIM_CONNECT request\n", + conn->serial)); + IMSendBadProtocol(conn, "duplicate XIM_CONNECT message"); +} + +/*- ximShouldNotBeSentProc: handle requests which clients should not send -*/ +/* ARGSUSED */ +static void +ximShouldNotBeSentProc(conn, major, minor, arglen) +IMConnection *conn; +int major; +int minor; +int arglen; +{ + TRACE(("ximShouldNotBeSentProc(#%d)\n", conn->serial)); + + DPRINT(("connection #%d sent invalid request\n", conn->serial)) + IMSendBadProtocol(conn, "Clients should not send this request"); +} + +/*- ximAuthPhaseProc: handle requests for authentication -*/ +/* ARGSUSED */ +static void +ximAuthPhaseProc(conn, major, minor, arglen) +IMConnection *conn; +int major; +int minor; +int arglen; +{ + TRACE(("ximAuthPhaseProc(#%d)\n", conn->serial)); + + DPRINT(("connection #%d sends auth-related request\n", conn->serial)); + IMSendBadProtocol(conn, "not authentication phase"); +} + +/*- ximNopProc: nop -*/ +/* ARGSUSED */ +static void +ximNopProc(conn, major, minor, arglen) +IMConnection *conn; +int major; +int minor; +int arglen; +{ + TRACE(("ximNopProc(#%d)\n", conn->serial)); + + /* do nothing */ +} + +/* + * Public Function + */ + +/*- IMCompileReq: initialize IMMainDispatchTable -*/ +void +IMCompileReq() +{ + static int compiled = 0; + + if (compiled) return; + compileTbl(coreRequestTbl); + compileTbl(extRequestTbl); + compiled = 1; +} diff -r 000000000000 -r 92745d501b9a lib/imlib/imxport.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/imlib/imxport.c Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,672 @@ +#ifndef lint +static char *rcsid = "$Id: imxport.c,v 1.11 1999/05/04 05:44:11 ishisone Exp $"; +#endif +/* + * Copyright (c) 1994 Software Research Associates, Inc. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Software Research Associates not be + * used in advertising or publicity pertaining to distribution of the + * software without specific, written prior permission. Software Research + * Associates makes no representations about the suitability of this software + * for any purpose. It is provided "as is" without express or implied + * warranty. + * + * Author: Makoto Ishisone, Software Research Associates, Inc., Japan + */ + +#include "im.h" + +#include "MyDispatch.h" + +#include + +#if (defined(IM_UNIX_TRANSPORT) || defined(IM_TCP_TRANSPORT)) +#include +#include +#endif + +#ifdef IM_UNIX_TRANSPORT +#include +#endif + +#ifdef IM_TCP_TRANSPORT +#include +#endif + +extern int errno; + +/* + * X transport version number + * This implementation uses: + * + ClientMessage (both single and multiple) + * + Property with notification by ClientMessage + * So the major version is 0, minor version is 2. + * + * X transport dividing size + * This size is the threshold between ClientMessage transfer + * and Property transfer. If the data to be sent is small, + * transfer via ClientMessage is faster. But since single + * ClientMessage can transfer only 20bytes, there must be a + * certain size above which the transfer via Property is + * faster. + */ +#define ServerMajorTransportVersion 0 +#define ServerMinorTransportVersion 2 +#define XTransportDividingSize (20 * 5) + + +static int dummyDispatcher _Pt_((IMConnection *conn)); +static void dumpBuf _Pt_((IMBuffer *ibp, char *title)); +static Window communicationWindow _Pt_((Widget w)); +static IMConnection *newConnection _Pt_((Widget protocol)); + +#if defined(IM_TCP_TRANSPORT) || defined(IM_UNIX_TRANSPORT) +static void socketinput _Pt_((XtPointer cldata, int *fdp, XtInputId *idp)); +static int socketFlush _Pt_((IMConnection *conn)); +static void socketShutdown _Pt_((IMConnection *conn)); + +static IMTransportOps SocketTransportOps = { + socketFlush, + socketShutdown, +}; +#endif /* IM_TCP_TRANSPORT || IM_UNIX_TRANSPORT */ + +#ifdef IM_X_TRANSPORT +static void xinput _Pt_((XEvent *ev, XtPointer cldata)); +static void xdestroy _Pt_((XEvent *ev, XtPointer cldata)); +static int xBrokenPipe _Pt_((Display *dpy, XErrorEvent *eev, + XPointer client_data)); +static int xFlush _Pt_((IMConnection *conn)); +static void xShutdown _Pt_((IMConnection *conn)); + +static IMTransportOps XTransportOps = { + xFlush, + xShutdown, +}; +#endif /* IM_X_TRANSPORT */ + + +/*- dummyDispatcher: dummy dispatcher routine -*/ +/* ARGSUSED */ +static int +dummyDispatcher(conn) +IMConnection *conn; +{ +#ifdef DEBUG + printf("dummyDispatcher -- this function should not be called!\n"); +#endif + return 0; /* for lint */ +} + +/*- dumpBuf: dump input/output buffer (for debug) -*/ +static void +dumpBuf(ibp, title) +IMBuffer *ibp; +char *title; +{ + int len = IMBUFLEN(ibp); + unsigned char *data = (unsigned char *)IMBUFDATA(ibp); + int i; + + printf("%s (%d bytes)", title, len); + for (i = 0; i < len; i++) { + if (i % 16 == 0) printf("\n\t"); + printf("%02x ", *data++); + } + printf("\n"); +} + +/*- communicationWindow: create a window for communication with client -*/ +static Window +communicationWindow(w) +Widget w; +{ + return XCreateSimpleWindow(XtDisplay(w), XtWindow(w), 0, 0, 1, 1, 0, 0, 0); +} + +/*- newConnection: allocate IMConnection structure and initialize -*/ +static IMConnection * +newConnection(protocol) +Widget protocol; +{ + IMConnection *conn; + static int connection_serial_number = 0; + + conn = (IMConnection *)XtMalloc(sizeof(IMConnection)); + + conn->serial = ++connection_serial_number; /* start from 1 */ + conn->dispatcher = dummyDispatcher; + + IMBufInit(&conn->in_buf); + IMBufInit(&conn->out_buf); + + conn->byte_order = ORDER_UNKNOWN; + conn->im_list = NULL; + conn->proto_widget = protocol; + + conn->schedule = 0; + conn->queue_next = NULL; + + conn->next = NULL; + + return conn; +} + +#if defined(IM_TCP_TRANSPORT) || defined(IM_UNIX_TRANSPORT) +/*- socketinput: handler for input from TCP/Unix socket -*/ +/* ARGSUSED */ +static void +socketinput(cldata, fdp, idp) +XtPointer cldata; +int *fdp; +XtInputId *idp; +{ + IMConnection *conn = (IMConnection *)cldata; + int fd = conn->transport.priv.sock.fd; + char buf[4096]; + int n; + int cond; + + if ((n = read(fd, buf, sizeof(buf))) < 0) { + cond = TRANSPORT_ERROR; + } else if (n == 0) { + cond = TRANSPORT_EOF; + } else { + IMBufAdd(&conn->in_buf, buf, n); + cond = TRANSPORT_OK; + } + + if (DDEBUG_CONDITION(100)) dumpBuf(IM_INBUF(conn), "** input buffer"); + + IMDispatch(conn, cond); +} + +/*- socketFlush: output to socket -*/ +static int +socketFlush(conn) +IMConnection *conn; +{ + int fd = conn->transport.priv.sock.fd; + IMBuffer *ibp = IM_OUTBUF(conn); + int n; + + if ((n = write(fd, ibp->buf, IMBUFLEN(ibp))) < 0) { + return TRANSPORT_ERROR; + } else { + IMBufDiscard(ibp, n); + return (IMBUFLEN(ibp) == 0) ? TRANSPORT_OK : TRANSPORT_PARTIAL; + } +} + +/*- socketShutdown: close socket and stop input callback associate with it -*/ +static void +socketShutdown(conn) +IMConnection *conn; +{ + int fd = conn->transport.priv.sock.fd; + + (void)shutdown(fd, 2); + (void)close(fd); + XtRemoveInput(conn->transport.priv.sock.id); +} +#endif /* IM_TCP_TRANSPORT || IM_UNIX_TRANSPORT */ + +#ifdef IM_X_TRANSPORT +/*- xinput: handler for input via X inter-client communication -*/ +static void +xinput(ev, cldata) +XEvent *ev; +XtPointer cldata; +{ + XClientMessageEvent *event = (XClientMessageEvent *)ev; + IMConnection *conn = (IMConnection *)cldata; + int cond; + Atom msg_type; + + TRACE(("imlib:xinput()\n")); + + if (event->type != ClientMessage || + event->window != conn->transport.priv.x.server) { + return; + } + + msg_type = event->message_type; + + if (event->format == 32) { + /* + * indirect reference -- data resides in a property, + * whose name is stored in the event. + */ + Atom propatom = event->data.l[1]; + long offset = 0; + unsigned long remain; + + if (msg_type != IMProtocolAtom(conn->proto_widget)) return; + + do { + Atom actualtype; + int actualformat; + unsigned long nitems; + char *data = NULL; + + XGetWindowProperty(event->display, event->window, propatom, + offset, 1000, True, AnyPropertyType, + &actualtype, &actualformat, &nitems, + &remain, (unsigned char **)&data); + if (data == NULL) return; + if (actualformat != 8) { + cond = TRANSPORT_ERROR; + } else { + IMBufAdd(&conn->in_buf, data, (int)nitems); + offset += nitems; + cond = TRANSPORT_OK; + } + XFree(data); + } while (remain > 0); + } else if (event->format == 8) { + if (msg_type != IMProtocolAtom(conn->proto_widget) && + msg_type != IMMoreDataAtom(conn->proto_widget)) { + return; + } + IMBufAdd(&conn->in_buf, event->data.b, 20); + cond = TRANSPORT_OK; + } else { + return; + } + + if (DDEBUG_CONDITION(100)) dumpBuf(IM_INBUF(conn), "** input buffer"); + + IMDispatch(conn, cond); +} + +/*- xdestroy: handler for client comm. window destruction -*/ +static void +xdestroy(ev, cldata) +XEvent *ev; +XtPointer cldata; +{ + XDestroyWindowEvent *event = (XDestroyWindowEvent *)ev; + IMConnection *conn = (IMConnection *)cldata; + + TRACE(("imlib:xdestroy()\n")); + + if (event->type != DestroyNotify || + event->window != conn->transport.priv.x.client) { + return; + } + /* + * Call IMDispatch with TRANSPORT_ERROR, in order to + * shutdown connection and process queued operations. + */ + IMDispatch(conn, TRANSPORT_ERROR); +} + +/*- xBrokenPipe: asyncronous BadWindow error handler -*/ +/* ARGSUSED */ +static int +xBrokenPipe(dpy, eev, client_data) +Display *dpy; +XErrorEvent *eev; +XPointer client_data; +{ + TRACE(("xBrokenPipe()\n")); + + if (eev->error_code == BadWindow) { + /* + * Search for the connection using window that caused the error. + * Note that we cannot pass the connection via client_data, + * Since the connection might be already destroyed by a previous + * error. + */ + Window bad_win = (Window)eev->resourceid; + IMConnection *conn; + + conn = IMConnectionList((Widget)client_data); + while (conn != NULL) { + if (bad_win == conn->transport.priv.x.client) { + DPRINT(("BadWindow on connection #%d\n", conn->serial)); + IMDispatch(conn, TRANSPORT_ERROR); + break; + } + conn = conn->next; + } + return 0; + } else { + return 1; + } +} + +/*- xFlush: output via X inter-client communication mechanism -*/ +static int +xFlush(conn) +IMConnection *conn; +{ + IMBuffer *ibp = IM_OUTBUF(conn); + XClientMessageEvent repl; + Widget w = conn->proto_widget; + Window client_win = conn->transport.priv.x.client; + Display *dpy = XtDisplay(w); + int length; + XAEHandle handle; + + if ((length = IMBUFLEN(ibp)) == 0) return TRANSPORT_OK; + + repl.type = ClientMessage; + repl.window = client_win; + + handle = XAESet(dpy, xBrokenPipe, (void (*)())NULL, (XPointer)w); + + if (IMBUFLEN(ibp) < XTransportDividingSize) { + char *data = IMBUFDATA(ibp); + + repl.format = 8; + repl.message_type = IMMoreDataAtom(w); + while (length > 20) { + bcopy(data, repl.data.b, 20); + XSendEvent(dpy, client_win, False, NoEventMask, (XEvent *)&repl); + data += 20; + length -= 20; + } + repl.message_type = IMProtocolAtom(w); + bzero(repl.data.b, 20); + bcopy(data, repl.data.b, length); + XSendEvent(dpy, client_win, False, NoEventMask, (XEvent *)&repl); + } else { + repl.format = 32; + repl.message_type = IMProtocolAtom(w); + repl.data.l[0] = length; + repl.data.l[1] = IMKi2CommAtom(w); + XChangeProperty(dpy, client_win, IMKi2CommAtom(w), XA_STRING, + 8, PropModeAppend, + (unsigned char *)IMBUFDATA(ibp), IMBUFLEN(ibp)); + XSendEvent(dpy, client_win, False, NoEventMask, (XEvent *)&repl); + } + + XFlush(dpy); + XAEUnset(handle); + + IMBufClear(ibp); + return TRANSPORT_OK; +} + +/*- xShutdown: close communication channel by destroying comm. window -*/ +static void +xShutdown(conn) +IMConnection *conn; +{ + Display *dpy = XtDisplay(conn->proto_widget); + MyRemoveAllEventHandler(dpy, conn->transport.priv.x.client); + MyRemoveAllEventHandler(dpy, conn->transport.priv.x.server); + XDestroyWindow(dpy, conn->transport.priv.x.server); +} +#endif /* IM_X_TRANSPORT */ + + +/* + * Public functions + */ + +#ifdef IM_TCP_TRANSPORT +int +IMCreateTCPService(portp) +int *portp; +{ + struct sockaddr_in addr; + int optval = 1; + int sock; + + TRACE(("IMCreateTCPService(port=%d)\n", *portp)); + + if ((sock = socket(PF_INET, SOCK_STREAM, 0)) < 0) { + DPRINT(("socket(PF_INET) failed with %d\n", errno)); + return -1; + } + +#ifdef SO_REUSEADDR + (void)setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, + (char *)&optval, sizeof(optval)); +#endif /* SO_REUSEADDR */ + + bzero((char *)&addr, sizeof(addr)); + addr.sin_family = AF_INET; + addr.sin_port = htons(*portp); + + if (bind(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0) { + DPRINT(("bind() failed with %d\n", errno)); + return -1; + } + if (*portp == 0) { + int addr_len = sizeof(addr); + + if (getsockname(sock, (struct sockaddr *)&addr, &addr_len) < 0) { + DPRINT(("getsockname() failed with %d\n", errno)); + return -1; + } + *portp = ntohs(addr.sin_port); + TRACE(("\tport=%d\n", *portp)); + } + if (listen(sock, 4) < 0) { + DPRINT(("listen() failed with %d\n", errno)); + return -1; + } + return sock; +} + +IMConnection * +IMTCPConnection(protocol, wellknownfd) +Widget protocol; +int wellknownfd; +{ + IMConnection *conn; + int fd; + struct sockaddr_in addr; + int addrlen = sizeof(addr); + XtInputId id; + + TRACE(("IMTCPConnection()\n")); + + if ((fd = accept(wellknownfd, (struct sockaddr *)&addr, &addrlen)) < 0) { + DPRINT(("accept() failed with %d\n", errno)); + return NULL; + } + conn = newConnection(protocol); + conn->transport.ops = &SocketTransportOps; + conn->transport.priv.sock.fd = fd; + DDPRINT(2, ("new connection #%d: transport=TCP socket=%d\n", + conn->serial, fd)); + + id = XtAppAddInput(XtWidgetToApplicationContext(protocol), fd, + (XtPointer)XtInputReadMask, socketinput, + (XtPointer)conn); + conn->transport.priv.sock.id = id; + + return conn; +} +#endif /* IM_TCP_TRANSPORT */ + +#ifdef IM_UNIX_TRANSPORT +int +IMCreateUnixService(path) +char *path; +{ + struct sockaddr_un addr; + int sock; + + TRACE(("IMCreateUnixService(%s)\n", path)); + if ((sock = socket(PF_UNIX, SOCK_STREAM, 0)) < 0) { + DPRINT(("socket(PF_UNIX) failed with %d\n", errno)); + return -1; + } + + bzero((char *)&addr, sizeof(addr)); + addr.sun_family = AF_UNIX; + (void)strcpy(addr.sun_path, path); + + /* + * Remove socket which is created by the previous process. + */ + (void)unlink(path); + + if (bind(sock, (struct sockaddr *)&addr, strlen(path) + 2) < 0) { + DPRINT(("bind() failed with %d\n", errno)); + return -1; + } + if (listen(sock, 4) < 0) { + DPRINT(("listen() failed with %d\n", errno)); + return -1; + } + return sock; +} + +IMConnection * +IMUnixConnection(protocol, wellknownfd) +Widget protocol; +int wellknownfd; +{ + IMConnection *conn; + int fd; + struct sockaddr_un addr; + int addrlen = sizeof(addr); + XtInputId id; + + TRACE(("IMUnixConnection()\n")); + + if ((fd = accept(wellknownfd, (struct sockaddr *)&addr, &addrlen)) < 0) { + DPRINT(("accept() failed with %d\n", errno)); + return NULL; + } + conn = newConnection(protocol); + conn->transport.ops = &SocketTransportOps; + conn->transport.priv.sock.fd = fd; + DDPRINT(2, ("new connection #%d: transport=UNIX socket=%d\n", + conn->serial, fd)); + + id = XtAppAddInput(XtWidgetToApplicationContext(protocol), fd, + (XtPointer)XtInputReadMask, socketinput, + (XtPointer)conn); + conn->transport.priv.sock.id = id; + + return conn; +} +#endif /* IM_UNIX_TRANSPORT */ + +#ifdef IM_X_TRANSPORT +IMConnection * +IMXConnection(protocol, xev) +Widget protocol; +XEvent *xev; +{ + XClientMessageEvent *event = (XClientMessageEvent *)xev; + XClientMessageEvent repl; + Display *dpy = XtDisplay(protocol); + Window client_window; + IMConnection *conn; + XAEHandle h; + + TRACE(("IMXConnection()\n")); + + if (event->type != ClientMessage || + event->display != dpy || + event->window != XtWindow(protocol) || + event->message_type != IMXConnectAtom(protocol) || + event->format != 32) { + TRACE(("\tinvalid event\n")); +#ifdef DEBUG + if (event->type != ClientMessage) printf("not ClientMessage\n"); + if (event->display != dpy) printf("wrong display\n"); + if (event->window != XtWindow(protocol)) printf("wrong window\n"); + if (event->message_type != IMXConnectAtom(protocol)) { + printf("wrong message type (%ld should be %ld)\n", + event->message_type, IMXConnectAtom(protocol)); + } + if (event->format != 32) printf("wrong format\n"); +#endif + return NULL; + } + client_window = event->data.l[0]; + if (!IMValidateWindow(dpy, client_window, (IMWindowProfile *)NULL)) { + DPRINT(("client window %08lx does not exist\n", client_window)); + return NULL; + } + conn = newConnection(protocol); + conn->transport.ops = &XTransportOps; + conn->transport.priv.x.client = client_window; + conn->transport.priv.x.server = communicationWindow(protocol); + DDPRINT(2, ("new connection #%d: transport=X client=%08lx\n", + conn->serial, client_window)); + TRACE(("\ttransport version: %ld.%ld\n", + event->data.l[1], event->data.l[2])); + + repl.type = ClientMessage; + repl.window = client_window; + repl.message_type = IMXConnectAtom(protocol); + repl.format = 32; + repl.data.l[0] = conn->transport.priv.x.server; + repl.data.l[1] = ServerMajorTransportVersion; + repl.data.l[2] = ServerMinorTransportVersion; + repl.data.l[3] = XTransportDividingSize; + /* make it safe... */ + h = XAESetIgnoreErrors(dpy); + XSendEvent(dpy, client_window, False, NoEventMask, (XEvent *)&repl); + MyAddEventHandler(dpy, client_window, DestroyNotify, StructureNotifyMask, + xdestroy, (XtPointer)conn); + XAEUnset(h); + + MyAddEventHandler(dpy, conn->transport.priv.x.server, + ClientMessage, NoEventMask, xinput, (XtPointer)conn); + + return conn; +} +#endif /* IM_X_TRANSPORT */ + +int +IMFlush(conn) +IMConnection *conn; +{ + TRACE(("IMFlush(#%d)\n", conn->serial)); + + if (DDEBUG_CONDITION(100)) dumpBuf(IM_OUTBUF(conn), "** output buffer"); + + return (*conn->transport.ops->flush)(conn); +} + +void +IMShutdown(conn) +IMConnection *conn; +{ + TRACE(("IMShutdown(#%d)\n", conn->serial)); + (*conn->transport.ops->shutdown)(conn); +} + +void +IMCloseConnection(conn) +IMConnection *conn; +{ + IMIM *imp; + + DDPRINT(2, ("IMCloseConnection(#%d)\n", conn->serial)); + + imp = conn->im_list; + while (imp != NULL) { + IMIM *next = imp->next; + + IMDestroyIM(imp); + imp = next; + } + + IMBufClear(&conn->in_buf); + IMBufClear(&conn->out_buf); +#ifdef notdef + destroyAuth(conn->server_auth); + destroyAuth(conn->client_auth); +#endif + IMShutdown(conn); + + IMUnregisterConnection(conn); + + XtFree((char *)conn); +} diff -r 000000000000 -r 92745d501b9a lib/imlib/imxport.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/imlib/imxport.h Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,66 @@ +/* $Id: imxport.h,v 1.3 1994/05/13 08:34:17 ishisone Exp $ */ +/* + * Copyright (c) 1994 Software Research Associates, Inc. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Software Research Associates not be + * used in advertising or publicity pertaining to distribution of the + * software without specific, written prior permission. Software Research + * Associates makes no representations about the suitability of this software + * for any purpose. It is provided "as is" without express or implied + * warranty. + * + * Author: Makoto Ishisone, Software Research Associates, Inc., Japan + */ + +#ifndef _imxport_h +#define _imxport_h + +#include "imprtype.h" + +/* + * Supported tranport definitions + */ +#ifndef NO_UNIX_TRANSPORT +#define IM_UNIX_TRANSPORT +#endif + +#ifndef NO_TCP_TRANSPORT +#define IM_TCP_TRANSPORT +#endif + +#ifndef NO_X_TRANSPORT +#define IM_X_TRANSPORT +#endif + + +/* + * IMTransport -- transport information + */ + +typedef struct _im_connection_ _tmp_IMConnection; +typedef struct { + int (*flush) _Pt_((_tmp_IMConnection *conn)); + void (*shutdown) _Pt_((_tmp_IMConnection *conn)); +} IMTransportOps; + +typedef union { + struct { + int fd; /* socket file descriptor */ + XtInputId id; /* input ID */ + } sock; + struct { + Window server; /* server communication window */ + Window client; /* client window */ + } x; +} IMTransportPriv; + +typedef struct { + IMTransportOps *ops; + IMTransportPriv priv; +} IMTransport; + +#endif /* _imxport_h */ diff -r 000000000000 -r 92745d501b9a lib/ioecall.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/ioecall.c Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,113 @@ +#ifndef lint +static char *rcsid = "$Id: ioecall.c,v 1.2 1996/09/30 09:19:52 ishisone Exp $"; +#endif +/* + * Copyright (C) 1994 Software Research Associates, Inc. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Software Research Associates not be + * used in advertising or publicity pertaining to distribution of the + * software without specific, written prior permission. Software Research + * Associates makes no representations about the suitability of this software + * for any purpose. It is provided "as is" without express or implied + * warranty. + * + * Author: Makoto Ishisone, Software Research Associates, Inc., Japan + */ + +/* + * X I/O error callback + */ + +#include +#include +#include +#include "IOECall.h" + +#ifndef NULL +#define NULL 0 +#endif + +typedef struct ioe_cb_desc_ { + void (*callback)(); + XPointer client_data; + struct ioe_cb_desc_ *next; +} CBDesc; + +static CBDesc *cb_list; + +static int (*original_handler)(); + +static int +XIOEHandler(dpy) +Display *dpy; +{ + CBDesc *cb; + + cb = cb_list; + while (cb != NULL) { + (*cb->callback)(cb->client_data); + cb = cb->next; + } + return (*original_handler)(dpy); +} + +void +XIOEInit() +{ + int (*oldhandler)() = XSetIOErrorHandler(XIOEHandler); + + if (oldhandler != XIOEHandler) original_handler = oldhandler; +} + +XIOEHandle +XIOESet(handler, client_data) +void (*handler)(); +XPointer client_data; +{ + CBDesc *cb; + + cb = (CBDesc *)malloc(sizeof(CBDesc)); + if (cb == NULL) return NULL; + + cb->callback = handler; + cb->client_data = client_data; + cb->next = NULL; + + if (cb_list == NULL) { + cb_list = cb; + } else { + CBDesc *p = cb_list; + + while (p->next != NULL) p = p->next; + p->next = cb; + } + + return cb; +} + +void +XIOEUnset(handle) +XIOEHandle handle; +{ + CBDesc *cb, *cb0; + + cb = cb_list; + cb0 = NULL; + + while (cb != NULL) { + if (cb == handle) { + if (cb0 == NULL) { + cb_list = cb->next; + } else { + cb0->next = cb->next; + } + (void)free((char *)cb); + return; + } + cb = cb->next; + } +} diff -r 000000000000 -r 92745d501b9a lib/parsekey.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/parsekey.c Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,156 @@ +#ifndef lint +static char *rcsid = "$Id: parsekey.c,v 1.1 1994/05/16 05:42:30 ishisone Rel $"; +#endif +/*- + * Copyright (c) 1991, 1994 Software Research Associates, Inc. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Software Research Associates not be + * used in advertising or publicity pertaining to distribution of the + * software without specific, written prior permission. Software Research + * Associates makes no representations about the suitability of this software + * for any purpose. It is provided "as is" without express or implied + * warranty. + * + * Author: Makoto Ishisone, Software Research Associates, Inc., Japan + */ + +#include +#include +#include "ParseKey.h" + +/*- parseModifiers: parse modifier list -*/ +static void +parseModifiers(s, modp, chkmodp) +String s; +long *modp; /* RETURN: modifiers which must be set */ +long *chkmodp; /* RETURN: modifiers to be checked */ +{ + String p; + int i; + int c; + static struct _moddesc_ { + String modname; /* modifier name */ + long modmask; /* modifier mask */ + } mods[] = { + { "Shift", ShiftMask }, + { "Lock", LockMask }, + { "Ctrl", ControlMask }, + { "Meta", Mod1Mask }, + { "Alt", Mod1Mask }, + { "Mod1", Mod1Mask }, + { "Mod2", Mod2Mask }, + { "Mod3", Mod3Mask }, + { "Mod4", Mod4Mask }, + { "c", ControlMask }, + { "s", ShiftMask }, + { "l", LockMask }, + { "m", Mod1Mask }, + { "a", Mod1Mask }, + }; + + *modp = *chkmodp = 0L; + +#define SKIPBLANK \ + while ((c = *s) == ' ' || c == '\t' || c == '\n') s++; \ + if (c == '\0') return; +#define SEARCHBLANK \ + p = s; while ((c = *p) != '\0' && c != ' ' && c != '\t' && c != '\n') p++; + + while (*s != '\0') { + int tilde = 0; + + SKIPBLANK; + if (c == '~') { + tilde = 1; + s++; + SKIPBLANK; + } + SEARCHBLANK; + *p = '\0'; + for (i = 0; i < XtNumber(mods); i++) { + if (!strcmp(s, mods[i].modname)) { + *chkmodp |= mods[i].modmask; + if (!tilde) *modp |= mods[i].modmask; + break; + } + } + if (c == '\0') break; + s = p + 1; + } +#undef SKIPBLANK +#undef SEARCHBLANK +} + +/*- mystrstr: not-so-good implementaion of ANSI strstr() -*/ +static char * +mystrstr(s1, s2) +char *s1; +char *s2; +{ + register char *p, *q; + + while (*(p = s1++) != '\0') { + q = s2; + do { + if (*q == '\0') return s1 - 1; + } while (*p++ == *q++); + } + return NULL; +} + + +/* + * Public function + */ + +int +ParseKeyEvent(s, keysymp, modp, chkmodp) +String s; /* IN: keyevent description */ +KeySym *keysymp; /* OUT: keysym */ +long *modp; /* OUT: mask of modifiers which must be pressed */ +long *chkmodp; /* OUT: mask of modifiers of interest */ +{ + String key; + String p; + KeySym keysym; + + /* + * keyevent description (stored in argument 's') must be of the + * following format (subset of Xt translation table syntax): + * modifier-listkeysym + * modifier-list is a combination of: + * Ctrl, Shift, Lock, Meta, Alt, Mod1, Mod2, Mod3, Mod4, Mod5 + * if '~' is prepended before a modifier, it means the modifier key should + * not be pressed. + */ + + /* find "" */ + if ((p = mystrstr(s, "")) != NULL) { + key = p + 5; /* p + strlen("") */ + } else if ((p = mystrstr(s, "")) != NULL) { + key = p + 10; /* p + strlen("") */ + } else if ((p = mystrstr(s, "")) != NULL) { + key = p + 9; /* p + strlen("") */ + } else { + return 0; + } + *p = '\0'; + while (*key == ' ' || *key == '\t') key++; + p = key; + while (*p != '\0' && *p != ' ' && *p != '\t') p++; + *p = '\0'; + + /* get modifier mask */ + parseModifiers(s, modp, chkmodp); + + /* get keycode */ + if ((keysym = XStringToKeysym(key)) == NoSymbol) return 0; + + *keysymp = keysym; + + return 1; +} diff -r 000000000000 -r 92745d501b9a lib/wnnlib.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/wnnlib.c Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,3695 @@ +/* + * wnnlib -- $B$+$J4A;zJQ49MQ%i%$%V%i%j(B (jllib $BBP1~HG(B) + * + * $B$3$N%i%$%V%i%j$O!"(Bkinput V2 $B$KIUB0$7$F$$$?!"(BSRA $B$N@PA>:,$5$s$N(B + * jclib 5.2 $B$r%Y!<%9$K:n@.$7$^$7$?!#(B + * + * $B?9It(B $B1QG7(B + */ + +/* + * Copyright (c) 1989 Software Research Associates, Inc. + * Copyright (c) 1998 MORIBE, Hideyuki + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Software Research Associates not be + * used in advertising or publicity pertaining to distribution of the + * software without specific, written prior permission. Software Research + * Associates makes no representations about the suitability of this software + * for any purpose. It is provided "as is" without express or implied + * warranty. + * + * Author: Makoto Ishisone, Software Research Associates, Inc., Japan + * ishisone@sra.co.jp + * MORIBE, Hideyuki + */ + +/* + * Portability issue: + * + * + define SYSV, SVR4 or USG if you don't have bcopy() or bzero(). + * + * if you define USG (which should be defined if your OS is based + * on System V Rel 2) or SYSV (in case of System V Rel 3), + * memchr() is used for bzero(), and my own version of bcopy() + * is used in order to handle overlapping regions. + * + * if you define SVR4 (yes, System V Rel4), memmove() is used for + * bcopy(), and memchr() is used for bzero(). + * + * + wnnlib assumes bcopy() can handle overlapping data blocks. + * If your bcopy() can't, you should define OVERLAP_BCOPY, + * which force to use my own bcopy() rather than the one + * in libc.a. + */ + +/* + * $B35MW(B + * + * wnnlib $B$O(B Wnn6 $B$K$bBP1~$7$?(B kinput $B$N(B CcWnn $B%*%V%8%'%/%H8~$1$N9b%l%Y%k(B + * $B$+$J4A;zJQ49%i%$%V%i%j$G$"$k!#(B + * + * $B=>Mh$N(B Kinput $B$K$*$$$F$O!"(BWnn $B$H$N%$%s%?%U%'!<%9$O!"(Bjslib $B%Y!<%9$N(B + * jilib $B$H(B jclib $B$G$"$C$?!#$H$3$m$,!"(BWnn6 $B$G3HD%$5$l$?5!G=$r;HMQ$7$?$/$F(B + * $B$b!"(Bjslib $B%l%Y%k$N;EMM$,$[$H$s$IH=$i$J$+$C$?!#$3$N$?$a!"(Bmule $B$N(B egg $B%$(B + * $B%s%?%U%'!<%9$G;HMQ$7$F$$$k(B jllib $B$rMQ$$$F!"=>Mh$N(B jilib $B$H(B jclib $B$N%$(B + * $B%s%?%U%'!<%9$r$G$-$k$@$1JQ99$7$J$$$h$&$K$7$F!"?7$?$K(B wnnlib $B$H$7$F=q$-(B + * $B49$($?!#(B + * + * wnnlib $B$O!"(BWnn6 $B$@$1$G$J$/!"$=$l0JA0$N(B Wnn4 $B$K$bBP1~$7$F$$$k$O$:$G(B + * $B$"$k$,%F%9%H$O$7$F$$$J$$!#(B + * + * wnnlib $B$O!"=>Mh$N(B jclib $B$HF1MM$K!"$+$J%P%C%U%!$HI=<(%P%C%U%!$H$$$$D(B + * $B$N%P%C%U%!$r;}$D!#$+$J%P%C%U%!$K$OFI$_J8;zNs$,F~$j!"I=<(%P%C%U%!$K$OJQ(B + * $B497k2L(B($BI=<(J8;zNs(B)$B$,F~$k!#$+$J%P%C%U%!$H8@$&8F$SJ}$O$"$^$j@53N$G$O$J$$!#(B + * Wnn Version 4 $B0J9_$G$O4A;z$+$JJQ49$b$G$-$k$+$i$G$"$k!#(B + * + * $B%I%C%H$H%+%l%s%HJ8@a$H$$$&35G0$r;}$A!"J8;z$NA^F~(B / $B:o=|$O%I%C%H$N0LCV$K(B + * $BBP$7$F9T$J$o$l!"JQ49$=$NB>$NA`:n$O%+%l%s%HJ8@a$KBP$7$F9T$J$o$l$k!#(B + * Wnn Version 4 $B0J9_$G$OBgJ8@a$H>.J8@a$H$$$.(B + * $B!&%+%l%s%HJ8@a(B / $B%I%C%H$N0\F0(B + * $B!&Mh$N(B Kinput2 $B$G$O!"(BWnn $B$H$N%$%s%?!<%U%'!<%9$O!"(Bjslib $B$r%Y!<%9$K(B + * $B$7$?(Bjilib $B$H(B jclib $B$G!"$b$H$b$H(B Wnn Version 3 $B$N(B libjd $B$N>e$K:n$i(B + * $B$l$?%i%$%V%i%j$G$"$k!#(B + * + * Wnn Version 6 $BBP1~$K$"$?$C$F!"(Bjslib $B%l%Y%k$NDI2C5!G=$d>\:Y%$%s%?%U%'!<(B + * $B%9$,H=$i$J$+$C$?$?$a!"(Bjslib $B$NBe$o$j$K(B mule $B$N(B egg $B%$%s%?%U%'!<%9$G;H(B + * $BMQ$5$l$F$$$k(B jllib $B$r%Y!<%9$K$7$F!"(Bjilib $B$H(B jclib $B$r?7$?$K(B wnnlib $B$H$7(B + * $B$F=q$-49$($k$3$H$K$7$?!#=q$-49$($O!"0J2<$NJ}?K$G9T$C$?!#(B + * + * 1. $B%G!<%?9=B$!"%$%s%?%U%'!<%9(B ($B4X?tL>$dJQ?tL>$b(B) $B$r$J$k$Y$/=>Mh$N(B + * jclib$B$HF1$8$K$9$k!#(B + * + * 2. $B$+$J%P%C%U%!$HI=<(%P%C%U%!$NFs$D$NJ8;z%P%C%U%!$r;}$A!"(B + * $B$+$J%P%C%U%!$K$OFI$_!"I=<(%P%C%U%!$K$OJQ497k2L$,F~$k$H$+(B + * $BMM!9$JA`:n$O%+%l%s%HJ8@a$H8F$P$l$kJ8@a$KBP$7$F9T$J$o$l$k$H$+$$$C$?(B + * $B4pK\E*$J%3%s%;%W%H$OJQ$($J$$!#(B + * + * 3. $B=>Mh$N%i%$%V%i%j$r;H$C$?%"%W%j%1!<%7%g%s$,?7$7$$%i%$%V%i%j$K(B + * $B0\9T$7$d$9$$$h$&$K!"4X?t%$%s%?!<%U%'%$%9$b$G$-$k$@$1;w$?$b$N$K$9$k!#(B + * + * 4. 1,2,3 $B$NJ}?K$r$G$-$k$@$1$$$D$D!"%/%$%C%/!&%O%C%/$9$k!#(B + */ + +/* + * $B%a%b(B ($BCm(B: $B:G=i$NItJ,$O!"@PA>:,$5$s$N(B jclib $B:n@.%a%b(B) + * + * ver 0.0 89/07/21 + * $B$H$j$"$($::n$j$O$8$a$k(B + * ver 0.1 89/08/02 + * $BH>J,$/$i$$$+$1$?(B + * $B.$5$/$J$k$s$@$1$I(B + * ver 0.6 89/08/22 + * jcDeleteChar() $B$rA4LLE*$K=q$-D>$9(B + * $B$3$l$G0l1~@5$7$/F0:n$9$k$h$&$K$J$C$?(B + * jcInsertChar() $B$G:G8e$N(B clauseInfo $B$N@_Dj$,4V0c$C$F$$$?$N$G(B + * $B$=$l$r=$@5(B + * jcPrintDetail() $B$K4JC1$J(B clauseInfo $B%G!<%?$N(B consistency check $B$r(B + * $BF~$l$k(B + * ver 0.7 89/08/26 + * jcExpand() $B$N%P%0=$@5(B + * $B>.J8@a$NC1J8@aJQ49$r>/$7=$@5(B + * ver 0.8 89/08/30 + * changecinfo() $B$G(B conv $B%U%i%0$r%;%C%H$9$k$N$rK:$l$F$$$?(B + * moveKBuf()/moveDBuf()/moveCInfo() $B$r>/$7=$@5(B + * SYSV $B$,(B define $B$5$l$F$$$l$P(B bcopy()/bzero() $B$NBe$o$j$K(B + * memcpy()/memset() $B$r;H$&$h$&$K=$@5(B + * ver 0.9 89/09/22 + * setLCandData() $B$G commonhd.h $B$K$J$C$?$N$G(B + * $B$=$l$N=$@5(B + * ver 0.11 89/10/18 + * USG $B$,(B define $B$5$l$F$$$F$b(B memcpy()/memset() $B$r;H$&$h$&$K=$@5(B + * ver 0.12 89/10/19 + * resizeBuffer() $B$G%I%C%H$N:F@_Dj$rK:$l$F$$$k$H$$$&=EBg$J%P%0$r=$@5(B + * ver 4.0 89/10/27 + * $B%P!<%8%g%sHV9f$r=$@5$7$F(B 4.0 $B$K$9$k!#(B + * --- kinput $B$r(B R4 $B$K(B contribute --- + * ver 4.1 90/06/04 + * $B%/%i%$%"%s%HB&$K$"$k<-=q!&IQEY%U%!%$%k$N%;!<%V$,$G$-$J$$$H$$$&(B + * $B=EBg$J%P%0$r=$@5(B + * ver 4.2 90/06/15 + * $B<-=q$,EPO?2DG=$+$I$&$+$NH=Dj$,4V0c$C$F$$$F!"5UJQ492DG=<-=q$N(B + * $B%;!<%V$,$G$-$J$$$H$$$&$^$?$^$?=EBg$J%P%0$r=$@5(B + * $B:#$N$H$3$m(B kinput/wterm $B$H$bC18lEPO?5!G=$,$D$$$F$J$$$N$G(B + * $Bl9g$K$O<+F0E*$K(B OVERLAP_BCOPY + * $B$bDj5A$9$k$h$&$K$7$?(B + * SVR4 $B$,Dj5A$5$l$F$$$k>l9g$K$O(B bcopy $B$NBe$o$j$K(B memmove() $B$r;HMQ(B + * $B$9$k$h$&$K$7$?(B + * ver 4.5 91/09/23 + * DEBUG $B$r(B DEBUG_JCLIB $B$KJQ99(B + * ver 5.0 91/10/01 + * kinput2 $B%j%j!<%98~$1$K%P!<%8%g%sHV9f$r=$@5$7$F(B 5.0 $B$K$9$k!#(B + * --- kinput2 $B$r(B R5 $B$K(B contribute --- + * ver 5.1 92/02/07 + * John Yates $B$5$s(B (yates@bldrsoft.com) $B$+$i(B getLCandDataLen() $B$G(B + * $BJ8;z?t$r?t$(4V0c$($F$$$?$N$r;XE&$5$l$?$N$G$=$l$N=$@5(B + * ver 5.2 92/12/24 + * jcInsertChar() $B$G%G!<%?$N=i4|2=$r$7$F$$$J$+$C$?ItJ,$,$"$C$?(B + * $B$N$G=$@5(B ($BCM$,BeF~$5$l$k$^$G;HMQ$5$l$J$$$N$G%P%0$G$O$J$$$N$@$,(B + * $B$A$g$C$H5$;}$A$o$k$$$N$G(B) + * + * --- wnnlib $B:n@.%a%b(B --- + * + * ver 0.1 98/03/12 + * $B$H$j$"$($:!"(Bjllib $B%$%s%?%U%'!<%9$K=q49$($r;O$a$k!#(B + * ver 0.2 98/03/16 + * $B$^$@$$$/$D$+7|G0;v9`$O$"$k$b$N$N!"4pK\E*$J=q49$($,=*$o$C$?$N$G!"(B + * $B%G%P%C%0$r;O$a$k!#$=$l$J$j$K!"F0$$$F$$$kMM;R!#(B + * ver 0.3 98/03/18 + * $B$$$/$+%P%0$,8+$D$+$C$?(B ($B%3%"!&%@%s%W$7$?(B) $B$N$G!"$=$l$i$r=$@5!#(B + * $B$^$@!"(BWnn6 $B$N5!G=$,M-8z$K$J$C$F$$$k$+NI$/$o$+$i$J$$!#(B + * ver 0.4 98/07/01 + * $B0JA0$+$i5$$K$J$C$F$$$?%k!<%W$K4Y$k8=>]$N860x$,$d$C$HH=$C$?!#(B + * $B860x$O!"JQ49$N(B cancel $B$N1dD9$G8F$P$l$k(B expandOrShrink $B$NCf$G!"(B + * $BL5JQ49;XDj$N;~$G$b(B ltop ($BBgJ8@a(B) $B%U%i%C%0$r%j%;%C%H$7$F$$$J$+$C(B + * $B$?$?$a$G!"$=$l$r=$@5$7$?!#(B + * ver 0.5 98/10/15 + * $B:G8e$N=$@5$+$iLs(B 3 $B%v7n4V!";HMQ$7$?$,FC$KLdBj$,$J$+$C$?$N$G!"(B + * kinput2-fix5 $B$N(B alpha $BHG$,$G$?$N$r5!2q$K!"(Bkinput2 $B%a!<%j%s%0!&(B + * $B%j%9%H$XEj9F!#(B + * ver 0.6 98/12/03 + * $B@PA>:,$5$s$h$j!"J8@a3HBg$N$G$N%P%0$NJs9p$,$"$C$?$N$G(B (kinput2 + * $B%a!<%j%s%0!&%j%9%H(B 2106 $B!A(B 2118 $B;2>H(B)$B!"$=$l$r=$@5!#(B + * + * --- kinput2-fix-alpha2 $B$K.J8@a$H$7$FC1J8@aJQ49$7$J$1$l$P$$$1$J$$(B + * $B$H$3$m$r!"BgJ8@a$H$7$FJQ49$7$F$$$?%P%0$r=$@5!#(B + * + * ver 0.8 99/01/06 + * kinput2-fix5-alpha4 $B$,$G$?$N$r5!2q$K!"%I%C%H0J9_$r:o=|$9$kJT=8(B + * $B5!G=(B (kill-line) $B$re$N(B ver 0.4 $B$G=$@5$7$?$O$:$N(B + * $B%P%0$,:F8=!#(B + * + * ver 0.9 99/01/18 + * $B$d$O$j!"(Bcancel $B$N1dD9$N=hM}$,$&$^$/$J$$$3$H$,H=L@!#$D$^$j!"J8(B + * $B@a3HBg$K$h$k(B cancel $B=hM}$G$O!"J8@a>pJs$,(B CcWnn $B$,4|BT$9$k$b$N(B + * $B$H0[$C$F$$$k$?$a(B ($B$3$l$,!"(Bjclib $B$H(B wnnlib $B$N0c$$(B)$B!"8mF0:n$r$7(B + * $B$?!#$3$N$?$a!"FHN)$7$?(B cancel $B=hM}$r(B jcCancel() $B%U%!%s%/%7%g%s(B + * $B$H$7$FH(B)$B!#(B + * $B$^$?!"(BgetHint() $B$H(B forceStudy() $B$N=hM}$r$7$?!#(B + * + * ver 0.99 99/03/05 + * $BA02s$N(B getHint() $B$N=hM}$NI{:nMQ$G!"(BsetCandiate() $B$GpJs$NJQ99J}K!$K$"$C$?@x:_%P%0$r=$@5!#(B + * + * ver ?.?? 99/03/29 ishisone + * $BA0$Kr7o$r$-$D$/$9$k!#$^$?(B Wnn4 $B$N(B jl $B%i%$%V%i%j$NIT6q9g(B + * ($B;EMM$+$b(B) $B$N2sHr:v$NAH$_9~$_!#(B + * + * ver ?.?? 99/04/12 ishisone + * jcOpen() $B$K2C$($F(B jcOpen2() $B$r$l$N(B + * $B=i4|2=%U%!%$%k$r;XDj$9$k$3$H$,$G$-!"H!#(B + * + * ver ?.?? 99/05/25 ishisone + * config.h $B$r%$%s%/%k!<%I$7$J$$$h$&$K$9$k!#I,MW$J$N$O(B LIBDIR $B$@$1(B + * $B$@$7!"(Bconfig.h $B$N(B LIBDIR $B$NCM$,@5$7$$$H$$$&J]>Z$b$J$$$?$a!#(B + * /usr/local/lib/wnn $B$K7h$a$&$A!#(B($B%*!<%P!<%i%$%I$9$k$3$H$O$G$-$k(B) + * + * --- kinput2 version 3.0 $B%j%j!<%9(B --- + * + * ver ?.?? 01/01/10 + * Wnn7 $BBP1~!#$H$O$$$C$F$b:G>.8B$NBP1~$G!"(BWnn7 $B$N?7$7$$5!G=$r(B + * $BMxMQ$G$-$k$o$1$G$O$J$$!#(B + * $B;HMQ$5$l$F$$$J$$JQ?t$r:o=|!#(B + */ + +/* + * $B%U%!%s%/%7%g%s(B + * + * struct wnn_buf jcOpen(char *servername, char *envname, + * char *rcfilename, int override, + * void (*errmsgfunc)(), int (*confirmfunc)(), + * int timeout) + * jl_open $B$"$k$$$O(B jl_open_lang $B$KBP1~$7$?(B wnnlib $B$N%$%s%?%U%'!<(B + * $B%9$G!"$3$N4X?t$NCf$Gl9g!"4{$K4D6-$,%5!<%PB&$K$"$C$F$b!"(B + * $B4D6-$r:F=i4|2=$9$k!#(B + * + * int jcClose(struct wnn_buf *wnnbuf) + * jl_close $B$r8F$S=P$7!"(BjcOpen $B$G3MF@$7$?(B wnnbuf $B$N2rJ|$H%5!<%P$H(B + * $B$N@\B3$r@Z$k!#(B + * + * int jcIsConnect(struct wnn_buf *wnnbuf) + * $B%5!<%P$H$N@\B3>uBV$r(B jl_isconnect $B$GD4$Y$k!#(Bwnnbuf $B$,(B NULL$B!"(B + * $B4D6-$,:n@.$5$l$F$$$J$$!"$"$k$$$O%5!<%P$H@\B3$5$l$F$$$J$$>l9g$K$O(B 0$B!#(B + * wnnbuf $B$,%5!<%P$H@\B3$5$l$F$$$l$P!"(B1 $B$rJV$9!#(B + * + * jcConvBuf *jcCreateBuffer(struct wnn_env *env, int nclause, int buffersize) + * $B;XDj$5$l$?4D6-$r;H$C$FJQ49$N%P%C%U%!$r:n@.$9$k!#%P%C%U%!$O(B + * $BJ#?t:n$k$3$H$,$G$-$k!#0l$D$N%P%C%U%!$G$OF1;~$KJ#?t$NJ8$r(B + * $BJQ49$9$k$3$H$O$G$-$J$$$N$G!"J#?t$NJ8$rJB9T$7$FJQ49$7$?$$>l9g$K$O(B + * $B4v$D$+$N%P%C%U%!$rMQ0U$7$J$/$F$O$J$i$J$$!#(B + * $B4D6-$N@_Dj$^$G$rM=$a$d$C$F$*$/I,MW$,$"$k!#$D$^$j%5!<%P$H$N@\B3!"(B + * $B4D6-$N@8@.!"<-=q$N@_Dj$J$I$O(B jcOpen $B$G9T$C$F$*$/I,MW$,$"$k!#(B + * $B0z?t$N(B nclause $B$H(B buffersize $B$G!"$=$l$>$l=i4|2=;~$K%"%m%1!<%H$9$k(B + * $BJ8@a>pJs$*$h$S$+$J(B/$BI=<(%P%C%U%!$NBg$-$5$,;XDj$G$-$k!#(B + * $B$?$@$7$3$l$i$O!"%5%$%:$,B-$j$J$/$J$l$PI,MW$K1~$8$F<+F0E*$K(B + * $BA}$d$5$l$k$?$a!"$3$3$K;XDj$7$?0J>e$N?t$NJ8@a$d!"J8;zNs$,JQ49$G$-$J$$(B + * $B$o$1$G$O$J$$!#$=$l$>$l(B 0 $B$^$?$OIi$NCM$r;XDj$9$k$H!"%G%U%)%k%H$N(B + * $B%5%$%:$G%"%m%1!<%H$5$l$k!#=>$C$FDL>o$O(B nclause/buffersize $B$H$b(B + * 0 $B$r;XDj$7$F$*$1$P$h$$!#(B + * $B%j%?!<%s%P%j%e!<$H$7$F%P%C%U%!$rJV$9!#%(%i!<$N;~$K$O(B NULL $B$,(B + * $BJV$5$l$k!#(B + * + * int jcDestroyBuffer(jcConvBuf *buf, int savedic) + * $B%P%C%U%!$N;HMQ$r=*N;$9$k!#4D6-$r>C$7$?$j!"%5!<%P$H$N@\B3$r@Z$C$?$j(B + * $B$9$k$3$H$O!"(BjcClose $B$G9T$&!#(B + * $B0z?t(B savedic $B$,(B 0 $B$G$J$1$l$P!"4D6-Cf$G;HMQ$5$l$F$$$kA4$F$N<-=q$r(B + * $B%;!<%V$9$k!#(B + * + * int jcClear(jcConvBuf *buf) + * $B%P%C%U%!$r%/%j%"$9$k!#?7$?$KJQ49$r;O$a$k:]$K$O:G=i$K$3$N(B + * $B%U%!%s%/%7%g%s$r8F$P$J$1$l$P$J$i$J$$!#(B + * + * int jcInsertChar(jcConvBuf *buf, int c) + * $B%I%C%H$K#1J8;zA^F~$9$k!#(B + * $B%+%l%s%HJ8@a$,4{$KJQ49$5$l$F$$$l$PL5JQ49$N>uBV$KLa$k!#(B + * $B%+%l%s%HJ8@a$OBgJ8@a$G$"$k!#(B + * + * int jcDeleteChar(jcConvBuf *buf, int prev) + * $B%I%C%H$NA0Kt$O8e$m$N#1J8;z$r:o=|$9$k!#(B + * $B%+%l%s%HJ8@a$,4{$KJQ49$5$l$F$$$l$PL5JQ49$N>uBV$KLa$k!#(B + * $B%+%l%s%HJ8@a$OBgJ8@a$G$"$k!#(B + * + * int jcConvert(jcConvBuf *buf, int small, int tan, int jump) + * $B%+%l%s%HJ8@a$+$i8e$m$rJQ49$9$k!#(B + * $B0z?t(B tan $B$,(B 0 $B$J$iO"J8@aJQ49!"$=$&$G$J$1$l$P%+%l%s%HJ8@a$r(B + * $BC1J8@aJQ49$7!"$=$N$"$H$rO"J8@aJQ49$9$k!#(B + * $B0z?t(B small $B$,(B 0 $B$G$J$1$l$P>.J8@a$,!"$=$&$G$J$1$l$PBgJ8@a$,(B + * $B%+%l%s%HJ8@a$H$7$F;H$o$l$k!#(B + * $B0z?t(B jump $B$G!"JQ498e$N%+%l%s%HJ8@a$N0LCV$,7h$^$k!#(Bjump $B$,(B + * 0 $B$J$i%+%l%s%HJ8@a$N0LCV$OJQ49$7$F$bJQ$o$i$J$$(B ($B$?$@$7(B + * $B%+%l%s%HJ8@a$H$7$FBgJ8@a$r;XDj$7$?>l9g!"JQ498e$N%+%l%s%H(B + * $B>.J8@a$O%+%l%s%HBgJ8@a$N:G=i$N>.J8@a$K$J$k(B) $B$,!"(B0 $B$G$J$1$l$P(B + * $B:G8e$NJ8@a$NuBV$KLa$9!#(B + * $B%+%l%s%HBgJ8@a$,$$$/$D$+$N>.J8@a$+$i$G$-$F$$$?>l9g!"$3$l$i$N(B + * $B>.J8@a$O$^$H$a$i$l!"0l$D$NL5JQ49>uBV$NJ8@a$K$J$k!#(B + * $B%+%l%s%H>.J8@a$rL5JQ49$KLa$95!G=$OMQ0U$7$J$$!#$J$<$+$H$$$&$H!"(B + * $BBgJ8@a$NCf$N(B 1 $B>.J8@a$N$_$,L5JQ49$K$J$C$F$7$^$&$H!"$=$NJ8@a$K(B + * $B4X$7$F(B jcMove() $B$G0\F0$r9T$J$C$?;~!"$I$&0\F0$9$l$P$h$$$N$+(B + * $B$h$/$o$+$i$J$$!"$D$^$j0\F0$N%;%^%s%F%#%/%9$,ITL@3N$K$J$C$F$7$^$&(B + * $B$+$i$G$"$k!#(B + * + * int jcKana(jcConvBuf *buf, int small, int kind) + * $B%+%l%s%HJ8@a$r$+$J$K$9$k!#(B + * $B0z?t(B kind $B$,!"(BJC_HIRAGANA $B$J$i$R$i$,$J!"(BJC_KATAKANA $B$J$i%+%?%+%J$K(B + * $BJQ$o$k!#J8@a$NJQ49>uBV$OJQ2=$7$J$$!#$D$^$jJQ49$5$l$F$$$l$P(B + * $BJQ49>uBV$N$^$^!"L$JQ49$N>uBV$J$iL$JQ49$N$^$^$G$"$k!#(B + * $B0z?t(B small $B$,(B 0 $B$G$J$1$l$P%+%l%s%H>.J8@a$,!"$=$&$G$J$1$l$P(B + * $B%+%l%s%HBgJ8@a$,JQ$o$k!#(B + * $B%+%l%s%HBgJ8@a$r$+$J$K$9$k>l9g!"$=$NCf$N>.J8@a$O0l$D$K$^$H$a$i$l$k!#(B + * + * int jcFix(jcConvBuf *buf) + * $B8=:_!"%P%C%U%!$K$O$$$C$F$$$kJQ49J8;zNs$r3NDj$5$;$k!#(B + * + * int jcFix1(jcConvBuf *buf) + * $B8=:_!"%P%C%U%!$K$O$$$C$F$$$kJQ49J8;zNs$N@hF,0lJ8;z$@$1$r3NDj$5$;$k!#(B + * + * int jcExpand(jcConvBuf *buf, int small, int convf) + * $B%+%l%s%HJ8@a$ND9$5$r#1J8;z?-$P$9!#0z?t(B convf $B$,(B 0 $B$G$J$1$l$P(B + * $B?-$P$7$?$"$H:FJQ49$9$k!#(B + * $B0z?t(B small $B$,(B 0 $B$G$J$1$l$P>.J8@a$,!"$=$&$G$J$1$l$PBgJ8@a$,(B + * $B%+%l%s%HJ8@a$H$7$F;H$o$l$k!#(B + * + * int jcShrink(jcConvBuf *buf, int small, int convf) + * $B%+%l%s%HJ8@a$ND9$5$r#1J8;z=L$a$k!#0z?t(B convf $B$,(B 0 $B$G$J$1$l$P(B + * $B=L$a$?$"$H:FJQ49$9$k!#(B + * $B0z?t(B small $B$,(B 0 $B$G$J$1$l$P>.J8@a$,!"$=$&$G$J$1$l$PBgJ8@a$,(B + * $B%+%l%s%HJ8@a$H$7$F;H$o$l$k!#(B + * + * int jcNext(jcConvBuf *buf, int small, int prev) + * $B%+%l%s%HJ8@a$r.J8@a$,!"$=$&$G$J$1$l$PBgJ8@a$,(B + * $B%+%l%s%HJ8@a$H$7$F;H$o$l$k!#(B + * + * int jcCandidateInfo(jcConvBuf *buf, int small, int *ncandp, int *curcandp) + * $BpJs$rJV$9!#(B + * $BuBV(B + * 1 $B$J$iJQ49>uBV(B + * -1 $B$J$i(B $B%(%i!<(B + * + * int jcMove(jcConvBuf *buf, int small, int dir) + * $B%I%C%H!&%+%l%s%HJ8@a$r0\F0$9$k!#(B + * $B%+%l%s%HJ8@a$,JQ49:Q$_$G$"$l$PJ8@a0\F0$7!"$=$&$G$J$1$l$P(B + * $B%I%C%H$N$_$,0\F0$9$k!#(B + * $BJ8@a0\F0;~$K!"0z?t(B small $B$,(B 0 $B$G$J$1$l$P>.J8@aC10L$G0\F0$7!"(B + * $B$=$&$G$J$1$l$PBgJ8@aC10L$K0\F0$9$k!#(B + * + * int jcTop(jcConvBuf *buf) + * $B%I%C%H!&%+%l%s%HJ8@a$rJ8$N@hF,$K0\F0$9$k!#%+%l%s%H>.J8@a!&(B + * $B%+%l%s%HBgJ8@a$H$b$K0\F0$9$k!#(B + * + * int jcBottom(jcConvBuf *buf) + * $B%I%C%H!&%+%l%s%HJ8@a$rJ8$N:G8e$K0\F0$9$k!#%+%l%s%H>.J8@a!&(B + * $B%+%l%s%HBgJ8@a$H$b$K0\F0$9$k!#(B + * $B$b$7!":G8e$NJ8@a$,L5JQ49>uBV$G$"$l$P%+%l%s%HJ8@a$O$=$NJ8@a$K$J$j!"(B + * $B%I%C%H$O$=$NJ8@a$N:G8e$KMh$k!#$=$&$G$J$1$l$P%+%l%s%HJ8@a$O(B + * $B:G8e$NJ8@a$NuBV$K$J$k!#(B + * + * int jcSaveDic(jcConvBuf *buf) + * $B;HMQCf$N4D6-$G;H$o$l$F$$$kA4$F$N<-=qJB$S$KIQEY%U%!%$%k$r(B + * $B%;!<%V$9$k!#(B + * $B$3$N%U%!%s%/%7%g%s$O>o$K(B 0 $B$rJV$9!#K\Ev$K%;!<%V$5$l$?$+$N(B + * $B%A%'%C%/$O$7$J$$!#(B + * + * int jcCancel(jcConvBuf *buf) + * $B8=:_F~NOCf$N$9$Y$F$NJ8;zNs$r!"JQ49:Q$_$N$b$N$r4^$a$F!"$9$Y$FL$(B + * $BJQ49>uBV$K$9$k!#%*%j%8%J%k$N(B CcWnn $B$H(B jclib $B%$%s%?%U%'!<%9$G$O!"(B + * $B@hF,J8@a$rA4F~NOJ8;zNs$ND9$5$^$G3HD%$9$k$3$H$G!"$3$N=hM}$r9T$J$C(B + * $B$F$$$?$,!"$3$N=hM}$H(B jllib $B$H$N%$%s%?%U%'!<%9$,$&$^$/9g$o$:!"(B + * wnnlib $B$G$OFHN)$7$?%U%!%s%/%7%g%s$H$7$?!#(B + * + * int jcKillLine(jcConvBuf *buf) + * $B8=:_$N%I%C%H$"$k$$$O%+%l%s%HJ8@a0J9_$r:o=|$9$k!#%I%C%H$,$"$kJ8(B + * $B@a$,4{$KJQ49$5$l$F$$$l$P!"$=$NJ8@a!"$D$^$j%+%l%s%HJ8@a$r4^$a$F(B + * $B:o=|$9$k!#%I%C%H$"$k$$$O%+%l%s%HJ8@a$,@hF,$G$"$l$P!"(BjcClear() + * $B$HF1$8F0:n$r$9$k!#$D$^$j!"(BjcClear() $B<+BN$OITMW$K$J$k$N$@$,!"5l(B + * $B%$%s%?%U%'!<%9$r9MN8$7$F!"(BjcClear() $B$O$=$N$^$^;D$9!#(B + * $B$J$*!":o=|8e$N%I%C%H$H%+%l%s%HJ8@a$O!"A4JQ49BP>]J8;zNs$NKvHx!"(B + * $B$"$k$$$O:G=*J8@a$NKvHx$K$"$k6uJ8@a$K$J$k!#(B + * + * $B$3$l$i$N%U%!%s%/%7%g%s$OFC$K=q$+$l$F$$$J$1$l$P@.8y$N>l9g$K$O(B 0, + * $B%(%i!<$N>l9g$K$O(B -1 $B$rJV$9!#(B + * + */ + +/* + * $B%0%m!<%P%kJQ?t(B + * + * wnnlib $B$G;H$o$l$k%0%m!<%P%kJQ?t$O(B jcErrno $B$?$@0l$D$G$"$k!#(B + * + * extern int jcErrno + * $B%(%i!<$N:]$K!"%(%i!<%3!<%I$,BeF~$5$l$k!#%(%i!<%3!<%I$O(B wnnlib.h $B$G(B + * $BDj5A$5$l$F$$$k!#(B + */ + +/* + * $B%G!<%?9=B$(B + * + * wnnlib $B$N;}$D%G!<%?$G!"%"%W%j%1!<%7%g%s$+$iD>@\%"%/%;%9$7$F$h$$$N$O(B + * $BJQ49%P%C%U%!(B jcConvBuf $B7?$N(B public member $B$H=q$+$l$?ItJ,$N$_$G$"$k!#(B + * $BD>@\%"%/%;%9$7$F$h$$$H$$$C$F$b!"CM$r;2>H$9$k$@$1$G!"CM$rJQ99$9$k$3$H$O(B + * $B5v$5$l$J$$!#%"%W%j%1!<%7%g%s$,>!l9g$N(B wnnlib $B$NF0:n$O(B + * $BJ]>Z$5$l$J$$!#(B + * + * <$BJQ49%P%C%U%!(B> + * + * jcConvBuf $B7?$O(B wnnlib.h $B$GpJs(B + * struct wnn_env *env; + * /-* private member *-/ + * [ $B>JN,(B ] + * } jcConvBuf; + * + * nClause $B$O8=:_$NJ8@a?t$rI=$9!#$3$l$O>.J8@a$N?t$G$"$k!#(B + * curClause $B$O%+%l%s%H>.J8@a$NHV9f$G$"$k!#(B + * curLCStart $B$H(B curLCEnd $B$O%+%l%s%HBgJ8@a$NHO0O$r<($9!#(BcurLCStart $B$+$i(B + * curLCEnd-1 $B$NHO0O$NJ8@a$,%+%l%s%HBgJ8@a$G$"$k!#$D$^$j!"(BcurLCEnd $B$O(B + * $B$l$N%P%C%U%!$KF~$l$i$l$?J8;zNs$N:G8e(B + * $B$NJ8;z$NpJs$NF~$C$?G[Ns$G$"$k!#$3$l$O$"$H$G@bL@$9$k!#(B + * + * env $B$O$3$NJQ49%P%C%U%!$N;HMQ$9$k4D6-$G$"$k!#(B + * + * <$BJ8@a>pJs(B> + * + * $B3FJ8@a$N>pJs$O(B clauseInfo $B$H$$$&L>A0$N(B jcClause $B7?$NG[Ns$KF~$C$F$$$k!#(B + * jcClause $B7?$O(B wnnlib.h $B$Ge$N!"$=$NJ8@a$NFI$_$N;O$^$j$N0LCV$r<($9%]%$%s%?(B + * $B$G$"$k!#$^$?!"(Bdispp $B$O!"I=<(%P%C%U%!(B $B>e$G!"$=$NJ8@a$N;O$^$j$N0LCV$r<($9!#(B + * $B=>$C$F!"(Bn $BHV$NJ8@a$O!"(B + * $B$h$_(B: clauseInfo[n].kanap $B$+$i(B clauseInfo[n+1].kanap $B$NA0$^$G(B + * $B4A;z(B: clauseInfo[n].dispp $B$+$i(B clauseInfo[n+1].dispp $B$NA0$^$G(B + * $B$H$J$k!#$3$N$h$&$K(B n $BHVL\$NJ8@a$NHO0O$r<($9$N$K(B n+1 $BHVL\$N(B clauseInfo $B$,(B + * $BI,MW$J$?$a!"(BclauseInfo $B$NG[Ns$NMWAG$O>o$K@hF,$+$iJ8@a?t(B+1$B8D$,M-8z$G$"$k!#(B + * $B$J$*!"@hF,J8@a$O(B 0 $BHVL\$+$i;O$^$k$b$N$H$9$k!#(B + * + * conv $B$O$=$NJ8@a$NJQ49>uBV$rI=$9!#(B0 $B$J$iL$JQ49>uBV!"(B1 $B$J$iJQ49>uBV!"(B + * -1 $B$J$i(B jcKana() $B$K$h$C$F5?;wJQ49$5$l$?$3$H$r<($9!#$3$l$O!"JQ49$N3X=,$H(B + * $BIQEY>pJs$N99?7$N$?$a$K;HMQ$9$k!#(B + * + * ltop $B$,(B 0 $B$G$J$1$l$P$=$NJ8@a$,BgJ8@a$N@hF,$G$"$k$3$H$r<($9!#(Bimabit $B$O(B + * $B$=$NJ8@a$N448l$N:#;H$C$?$h%S%C%H$,F~$C$F$$$k!#(B + * + * kanap, dispp $BEy$G!"(Bn $BHVL\$NJ8@a$NHO0O$r<($9$N$K(B n+1 $BHVL\$NJ8@a>pJs$,(B + * $BI,MW$J$?$a!"(BclauseInfo $B$NG[Ns$NMWAG$O>o$K@hF,$+$iJ8@a?t(B+1$B8D$,M-8z$G$"$k!#(B + * $BJ8@a?t(B+1 $B8DL\$NJ8@a>pJs(B (clauseInfo[nClause]) $B$O(B + * kanap, dispp: $B$=$l$>$l(B kanaEnd, displayEnd $B$KEy$7$$(B + * conv: 0 ($BL$JQ49>uBV(B) + * ltop: 1 + * $B$G$"$k!#(B + * + * $BJ8@a>pJs$N(B kanap, dispp $B$rNc$r;H$C$F<($7$F$*$/!#(B + * + * $BNcJ8(B: $B$3$l$O%G!<%?9=B$$r<($9$?$a$NNcJ8$G$9(B ($BJ8@a?t(B 6) + * + * kanap: $B#0(B $B#1(B $B#2(B $B#3(B $B#4(B $B#5(B $B#6(B(=kanaEnd) + * $B"-(B $B"-(B $B"-(B $B"-(B $B"-(B $B"-(B $B"-(B + * kanaBuf: $B$3$l$O$G!<$?$3$&$>$&$r$7$a$9$?$a$N$l$$$V$s$G$9(B + * + * dispp: $B#0(B $B#1(B $B#2(B $B#3(B $B#4(B $B#5(B $B#6(B(=displayEnd) + * $B"-(B $B"-(B $B"-(B $B"-(B $B"-(B $B"-(B $B"-(B + * displayBuf: $B$3$l$O%G!<%?9=B$$r<($9$?$a$NNcJ8$G$9(B + */ + +#ifndef lint +static char *rcsid = "$Id: wnnlib.c,v 10.18 2002/01/10 15:51:47 ishisone Exp $"; +#endif + +#ifdef DEBUG_WNNLIB +#include +#endif +#include "wnnlib.h" +#include "WStr.h" +#include +#include +#include + +#ifndef LIBDIR +#define LIBDIR "/usr/local/lib/wnn" +#endif + +#ifndef NULL +#define NULL 0 +#endif + +/* + * Wnn7 $B$G$OBgC@$K$b$$$/$D$+$N(B API $B4X?t$K%P%C%U%!%5%$%:$r;XDj$9$k(B + * $B0z?t$rDI2C$7$F$$$k$?$a!"%P!<%8%g%s$rD4$Y!"$=$l$K$h$C$F0z?t$r(B + * $BJQ99$7$J$1$l$P$J$i$J$$!#$H$j$"$($:K\%W%m%0%i%`$G$O(B Wnn7 $B$N0z?t$K9g$o$;$k!#(B + */ + +/* Wnn7 $B$+$I$&$+$NH=Dj(B */ +#ifdef WNN_RENSOU +#define WNN7 +#endif + +#ifdef WNN7 +#define ki2_jl_get_yomi jl_get_yomi +#define ki2_jl_get_kanji jl_get_kanji +#define ki2_jl_get_zenkouho_kanji jl_get_zenkouho_kanji +#define ki2_jl_fuzokugo_get jl_fuzokugo_get +#else +#define ki2_jl_get_yomi(a, b, c, d, sz) jl_get_yomi(a, b, c, d) +#define ki2_jl_get_kanji(a, b, c, d, sz) jl_get_kanji(a, b, c, d) +#define ki2_jl_get_zenkouho_kanji(a, b, c, sz) jl_get_zenkouho_kanji(a, b, c) +#define ki2_jl_fuzokugo_get(a, b, sz) jl_fuzokugo_get(a, b) +#endif /* WNN7 */ + +#ifdef DEBUG_WNNLIB +#ifdef __STDC__ +static void showBuffers(jcConvBuf *, char *); +static void printBuffer(wchar *start, wchar *end); +#else +static void showBuffers(); +static void printBuffer(); +#endif +#define TRACE(f, m) fprintf(stderr, "%s: %s\n", (f), (m)); +#else +#define TRACE(f, m) +#endif + +#define CHECKFIXED(buf) \ + { if ((buf)->fixed) { jcErrno = JE_ALREADYFIXED; return -1; } } +#define Free(p) {if (p) free((char *)(p));} +#define DotSet(buf) (buf)->dot = (buf)->clauseInfo[(buf)->curLCStart].kanap + +#define KANABEG 0xa4a1 /* '$B$!(B' */ +#define KANAEND 0xa4f3 /* '$B$s(B' */ +#define KATAOFFSET 0x100 /* $B%+%?%+%J$H$R$i$,$J$N%3!<%I!&%*%U%;%C%H(B */ + +/* 1$BJ8@a$NFI$_!&4A;z$rcandKind $B$NCM(B */ +#define CAND_SMALL 0 /* $B>.J8@a8uJd(B */ +#define CAND_LARGE 1 /* $BBgJ8@a8uJd(B */ + +#define MAXFZK LENGTHBUNSETSU + +#ifdef SVR4 +#define bcopy(p, q, l) memmove(q, p, l) +#define bzero(p, l) memset(p, 0, l) +#else +#if defined(SYSV) || defined(USG) +#define OVERLAP_BCOPY +extern char *memset(); +#define bzero(p, l) memset(p, 0, l) +#endif +#endif + +#ifdef __STDC__ +/* $B%U%!%s%/%7%g%s%W%m%H%?%$%W@k8@(B */ +static void moveKBuf(jcConvBuf *, int, int); +static void moveDBuf(jcConvBuf *, int, int); +static void moveCInfo(jcConvBuf *, int, int); +static int resizeBuffer(jcConvBuf *, int); +static int resizeCInfo(jcConvBuf *, int); +static void setCurClause(jcConvBuf *, int); +static int getHint(jcConvBuf *, int, int); +static int renConvert(jcConvBuf *, int); +static int tanConvert(jcConvBuf *, int); +static int doKanrenConvert(jcConvBuf *, int); +static int doKantanDConvert(jcConvBuf *, int, int); +static int doKantanSConvert(jcConvBuf *, int); +static int unconvert(jcConvBuf *, int, int); +static int expandOrShrink(jcConvBuf *, int, int, int); +static int makeConverted(jcConvBuf *, int); +static int getCandidates(jcConvBuf *, int); +static int setCandidate(jcConvBuf *, int); +static void checkCandidates(jcConvBuf *, int, int); +static int forceStudy(jcConvBuf *, int); +#else +static void moveKBuf(); +static void moveDBuf(); +static void moveCInfo(); +static int resizeBuffer(); +static int resizeCInfo(); +static void setCurClause(); +static int getHint(); +static int renConvert(); +static int tanConvert(); +static int doKanrenConvert(); +static int doKantanDConvert(); +static int doKantanSConvert(); +static int unconvert(); +static int expandOrShrink(); +static int makeConverted(); +static int getCandidates(); +static int setCandidate(); +static void checkCandidates(); +static int forceStudy(); +#endif + +/* $B%(%i! 0) + *--to = *--from; + } else { + while (n-- > 0) + *to++ = *from++; + } +} +#endif + +/* + * wnnlib $BFbIt$G;H$o$l$k%U%!%s%/%7%g%s(B + */ + +/* moveKBuf -- $B$+$J%P%C%U%!$N;XDj$5$l$?J8@a$N@hF,$+$i$"$H$rF0$+$9(B */ +static void +moveKBuf(buf, cl, move) +jcConvBuf *buf; +int cl; +int move; +{ + jcClause *clp = buf->clauseInfo + cl; + jcClause *clpend; + int movelen; + + TRACE("moveKBuf", "Enter") + + if (move == 0) return; + + if ((movelen = buf->kanaEnd - clp->kanap) > 0) { + /* $B$+$J%P%C%U%!$NFbMF$rF0$+$9(B */ + (void)bcopy((char *)clp->kanap, (char *)(clp->kanap + move), + movelen * sizeof(wchar)); + } + + /* $B$+$J%P%C%U%!$NJQ99$K9g$o$;$F(B clauseInfo $B$r%"%C%W%G!<%H$9$k(B */ + clpend = buf->clauseInfo + buf->nClause; + while (clp <= clpend) { + clp->kanap += move; + clp++; + } + + /* kanaEnd $B$N%"%C%W%G!<%H(B */ + buf->kanaEnd += move; +} + +/* moveDBuf -- $BI=<(%P%C%U%!$N;XDj$5$l$?J8@a$N@hF,$+$i$"$H$rF0$+$9(B */ +static void +moveDBuf(buf, cl, move) +jcConvBuf *buf; +int cl; +int move; +{ + jcClause *clp = buf->clauseInfo + cl; + jcClause *clpend; + int movelen; + + TRACE("moveDBuf", "Enter") + + if (move == 0) return; + + if ((movelen = buf->displayEnd - clp->dispp) > 0) { + /* $BI=<(%P%C%U%!$NFbMF$rF0$+$9(B */ + (void)bcopy((char *)clp->dispp, (char *)(clp->dispp + move), + movelen * sizeof(wchar)); + } + + /* $BI=<(%P%C%U%!$NJQ99$K9g$o$;$F(B clauseInfo $B$r(B + * $B%"%C%W%G!<%H$9$k(B + */ + clpend = buf->clauseInfo + buf->nClause; + while (clp <= clpend) { + clp->dispp += move; + clp++; + } + + /* displayEnd $B$N%"%C%W%G!<%H(B */ + buf->displayEnd += move; +} + +/* moveCInfo -- ClauseInfo $B$N;XDj$5$l$?J8@a$N@hF,$+$i$"$H$rF0$+$9(B */ +static void +moveCInfo(buf, cl, move) +jcConvBuf *buf; +int cl; +int move; +{ + jcClause *clp = buf->clauseInfo + cl; + int len; + + TRACE("moveCInfo", "Enter") + + /* move $B$K@5$N?t$r;XDj$9$l$PJ8@a$NA^F~!"Ii$J$iJ8@a$N:o=|$K$J$k(B */ + + if (move == 0) return; + + if ((len = buf->nClause + 1 - cl) > 0) { + (void)bcopy((char *)clp, (char *)(clp + move), + len * sizeof(jcClause)); + } + buf->nClause += move; + + /* + * $B8uJd$rl9g$K$O!"(B + * setCandidate() $B$NCf$G@_Dj$7$J$*$5$l$k!"$^$?!"(Bjllib $BFb$G$b(B + * $BF1$8J8@a$KBP$9$kA48uJdl9g$N9MN8$,$"$k!#(B + * $B$H$$$&$3$H$G!"$3$3$O0BA4%5%$%I$G$$$/!#(B + */ + if (buf->candClause >= 0) { + buf->candClause = -1; + buf->candClauseEnd = -1; + } +} + +/* resizeBuffer -- $B$+$J(B/$BI=<(%P%C%U%!$NBg$-$5$rJQ$($k(B */ +static int +resizeBuffer(buf, len) +jcConvBuf *buf; +int len; +{ + wchar *kbufold, *dbufold; + wchar *kbufnew, *dbufnew; + int allocsize; + jcClause *clp, *clpend; + + TRACE("resizeBuffer", "Enter") + + kbufold = buf->kanaBuf; + dbufold = buf->displayBuf; + + /* realloc $B$9$k(B */ + allocsize = (len + 1) * sizeof(wchar); + kbufnew = (wchar *)realloc((char *)kbufold, allocsize); + dbufnew = (wchar *)realloc((char *)dbufold, allocsize); + + if (kbufnew == NULL || dbufnew == NULL) { + Free(kbufnew); + Free(dbufnew); + jcErrno = JE_NOCORE; + return -1; + } + + buf->bufferSize = len; + + if (kbufnew == kbufold && dbufnew == dbufold) { + /* $B%]%$%s%?$OA0$HJQ$o$C$F$$$J$$(B */ + return 0; + } + + /* $B3FkanaBuf = kbufnew; + buf->kanaEnd = kbufnew + (buf->kanaEnd - kbufold); + buf->displayBuf = dbufnew; + buf->displayEnd = dbufnew + (buf->displayEnd - dbufold); + + buf->dot = kbufnew + (buf->dot - kbufold); + + clp = buf->clauseInfo; + clpend = clp + buf->nClause; + while (clp <= clpend) { + clp->kanap = kbufnew + (clp->kanap - kbufold); + clp->dispp = dbufnew + (clp->dispp - dbufold); + clp++; + } + + return 0; +} + +/* resizeCInfo -- clauseInfo $B%P%C%U%!$NBg$-$5$rJQ$($k(B */ +static int +resizeCInfo(buf, size) +jcConvBuf *buf; +int size; +{ + jcClause *cinfonew; + + TRACE("resizeCInfo", "Enter") + + /* realloc $B$9$k(B */ + cinfonew = (jcClause *)realloc((char *)buf->clauseInfo, + (size + 1) * sizeof(jcClause)); + if (cinfonew == NULL) { + jcErrno = JE_NOCORE; + return -1; + } + + buf->clauseSize = size; + buf->clauseInfo = cinfonew; + return 0; +} + +/* setCurClause -- $B%+%l%s%HJ8@a$r@_Dj$9$k(B */ +static void +setCurClause(buf, cl) +jcConvBuf *buf; +int cl; /* $B%+%l%s%H>.J8@aHV9f(B */ +{ + jcClause *clp = buf->clauseInfo; + int i; + + TRACE("setCurClause", "Enter") + + /* $B%+%l%s%H>.J8@a(B */ + buf->curClause = cl; + + /* $B%+%l%s%HBgJ8@a3+;OJ8@a(B */ + for (i = cl; i > 0 && !clp[i].ltop; i--) + ; + buf->curLCStart = i; + + /* $B%+%l%s%HBgJ8@a=*N;J8@a(B ($B$NnClause && !clp[i].ltop; i++) + ; + buf->curLCEnd = i; +} + +/* getHint -- $BJ8@a$NA08e$N@\B3>pJs$rF@$k(B */ +static int +getHint(buf, start, end) +jcConvBuf *buf; +int start; +int end; +{ + jcClause *cinfo = buf->clauseInfo; + int hint = 0; + + TRACE("getHint", "Enter") + + /* + * $B:G=i$NJ8@a$ND>A0$NJ8@a$,JQ49$5$l$F$$$l$P!"A0$NJ8@a$H@\B3$r$9$k(B + */ + if (start > 0 && cinfo[start - 1].conv == 1) + hint |= WNN_USE_MAE; + + /* + * $B:G8e$NJ8@a$ND>8e$,JQ49$5$l$F$$$F$$$l$P!"8e$NJ8@a$H@\B3$r$9$k(B + */ + if (end > 0 && end < jl_bun_suu(buf->wnn) && cinfo[end].conv == 1) + hint |= WNN_USE_ATO; + + return hint; +} + + +/* renConvert -- $B%+%l%s%HJ8@a$+$i8e$m$rO"J8@aJQ49$9$k(B */ +static int +renConvert(buf, small) +jcConvBuf *buf; +int small; +{ + TRACE("renConvert", "Enter") + + /* $BO"J8@aJQ49$9$k(B */ + if (doKanrenConvert(buf, + small ? buf->curClause : buf->curLCStart) < 0) { + return -1; + } + + /* + * $B%+%l%s%HJ8@a$N@_Dj(B + * small $B$,(B 0 $B$J$i!"(B + * $B%+%l%s%HBgJ8@a$N@hF,$O(B buf->curLCStart $B$GJQ$o$i$:(B + * $B%+%l%s%HBgJ8@a=*$j$O(B ltop $B%U%i%0$r%5!<%A$7$FC5$9(B + * $B%+%l%s%H>.J8@a$O%+%l%s%HBgJ8@a@hF,$K0\F0(B + * small $B$,(B 0 $B$G$J$$$J$i!"(B + * $B%+%l%s%H>.J8@a$O(B buf->curClause $B$GJQ$o$i$:(B + * $B%+%l%s%HBgJ8@a$N@hF,$*$h$S=*$j$O!"%+%l%s%H>.J8@a$N(B + * $BA08e$r(B ltop $B%U%i%0$r%5!<%A$7$FC5$9(B + */ + setCurClause(buf, small ? buf->curClause : buf->curLCStart); + + /* $B%I%C%H$N@_Dj(B */ + DotSet(buf); + + return 0; +} + +/* tanConvert -- $B%+%l%s%HJ8@a$rC1J8@aJQ49$9$k(B */ +static int +tanConvert(buf, small) +jcConvBuf *buf; +int small; +{ + TRACE("tanConvert", "Enter") + + /* + * $BC1J8@aJQ49$N>l9g!"4pK\E*$K(B 2 $BCJ3,$N=hM}$r9T$J$&$3$H$K$J$k(B + * $B$^$:!"%+%l%s%HJ8@a$rC1J8@aJQ49(B + * $BcurClause) < 0) + return -1; + + /* $B%+%l%s%HJ8@a$N@_Dj(B + * $B%+%l%s%H>.J8@a$O(B buf->curClause $B$GJQ$o$i$:(B + * $B%+%l%s%HBgJ8@a$N@hF,$H:G8e$O%+%l%s%H>.J8@a$N(B + * $BA08e$K(B ltop $B%U%i%0$r%5!<%A$7$FC5$9(B + */ + setCurClause(buf, buf->curClause); + /* $B%I%C%H$N@_Dj(B */ + DotSet(buf); + + /* $BO"J8@aJQ49(B */ + if (buf->curClause + 1 < buf->nClause && + buf->clauseInfo[buf->curClause + 1].conv == 0) { + /* $B>.J8@a$NC1J8@aJQ49%b!<%I$G!"l9g!"(Bltop $B%U%i%0$r(B 0 $B$K$7$F(B + * $BA0$H@\B3$G$-$k$h$&$K$9$k(B + */ + buf->clauseInfo[buf->curClause + 1].ltop = 0; + } + if (doKanrenConvert(buf, buf->curClause + 1) < 0) + return -1; + + /* $B$b$&0lEY%+%l%s%HJ8@a$N@_Dj(B + * $BO"J8@aJQ49$N7k2L$K$h$C$F$O%+%l%s%HBgJ8@a$N:G8e$,(B + * $B0\F0$9$k$3$H$,$"$k(B + */ + setCurClause(buf, buf->curClause); + + /* $B%I%C%H$O0\F0$7$J$$$N$G:F@_Dj$7$J$/$F$h$$(B */ + } else { + /* $B$^$:C1J8@aJQ49$9$k(B */ + if (doKantanDConvert(buf, buf->curLCStart, buf->curLCEnd) < 0) + return -1; + + /* $B%+%l%s%HJ8@a$N@_Dj(B + * $B%+%l%s%HBgJ8@a$N@hF,$O(B buf->curLCStart $B$GJQ$o$i$:(B + * $B%+%l%s%HBgJ8@a=*$j$O(B ltop $B%U%i%0$r%5!<%A$7$FC5$9(B + * $B%+%l%s%H>.J8@a$O%+%l%s%HBgJ8@a@hF,$K0\F0(B + */ + setCurClause(buf, buf->curLCStart); + DotSet(buf); + + /* $BO"J8@aJQ49(B */ + if (doKanrenConvert(buf, buf->curLCEnd) < 0) + return -1; + /* $B$3$A$i$O(B small $B$N;~$H0c$C$FO"J8@aJQ49$N7k2L%+%l%s%HJ8@a$,(B + * $B0\F0$9$k$3$H$O$J$$(B + */ + } + + return 0; +} + +/* doKanrenConvert -- $B;XDj$5$l$?J8@a$+$i8e$m$rO"J8@aJQ49$9$k(B */ +static int +doKanrenConvert(buf, cl) +jcConvBuf *buf; +int cl; +{ + jcClause *clp; + wchar *kanap, *dispp; + wchar savechar; + int nsbun; + int len, n; + + TRACE("doKanrenConvert", "Enter") + + /* + * $B;XDj$5$l$?J8@a$+$i8e$m$rO"J8@aJQ49$9$k(B + * $B%+%l%s%HJ8@a$N:F@_Dj$J$I$O$7$J$$(B + */ + + if (cl >= buf->nClause) { + /* $B;XDj$5$l$?J8@a$O$J$$(B + * $B%(%i!<$K$O$7$J$$(B + * $B6u$NJ8@a$rJQ49$7$h$&$H$7$?;~$K!"$=$l$r;vA0$K%A%'%C%/$7$F(B + * $B%(%i!<$K$9$k$N$O>e0L$N4X?t$N@UG$$G$"$k(B + */ + return 0; + } + + /* + * $BJQ49$9$kA0$K!">/$J$/$H$b;XDj$5$l$?J8@a$ND>A0$^$G$,JQ49$5$l$F(B + * $B$$$k$3$H$rJ]>Z$9$k(B + */ + if (makeConverted(buf, cl) < 0) + return -1; + + clp = buf->clauseInfo + cl; + + /* $B$+$J%P%C%U%!$r(B NULL $B%?!<%_%M!<%H$5$;$F$*$/(B */ + *(buf->kanaEnd) = 0; + + /* $BO"J8@aJQ49$9$k(B */ +#ifdef WNN6 + nsbun = jl_fi_ren_conv(buf->wnn, clp->kanap, + cl, -1, getHint(buf, cl, -1)); +#else + nsbun = jl_ren_conv(buf->wnn, clp->kanap, + cl, -1, getHint(buf, cl, -1)); +#endif + + if (nsbun < 0) { + jcErrno = JE_WNNERROR; + return -1; + } + + /* clauseInfo $B$N%5%$%:$N%A%'%C%/(B */ + if (nsbun > buf->clauseSize) { + if (resizeCInfo(buf, cl + nsbun) < 0) + return -1; + } + + /* $BclauseInfo + cl; + len = (clp->dispp - buf->displayBuf) + jl_kanji_len(buf->wnn, cl, -1); + + if (len > buf->bufferSize) { + if (resizeBuffer(buf, len) < 0) + return -1; + } + + buf->nClause = nsbun; + + /* $B$G$O(B clauseInfo $B$KJQ497k2L$rF~$l$F$$$/(B */ + clp = buf->clauseInfo + cl; + kanap = clp->kanap; + dispp = clp->dispp; + while (cl < buf->nClause) { + n = cl + 1; + + /* $BJ8@a>pJs$N@_Dj(B */ + clp->conv = 1; + clp->kanap = kanap; + clp->dispp = dispp; + clp->ltop = jl_dai_top(buf->wnn, cl); + + /* $BI=<(%P%C%U%!$XJQ49J8;zNs$r%3%T!<$9$k(B */ + /* jl_get_kanji $B$O!"(BNULL $B$^$G%3%T!<$9$k$N$GCm0U(B */ + len = jl_kanji_len(buf->wnn, cl, n); + savechar = dispp[len]; + (void)ki2_jl_get_kanji(buf->wnn, cl, n, dispp, len); + dispp[len] = savechar; + dispp += len; + + /* $B$+$J%P%C%U%!$N0LCV$rJ8@a$N:G8e$K$9$k(B */ + kanap += jl_yomi_len(buf->wnn, cl, n); + + /* $B%+%l%s%HJ8@a$N99?7(B */ + cl = n; + clp++; + } + + /* $B:G8e$N(B clauseInfo $B$N@_Dj(B */ + clp->kanap = buf->kanaEnd; + clp->dispp = buf->displayEnd = dispp; + clp->conv = 0; + clp->ltop = 1; + +#ifdef DEBUG_WNNLIB + showBuffers(buf, "after doKanrenConvert"); +#endif + + return 0; +} + +/* doKantanDConvert -- $B;XDj$5$l$?HO0O$NJ8@a$rBgJ8@a$H$7$FC1J8@aJQ49$9$k(B */ +static int +doKantanDConvert(buf, cls, cle) +jcConvBuf *buf; +int cls; +int cle; +{ + jcClause *clps, *clpe; + int len, diff, newlen; + int cldiff, nclausenew; + wchar *kanap, *dispp; + wchar savechar; + wchar *savep; + int nsbunnew, nsbunold; + int i, n; + + TRACE("doKantanDConvert", "Enter") + + /* + * $BJQ49$9$kA0$K!">/$J$/$H$b;XDj$5$l$?J8@a$ND>A0$^$G$,JQ49$5$l$F(B + * $B$$$k$3$H$rJ]>Z$9$k(B + */ + if (makeConverted(buf, cls) < 0) + return -1; + + /* + * $B;XDj$5$l$?HO0O$NJ8@a$rBgJ8@a$H$7$FC1J8@aJQ49$9$k(B + * $B%+%l%s%HJ8@a$N:F@_Dj$J$I$O$7$J$$(B + */ + + clps = buf->clauseInfo + cls; + clpe = buf->clauseInfo + cle; + nsbunold = jl_bun_suu(buf->wnn); + if (nsbunold < 0) { + jcErrno = JE_WNNERROR; + return -1; + } + + /* + * $BFI$_$r(B NULL $B%?!<%_%M!<%H$9$k(B + * $BC1$K(B 0 $B$rF~$l$k$Hkanap; + savechar = *savep; + *savep = 0; + + /* $BC1J8@aJQ49$9$k(B */ + nsbunnew = jl_tan_conv(buf->wnn, clps->kanap, cls, cle, + getHint(buf, cls, cle), WNN_DAI); + + /* $B$9$+$5$:%;!<%V$7$F$"$C$?J8;z$r$b$H$KLa$9(B */ + *savep = savechar; + + if (nsbunnew < 0) { + jcErrno = JE_WNNERROR; + return -1; + } + + cldiff = (cle - cls) - (nsbunold - nsbunnew); + nclausenew = buf->nClause + cldiff; + /* clauseInfo $B$N%5%$%:$N%A%'%C%/(B */ + if (nclausenew > buf->clauseSize) { + if (resizeCInfo(buf, nclausenew) < 0) + return -1; + } + + /* $BJQ49J8;zNs$ND9$5$N%A%'%C%/(B */ + len = jl_kanji_len(buf->wnn, cls, cle + cldiff); + diff = len - (clpe->dispp - clps->dispp); + newlen = (buf->displayEnd - buf->displayBuf) + diff; + if (newlen > buf->bufferSize) { + if (resizeBuffer(buf, newlen) < 0) + return -1; + } + + /* + * $BJ8@a$rA^F~$9$k$N$G!"I=<(%P%C%U%!$NFbMF$r0\F0$5$;$k!#(B + * + * $B$I$&$;$"$H$+$iO"J8@aJQ49$9$k$+$i$$$$$G$O$J$$$+$H$$$&9M$(J}$b$"$k$,!"(B + * $B$I$3$G%(%i!<$,5/$3$C$F$b0l1~$N(B consistency $B$,J]$?$l$k$h$&$K(B + * $B$9$k$H$$$&$N$,L\I8$G$"$k(B + */ + moveDBuf(buf, cle, diff); + + /* clauseInfo $B$rF0$+$9(B ($BF1;~$K(B nClause $B$b%"%C%W%G!<%H$5$l$k(B) */ + moveCInfo(buf, cle, cldiff); + + /* $B$G$O(B clauseInfo $B$KJQ497k2L$rF~$l$k(B */ + clps = buf->clauseInfo + cls; + kanap = clps->kanap; + dispp = clps->dispp; + cldiff += (cle - cls); + for (i = 0; i < cldiff; i++) { + n = cls + 1; + + /* $BJ8@a>pJs$r@_Dj$9$k(B */ + clps->conv = 1; + clps->ltop = jl_dai_top(buf->wnn, cls); + clps->kanap = kanap; + clps->dispp = dispp; + + /* $BI=<(%P%C%U%!$X$NJQ49J8;zNs$N%3%T!<(B */ + /* jl_get_kanji $B$O!"(BNULL $B$^$G%3%T!<$9$k$N$GCm0U(B */ + len = jl_kanji_len(buf->wnn, cls, n); + savechar = dispp[len]; + (void)ki2_jl_get_kanji(buf->wnn, cls, n, dispp, len); + dispp[len] = savechar; + dispp += len; + + /* $B$+$J%P%C%U%!$N0LCV$r99?7(B */ + kanap += jl_yomi_len(buf->wnn, cls, n); + + /* $BpJs$N99?7(B */ + cls = n; + clps++; + } + + /* $Bwnn)) + clps->ltop = jl_dai_top(buf->wnn, cls); + else + clps->ltop = 1; + + return 0; +} + +/* doKantanSConvert -- $B;XDj$5$l$?J8@a$r>.J8@a$H$7$FC1J8@aJQ49$9$k(B */ +static int +doKantanSConvert(buf, cl) +jcConvBuf *buf; +int cl; +{ + int next = cl + 1; + jcClause *clp; + int len, newlen, diff; + wchar savechar; + wchar *savep; + int nsbun; + + TRACE("doKantanSConvert", "Enter") + + /* + * $BJQ49$9$kA0$K!">/$J$/$H$b;XDj$5$l$?J8@a$ND>A0$^$G$,JQ49$5$l$F(B + * $B$$$k$3$H$rJ]>Z$9$k(B + */ + if (makeConverted(buf, cl) < 0) + return -1; + + /* + * $B;XDj$5$l$?J8@a$r>.J8@a$H$7$FC1J8@aJQ49$9$k(B + * $B%+%l%s%HJ8@a$N:F@_Dj$J$I$O$7$J$$(B + */ + + clp = buf->clauseInfo + cl; + + /* + * $BFI$_$r(B NULL $B%?!<%_%M!<%H$9$k(B + * $BC1$K(B 0 $B$rF~$l$k$Hkanap; + savechar = *savep; + *savep = 0; + + /* $BC1J8@aJQ49$9$k(B */ + nsbun = jl_tan_conv(buf->wnn, clp->kanap, cl, next, + getHint(buf, cl, next), WNN_SHO); + + + /* $B$9$+$5$:%;!<%V$7$F$"$C$?J8;z$r$b$H$KLa$9(B */ + *savep = savechar; + + if (nsbun < 0) { + jcErrno = JE_WNNERROR; + return -1; + } + + /* $BJQ49J8;zNs$ND9$5$N%A%'%C%/(B */ + clp = buf->clauseInfo + cl; + len = jl_kanji_len(buf->wnn, cl); + diff = len - ((clp + 1)->dispp - clp->dispp); + newlen = (buf->displayEnd - buf->displayBuf) + diff; + if (newlen > buf->bufferSize) { + if (resizeBuffer(buf, newlen) < 0) + return -1; + } + + /* $BJ8@a$rA^F~$9$k$N$G!"I=<(%P%C%U%!$NFbMF$r0\F0$5$;$k(B */ + /* $B$I$&$;$"$H$+$iO"J8@aJQ49$9$k$+$i$$$$$G$O$J$$$+$H$$$&9M$(J}$b$"$k$,!"(B + * $B$I$3$G%(%i!<$,5/$3$C$F$b0l1~$N(B consistency $B$,J]$?$l$k$h$&$K(B + * $B$9$k$H$$$&$N$,L\I8$G$"$k(B + */ + moveDBuf(buf, next, diff); + + /* $B$G$O(B clauseInfo $B$KJQ497k2L$rF~$l$k(B */ + clp = buf->clauseInfo + cl; + clp->conv = 1; + clp->ltop = jl_dai_top(buf->wnn, cl); + + /* $BI=<(%P%C%U%!$XJQ49J8;zNs$r%3%T!<(B */ + /* jl_get_kanji $B$G$O!":G8e$N(B NULL $B$b%3%T!<$5$l$k$N$GCm0U(B */ + savechar = clp->dispp[len]; + (void)ki2_jl_get_kanji(buf->wnn, cl, next, clp->dispp, len); + clp->dispp[len] = savechar; + + /* $Bwnn)) + (clp + 1)->ltop = jl_dai_top(buf->wnn, next); + + return 0; +} + + +/* makeConverted -- $B;XDj$5$l$?J8@a$ND>A0$^$G$,(B jllib $B$GJQ49$5$l$F$$$k(B + $B$3$H$rJ]>Z$9$k(B */ +static int +makeConverted(buf, cl) +jcConvBuf *buf; +int cl; +{ + int nsbun; + int next; + int status; + wchar savechar; + jcClause *clpc, *clpn; + + TRACE("makeConverted", "Enter") + +#ifdef DEBUG_WNNLIB + showBuffers(buf, "before makeConverted"); +#endif + + /* $B4{$KJQ49$5$l$F$$$k$+%A%'%C%/$9$k(B */ + nsbun = jl_bun_suu(buf->wnn); + if (cl <= nsbun) + return 0; + + /* $BJQ49$5$l$F$$$J$$J8@a$rEPO?$9$k(B */ + clpc = buf->clauseInfo + nsbun; + for (; nsbun < cl; nsbun = next, clpc = clpn) { + clpn = clpc + 1; + next = nsbun + 1; + + /* $B4{$KEPO?$5$l$F$$$l$P!"2?$b$7$J$$(B */ + if (clpc->conv == 1) + continue; + + /* $BI=<(J8;zNs$r(B NULL $B%?!<%_%M!<%H$9$k(B */ + savechar = *clpn->dispp; + *clpn->dispp = 0; + + /* + * jllib $B$K$OL5JQ49$NJ8@a$rEPO?$9$k5!G=$,$J$$$N$G!"(B + * $B$H$j$"$($:A08e$N@\B3$J$7$GC1J8@aJQ49$9$k$3$H$K$9$k(B + */ + status = jl_tan_conv(buf->wnn, clpc->dispp, + nsbun, next, WNN_NO_USE, WNN_SHO); + + /* $B%;!<%V$7$?J8;z$rLa$9(B */ + *clpn->dispp = savechar; + + if (status < 0) { + jcErrno = JE_WNNERROR; + return -1; + } + } + +#ifdef DEBUG_WNNLIB + showBuffers(buf, "after makeConverted"); +#endif + + return 0; +} + +/* unconvert -- $B;XDj$5$l$?HO0O$NJ8@a$r0l$D$NL5JQ49$NJ8@a$K$9$k(B */ +static int +unconvert(buf, start, end) +jcConvBuf *buf; +int start; +int end; +{ + jcClause *clps, *clpe; + int diff, len; + wchar savechar; + + TRACE("unconvert", "Enter") + + if (end <= start) + return 0; + + if (start >= buf->nClause) + return 0; + +#ifdef DEBUG_WNNLIB + showBuffers(buf, "before unconvert"); +#endif + + clps = buf->clauseInfo + start; + clpe = buf->clauseInfo + end; + + /* + * $BI=<(%P%C%U%!$NFbMF$r$+$J%P%C%U%!$NFbMF$GCV$-49$($k(B + * $B!D$H$$$C$F$b$Ke0L$N4X?t$G@_Dj$9$k$3$H(B + * $B!&BgJ8@a%U%i%0(B (ltop) $B$N@_Dj(B + * $B!&%+%l%s%HJ8@a!"$*$h$Skanap - clps->kanap) - (clpe->dispp - clps->dispp); + /* $BCV$-49$($?>l9g$NI=<(%P%C%U%!$ND9$5(B */ + len = (buf->displayEnd - buf->displayBuf) + diff; + /* $B%P%C%U%!$N%5%$%:$,B-$j$J$1$l$P%5%$%:$rBg$-$/$9$k(B */ + if (len > buf->bufferSize) { + if (resizeBuffer(buf, len) < 0) { + /* $B%5%$%:$,JQ$($i$l$J$+$C$?(B */ + return -1; + } + } + + /* $BCV$-49$((B */ + /* $B$^$:8e$m$NItJ,$rF0$+$7$F$+$i(B */ + moveDBuf(buf, end, diff); + /* $BFI$_$rF~$l$k(B */ + (void)bcopy((char *)clps->kanap, (char *)clps->dispp, + (clpe->kanap - clps->kanap) * sizeof(wchar)); + + /* + * start $B$+$i(B end $B$^$G$NJ8@a$r0l$D$K$^$H$a$k(B + */ + + /* $BL5JQ49>uBV$K$J$C$?J8@a$N(B clauseInfo $B$N@_Dj(B */ + clps->conv = 0; + + /* end $B$+$i$"$H$N(B clauseInfo $B$r(B'$B$D$a$k(B' */ + moveCInfo(buf, end, start + 1 - end); + + /* $BJ8@a$rEPO?$9$k(B */ + /* $BEPO?$5$l$F$$$kJ8@a$ND9$5$r%A%'%C%/(B */ + if (jl_bun_suu(buf->wnn) < end) + end = -1; + + /* $BEPO?$9$kA0$K!"FI$_$r(B NULL $B%?!<%_%M!<%H$7$F$*$/(B */ + clpe = clps + 1; + savechar = *clpe->kanap; + *clpe->kanap = 0; + + /* $BL5JQ49$GEPO?$7$?$$$,$G$-$J$$$N$G!"A08e$N@\B3$J$7$G!"C1J8@a(B + * $BJQ49$9$k(B + */ + + len = jl_tan_conv(buf->wnn, clps->kanap, + start, end, WNN_NO_USE, WNN_SHO); + + /* $BFI$_$r85$K!"La$7$F$*$/(B */ + *clpe->kanap = savechar; + +#ifdef DEBUG_WNNLIB + showBuffers(buf, "after unconvert"); +#endif + + /* $BEPO?$G$-$?$+$r!"%A%'%C%/(B */ + if (len < 0) { + jcErrno = JE_WNNERROR; + return -1; + } + + return 0; +} + +static int +expandOrShrink(buf, small, expand, convf) +jcConvBuf *buf; +int small; +int expand; +int convf; +{ + jcClause *clp, *clpe; + wchar *kanap, *dispp; + int start, end; + int len; + int nsbun; + + TRACE("expandOrShrink", "Enter") + + start = small ? buf->curClause : buf->curLCStart; + end = small ? start + 1 : buf->curLCEnd; + + clp = buf->clauseInfo + start; + clpe = buf->clauseInfo + end; + + /* + * $B?-$S=L$_$G$-$k$+$N%A%'%C%/(B + */ + if (expand) { + /* + * $B%+%l%s%HJ8@a$,:G8e$NJ8@a$N;~$K$O(B + * $B$b$&9-$2$i$l$J$$(B + */ + if (end >= buf->nClause) { + jcErrno = JE_CANTEXPAND; + return -1; + } + len = 1; + } else { + if (buf->curClause == buf->nClause || + clpe->kanap - clp->kanap <= 1) { + /* $B%+%l%s%HJ8@a$,6u$+!"$"$k$$$OD9$5$,#10J2<(B */ + jcErrno = JE_CANTSHRINK; + return -1; + } + len = -1; + } + + /* $BA48uJdJ8@a$,%+%l%s%HBgJ8@a$+$=$l0J9_$K$"$l$PL58z$K$9$k(B */ + checkCandidates(buf, start, buf->nClause); + + /* jclib $B$H8_49$rJ]$D$?$a!":FJQ49;XDj$G$J$$>l9g$O!"FCJL$K=hM}$9$k(B */ + if (!convf) { + /* jclib $B$HF1MM$K(B unconvert() $B$r;H$C$F!"=hM}$r$7$F$bNI$$$N(B + * $B$@$,!"L5BL$,$"$k$N$GFH<+$N=hM}$H$9$k(B + */ + int ksize; + int dsize; + + /* jllib $B$N>pJs$,$"$l$P!"%+%l%s%HJ8@a0J9_$rL58z$K$9$k(B */ + if (start < jl_bun_suu(buf->wnn)) + jl_kill(buf->wnn, start, -1); + + /* $B%+%l%s%HJ8@a0J9_$NI=<(%P%C%U%!$NFbMF$r!"$+$J%P%C%U%!(B + * $B$NFbMF$GCV49$($k(B (unconvert() $B;2>H(B) + */ + + clp = buf->clauseInfo + start; + + /* $B$^$:!"I=<(%P%C%U%!$NBg$-$5$rD4$Y!"I,MW$J$i$P%P%C%U%!(B + * $B$r3HD%$9$k(B + */ + ksize = buf->kanaEnd - clp->kanap; + dsize = ksize + (clp->dispp - buf->displayBuf); + if (dsize > buf->bufferSize) { + if (resizeBuffer(buf, dsize)) + return -1; + } + + /* $BI=<(%P%C%U%!$NFbMF$r!"$+$J%P%C%U%!$NFbMF$GCV49$($k(B */ + bcopy(clp->kanap, clp->dispp, ksize * sizeof (wchar)); + + /* $BI=<(%P%C%U%!$N=*$j$r@_Dj$9$k(B */ + buf->displayEnd = clp->dispp + ksize; + + /* $B%+%l%s%HJ8@a$r@_Dj$9$k(B + */ + buf->curClause = buf->curLCStart = start; + buf->dot = clp->kanap; + clp->conv = 0; + clp->ltop = 1; + + /* $B?-=L$7$?7k2L!"J8@a?t$O(B start + 1 ($B%+%l%s%HJ8@a$ND9(B + * $B$5$,(B 1 $B$G$"$C$?;~!"=L$a$?7k2L%+%l%s%HJ8@a$,$J$/$J$k!#(B + * $B$^$?$O!"%+%l%s%HJ8@a$N8e$K$R$H$D$NJ8@a$7$+$J$/!"$=(B + * $B$NJ8@a$ND9$5$,(B 1 $B$G$"$C$?>l9g!"?-$P$7$?7k2L%+%l%s%H(B + * $BJ8@a$h$j8e$NJ8@a$,$J$/$J$k(B) $B$+(B start + 2 $B$K$J$k(B + */ + + /* $B$^$:!"?-=L8e$N%+%l%s%HJ8@a$ND9$5$r7W;;$9$k(B */ + ksize = buf->clauseInfo[end].kanap - clp->kanap + len; + + /* $B$=$7$F!"%+%l%s%HJ8@a$N8e$K$"$kJ8@a$r@_Dj$9$k(B */ + if (ksize == 0 || buf->displayEnd == clp->dispp + ksize) { + /* $B=L$a$?7k2L%+%l%s%HJ8@a$,$J$/$J$C$?$+!"(B + * $B?-$P$7$?7k2L%+%l%s%HJ8@a$N8e$NJ8@a$,$J$/$J$C$?(B + * + * $B$3$l$i$N>l9g$O!"A0$N%+%l%s%HJ8@a0J9_$r$R$H(B + * $B$^$H$a(B ($B$R$H$D$NBgJ8@a(B) $B$K$7$F!"$=$l$r%+%l(B + * $B%s%HJ8@a(B ($BBgJ8@a(B) $B$H$7$F$7$^$&(B + * + * $B$3$N;~!"(BclauseInfo $B$NBg$-$5$O!"I,$:(B start + 1 + * $B$h$jBg$-$$$3$H$,J]>Z$5$l$F$$$k(B + */ + buf->nClause = buf->curLCEnd = start + 1; + + /* $BKvHxJ8@a$r%]%$%s%H$5$;$k(B */ + clp++; + } else if (start + 2 > buf->clauseSize + && resizeCInfo(buf, start + 1) < 0) { + /* $B=L$a$h$&$H$9$kJ8@a$,:G8e$NJ8@a$@$C$?>l9g!"(B + * $BD9$5$,(B 1 $B$NJ8@a$,A}$($k$3$H$K$J$k!#(B + * $B$,!"(BclauseInfo $B$NBg$-$5$r%A%'%C%/$7!"$=$l$r(B + * $BA}$d$;$J$+$C$?$N$G!"%+%l%s%HJ8@a0J9_$rA4It$R(B + * $B$H$^$H$a$K$9$k(B ($B%P%C%U%!$N@09g@-$rJ]$D$?$a(B) + */ + buf->nClause = buf->curLCEnd = start + 1; + clp++; + clp->kanap = buf->kanaEnd; + clp->dispp = buf->displayEnd; + clp->conv = 0; + clp->ltop = 1; + + /* $B$G$b!"%(%i!<$O%(%i!<$J$N$G!"%(%i!<$H$7$FJV$9(B */ +#ifdef DEBUG_WNNLIB + showBuffers(buf, + "after expandOrShrink [noconv, error]"); +#endif + return -1; + } else { + /* $B?-=L$G$-$?$N$G!"%+%l%s%HJ8@a$N8e$NJ8@a$r@_Dj$9$k(B + * ($B$"$^$j!"0UL#$O$J$$$H$O;W$&$,!">.J8@a$N?-=L8e$N(B + * $BBgJ8@a$N@_Dj$O!"(Bjclib $B$N@_Dj$HF1$8$K$7$F$*$/(B) + */ + buf->curLCEnd = start + (small ? 2 : 1); + buf->nClause = start + 2; + clpe = clp + 1; + clpe->kanap = clp->kanap + ksize; + clpe->dispp = clp->dispp + ksize; + clpe->conv = 0; + clpe->ltop = small ? 0 : 1; + + /* $BKvHxJ8@a$r%]%$%s%H$5$;$k(B */ + clp += 2; + } + + /* $BKvHxJ8@a$N>pJs$r@_Dj$9$k(B */ + clp->kanap = buf->kanaEnd; + clp->dispp = buf->displayEnd; + clp->conv = 0; + clp->ltop = 1; + +#ifdef DEBUG_WNNLIB + showBuffers(buf, "after expandOrShrink [noconv]"); +#endif + return 0; + } + + /* $B$9$Y$F$NJ8@a$,JQ49$5$l$F$$$k$3$H$rJ]>Z$9$k(B */ + makeConverted(buf, buf->nClause); + + /* + * $BJ8@a$ND9$5$rJQ99$9$k!#$3$N;~!"A0J8@a$K@\B32DG=$K$7$F$*$/$H(B + * $B:$$k$3$H$,$"$k!#Nc$($P!VL5NLBg?t!W$HF~NO$7$h$&$H$7$F!"(B + * a) "$B$`$j$g$&$?$$$9$&(B" $B$rJQ49$9$k$H(B"$BL5NA(B $BBP?t(B" $B$H$J$k!#(B + * b) "$BL5NA(B" $B$r(B "$BL5NL(B" $B$KD>$9!#(B + * c) "$BBP?t(B" $B$r(B "$BBg?t(B" $B$KD>$=$&$H;W$C$?$,8uJd$K$J$$$N$G(B2$BJ8;zJ,(B + * $BJ8@a$r=L$a$F(B "$BBg(B $B?t(B" $B$KJ,$1$h$&$H$9$k!#(B + * d) $B$H$3$m$,(B "$B$?$$(B" $B$,A08uJd$K@\B3$7$F$7$^$$!"(B"$BL5NLBN(B $B?t(B" $B$K$J$k!#(B + * e) "$BL5NLBg(B" $B$H$$$&8uJd$O$J$$$N$G!";EJ}$J$/(B2$BJ8;zJ8@a$r=L$a$k$H(B + * "$BL5NA(B $BBP?t(B" $B$K$J$C$F$7$^$C$?!#(B + * f) b) $B$KLa$k!#(B + * ($B$^!"$3$N>l9g$K$O$O$8$a$+$i!VL5NLBg?t!W$rEPO?$7$F$*$1$P$$$$$N$@$,(B) + */ + len += jl_yomi_len(buf->wnn, start, end); +#ifdef WNN6 + nsbun = jl_fi_nobi_conv(buf->wnn, start, len, -1, 0, + small ? WNN_SHO : WNN_DAI); +#else + nsbun = jl_nobi_conv(buf->wnn, start, len, -1, 0, + small ? WNN_SHO : WNN_DAI); +#endif + + if (nsbun < 0) { + jcErrno = JE_WNNERROR; + return -1; + } + + /* clauseInfo $B$N%5%$%:$N%A%'%C%/$7$F!"I,MW$J$i$PA}$d$9(B */ + if (nsbun > buf->clauseSize) { + if (resizeCInfo(buf, nsbun) < 0) + return -1; + } + buf->nClause = nsbun; + + /* $BI=<(%P%C%U%!$NBg$-$5$r%A%'%C%/$7$F!"I,MW$J$i$PA}$d$9(B */ + clp = buf->clauseInfo + start; + len = clp->dispp - buf->displayBuf + jl_kanji_len(buf->wnn, start, -1); + if (len > buf->bufferSize) { + if (resizeBuffer(buf, len) < 0) + return -1; + } + + /* $B%+%l%s%HJ8@a$r3P$($F$*$/(B */ + buf->curClause = start; + + /* $BJQ497k2L$r!"I=<(%P%C%U%!$KF~$l$F$$$/(B */ + clp = buf->clauseInfo + start; + kanap = clp->kanap; + dispp = clp->dispp; + while (start < nsbun) { + end = start + 1; + + /* $BJ8@a>pJs$N@_Dj(B */ + clp->kanap = kanap; + clp->dispp = dispp; + + /* $BI=<(%P%C%U%!$KJQ49J8;zNs$r%3%T!<(B + * jl_get_kanji $B$O:G8e$N(B NULL $B$^$G%3%T!<$5$l$k$N$GCm0U(B + */ + { + int i = jl_kanji_len(buf->wnn, start, end); + wchar c = dispp[i]; + + (void)ki2_jl_get_kanji(buf->wnn, start, end, dispp, i); + dispp[i] = c; /* $B85$KLa$9(B */ + dispp += i; /* $B0LCV$N99?7(B */ + clp->conv = 1; + clp->ltop = jl_dai_top(buf->wnn, start); + } + + /* $B$+$J%P%C%U%!$N0LCV$r99?7(B */ + kanap += jl_yomi_len(buf->wnn, start, end); + + /* $Bkanap = buf->kanaEnd; + clp->dispp = buf->displayEnd = dispp; + clp->conv = 0; + clp->ltop = 1; + + /* $B%+%l%s%HJ8@a$r:F@_Dj$9$k(B */ + setCurClause(buf, buf->curClause); + + /* $B%I%C%H$N:F@_Dj(B */ + DotSet(buf); + +#ifdef DEBUG_WNNLIB + showBuffers(buf, "after expand_or_shrink"); +#endif + return 0; +} + +/* getCandidates -- $BA48uJd$rl9g!"%+%l%s%HJ8@a$H8uJdJ8@a$,0lCW(B + * $B$7$J$$$3$H$b$"$k$,!"8uJdJ8@a$N@_Dj$rM%@h$9$k$3$H$K$9$k!#$3$N(B + * $B>l9g!"8uJdJ8@a$O!"I,$:%+%l%s%HJ8@a$KEy$7$$$+$=$l$K4^$^$l$F$$(B + * $B$k$O$:!#(B + */ + if (small) { + /* $B8uJd$,candKind == CAND_SMALL && + buf->candClause == buf->curClause) + return 0; + + /* $B%+%l%s%H>.J8@a$N8uJd$rcurClause; + end = start + 1; + if (jl_zenkouho(buf->wnn, + start, + getHint(buf, start, end) & WNN_USE_MAE, + WNN_UNIQ) < 0) { + buf->candClause = -1; + jcErrno = JE_WNNERROR; + return -1; + } + } else { + /* $B8uJd$,candKind == CAND_LARGE && + buf->candClause >= buf->curLCStart && + buf->candClauseEnd <= buf->curLCEnd) + return 0; +#else + if (buf->candKind == CAND_LARGE && + buf->candClause >= buf->curLCStart && + buf->candClauseEnd <= buf->curLCEnd && + buf->candClause <= buf->curClause && + buf->candClauseEnd > buf->curClause) + return 0; +#endif + + /* $B%+%l%s%HBgJ8@a$N8uJd$rcurLCStart; + end = buf->curLCEnd; +#ifndef WNN6 + /* + * jl $B%i%$%V%i%j$N8uJd%P%C%U%!FbMF$rGK4~$9$k!#(B + * curLCStart $B$,0JA0$HF1$8$G$+$D(B curLCEnd $B$,(B + * $B0[$J$k>l9g(B ($B$D$^$j%+%l%s%HBgJ8@a$,8e$m$K?-$S$?>l9g(B)$B!"(B + * $B$3$&$7$J$$$H(B Wnn4 $B$N(B jl $B%i%$%V%i%j$O8uJd$r:Fwnn, 0, 0); +#endif + if (jl_zenkouho_dai(buf->wnn, + start, + end, + getHint(buf, start, end), + WNN_UNIQ) < 0) { + buf->candClause = -1; + jcErrno = JE_WNNERROR; + return -1; + } + } + + /* $BpJs$r3P$($F$*$/(B */ + buf->candKind = small ? CAND_SMALL : CAND_LARGE; + buf->candClause = start; + buf->candClauseEnd = end; + return 0; +} + +/* setCandidate -- $B;XDj$5$l$?8uJd$G%P%C%U%!$rCV$-49$($k(B */ +static int +setCandidate(buf, n) +jcConvBuf *buf; +int n; +{ + int start = buf->candClause; + int end = buf->candClauseEnd; + int oldlen, newlen, bdiff; + int oldclen, newclen, cdiff; + int newend; + jcClause *clp; + + TRACE("setCandidate", "Enter") +#ifdef DEBUG_WNNLIB + fprintf(stderr, "setCandidate for %d as %s\n", + n, buf->candKind == CAND_SMALL ? "small" : "large"); + showBuffers(buf, "setCandiate (before)"); +#endif + + clp = buf->clauseInfo + start; + oldlen = (buf->clauseInfo + end)->dispp - clp->dispp; + oldclen = jl_bun_suu(buf->wnn); + + if (buf->candKind == CAND_SMALL) { + /* $B%+%l%s%H>.J8@a$r!";XDj8uJd$GCV$-49$($k(B */ + if (jl_set_jikouho(buf->wnn, n) < 0) { + jcErrno = JE_WNNERROR; + return -1; + } + } else { + /* $B%+%l%s%HBgJ8@a$r!";XDj8uJd$GCV$-49$($k(B */ + if (jl_set_jikouho_dai(buf->wnn, n) < 0) { + jcErrno = JE_WNNERROR; + return -1; + } + } + + /* $BJQ498e$NJ8@a?t$N%A%'%C%/$9$k(B */ + newclen = jl_bun_suu(buf->wnn); + if (newclen < 0) { + jcErrno = JE_WNNERROR; + return -1; + } + cdiff = newclen - oldclen; + newend = end + cdiff; + + /* $BJQ498e$N%G%#%9%W%l%$%P%C%U%!$N%5%$%:$r%A%'%C%/$9$k(B */ + newlen = jl_kanji_len(buf->wnn, start, newend); + if (newlen <= 0) { + jcErrno = JE_WNNERROR; + return -1; + } + bdiff = newlen - oldlen; + +#ifdef DEBUG_WNNLIB + { + wchar candstr[1024]; + + fprintf(stderr, "Candidate[%s]: '", + buf->candKind == CAND_SMALL ? "small" : "large"); + if (newlen >= 1024) { + fprintf(stderr, + "* candidate string is too large [%d] *", + newlen); + } else { + candstr[0] = 0; + ki2_jl_get_zenkouho_kanji(buf->wnn, n, candstr, 1024); + printBuffer (candstr, candstr + newlen); + } + fprintf(stderr, "'\n"); + } +#endif + + /* + * $B%G%#%9%W%l%$%P%C%U%!$r:F@_Dj$9$k(B + * + * $B:G=i$K!"=l=j$r3NJ]$9$k!#:G8e$K!"(B + * $BCV$-49$($k8uJdJ8;zNs$r%G%#%9%W%l%$%P%C%U%!$KA^F~$9$k!#(B + */ + { + int buflen = (buf->displayEnd - buf->displayBuf) + bdiff; + wchar *dispp = clp->dispp; + wchar tmp; + + if (buflen > buf->bufferSize + && resizeBuffer(buf, buflen) < 0) { + return -1; + } + + moveDBuf(buf, end, bdiff); + + /* + * $B8uJdJ8;zNs$NA^F~$O!"(Bjl_get_kanji() $B$rMQ$$$k$N$G!"(B + * $B$=$l$,@_Dj$9$k:G8e$N(B NUL $BJ8;z$KCm0U!#(B + */ + tmp = dispp[newlen]; + if (ki2_jl_get_kanji(buf->wnn, start, newend, + dispp, newlen) <= 0) { + jcErrno = JE_WNNERROR; + return -1; + } + dispp[newlen] = tmp; + } + + + /* + * clauseInfo$B$r:F@_Dj$9$k(B + * + * $B:G=i$K!"=pJs$N$?$a$N>l=j$r3NJ]$9$k!#:G8e$K!"(B + * $BCV$-49$($?8uJd$N%P%C%U%!>pJs$r@_Dj$9$k!#(B + */ + { + wchar *kanap, *dispp; + int i, j; + + if (buf->nClause + cdiff > buf->clauseSize + && resizeCInfo(buf, buf->nClause + cdiff) < 0) { + return -1; + } + + moveCInfo(buf, end, cdiff); + + kanap = clp->kanap; + dispp = clp->dispp; + for (i = start; i < newend; i = j) { + clp->kanap = kanap; + clp->dispp = dispp; + clp->conv = 1; + clp->ltop = jl_dai_top(buf->wnn, i); + j = i + 1; + kanap += jl_yomi_len(buf->wnn, i, j); + dispp += jl_kanji_len(buf->wnn, i, j); + clp++; + } + + /* + * $B8uJd$N8e$NJ8(B + * $B@a$@$1$GNI$$$O$:$@$,!"G0$N$?$a!"$9$Y$F$r%A%'%C%/$9(B + * $B$k$3$H$K$9$k!#(B + */ + for (i = 0; i < start; i++) + buf->clauseInfo[i].ltop = jl_dai_top(buf->wnn, i); + for (i = newend; i < newclen; i++) + buf->clauseInfo[i].ltop = jl_dai_top(buf->wnn, i); + } + + /* + * $B]J8@a$H$=$NA08e$NBgJ8@a(B + * $B$,0\F0$7$F$$$k$+$b$7$l$J$$$N$G!"%+%l%s%HJ8@a$r:F@_Dj$9$k!#(B + */ + setCurClause(buf, start); + + /* + * $BJ8@a$N0\F0$KH<$$!"8uJdJ8@a$b0\F0$7$F$$$k$O$:$J$N$G!":F@_Dj(B + * $B$7$F$*$/(B (moveCInfo() $B;2>H(B) + */ + buf->candClause = start; + buf->candClauseEnd = end + cdiff; + +#ifdef DEBUG_WNNLIB + showBuffers(buf, "setCandiate (after)"); +#endif + return 0; +} + +/* checkCandidates -- $BA48uJd$,M-8z$+%A%'%C%/$7$F!"I,MW$J=hM}$r9T$J$&(B */ +static void +checkCandidates(buf, cls, cle) +jcConvBuf *buf; +int cls; +int cle; +{ + /* $BJ8@aHV9f(B cls $B$+$i(B cle - 1 $B$^$G$NJ8@a$,JQ99$5$l$k(B + * $Bl9g$+$H$$$&$H!"(B + * 1. buf->candKind $B$,(B CAND_SMALL $B$G!"(B + * cls <= buf->candClause < cle + * 2. buf->candKind $B$,(B CAND_LARGE $B$G!"(B + * buf->candClause < cle $B$+$D(B cls < buf->candClauseEnd + */ + if (buf->candKind == CAND_SMALL) + buf->candClauseEnd = buf->candClause + 1; /* $BG0$N$?$a(B */ + if (buf->candClause < cle && cls < buf->candClauseEnd) { + /* $BL58z$K$9$k(B */ + buf->candClause = buf->candClauseEnd = -1; + } +} + + +/* forceStudy -- $BL$JQ49$*$h$S5?;wJQ49J8@a$N3X=,(B */ +static int +forceStudy(buf, n) +jcConvBuf *buf; +int n; +{ + int i, j, k; + int status; + wchar yomi[CL_BUFSZ], kanji[CL_BUFSZ]; + + TRACE("forceStudy", "Enter") + +#ifdef DEBUG_WNNLIB + showBuffers(buf, "forceStudy"); +#endif + + if (n < 0 || n > buf->nClause) + n = buf->nClause; + + /* $B$3$3$G$$$&3X=,$H$O!"IQEY>pJs$N99?7$H9M$($F$h$$(B */ + + /* + * Wnn6 $B$G$O!"L5JQ493X=,5!G=$,$"$j!"(Bwnnlib $B$K$h$k5?;wJQ49$dL$(B + * $BJQ49$NJ8@a$r3X=,$5$;$k$3$H$,$G$-$k!#$?$@$7!"L$JQ49$NJ8@a$K(B + * $BBP$7$FC1=c$KIQEY$N99?7$O$G$-$J$$$N$GCm0U(B + */ + + /* + * $B:G=i$K!"JQ49:Q$_$NJ8@a?t$rD4$Y$k!#F~NO$5$l$?J8@a$,$9$Y$FJQ(B + * $B49:Q$_(B (conv == 1) $B$G$"$l$P!"A4J8@a$r$NJ8@a$NIQEY>pJs$r$^$H(B + * $B$a$F99?7$9$k!#JQ49:Q$_$G$J$$J8@a$,$"$C$?>l9g!"$H$j$"$($:JQ(B + * $B49$7$F!"JQ497k2L$,I=<(%P%C%U%!$NFbMF$H0lCW$7$F$$$l$P!"IQEY(B + * $B>pJs$r99?7$9$k$3$H$K$9$k(B + */ + status = 0; + for (i = 0; i < n; i++) { + if (buf->clauseInfo[i].conv == 1) + status++; + } + + /* $B$9$Y$F$NJ8@a$,JQ49$5$l$F$$$?$i!"A4$F$NJ8@a$NIQEY$r99?7$9$k(B */ + if (status == n) { +#ifdef WNN6 + status = jl_optimize_fi(buf->wnn, 0, -1); +#else + status = jl_update_hindo(buf->wnn, 0, -1); +#endif + if (status < 0) { + jcErrno = JE_WNNERROR; + return -1; + } + return 0; + } + + /* + * $BJ8@aC10L$GIQEY>pJs$r99?7$9$k(B + * $BL$JQ49$NJ8@a$,$"$l$P!"L$JQ49$H$7$FIQEY>pJs$r99?7$9$k(B (Wnn6 + * $B$NL5JQ493X=,5!G=(B) + */ + + /* $BIQEY>pJs$r99?7$9$kA0$K!"A4J8@a$rJQ49$7$F$*$/(B */ + if (makeConverted(buf, n) < 0) + return -1; + + for (i = 0; i < n; i = j) { + j = i + 1; + /* + * $BJQ49:Q$_$NJ8@a$G$"$l$P!"$=$N$^$^IQEY>pJs$r99?7$9$k(B + */ + if (buf->clauseInfo[i].conv == 1) { +#ifdef WNN6 + status = jl_optimize_fi(buf->wnn, i, j); +#else + status = jl_update_hindo(buf->wnn, i, j); +#endif + if (status < 0) { + jcErrno = JE_WNNERROR; + return -1; + } + continue; + } + + /* + * $BL$JQ49$H5?;wJQ49$NJ8@a$KBP$7$F$O!"FI$_$r3X=,$9$k(B + * $BL$JQ49$H5?;wJQ49$N>l9g$G$b!"(Bwnnlib $B$G$OI=<(%P%C%U%!$H$+(B + * $B$J%P%C%U%!$NN>J}$,0lCW$7$F$$$k$N$G(B (jcKana() $B;2>H(B)$B!"(B + * $B$3$3$G$O(B jllib $B$NFI$_%G!<%?$r;HMQ$9$k(B + */ + + /* $BFI$_J8;zNs$HJQ49:QJ8;zNs$ND9$5%A%'%C%/(B */ + if (jl_yomi_len(buf->wnn, i, j) >= CL_BUFSZ || + jl_kanji_len(buf->wnn, i, j) >= CL_BUFSZ) { + /* $B%P%C%U%!%*!<%P%U%m!<$rHr$1$k(B */ + continue; + } + + /* $BFI$_J8;zNs$Nwnn, i, j, yomi, CL_BUFSZ) < 0) { + jcErrno = JE_WNNERROR; + return -1; + } + /* $BJQ49:Q$_J8;zNs$rwnn, i, j, kanji, CL_BUFSZ) < 0) { + jcErrno = JE_WNNERROR; + return -1; + } + + /* + * $BFI$_$HJQ498e$,0lCW$7$F$$$l$P!"3X=,:Q$_$H$_$J$7$F!"(B + * $B$=$N$^$^IQEY>pJs$r99?7$9$k(B + */ + if (wstrcmp (yomi, kanji) == 0) { +#ifdef WNN6 + status = jl_optimize_fi(buf->wnn, i, j); +#else + status = jl_update_hindo(buf->wnn, i, j); +#endif + if (status < 0) { + jcErrno = JE_WNNERROR; + return -1; + } + continue; + } + + /* + * $BFI$_$HJQ498e$,0lCW$7$J$$$N$G!"A48uJd$NCf$+$iC5$9(B + * $B$b$7!"0lCW$9$k$b$N$,$"$l$P!"IQEY>pJs$r99?7$7!"$=$&(B + * $B$G$J$1$l$PIQEY>pJs$O99?7$7$J$$(B + */ + if (jl_zenkouho(buf->wnn, i, + getHint(buf, -1, -1), WNN_UNIQ) < 0) { + jcErrno = JE_WNNERROR; + return -1; + } + status = jl_zenkouho_suu(buf->wnn); + if (status < 0) { + jcErrno = JE_WNNERROR; + return -1; + } + for (k = 0; k < status; k++) { + ki2_jl_get_zenkouho_kanji(buf->wnn, k, kanji, + CL_BUFSZ); + /* $BI,$:(B NUL $B%?!<%_%M!<%H$5$l$k$h$&$K$7$F$*$/(B */ + kanji[CL_BUFSZ - 1] = 0; + if (wstrcmp(yomi, kanji) != 0) + continue; + if (jl_set_jikouho(buf->wnn, k) < 0) { + jcErrno = JE_WNNERROR; + return -1; + } +#ifdef WNN6 + status = jl_optimize_fi(buf->wnn, i, j); +#else + status = jl_update_hindo(buf->wnn, i, j); +#endif + if (status < 0) { + jcErrno = JE_WNNERROR; + return -1; + } + break; + } + } + + return 0; +} + + +/* + * $B$3$3$+$i(B Public $B$J%U%!%s%/%7%g%s(B + */ + +/* jcCreateBuf -- $BJQ49%P%C%U%!$N:n@.(B */ +jcConvBuf * +jcCreateBuffer(wnn, nclause, buffersize) +struct wnn_buf *wnn; +int nclause; +int buffersize; +{ + jcConvBuf *buf; + + TRACE("jcCreateBuffer", "Enter") + + /* $B$^$:(B jcConvBuf $B$N3NJ](B */ + if ((buf = (jcConvBuf *)malloc(sizeof(jcConvBuf))) == NULL) { + jcErrno = JE_NOCORE; + return NULL; + } + (void)bzero((char *)buf, sizeof(jcConvBuf)); + buf->wnn = wnn; + + /* $BbufferSize = (buffersize <= 0) ? DEF_BUFFERSIZE : buffersize; + /* $B%P%C%U%!$N:G8e$r(B NULL $B%?!<%_%M!<%H$9$k$3$H$,$"$k$N$G!"(B + * 1$BJ8;zJ8Bg$-$/$7$F$*$/(B + */ + buf->kanaBuf = (wchar *)malloc((buf->bufferSize + 1) * + sizeof(wchar)); + buf->displayBuf = (wchar *)malloc((buf->bufferSize + 1) * + sizeof(wchar)); + + /* $BclauseSize = (nclause <= 0) ? DEF_CLAUSESIZE : nclause; + /* clauseInfo $B%P%C%U%!$O(B nclause + 1 $B8D%"%m%1!<%H$9$k(B + * $B$J$<$+$H$$$&$H(B clauseinfo $B$O%G%j%_%?$H$7$FMWAG$r(B + * 1$B8D;H$&$N$G(B nclause $B8D$NJ8@a$r07$&$?$a$K$O(B nclause + 1 $B8D$N(B + * $BBg$-$5$r;}$?$J$1$l$P$J$i$J$$$+$i$G$"$k(B + */ + buf->clauseInfo = (jcClause *)malloc((buf->clauseSize + 1) + * sizeof(jcClause)); + + if (buf->kanaBuf == NULL || buf->displayBuf == NULL || + buf->clauseInfo == NULL) { + /* malloc() $B$G$-$J$+$C$?(B */ + Free(buf->kanaBuf); + Free(buf->displayBuf); + Free(buf->clauseInfo); + Free(buf); + jcErrno = JE_NOCORE; + return NULL; + } + + (void)jcClear(buf); + return buf; +} + +/* jcDestroyBuffer -- $BJQ49%P%C%U%!$N>C5n(B */ +int +jcDestroyBuffer(buf, savedic) +jcConvBuf *buf; +int savedic; +{ + TRACE("jcDestroyBuffer", "Enter") + + if (buf == NULL) + return 0; + + /* $B%"%m%1!<%H$7$?%a%b%j$N2rJ|(B */ + Free(buf->kanaBuf); + Free(buf->displayBuf); + Free(buf->clauseInfo); + + /* savedic $B$,(B 0 $B$G$J$1$l$P!"4D6-$K%m!<%I$5$l$F$$$kA4$F$N%U%!%$%k$r(B + * save $B$9$k(B + */ + if (savedic && jl_dic_save_all(buf->wnn) < 0) { + jcErrno = JE_WNNERROR; + return -1; + } + + Free(buf); + + return 0; +} + +/* jcClear -- wnnlib $B$N=i4|2=(B ($B?7$?$JJQ49$r;O$a$kKh$K8F$P$J$1$l$P$J$i$J$$(B) */ +int +jcClear(buf) +jcConvBuf *buf; +{ + TRACE("jcClear", "Enter") + + /* $B=i4|CM$N@_Dj(B */ + buf->nClause = buf->curClause = buf->curLCStart = 0; + buf->curLCEnd = 1; + buf->candClause = buf->candClauseEnd = -1; + buf->kanaEnd = buf->kanaBuf; + buf->displayEnd = buf->displayBuf; + buf->clauseInfo[0].kanap = buf->kanaBuf; + buf->clauseInfo[0].dispp = buf->displayBuf; + buf->clauseInfo[0].conv = 0; + buf->clauseInfo[0].ltop = 1; + buf->dot = buf->kanaBuf; + buf->fixed = 0; + jcErrno = JE_NOERROR; + + if (jl_bun_suu(buf->wnn) > 0) + jl_kill(buf->wnn, 0, -1); + + return 0; +} + +/* jcConvert -- $B%+%l%s%HJ8@a0J9_$r$+$J4A;zJQ49$9$k(B */ +int +jcConvert(buf, small, tan, jump) +jcConvBuf *buf; +int small; +int tan; +int jump; +{ + int ret; + + TRACE("jcConvert", "Enter") + + CHECKFIXED(buf); + + if (buf->curClause == buf->nClause) { + /* $B%+%l%s%HJ8@a$,:G8e$NJ8@a$G$7$+$b6u(B */ + jcErrno = JE_CLAUSEEMPTY; + return -1; + } + + /* $BA48uJdJ8@a$,%+%l%s%HBgJ8@a$+$=$l0J9_$K$"$l$PL58z$K$9$k(B */ + checkCandidates(buf, + small ? buf->curClause : buf->curLCStart, + buf->nClause); + + if (tan) { + ret = tanConvert(buf, small); + } else { + ret = renConvert(buf, small); + } + + if (ret < 0) + return ret; + + if (jump) { + /* $B%I%C%H$H%+%l%s%HJ8@a$rJ8$N:G8e$K0\F0$5$;$k(B */ + buf->curClause = buf->curLCStart = buf->nClause; + buf->curLCEnd = buf->nClause + 1; + buf->dot = buf->kanaEnd; + } + return 0; +} + +/* jcUnconvert -- $B%+%l%s%HBgJ8@a$rL5JQ49$N>uBV$KLa$9(B */ +int +jcUnconvert(buf) +jcConvBuf *buf; +{ + jcClause *clp = buf->clauseInfo + buf->curClause; + + TRACE("jcUnconvert", "Enter") + + CHECKFIXED(buf); + + if (buf->curClause == buf->nClause) { + /* $B%+%l%s%HJ8@a$,:G8e$NJ8@a$G$7$+$b6u(B */ + jcErrno = JE_CLAUSEEMPTY; + return -1; + } + + if (!clp->conv) { + /* $B%+%l%s%HJ8@a$OJQ49$5$l$F$$$J$$(B */ + /* $BL5JQ49$NJ8@a$O(B wnnlib $BFbIt$G$O>o$KBgJ8@a$H$7$F(B + * $B07$o$l$k$N$G!"%+%l%s%H>.J8@a$NJQ49>uBV$r8+$F!"(B + * $B$=$l$,JQ49>uBV$J$i%+%l%s%HBgJ8@aFb$N(B + * $BA4$F$N>.J8@a$OJQ49>uBV!"$=$&$G$J$1$l$PL5JQ49>uBV!"(B + * $B$K$J$k(B + */ + jcErrno = JE_NOTCONVERTED; + return -1; + } + + /* $BA48uJdJ8@a$,%+%l%s%HBgJ8@a$+$=$l0J9_$K$"$l$PL58z$K$9$k(B */ + checkCandidates(buf, buf->curLCStart, buf->nClause); + + /* $BL5JQ49>uBV$K$9$k(B */ + if (unconvert(buf, buf->curLCStart, buf->curLCEnd) < 0) + return -1; + + /* $BBgJ8@a$N@_Dj(B */ + clp = buf->clauseInfo + buf->curLCStart; + clp->ltop = 1; + (++clp)->ltop = 1; + + /* $B%+%l%s%HJ8@a$N:F@_Dj(B */ + buf->curClause = buf->curLCStart; + buf->curLCEnd = buf->curLCStart + 1; + + /* $B%I%C%H$N@_Dj(B */ + DotSet(buf); + + return 0; +} + +/* jcCancel -- $BF~NOCf$NA4J8@a$rL5JQ49>uBV$K$9$k(B */ +int +jcCancel(buf) +jcConvBuf *buf; +{ + TRACE("jcCancel", "Enter") + + CHECKFIXED(buf); + + if (buf->nClause <= 0) + return 0; + + /* + * $BI=<(%P%C%U%!$NFbMF$r$+$J%P%C%U%!$NFbMF$GCV49$($k(B + * $B$3$N:]!"%P%C%U%!$NBg$-$5$O5$$K$9$kI,MW$,L5$$!#$J$<$J$i!"I=(B + * $B<(%P%C%U%!$H$+$J%P%C%U%!$NBg$-$5$O>o$KF1$8$@$+$i(B + */ + bcopy(buf->kanaBuf, buf->displayBuf, buf->bufferSize * sizeof (wchar)); + + /* + * $B:#$"$kA4J8@a$r0l$D$NL5JQ49>uBV$NBgJ8@a$K$9$k(B + * $B$3$N:]$b!"J8@a?t$r5$$K$9$kI,MW$O$J$$!#$J$<$J$i!">/$/$H$b0l$D(B + * $B$NJ8@a$O$"$C$?$O$:$@$+$i(B + */ + buf->curClause = buf->curLCStart = 0; + buf->nClause = buf->curLCEnd = 1; + buf->displayEnd = buf->displayBuf + (buf->kanaEnd - buf->kanaBuf); + buf->clauseInfo[0].conv = 0; + buf->clauseInfo[0].ltop = 1; + buf->clauseInfo[1].kanap = buf->kanaEnd; + buf->clauseInfo[1].dispp = buf->displayEnd; + buf->clauseInfo[1].conv = 0; + buf->clauseInfo[1].ltop = 1; + + /* $BA48uJdJ8@a$bL58z$K$9$k(B */ + buf->candClause = buf->candClauseEnd = -1; + + /* jllib $B$NJQ49>uBV$bL58z$K$9$k(B */ + if (jl_bun_suu(buf->wnn) > 0) + jl_kill(buf->wnn, 0, -1); + + return 0; +} + +/* jcExpand -- $B%+%l%s%HJ8@a$r#1J8;z9-$2$k(B */ +int +jcExpand(buf, small, convf) +jcConvBuf *buf; +int small; +int convf; +{ + TRACE("jcExpand", "Enter") + + CHECKFIXED(buf); + + return expandOrShrink(buf, small, 1, convf); +} + +/* jcShrink -- $B%+%l%s%HJ8@a$r#1J8;z=L$a$k(B */ +int +jcShrink(buf, small, convf) +jcConvBuf *buf; +int small; +int convf; +{ + TRACE("jcShrink", "Enter") + + CHECKFIXED(buf); + + return expandOrShrink(buf, small, 0, convf); +} + +/* jcKana -- $B%+%l%s%HJ8@a$r$+$J$K$9$k(B */ +int +jcKana(buf, small, kind) +jcConvBuf *buf; +int small; +int kind; +{ + jcClause *clp; + wchar *kanap, *kanaendp, *dispp; + int start, end; + int conv; + int c; + + TRACE("jcKana", "Enter") + + CHECKFIXED(buf); + + /* $BJ8@aHV9f$N%A%'%C%/(B */ + if (buf->curClause >= buf->nClause) { + /* $B%+%l%s%HJ8@a$,:G8e$NJ8@a$G$7$+$b6u$@$C$?>l9g(B + * $B$3$N>l9g%(%i!<$K$7$F$b$h$$$,(B... + */ + return 0; + } + + /* + * $B%+%l%s%HJ8@a$,JQ49$5$l$F$$$l$P$$$C$?$sL5JQ49$K$9$k(B + */ + + /* $B$"$H$GJQ49>uBV$r$b$H$KLa$9$?$a!"JQ49>uBV$r%;!<%V$7$F$*$/(B */ + conv = buf->clauseInfo[buf->curClause].conv; + + if (small) { + start = buf->curClause; + end = start + 1; + } else { + start = buf->curLCStart; + end = buf->curLCEnd; + } + + /* $BA48uJdJ8@a$N%A%'%C%/(B */ + checkCandidates(buf, start, end); + + /* $BL5JQ49>uBV$K$9$k(B */ + if (unconvert(buf, start, end) < 0) { + return -1; + } + + /* + * small $B$,(B 0$B!"$D$^$j%+%l%s%HJ8@a$H$7$FBgJ8@a$rA*Br$7$?>l9g!"(B + * $B$=$NCf$N>.J8@a$O0l$D$K$^$H$a$i$l$k$N$G!"(BcurClause $B$H(B + * curLCEnd $B$rJQ$($kI,MW$,$"$k(B + */ + if (!small) { + buf->curClause = buf->curLCStart; + buf->curLCEnd = buf->curLCStart + 1; + } + + /* + * $B$+$JJQ49$9$k(B + * + * $BI=<(%P%C%U%!$@$1$G$O$J$/!"$+$J%P%C%U%!$bJQ49$9$k(B + * + * $B$3$l$K$O$5$7$?$kM}M3$O$J$$$,!"$^$"!"(BVer3 $BHG$N(B jclib $B$,(B + * $B$=$&$@$C$?$N$G!D(B + */ + clp = buf->clauseInfo + buf->curClause; + kanap = clp->kanap; + kanaendp = (clp + 1)->kanap; + dispp = clp->dispp; + + if (kind == JC_HIRAGANA) { /* $B%+%?%+%J"*$R$i$,$J(B */ + /* $B%+%?%+%J$r$R$i$,$J$KJQ49$9$k:]$K$O$R$i$,$J$K$J$$;z(B + * "$B%t%u%v(B" $B$,$"$k$N$G$$$-$*$$$GJQ49$7$F$7$^$o$J$$$h$&$K(B + * $B5$$rIU$1$J$1$l$P$J$i$J$$(B + * ($B$^$"uBV$r$b$H$KLa$7$F$*$/(B + */ + + /* $B$H$O$$$C$F$b4{$KJQ49$5$l$?J8@a$N>l9g!"$3$l$NIQEY>pJs$r(B + * $B%5!<%P$KAw$k$H$^$:$$$N$G!"$"$H$G$+$JJQ49$7$?$3$H$,$o$+$k$h$&$K(B + * jcClause.conv $B$O(B -1 $B$K%;%C%H$9$k(B + */ + clp->conv = conv ? -1 : 0; + + return 0; +} + +/* jcFix -- $B3NDj$9$k(B */ +int +jcFix(buf) +jcConvBuf *buf; +{ + TRACE("jcFix", "Enter") + + if (buf->fixed) { + /* $B4{$K3NDj$5$l$F$$$k(B + * $B%(%i!<$K$7$F$b$h$$$,!D(B + */ + return 0; + } + + if (forceStudy(buf, buf->nClause) < 0) + return -1; + + /* $B3NDj%U%i%0$rN)$F$k(B */ + buf->fixed = 1; + + return 0; +} + + +/* jcFix1 -- $B:G=i$N0lJ8;z$@$1$r3NDj$9$k(B */ +int +jcFix1(buf) +jcConvBuf *buf; +{ + TRACE("jcFix1", "Enter") + + if (buf->fixed) { + /* $B4{$K3NDj$5$l$F$$$k(B + * $B%(%i!<$K$7$F$b$h$$$,!D(B + */ + return 0; + } + + if (buf->nClause >= 1) { + /* $B:G=i$NJ8@a$@$1$r3X=,$9$k(B */ + if (forceStudy(buf, 1) < 0) + return -1; + + /* $B:G=i$NJ8@a$N0lJ8;z$@$1$K$9$k(B */ + buf->nClause = 1; + buf->curClause = buf->curLCStart = 0; + buf->curLCEnd = 1; + buf->kanaEnd = buf->kanaBuf + 1; /* $B%@%_!<(B */ + buf->displayEnd = buf->displayBuf + 1; + buf->clauseInfo[0].kanap = buf->kanaBuf; + buf->clauseInfo[0].dispp = buf->displayBuf; + buf->clauseInfo[0].ltop = 1; + buf->clauseInfo[1].kanap = buf->kanaBuf + 1; /* $B%@%_!<(B */ + buf->clauseInfo[1].dispp = buf->displayBuf + 1; + buf->clauseInfo[1].ltop = 1; + buf->dot = buf->kanaBuf + 1; + buf->candClause = buf->candClauseEnd = -1; + } + + + /* $B3NDj%U%i%0$rN)$F$k(B */ + buf->fixed = 1; + + return 0; +} + +/* jcNext -- $B%+%l%s%HJ8@a$rclauseInfo[buf->curClause].conv) { + /* $B$^$@JQ49$5$l$F$$$J$$(B */ + jcErrno = JE_NOTCONVERTED; + return -1; + } + + /* $BA48uJd$,F@$i$l$F$$$J$1$l$P!"A48uJd$rF@$k(B */ + if (getCandidates(buf, small) < 0) + return -1; + + n = jl_zenkouho_suu(buf->wnn); + if (n <= 1) { + /* $Bwnn) + (prev ? -1 : 1); + if (n < 0) { + n = jl_zenkouho_suu(buf->wnn) - 1; + } else if (n >= jl_zenkouho_suu(buf->wnn)) { + n = 0; + } + + if (setCandidate(buf, n) < 0) { + /* $BclauseInfo[buf->curClause].conv) { + /* $B$^$@JQ49$5$l$F$$$J$$(B */ + jcErrno = JE_NOTCONVERTED; + return -1; + } + + /* $BA48uJd$,F@$i$l$F$$$J$1$l$P!"A48uJd$rF@$k(B */ + if (getCandidates(buf, small) < 0) + return -1; + + ncand = jl_zenkouho_suu(buf->wnn); + if (ncand <= 1) { + /* $B8uJd$,$J$$(B */ + jcErrno = (ncand < 0) ? JE_WNNERROR : JE_NOCANDIDATE; + return -1; + } + + /* $B8=:_$N8uJdHV9f$rF@$k(B */ + cand = jl_c_zenkouho(buf->wnn); + if (cand < 0) { + /* $B8uJd$,F@$i$l$J$$(B */ + jcErrno = JE_WNNERROR; + return -1; + } + + if (ncandp != NULL) *ncandp = ncand; + if (curcandp != NULL) *curcandp = cand; + + return 0; +} + +/* jcGetCandidate -- $B;XDj$5$l$?HV9f$N8uJd$rcandClause < 0) { + jcErrno = JE_NOCANDIDATE; + return -1; + } + + /* $B8uJdHV9f$N%A%'%C%/(B */ + if (n < 0 || n >= jl_zenkouho_suu(buf->wnn)) { + jcErrno = JE_NOSUCHCANDIDATE; + return -1; + } + + /* $BJ8;zNs$r%3%T!<(B */ + ki2_jl_get_zenkouho_kanji(buf->wnn, n, tmp, CL_BUFSZ); + tmp[CL_BUFSZ - 1] = 0; + wstrcpy(candstr, tmp); + + return 0; +} + +/* jcSelect -- $BI=<(%P%C%U%!$r;XDj$5$l$?8uJd$HCV$-49$($k(B */ +int +jcSelect(buf, n) +jcConvBuf *buf; +int n; +{ + TRACE("jcSelect", "Enter") + + CHECKFIXED(buf); + +#ifdef DEBUG_WNNLIB + fprintf(stderr, + "Select: %d [%s for %d - %d]\n", + n, + buf->candKind == CAND_SMALL ? "small" : "large", + buf->candClause, + buf->candClauseEnd); +#endif + + /* $BJ8@a$N%A%'%C%/(B */ + if (buf->candClause < 0) { + jcErrno = JE_NOCANDIDATE; + return -1; + } + + /* $B8uJdHV9f$N%A%'%C%/(B */ + if (n < 0 || n >= jl_zenkouho_suu(buf->wnn)) { + jcErrno = JE_NOSUCHCANDIDATE; + return -1; + } + + /* $B8uJd$,%;%C%H$5$l$F$$$J$1$l$P!"%;%C%H$9$k(B */ + if (jl_c_zenkouho(buf->wnn) != n && setCandidate(buf, n) < 0) + return -1; + + return 0; +} + +/* jcDotOffset -- $BBgJ8@a$N@hF,$+$i$N%I%C%H$N%*%U%;%C%H$rJV$9(B */ +int +jcDotOffset(buf) +jcConvBuf *buf; +{ + TRACE("jcDotOffset", "Enter") + + return buf->dot - buf->clauseInfo[buf->curLCStart].kanap; +} + +/* jcIsConverted -- $B;XDj$5$l$?J8@a$,JQ49$5$l$F$$$k$+$I$&$+$rJV$9(B */ +int +jcIsConverted(buf, cl) +jcConvBuf *buf; +int cl; +{ + TRACE("jcIsConverted", "Enter") + + if (cl < 0 || cl > buf->nClause) { + /* cl == jcNClause $B$N$H$-$r%(%i!<$K$7$F$b$$$$$N$@$1$l$I(B + * $B%+%l%s%HJ8@a$,(B jcNClause $B$N$H$-$,$"$k$N$G(B + * $B%(%i!<$H$O$7$J$$$3$H$K$7$?(B + */ + return -1; + } + return (buf->clauseInfo[cl].conv != 0); +} + +/* jcMove -- $B%I%C%H!&%+%l%s%HJ8@a$r0\F0$9$k(B */ +int +jcMove(buf, small, dir) +jcConvBuf *buf; +int small; +int dir; +{ + jcClause *clp = buf->clauseInfo + buf->curClause; + int i; + + TRACE("jcMove", "Enter") + + if (!clp->conv) { + /* $B%+%l%s%HJ8@a$,JQ49$5$l$F$$$J$$$N$G!"%I%C%H$N0\F0$K$J$k(B */ + if (dir == JC_FORWARD) { + if (buf->curClause == buf->nClause) { + /* $B$9$G$K0lHV:G8e$K$$$k(B */ + jcErrno = JE_CANTMOVE; + return -1; + } else if (buf->dot == (clp + 1)->kanap) { + /* $B%I%C%H$,%+%l%s%HJ8@a$N:G8e$K$"$k$N$G(B + * $BJ8@a0\F0$9$k(B + */ + goto clausemove; + } else { + buf->dot++; + } + } else { + if (buf->dot == clp->kanap) { + /* $B%I%C%H$,%+%l%s%HJ8@a$N@hF,$K$"$k$N$G(B + * $BJ8@a0\F0$9$k(B + */ + goto clausemove; + } else + buf->dot--; + } + return 0; + } + +clausemove: /* $BJ8@a0\F0(B */ + clp = buf->clauseInfo; + + if (small) { + /* $B>.J8@aC10L$N0\F0(B */ + if (dir == JC_FORWARD) { + if (buf->curClause == buf->nClause) { + jcErrno = JE_CANTMOVE; + return -1; + } + buf->curClause++; + if (buf->curClause >= buf->curLCEnd) { + /* $BBgJ8@a$b0\F0$9$k(B */ + buf->curLCStart = buf->curLCEnd; + for (i = buf->curLCStart + 1; + i <= buf->nClause && !clp[i].ltop; i++) + ; + buf->curLCEnd = i; + } + } else { /* JC_BACKWARD */ + if (buf->curClause == 0) { + jcErrno = JE_CANTMOVE; + return -1; + } + buf->curClause--; + if (buf->curClause < buf->curLCStart) { + /* $BBgJ8@a$b0\F0$9$k(B */ + buf->curLCEnd = buf->curLCStart; + for (i = buf->curClause; !clp[i].ltop; i--) + ; + buf->curLCStart = i; + } + } + } else { + /* $BBgJ8@aC10L$N0\F0(B */ + if (dir == JC_FORWARD) { + if (buf->curLCStart == buf->nClause) { + jcErrno = JE_CANTMOVE; + return -1; + } + buf->curLCStart = buf->curClause = buf->curLCEnd; + for (i = buf->curLCStart + 1; + i <= buf->nClause && !clp[i].ltop; i++) + ; + buf->curLCEnd = i; + } else { + if (buf->curLCStart == 0) { + jcErrno = JE_CANTMOVE; + return -1; + } + buf->curLCEnd = buf->curLCStart; + for (i = buf->curLCEnd - 1; !clp[i].ltop; i--) + ; + buf->curLCStart = buf->curClause = i; + } + } + + /* $BJ8@a0\F0$7$?$i%I%C%H$O$=$NJ8@a$N@hF,$K0\F0$9$k(B */ + buf->dot = clp[buf->curClause].kanap; + + return 0; +} + +/* jcTop -- $B%I%C%H!&%+%l%s%HJ8@a$rJ8$N@hF,$K0\F0$9$k(B */ +int +jcTop(buf) +jcConvBuf *buf; +{ + TRACE("jcTop", "Enter") + + /* $B%+%l%s%HJ8@a$r(B 0 $B$K$7$F%I%C%H$r@hF,$K;}$C$F$/$k(B */ + setCurClause(buf, 0); + buf->dot = buf->kanaBuf; + + return 0; +} + +/* jcBottom -- $B%I%C%H!&%+%l%s%HJ8@a$rJ8$N:G8e$K0\F0$9$k(B */ +int +jcBottom(buf) +jcConvBuf *buf; +{ + TRACE("jcBottom", "Enter") + + /* + * Ver3 $BBP1~$N(B jclib $B$G$O!"%+%l%s%HJ8@a$r(B jcNClause $B$K$7$F(B + * $B%I%C%H$r:G8e$K;}$C$F$/$k$@$1$@$C$?(B + * $B$3$l$@$H!":G8e$NJ8@a$K$+$J$rF~$l$F$$$F!"%+!<%=%k$rF0$+$7$F(B + * jcBottom() $B$G85$KLa$C$F:F$S$+$J$rF~$l$k$H!"JL$NJ8@a$K(B + * $B$J$C$F$7$^$&(B + * $B$=$3$G!":G8e$NJ8@a$,L5JQ49>uBV$N;~$K$O!"%+%l%s%HJ8@a$O(B + * buf->nClause $B$G$O$J$/!"(Bbuf->nClause - 1 $B$K$9$k$3$H$K$9$k(B + */ + if (buf->nClause > 0 && !buf->clauseInfo[buf->nClause - 1].conv) { + buf->curClause = buf->curLCStart = buf->nClause - 1; + buf->curLCEnd = buf->nClause; + } else { + buf->curClause = buf->curLCStart = buf->nClause; + buf->curLCEnd = buf->nClause + 1; + } + buf->dot = buf->kanaEnd; + return 0; +} + +/* jcInsertChar -- $B%I%C%H$N0LCV$K0lJ8;zA^F~$9$k(B */ +int +jcInsertChar(buf, c) +jcConvBuf *buf; +int c; +{ + jcClause *clp; + wchar *dot, *dispdot; + int ksizenew, dsizenew; + + TRACE("jcInsertChar", "Enter") + + CHECKFIXED(buf); + + /* $BA48uJdJ8@a$,%+%l%s%HBgJ8@a$K$"$l$PL58z$K$9$k(B */ + checkCandidates(buf, buf->curLCStart, buf->curLCEnd); + + /* + * $B!&%+%l%s%HJ8@aHV9f$,(B buf->nClause $B$G$"$k>l9g(B + * - $B$3$l$O%I%C%H$,:G8e$NJ8@a$Nl9g(B + * - $BL5JQ49$N>uBV$KLa$7$F$+$iA^F~(B + * $B!&$=$NB>(B + * - $BC1$KA^F~$9$l$P$h$$(B + */ + clp = buf->clauseInfo + buf->curLCStart; + if (buf->curLCStart == buf->nClause) { + /* $B?7$?$KJ8@a$r:n$k(B */ + /* clauseInfo $B$N%5%$%:$N%A%'%C%/(B */ + if (buf->nClause >= buf->clauseSize && + resizeCInfo(buf, buf->nClause + 1) < 0) { + return -1; + } + /* buf->nClause $B$N%"%C%W%G!<%H$H(B clauseInfo $B$N@_Dj(B */ + buf->nClause += 1; + clp = buf->clauseInfo + buf->nClause; + clp->conv = 0; + clp->ltop = 1; + clp->kanap = buf->kanaEnd; + clp->dispp = buf->displayEnd; + } else if (clp->conv) { + /* $BL5JQ49>uBV$K$9$k(B */ + if (unconvert(buf, buf->curLCStart, buf->curLCEnd) < 0) + return -1; + buf->curClause = buf->curLCStart; + buf->curLCEnd = buf->curLCStart + 1; + DotSet(buf); + } + + clp = buf->clauseInfo + buf->curLCStart; + + /* $B%P%C%U%!$NBg$-$5$N%A%'%C%/(B */ + ksizenew = (buf->kanaEnd - buf->kanaBuf) + 1; + dsizenew = (buf->displayEnd - buf->displayBuf) + 1; + if ((ksizenew > buf->bufferSize || dsizenew > buf->bufferSize) && + resizeBuffer(buf, ksizenew > dsizenew ? ksizenew : dsizenew) < 0) { + return -1; + } + + /* $B$+$J%P%C%U%!$r%"%C%W%G!<%H(B */ + dot = buf->dot; + /* $B%+%l%s%HJ8@a$N8e$m$r0lJ8;z$:$i$9(B */ + moveKBuf(buf, buf->curLCStart + 1, 1); + /* $B%+%l%s%HJ8@aFb$N%I%C%H0J9_$r0lJ8;z$:$i$9(B */ + (void)bcopy((char *)dot, (char *)(dot + 1), + ((clp + 1)->kanap - dot) * sizeof(wchar)); + /* $BA^F~(B */ + *dot = c; + + /* $BI=<(%P%C%U%!$r%"%C%W%G!<%H(B */ + dispdot = clp->dispp + (dot - clp->kanap); + /* $B%+%l%s%HJ8@a$N8e$m$r0lJ8;z$:$i$9(B */ + moveDBuf(buf, buf->curLCStart + 1, 1); + /* $B%+%l%s%HJ8@aFb$N%I%C%H0J9_$r0lJ8;z$:$i$9(B */ + (void)bcopy((char *)dispdot, (char *)(dispdot + 1), + ((clp + 1)->dispp - dispdot) * sizeof(wchar)); + /* $BA^F~(B */ + *dispdot = c; + + /* $B%I%C%H$r99?7(B */ + buf->dot++; + + return 0; +} + +/* jcDeleteChar -- $B%I%C%H$NA0$^$?$O8e$m$N0lJ8;z$r:o=|$9$k(B */ +int +jcDeleteChar(buf, prev) +jcConvBuf *buf; +int prev; +{ + jcClause *clp; + wchar *dot, *dispdot; + + TRACE("jcDeleteChar", "Enter") + + CHECKFIXED(buf); + + clp = buf->clauseInfo; + if (buf->nClause == 0) { + /* $BJ8@a?t$,(B 0$B!"$D$^$j2?$bF~$C$F$$$J$$;~(B: + * - $B%(%i!<(B + */ + jcErrno = JE_CANTDELETE; + return -1; + } else if (buf->curClause >= buf->nClause) { + /* $B%+%l%s%HJ8@a$,:G8e$NJ8@a$NcurLCStart].conv) { + /* $B%+%l%s%HJ8@a$,JQ49$5$l$F$$$k;~(B: + * - prev $B$G$"$l$PA0$NJ8@a$N:G8e$NJ8;z$r:o=|(B + * $B%+%l%s%HJ8@a$OA0$NJ8@a$K0\F0$9$k(B + * $BI,MW$J$i$PA0$NJ8@a$rL5JQ49$KLa$7$F$+$i:o=|$9$k(B + * $B%+%l%s%HJ8@a$,@hF,$J$i$P%(%i!<(B + * - !prev $B$J$i%+%l%s%HJ8@a$rL5JQ49$KLa$7$F!"J8@a$N(B + * $B:G=i$NJ8;z$r:o=|(B + */ + if (prev) { + if (buf->curLCStart == 0) { + jcErrno = JE_CANTDELETE; + return -1; + } + (void)jcMove(buf, 0, JC_BACKWARD); + } + } else { + /* $B%+%l%s%HJ8@a$,JQ49$5$l$F$$$J$$;~(B: + * - prev $B$G$"$l$P%I%C%H$NA0$NJ8;z$r:o=|(B + * $B$?$@$7%I%C%H$,J8@a$N@hF,$K$"$l$PA0$NJ8@a$N(B + * $B:G8e$NJ8;z$r:o=|(B + * $B$=$N;~$K$O%+%l%s%HJ8@a$OA0$NJ8@a$K0\F0$9$k(B + * $BI,MW$J$i$PA0$NJ8@a$rL5JQ49$KLa$7$F$+$i:o=|$9$k(B + * $B%+%l%s%HJ8@a$,@hF,$J$i$P%(%i!<(B + * - !prev $B$J$i%I%C%H$Ndot == clp[buf->curLCStart].kanap) { + if (buf->curLCStart == 0) { + jcErrno = JE_CANTDELETE; + return -1; + } + (void)jcMove(buf, 0, JC_BACKWARD); + } + } else { + if (buf->dot == clp[buf->curLCEnd].kanap) { + jcErrno = JE_CANTDELETE; + return -1; + } + } + } + + if (buf->clauseInfo[buf->curLCStart].conv) { + /* $B%+%l%s%HJ8@a$,JQ49:Q$_$G$"$l$PL5JQ49$KLa$9(B */ + if (jcUnconvert(buf) < 0) + return -1; + /* prev $B$G$"$l$PJ8@a$N:G8e$NJ8;z!"$=$&$G$J$1$l$PJ8@a$N(B + * $B@hF,$NJ8;z$r:o=|$9$k(B + */ + if (prev) { + buf->dot = buf->clauseInfo[buf->curLCEnd].kanap - 1; + } else { + buf->dot = buf->clauseInfo[buf->curLCStart].kanap; + } + } else { + /* prev $B$J$i%I%C%H$r#1J8;zLa$7$F$*$/(B + * $B$3$&$9$l$P%I%C%H$N8e$m$NJ8;z$r:o=|$9$k$3$H$K$J$k(B + * $B:o=|$7=*$o$C$?$H$-$K%I%C%H$rF0$+$9I,MW$b$J$$(B + */ + if (prev) + buf->dot--; + } + + clp = buf->clauseInfo + buf->curLCStart; + + /* $B$+$J%P%C%U%!$r%"%C%W%G!<%H(B */ + dot = buf->dot; + /* $B%+%l%s%HJ8@aFb$N%I%C%H0J9_$r0lJ8;z$:$i$9(B */ + (void)bcopy((char *)(dot + 1), (char *)dot, + ((clp + 1)->kanap - (dot + 1)) * sizeof(wchar)); + /* $B%+%l%s%HJ8@a$N8e$m$r0lJ8;z$:$i$9(B */ + moveKBuf(buf, buf->curLCEnd, -1); + + /* $BI=<(%P%C%U%!$r%"%C%W%G!<%H(B */ + dispdot = clp->dispp + (dot - clp->kanap); + /* $B%+%l%s%HJ8@aFb$N%I%C%H0J9_$r0lJ8;z$:$i$9(B */ + (void)bcopy((char *)(dispdot + 1), (char *)dispdot, + ((clp + 1)->dispp - (dispdot + 1)) * sizeof(wchar)); + /* $B%+%l%s%HJ8@a$N8e$m$r0lJ8;z$:$i$9(B */ + moveDBuf(buf, buf->curLCEnd, -1); + + /* $B%+%l%s%HJ8@a$ND9$5$,#1$@$C$?>l9g$K$OJ8@a$,#18:$k$3$H$K$J$k(B */ + if (clp->kanap == (clp + 1)->kanap) { + /* $BJ8@a$,$J$/$J$C$F$7$^$C$?(B */ + moveCInfo(buf, buf->curLCEnd, -1); + setCurClause(buf, buf->curLCStart); + DotSet(buf); + } + + return 0; +} + +/* jcKillLine -- $B%I%C%H0J9_$r:o=|$9$k(B */ +int +jcKillLine(buf) +jcConvBuf *buf; +{ + int cc = buf->curClause; + + TRACE("jcKillLine", "Enter") + + CHECKFIXED(buf); + + /* $BF~NOCf$NJ8@a$,$J$$$+!"%I%C%H$,:G8e$NJ8@a$NnClause <= 0 || cc >= buf->nClause) { + jcErrno = JE_CANTDELETE; + return -1; + } + +#ifdef DEBUG_WNNLIB + showBuffers(buf, "before jcKillLine"); +#endif + + /* $B%I%C%H$,F~NO$N@hF,$G$"$l$P!"(BjcClear $B$r8F=P$7$F=*$j(B */ + if (buf->dot == buf->kanaBuf) + return jcClear(buf); + + /* + * $B%I%C%H0J9_$r:o=|$9$k(B + * $B$H$$$C$F$b!"C1$KJ8@a>pJs$H%]%$%s%?$rJQ99$9$l$PNI$$(B + */ + checkCandidates(buf, cc, buf->nClause); + if (buf->clauseInfo[cc].conv) { + /* $BJQ49$5$l$F$$$l$P!"%+%l%s%HJ8@a$r4^$a$F:o=|(B */ + buf->kanaEnd = buf->dot = buf->clauseInfo[cc].kanap; + buf->displayEnd = buf->clauseInfo[cc].dispp; + + /* $B%+%l%s%HJ8@a$rKvHxJ8@a$K0\$9(B */ + buf->nClause = buf->curClause = buf->curLCStart = cc; + buf->curLCEnd = cc + 1; + } else { + /* $BL$JQ49$J$i$P!"%I%C%H0J9_$r:o=|(B */ + buf->kanaEnd = buf->dot; + buf->displayEnd = buf->clauseInfo[cc].dispp + + (buf->dot - buf->clauseInfo[cc].kanap); + + /* $B%+%l%s%HJ8@a$O$=$N$^$^$G!"KvHx$@$1$r5$$K$9$l$P$h$$(B */ + cc++; + buf->nClause = buf->curLCEnd = cc; + } + + /* $B6u$NKvHxJ8@a$N@_Dj$r$9$k(B */ + buf->clauseInfo[cc].kanap = buf->kanaEnd; + buf->clauseInfo[cc].dispp = buf->displayEnd; + buf->clauseInfo[cc].conv = 0; + buf->clauseInfo[cc].ltop = 1; + + /* $B%+%l%s%HJ8@a$H$=$l0J9_$N(B jllib $B$NJ8@a>pJs$bL58z$K$9$k(B */ + if (jl_bun_suu(buf->wnn) > cc) + jl_kill(buf->wnn, cc, -1); + +#ifdef DEBUG_WNNLIB + showBuffers(buf, "after jcKillLine"); +#endif + return 0; +} + +/* jcChangeClause -- $B%+%l%s%HBgJ8@a$r;XDj$5$l$?J8;zNs$GCV$-49$($k(B */ +int +jcChangeClause(buf, str) +jcConvBuf *buf; +wchar *str; +{ + jcClause *clps, *clpe; + wchar *p; + int newlen; + int oklen, odlen; + int ksize, dsize; + + TRACE("jcChangeClause", "Enter") + + CHECKFIXED(buf); + + clps = buf->clauseInfo + buf->curLCStart; + clpe = buf->clauseInfo + buf->curLCEnd; + + newlen = 0; + p = str; + while (*p++) + newlen++; + + /* $B$+$J%P%C%U%!$HI=<(%P%C%U%!$N%5%$%:$rD4$Y$F!"(B + * $BF~$i$J$+$C$?$iBg$-$/$9$k(B + */ + if (buf->curLCStart < buf->nClause) { + oklen = clpe->kanap - clps->kanap; + odlen = clpe->dispp - clps->dispp; + } else { + oklen = odlen = 0; + } + ksize = (buf->kanaEnd - buf->kanaBuf) + newlen - oklen; + dsize = (buf->displayEnd - buf->displayBuf) + newlen - odlen; + if (ksize > buf->bufferSize || dsize > buf->bufferSize) { + if (resizeBuffer(buf, ksize > dsize ? ksize : dsize) < 0) + return -1; + } + + /* curLCStart $B$,(B nClause $B$KEy$7$$;~$@$1!"?7$?$KJ8@a$,:n$i$l$k(B */ + if (buf->curLCStart == buf->nClause) { + /* clauseInfo $B$NBg$-$5$rD4$Y$k(B*/ + if (buf->nClause + 1 > buf->clauseSize) { + if (resizeCInfo(buf, buf->nClause + 1) < 0) + return -1; + } + /* $B?7$?$K$G$-$?(B clauseInfo $B$K$O!"(BnClause $BHVL\(B + * ($B$D$^$j:G8e$N(B clauseInfo) $B$NFbMF$r%3%T!<$7$F$*$/(B + */ + clpe = buf->clauseInfo + buf->nClause + 1; + *clpe = *(clpe - 1); + + buf->nClause++; + } + + clps = buf->clauseInfo + buf->curLCStart; + clpe = buf->clauseInfo + buf->curLCEnd; + + /* $B$+$J%P%C%U%!$NJQ99(B */ + /* $B$^$:$O8e$m$r0\F0$5$;$k(B */ + moveKBuf(buf, buf->curLCEnd, newlen - oklen); + /* str $B$r%3%T!<(B */ + (void)bcopy((char *)str, (char *)clps->kanap, + newlen * sizeof(wchar)); + /* $BI=<(%P%C%U%!$NJQ99(B */ + /* $B$^$:$O8e$m$r0\F0$5$;$k(B */ + moveDBuf(buf, buf->curLCEnd, newlen - odlen); + /* str $B$r%3%T!<(B */ + (void)bcopy((char *)str, (char *)clps->dispp, + newlen * sizeof(wchar)); + + /* clauseInfo $B$NJQ99(B */ + /* $B$^$:$O8e$m$r0\F0$5$;$k(B */ + if (clpe > clps + 1) { + (void)bcopy((char *)clpe, (char *)(clps + 1), + (buf->nClause + 1 - buf->curLCEnd) * + sizeof(jcClause)); + } + clps->conv = 0; + clps->ltop = 1; + (clps + 1)->ltop = 1; + + return 0; +} + +/* jcSaveDic -- $B<-=q!&IQEY%U%!%$%k$r%;!<%V$9$k(B */ +int +jcSaveDic(buf) +jcConvBuf *buf; +{ + TRACE("jcSaveDic", "Enter") + + return jl_dic_save_all(buf->wnn); +} + +/* $B%5!<%P$H$N@\B3$N$?$a$N4X?t72(B */ + +struct wnn_buf * +jcOpen(server, envname, override, rcfile, errmsg, confirm, timeout) +char *server; +char *envname; +int override; +char *rcfile; +void (*errmsg)(); +int (*confirm)(); +int timeout; +{ + return jcOpen2(server, envname, override, rcfile, rcfile, errmsg, confirm, timeout); +} + +struct wnn_buf * +jcOpen2(server, envname, override, rcfile4, rcfile6, errmsg, confirm, timeout) +char *server; +char *envname; +int override; +char *rcfile4; /* wnnenvrc for Wnn4 */ +char *rcfile6; /* wnnenvrc for Wnn6 */ +void (*errmsg)(); +int (*confirm)(); +int timeout; +{ + struct wnn_buf *wnnbuf; + struct wnn_env *wnnenv; + char *rcfile; + int env_exists; + int wnn_version; + extern char *getenv(); + + TRACE("jcOpen2", "Enter") + + /* $B%5!<%PL>$,(B NULL $B$^$?$O6uJ8;zNs$@$C$?>l9g$O4D6-JQ?t(B JSERVER $B$r;HMQ$9$k(B */ + if (server == NULL || server[0] == '\0') { + server = getenv("JSERVER"); + } + + /* $B4D6-L>$,6uJ8;zNs$@$C$?>l9g$O!"%f!<%6L>$r;HMQ$9$k(B */ + if (envname != NULL && *envname == 0) { + struct passwd *p = getpwuid(getuid()); + + if (p != NULL) envname = p->pw_name; + } + + /* + * jserver $B$N%P!<%8%g%s$K$h$C$F(B wnnrc $B$rJQ$($?$$$N$@$,!"(B + * $B%P!<%8%g%s$rD4$Y$k$?$a$K$O$^$:@\B3$7$J$/$F$O$J$i$J$$!#(B + * $B$=$3$G(B wnnrc $B0z?t$r(B NULL $B$K$7$F@\B3$9$k!#(B + */ +#if JSERVER_VERSION > 0x4030 + wnnbuf = jl_open_lang(envname, server, "ja_JP", + NULL, confirm, errmsg, timeout); +#else + wnnbuf = jl_open(envname, server, NULL, confirm, errmsg, timeout); +#endif + + /* + * $B!&%P%C%U%!$,:n$l$J$+$C$?(B + * $B!&(Bjserver $B$K@\B3$G$-$J$+$C$?(B + * $B!&(Bwnnrc $B%U%!%$%k$N;XDj$,$J$$(B ($B$D$^$j=i4|2=$7$J$$(B) + * $B>l9g$K$O$3$l$G=*$j!#(B + */ + if (wnnbuf == NULL || + !jl_isconnect(wnnbuf) || + (rcfile4 == NULL && rcfile6 == NULL)) { + return wnnbuf; + } + + wnnenv = jl_env_get(wnnbuf); + + /* + * $B0JA0$+$i4D6-$,B8:_$7$F$$$?$+$I$&$+$H!"%5!<%P$N%P!<%8%g%s$rD4$Y$k!#(B + * $B4D6-$,B8:_$7$F$$$?$+$I$&$+$O(B jl_fuzokugo_get $B$G(B ($B$D$^$jIUB08l(B + * $B<-=q$,@_Dj$5$l$F$$$k$+$I$&$+$G(B) $BH=CG$9$k!#(Bjl_open_lang $B$O4D6-$,(B + * $B$J$1$l$P:n$C$F$7$^$&$?$a!"(Bjs_env_exist $B$O;H$($J$$!#(B + */ + { + char fzk[1024]; + int serv_ver, lib_ver; + + if (ki2_jl_fuzokugo_get(wnnbuf, fzk, 1024) != -1) { + env_exists = 1; + TRACE("jcOpen2", "env exists"); + } else { + env_exists = 0; + TRACE("jcOpen2", "no env"); + } + if (js_version(wnnenv->js_id, &serv_ver, &lib_ver) != -1 && + serv_ver >= 0x4f00) { + wnn_version = 6; + TRACE("jcOpen2", "Wnn6"); + } else { + wnn_version = 4; + TRACE("jcOpen2", "Wnn4"); + } + } + + /* wnnrc $B$NA*Br(B */ + rcfile = (wnn_version == 4) ? rcfile4 : rcfile6; + + /* + * $B4D6-$,$9$G$KB8:_$7$+$D4D6-$N>e=q$-$,;XDj$5$l$F$$$J$$!"$"$k$$$O(B + * rcfile $B$,(B NULL $B$N>l9g$K$O$3$l$G=*$j!#(B + */ + if ((env_exists && !override) || rcfile == NULL) return wnnbuf; + + /* + * wnnrc $B$,6uJ8;zNs$@$C$?>l9g$O!"%G%U%)%k%H$r;HMQ$9$k!#(B + * 1. $B4D6-JQ?t(B WNNENVRC4 $B$^$?$O(B WNNENVRC6 + * 2. $B4D6-JQ?t(B WNNENVRC + * 3. $B%7%9%F%`$N%G%U%)%k%H(B + * $B$N=g$G8!:w$9$k!#:G8e$N$O$A$g$C$H$$$$$+$2$s!#(B + */ + if (*rcfile == '\0') { + rcfile = getenv((wnn_version == 4) ? "WNNENVRC4" : "WNNENVRC6"); + if (rcfile == NULL || access(rcfile, R_OK) != 0) { + rcfile = getenv("WNNENVRC"); + } + if (rcfile == NULL || access(rcfile, R_OK) != 0) { + if (wnn_version == 6) { +#ifdef WNN6 + rcfile = "@DEFAULT"; +#else + rcfile = "wnnenvrc"; +#endif + } else { +#if defined(LIBDIR) && JSERVER_VERSION > 0x4030 + static char envrc[256]; + rcfile = envrc; + (void)sprintf(rcfile, "%s/ja_JP/wnnenvrc", LIBDIR); + if (access(rcfile, R_OK) != 0) + (void) sprintf(rcfile, "%s/wnnenvrc", LIBDIR); +#else + rcfile = "wnnenvrc"; +#endif + } + } + } + + /* $B4D6-@_Dj$9$k(B */ + (void)jl_set_env_wnnrc(wnnenv, rcfile, confirm, errmsg); + + return wnnbuf; +} + +int +jcClose(wnnbuf) +struct wnn_buf *wnnbuf; +{ + TRACE("jcClose", "Enter") + + if (wnnbuf != NULL) + jl_close(wnnbuf); + return 0; +} + +int +jcIsConnect(wnnbuf) +struct wnn_buf *wnnbuf; +{ + TRACE("jcIsConnect", "Enter") + + if (wnnbuf == NULL) + return 0; + return jl_isconnect(wnnbuf); +} + +#ifdef DEBUG_WNNLIB +static void +printBuffer(start, end) +wchar *start; +wchar *end; +{ + wchar wc; + + while (start < end) { + wc = *start++; + if (wc >= 0200) { + putc((wc >> 8) & 0xff, stderr); + wc &= 0xff; + } else if (wc < 040 || wc == 0177) { + putc('^', stderr); + wc ^= 0100; + } else if (wc == '^' || wc == '\\') { + putc('\\', stderr); + } + putc(wc, stderr); + } +} + +static void +showBuffers(buf, tag) +jcConvBuf *buf; +char *tag; +{ + int i; + jcClause *clp = buf->clauseInfo; + wchar ws[512]; + + fprintf(stderr, "Buffer Info [%s]\n", tag); + fprintf(stderr, "nClause = %d, curClause = %d [%d, %d], ", + buf->nClause, buf->curClause, buf->curLCStart, buf->curLCEnd); + + if (buf->dot < buf->kanaBuf) { + fprintf(stderr, "dot < 0\n"); + } else if (buf->dot > buf->kanaEnd) { + fprintf(stderr, "dot > 0\n"); + } else if (buf->nClause == 0) { + fprintf(stderr, "dot == 0\n"); + } else { + for (i = 0; i < buf->nClause; i++) { + if (buf->dot <= clp[i].kanap) + break; + } + if (buf->dot < clp[i].kanap) + i--; + fprintf(stderr, "dot = %d.%d\n", i, buf->dot - clp[i].kanap); + } + + for (i = 0; i < buf->nClause; i++) { + fprintf(stderr, + "clause[%d]: conv = %d, ltop = %d", + i, clp->conv, clp->ltop); + if (clp->conv == 1) { + fprintf(stderr, " [%d]", jl_dai_top(buf->wnn, i)); + } + fprintf(stderr, "\n"); + fprintf(stderr, "clause[%d]: Kana = '", i); + printBuffer(clp->kanap, (clp + 1)->kanap); + fprintf(stderr, "'\n"); + if (clp->conv == 1) { + fprintf(stderr, "clause[%d]: Yomi = '", i); + (void)ki2_jl_get_yomi(buf->wnn, i, i + 1, ws, 512); + printBuffer(ws, ws + jl_yomi_len(buf->wnn, i, i + 1)); + fprintf(stderr, "'\n"); + } + fprintf(stderr, "clause[%d]: Disp = '", i); + printBuffer(clp->dispp, (clp + 1)->dispp); + fprintf(stderr, "'\n"); + if (clp->conv == 1) { + fprintf(stderr, "clause[%d]: Conv = '", i); + (void)ki2_jl_get_kanji(buf->wnn, i, i + 1, ws, 512); + printBuffer(ws, ws + jl_kanji_len(buf->wnn, i, i + 1)); + fprintf(stderr, "'\n"); + } + clp++; + } +} +#endif /* DEBUG_WNNLIB */ diff -r 000000000000 -r 92745d501b9a lib/wstring.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/wstring.c Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,157 @@ +/* + * wstring.c -- BSD string(3) for wchar + */ + +/* + * Copyright (c) 1989 Software Research Associates, Inc. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Software Research Associates not be + * used in advertising or publicity pertaining to distribution of the + * software without specific, written prior permission. Software Research + * Associates makes no representations about the suitability of this software + * for any purpose. It is provided "as is" without express or implied + * warranty. + * + * Author: Makoto Ishisone, Software Research Associates, Inc., Japan + * ishisone@sra.co.jp + */ + +/* $Id: wstring.c,v 2.2 1994/06/06 05:20:40 ishisone Rel $ */ + +#include "WStr.h" + +wchar * +wstrcat(s1, s2) +wchar *s1, *s2; +{ + wchar *ret = s1; + + while (*s1++) + ; + s1--; + + while (*s1++ = *s2++) + ; + + return ret; +} + +wchar * +wstrncat(s1, s2, n) +wchar *s1, *s2; +int n; +{ + wchar *ret = s1; + + while (*s1++) + ; + s1--; + + while (n-- > 0 && (*s1++ = *s2++)) + ; + if (n < 0) + *s1 = 0; + + return ret; +} + +int +wstrcmp(s1, s2) +wchar *s1, *s2; +{ + while (*s1 && *s1 == *s2) + s1++, s2++; + return (int)(*s1 - *s2); +} + +int +wstrncmp(s1, s2, n) +wchar *s1, *s2; +int n; +{ + while (n-- > 0 && *s1 && *s1 == *s2) + s1++, s2++; + if (n < 0) + return 0; + return (int)(*s1 - *s2); +} + +wchar * +wstrcpy(s1, s2) +wchar *s1, *s2; +{ + wchar *ret = s1; + + while (*s1++ = *s2++) + ; + + return ret; +} + +wchar * +wstrncpy(s1, s2, n) +wchar *s1, *s2; +int n; +{ + wchar *ret = s1; + + while (n-- > 0 && (*s1++ = *s2++)) + ; + while (n-- > 0) + *s1++ = 0; + + return ret; +} + +int +wstrlen(s) +wchar *s; +{ + int n = 0; + + while (*s++) + n++; + return n; +} + +wchar * +#if __STDC__ == 1 +windex(wchar *s, wchar c) +#else +windex(s, c) +wchar *s, c; +#endif +{ + int x; + + while (x = *s++) { + if (x == c) + return s - 1; + } + + return 0; +} + +wchar * +#if __STDC__ == 1 +wrindex(wchar *s, wchar c) +#else +wrindex(s, c) +wchar *s, c; +#endif +{ + wchar *r = 0; + int x; + + while (x = *s++) { + if (x == c) + r = s - 1; + } + + return r; +} + diff -r 000000000000 -r 92745d501b9a lib/xtwstr.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/xtwstr.c Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,110 @@ +/* + * xtwstr.c + */ + +/* + * Copyright (c) 1989 Software Research Associates, Inc. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Software Research Associates not be + * used in advertising or publicity pertaining to distribution of the + * software without specific, written prior permission. Software Research + * Associates makes no representations about the suitability of this software + * for any purpose. It is provided "as is" without express or implied + * warranty. + * + * Author: Makoto Ishisone, Software Research Associates, Inc., Japan + * ishisone@sra.co.jp + */ + +#ifndef lint +static char *rcsid = "$Id: xtwstr.c,v 2.3 1991/10/02 04:27:04 ishisone Rel $"; +#endif + +#include +#include "WStr.h" +#include "XWStr.h" + +#define IS2B(f) (((f)->max_byte1 > 0) || ((f)->max_char_or_byte2 > 255)) + +XWSGC +XtWSGetGCSet(w, mask, values, fontG0, fontG1, fontG2, fontG3) +Widget w; +unsigned long mask; +XGCValues *values; +XFontStruct *fontG0; +XFontStruct *fontG1; +XFontStruct *fontG2; +XFontStruct *fontG3; +{ + XGCValues gcval; + XWSGC gcset; + int i; + + gcset = (XWSGC)XtMalloc(sizeof(XWSGCSet)); + gcset->fe[0].font = fontG0; + gcset->fe[1].font = fontG1; + gcset->fe[2].font = fontG2; + gcset->fe[3].font = fontG3; + + gcval = *values; + mask |= GCFont; + for (i = 0; i < 4; i++) { + if (gcset->fe[i].font != NULL) { + gcval.font = (gcset->fe[i].font)->fid; + gcset->fe[i].gc = XtGetGC(w, mask, &gcval); + gcset->fe[i].flag = GCCREAT; + if (IS2B(gcset->fe[i].font)) + gcset->fe[i].flag |= TWOB; + } else { + gcset->fe[i].gc = NULL; + } + } + + return gcset; +} + +void +XtWSDestroyGCSet(gcset) +XWSGC gcset; +{ + int i; + int flag; + + for (i = 0; i < 4; i++) { + if (gcset->fe[i].gc == NULL) + continue; + flag = gcset->fe[i].flag; + if (flag & GCCREAT) + XtDestroyGC(gcset->fe[i].gc); + /* can't free XFontStruct data allocated by XWSSetGCSet() + * because I can't figure out which display is used. + * if (flag & FONTQUERY) + * XFreeFont(???, gcset->fe[i].font); + */ + } + XtFree((char *)gcset); +} + +void +XtWSReleaseGCSet(w, gcset) +Widget w; +XWSGC gcset; +{ + int i; + int flag; + + for (i = 0; i < 4; i++) { + if (gcset->fe[i].gc == NULL) + continue; + flag = gcset->fe[i].flag; + if (flag & GCCREAT) + XtReleaseGC(w, gcset->fe[i].gc); + if (flag & FONTQUERY) + XFreeFont(XtDisplay(w), gcset->fe[i].font); + } + XtFree((char *)gcset); +} diff -r 000000000000 -r 92745d501b9a lib/xwstr.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/xwstr.c Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,500 @@ +/* + * xwstr.c + */ + +/* + * Copyright (c) 1989 Software Research Associates, Inc. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Software Research Associates not be + * used in advertising or publicity pertaining to distribution of the + * software without specific, written prior permission. Software Research + * Associates makes no representations about the suitability of this software + * for any purpose. It is provided "as is" without express or implied + * warranty. + * + * Author: Makoto Ishisone, Software Research Associates, Inc., Japan + * ishisone@sra.co.jp + */ + +/* + * wide character string $B$rMQ$$$F%F%-%9%H$rI=<($9$k$?$a$N%i%$%V%i%j(B + * + * wide character $B$NFCD9$r@8$+$7!":GBgF1;~$K(B 4 $B3Q$+$J(B + * G3 1xxxxxxx0xxxxxxx $B30;z(B + * + * XWSGC XWSSetGCSet(GC gc0, GC gc1, GC gc2, GC gc3) + * $B;XDj$5$l$?(B 4$B$D$N(B GC $B$rAH$_9g$o$;$F(B XWSGC $B$r:n$k!#(B + * G0, G1, G2, G3 $B$NJ8;z$KBP$7$F$=$l$>$l(B gc0, gc1, gc2, gc3 $B$,(B + * $B;H$o$l$k!#0z?t(B gc? $B$K$O(B NULL $B$r;XDj$7$F$b$h$$!#$=$N>l9g$K$O(B + * $BBP1~$9$k%-%c%i%/%?%;%C%H$NJ8;z$O=q$+$l$J$$!#(B + * $B$J$*(B Xt $B$NCf$G;HMQ$9$k;~$K$O!"(Bxtwstr.c $B$NCf$N(B XtWSGetGCSet() + * $B$r;H$&J}$,$h$$$@$m$&!#(B + * + * void XWSSetMapping(XWSGC gcset, int g0map, int g1map, int g2map, int g3map) + * G0, G1, G2, G3 $B$NJ8;z$rIA2h$9$k;~$K%U%)%s%H$N(B GL / GR $B$N$I$A$i$r(B + * $B;HMQ$9$k$+$r@_Dj$9$k!#(B0 $B$r;XDj$9$k$H(B GL $B$,;HMQ$5$l!"(B1 $B$r;XDj$9$k$H(B + * GR $B$,;HMQ$5$l$k!#(B-1 $B$,;XDj$5$l$?>l9g$K$OA0$N@_Dj$,$=$N$^$^;H$o$l$k!#(B + * $B%G%U%)%k%H$N@_Dj(B ($B$D$^$j(B XWSSetGCSet() $B$^$?$O(B XtWSGetGCSet() $B$G(B + * gcset $B$,:n$i$l$?;~(B) $B$O$9$Y$F(B GL $B$r;HMQ$9$k$h$&$K$J$C$F$$$k!#(B + * + * int XWSDrawString(Display *d, Drawable w, XWSGC gcset, + * int x, int y, wchar *wstr, int len) + * int XWSDrawImageString(Display *d, Drawable w, XWSGC gcset, + * int x, int y, wchar *wstr, int len) + * $B$=$l$>$l!"(BXlib $B$N(B XDrawString() / XDrawImageString() $B$K(B + * $BBP1~$9$k4X?t!#;XDj$5$l$?0LCV$K;XDj$5$l$?(B GC $B%;%C%H$rMQ$$$F(B + * $B%F%-%9%H$r=q$/!#0z?t(B len $B$OJ8;zNs(B wstr $B$NJ8;z?t$G$"$k!#(B + * $B%P%$%H?t$G$O$J$$$3$H$KCm0U!#(B + * $B$J$*!"(BXDrawString() $B$J$I$H$O0[$J$j!"%j%?!<%s%P%j%e!<$H$7$F(B + * $B=q$$$?J8;z$NI}$rJV$9!#(B + * + * int XWSTextWidth(XWSGC gcset, wchar *wstr, int len) + * void XWSTextExtents(XWSGC gcset, wchar *wstr, int len, + * int *ascent, int *descent, XCharStruct *overall) + * $B$=$l$>$l!"(BXlib $B$N(B XTextWidth() / XTextExtents() $B$KBP1~$9$k(B + * $B4X?t!#;XDj$5$l$?J8;zNs$NI}!&Bg$-$5$rJV$9!#(B + * + * void XWSFontHeight(XWSGC gcset, wchar *wstr, int len, + * int *ascent, int *descent) + * $B0z?t(B wstr $B$G;XDj$5$l$?J8;z$KBP1~$9$k%U%)%s%H$N(B ascent/descent $B$N(B + * $B:GBgCM$rJV$9!#(Bwstr $B$K(B NULL $B$r;XDj$9$k$H!"(BXWSGC $B$K%;%C%H$5$l$?(B + * $B$9$Y$F$N%U%)%s%H$N(B ascent/descent $B$N:GBgCM$rJV$9!#(B + */ + +#ifndef lint +static char *rcsid = "$Id: xwstr.c,v 2.9 1999/01/07 03:13:03 ishisone Exp $"; +#endif + +#include +#if defined(XlibSpecificationRelease) && XlibSpecificationRelease > 4 +#include +#endif +#include "WStr.h" +#include "XWStr.h" + +#ifdef __STDC__ +#include +#else +extern char *malloc(); +#endif + +#define G0MASK 0x0000 +#define G1MASK 0x8080 +#define G2MASK 0x0080 +#define G3MASK 0x8000 + +#define IS2B(f) (((f)->max_byte1 > 0) || ((f)->max_char_or_byte2 > 255)) +#define MIN(a, b) ((a) > (b) ? (b) : (a)) +#define MAX(a, b) ((a) > (b) ? (a) : (b)) + +#ifndef NULL +#define NULL 0 +#endif + +#define bufsize 256 + +#ifdef __STDC__ +/* static function prototype */ +static int flushstr(Display *, Drawable, FontEnt *, int, int, + XChar2b *, XChar2b *, int); +static int wsdrawstring(Display *, Drawable, XWSGC, int, int, + wchar *, int, int); +#else +static int flushstr(); +static int wsdrawstring(); +#endif + +XWSGC +XWSSetGCSet(dpy, gc0, gc1, gc2, gc3) +Display *dpy; +GC gc0; +GC gc1; +GC gc2; +GC gc3; +{ + XWSGC gcset; + int i; + + gcset = (XWSGC)malloc(sizeof(XWSGCSet)); + if (gcset == NULL) + return (XWSGC)NULL; + + gcset->fe[0].gc = gc0; + gcset->fe[1].gc = gc1; + gcset->fe[2].gc = gc2; + gcset->fe[3].gc = gc3; + + for (i = 0; i < 4; i++) { + if (gcset->fe[i].gc == NULL) { + gcset->fe[i].font = NULL; + } else { + XFontStruct *font; + gcset->fe[i].font = font = XQueryFont(dpy, XGContextFromGC(gcset->fe[i].gc)); + gcset->fe[i].flag = FONTQUERY; + if (IS2B(font)) + gcset->fe[i].flag = TWOB; + } + } + + return gcset; +} + +void +XWSSetMapping(gcset, g0map, g1map, g2map, g3map) +XWSGC gcset; +int g0map; +int g1map; +int g2map; +int g3map; +{ + int map[4]; + int i; + + map[0] = g0map; map[1] = g1map; map[2] = g2map; map[3] = g3map; + for (i = 0; i < 4; i++) { + if (map[i] < 0) + continue; + else if (map[i] == 0) + gcset->fe[i].flag &= ~GRMAPPING; + else + gcset->fe[i].flag |= GRMAPPING; + } +} + +int +XWSDrawString(d, w, gcset, x, y, wstr, len) +Display *d; +Drawable w; +XWSGC gcset; +int x; +int y; +wchar *wstr; +int len; +{ + return wsdrawstring(d, w, gcset, x, y, wstr, len, 0); +} + +int +XWSDrawImageString(d, w, gcset, x, y, wstr, len) +Display *d; +Drawable w; +XWSGC gcset; +int x; +int y; +wchar *wstr; +int len; +{ + return wsdrawstring(d, w, gcset, x, y, wstr, len, 1); +} + +void +XWSFontHeight(gcset, wstr, len, ascent, descent) +XWSGC gcset; +wchar *wstr; +int len; +int *ascent; +int *descent; +{ + FontEnt *fep = &(gcset->fe[0]); + int i; + int asc = 0; + int dsc = 0; + + if (wstr) { + while (len-- > 0) { + i = GSET(*wstr++); + if (fep[i].font) { + if ((fep[i].font)->ascent > asc) + asc = (fep[i].font)->ascent; + if ((fep[i].font)->descent > dsc) + dsc = (fep[i].font)->descent; + } + } + } else { + for (i = 0; i < 4; i++) { + if (fep[i].font) { + if ((fep[i].font)->ascent > asc) + asc = (fep[i].font)->ascent; + if ((fep[i].font)->descent > dsc) + dsc = (fep[i].font)->descent; + } + } + } + *ascent = asc; + *descent = dsc; +} + +int +XWSTextWidth(gcset, wstr, len) +XWSGC gcset; +wchar *wstr; +int len; +{ + XChar2b buf[bufsize]; + XChar2b *cp; + wchar *wstr1 = wstr + len; + XChar2b *cpend = buf + bufsize; + int c; + int width = 0; + int gmask, gset; + FontEnt *fe; + int is2b; + int grmap; + + while (wstr < wstr1) { + gmask = *wstr & 0x8080; + + switch (gmask) { + case G0MASK: + gset = 0; + break; + case G1MASK: + gset = 1; + break; + case G2MASK: + gset = 2; + break; + case G3MASK: + gset = 3; + break; + } + + fe = &gcset->fe[gset]; + is2b = fe->flag & TWOB; + grmap = (fe->flag & GRMAPPING) ? 0x80 : 0; + cp = buf; + + if (fe->font == NULL) { + while (wstr < wstr1 && (*wstr & 0x8080) == gmask) + wstr++; + continue; + } + + while (wstr < wstr1 && ((c = *wstr) & 0x8080) == gmask) { + if (cp >= cpend - 1) { + /* flush */ + width += XTextWidth16(fe->font, buf, cp - buf); + cp = buf; + } + if (is2b) + cp->byte1 = ((c >> 8) & 0x7f) | grmap; + else + cp->byte1 = 0; + cp->byte2 = (c & 0x7f) | grmap; + cp++; + wstr++; + } + + if (cp == buf) + continue; + + /* flush */ + width += XTextWidth16(fe->font, buf, cp - buf); + } + + return width; +} + +void +XWSTextExtents(gcset, wstr, len, ascent, descent, overall) +XWSGC gcset; +wchar *wstr; +int len; +int *ascent; +int *descent; +XCharStruct *overall; +{ + XChar2b buf[bufsize]; + XChar2b *cp; + wchar *wstr1 = wstr + len; + XChar2b *cpend = buf + bufsize; + int c; + int gmask, gset; + FontEnt *fe; + int is2b; + int grmap; + int dir, as, ds; + XCharStruct oa; + + *ascent = *descent = 0; + (void)bzero(overall, sizeof(XCharStruct)); + + while (wstr < wstr1) { + gmask = *wstr & 0x8080; + + switch (gmask) { + case G0MASK: + gset = 0; + break; + case G1MASK: + gset = 1; + break; + case G2MASK: + gset = 2; + break; + case G3MASK: + gset = 3; + break; + } + + fe = &gcset->fe[gset]; + is2b = fe->flag & TWOB; + grmap = (fe->flag & GRMAPPING) ? 0x80 : 0; + cp = buf; + + if (fe->font == NULL) { + while (wstr < wstr1 && (*wstr & 0x8080) == gmask) + wstr++; + continue; + } + + while (wstr < wstr1 && ((c = *wstr) & 0x8080) == gmask) { + if (cp >= cpend - 1) { + /* flush */ + XTextExtents16(fe->font, buf, cp - buf, + &dir, &as, &ds, &oa); + cp = buf; + *ascent = MAX(*ascent, as); + *descent = MAX(*descent, ds); + overall->lbearing = MIN(overall->lbearing, + overall->width + oa.lbearing); + overall->rbearing = MAX(overall->rbearing, + overall->width + oa.rbearing); + overall->width += oa.width; + overall->ascent = MAX(overall->ascent, oa.ascent); + overall->descent = MAX(overall->descent, oa.descent); + } + if (is2b) + cp->byte1 = ((c >> 8) & 0x7f) | grmap; + else + cp->byte1 = 0; + cp->byte2 = (c & 0x7f) | grmap; + cp++; + wstr++; + } + + if (cp == buf) + continue; + + /* flush */ + XTextExtents16(fe->font, buf, cp - buf, &dir, &as, &ds, &oa); + *ascent = MAX(*ascent, as); + *descent = MAX(*descent, ds); + overall->lbearing = MIN(overall->lbearing, + overall->width + oa.lbearing); + overall->rbearing = MAX(overall->rbearing, + overall->width + oa.rbearing); + overall->width += oa.width; + overall->ascent = MAX(overall->ascent, oa.ascent); + overall->descent = MAX(overall->descent, oa.descent); + } +} + + +/* + * private functions + */ + +static int +wsdrawstring(d, w, gcset, x, y, wstr, len, image) +Display *d; +Drawable w; +XWSGC gcset; +int x; +int y; +wchar *wstr; +int len; +int image; +{ + XChar2b buf[bufsize]; + XChar2b *cp; + wchar *wstr1 = wstr + len; + XChar2b *cpend = buf + bufsize; + int c; + int sx = x; + int gmask, gset; + FontEnt *fe; + int is2b; + int grmap; + + while (wstr < wstr1) { + gmask = *wstr & 0x8080; + + switch (gmask) { + case G0MASK: + gset = 0; + break; + case G1MASK: + gset = 1; + break; + case G2MASK: + gset = 2; + break; + case G3MASK: + gset = 3; + break; + } + + fe = &gcset->fe[gset]; + is2b = fe->flag & TWOB; + grmap = (fe->flag & GRMAPPING) ? 0x80 : 0; + cp = buf; + + if (fe->gc == NULL) { + while (wstr < wstr1 && (*wstr & 0x8080) == gmask) + wstr++; + continue; + } + while (wstr < wstr1 && ((c = *wstr) & 0x8080) == gmask) { + if (cp >= cpend - 1) { + /* flush */ + x += flushstr(d, w, fe, x, y, buf, cp, image); + cp = buf; + } + if (is2b) + cp->byte1 = ((c >> 8) & 0x7f) | grmap; + else + cp->byte1 = 0; + cp->byte2 = (c & 0x7f) | grmap; + cp++; + wstr++; + } + /* flush */ + x += flushstr(d, w, fe, x, y, buf, cp, image); + cp = buf; + } + + return x - sx; +} + +static int +flushstr(d, w, fe, x, y, cp0, cp1, image) +Display *d; +Drawable w; +FontEnt *fe; +int x; +int y; +XChar2b *cp0; +XChar2b *cp1; +int image; +{ + if (cp0 >= cp1 || fe->gc == NULL) + return 0; + + if (image) + XDrawImageString16(d, w, fe->gc, x, y, cp0, cp1 - cp0); + else + XDrawString16(d, w, fe->gc, x, y, cp0, cp1 - cp0); + return XTextWidth16(fe->font, cp0, cp1 - cp0); +} diff -r 000000000000 -r 92745d501b9a patchlevel.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/patchlevel.h Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,3 @@ +#define KINPUT2_VERSION "version 3.1" +#define DATE "$Date: 2002/10/03 09:31:24 $" +#define PATCHLEVEL 0 diff -r 000000000000 -r 92745d501b9a sj3def/Imakefile --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/sj3def/Imakefile Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,41 @@ +#include "../Kinput2.conf" + +SJ3DEF_FILES = sjhk sjrc sjrk sjsb sjzh + +OBJS = jcode.o ../lib/Xsj3clib/code.o +SRCS = jcode.c + +DEPLIBS = $(DEPXLIB) +LOCAL_LIBRARIES = $(XLIB) + +#ifdef UseSj3 +INCLUDES = -I../include -I../lib/Xsj3clib -I$(SJ3SRC)/sj3lib -I$(SJ3SRC) + +#define SjdefTarget(file) @@\ +file: file.EUC @@\ + rm -f $@ @@\ + ./jcode file.EUC > file + +all:: jcode $(SJ3DEF_FILES) +install:: $(SJ3DEF_FILES) + +SjdefTarget(sjhk) +SjdefTarget(sjrc) +SjdefTarget(sjrk) +SjdefTarget(sjsb) +SjdefTarget(sjzh) +SingleProgramTarget(jcode,$(OBJS),$(XLIB),) +MakeDirectories(install,$(SJ3DEF_DIR)) +InstallMultipleFlags($(SJ3DEF_FILES),$(SJ3DEF_DIR),$(INSTDATFLAGS)) + +clean:: + $(RM) $(SJ3DEF_FILES) + +DependTarget() + +#else +all:: +clean:: +install:: +depend:: +#endif diff -r 000000000000 -r 92745d501b9a sj3def/jcode.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/sj3def/jcode.c Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,173 @@ +#ifndef lint +static char *rcsid = "$Id: jcode.c,v 2.3 1993/09/22 11:04:10 nao Exp $"; +#endif +/* + * Copyright 1991 Sony Corporation + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Sony not be used in advertising or + * publicity pertaining to distribution of the software without specific, + * written prior permission. Sony makes no representations about the + * suitability of this software for any purpose. It is provided "as is" + * without express or implied warranty. + * + * SONY DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL SONY + * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ +/* + * Author: Naoshi Suzuki, SONY Corporation. (nao@sm.sony.co.jp) + */ + +#include +#ifdef X_LOCALE +#include +#else /* X_LOCALE */ +#include +#endif /* X_LOCALE */ +#include "common.h" + +int code, kana; +enum { ASCII, KANJI, GAIJI } g0; + +main(argc, argv) + int argc; + char **argv; +{ + char *locale; + register FILE *in, *out; + unsigned char ibuf[BUFSIZ], obuf[BUFSIZ]; + +#ifdef X_LOCALE + if (locale = _Xsetlocale(LC_CTYPE, "")) +#else /* X_LOCALE */ + if (locale = setlocale(LC_CTYPE, "")) +#endif /* X_LOCALE */ + if (!strcmp(locale, "ja_JP.SJIS")||!strcmp(locale, "ja_JP.mscode")) + code = JP_SJIS; + else if (!strcmp(locale, "ja_JP.jis7")) code = JP_JIS7; + else if (!strcmp(locale, "ja_JP.jis8")) code = JP_JIS8; + else code = JP_EUC; + else code = JP_EUC; +#ifdef FORCE_SJIS + code = JP_SJIS; +#endif +#ifdef FORCE_JIS8 + code = JP_JIS8; +#endif +#ifdef FORCE_JIS7 + code = JP_JIS7; +#endif + if (argc < 2) { + in = stdin; + out = stdout; + } else { + if ((in = fopen (*(++argv), "r")) == NULL) { + perror (*argv); + exit (1); + } + out = stdout; + } + if (code == JP_EUC) + while (fgets((char *)ibuf, BUFSIZ, in) != NULL) + fputs((char *)ibuf, out); + else { + g0 = ASCII; + kana = OFF; + while (fgets((char *)ibuf, BUFSIZ, in) != NULL) { + conv(ibuf, obuf); + fputs((char *)obuf, out); + putc('\n', out); + } + } + exit(0); +} + +int +conv(p, q) + register unsigned char *p, *q; +{ + wchar c; + + while (*p != '\n' && *p != '\0') { + if (*p & 0x80) { + if (*p == SS2) { + p++; + if (code != JP_SJIS && g0 != ASCII) { + g0 = ASCII; + *q++ = ESC; *q++ = '('; *q++ = 'J'; + } + if (code == JP_JIS7) { + if (!kana) { + *q++ = SO; + kana++; + } + *q++ = *p++ & MASK; + } else { + *q++ = *p++; + } + } else if (*p == SS3) { + if (code == JP_JIS7 && kana) { + *q++ = SI; + kana = OFF; + } + if (code != JP_SJIS) { + if (g0 != GAIJI) { + g0 = GAIJI; + *q++ = ESC; *q++ = '$'; *q++ = '('; *q++ = 'D'; + } + *q++ = (*p++ & MASK); *q++ = (*p++ & MASK); + } else { + if (*p < 0x3b) { + c = (*p << 8) | *(p + 1); p += 2; + c = _Xsj3ceuc2sjis(c); + *q++ = (c >> 8) + 0x6f; *q++ = c & 0xff; + } else { + *q++ = 0xfc; *q++ = 0xfc; + } + } + } else { + if (code == JP_JIS7 && kana) { + *q++ = SI; + kana = OFF; + } + if (code != JP_SJIS) { + if (g0 != KANJI) { + g0 = KANJI; + *q++ = ESC; *q++ = '$'; *q++ = 'B'; + } + *q++ = (*p++ & MASK); *q++ = (*p++ & MASK); + } else { + c = (*p << 8) | *(p + 1); p += 2; + c = _Xsj3ceuc2sjis(c); + *q++ = c >> 8; *q++ = c & 0xff; + } + } + } else { + if (code == JP_JIS7 && kana) { + *q++ = SI; + kana = OFF; + } + if (code != JP_SJIS && g0 != ASCII) { + g0 = ASCII; + *q++ = ESC; *q++ = '('; *q++ = 'J'; + } + *q++ = *p++; + } + } + if (code == JP_JIS7 && kana) { + *q++ = SI; + kana = OFF; + } + if (code != JP_SJIS && g0 != ASCII) { + g0 = ASCII; + *q++ = ESC; *q++ = '('; *q++ = 'J'; + } + *q = '\0'; +} diff -r 000000000000 -r 92745d501b9a sj3def/sjhk.EUC --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/sj3def/sjhk.EUC Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,102 @@ +# +# $Id: sjhk.EUC,v 2.0 1992/02/13 21:00:23 nao Exp $ +# +# ひらがな/カタカナ変換規則定義ファイル +# +# (区切りは space か htab) +#[zhira] [zkata] [hkata] [ascii] +ぁ ァ ァ \# +あ ア ア 3 +ぃ ィ ィ E +い イ イ e +ぅ ゥ ゥ $ +う ウ ウ 4 +ぇ ェ ェ % +え エ エ 5 +ぉ ォ ォ ^ +お オ オ 6 +か カ カ t +が ガ ガ t[ +き キ キ g +ぎ ギ ギ g[ +く ク ク h +ぐ グ グ h[ +け ケ ケ ' +げ ゲ ゲ '[ +こ コ コ b +ご ゴ ゴ b[ +さ サ サ x +ざ ザ ザ x[ +し シ シ d +じ ジ ジ d[ +す ス ス r +ず ズ ズ r[ +せ セ セ p +ぜ ゼ ゼ p[ +そ ソ ソ c +ぞ ゾ ゾ c[ +た タ タ q +だ ダ ダ q[ +ち チ チ a +ぢ ヂ ヂ a[ +っ ッ ッ Z +つ ツ ツ z +づ ヅ ヅ z[ +て テ テ w +で デ デ w[ +と ト ト s +ど ド ド s[ +な ナ ナ u +に ニ ニ i +ぬ ヌ ヌ 1 +ね ネ ネ , +の ノ ノ k +は ハ ハ f +ば バ バ f[ +ぱ パ パ f] +ひ ヒ ヒ v +び ビ ビ v[ +ぴ ピ ピ v] +ふ フ フ 2 +ぶ ブ ブ 2[ +ぷ プ プ 2] +へ ヘ ヘ = +べ ベ ベ =[ +ぺ ペ ペ =] +ほ ホ ホ - +ぼ ボ ボ -[ +ぽ ポ ポ -] +ま マ マ j +み ミ ミ n +む ム ム ` +め メ メ / +も モ モ m +ゃ ャ ャ & +や ヤ ヤ 7 +ゅ ュ ュ * +ゆ ユ ユ 8 +ょ ョ ョ ( +よ ヨ ヨ 9 +ら ラ ラ o +り リ リ l +る ル ル \. +れ レ レ ; +ろ ロ ロ _ +わ ワ ワ 0 +ゎ ヮ ワ + +ゐ ヰ ィ E +ゑ ヱ エ % +を ヲ ヲ ) +ん ン ン y +ぶ ヴ ヴ $[ +か ヵ カ T +け ヶ ケ " +゛ ゛ ゙ [ +゜ ゜ ゚ ] +「 「 「 } +」 」 」 ~ +ー ー ー \\ +ろ ろ ロ | +、 、 、 < +。 。 。 > +・ ・ ・ ? diff -r 000000000000 -r 92745d501b9a sj3def/sjrc.EUC --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/sj3def/sjrc.EUC Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,333 @@ +# +# $Id: sjrc.EUC,v 2.5 1993/01/28 09:58:43 nao Exp $ +# +# CcWnn エミュレート用 sjrc +# +# 93/01/18 support for Kana Keyboard +# minmin@astec.co.jp +# +#command modemask keysym input same +.ki2key.jis n F5 +.ki2key.jis kana F5 +.ki2key.jis m 5 off +.ki2key.jis kana|m kana_E off +.ki2key.kuten n F6 +.ki2key.kuten kana F6 +.ki2key.kuten m 6 off +.ki2key.kuten kana|m kana_O off +.ki2key.convert c|F j +.ki2key.convert kana|c|F kana_MA off +.ki2key.convert c|F c +.ki2key.convert kana|c|F kana_SO off +#.ki2key.convert F period # for roma input +#.ki2key.convert s|F greater # for kana input +.ki2key.convert s|F Kanji +.ki2key.convert kana|s|F Kanji +.ki2key.convert F Kanji +.ki2key.convert kana|F Kanji +.ki2key.next c|C n +.ki2key.next kana|c|C kana_MI off +.ki2key.next C Down +.ki2key.next kana|C Down +.ki2key.up c|S p +.ki2key.up kana|c|S kana_SE off +.ki2key.down c|S n +.ki2key.down kana|c|S kana_MI off +.ki2key.prev c|C p +.ki2key.prev kana|c|C kana_SE off +.ki2key.prev C Up +.ki2key.prev kana|C Up +.ki2key.unconvert c|C g +.ki2key.unconvert kana|c|C kana_KI off +.ki2key.forward c|F|S f +.ki2key.forward kana|c|F|S kana_HA off +.ki2key.forward F|S Right +.ki2key.forward kana|F|S Right off +.ki2key.forward c|S j +.ki2key.forward kana|c|S kana_MA off +.ki2key.forward S Kanji +.ki2key.forward kana|S Kanji +.ki2key.forward c|S c +.ki2key.forward kana|c|S kana_SO off +.ki2key.backward c|F|S b +.ki2key.backward kana|c|F|S kana_KO off +.ki2key.backward F|S Left +.ki2key.backward kana|F|S Left off +.ki2key.top c|F|S a +.ki2key.top kana|c|F|S kana_CHI off +.ki2key.bottom c|F|S e +.ki2key.bottom kana|c|F|S kana_I off +.ki2key.expand s|F|S|D Right +.ki2key.expand kana|s|F|S|D Right off +.ki2key.shrink s|F|S|D Left +.ki2key.shrink kana|s|F|S|D Left off +.ki2key.backspace c|F|S|D h +.ki2key.backspace kana|c|F|S|D kana_KU off +.ki2key.backspace kana|F|S|D BackSpace +.ki2key.delete kana|F|S|D Delete +.ki2key.fix c|F|S|D l +.ki2key.fix kana|c|F|S|D kana_RI off +.ki2key.fix kana|F|S|D Execute +.ki2key.cancel c|F u +.ki2key.cancel kana|c|F kana_NA off +.ki2key.return c|F|S|D m +.ki2key.return kana|c|F|S|D kana_MO off +.ki2key.return kana|A Return +.ki2key.start s|A space off +.ki2key.start kana|s|A space off +.ki2key.start c|A Kanji +.ki2key.start kana|c|A Kanji +.ki2key.zkatakana F|S|D F1 +.ki2key.zkatakana kana|F|S|D F1 +.ki2key.zkatakana m|F|S|D 1 off +.ki2key.zkatakana kana|m|F|S|D kana_NU off +.ki2key.hiragana F|S|D F2 +.ki2key.hiragana kana|F|S|D F2 +.ki2key.hiragana m|F|S|D 2 off +.ki2key.hiragana kana|m|F|S|D kana_FU off +.ki2key.hankaku F|S|D F3 +.ki2key.hankaku kana|F|S|D F3 +.ki2key.hankaku m|F|S|D 3 off +.ki2key.hankaku kana|m|F|S|D kana_A off +.ki2key.zenkaku F|S|D F4 +.ki2key.zenkaku kana|F|S|D F4 +.ki2key.zenkaku m|F|S|D 4 off +.ki2key.zenkaku kana|m|F|S|D kana_U off +.ki2key.bell F Escape +.ki2key.bell kana|F Escape +.ki2key.kana c|s K +.ki2key.kana kana|c|s K off +.ki2key.ignore A Cancel +.ki2key.ignore s|A Cancel +.ki2key.ignore A Select +.ki2key.ignore m|C Select +.ki2key.ignore F KP_Enter +.ki2key.ignore n F7 +.ki2key.ignore n F8 +#.ki2key.ignore n F9 +#.ki2key.ignore n F10 +.ki2key.ignore s|N|F F12 +.ki2key.ignore s|N|F F13 +.ki2key.ignore s|N|F F14 +.ki2key.ignore s|N|F F15 +.ki2key.ignore s|F F16 +.ki2key.ignore s|F F17 +.ki2key.ignore s|F F18 +.ki2key.ignore s|F F19 +.ki2key.ignore s|F F20 +.ki2key.ignore c|F Tab +.ki2key.ignore s|c|F Tab +.ki2key.cancel kana|S|D Escape +# +# ss@astec.co.jp/1992.11.25 +# * 文節伸ばし/縮め、辞書登録/削除、記号を追加した。 +# * Tabキーでモード切替えだったのをF9にした +# +.ki2key.expand c|F|S|D o +.ki2key.expand kana|c|F|S|D kana_RA off +.ki2key.shrink c|F|S|D i +.ki2key.shrink kana|c|F|S|D kana_NI off +.ki2key.toroku c|F t +.ki2key.toroku kana|c|F kana_KA off +.ki2key.syoukyo c|F v +.ki2key.syoukyo kana|c|F kana_HI off +.ki2key.symbol c|F q +.ki2key.symbol kana|c|F kana_TA off +.ki2key.symbol n F10 +.ki2key.symbol kana F10 +.ki2key.modedown n F9 +.ki2key.modedown kana F9 +.ki2key.modeup n F8 +.ki2key.modeup kana F8 +.ki2key.ignore n Tab +.ki2key.ignore s Tab +# +# CcWnn の convert-or-space は +# .ki2key.convert F space +# fix-or-cr は +# .ki2key.fix F Return +# .ki2key.return N|S|D Return +# とかすればよい +# +# モード表示文字列 +# ss@astec.co.jp +# * .guide.zkatakanaのコメントを外した +# +.guide.hiragana ローマ +.guide.zkatakana 全カタカナ +#.guide.hkatakana 半カタカナ +.guide.zalpha ABC +.guide.halpha ABC +#.guide.sjis SJISコード +#.guide.euc EUCコード +.guide.jis JISコード +.guide.kuten 区点コード +#.guide.register 辞書登録 +#.guide.eliminate 辞書抹消 +#.guide.kanji 変換済 +#.guide.edit 編集中 +#.guide.candidate 候補選択 +#.guide.symbol 記号選択 +#.guide.hinsi 品詞選択 +#.guide.quote 直接入力 +# +# 入力文字種の変更順指定 +# ss@astec.co.jp +# * zkatakanaを追加した +# +.InitialMode unbuff.hiragana.zkatakana.direct.halpha.zalpha +# +# 入力コードの変更順指定 +#.DefaultCode jis.kuten +# +# 変換前の muhenkan で入力文字種がひらがなのときの変更文字種指定 +#.MuhenkanMode halpha +# +# 変換後の muhenkan での表示文字種のトグル指定 +#.MuhenkanToggle on +# +# 変換後の muhenkan で表示文字種が全角カタカナの時のトグル文字種指定 +#.MuhenkanInEdit hiragana +# +# ローマ字かな変換出来ないときベルを鳴らすか +#.rkerrbell on +# +# 入力文字種変更時の確定指定 +#.FlushAfterConversion off +# +# 文節長(文節間)学習機能を使用するか +#.bstudy on +# +# first sj3serv のホスト名指定 +#.sj3serv localhost +# +# アプリケーションに渡すコントロールコードの指定 +#.SetNormal  +# +# 指定されたコントロールコードと直後に入力された文字を渡す指定 +.ThroughNext  +# +# second sj3serv のホスト名指定 +#.sj3serv2 localhost +# +# ローマ字かな変換中のアルファベットを全角文字に変換するか +#.AlphabetConversion off +# +# 文字消去時に変換途中のローマ字(ローマ字入力のとき)や非濁音 +# (かな入力のとき)を表示するか +#.BackDisplay off +# +# 一括変換時の注目するセグメントの位置 +# ss@astec.co.jp +# * 変換後のカーソル位置をcanna風に先頭にした。 +#.BeginConversionLast none +.BeginConversionLast off +# +# 文節拡張時の拡張部分の表示文字種変換動作の指定 +#.ExpandModeConversion off.off +# +# 文節縮小時の縮小部分の表示文字種変換動作の指定 +#.ShrinkModeConversion off.off +# +# 文節拡張時の拡張部分のかな漢字変換動作の指定 +#.ExpandKanjiConversion off.on +# +# 文節縮小時の縮小部分のかな漢字変換動作の指定 +#.ShrinkKanjiConversion off.on +# +# 文節縮小時に1文字しかないときの前文節との合節動作の指定 +#.ShrinkAll off +# +# ConvedMode で文字入力のキーを押したときの動作の指定 +.FlushInConversion off +# +# 候補選択で文字入力のキーを押したときの動作の指定 +.FlushSelectConversion off +# +# 変換終了操作時の確定動作の指定 +#.FlushEndConversion on +# +# かな漢字変換を行う文節の指定 +.HenkanSegment after +# +# 無変換状態にする文節の指定 +#.MuhenkanSegment one +# +# 文字消去時に無変換状態にする文節の指定 +#.DeleteChangeSegment one +# +# 部分確定時に無変換状態にする文節の指定 +#.FlushChangeSegment off +# +# 文字種変更ファンクションが呼ばれたときの動作の指定 +.ModeConversion.hiragana on.on.on +.ModeConversion.zkatakana on.on.on +# +# カレント文節/カーソルの前後移動時の移動単位の指定 +#.MoveBySegment off.on +# +# カレント文節/カーソルが終端にあるときの前後移動時の逆端戻りの動作指定 +#.MoveLoop off +# +# カレント文節/カーソルの終端移動時の移動単位の指定 +.JumpBySegment on.on +# +# 文字/文節消去の消去単位指定 +.DeleteBySegment off.off +# +# 文末まで消去する場合の消去単位指定 +#.KillBySegment off.off +# +# 無変換状態に移行時のテキストカーソル位置の指定 +#.MuhenkanCursorLast off +# +# 編集開始時のテキストカーソル位置の指定 +#.EditCursorLast off +# +# 部分確定時に無変換状態にするときのテキストカーソル位置の指定 +#.FlushCursorLast off +# +# 変換済み文節のアンダーラインの指定 +.ConvertedUnderLine off +# +# 変換モード変更時のモード表示変更の指定 +#.DisplayModeChange off +# +# 最後の文節を消去したときのカレント文節移動の指定 +.DeleteLastMove off +# +# かなキーボードでないキーボードでかな入力をする機能の初期指定 +#.KanaInputOnly off +# +# 文字入力動作と同時にファンクションの機能を実行するかどうかの指定 +#.InputSameTime on +# +# コントロールコード入力とファンクションを同時実行するかどうかの指定 +#.ControlSameTime off +# +# 表示文字種の変更順の指定 +#.PrintMode hiragana.zkatakana.hankaku.zenkaku +# +# 候補選択の前に文字種をひらがなにして再度かな漢字変換するかの指定 +.BeforeSelectConversion off +# +# かな漢字変換の前に文字種をひらがなにして変換をするかの指定 +#.BeforeConversion off +# +# かな漢字変換の前に文字種を入力文字種に再変換するかの指定 +#.LastDoubleConversion off +# +# 候補選択の前にカレント文節を次候補に置き換える回数 +#.BeforeSelectCount 0 +# +# 候補選択で backspace の動作をしたときにカレント文節を消去する指定 +.SelectBackSpaceMove on +# +# 候補選択でひらがな/全角カタカナの候補を出す指定 +.CandidatePadding on +# +# sjrc ファンクション実行時に読み込まれるファイルの設定 +#.NextRCFile file_name +# +# include ファイルの設定 +#.Include file_name diff -r 000000000000 -r 92745d501b9a sj3def/sjrc.iroha.EUC --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/sj3def/sjrc.iroha.EUC Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,314 @@ +# +# $Id: sjrc.iroha.EUC,v 2.2 1993/01/06 11:04:24 nao Exp $ +# +# Canna version 1.2 エミュレート用 sjrc +#command modemask keysym input same + +# 日本語入力モードとの切り替え +.ki2key.start c|N o +.ki2key.start N Kanji +.ki2key.start s|N Kanji +.ki2key.start c|N Kanji +.ki2key.start s|c|N Kanji +.ki2key.start s|A space + +# 記号入力 +.ki2key.symbol N|I Insert + +# 単語登録 +.ki2key.register C Help +.ki2key.syoukyo s|C Help + +# 消去 +.ki2key.backspace I BackSpace +.ki2key.unconvert C BackSpace +.ki2key.cancel S|D BackSpace +.ki2key.bell C Delete + +.ki2key.backspace c|I h +.ki2key.unconvert c|C h +.ki2key.cancel c|S|D h + +.ki2key.delete c|I d +.ki2key.delafter c|I k +.ki2key.flushbefore c|C k + +# 変換 +.ki2key.convert F space off +.ki2key.forward S space off +.ki2key.convert F Kanji off +.ki2key.forward S Kanji off + +.ki2key.return N|S|D Return +.ki2key.fix F Return + +.ki2key.return c|N|S|D m +.ki2key.fix c|F m +.ki2key.return c|N|S|D j +.ki2key.fix c|F j + +# 矢印 +.ki2key.forward F|S Right +.ki2key.modedown s|I Right +.ki2key.expand s|C Right +.ki2key.backward F|S Left +.ki2key.modeup s|I Left +.ki2key.shrink s|C Left +.ki2key.nextmode I Down +.ki2key.next C Down +.ki2key.down S Down +.ki2key.prevmode I Up +.ki2key.prev C Up +.ki2key.up S Up + +.ki2key.forward c|F|S f +.ki2key.backward c|F|S b +.ki2key.nextmode c|I n +.ki2key.next c|C n +.ki2key.down c|S n +.ki2key.prevmode c|I p +.ki2key.prev c|C p +.ki2key.up c|S p + +# その他移動 +.ki2key.top c|F|S a +.ki2key.bottom c|F|S e + +# 文節 +.ki2key.modedown I Tab +.ki2key.modedown s|I Tab +.ki2key.shrink C Tab + +.ki2key.modedown c|I i +.ki2key.shrink c|C i +.ki2key.shrink m|c|I i off + +.ki2key.modeup c|I o +.ki2key.expand c|C o +.ki2key.expand m|c|I o off + +# 取りやめ +.ki2key.unconvert c|C g +.ki2key.cancel c|I|S|D g + +# その他 +.ki2key.quote c|I q +.ki2key.convert c|C w +#.ki2key.euc c|I y +.ki2key.edit c|C c + +# ベルを鳴らすもの +.ki2key.bell c|I|S|D c +.ki2key.bell c|C|S|D d +.ki2key.bell c|S i +.ki2key.bell c|S k +.ki2key.bell c|C|S|D l +.ki2key.bell c|S o +.ki2key.bell c|C|S|D q +.ki2key.bell c|A r +.ki2key.bell c|A s +.ki2key.bell c|A t +.ki2key.bell c|C|S|D u +.ki2key.bell c|A v +.ki2key.bell c|S|D w +.ki2key.bell c|A x +.ki2key.bell c|A y +.ki2key.bell c|A z + +# 機能を殺すもの +.ki2key.ignore A Cancel +.ki2key.ignore s|A Cancel +.ki2key.ignore A Select +.ki2key.ignore m|C Select + +.ki2key.ignore F KP_Enter +.ki2key.ignore n F7 +.ki2key.ignore n F8 +.ki2key.ignore n F9 +.ki2key.ignore n F10 +.ki2key.ignore s|N|F F12 +.ki2key.ignore s|N|F F13 +.ki2key.ignore s|N|F F14 +.ki2key.ignore s|N|F F15 +.ki2key.ignore s|F F16 +.ki2key.ignore s|F F17 +.ki2key.ignore s|F F18 +.ki2key.ignore s|F F19 +.ki2key.ignore s|F F20 +.ki2key.ignore c|F Tab +.ki2key.ignore s|c|F Tab +# +# +# モード表示文字列 +.guide.hiragana  [あ] +.guide.zkatakana  [ア] +.guide.hkatakana  [ア] +.guide.zalpha  [a] +.guide.halpha  [a] +#.guide.sjis  [SJIS] +.guide.euc  [EUC] +#.guide.jis  [JIS] +#.guide.kuten  [区点] +.guide.register  [登録] +.guide.eliminate  [削除] +.guide.kanji  [漢字] +.guide.edit  [編集] +.guide.candidate  [候補] +.guide.symbol  [記号] +.guide.hinsi  [品詞] +.guide.quote  [q] +# +# 入力文字種の変更順指定 +.InitialMode hiragana.zkatakana.hkatakana.zalpha.halpha +# +# 入力コードの変更順指定 +#.DefaultCode jis.kuten +# +# 変換前の muhenkan で入力文字種がひらがなのときの変更文字種指定 +#.MuhenkanMode halpha +# +# 変換後の muhenkan での表示文字種のトグル指定 +#.MuhenkanToggle on +# +# 変換後の muhenkan で表示文字種が全角カタカナの時のトグル文字種指定 +#.MuhenkanInEdit hiragana +# +# ローマ字かな変換出来ないときベルを鳴らすか +#.rkerrbell off +# +# 入力文字種変更時の確定指定 +#.FlushAfterConversion off +# +# 文節長(文節間)学習機能を使用するか +#.bstudy on +# +# first sj3serv のホスト名指定 +#.sj3serv localhost +# +# アプリケーションに渡すコントロールコードの指定 +#.SetNormal  +# +# 指定されたコントロールコードと直後に入力された文字を渡す指定 +#.ThroughNext  +# +# second sj3serv のホスト名指定 +#.sj3serv2 localhost +# +# ローマ字かな変換中のアルファベットを全角文字に変換するか +#.AlphabetConversion off +# +# 文字消去時に変換途中のローマ字(ローマ字入力のとき)や非濁音 +# (かな入力のとき)を表示するか +#.BackDisplay off +# +# 一括変換時の注目するセグメントの位置 +.BeginConversionLast off +# +# 文節拡張時の拡張部分の表示文字種変換動作の指定 +#.ExpandModeConversion on.off +# +# 文節縮小時の縮小部分の表示文字種変換動作の指定 +#.ShrinkModeConversion on.off +# +# 文節拡張時の拡張部分のかな漢字変換動作の指定 +#.ExpandKanjiConversion off.on +# +# 文節縮小時の縮小部分のかな漢字変換動作の指定 +#.ShrinkKanjiConversion off.on +# +# 文節縮小時に1文字しかないときの前文節との合節動作の指定 +#.ShrinkAll off +# +# ConvedMode で文字入力のキーを押したときの動作の指定 +#.FlushInConversion on +# +# 候補選択で文字入力のキーを押したときの動作の指定 +.FlushSelectConversion on +# +# 変換終了操作時の確定動作の指定 +.FlushEndConversion off +# +# かな漢字変換を行う文節の指定 +#.HenkanSegment all +# +# 無変換状態にする文節の指定 +.MuhenkanSegment all +# +# 文字消去時に無変換状態にする文節の動作の指定 +#.DeleteChangeSegment one +# +# 部分確定時に無変換状態にする文節のの指定 +.FlushChangeSegment all +# +# 文字種変更ファンクションが呼ばれたときの動作の指定 +#.ModeConversion.hiragana off.off.off +#.ModeConversion.zkatakana off.off.off +# +# カレント文節/カーソルの前後移動時の移動単位の指定 +#.MoveBySegment off.on +# +# カレント文節/カーソルが終端にあるときの前後移動時の逆端戻りの動作指定 +.MoveLoop on +# +# カレント文節/カーソルの終端移動時の移動単位の指定 +#.JumpBySegment off.on +# +# 文字/文節消去の消去単位指定 +.DeleteBySegment off.off +# +# 文末まで消去する場合の消去単位指定 +#.KillBySegment off.off +# +# 無変換状態に移行時のテキストカーソル位置の指定 +.MuhenkanCursorLast on +# +# 編集開始時のテキストカーソル位置の指定 +#.EditCursorLast off +# +# 部分確定時に無変換状態にするときのテキストカーソル位置の指定 +#.FlushCursorLast off +# +# 変換済み文節のアンダーラインの指定 +.ConvertedUnderLine off +# +# 変換モード変更時のモード表示変更の指定 +.DisplayModeChange on +# +# 最後の文節を消去したときのカレント文節移動の指定 +.DeleteLastMove off +# +# かなキーボードでないキーボードでかな入力をする機能の初期指定 +#.KanaInputOnly off +# +# 文字入力動作と同時にファンクションの機能を実行するかどうかの指定 +.InputSameTime off +# +# コントロールコード入力とファンクションを同時実行するかどうかの指定 +#.ControlSameTime off +# +# 表示文字種の変更順の指定 +.PrintMode hiragana.zkatakana.hkatakana.zalpha.halpha +# +# 候補選択の前に文字種をひらがなにして再度かな漢字変換するかの指定 +.BeforeSelectConversion off +# +# かな漢字変換の前に文字種をひらがなにして変換をするかの指定 +#.BeforeConversion off +# +# かな漢字変換の前に文字種を入力文字種に再変換するかの指定 +.LastDoubleConversion on +# +# 候補選択の前にカレント文節を次候補に置き換える回数 +.BeforeSelectCount 1 +# +# 候補選択で backspace の動作をしたときにカレント文節を消去する指定 +#.SelectBackSpaceMove off +# +# 候補選択でひらがな/全角カタカナの候補を出す指定 +.CandidatePadding on +# +# sjrc ファンクション実行時に読み込まれるファイルの設定 +#.NextRCFile file_name +# +# include ファイルの設定 +#.Include file_name diff -r 000000000000 -r 92745d501b9a sj3def/sjrc.sjx.EUC --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/sj3def/sjrc.sjx.EUC Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,237 @@ +# +# $Id: sjrc.sjx.EUC,v 2.2 1993/01/06 11:04:39 nao Exp $ +# +# sj3/sjx エミュレート用 sjrc +#command modemask keysym input same +.ki2key.edit I|C F3 +.ki2key.backspace I|D BackSpace +.ki2key.delete C BackSpace +.ki2key.select S Execute +.ki2key.start N Execute +.ki2key.down S Select +.ki2key.up S Cancel +.ki2key.halpha N|F F6 +.ki2key.zalpha N|F F7 +.ki2key.hkatakana N|F F8 +.ki2key.zkatakana N|F F9 +.ki2key.hiragana N|F F10 +.ki2key.bell D F1 +.ki2key.symbol N|F F4 +.ki2key.cancel S F1 +.ki2key.cancel S F2 +.ki2key.cancel S F3 +.ki2key.cancel S F4 +.ki2key.cancel S F5 +.ki2key.cancel S F6 +.ki2key.cancel S F7 +.ki2key.cancel S F8 +.ki2key.cancel S F9 +.ki2key.cancel S F10 +.ki2key.bell D F1 +.ki2key.bell D F2 +.ki2key.bell D F3 +.ki2key.bell D F4 +.ki2key.bell D F5 +.ki2key.bell D F6 +.ki2key.bell D F7 +.ki2key.bell D F8 +.ki2key.bell D F9 +.ki2key.bell D F10 +.ki2key.ignore s|C Cancel +.ki2key.ignore m|C Select +.ki2key.ignore c|F u +.ki2key.ignore c|F l +.ki2key.ignore s|N|F F12 +.ki2key.ignore s|N|F F13 +.ki2key.ignore s|N|F F14 +.ki2key.ignore s|N|F F15 +.ki2key.ignore s|F F16 +.ki2key.ignore s|F F17 +.ki2key.ignore s|F F18 +.ki2key.ignore s|F F19 +.ki2key.ignore s|F F20 +.ki2key.ignore A Tab +.ki2key.ignore s|A Tab +.ki2key.ignore c|F Tab +.ki2key.ignore s|c|F Tab +.ki2key.ignore c|F|D a +.ki2key.ignore c|F|D e +.ki2key.ignore c|O Up +.ki2key.ignore c|O Down +# +# モード表示文字列 +.guide.hiragana 全ひらがな +.guide.zkatakana 全カタカナ +.guide.hkatakana 半カタカナ +.guide.zalpha 全アルファ +.guide.halpha 半アルファ +#.guide.sjis Shift-JIS +#.guide.euc EUC +#.guide.jis JIS +#.guide.kuten 区点 +#.guide.register 登録 +#.guide.eliminate 消去 +#.guide.kanji 変換済 +#.guide.edit 編集 +#.guide.candidate 候補 +#.guide.symbol 記号 +#.guide.hinsi 品詞 +#.guide.quote 直接 +# +# 入力文字種の変更順指定 +.InitialMode unbuff.hiragana.direct +# +# 入力コードの変更順指定 +#.DefaultCode sjis.euc.jis.kuten +# +# 変換前の muhenkan で入力文字種がひらがなのときの変更文字種指定 +#.MuhenkanMode halpha +# +# 変換後の muhenkan での表示文字種のトグル指定 +#.MuhenkanToggle on +# +# 変換後の muhenkan で表示文字種が全角カタカナの時のトグル文字種指定 +.MuhenkanInEdit halpha +# +# ローマ字かな変換出来ないときベルを鳴らすか +#.rkerrbell on +# +# 入力文字種変更時の確定指定 +#.FlushAfterConversion off +# +# 文節長(文節間)学習機能を使用するか +#.bstudy on +# +# first sj3serv のホスト名指定 +#.sj3serv localhost +# +# アプリケーションに渡すコントロールコードの指定 +#.SetNormal  +# +# 指定されたコントロールコードと直後に入力された文字を渡す指定 +#.ThroughNext  +# +# second sj3serv のホスト名指定 +#.sj3serv2 localhost +# +# ローマ字かな変換中のアルファベットを全角文字に変換するか +.AlphabetConversion on +# +# 文字消去時に変換途中のローマ字(ローマ字入力のとき)や非濁音 +# (かな入力のとき)を表示するか +.BackDisplay on +# +# 一括変換時の注目するセグメントの位置 +#.BeginConversionLast on +# +# 文節拡張時の拡張部分の表示文字種変換動作の指定 +.ExpandModeConversion off.on +# +# 文節縮小時の縮小部分の表示文字種変換動作の指定 +.ShrinkModeConversion off.on +# +# 文節拡張時の拡張部分のかな漢字変換動作の指定 +#.ExpandKanjiConversion off.on +# +# 文節縮小時の縮小部分のかな漢字変換動作の指定 +#.ShrinkKanjiConversion off.on +# +# 文節縮小時に1文字しかないときの前文節との合節動作の指定 +#.ShrinkAll off +# +# ConvedMode で文字入力のキーを押したときの動作の指定 +#.FlushInConversion on +# +# 候補選択で文字入力のキーを押したときの動作の指定 +#.FlushSelectConversion none +# +# 変換終了操作時の確定動作の指定 +#.FlushEndConversion on +# +# かな漢字変換を行う文節の指定 +.HenkanSegment one +# +# 無変換状態にする文節の指定 +#.MuhenkanSegment one +# +# 文字消去時に無変換状態にする文節の指定 +#.DeleteChangeSegment one +# +# 部分確定時に無変換状態にする文節の指定 +#.FlushChangeSegment off +# +# 文字種変更ファンクションが呼ばれたときの動作の指定 +#.ModeConversion.hiragana off.on.off +#.ModeConversion.zkatakana off.on.off +#.ModeConversion.hkatakana off.on.off +#.ModeConversion.halpha off.on.off +#.ModeConversion.zalpha off.on.off +# +# カレント文節/カーソルの前後移動時の移動単位の指定 +.MoveBySegment on.on +# +# カレント文節/カーソルが終端にあるときの前後移動時の逆端戻りの動作指定 +#.MoveLoop off +# +# カレント文節/カーソルの終端移動時の移動単位の指定 +#.JumpBySegment on.on +# +# 文字/文節消去の消去単位指定 +.DeleteBySegment on.on +# +# 文末まで消去する場合の消去単位指定 +#.KillBySegment off.off +# +# 無変換状態に移行時のテキストカーソル位置の指定 +#.MuhenkanCursorLast off +# +# 編集開始時のテキストカーソル位置の指定 +#.EditCursorLast off +# +# 部分確定時に無変換状態にするときのテキストカーソル位置の指定 +#.FlushCursorLast off +# +# 変換済み文節のアンダーラインの指定 +#.ConvertedUnderLine on +# +# 変換モード変更時のモード表示変更の指定 +#.DisplayModeChange off +# +# 最後の文節を消去したときのカレント文節移動の指定 +#.DeleteLastMove on +# +# かなキーボードでないキーボードでかな入力をする機能の初期指定 +#.KanaInputOnly off +# +# 文字入力動作と同時にファンクションの機能を実行するかどうかの指定 +#.InputSameTime on +# +# コントロールコード入力とファンクションを同時実行するかどうかの指定 +#.ControlSameTime off +# +# 表示文字種の変更順の指定 +#.PrintMode hiragana.zkatakana.hankaku.zenkaku +# +# 候補選択の前にひらがなにして再度かな漢字変換するかの指定 +#.BeforeSelectConversion on +# +# かな漢字変換の前に文字種をひらがなにして変換をするかの指定 +#.BeforeConversion off +# +# かな漢字変換の前に文字種を入力文字種に再変換するかの指定 +#.LastDoubleConversion off +# +# 候補選択の前にカレント文節を次候補に置き換える回数 +#.BeforeSelectCount 0 +# +# 候補選択で backspace の動作をしたときにカレント文節を消去する指定 +#.SelectBackSpaceMove off +# +# 候補選択でひらがな/全角カタカナの候補を出す指定 +#.CandidatePadding off +# +# sjrc ファンクション実行時に読み込まれるファイルの設定 +#.NextRCFile file_name +# +# include ファイルの設定 +#.Include file_name diff -r 000000000000 -r 92745d501b9a sj3def/sjrk.EUC --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/sj3def/sjrk.EUC Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,673 @@ +# +# $Id: sjrk.EUC,v 2.1 1992/12/18 03:54:02 nao Exp $ +# +# ローマ字かな変換規則定義ファイル(CcWnn エミュレート用) +# +# (区切りは space か htab) +#[in_romaji] [out_kana] [out_romaji] +a あ +i い +u う +e え +o お + +ka か +ki き +ku く +ke け +ko こ +ca か +ci き +cu く +ce せ +co こ +kya きゃ +kyi き +kyu きゅ +kye きぇ +kyo きょ +qya くゃ +qyi くぃ +qyu くゅ +qye くぇ +qyo くょ +qwa くゎ +qwi くぃ +qwu くぅ +qwe くぇ +qwo くぉ +kwa くぁ +kwi くぃ +kwu くぅ +kwe くぇ +kwo くぉ + +sa さ +si し +su す +se せ +so そ +sya しゃ +syi しぃ +syu しゅ +sye しぇ +syo しょ +sha しゃ +shi し +shu しゅ +she しぇ +sho しょ +swi すぃ +swe すぇ + +ta た +ti ち +tu つ +te て +to と +tha てゃ +thi てぃ +thu てゅ +the てぇ +tho てょ +tya ちゃ +tyi ちぃ +tyu ちゅ +tye ちぇ +tyo ちょ +tsya ちゃ +tsyi ち +tsyu ちゅ +tsye ちぇ +tsyo ちょ +cha ちゃ +chi ち +chu ちゅ +che ちぇ +cho ちょ +cya ちゃ +cyi ちぃ +cyu ちゅ +cye ちぇ +cyo ちょ +tsa つぁ +tsi つぃ +tsu つ +tse つぇ +tso つぉ +twa とゎ +twi とぃ +twu とぅ +twe とぇ +two とぉ + +na な +ni に +nu ぬ +ne ね +no の +nya にゃ +nyi にぃ +nyu にゅ +nye にぇ +nyo にょ + +ha は +hi ひ +hu ふ +he へ +ho ほ +hya ひゃ +hyi ひぃ +hyu ひゅ +hye ひぇ +hyo ひょ +hwa ふゎ +hwi ふぃ +hwe ふぇ +hwo ふぉ +fa ふぁ +fi ふぃ +fu ふ +fe ふぇ +fo ふぉ +fya ふゃ +fyi ふぃ +fyu ふゅ +fye ふぇ +fyo ふょ +fwa ふゎ +fwi ふぃ +fwu ふぅ +fwe ふぇ +fwo ふぉ + +ma ま +mi み +mu む +me め +mo も +mya みゃ +myi みぃ +myu みゅ +mye みぇ +myo みょ + +ya や +yi い +yu ゆ +ye いぇ +yo よ +ra ら +ri り +ru る +re れ +ro ろ +la ら +li り +lu る +le れ +lo ろ +rya りゃ +ryi りぃ +ryu りゅ +rye りぇ +ryo りょ +lya りゃ +lyi りぃ +lyu りゅ +lye りぇ +lyo りょ + +wa わ +wi ゐ +wu う +we ゑ +wo を + +ga が +gi ぎ +gu ぐ +ge げ +go ご +gya ぎゃ +gyi ぎぃ +gyu ぎゅ +gye ぎぇ +gyo ぎょ +gwa ぐぁ +gwi ぐぃ +gwu ぐぅ +gwe ぐぇ +gwo ぐぉ + +za ざ +zi じ +zu ず +ze ぜ +zo ぞ +zya じゃ +zyi じぃ +zyu じゅ +zye じぇ +zyo じょ +ja じゃ +ji じ +ju じゅ +je じぇ +jo じょ +jya じゃ +jyi じぃ +jyu じゅ +jye じぇ +jyo じょ + +da だ +di ぢ +du づ +dsu づ +de で +do ど +dya ぢゃ +dyi ぢぃ +dyu ぢゅ +dye ぢぇ +dyo ぢょ +dwa どゎ +dwi どぃ +dwu どぅ +dwe どぇ +dwo どぉ +dha でゃ +dhi でぃ +dhu でゅ +dhe でぇ +dho でょ + +ba ば +bi び +bu ぶ +be べ +bo ぼ +bya びゃ +byi びぃ +byu びゅ +bye びぇ +byo びょ +va ヴァ +vi ヴィ +vu ヴ +ve ヴェ +vo ヴォ +vya ヴヮ +vyi ヴィ +vyu ヴゥ +vye ヴェ +vyo ヴョ + +wha うゎ +whi うぃ +whu うぅ +whe うぇ +who うぉ + +pa ぱ +pi ぴ +pu ぷ +pe ぺ +po ぽ +pya ぴゃ +pyi ぴぃ +pyu ぴゅ +pye ぴぇ +pyo ぴょ + +qa くぁ +qi くぃ +qu く +qe くぇ +qo くぉ + +nn ん +n' ん +n ん + +kk っ k +ss っ s +tt っ t +hh っ h +mm っ m +yy っ y +rr っ r +ll っ l +ww っ w +gg っ g +zz っ z +dd っ d +bb っ b +pp っ p +cc っ c +ff っ f +jj っ j +vv っ v +qq っ q +xx っ x + +xa ぁ +xi ぃ +xu ぅ +xe ぇ +xo ぉ +xya ゃ +xyi ぃ +xyu ゅ +xye ぇ +xyo ょ +xtu っ +xtsu っ +xwa ゎ +xwi ゐ +xwe ゑ +xwo を +xka ヵ +xca ヵ +xke ヶ + + +x- - +- ー +_ ー +x_ _ +, 、 +x, , +. 。 +x. . +x[ 「 +x] 」 +x/ ・ + +A ア +I イ +U ウ +E エ +O オ + +KA カ +KI キ +KU ク +KE ケ +KO コ +CA カ +CI キ +CU ク +CE セ +CO コ +KYA キャ +KYI キィ +KYU キュ +KYE キェ +KYO キョ +QYA クャ +QYI クィ +QYU クュ +QYE クェ +QYO クョ +QWA クヮ +QWI クィ +QWU クゥ +QWE クェ +QWO クォ +KWA クァ +KWI クィ +KWU クゥ +KWE クェ +KWO クォ + +SA サ +SI シ +SU ス +SE セ +SO ソ +SYA シャ +SYI シィ +SYU シュ +SYE シェ +SYO ショ +SHA シャ +SHI シ +SHU シュ +SHE シェ +SHO ショ +SWI スィ +SWW スェ + +TA タ +TI チ +TU ツ +TE テ +TO ト +THA テャ +THI ティ +THU テュ +THE テェ +THO テョ +TYA チャ +TYI チィ +TYU チュ +TYE チェ +TYO チョ +TSYA チャ +TSYI チ +TSYU チュ +TSYE チェ +TSYO チョ +CHA チャ +CHI チ +CHU チュ +CHE チェ +CHO チョ +CYA チャ +CYI チィ +CYU チュ +CYE チェ +CYO チョ +TSA ツァ +TSI ツィ +TSU ツ +TSE ツェ +TSO ツォ +TWA トヮ +TWI トィ +TWU トゥ +TWE トェ +TWO トォ + +NA ナ +NI ニ +NU ヌ +NE ネ +NO ノ +NYA ニャ +NYI ニィ +NYU ニュ +NYE ニェ +NYO ニョ + +HA ハ +HI ヒ +HU フ +HE ヘ +HO ホ +HYA ヒャ +HYI ヒィ +HYU ヒュ +HYE ヒェ +HYO ヒョ +HWA フヮ +HWI フィ +HWE フェ +HWO フォ +FA ファ +FI フィ +FU フ +FE フェ +FO フォ +FYA フャ +FYI フィ +FYU フュ +FYE フェ +FYO フョ +FWA フヮ +FWI フィ +FWU フゥ +FWE フェ +FWO フォ + +MA マ +MI ミ +MU ム +ME メ +MO モ +MYA ミャ +MYI ミィ +MYU ミュ +MYE ミェ +MYO ミョ + +YA ヤ +YI イ +YU ユ +YE イェ +YO ヨ +RA ラ +RI リ +RU ル +RE レ +RO ロ +LA ラ +LI リ +LU ル +LE レ +LO ロ +RYA リャ +RYI リィ +RYU リュ +RYE リェ +RYO リョ +LYA リャ +LYI リィ +LYU リュ +LYE リェ +LYO リョ + +WA ワ +WI ヰ +WU ウ +WE ヱ +WO ヲ + +GA ガ +GI ギ +GU グ +GE ゲ +GO ゴ +GYA ギャ +GYI ギィ +GYU ギュ +GYE ギェ +GYO ギョ +GWA グァ +GWI グィ +GWU グゥ +GWE グェ +GWO グォ + +ZA ザ +ZI ジ +ZU ズ +ZE ゼ +ZO ゾ +ZYA ジャ +ZYI ジィ +ZYU ジュ +ZYE ジェ +ZYO ジョ +JA ジャ +JI ジ +JU ジュ +JE ジェ +JO ジョ +JYA ジャ +JYI ジィ +JYU ジュ +JYE ジェ +JYO ジョ + +DA ダ +DI ヂ +DU ヅ +DSU ヅ +DE デ +DO ド +DYA ヂャ +DYI ヂィ +DYU ヂュ +DYE ヂェ +DYO ヂョ +DWA ドヮ +DWI ドィ +DWU ドゥ +DWE ドェ +DWO ドォ +DHA デャ +DHI ディ +DHU デュ +DHO デョ + +BA バ +BI ビ +BU ブ +BE ベ +BO ボ +BYA ビャ +BYI ビィ +BYU ビュ +BYE ビェ +BYO ビョ +VA ヴァ +VI ヴィ +VU ヴ +VE ヴェ +VO ヴォ +VYA ヴヮ +VYI ヴィ +VYU ヴゥ +VYE ヴェ +VYO ヴョ + +WHA ウヮ +WHI ウィ +WHU ウゥ +WHE ウェ +WHO ウォ + +PA パ +PI ピ +PU プ +PE ペ +PO ポ +PYA ピャ +PYI ピィ +PYU ピュ +PYE ピェ +PYO ピョ + +QA クァ +QI クィ +QU ク +QE クェ +QO クォ + +N ン +NN ン + +KK ッ K +SS ッ S +TT ッ T +HH ッ H +MM ッ M +YY ッ Y +RR ッ R +LL ッ L +WW ッ W +GG ッ G +ZZ ッ Z +DD ッ D +BB ッ B +PP ッ P +CC ッ C +FF ッ F +JJ ッ J +VV ッ V +QQ ッ Q +XX ッ X + +XA ァ +XI ィ +XU ゥ +XE ェ +XO ォ +XYA ャ +XYI ィ +XYU ュ +XYE ェ +XYO ョ +XTU ッ +XTSU ッ +XWA ヮ +XWI ヰ +XWE ヱ +XWO ヲ +XKA ヵ +XCA ヵ +XKE ヶ diff -r 000000000000 -r 92745d501b9a sj3def/sjrk.iroha.EUC --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/sj3def/sjrk.iroha.EUC Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,348 @@ +# +# $Id: sjrk.iroha.EUC,v 2.0 1992/02/13 21:00:37 nao Exp $ +# +# ローマ字かな変換規則定義ファイル(Iroha エミュレート用) +# +# (区切りは space か htab) +#[in_romaji] [out_kana] [out_romaji] +0 0 +1 1 +2 2 +3 3 +4 4 +5 5 +6 6 +7 7 +8 8 +9 9 + +a あ +i い +u う +e え +o お + +ka か +ki き +ku く +ke け +ko こ +ca か +cu く +co こ +kya きゃ +kyi きぃ +kyu きゅ +kye きぇ +kyo きょ +qwa くゎ +qwi くぃ +qwu くぅ +qwe くぇ +qwo くぉ + +sa さ +si し +su す +se せ +so そ +sya しゃ +syi しぃ +syu しゅ +sye しぇ +syo しょ +sha しゃ +shi し +shu しゅ +she しぇ +sho しょ + +ta た +ti ち +tu つ +te て +to と +tha てゃ +thi てぃ +thu てゅ +the てぇ +tho てょ +tya ちゃ +tyi ちぃ +tyu ちゅ +tye ちぇ +tyo ちょ +tsya ちゃ +tsyi ち +tsyu ちゅ +tsye ちぇ +tsyo ちょ +cha ちゃ +chi ち +chu ちゅ +che ちぇ +cho ちょ +cya ちゃ +cyi ちぃ +cyu ちゅ +cye ちぇ +cyo ちょ +tsa つぁ +tsi つぃ +tsu つ +tse つぇ +tso つぉ + +na な +ni に +nu ぬ +ne ね +no の +nya にゃ +nyi にぃ +nyu にゅ +nye にぇ +nyo にょ + +ha は +hi ひ +hu ふ +he へ +ho ほ +hya ひゃ +hyi ひぃ +hyu ひゅ +hye ひぇ +hyo ひょ +fa ふぁ +fi ふぃ +fu ふ +fe ふぇ +fo ふぉ +fya ふゃ +fyi ふぃ +fyu ふゅ +fye ふぇ +fyo ふょ +fwa ふゎ +fwi ふぃ +fwu ふぅ +fwe ふぇ +fwo ふぉ + +ma ま +mi み +mu む +me め +mo も +mya みゃ +myi みぃ +myu みゅ +mye みぇ +myo みょ + +ya や +yi い +yu ゆ +ye いぇ +yo よ +ra ら +ri り +ru る +re れ +ro ろ +la ら +li り +lu る +le れ +lo ろ +rya りゃ +ryi りぃ +ryu りゅ +rye りぇ +ryo りょ +lya りゃ +lyi りぃ +lyu りゅ +lye りぇ +lyo りょ + +wa わ +wi ゐ +wu う +we ゑ +wo を + +ga が +gi ぎ +gu ぐ +ge げ +go ご +gya ぎゃ +gyi ぎぃ +gyu ぎゅ +gye ぎぇ +gyo ぎょ +gwa ぐぁ +gwi ぐぃ +gwu ぐぅ +gwe ぐぇ +gwo ぐぉ + +za ざ +zi じ +zu ず +ze ぜ +zo ぞ +zya じゃ +zyi じぃ +zyu じゅ +zye じぇ +zyo じょ +ja じゃ +ji じ +ju じゅ +je じぇ +jo じょ +jya じゃ +jyi じぃ +jyu じゅ +jye じぇ +jyo じょ + +da だ +di ぢ +du づ +de で +do ど +dya ぢゃ +dyi ぢぃ +dyu ぢゅ +dye ぢぇ +dyo ぢょ +dha でゃ +dhi でぃ +dhu でゅ +dhe でぇ +dho でょ + +ba ば +bi び +bu ぶ +be べ +bo ぼ +bya びゃ +byi びぃ +byu びゅ +bye びぇ +byo びょ +va う゛ぁ +vi う゛ぃ +vu う゛ +ve う゛ぇ +vo う゛ぉ + +pa ぱ +pi ぴ +pu ぷ +pe ぺ +po ぽ +pya ぴゃ +pyi ぴぃ +pyu ぴゅ +pye ぴぇ +pyo ぴょ + +qa くぁ +qi くぃ +qu く +qe くぇ +qo くぉ + +nn ん n +n ん +n' ん +mn ん + +kk っ k +ss っ s +tt っ t +hh っ h +mm っ m +yy っ y +rr っ r +ll っ l +ww っ w +gg っ g +zz っ z +dd っ d +bb っ b +pp っ p +cc っ c +ff っ f +jj っ j +vv っ v +qq っ q +xx っ x + +xa ぁ +xi ぃ +xu ぅ +xe ぇ +xo ぉ +xtu っ +xtsu っ +xwa ゎ +xya ゃ +xyu ゅ +xyo ょ + +@- − +- ー +, 、 +. 。 +[ 「 +] 」 +( ( +) ) +{ 『 +} 』 +^ ^ +< < +> > +@@   +@/ ・ +@\\ \ +@ @ +@, , +@. . +@~ 〜 +@|| ‖ +@| | +@3 … +@2 ‥ +@( ( +@) ) +@[ [ +@] ] +@{ { +@} } +~  ̄ +? ? +! ! +\# # +$ $ +" ” +% % +& & +' ’ +` ` ++ + +* * += = +| | +; ; +: : +_ _ +/ / +\\ ¥ diff -r 000000000000 -r 92745d501b9a sj3def/sjrk.sjx.EUC --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/sj3def/sjrk.sjx.EUC Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,582 @@ +# +# $Id: sjrk.sjx.EUC,v 2.0 1992/02/13 21:00:39 nao Exp $ +# +# ローマ字かな変換規則定義ファイル(sjx エミュレート用) +# +# (区切りは space か htab) +#[in_romaji] [out_kana] [out_romaji] +a あ +i い +u う +e え +o お + +ka か +ki き +ku く +ke け +ko こ +ca か +ci き +cu く +ce け +co こ +kya きゃ +kyi き +kyu きゅ +kye きぇ +kyo きょ +qya きゃ +qyi き +qyu きゅ +qye きぇ +qyo きょ + +sa さ +si し +su す +se せ +so そ +sya しゃ +syi し +syu しゅ +sye しぇ +syo しょ +sha しゃ +shi し +shu しゅ +she しぇ +sho しょ + +ta た +ti ち +tu つ +te て +to と +tsa た +tsi ち +tsu つ +tse て +tso と +tha たぁ +thi てぃ +thu とぅ +tya ちゃ +tyi ち +tyu ちゅ +tye ちぇ +tyo ちょ +tsya ちゃ +tsyi ち +tsyu ちゅ +tsye ちぇ +tsyo ちょ +cha ちゃ +chi ち +chu ちゅ +che ちぇ +cho ちょ +cya ちゃ +cyi ち +cyu ちゅ +cye ちぇ +cyo ちょ + +na な +ni に +nu ぬ +ne ね +no の +nya にゃ +nyi に +nyu にゅ +nye にぇ +nyo にょ + +ha は +hi ひ +hu ふ +he へ +ho ほ +hya ひゃ +hyi ひ +hyu ひゅ +hye ひぇ +hyo ひょ +fa ふぁ +fi ふぃ +fu ふ +fe ふぇ +fo ふぉ +fya ふゃ +fyi ふぃ +fyu ふゅ +fye ふぇ +fyo ふょ + +ma ま +mi み +mu む +me め +mo も +mya みゃ +myi み +myu みゅ +mye みぇ +myo みょ + +ya や +yi い +yu ゆ +ye いぇ +yo よ +ra ら +ri り +ru る +re れ +ro ろ +la ら +li り +lu る +le れ +lo ろ +rya りゃ +ryi り +ryu りゅ +rye りぇ +ryo りょ +lya りゃ +lyi り +lyu りゅ +lye りぇ +lyo りょ + +wa わ +wi うぃ +wu う +we うぇ +wo を + +ga が +gi ぎ +gu ぐ +ge げ +go ご +gya ぎゃ +gyi ぎ +gyu ぎゅ +gye ぎぇ +gyo ぎょ + +za ざ +zi じ +zu ず +ze ぜ +zo ぞ +zya じゃ +zyi じ +zyu じゅ +zye じぇ +zyo じょ +ja じゃ +ji じ +ju じゅ +je じぇ +jo じょ +jya じゃ +jyi じ +jyu じゅ +jye じぇ +jyo じょ + +da だ +di ぢ +du づ +de で +do ど +dya ぢゃ +dyi ぢ +dyu ぢゅ +dye ぢぇ +dyo ぢょ +dha だぁ +dhi でぃ +dhu どぅ +dhyu でゅ + +ba ば +bi び +bu ぶ +be べ +bo ぼ +bya びゃ +byi び +byu びゅ +bye びぇ +byo びょ +va ヴぁ +vi ヴぃ +vu ヴ +ve ヴぇ +vo ヴぉ +vya びゃ +vyi び +vyu びゅ +vye びぇ +vyo びょ + +pa ぱ +pi ぴ +pu ぷ +pe ぺ +po ぽ +pya ぴゃ +pyi ぴ +pyu ぴゅ +pye ぴぇ +pyo ぴょ + +qa くぁ +qi くぃ +qu くぅ +qe くぇ +qo くぉ + +nn ん +n ん +#mb ん b +#mm ん m +#mp ん p + +kk っ k +ss っ s +tt っ t +hh っ h +mm っ m +yy っ y +rr っ r +ll っ l +ww っ w +gg っ g +zz っ z +dd っ d +bb っ b +pp っ p +cc っ c +ff っ f +jj っ j +vv っ v +qq っ q +xx っ x +#tch っ ch + +xa ぁ +xi ぃ +xu ぅ +xe ぇ +xo ぉ +xya ゃ +xyi ぃ +xyu ゅ +xye ぇ +xyo ょ +xtu っ +xtsu っ +xwa ゎ +xka ヵ +xke ヶ + +x, ゛ +x. ゜ +~ 〜 + +- ー +, 、 +. 。 +#@ ・ +#x@ @ +#[ 「 +#] 」 +#Z. … +#SONY ソニー + +A あ +I い +U う +E え +O お + +KA か +KI き +KU く +KE け +KO こ +CA か +CI き +CU く +CE け +CO こ +KYA きゃ +KYI き +KYU きゅ +KYE きぇ +KYO きょ +QYA きゃ +QYI き +QYU きゅ +QYE きぇ +QYO きょ + +SA さ +SI し +SU す +SE せ +SO そ +SYA しゃ +SYI し +SYU しゅ +SYE しぇ +SYO しょ +SHA しゃ +SHI し +SHU しゅ +SHE しぇ +SHO しょ + +TA た +TI ち +TU つ +TE て +TO と +TSA た +TSI ち +TSU つ +TSE て +TSO と +THA たぁ +THI てぃ +THU とぅ +TYA ちゃ +TYI ち +TYU ちゅ +TYE ちぇ +TYO ちょ +TSYA ちゃ +TSYI ち +TSYU ちゅ +TSYE ちぇ +TSYO ちょ +CHA ちゃ +CHI ち +CHU ちゅ +CHE ちぇ +CHO ちょ +CYA ちゃ +CYI ち +CYU ちゅ +CYE ちぇ +CYO ちょ + +NA な +NI に +NU ぬ +NE ね +NO の +NYA にゃ +NYI に +NYU にゅ +NYE にぇ +NYO にょ + +HA は +HI ひ +HU ふ +HE へ +HO ほ +HYA ひゃ +HYI ひ +HYU ひゅ +HYE ひぇ +HYO ひょ +FA ふぁ +FI ふぃ +FU ふ +FE ふぇ +FO ふぉ +FYA ふゃ +FYI ふぃ +FYU ふゅ +FYE ふぇ +FYO ふょ + +MA ま +MI み +MU む +ME め +MO も +MYA みゃ +MYI み +MYU みゅ +MYE みぇ +MYO みょ + +YA や +YI い +YU ゆ +YE いぇ +YO よ +RA ら +RI り +RU る +RE れ +RO ろ +LA ら +LI り +LU る +LE れ +LO ろ +RYA りゃ +RYI り +RYU りゅ +RYE りぇ +RYO りょ +LYA りゃ +LYI り +LYU りゅ +LYE りぇ +LYO りょ + +WA わ +WI ゐ +WU う +WE ゑ +WO を + +GA が +GI ぎ +GU ぐ +GE げ +GO ご +GYA ぎゃ +GYI ぎ +GYU ぎゅ +GYE ぎぇ +GYO ぎょ + +ZA ざ +ZI じ +ZU ず +ZE ぜ +ZO ぞ +ZYA じゃ +ZYI じ +ZYU じゅ +ZYE じぇ +ZYO じょ +JA じゃ +JI じ +JU じゅ +JE じぇ +JO じょ +JYA じゃ +JYI じ +JYU じゅ +JYE じぇ +JYO じょ + +DA だ +DI ぢ +DU づ +DE で +DO ど +DYA ぢゃ +DYI ぢ +DYU ぢゅ +DYE ぢぇ +DYO ぢょ +DHA だぁ +DHI でぃ +DHU どぅ +DHYU でゅ + +BA ば +BI び +BU ぶ +BE べ +BO ぼ +BYA びゃ +BYI び +BYU びゅ +BYE びぇ +BYO びょ +VA ぶぁ +VI ぶぃ +VU ぶ +VE ぶぇ +VO ぶぉ +VYA びゃ +VYI び +VYU びゅ +VYE びぇ +VYO びょ + +PA ぱ +PI ぴ +PU ぷ +PE ぺ +PO ぽ +PYA ぴゃ +PYI ぴ +PYU ぴゅ +PYE ぴぇ +PYO ぴょ + +QA くぁ +QI くぃ +QU くぅ +QE くぇ +QO くぉ + +N ん +NN ん +#MB ん B +#MM ん M +#MP ん P + +KK っ K +SS っ S +TT っ T +HH っ H +MM っ M +YY っ Y +RR っ R +LL っ L +WW っ W +GG っ G +ZZ っ Z +DD っ D +BB っ B +PP っ P +CC っ C +FF っ F +JJ っ J +VV っ V +QQ っ Q +XX っ X +#TCH っ CH + +XA ぁ +XI ぃ +XU ぅ +XE ぇ +XO ぉ +XYA ゃ +XYI ぃ +XYU ゅ +XYE ぇ +XYO ょ +XTU っ +XTSU っ +XWA ゎ +XKA ヵ +XKE ヶ diff -r 000000000000 -r 92745d501b9a sj3def/sjsb.EUC --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/sj3def/sjsb.EUC Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,299 @@ +# +# $Id: sjsb.EUC,v 2.0 1992/02/13 21:00:41 nao Exp $ +# +# 記号選択用記号一覧ファイル +# +#[data] +  +、 +。 +, +. +・ +: +; +? +! +゛ +゜ +´ +` +¨ +^ + ̄ +_ +ヽ +ヾ +ゝ +ゞ +〃 +仝 +々 +〆 +〇 +ー +― +‐ +/ +\ +〜 +‖ +| +… +‥ +‘ +’ +“ +” +( +) +〔 +〕 +[ +] +{ +} +〈 +〉 +《 +》 +「 +」 +『 +』 +【 +】 ++ +− +± +× +÷ += +≠ +< +> +≦ +≧ +∞ +∴ +♂ +♀ +° +′ +″ +℃ +¥ +$ +¢ +£ +% +# +& +* +@ +§ +☆ +★ +○ +● +◎ +◇ +◆ +□ +■ +△ +▲ +▽ +▼ +※ +〒 +→ +← +↑ +↓ +〓 +∈ +∋ +⊆ +⊇ +⊂ +⊃ +∪ +∩ +∧ +∨ +¬ +⇒ +⇔ +∀ +∃ +∠ +⊥ +⌒ +∂ +∇ +≡ +≒ +≪ +≫ +√ +∽ +∝ +∵ +∫ +∬ +Å +‰ +♯ +♭ +♪ +† +‡ +¶ +◯ +Α +Β +Γ +Δ +Ε +Ζ +Η +Θ +Ι +Κ +Λ +Μ +Ν +Ξ +Ο +Π +Ρ +Σ +Τ +Υ +Φ +Χ +Ψ +Ω +α +β +γ +δ +ε +ζ +η +θ +ι +κ +λ +μ +ν +ξ +ο +π +ρ +σ +τ +υ +φ +χ +ψ +ω +А +Б +В +Г +Д +Е +Ё +Ж +З +И +Й +К +Л +М +Н +О +П +Р +С +Т +У +Ф +Х +Ц +Ч +Ш +Щ +Ъ +Ы +Ь +Э +Ю +Я +а +б +в +г +д +е +ё +ж +з +и +й +к +л +м +н +о +п +р +с +т +у +ф +х +ц +ч +ш +щ +ъ +ы +ь +э +ю +я +─ +│ +┌ +┐ +┘ +└ +├ +┬ +┤ +┴ +┼ +━ +┃ +┏ +┓ +┛ +┗ +┣ +┳ +┫ +┻ +╋ +┠ +┯ +┨ +┷ +┿ +┝ +┰ +┥ +┸ +╂ diff -r 000000000000 -r 92745d501b9a sj3def/sjzh.EUC --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/sj3def/sjzh.EUC Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,106 @@ +# +# $Id: sjzh.EUC,v 2.0 1992/02/13 21:00:43 nao Exp $ +# +# 全角/半角変換規則定義ファイル +# +# (区切りは space か htab) +#[halpha] [zalpha] [zkana] [hkana] +\     \ +! ! ! ! +" ” ” " +\# # # \# +$ $ $ $ +% % % % +& & & & +' ’ ’ ' +( ( ( ( +) ) ) ) +* * * * ++ + + + +, , 、 、 +- − ー ー +#- − − - +. . 。 。 +#. . . . +/ / / / +0 0 0 0 +1 1 1 1 +2 2 2 2 +3 3 3 3 +4 4 4 4 +5 5 5 5 +6 6 6 6 +7 7 7 7 +8 8 8 8 +9 9 9 9 +: : : : +; ; ; ; +< < < < += = = = +> > > > +? ? ? ? +@ @ ・ ・ +A A A A +B B B B +C C C C +D D D D +E E E E +F F F F +G G G G +H H H H +I I I I +J J J J +K K K K +L L L L +M M M M +N N N N +O O O O +P P P P +Q Q Q Q +R R R R +S S S S +T T T T +U U U U +V V V V +W W W W +X X X X +Y Y Y Y +Z Z Z Z +[ [ 「 「 +\\ \ ¥ \\ +] ] 」 」 +^ ^ ^ ^ +_ _ _ _ +` ‘ ‘ ` +a a a a +b b b b +c c c c +d d d d +e e e e +f f f f +g g g g +h h h h +i i i i +j j j j +k k k k +l l l l +m m m m +n n n n +o o o o +p p p p +q q q q +r r r r +s s s s +t t t t +u u u u +v v v v +w w w w +x x x x +y y y y +z z z z +{ { { { +| | | | +} } } } +~ 〜 〜 ~ +゙ ゛ ゛ ゙ +゚ ゜ ゜ ゚