kinput2-v3.1/ 40755 3341 1750 0 7547007544 11765 5ustar ishisonemgrkinput2-v3.1/README100444 3341 1750 13716 7547007536 12771 0ustar ishisonemgr 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 kinput2-v3.1/NEWS100444 3341 1750 6347 7547007536 12572 0ustar ishisonemgrMajor 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. kinput2-v3.1/Imakefile100644 3341 1750 547 7547007536 13662 0ustar ishisonemgr/* * 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)) kinput2-v3.1/Kinput2.conf100644 3341 1750 10562 7547007536 14312 0ustar ishisonemgrXCOMM 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 kinput2-v3.1/patchlevel.h100444 3341 1750 147 7547007536 14343 0ustar ishisonemgr#define KINPUT2_VERSION "version 3.1" #define DATE "$Date: 2002/10/03 09:31:24 $" #define PATCHLEVEL 0 kinput2-v3.1/cmd/ 40755 3341 1750 0 7547007536 12531 5ustar ishisonemgrkinput2-v3.1/cmd/Imakefile100644 3341 1750 2351 7547007536 14440 0ustar ishisonemgr#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) kinput2-v3.1/cmd/Kinput2.ad100444 3341 1750 7713 7547007536 14476 0ustar ishisonemgr! $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 kinput2-v3.1/cmd/kinput2.c100444 3341 1750 44171 7547007536 14413 0ustar ishisonemgr/* * 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 kinput2-v3.1/cmd/kinput2.man100444 3341 1750 41416 7547007536 14743 0ustar ishisonemgr.\" $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 kinput2-v3.1/include/ 40755 3341 1750 0 7547007537 13412 5ustar ishisonemgrkinput2-v3.1/include/AdoptedShP.h100444 3341 1750 3272 7547007536 15654 0ustar ishisonemgr/* $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 kinput2-v3.1/include/AdoptedShe.h100444 3341 1750 2513 7547007536 15676 0ustar ishisonemgr/* $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 kinput2-v3.1/include/AsyncErr.h100444 3341 1750 6513 7547007536 15410 0ustar ishisonemgr/* $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 */ kinput2-v3.1/include/Atok.h100444 3341 1750 3106 7547007536 14553 0ustar ishisonemgr/* $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 */ kinput2-v3.1/include/AtokP.h100444 3341 1750 6046 7547007536 14701 0ustar ishisonemgr/* $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 kinput2-v3.1/include/AuxPanelP.h100444 3341 1750 6447 7547007536 15525 0ustar ishisonemgr/* $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 kinput2-v3.1/include/CachedAtom.h100444 3341 1750 3135 7547007536 15647 0ustar ishisonemgr/* $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 kinput2-v3.1/include/CachedFont.h100444 3341 1750 6242 7547007536 15657 0ustar ishisonemgr/* $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 kinput2-v3.1/include/CandPanel.h100444 3341 1750 6716 7547007536 15514 0ustar ishisonemgr/* $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 kinput2-v3.1/include/Canna.h100444 3341 1750 5615 7547007536 14704 0ustar ishisonemgr/* $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 */ kinput2-v3.1/include/CannaP.h100444 3341 1750 7244 7547007536 15024 0ustar ishisonemgr/* $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 kinput2-v3.1/include/Canvas.h100444 3341 1750 2236 7547007536 15073 0ustar ishisonemgr/* $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 kinput2-v3.1/include/CanvasP.h100444 3341 1750 2523 7547007536 15212 0ustar ishisonemgr/* $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 kinput2-v3.1/include/CanvasSheP.h100444 3341 1750 3322 7547007536 15650 0ustar ishisonemgr/* $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 kinput2-v3.1/include/CanvasShel.h100444 3341 1750 2377 7547007536 15715 0ustar ishisonemgr/* $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 kinput2-v3.1/include/CcWnn.h100444 3341 1750 5742 7547007536 14675 0ustar ishisonemgr/* $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 */ kinput2-v3.1/include/CcWnnP.h100444 3341 1750 6204 7547007536 15007 0ustar ishisonemgr/* $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 kinput2-v3.1/include/ConvCtrlP.h100444 3341 1750 12444 7547007536 15554 0ustar ishisonemgr/* $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 kinput2-v3.1/include/ConvDisp.h100444 3341 1750 12371 7547007536 15426 0ustar ishisonemgr/* $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 */ kinput2-v3.1/include/ConvDispP.h100444 3341 1750 4764 7547007536 15535 0ustar ishisonemgr/* $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 kinput2-v3.1/include/Sj3.h100444 3341 1750 10064 7547007536 14335 0ustar ishisonemgr/* $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 */ kinput2-v3.1/include/ConvMgr.h100444 3341 1750 4362 7547007536 15235 0ustar ishisonemgr/* $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 kinput2-v3.1/include/ConvMgrP.h100444 3341 1750 3654 7547007536 15360 0ustar ishisonemgr/* $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 kinput2-v3.1/include/ConvProto.h100444 3341 1750 23131 7547007536 15626 0ustar ishisonemgr/* $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 kinput2-v3.1/include/DebugPrint.h100444 3341 1750 1416 7547007536 15722 0ustar ishisonemgr/* $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 kinput2-v3.1/include/FontBank.h100444 3341 1750 2737 7547007536 15370 0ustar ishisonemgr/* $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 */ kinput2-v3.1/include/ICLabel.h100444 3341 1750 3003 7547007536 15104 0ustar ishisonemgr/* $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 kinput2-v3.1/include/ICLabelP.h100444 3341 1750 3104 7547007536 15226 0ustar ishisonemgr/* $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 kinput2-v3.1/include/ICtypes.h100444 3341 1750 4152 7547007536 15237 0ustar ishisonemgr/* $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 */ kinput2-v3.1/include/IMProto.h100444 3341 1750 4365 7547007536 15216 0ustar ishisonemgr/* $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 */ kinput2-v3.1/include/IMProtoP.h100444 3341 1750 7714 7547007536 15337 0ustar ishisonemgr/* $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 kinput2-v3.1/include/IOECall.h100444 3341 1750 2465 7547007536 15074 0ustar ishisonemgr/* $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 */ kinput2-v3.1/include/InputConv.h100444 3341 1750 30437 7547007536 15631 0ustar ishisonemgr/* $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 */ kinput2-v3.1/include/InputConvP.h100444 3341 1750 5551 7547007536 15730 0ustar ishisonemgr/* $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 kinput2-v3.1/include/KIFontSet.h100444 3341 1750 4040 7547007536 15461 0ustar ishisonemgr/* $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 kinput2-v3.1/include/KIProto.h100444 3341 1750 3631 7547007536 15207 0ustar ishisonemgr/* $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 kinput2-v3.1/include/KIProtoP.h100444 3341 1750 7766 7547007536 15344 0ustar ishisonemgr/* $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 kinput2-v3.1/include/LocalAlloc.h100444 3341 1750 1120 7547007536 15654 0ustar ishisonemgr/* $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__ */ kinput2-v3.1/include/MyDispatch.h100444 3341 1750 1325 7547007536 15723 0ustar ishisonemgr/* $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 ); kinput2-v3.1/include/OffConv.h100444 3341 1750 2731 7547007536 15220 0ustar ishisonemgr/* $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 kinput2-v3.1/include/OffConvP.h100444 3341 1750 10242 7547007536 15354 0ustar ishisonemgr/* $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 kinput2-v3.1/include/OnConv.h100444 3341 1750 4376 7547007536 15071 0ustar ishisonemgr/* $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 kinput2-v3.1/include/OnConvP.h100444 3341 1750 6213 7547007536 15201 0ustar ishisonemgr/* $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 kinput2-v3.1/include/OverConv.h100444 3341 1750 4324 7547007536 15421 0ustar ishisonemgr/* $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 kinput2-v3.1/include/OverConvP.h100444 3341 1750 10503 7547007536 15555 0ustar ishisonemgr/* $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 kinput2-v3.1/include/Sj3P.h100444 3341 1750 6403 7547007536 14437 0ustar ishisonemgr/* $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 kinput2-v3.1/include/ParseKey.h100444 3341 1750 2120 7547007536 15373 0ustar ishisonemgr/* $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 */ kinput2-v3.1/include/WStr.h100444 3341 1750 5145 7547007536 14561 0ustar ishisonemgr/* * 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 kinput2-v3.1/include/WcharDisp.h100444 3341 1750 5551 7547007536 15547 0ustar ishisonemgr/* $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 */ kinput2-v3.1/include/WcharDispP.h100444 3341 1750 6131 7547007536 15662 0ustar ishisonemgr/* $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 kinput2-v3.1/include/XWStr.h100444 3341 1750 4733 7547007536 14713 0ustar ishisonemgr/* * 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 kinput2-v3.1/include/Xatoklib.h100444 3341 1750 17221 7547007536 15455 0ustar ishisonemgr/* * 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 kinput2-v3.1/include/Xsj3clib.h100444 3341 1750 46411 7547007537 15365 0ustar ishisonemgr/* $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 */ kinput2-v3.1/include/cconv.h100444 3341 1750 4566 7547007537 15001 0ustar ishisonemgr/* $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 kinput2-v3.1/include/wnnlib.h100444 3341 1750 13635 7547007537 15177 0ustar ishisonemgr/* $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 */ kinput2-v3.1/include/XIMProto.h100444 3341 1750 24034 7547007537 15362 0ustar ishisonemgr/* @(#)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; kinput2-v3.1/lib/ 40755 3341 1750 0 7547007542 12531 5ustar ishisonemgrkinput2-v3.1/lib/Imakefile100644 3341 1750 4550 7547007537 14447 0ustar ishisonemgr#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 kinput2-v3.1/lib/AdoptedShe.c100444 3341 1750 13306 7547007537 15037 0ustar ishisonemgr#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; } kinput2-v3.1/lib/Atok.c100444 3341 1750 130361 7547007537 13736 0ustar ishisonemgr/* * 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 */ kinput2-v3.1/lib/AuxPanel.c100444 3341 1750 40133 7547007537 14532 0ustar ishisonemgr#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; } kinput2-v3.1/lib/CandPanel.c100444 3341 1750 47744 7547007537 14661 0ustar ishisonemgr#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); } kinput2-v3.1/lib/Canna.c100444 3341 1750 130671 7547007537 14064 0ustar ishisonemgr/* * 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; } kinput2-v3.1/lib/Canvas.c100444 3341 1750 6002 7547007537 14205 0ustar ishisonemgr#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); } kinput2-v3.1/lib/CanvasShel.c100444 3341 1750 10742 7547007537 15047 0ustar ishisonemgr#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; } kinput2-v3.1/lib/CcWnn.c100444 3341 1750 173401 7547007537 14052 0ustar ishisonemgr#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); } kinput2-v3.1/lib/ConvCtrl.c100444 3341 1750 110011 7547007537 14560 0ustar ishisonemgr#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); } kinput2-v3.1/lib/ConvDisp.c100444 3341 1750 33411 7547007537 14543 0ustar ishisonemgr#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; } kinput2-v3.1/lib/ConvMgr.c100444 3341 1750 23030 7547007537 14365 0ustar ishisonemgr#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); } kinput2-v3.1/lib/ICLabel.c100444 3341 1750 23673 7547007537 14262 0ustar ishisonemgr#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 */ } kinput2-v3.1/lib/IMProto.c100444 3341 1750 65124 7547007540 14347 0ustar ishisonemgr#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); } } kinput2-v3.1/lib/InputConv.c100444 3341 1750 37303 7547007540 14741 0ustar ishisonemgr#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; } kinput2-v3.1/lib/KIProto.c100444 3341 1750 206134 7547007540 14363 0ustar ishisonemgr#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); } kinput2-v3.1/lib/OffConv.c100444 3341 1750 157735 7547007540 14410 0ustar ishisonemgr#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; } kinput2-v3.1/lib/OnConv.c100444 3341 1750 111410 7547007540 14226 0ustar ishisonemgr#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); } kinput2-v3.1/lib/OverConv.c100444 3341 1750 227240 7547007540 14576 0ustar ishisonemgr#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; } kinput2-v3.1/lib/Sj3.c100444 3341 1750 106310 7547007540 13466 0ustar ishisonemgr#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); } kinput2-v3.1/lib/WcharDisp.c100444 3341 1750 57200 7547007540 14676 0ustar ishisonemgr#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; kinput2-v3.1/lib/XimpProto.c100444 3341 1750 251100 7547007540 14766 0ustar ishisonemgr#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 */ kinput2-v3.1/lib/asyncerr.c100444 3341 1750 12712 7547007540 14637 0ustar ishisonemgr#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); } kinput2-v3.1/lib/cachedatom.c100444 3341 1750 12113 7547007540 15074 0ustar ishisonemgr#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 kinput2-v3.1/lib/cachedfont.c100444 3341 1750 14343 7547007540 15111 0ustar ishisonemgr#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); } kinput2-v3.1/lib/cconv.c100444 3341 1750 227117 7547007540 14150 0ustar ishisonemgr/* * 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 kinput2-v3.1/lib/ctext.c100444 3341 1750 25634 7547007540 14147 0ustar ishisonemgr/* * 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; } kinput2-v3.1/lib/dispatch.c100444 3341 1750 13626 7547007540 14615 0ustar ishisonemgr#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); } } kinput2-v3.1/lib/fontbank.c100444 3341 1750 15737 7547007540 14625 0ustar ishisonemgr#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]); } } kinput2-v3.1/lib/fontset.c100444 3341 1750 21303 7547007540 14467 0ustar ishisonemgr#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; } kinput2-v3.1/lib/ioecall.c100444 3341 1750 4436 7547007540 14405 0ustar ishisonemgr#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; } } kinput2-v3.1/lib/parsekey.c100444 3341 1750 7641 7547007540 14621 0ustar ishisonemgr#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; } kinput2-v3.1/lib/wnnlib.c100444 3341 1750 310001 7547007540 14312 0ustar ishisonemgr/* * 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 */ kinput2-v3.1/lib/wstring.c100444 3341 1750 4303 7547007540 14463 0ustar ishisonemgr/* * 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; } kinput2-v3.1/lib/xtwstr.c100444 3341 1750 5076 7547007540 14351 0ustar ishisonemgr/* * 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); } kinput2-v3.1/lib/xwstr.c100444 3341 1750 25761 7547007541 14211 0ustar ishisonemgr/* * 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); } kinput2-v3.1/lib/Xatoklib/ 40755 3341 1750 0 7547007541 14305 5ustar ishisonemgrkinput2-v3.1/lib/Xatoklib/Imakefile100644 3341 1750 531 7547007541 16172 0ustar ishisonemgr#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() kinput2-v3.1/lib/Xatoklib/README100444 3341 1750 2352 7547007541 15262 0ustar ishisonemgr/* * 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 * */ kinput2-v3.1/lib/Xatoklib/aux.c100444 3341 1750 71735 7547007541 15376 0ustar ishisonemgr/* * 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 kinput2-v3.1/lib/Xatoklib/buffer.c100444 3341 1750 23361 7547007541 16042 0ustar ishisonemgr/* * 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 */ kinput2-v3.1/lib/Xatoklib/compstr.c100444 3341 1750 5167 7547007541 16244 0ustar ishisonemgr/* * 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 */ kinput2-v3.1/lib/Xatoklib/event.c100444 3341 1750 37722 7547007541 15720 0ustar ishisonemgr/* * 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 */ kinput2-v3.1/lib/Xatoklib/if.c100444 3341 1750 37036 7547007541 15173 0ustar ishisonemgr/* * 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 */ kinput2-v3.1/lib/Xatoklib/key.c100444 3341 1750 16177 7547007541 15370 0ustar ishisonemgr/* * 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 */ kinput2-v3.1/lib/Xatoklib/key_def.h100444 3341 1750 126176 7547007541 16234 0ustar ishisonemgr/****************************************************************************** * $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) kinput2-v3.1/lib/Xatoklib/misc.c100444 3341 1750 6363 7547007541 15507 0ustar ishisonemgr/* * 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 */ kinput2-v3.1/lib/Xatoklib/segment.c100444 3341 1750 25163 7547007541 16235 0ustar ishisonemgr/* * 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 */ kinput2-v3.1/lib/Xatoklib/sysline.c100444 3341 1750 12330 7547007541 16251 0ustar ishisonemgr/* * 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 */ kinput2-v3.1/lib/Xsj3clib/ 40755 3341 1750 0 7547007542 14212 5ustar ishisonemgrkinput2-v3.1/lib/Xsj3clib/Imakefile100644 3341 1750 2311 7547007541 16114 0ustar ishisonemgr#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() kinput2-v3.1/lib/Xsj3clib/buffer.c100444 3341 1750 76543 7547007541 15760 0ustar ishisonemgr#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; } kinput2-v3.1/lib/Xsj3clib/candidate.c100444 3341 1750 24271 7547007541 16412 0ustar ishisonemgr#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; } } } kinput2-v3.1/lib/Xsj3clib/code.c100444 3341 1750 6105 7547007541 15364 0ustar ishisonemgr#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); } kinput2-v3.1/lib/Xsj3clib/common.h100444 3341 1750 12456 7547007541 15775 0ustar ishisonemgr/* $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; kinput2-v3.1/lib/Xsj3clib/connect.c100444 3341 1750 16450 7547007541 16127 0ustar ishisonemgr#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; } } kinput2-v3.1/lib/Xsj3clib/conv.c100444 3341 1750 133706 7547007541 15467 0ustar ishisonemgr#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); } kinput2-v3.1/lib/Xsj3clib/dict.c100444 3341 1750 51115 7547007541 15416 0ustar ishisonemgr#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; } kinput2-v3.1/lib/Xsj3clib/func.c100444 3341 1750 376610 7547007542 15461 0ustar ishisonemgr#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); } kinput2-v3.1/lib/Xsj3clib/func.h100444 3341 1750 7402 7547007542 15414 0ustar ishisonemgr/* $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(); kinput2-v3.1/lib/Xsj3clib/libif.c100444 3341 1750 3754 7547007542 15547 0ustar ishisonemgr#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 } } }; kinput2-v3.1/lib/Xsj3clib/mode.c100444 3341 1750 113223 7547007542 15437 0ustar ishisonemgr#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); } } } kinput2-v3.1/lib/Xsj3clib/mode.h100444 3341 1750 3463 7547007542 15410 0ustar ishisonemgr/* $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(); kinput2-v3.1/lib/Xsj3clib/segment.c100444 3341 1750 16777 7547007542 16155 0ustar ishisonemgr#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; } kinput2-v3.1/lib/Xsj3clib/segment.h100444 3341 1750 2651 7547007542 16124 0ustar ishisonemgr/* $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(); kinput2-v3.1/lib/Xsj3clib/sj3ctype.c100444 3341 1750 4255 7547007542 16223 0ustar ishisonemgr#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 }; kinput2-v3.1/lib/Xsj3clib/sj3ctype.h100444 3341 1750 7355 7547007542 16234 0ustar ishisonemgr/* $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 */ kinput2-v3.1/lib/Xsj3clib/sjrc.c100444 3341 1750 134311 7547007542 15455 0ustar ishisonemgr#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; } kinput2-v3.1/lib/Xsj3clib/symbol.c100444 3341 1750 21536 7547007542 16005 0ustar ishisonemgr#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; } kinput2-v3.1/lib/Xsj3clib/table.c100444 3341 1750 67026 7547007542 15573 0ustar ishisonemgr#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]); } kinput2-v3.1/lib/Xsj3clib/table.h100444 3341 1750 3124 7547007542 15545 0ustar ishisonemgr/* $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(); kinput2-v3.1/lib/Xsj3clib/util.c100444 3341 1750 51527 7547007542 15460 0ustar ishisonemgr#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](); } } kinput2-v3.1/lib/Xsj3clib/util.h100444 3341 1750 4753 7547007542 15444 0ustar ishisonemgr/* $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])(); kinput2-v3.1/lib/imlib/ 40755 3341 1750 0 7547007543 13626 5ustar ishisonemgrkinput2-v3.1/lib/imlib/Imakefile100644 3341 1750 1067 7547007542 15537 0ustar ishisonemgr#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 kinput2-v3.1/lib/imlib/im.h100444 3341 1750 16441 7547007542 14524 0ustar ishisonemgr/* $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 */ kinput2-v3.1/lib/imlib/imattr.c100444 3341 1750 201715 7547007542 15432 0ustar ishisonemgr#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); } } kinput2-v3.1/lib/imlib/imbuf.c100444 3341 1750 6342 7547007542 15173 0ustar ishisonemgr#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; } } kinput2-v3.1/lib/imlib/imbuf.h100444 3341 1750 3504 7547007542 15175 0ustar ishisonemgr/* $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 */ kinput2-v3.1/lib/imlib/imconst.h100444 3341 1750 7266 7547007542 15560 0ustar ishisonemgr/* $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 */ kinput2-v3.1/lib/imlib/imconv.c100444 3341 1750 63243 7547007542 15407 0ustar ishisonemgr#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); } kinput2-v3.1/lib/imlib/imdata.c100444 3341 1750 16037 7547007542 15352 0ustar ishisonemgr#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"); } kinput2-v3.1/lib/imlib/imdispatch.c100444 3341 1750 26647 7547007542 16250 0ustar ishisonemgr#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; } } kinput2-v3.1/lib/imlib/imfuncs.h100444 3341 1750 15113 7547007542 15556 0ustar ishisonemgr/* $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 */ kinput2-v3.1/lib/imlib/imic.c100444 3341 1750 17777 7547007542 15050 0ustar ishisonemgr#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); } kinput2-v3.1/lib/imlib/improto.c100444 3341 1750 13777 7547007542 15614 0ustar ishisonemgr#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; } kinput2-v3.1/lib/imlib/imprtype.h100444 3341 1750 2047 7547007542 15745 0ustar ishisonemgr/* $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 */ kinput2-v3.1/lib/imlib/imreq.h100444 3341 1750 2715 7547007542 15213 0ustar ishisonemgr/* $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 */ kinput2-v3.1/lib/imlib/imrequest.c100444 3341 1750 113446 7547007542 16153 0ustar ishisonemgr#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; } kinput2-v3.1/lib/imlib/imxport.c100444 3341 1750 41714 7547007543 15616 0ustar ishisonemgr#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); } kinput2-v3.1/lib/imlib/imxport.h100444 3341 1750 3320 7547007543 15572 0ustar ishisonemgr/* $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 */ kinput2-v3.1/ccdef/ 40755 3341 1750 0 7547007543 13030 5ustar ishisonemgrkinput2-v3.1/ccdef/Imakefile100644 3341 1750 616 7547007543 14721 0ustar ishisonemgr#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 kinput2-v3.1/ccdef/ccdef.kinput2100444 3341 1750 4670 7547007543 15514 0ustar ishisonemgr# $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 "£Á£Â£Ã" 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 kinput2-v3.1/ccdef/ccdef.kinput2.egg100444 3341 1750 17162 7547007543 16275 0ustar ishisonemgr## 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 "[£á]" 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 kinput2-v3.1/ccdef/rule.eggfunc100444 3341 1750 1765 7547007543 15443 0ustar ishisonemgr# $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 "&" kinput2-v3.1/ccdef/rule.func100444 3341 1750 1722 7547007543 14751 0ustar ishisonemgr# $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 "&" kinput2-v3.1/ccdef/rule.greek100444 3341 1750 1367 7547007543 15120 0ustar ishisonemgr# $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' "¦¸" kinput2-v3.1/ccdef/rule.hiragana.egg100444 3341 1750 10716 7547007543 16354 0ustar ishisonemgr## 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' "¤ó" # kinput2-v3.1/ccdef/rule.kana100444 3341 1750 2725 7547007543 14734 0ustar ishisonemgr# $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 ¤Î¤³¤È¤À¤±¤É) "" '|' "¤í" "" '\\' "¡¼" "" '}' "¡Ö" "" '~' "¡×" "¤«" '[' "¤¬" "¤­" '[' "¤®" "¤¯" '[' "¤°" "¤±" '[' "¤²" "¤³" '[' "¤´" "¤µ" '[' "¤¶" "¤·" '[' "¤¸" "¤¹" '[' "¤º" "¤»" '[' "¤¼" "¤½" '[' "¤¾" "¤¿" '[' "¤À" "¤Á" '[' "¤Â" "¤Ä" '[' "¤Å" "¤Æ" '[' "¤Ç" "¤È" '[' "¤É" "¤Ï" '[' "¤Ð" "¤Ò" '[' "¤Ó" "¤Õ" '[' "¤Ö" "¤Ø" '[' "¤Ù" "¤Û" '[' "¤Ü" "¤Ï" ']' "¤Ñ" "¤Ò" ']' "¤Ô" "¤Õ" ']' "¤×" "¤Ø" ']' "¤Ú" "¤Û" ']' "¤Ý" "¤¦" '[' "¥ô" "" '[' "¡«" "" ']' "¡¬" kinput2-v3.1/ccdef/rule.kana2100444 3341 1750 7117 7547007543 15016 0ustar ishisonemgr# $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 "¤Ý" # ¤³¤³¤«¤é²¼¤Ï¸Ä¿Í¤Î¼ñÌ£¤Ç¤¹¤Î¤ÇɬÍפʤ¤Êý¤Ï¥³¥á¥ó¥È¥¢¥¦¥È¤·¤Æ²¼¤µ¤¤ "" '!' "¡ª" "" '"' "¡È" "" '#' "¡ô" "" '$' "¡ð" "" '%' "¡ó" "" '&' "¡õ" "" '\'' "¡Ç" "" '(' "¡Ê" "" ')' "¡Ë" "" '*' "¡ö" "" '+' "¡Ü" "" ',' "¡¤" "" '-' "¡Ý" "" '.' "¡¥" "" '/' "¡¿" "" ':' "¡§" "" ';' "¡¨" "" '<' "¡ã" "" '=' "¡á" "" '>' "¡ä" "" '?' "¡©" "" '@' "¡÷" "" '[' "¡Î" "" '\\' "¡ï" "" ']' "¡Ï" "" '^' "¡°" "" '_' "¡²" "" '`' "¡Æ" "" ' ' "¡¡" "" '{' "¡Ð" "" '|' "¡Ã" "" '}' "¡Ñ" "" '~' "¡Á" kinput2-v3.1/ccdef/rule.katakana.egg100444 3341 1750 10716 7547007543 16355 0ustar ishisonemgr## 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' "¥ó" # kinput2-v3.1/ccdef/rule.kigou.egg100444 3341 1750 6000 7547007543 15667 0ustar ishisonemgr## 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' "£°" "Z" '1' "£±" "Z" '2' "£²" "Z" '3' "£³" "Z" '4' "£´" "Z" '5' "£µ" "Z" '6' "£¶" "Z" '7' "£·" "Z" '8' "£¸" "Z" '9' "£¹" "Z" 'A' "£Á" "Z" 'B' "£Â" "Z" 'C' "£Ã" "Z" 'D' "£Ä" "Z" 'E' "£Å" "Z" 'F' "£Æ" "Z" 'G' "£Ç" "Z" 'H' "£È" "Z" 'I' "£É" "Z" 'J' "£Ê" "Z" 'K' "£Ë" "Z" 'L' "£Ì" "Z" 'M' "£Í" "Z" 'N' "£Î" "Z" 'O' "£Ï" "Z" 'P' "£Ð" "Z" 'Q' "£Ñ" "Z" 'R' "£Ò" "Z" 'S' "£Ó" "Z" 'T' "£Ô" "Z" 'U' "£Õ" "Z" 'V' "£Ö" "Z" 'W' "£×" "Z" 'X' "£Ø" "Z" 'Y' "£Ù" "Z" 'Z' "£Ú" "Z" 'a' "£á" "Z" 'b' "£â" "Z" 'c' "£ã" "Z" 'd' "£ä" "Z" 'e' "£å" "Z" 'f' "£æ" "Z" 'g' "£ç" "Z" 'h' "£è" "Z" 'i' "£é" "Z" 'j' "£ê" "Z" 'k' "£ë" "Z" 'l' "£ì" "Z" 'm' "£í" "Z" 'n' "£î" "Z" 'o' "£ï" "Z" 'p' "£ð" "Z" 'q' "£ñ" "Z" 'r' "£ò" "Z" 's' "£ó" "Z" 't' "£ô" "Z" 'u' "£õ" "Z" 'v' "£ö" "Z" 'w' "£÷" "Z" 'x' "£ø" "Z" '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" '.' "¡¥" # # "" '0' "£°" "" '1' "£±" "" '2' "£²" "" '3' "£³" "" '4' "£´" "" '5' "£µ" "" '6' "£¶" "" '7' "£·" "" '8' "£¸" "" '9' "£¹" "" '!' "¡ª" "" '@' "¡÷" "" '#' "¡ô" "" '$' "¡ð" "" '%' "¡ó" "" '^' "¡°" "" '&' "¡õ" "" '*' "¡ö" "" '(' "¡Ê" "" ')' "¡Ë" "" '-' "¡¼" "" '=' "¡á" "" '`' "¡®" "" '\\' "¡ï" "" '|' "¡Ã" "" '_' "¡²" "" '+' "¡Ü" "" '~' "¡±" "" '[' "¡Ö" "" ']' "¡×" "" '{' "¡Ð" "" '}' "¡Ñ" "" ':' "¡§" "" ';' "¡¨" "" '"' "¡É" "" '\'' "¡Ç" "" '<' "¡ã" "" '>' "¡ä" "" '?' "¡©" # "" '/' "¡¦" # "" ',' ", " # "" '.' ". " "" '/' "¡¿" "" ',' "¡¢" "" '.' "¡£" kinput2-v3.1/ccdef/rule.roma100444 3341 1750 24770 7547007543 15004 0ustar ishisonemgr# $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 kinput2-v3.1/ccdef/rule.wnnroma100444 3341 1750 21134 7547007543 15516 0ustar ishisonemgr# $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¤Î½èÍý¤¬¶²¤é¤¯£÷£î£î¤ÈƱ¤¸¤Ë¤Ê¤Ã¤¿ # ¤½¤Î¤«¤ï¤ê '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' "¥ó" kinput2-v3.1/ccdef/rule.zascii100444 3341 1750 2552 7547007543 15302 0ustar ishisonemgr# $Id: rule.zascii,v 1.1 1989/10/19 21:08:16 ishisone Rel $ # character conversion rule for double-width ascii characters # Á´³Ñ¥¢¥¹¥­¡¼ÊÑ´¹¥ë¡¼¥ë "" ' ' "¡¡" "" '!' "¡ª" "" '"' "¡È" "" '#' "¡ô" "" '$' "¡ð" "" '%' "¡ó" "" '&' "¡õ" "" '\'' "¡Ç" "" '(' "¡Ê" "" ')' "¡Ë" "" '*' "¡ö" "" '+' "¡Ü" "" ',' "¡¤" "" '-' "¡Ý" "" '.' "¡¥" "" '/' "¡¿" "" '0' "£°" "" '1' "£±" "" '2' "£²" "" '3' "£³" "" '4' "£´" "" '5' "£µ" "" '6' "£¶" "" '7' "£·" "" '8' "£¸" "" '9' "£¹" "" ':' "¡§" "" ';' "¡¨" "" '<' "¡ã" "" '=' "¡á" "" '>' "¡ä" "" '?' "¡©" "" '@' "¡÷" "" 'A' "£Á" "" 'B' "£Â" "" 'C' "£Ã" "" 'D' "£Ä" "" 'E' "£Å" "" 'F' "£Æ" "" 'G' "£Ç" "" 'H' "£È" "" 'I' "£É" "" 'J' "£Ê" "" 'K' "£Ë" "" 'L' "£Ì" "" 'M' "£Í" "" 'N' "£Î" "" 'O' "£Ï" "" 'P' "£Ð" "" 'Q' "£Ñ" "" 'R' "£Ò" "" 'S' "£Ó" "" 'T' "£Ô" "" 'U' "£Õ" "" 'V' "£Ö" "" 'W' "£×" "" 'X' "£Ø" "" 'Y' "£Ù" "" 'Z' "£Ú" "" '[' "¡Î" "" '\\' "¡ï" "" ']' "¡Ï" "" '^' "¡°" "" '_' "¡²" "" '`' "¡Æ" "" 'a' "£á" "" 'b' "£â" "" 'c' "£ã" "" 'd' "£ä" "" 'e' "£å" "" 'f' "£æ" "" 'g' "£ç" "" 'h' "£è" "" 'i' "£é" "" 'j' "£ê" "" 'k' "£ë" "" 'l' "£ì" "" 'm' "£í" "" 'n' "£î" "" 'o' "£ï" "" 'p' "£ð" "" 'q' "£ñ" "" 'r' "£ò" "" 's' "£ó" "" 't' "£ô" "" 'u' "£õ" "" 'v' "£ö" "" 'w' "£÷" "" 'x' "£ø" "" 'y' "£ù" "" 'z' "£ú" "" '{' "¡Ð" "" '|' "¡Ã" "" '}' "¡Ñ" "" '~' "¡Á" kinput2-v3.1/sj3def/ 40755 3341 1750 0 7547007543 13142 5ustar ishisonemgrkinput2-v3.1/sj3def/Imakefile100644 3341 1750 1350 7547007543 15047 0ustar ishisonemgr#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 kinput2-v3.1/sj3def/jcode.c100444 3341 1750 12353 7547007543 14511 0ustar ishisonemgr#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'; } kinput2-v3.1/sj3def/sjhk.EUC100444 3341 1750 3043 7547007543 14532 0ustar ishisonemgr# # $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 ¤± ¥ö ޹ " ¡« ¡« ŽÞ [ ¡¬ ¡¬ Žß ] ¡Ö ¡Ö Ž¢ } ¡× ¡× Ž£ ~ ¡¼ ¡¼ ް \\ ¤í ¤í ŽÛ | ¡¢ ¡¢ ޤ < ¡£ ¡£ Ž¡ > ¡¦ ¡¦ Ž¥ ? kinput2-v3.1/sj3def/sjrc.EUC100444 3341 1750 21257 7547007543 14563 0ustar ishisonemgr# # $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 £Á£Â£Ã .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 # # ʸÀá½Ì¾®»þ¤Ë£±Ê¸»ú¤·¤«¤Ê¤¤¤È¤­¤ÎÁ°Ê¸Àá¤È¤Î¹çÀáÆ°ºî¤Î»ØÄê #.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 kinput2-v3.1/sj3def/sjrc.iroha.EUC100444 3341 1750 15731 7547007543 15664 0ustar ishisonemgr# # $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 ¡¡[£á] .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 ¡¡[£ñ] # # ÆþÎÏʸ»ú¼ï¤ÎÊѹ¹½ç»ØÄê .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 # # ʸÀá½Ì¾®»þ¤Ë£±Ê¸»ú¤·¤«¤Ê¤¤¤È¤­¤ÎÁ°Ê¸Àá¤È¤Î¹çÀáÆ°ºî¤Î»ØÄê #.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 kinput2-v3.1/sj3def/sjrc.sjx.EUC100444 3341 1750 13252 7547007543 15362 0ustar ishisonemgr# # $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 £Å£Õ£Ã #.guide.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 # # ʸÀá½Ì¾®»þ¤Ë£±Ê¸»ú¤·¤«¤Ê¤¤¤È¤­¤ÎÁ°Ê¸Àá¤È¤Î¹çÀáÆ°ºî¤Î»ØÄê #.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 kinput2-v3.1/sj3def/sjrk.EUC100444 3341 1750 13205 7547007543 14565 0ustar ishisonemgr# # $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 ¥ö kinput2-v3.1/sj3def/sjrk.iroha.EUC100444 3341 1750 5524 7547007543 15653 0ustar ishisonemgr# # $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 £° 1 £± 2 £² 3 £³ 4 £´ 5 £µ 6 £¶ 7 £· 8 £¸ 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 ¡Å @( ¡Ê @) ¡Ë @[ ¡Î @] ¡Ï @{ ¡Ð @} ¡Ñ ~ ¡± ? ¡© ! ¡ª \# ¡ô $ ¡ð " ¡É % ¡ó & ¡õ ' ¡Ç ` ¡® + ¡Ü * ¡ö = ¡á | ¡Ã ; ¡¨ : ¡§ _ ¡² / ¡¿ \\ ¡ï kinput2-v3.1/sj3def/sjrk.sjx.EUC100444 3341 1750 11357 7547007543 15376 0ustar ishisonemgr# # $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 ¥ö kinput2-v3.1/sj3def/sjsb.EUC100444 3341 1750 1716 7547007543 14541 0ustar ishisonemgr# # $Id: sjsb.EUC,v 2.0 1992/02/13 21:00:41 nao Exp $ # # µ­¹æÁªÂòÍѵ­¹æ°ìÍ÷¥Õ¥¡¥¤¥ë # #[data] ¡¡ ¡¢ ¡£ ¡¤ ¡¥ ¡¦ ¡§ ¡¨ ¡© ¡ª ¡« ¡¬ ¡­ ¡® ¡¯ ¡° ¡± ¡² ¡³ ¡´ ¡µ ¡¶ ¡· ¡¸ ¡¹ ¡º ¡» ¡¼ ¡½ ¡¾ ¡¿ ¡À ¡Á ¡Â ¡Ã ¡Ä ¡Å ¡Æ ¡Ç ¡È ¡É ¡Ê ¡Ë ¡Ì ¡Í ¡Î ¡Ï ¡Ð ¡Ñ ¡Ò ¡Ó ¡Ô ¡Õ ¡Ö ¡× ¡Ø ¡Ù ¡Ú ¡Û ¡Ü ¡Ý ¡Þ ¡ß ¡à ¡á ¡â ¡ã ¡ä ¡å ¡æ ¡ç ¡è ¡é ¡ê ¡ë ¡ì ¡í ¡î ¡ï ¡ð ¡ñ ¡ò ¡ó ¡ô ¡õ ¡ö ¡÷ ¡ø ¡ù ¡ú ¡û ¡ü ¡ý ¡þ ¢¡ ¢¢ ¢£ ¢¤ ¢¥ ¢¦ ¢§ ¢¨ ¢© ¢ª ¢« ¢¬ ¢­ ¢® ¢º ¢» ¢¼ ¢½ ¢¾ ¢¿ ¢À ¢Á ¢Ê ¢Ë ¢Ì ¢Í ¢Î ¢Ï ¢Ð ¢Ü ¢Ý ¢Þ ¢ß ¢à ¢á ¢â ¢ã ¢ä ¢å ¢æ ¢ç ¢è ¢é ¢ê ¢ò ¢ó ¢ô ¢õ ¢ö ¢÷ ¢ø ¢ù ¢þ ¦¡ ¦¢ ¦£ ¦¤ ¦¥ ¦¦ ¦§ ¦¨ ¦© ¦ª ¦« ¦¬ ¦­ ¦® ¦¯ ¦° ¦± ¦² ¦³ ¦´ ¦µ ¦¶ ¦· ¦¸ ¦Á ¦Â ¦Ã ¦Ä ¦Å ¦Æ ¦Ç ¦È ¦É ¦Ê ¦Ë ¦Ì ¦Í ¦Î ¦Ï ¦Ð ¦Ñ ¦Ò ¦Ó ¦Ô ¦Õ ¦Ö ¦× ¦Ø §¡ §¢ §£ §¤ §¥ §¦ §§ §¨ §© §ª §« §¬ §­ §® §¯ §° §± §² §³ §´ §µ §¶ §· §¸ §¹ §º §» §¼ §½ §¾ §¿ §À §Á §Ñ §Ò §Ó §Ô §Õ §Ö §× §Ø §Ù §Ú §Û §Ü §Ý §Þ §ß §à §á §â §ã §ä §å §æ §ç §è §é §ê §ë §ì §í §î §ï §ð §ñ ¨¡ ¨¢ ¨£ ¨¤ ¨¥ ¨¦ ¨§ ¨¨ ¨© ¨ª ¨« ¨¬ ¨­ ¨® ¨¯ ¨° ¨± ¨² ¨³ ¨´ ¨µ ¨¶ ¨· ¨¸ ¨¹ ¨º ¨» ¨¼ ¨½ ¨¾ ¨¿ ¨À kinput2-v3.1/sj3def/sjzh.EUC100444 3341 1750 2662 7547007543 14557 0ustar ishisonemgr# # $Id: sjzh.EUC,v 2.0 1992/02/13 21:00:43 nao Exp $ # # Á´³Ñ/Ⱦ³ÑÊÑ´¹µ¬Â§ÄêµÁ¥Õ¥¡¥¤¥ë # # (¶èÀÚ¤ê¤Ï space ¤« htab) #[halpha] [zalpha] [zkana] [hkana] \ ¡¡ ¡¡ \ ! ¡ª ¡ª ! " ¡É ¡É " \# ¡ô ¡ô \# $ ¡ð ¡ð $ % ¡ó ¡ó % & ¡õ ¡õ & ' ¡Ç ¡Ç ' ( ¡Ê ¡Ê ( ) ¡Ë ¡Ë ) * ¡ö ¡ö * + ¡Ü ¡Ü + , ¡¤ ¡¢ ޤ - ¡Ý ¡¼ ް #- ¡Ý ¡Ý - . ¡¥ ¡£ Ž¡ #. ¡¥ ¡¥ . / ¡¿ ¡¿ / 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 { ¡Ð ¡Ð { | ¡Ã ¡Ã | } ¡Ñ ¡Ñ } ~ ¡Á ¡Á ~ ŽÞ ¡« ¡« ŽÞ Žß ¡¬ ¡¬ Žß kinput2-v3.1/doc/ 40755 3341 1750 0 7547007544 12532 5ustar ishisonemgrkinput2-v3.1/doc/protocol100444 3341 1750 55327 7547007543 14444 0ustar ishisonemgr$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 kinput2-v3.1/doc/sj3def100444 3341 1750 376057 7547007543 14007 0ustar ishisonemgr$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 kinput2-v3.1/doc/sj3guide.tex100444 3341 1750 17442 7547007544 15114 0ustar ishisonemgr\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} kinput2-v3.1/doc/defaultkeys100444 3341 1750 10426 7547007544 15113 0ustar ishisonemgr** Kinput2 default key bindings ** [ This document describes the default key bindings of kinput2 when Wnn is ] [ used as the conversion server. If you're going to use Canna conversion ] [ server, please see the documents of Canna instead. ] * Conversion Start/End The key used to start conversion depends on conversion protocol and client. In case of xlc protocol and XIMP protocol, shift-space should work. Otherwise, kinput2 cannot specify it so there's no default key to start conversion. See the manual for each client. control-Kanji shift-space These keys end conversion. If there is text that is not fixed, it is sent to the client. It then pops down the conversion window, and kinputw will be waiting for the next conversion request. * Text Input The initial input mode is Roma-ji mode i.e. text typed in is changed to Hiragana. Tab changes the input mode as follows: Romaji -> 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. kinput2-v3.1/doc/resources100444 3341 1750 40762 7547007544 14613 0ustar ishisonemgr** 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 kinput2-v3.1/doc/problems100444 3341 1750 3221 7547007544 14371 0ustar ishisonemgr** $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 kinput2-v3.1/doc/classes100444 3341 1750 12030 7547007544 14221 0ustar ishisonemgr** kinput2 $B$G;H$o$l$F$$$k(B widget class $B$K$D$$$F(B ** kinput2 $B$G$O$5$^$6$^$J(B widget $B$r;HMQ$7$F$$$^$9!#$3$N$&$A!":#2s(B kinput2 $B$N$?$a$K?7$?$K3+H/$7$?(B widget $B$K$D$$$F!"4JC1$K@bL@$7$^$9!#(B * InputConv object $BJQ49$r9T$J$&%*%V%8%'%/%H$G$9!#$?$@$7$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!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$rShift_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 kinput2-v3.1/client/ 40755 3341 1750 0 7547007544 13243 5ustar ishisonemgrkinput2-v3.1/client/README100444 3341 1750 1521 7547007544 14215 0ustar ishisonemgrThis 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. kinput2-v3.1/client/convlib.c100444 3341 1750 100206 7547007544 15175 0ustar ishisonemgr/* * 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); }