X Window System, Version 11 Input Method Specifications Public Review Draft - November 1990 (Send comments to i18n@expo.lcs.mit.edu) Vania Joloboff Open Software Foundation Bill McMahon Hewlett Packard Company ABSTRACT This chapter addresses the portability and interoperability of programs in different countries. It describes specifications pro- viding to clients of the X Window System Version 11, an interface for input handling of characters in various languages. The specifications make it possible to develop portable applications independent of a particular language or a particular encoding of characters. The specifications are consistent with related specifications from X/Open Portability Guide, Release 3, and ANSI-C. The reader is assumed to be familiar with those, particu- larly with the notion of locale in the C language, therefore they will not be detailed here. Copyright c 1990 by the Massachusetts Institute of Technology. Permission to use, copy, modify, and distribute this documentation for any pur- pose and without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. MIT makes no represen- tations about the suitability for any purpose of the information in this docu- ment. It is provided "as is" without express or implied warranty. This docu- ment is only a draft standard of the MIT X Consortium and is therefore subject to change. 1 XIM Public Review Draft X Window System is a trademark of the Massachusetts Institute of Technology. 2 XIM Public Review Draft 1. Input Method Overview The next paragraphs provide definitions for terms and concepts used in the specification, and a brief overview of the intended use of the abstractions developed for Xlib internationalization. 1.1. What are Input Methods ? A large number of languages in the world rely on an alphabet, a small set of symbols (letters) used to form words. To enter text into a computer in an alphabetic language a user usually has a keyboard on which there exists key symbols corresponding to the alphabet. Sometimes, a few characters of an alphabetic language are missing on the keyboard. Many computer users, who speak a Latin alphabet based language only have a English-based keyboard. They need to hit a combination of keystrokes in order to enter a character that does not exist directly on the keyboard. A number of algorithms have been developed for entering such characters, known as European input methods, or compose input method, or dead-keys input method. In some alphabetic languages, the rendering of characters strings is context sensitive. When entering characters in those languages, a keystroke does not systematically mean appending a new symbol at the end of the string. It may modify the existing strings. Both input and output methods may be used in such languages. With an ideographic writing system, rather than taking a small set of symbols and combining them in different ways to create words, each word consists of one unique symbol (or, occasionally, several symbols). The number of symbols may be very large: 150 000 have been identified in Hanzi, the Chinese ideographic system. There are two major aspects of ideographics system for their computer usage. First, the standard computer character sets in Japan, China, and Korea include roughly 8 000 characters, while sets in Taiwan have between 15 000 and 30 000 characters, which make it necessary to use more than one byte to represent a character. Second, it obviously is impractical to have a keyboard that includes all of a given language's ideographic symbols. Therefore a specific mechanism is required for entering characters so that a keyboard with a reason- able number of keys can be used. Those input methods are usually based on the language's phonetics, but there also exist methods based on the graphics pro- perties of characters. In addition to the ideographic characters, a number of languages often also include a phonetic (alphabetic-based) writing system. The phonetic signs are then engraved on the keyboard and the keystrokes are transformed to their appropriate ideographic counterparts. Here's a brief description of the Japanese and Korean phonetic systems: o Japanese: There are two phonetic symbol sets: katakana and hiragana. In gen- eral, you use katakana for words that are of foreign origin, and hiragana for writing native Japanese words. Collectively, the two systems are called kana. Each set consists of approximately 50 characters. You type either kana or English characters and define the region that you want to convert to 3 XIM Public Review Draft kanji. Several kanji characters may have the same phonetic representation. If that's the case with your string, you get a menu of characters and choose the appropriate one. If no choice is necessary, the input method does the substitution directly. When Latin characters are converted to kana or Kanji, it is called a romaji conversion. o Korean: Hangul is a writing system that actually straddles the line between phonetic and ideographic. It's phonetic in the sense that each of the roughly 25 characters represents a specific sound. But between two and five of the characters are combined to form syllables, and these syllables are the basic units on which text processing is done. For example, a delete operation works on a syllable rather than the individual characters within it. And Korean code sets include several thousands of these syllables. You type the hangul characters that make up the syllables of the words you're entering. The display changes as you enter each hangul letter. That is, when you enter the first letter, it fills the entire space that the final syll- able will take up. When you enter the second, the first shrinks to about half its size to make room for the second. When you enter the third, the first two shrink again. And so on, up to the maximum of five letters in a syllable. It's usually acceptable to keep Korean text in hangul form, but some words are more commonly written in hanja. If you want to change hangul to hanja, you define the region to be converted, and follow the same basic method as described for Japanese. Probably because there are well-accepted phonetic writing systems for Japanese and Korean, computer input methods for those languages are fairly standard. Keyboard keys have both English characters and the local language's phonetic symbols engraved on them. You can then switch the keyboard from English to local mode and vice versa. The situation is different for Chinese. While there is a phonetic system called Pinyin promoted by authorities, there is no consensus for entering Chinese text. Some vendors use a phonetic decomposition (Pinyin or another), others use ideographic decomposition of Chinese words, with various implementations and keyboard layouts. There are about 16 known methods, none of which is a clear standard. Also, there are actually two ideographic sets used: Traditional Chinese, (the original written Chinese) and Simplified Chinese. Several years back, the People's Republic Of China launched a campaign to simplify some ideographic characters and eliminate redundancies all together. Under the plan, characters would be streamlined every five years. Characters have been revised several times now, resulting in the smaller, simpler set that makes up Simplified Chinese. 1.1.1. Input Method Architecture As shown in the previous paragraphs, there are many different input methods in use today, varying with language, culture, and history. A common feature of many input methods is that the user may type multiple keystrokes in order to compose a single character (or set of characters). The process of composing characters from keystrokes is called pre-editing. It may require complex 4 XIM Public Review Draft algorithms and large dictionaries involving substantial computer resources. Input methods may require one or more areas in which to show the feedback of the actual keystrokes, to propose disambiguation to the user, to list dic- tionaries, and so on. The input method areas with which we are concerned in this specification are as follows. The Status area is intended to be a logical extension of the LED's that exist on the physical keyboard. It is an output-only window which is intended to present the internal state of the input method that is criti- cal to the user. The status area may consist of text data and bitmaps or some combination. The PreEdit area is intended to display the intermediate text for those languages that are composing prior to the client handling the data. The Auxiliary area is used for pop-up menus and customizing dialogs that may be required for an input method. There may be multiple Auxiliary areas for any input method. Auxiliary areas are managed by the input method independent of the client. Auxiliary areas are assumed to be a separate dialog which is maintained by the input method. There are various user interaction styles used for pre-editing. The ones that this specification addresses are as follows. For on-the-spot input methods, pre-editing data will be displayed in the application window. Application data is moved to allow pre-edit data to be displayed at the point of insertion. Over-the-spot pre-editing means that the data is displayed in an input method window that is placed over the point of insertion. Off-the-spot pre-editing means that the pre-edit window is inside the client window, but not at the point of insertion. Often this type of win- dow is placed at the bottom of the client window. Root-window pre-editing refers to input methods that use a pre-edit window that is the child of RootWindow. It would require a lot of computing resources if portable applications had to include input methods for all the languages in the world. To avoid this, the goal of these specifications is to allow an application to communicate with an input method placed in a separate process. Such a process is called an input server. The server to which the application should connect is dependent upon the environment when the application is started up: what is the user language, the actual encoding to be used for it. We will say that input method connec- tion is locale dependent. It is also user dependent: for a given language, the user can choose to some extent the user interface style of input method (if choice is possible among several). Using an input server implies communication overhead, but applications can be migrated without relinking. Specifications in this document have been designed so input methods can be implemented either as a stub communicating to an input server or as a local library. 5 XIM Public Review Draft An input method may be based on a front-end or a back-end architecture. In front-end, there are two separate connections to the X server: keystrokes go directly from X server to the input method on one connection, other events to the regular client connection. The input method is then acting as a filter, and sends composed strings to the client. Front-end requires synchronization between the two connections to avoid lost key events or locking issues. In back-end, a single X server connection is used. A dispatching mechanism must decide on this channel to delegate appropriate keystrokes to the input method. For instance, it may retain a Help keystroke for its own purpose. In the case where the input method is a separate process (i.e., a server), there must be a special communication protocol between the back-end client and the input server. Front-end introduces synchronization issues and filtering mechanism for non- character keystrokes (Functions, Help, etc). Back-end sometimes implies more communication overhead and more process switching. If all three processes are running on a single workstation (X server, input server, client) there are two process switch for each keystroke in back-end, but only one in frontend. The abstraction used by a client to communicate with an input method is an opaque data structure represented by the XIM data type. This data structure is returned by the XOpenIM function, which opens an input method on a given display. Subsequent operations on this data structure encapsulate all communi- cation between client and input method. There is no need for an X client to use any networking library or natural language package in order to use an input method. The specifications are not meant to provide explicit support to multi-lingual clients (using several languages), but they make it possible to implement such clients. For each language, a client has to open an input method for that language. Other functions will execute within the context of a given input method. Characters from the various languages are represented in a computer using an encoding. Different languages have different encodings, and there are even dif- ferent encodings for the same characters in the same language. A client pro- gram that can run using any encoding without any change in the source code is said to be codeset independent. These specifications do not have specific requirements concerning languages or encodings supported by an input method or input server. A single input server may be used for one or more languages, supporting one or more encoding schemes. But the strings returned from an input method will always be encoded in the locale that was the current locale when the input method was opened. 1.2. Input Context The specifications provide the ability to manage a multi-threaded state. A client may be using multiple windows, each window with multiple text entries, and the user possibly switching among them at any time. The abstraction for representing state of a particular input thread is called an input context. The Xlib representation of an input context is an XIC. 6 XIM Public Review Draft An input context is the abstraction retaining the state, properties and seman- tics of communication between a client and an input method. An input context is a combination of an input method, a locale specifying the encoding of the character strings to be returned, a client window, internal state information and various layout or appearance characteristics. The input context concept somewhat matches for input the graphics context abstraction defined for graph- ics output. One input context belongs to exactly one input method. Different XIC's may be associated with the same input method, possibly with the same client window. An input context is created with the XCreateIC function, providing an XIM argument, affiliating the XIC to the input method for its lifetime. When an input method is closed with XCloseIM, all of its affiliated input context's should not be used any more (and preferably be destroyed too). Considering the example of a client window with multiple text entries windows, the application programmer could for example choose to implement: o As many input contexts are created as text entries and the client will get the input accumulated on each context each time it will lookup that context. o A single context is created for a top level window in the application. If such window contains several text entries, each time the user moves to another text entry, the client has to indicate changes in the context. A range of choices can be made by application designers to use either a single or multiple XIC's, according to the needs of their application. 1.3. Getting Input In order to obtain characters from an input method a client must call the func- tion XmbLookupString or XwcLookupString (noted as X*LookupString) with an XIC created from that XIM. Both a locale and display are bound to an input method when it is opened and an XIC inherits this locale and display. Any strings returned by X*LookupString will be encoded in that locale. These functions are similar to XLookupString in X11 Release 4. One difference from XLookupString is that X*LookupString returns a Status. A programmer cal- ling X*LookupString should check this status value to know if any valid input is being returned. If no input has been composed it will return a None status. >From the very nature of input methods, it may take multiple keystrokes before it returns a character or a string. To internationalize an X application, pro- grammers should change the code so that each time it was receiving a key (press) event and called XLookupString, it would now call X*LookupString, and additionally check that something is returned and behave accordingly. Typi- cally, a test should be inserted so that no action is taken if nothing is returned. 1.4. Focus management For each text entry object which is doing input using either of the X*LookupString routines there will be an associated IC. When a text entry object gets the application focus, it is the job of that text 7 XIM Public Review Draft entry object to set the IC focus to the corresponding IC. The IC focus is set by calling XSetICFocus with the appropriate IC. Also, when a text entry object looses the application focus, that text entry object should call XUnSetICFocus. As an optimization, if XSetICFocus is called successively on two different XIC's, setting the focus on the second IC will unset the focus on the first XIC. Note that in order to set and unset the XIC focus correctly it will be neces- sary for a toolkit (or application) to track focus changes. Such focus changes do not necessarily correspond to X server focus changes. If a toolkit (or application) is using a single XIC to do input for multiple text entry objects, it will also be necessary for that text entry object to set the focus window of the XIC whenever the focus window changes. (see XNFocusWindow under XSetICValues). 1.5. Geometry Management In most input method architectures, (on-the-spot being the notable exception) the input method will perform the display of its own data. In order to provide better visual locality, it is often desirable to have the input method areas embedded within a client. In order to do this the client may need to allocate space for an input method. This spec provides support that allows the size and position of input method areas to be provided by a client. The input method areas that are supported for geometry management are the Status area and the PreEdit area. The fundamental concept on which geometry management for input method windows is based is the proper division of responsibilities between the client (or toolkit) and the input method. The division of responsibilities is as follows. o The client is responsible for the geometry of the input method window. o The input method is responsible for the contents of the input method window. An input method is able to suggest a size to the client, but it cannot suggest a placement. Also the input method can only suggest a size. It does not deter- mine the size and it must accept the size it is given. Before a client provides geometry management for an input method it must deter- mine if geometry management is needed. The input method indicates the need for geometry management by setting XIMPreEditArea or XIMStatusArea in its XIMStyles value returned by XGetIMValues. When a client has decided that it will provide geometry management for an input method, it indicates that decision by setting the XNInputStyle value in the XIC. After a client has established with the input method that it will will do geometry management, the client must negotiate the geometry with the input method. The geometry is negotiated by the following steps. o The client suggests an area to the input method by setting the IC's AreaNeeded value for that area. If the client has no constraints for the input method it either will not suggest an area or will set the width and 8 XIM Public Review Draft height to zero. Otherwise it will set one of the values. o The client will get the XIC value AreaNeeded. The input method will return its suggested size in this value. The input method should pay attention to any constraints suggested by the client. o The client sets the XIC value Area to inform the input method of the geometry of its window. The client should try to honor the geometry requested by the input method. The input method must accept this geometry. Clients doing geometry management must be aware that setting other IC values may affect the geometry desired by an input method. For example, FontSet and LineSpacing may change the geometry desired by the the input method. The table of XIC values in section 3 indicates the values that can cause the desired geometry to change when they are set. It is the responsibility of the client to re-negotiate the geometry of the input method window when it is needed. In addition the specification provides a geometry management callback by which an input method can initiate a geometry change. 1.6. Filtering A filtering mechanism is provided to allow input methods to capture X events transparently to clients. It is expected that toolkits (or clients) using X*LookupString will call this filter at some point in the event processing mechanism to make sure that events needed by an input method can be filtered by that input method. If there were no filter, a client could receive and discard events that are necessary for the proper functioning of an input method. A few examples of such events are: o Expose events on pre-edit window in local mode. o Events may be used by an input method to communicate with an input server. Such input server protocol related events have to be intercepted if one does not want to disturb client code. o Key events can be sent to a filter before they are bound to translations such as Xt provides. Clients are expected to get the IC value XNFilterEvent and augment the event mask for the client window with that event mask. This mask may be NULL. 1.7. Callbacks When an on-the-spot input method is implemented, only the client can insert/delete pre-edit data in place, and possibly scroll existing text. This means the echo of the keystrokes has to be achieved by the client itself, tightly coupled with the input method logic. When a keystroke is entered, the client calls X*LookupString. At this point, 9 XIM Public Review Draft in the on-the-spot case, the echo of the keystroke in the pre-edit has not yet been done. Before returning to the client logic that handles the input charac- ters, X*LookupString must call the echoing logic for inserting the new keys- troke. If the keystrokes entered so far make up a character, the keystrokes entered need to be deleted, and the composed character will be returned. Hence, what happens is that, while being called by client code, input method logic has to call back the client before it returns. As with the Xt toolkit, the client code, i.e a callback routine, is called from the input method logic. There are a number of cases where the input method logic has to call-back the client. Each of those cases is associated with a well-defined callback action defined by these specifications. It is possible for the client to specify, for each input context, what callback is to be called for each action. There are also callbacks provided for feedback of status information and a callback to initiate a geometry request for an input method. 2. Programming Interfaces. Input method programming interface consists of a set of functions and data types starting with prefix X. The usual Xlib programming conventions apply to X function calls, including the two new resources XIM and XIC. Most X interfaces have arguments which conform to ANSI-C variable argument list calling convention. Each procedure in the sequel denoted with a "..." argument takes a variable length list of name and value pairs where each name is of type XIMString and each value of type XIMValue. The end of the list is identified by a name argument containing NULL. XIMValue is an implementation dependent typedef, which has to be large enough to contain void * in ANSI-C implementation, and any kind of pointer or long data in other C implementations. typedef char * XIMString; typedef void (*XIMProc)(); typedef SOMETHING XIMValue; A variable length argument list may contain a nested list. If the name XNestedList is specified in place of an argument name, then the following value is interpreted as a XVaNestedList value which specifies a list of values logi- cally inserted into the original list at the point of declaration. The end of a nested list is identified with a NULL name. To dynamically allocate a nested variable argument list, use XCreateNestedList. #define XNVaNestedList "XNVaNestedList" typedef void * XVaNestedList; XVaNestedList XVaCreateNestedList(dummy, ...) int dummy; ANSI-C requirement for variable arguments. ...; specifies the variable length argument list. 10 XIM Public Review Draft XVaCreateNestedList allocates memory and copies its arguments into a single list pointer which may be used as value for arguments requiring a list value. Any entries are copied as specified. Data passed by reference is not copied; the caller must ensure data remains valid for the lifetime of the nested list. The list should be freed using XFree when no longer needed. 2.1. Opening, Closing, Querying Input Method The functions to open and close a connection are XOpenIM and XCloseIM XIM XOpenIM(dpy, rdb, res_name, res_class) Display *dpy; specifies the display where the input method operates XrmDataBase rdb; XString res_name; XString res_class; XOpenIM opens an input method, matching the current locale and modifiers specification. Current locale and modifiers are bound to the input method at opening time. The locale associated with an input method cannot be changed dynamically. This implies the strings returned by X*LookupString (see below), for any IC affiliated with a given input method, will be encoded in the locale current at the time input method is opened. The specific input method to which this call will be routed is identified on the basis of the current locale. XOpenIM will identify a default input method corresponding to the current locale. That default can be modified using XSetMo- difier for the input method modifier. Argument rdb is the resource database to be used by the input method for look- ing up resources that are private to the input method. It is not intended that this database be used to look up values that can be set as IC values in an input context. If rdb is NULL, no data base is passed to the input method. Arguments res_name and res_class specify the resource name and class of the application. They are intended to be used as prefixes by the input method when looking up resources that are common to all input contexts that may be created for this input method. The characters used for resource names and classes must be in the X portable character set. The resources looked up are not fully specified if res_name or res_class is NULL. XOpenIM returns NULL if no input method could be opened. Status XCloseIM(im) XIM im; XCloseIM closes the input method. For querying input method use XGetIMValues. void XGetIMValues(im, ...) XIM im; specifies the queried input method. ...; specifies the variable length argument list to query im values. 11 XIM Public Review Draft XGetIMValues presents a variable argument list programming interface for query- ing properties or features of the input method. Only one argument is defined by this version of the specifications: XNQueryInputStyle, that must be used to query about input styles supported by the input method. A client should always query the input method to determine what styles are sup- ported. The client should then find an input style it is capable of support- ing. If the client is not capable of meeting any of the requirements for input methods, it should ensure that the style XIMNeedNothing or XIMNeedNone is sup- ported. If the client cannot find an input style that it can support it should nego- tiate with the user the continuation of the program (exit, choose another input method, ...). The argument value must be a pointer to a location where the returned value will be stored. The returned value is a pointer to a structure of type XIM- Styles. An XIMStyles structure contains in its field count_styles the number of input styles supported. This is also the size of the array in the field supported_styles. Each element in the array represents a different input style supported by this input method. The value is of type XIMStyle. It is a bit mask in which the input method indicates its requirements, should this style be selected. These requirements fall into the following categories. Preedit: this category defines what type of support is provided by the input method for pre-edit information: XIMPreEditArea If chosen, the input method would require the client to provide some area values for it to do its preediting. Refer to IC values XNArea and XNAreaNeeded. XIMPreEditPosition If chosen, the input method would require the client to provide positional values. Refer to IC values XNSpotLo- cation + XNFocusWindow. XIMPreEditCallbacks If chosen, the input method would require the client to define the set of pre-edit callbacks. Refer to IC values XNPreEditStartCallback, XNPreEditDoneCallback, XNPreEditDrawCallback, XNPreEditCaretCallback. XIMPreEditNothing If chosen, the input method can function without any PreEdit values. XIMPreEditNone The input method does not provide any PreEdit feedback. Any PreEdit value is ignored. This style is mutually exclusive with the other XIMPreEdit styles. Status: this category defines what type of support is provided by the input 12 XIM Public Review Draft method for status information: XIMStatusArea The input method requires the client to provide some area values for it to do its Status feedback. Refer to XNArea and XNAreaNeeded. XIMStatusCallbacks The input method requires the client to define the set of status callbacks; XNStatusStartCallback, XNStatus- DoneCallback, XNStatusDrawCallback. XIMStatusNothing The input method can function without any Status values. XIMStatusNone The input method does not provide any Status feedback. If chosen, any Status value is ignored. This style is mutually exclusive with the other XIMStatus styles. Clients are responsible for freeing the XIMStyles data structure, using XFree. typedef unsigned short XIMStyle; #define XIMPreEditArea 0x0001L #define XIMPreEditCallbacks 0x0002L #define XIMPreEditPosition 0x0004L #define XIMPreEditNothing 0x0008L #define XIMPreEditNone 0x0010L #define XIMStatusArea 0x0100L #define XIMStatusCallbacks 0x0200L #define XIMStatusNothing 0x0400L #define XIMStatusNone 0x0800L typedef struct { unsigned short count_styles; XIMStyle * supported_styles; } XIMStyles; 3. Input Context An input context is an abstraction used to contain the data required (if any) by an input method and the information required to display that data. There may be multiple input contexts for one input method. The programming inter- faces for creating, reading or modifying an input context use a variable argu- ment list. The name elements of the argument lists are referred to as IC values. It is intended that input methods be controlled by these IC values. As new IC values are created they should be registered with the X Consortium. To create an input context use XCreateIC. XIC XCreateIC(im, ...) XIM im; the attached input method. ...; specifies the variable length argument list to set slot values. 13 XIM Public Review Draft XCreateIC creates a context within an input method. Some of the arguments are mandatory at creation time. The XIC will not be created if they are not provided. Those arguments are the input style and the set of text callbacks. (if the input style selected requires callbacks). All other input context values can be set later. XCreateIC will return a NULL value if no XIC could be created. A NULL value could be returned for any of the following reasons: a required argument was not set, a read-only argument was set (e.g. XNFilterEvents), the argument name is not recognized, or the input method encountered an input method implementation dependent error. The asynchronous errors that can be caused by XCreateIC are BadStyle, BadWin- dow, BadAtom, BadColormap, BadPixmap The function XDestroyIC destroys an input context. void XDestroyIC(ic) XIC ic; ic must be a valid input context id. Use functions XSetICFocus and XUnSetICFocus to communicate to and synchronize with input method for any changes in keyboard focus from the client side. void XSetICFocus(ic) XIC ic; specifies the focussed XIC XSetICFocus(ic) allows a client to notify an input method that the focus window attached to the ic argument has received keyboard focus. The input method should take action to provide appropriate feedback. Complete feedback specifi- cation is a matter of user interface policy, beyond the scope of these specifi- cations. void XUnSetICFocus(ic) XIC ic; specifies the focussed XIC XICUnsetFocus allows a client to notify an input method that the ic has lost the keyboard focus and no more input is expected on the focus window attached to the specified ic. The input method should take action to provide appropri- ate feedback. Complete feedback specification is a matter of user interface policy, beyond the scope of these specifications. To reset the state of an input context to initial state use either XmbResetIC or XwcResetIC. char * XmbResetIC(ic) XIC ic; specifies the XIC to be reset 14 XIM Public Review Draft XmbResetIC resets input context to initial state. Any input pending on that context is deleted. Input method is required to clear pre-edit area, if any, and update status accordingly. Calling XResetIC does not change the focus. The return value of XmbResetIC is its current pre-edit string in multi-byte format. It is input method implementation dependent whether this routine ever returns any data. The client should free this string using XFree. char * XwcResetIC(ic) XIC ic; specifies the XIC to be reset XwcResetIC resets input context to initial state. Any input pending on that context is deleted. Input method is required to clear pre-edit area, if any, and update status accordingly. Calling XwcResetIC does not change the focus. The return value of XwcResetIC is its current pre-edit string in wide-char for- mat. It is input method implementation dependent whether this routine ever returns any data. The client should free this string using XFree. 3.1. Utility functions To get the XIM associated with an XIC, use XIMOfIC. XIM XIMOfIC(ic) XIC ic; To get the Display associated with an input method, use XDisplayOfIM. Display * XDisplayOfIM(im) XIM im; To get the locale associated with an input method, use XLocaleOfIM. char * XLocaleOfIM(im) XIM im; 3.2. Modifying Input Contexts: XSetICValues and XGetICValues Two functions allow for setting and reading XIC slots, respectively: XSet- ICValues and XGetICValues. Both functions have a variable length argument list. In that argument list, any slot name must be denoted with a character string using the X portable character set. char * XSetICValues(ic, ...) XIC ic; specifies the input context to be changed ... ; specifies the variable length argument list to get slot values. 15 XIM Public Review Draft Argument ic must be a valid input context id. A value to be set must be an appropriate data, matching the data type imposed by the semantics of the argument. Returns NULL if no error occurred, otherwise the name of the first argument that could not be set. An argument could be not set for any of the following reasons: a read-only argument was set (e.g. XNFilterEvents), the argument name is not recognized, or the input method encountered an input method implementa- tion dependent error. The asynchronous errors that can be caused by XSetICValues are BadWindow, BadA- tom, BadColormap, BadPixmap char * XGetICValues(ic, ...) XIC ic; ...; specifies the variable length argument list to get slot values. Argument ic must be a valid input context id. Any argument value in a variable argument list (following a name) must point to a location where the value is to be stored. XGetICValues will allocate memory to store the values, and client is responsible for freeing it, using XFree. Returns NULL if no error occurred, otherwise the name of the first argument that could not be obtained. An argument could be not obtained for any of the following reasons: the argument name is not recognized, or the input method encountered an input method implementation dependent error. 3.3. IC Values Arguments The following tables describe how IC values are interpreted by an input method depending on the input style chosen by the user. The first column lists the IC values. The second column indicates which values are involved in affecting, negotiating and setting the geometry of the input method windows. The sub-entries under the third column indicate the different input styles supported. Each of these columns indicates how each of the IC values are treated by that input style. 16 XIM Public Review Draft ___________________________________________________________________________________________ | || ||__________________________________________________| | || Geometry ||PreEdit | PreEdit | PreEdit | PreEdit | PreEdit | | IC Value ||Management ||Callback | Position | Area | Nothing | None | ______________________________________________________________________________________| |Input Style || || C-G | C-G | C-G | C-G | C-G | |Client Window || || O-G | O-G | O-G | ignored | ignored | |Focus Window || GN || D-S-G | D-S-G | D-S-G | D-S-G | ignored | |Resource Name || ||ignored | D-S-G | D-S-G | D-S-G | ignored | |Resource Class || ||ignored | D-S-G | D-S-G | D-S-G | ignored | |Geometry Callback || ||ignored | ignored | D-S-G | ignored | ignored | ______________________________________________________________________________________| |PreEdit || || | | | | | |- Area || GS ||ignored | D-S-G | D-S-G | ignored | ignored | |- AreaNeeded || GN-GR ||ignored | ignored | S-G | ignored | ignored | |- SpotLocation || ||ignored | C-S-G | ignored | ignored | ignored | |- Colormap || ||ignored | D-S-G | D-S-G | D-S-G | ignored | |- Fg/Bg || ||ignored | D-S-G | D-S-G | D-S-G | ignored | |- Bg Pixmap || ||ignored | D-S-G | D-S-G | D-S-G | ignored | |- FontSet || GN ||ignored | C-S-G | C-S-G | D-S-G | ignored | |- LineSpacing || GN ||ignored | D-S-G | D-S-G | D-S-G | ignored | |- Cursor || ||ignored | D-S-G | D-S-G | D-S-G | ignored | |- PreEdit Callbacks || || C-S-G | ignored | ignored | ignored | ignored | |____________________||___________||_________|__________|_________|_________|_________| __________________________________________________________________________ | || || Input Style | | || ||_______________________________________| | IC Value || Geometry || Status | Status | Status | Status | __________________________________________________________________________| |Input Style || || C-G | C-G | C-G | C-G | |Client Window || || O-G | O-G | O-G | ignored | |Focus Window || GN || D-S-G | D-S-G | D-S-G | ignored | |Resource Name || ||ignored | D-S-G | D-S-G | ignored | |Resource Class || ||ignored | D-S-G | D-S-G | ignored | |Geometry Callback || ||ignored | D-S-G | ignored | ignored | |FilterEvents || || G | G | G | G | __________________________________________________________________________| |Status || || | | | | |- Area || GS ||ignored | D-S-G | ignored | ignored | |- AreaNeeded || GN-GR ||ignored | S-G | ignored | ignored | |- Colormap || ||ignored | D-S-G | D-S-G | ignored | |- Fg/Bg || ||ignored | D-S-G | D-S-G | ignored | |- Bg Pixmap || ||ignored | D-S-G | D-S-G | ignored | |- FontSet || GN ||ignored | C-S-G | D-S-G | ignored | |- LineSpacing || GN ||ignored | D-S-G | D-S-G | ignored | |- Cursor || ||ignored | D-S-G | D-S-G | ignored | |___________________||___________||_________|_________|_________|_________| Key: C This value must be set with XCreateIC(). 17 XIM Public Review Draft D This value may be set using XCreateIC(). If not set, a default is pro- vided. G This value may be read using XGetICValues(). GN This IC value may cause geometry negotiation when its value is set via XCreateIC() or XSetICValues(). GR This value will be the response of the input method when any GN value is changed. GS This value will cause the geometry of the input method window to be set. O This value must be set once and only once. It need not be set at IC create time. S This value may be set with XSetICValues(). ignored The IC value is ignored by the input method for the given input style. 3.3.1. Input Style Argument XNInputStyle specifies the input style to be used. The value of this argument must be one of the values returned by function XGetIMValues with argu- ment XNQueryInputStyle in the supported_styles list, otherwise error BadStyle will be raised. This argument must be set at creation time and cannot be changed. 3.3.2. Client Window Argument XNClientWindow specifies to input method the client window in which the input method can display data or create subwindows. Geometry values for input method areas are given with respect to the client window. Dynamic change of client window is not supported. This argument may be set only once. This argument should be set before any input is done using this input context. If it is not set the input method may not operate correctly. If an attempt is made to set this value a second time with XSetICValues, the string "XNClientWindow" will be returned by XSetICValues and the client window shall not be changed. If the client window is not a valid window id on the display attached to the input method this argument can generate a BadWindow error when this value is used by the input method. 3.3.3. Focus Window Argument XNFocusWindow specifies the focus window. The primary purpose of the XNFocusWindow is to identify the window which will receive the key event when input is composed. In addition, the input method may possibly affect the focus window: select events on it, send events to it, modify its properties, grab 18 XIM Public Review Draft keyboard within that window. The value associated to the argument must be of type Window. If the focus win- dow is not a valid window id on the display attached to the input method this argument can generate a BadWindow error when this value is used by the input method. When this slot is left unspecified, input method will default focus window to client window. 3.3.4. Resource Name and Class Arguments XNResourceName and XNResourceClass are strings that represent the full name and class hierarchy used by the client to obtain resources for the client window. These values should be used as prefixes for name and class when looking up resources that may vary according to the IC. If these values are not set, the resources will not be fully specified. It is not intended that values which can be set as IC values be set as resources. 3.3.5. Geometry Callback The argument XNGeometryCallback is a structure of type XIMCallback (see PreEdit/Status Callbacks). The argument XNGeometryCallback specifies the geometry callback which a client can set. This callback is not required for correct operation of either an input method or a client. It can be set for a client whose user interface pol- icy permits an input method to request the dynamic change of that input methods window. An input method that does dynamic change will need to filter any events that it uses to initiate the change. 3.3.6. Filter Events The argument XNFilterEvents will return the event mask that an input methods needs to have selected for. The client is expected to augment its own event mask for the client window with this one. This argument is read-only. It is set by the input method at create time and is never changed. The type of this argument is unsigned long. Setting this value will cause an error. 3.3.7. PreEdit and Status Attributes Arguments XNPreeditAttributes and XNStatusAttributes specify to input method the attributes to be used for the PreEdit and Status areas, if any. Those attributes are passed to XSetICValues or XGetICValues as a nested variable length list. The names to be used in such lists are as described in the next subsection. 19 XIM Public Review Draft 3.3.7.1. Area The value of the argument XNArea must be a pointer to a structure of type XRec- tangle. The interpretation of argument XNArea is dependent on the input method style set in the IC. If the input method style is XIMPreEditPosition, XNArea specifies the clipping region within which preediting will take place. If the focus window has been set the coordinates are assumed to be relative to the focus window. If the focus window has not been set the coordinates are assumed to be relative to the client window. If neither has been set, the results are undefined. If XNArea is not specified the input method will default the clipping region to the geometry of the XNFocusWindow. If the area specified is NULL or invalid the results are undefined. If the input style is XIMPreEditArea or XIMStatusArea, XNArea specifies the geometry provided by the client to the input method. The input method may use this area to display its data, either PreEdit or Status depending on the area designated. The input method may create a window as a child of the client win- dow with dimensions that fit the XNArea. The coordinates are relative to the client window. If the client window has not been set yet, the input method should save these values and apply them when the client window is set. If XNArea is not specified, is set to NULL or is invalid, the results are unde- fined. 3.3.7.2. Area Needed When set, argument XNAreaNeeded specifies the geometry suggested by the client for this area (PreEdit or Status). The value associated with the argument must be a pointer to a structure of type XRectangle. The x, y values are not used. Non-zero values for width or height are constraints that the client wishes the input method to respect. When read, argument XNAreaNeeded specifies the preferred geometry desired by the input method for the area. This argument is only valid if the input style is XIMPreEditArea or XIMSta- tusArea. It is used for geometry negotiation between the client and the input method and has no other effect upon the input method (refer to Geometry Manage- ment.) 3.3.7.3. Spot Location Argument XNSpotLocation specifies to input method the coordinates of the "spot", to be used by an input method executing with XNInputStyle set to XIMPreEditPosition. When specified to any input method other than NeedPosition this slot is ignored. The x coordinate specifies the position where the next character would be inserted. The y coordinate is the position of the baseline used by current text line in the focus window. The x and y coordinates are relative to the focus window if it has been set, else they are relative to the client window. 20 XIM Public Review Draft If neither focus window nor client window has been set the results are unde- fined. The value of the argument is a pointer to a structure of type XPoint. 3.3.7.4. Colormap Two arguments can be used to indicate what colormap the input method should use to allocate colors: one as a colormap XID, the other as a standard colormap name. Argument XNColormap is used to specify a colormap id. Argument value is of type Colormap. This argument may generate a BadColormap error when the colormap is used by the input method. Argument XNStdColormap is used to indi- cate the name of the standard colormap in which input method should to allocate colors. Argument value is an Atom that should be a valid atom for calling XGetStandardColormap. This argument may generate BadAtom or BadColormap error when it is used by the input method. If colormap is left unspecified, it is defaulted to client window colormap. 3.3.7.5. Foreground and background. Arguments XNForeground and XNBackground specifies respectively the foreground and background pixel. Argument value is of type unsigned long. It must be a valid pixel in the input method colormap. Error BadPixel is raised when this argument is used by the input method if pixel is not a valid pixel for the colormap in use by the input method. If these values are left unspecified, the default is determined by the input method. 3.3.7.6. Background pixmap. Argument XNBackgroundPixmap specifies a background pixmap to be used as the background of the window. Slot value must be of type Pixmap. Can generate error BadPixmap when this argument is used by the input method. If this value is left unspecified, the default is determined by the input method. 3.3.7.7. FontSet Argument XNFontSet specifies to input method what fontset is to be used. Argu- ment value is of type XFontSet. If this value is left unspecified, the default is determined by the input method. 3.3.7.8. Line Spacing Argument XNLineSpace specifies to input method what line spacing is to be used in pre-edit window if more than one line is to be used. The slot value is of type int. 21 XIM Public Review Draft If this value is left unspecified, the default is determined by the input method. 3.3.7.9. Cursor Argument XNCursor specifies to input method what cursor is to be used in the specified window. The slot value is of type Cursor. If this value is left unspecified, the default is determined by the input method. 3.3.7.10. PreEdit/Status Callbacks A client that wishes to support the input style XIMPreEditCallbacks must pro- vide a set of pre-edit callbacks to the input method. The set of pre-edit call- backs are: o XNPreEditStartCallback called when the input method starts pre-edit. o XNPreEditDoneCallback called when the input method stops pre-edit. o XNPreEditDrawCallback called when a number pre-edit keystrokes should be echoed. o XNPreEditCaretCallback called to move text insertion point within pre-edit string A client that wishes to support the input style XIMStatusCallbacks must provide a set of status callbacks to the input method. The set of status callbacks are: o XNStatusStartCallback called when the input method initializes status area. o XNStatusDoneCallback called when the input method no longer needs status area. o XNStatusDrawCallback called when updating the status area is required. The value of any status or pre-edit argument is a pointer to a structure of type XIMCallback. typedef struct { XIMValue client_data; XIMProc callback; } XIMCallback; Each callback has some particular semantics and will carry the data expressing the environment necessary to the client into a specific data structure. This paragraph only describes the arguments to be used to set the callback. For a complete description of the semantics see section 4. Setting any of these values while doing preedit may cause unexpected results. 22 XIM Public Review Draft 4. Callbacks semantics Callbacks are functions defined by clients or text drawing packages, to be called from the input method when selected events occur. Most clients will use a text editing package, or a toolkit, and hence will not need to define such callbacks. This section defines the callback semantics, when they are trig- gered, and what their arguments are; it is mostly useful for toolkit implemen- tors. Callbacks are mostly provided so that clients (or text editing packages), can implement on-the-spot pre-editing in their own window. In that case, the input method needs to communicate and synchronize with the client. Input method needs to communicate changes in the pre-edit window when it is under control of the client. Those callbacks allow the client to initialize the pre-edit area, display a new pre-edit string, move the text insertion point inside pre-edit, terminate pre-edit, update the status area. All callback functions follow the generic prototype: void CallbackPrototype(ic, client_data, call_data) XIC ic; specifies the originator of callback. XIMValue client_data; specifies additional client data. XCallbackStruct *callback_data; specifies specific callback data. The callback_data is a structure expressing the arguments needed to achieve the semantics: a specific data structure appropriate to the callback. In cases where no data is needed in the callback, this callback_data is NULL. The client_data argument is a closure, initially specified by the client when specifying the callback and passed back. It may serve, for example, to inherit application context in the callback. The following paragraphs describe the semantics and specific data structure associated with the different reasons. 4.1. Geometry Callback The geometry callback is triggered by the input method to indicate that it wants the client to negotiate geometry. void GeometryCallback(ic, client_data, call_data) XIC ic; specifies the originator of callback. XIMValue client_data; client data. void * call_data; specific callback data. GeometryCallback is called with a NULL call_data argument. 4.2. PreEdit State Callbacks When the input method turns input conversion on or off, PreEditStartCallback or PreEditDoneCallback is triggered in order to let the toolkit do the setup or the cleanup for the pre-edit region. 23 XIM Public Review Draft int PreEditStartCallback(ic, client_data, call_data) XIC ic; specifies the originator of callback. XIMValue client_data; client data. void * call_data; specific callback data. When pre-edit starts on the specified ic, the callback is called, with a NULL call_data argument. PreEditStartCallback will return the maximum size of the pre-edit string. A positive number indicates the maximum number of bytes allowed in the pre-edit string, a value of -1 indicates there is no limit. void PreEditDoneCallback(ic, client_data, call_data) XIC ic; specifies the originator of callback. XIMValue client_data; client data. void * call_data; specific callback data. When pre-edit stops on the specified ic, the callback is called, with a NULL call_data argument. The client can release the data allocated by PreEditStart- Callback. PreEditStartCallback should initialize appropriate data needed for displaying pre-edit information and for handling further PreEditDrawCallback calls. Once PreEditStartCallback is called, it shall not be called again before PreEdit- DoneCallback has been called. 4.3. PreEditDraw Callback This callback is triggered to draw and insert, delete or replace, pre-edit text in the pre-edit region. The pre-edit text may include unconverted input text such as Japanese kana, converted text such as Japanese Kanji characters, or characters of both kinds. That string is either a multi-byte or wide-character string, whose encoding matches the locale bound to the XIC. The callback proto- type is as follows: void PreEditDrawCallback(ic, client_data, call_data) XIC ic; the originator of callback. XIMValue client_data; client data. XIMPreEditDrawCallbackStruct *call_data; callback data. The callback is passed a XIMPreEditDrawCallbackStruct structure in the call_data argument. The text member of this structure contains the text to be drawn. After the string has been drawn, the caret should be moved to the specified location. typedef struct _XIMPreEditDrawCallbackStruct { int caret; /* Cursor offset within pre-edit string */ int chg_first; /* Starting change position */ int chg_length; /* Length of the change in character count */ XIMText text; } XIMPreEditDrawCallbackStruct ; 24 XIM Public Review Draft The client must keep updating a buffer of the pre-edit text, the callback argu- ments referring to indexes in that buffer. The call_data fields have specific meanings according to the operation: o To indicate text deletion, the call_data specifies a NULL text field. The text to be deleted is then the current text in buffer from position chg_first (starting at zero) on a (character) length of chg_length. o When text is non-NULL it indicates insertion or replacement of text in the buffer. A positive chg_length indicates that the characters starting from chg_first to ch_first+chg_length must be deleted, and replaced by text, whose length is specified in the XIMText structure. A chg_length value of 0 indicates that text must be inserted right at the position specified by chg_first. A value of 0 for chg_first specifies the first character in the buffer. o caret: index in the the pre-edit text buffer specifying the character after which the cursor should move after text has been drawn or deleted. typedef struct _XIMText { unsigned short length; XIMFeedback * feedback; Bool encoding_is_wchar; union { char * multi_byte; wchar_t * wide_char; } string; } XIMText; The text string passed is actually a structure specifying: o length: the text length in characters. o encoding_is_wchar: indicates if the string is passed encoded in wide charac- ter or multi-byte. o string: the text string. o feedback: indicates rendering type. The feedback field express the types of rendering feedback the callback should apply when drawing text. Rendering of the text to be drawn is specified either in generic ways (e.g. primary, secondary) or in specific ways (reverse, under- line). When generic indications are given, the client is free to choose the rendering style. It is necessary however that primary and secondary are mapped to two distinct rendering styles. The feedback field specifies how the rendering of the text argument should be achieved. If feedback is NULL, then rendering is assumed to be the same as rendering of other characters in the text entry. Otherwise, feedback specifies 25 XIM Public Review Draft an array defining the rendering of each character of the string (hence the length of the array is length). If an IM wishes to indicate that it is only updating the feedback of the pre- edit text without changing the content of it, XIMText should contain a NULL value for the string field, the number of characters affected in the length field and the feedback field should point to an array of XIMFeedback. Each element in the array is a bit mask represented by a value of type XIMFeed- back. The valid masks names are as follows. typedef unsigned char XIMFeedback; #define XIMReverse 1L #define XIMUnderline (1L<<1) #define XIMHighlight (1L<<2) #define XIMPrimary (1L<<6) #define XIMSecondary (1L<<7) #define XIMTertiary (1L<<8) 4.4. PreEditCaretCallback An input method may have its own "navigation keys" to allow the user to move the text insertion point in the pre-edit area (e.g. move backward or forward). Consequently, input method needs to indicate to the client that it should move the text insertion point. It then calls the PreEditCaretCallback void PreEditCaretCallback(ic, client_data, call_data) XIC ic; the originator of callback. XIMValue client_data; specifies additional client data. XPreEditCaretCallbackStruct *call_data; specific callback data. Input method will trigger PreEditCaretCallback to move the text insertion point during pre-edit. The call_data argument contains a pointer to an XPreEditCaret- Callback structure. This structure indicates where the caret should be moved. The callback must move the insertion point to its new location and return, in field position, the new offset value from initial position. typedef struct _XIMPreEditCaretCallbackStruct { int position; /* Caret offset within pre-edit string */ XIMCaretDirection direction; /* Caret moves direction */ XIMCaretStyle style; /* Feedback of the caret */ } XIMPreEditCaretCallbackStruct ; typedef enum { XIMInvisible, /* Disable caret feedback */ XIMPrimary, /* UI defined caret feedback */ XIMSecondary, /* UI defined caret feedback */ } XIMCaretStyle; 26 XIM Public Review Draft typedef enum { XIMForwardChar, XIMBackwardChar, XIMForwardWord, XIMBackwardWord, XIMCaretUp, XIMCaretDown, XIMNextLine, XIMPreviousLine, XIMLineStart, XIMLineEnd, XIMAbsolutePosition, XIMDontChange } XIMCaretDirection; The meaning of those values are: o XIMForwardChar: Move caret forward one character position o XIMBackwardChar: Move caret backward one character position o XIMForwardWord: Move caret forward one word position o XIMBackwardWord: Move caret backward one word position o XIMCaretUp: Move caret up one line keeping current offset. o XIMCaretDown: Move caret down one line keeping current offset. o XIMPreviousLine: Move caret up one line. o XIMNextLine: Move caret down one line o XIMLineStart: Move caret to beginning of the current display line containing the caret. o XIMLineEnd: Move caret to end of the current display line containing the caret. o XIMAbsolutePosition: The callback must move to the location specified by the position field of the callback data, indicated in characters, starting from the beginning of the pre-edit text. Hence a value of zero means: move back to beginning of the pre-edit text. o XIMDontChange: The caret position does not change. 4.5. Status Callbacks An input method may communicate changes in the status of an input context (created, destroyed, or focus changes), with three status callbacks: Sta- tusStartCallback , StatusDoneCallback , StatusDrawCallback When the XIC is created or when the XIC gains focus, IM calls StatusStartCall- back callback. void StatusStartCallback(ic, client_data, call_data) XIC ic; the originator of callback. XIMValue client_data; specifies additional client data. XIMValue call_data; specific callback data. 27 XIM Public Review Draft The callback should initialize appropriate data for displaying status and be prepared to further StatusDrawCallback calls. Once StatusStartCallback is called, it shall not be called again before StatusDoneCallback has been called. When an XIC is destroyed or when focus is lost by the XIC, IM calls StatusDone- Callback. void StatusDoneCallback(ic, client_data, call_data) XIC ic; the originator of callback. XIMValue client_data; specifies additional client data. XIMValue call_data; specific callback data. The callback may release any data allocated on StatusStart. When an XIC status has to be updated, IM calls StatusDrawCallback. void StatusDrawCallback(ic, client_data, call_data) XIC ic; the originator of callback. XIMValue client_data; specifies additional client data. XIMValue call_data; specific callback data. The callback should update the status area by either drawing a string, or imag- ing a bitmap in the status area. typedef enum { TextType, Bitmaptype, } XIMStatusDataType; typedef struct _XIMStatusDrawCallbackStruct { XIMStatusDataType type; union { XIMText text; Pixmap bitmap; } data; } XIMStatusDrawCallbackStruct ; 5. Filtering Xlib provides the ability for an input method (or any other code) to register a filter with Xlib. This filter is called by a client (or toolkit) by calling XFilterEvent after calling XNextEvent. Any client that uses the XIM interface should call XFilterEvent to allow input methods to process their events without knowledge of the client's dispatching mechanism. A client's user interface policy may determine the priority of event filters with respect to other event handling mechanisms, (e.g. modal grabs). A package that wants to do event filtering, e.g. an input method, must register its filter with the filtering machinery. It can add or remove filters using the two functions XRegisterFilter, XUnRegisterFilter There may be zero or more filters for the same event. Clients may not know how many filters there are, 28 XIM Public Review Draft if any, and what they do. They may only know if an event has been filtered on return of XFilterEvent. Clients should discard filtered events. Boolean XFilterEvent(evt, window) XEvent * evt; Window window; specifies the window for which this filter should be applied XFilterEvent is called with an XEvent and a Window. Window specifies the win- dow for which this filter should be applied. If window is NULL, the window from evt is applied. Window is provided so that layers above Xlib that do event redirection can indicate to which window an event has been redirected. XFilterEvent searches its list of filters for a filter that matches the display and event type from the event and window. When XFilterEvent finds a filter that matches it will call that filter. If that filter returns True, XFil- terEvent immediately returns True, without looking for more filters. If no filters are found that filter the event, False is returned. Filters are called in the order in which they were registered. If a grab has occurred in the client, and the filter is returning True, the client should ungrab the keyboard. To register a filter, use XRegisterFilter void XRegisterFilter(display, window, event_mask, filter, client_data) Display * display; specifies the display for which this filter is being registered Window window; specifies the window for which this filter is being registered unsigned long event_mask; specifies the event mask for which to call the filter. Boolean nonmaskable; specifies whether the filter should be called on the nonmaskable events Boolean (*filter)(); specifies the filter to be called XIMValue client_data; additional client data to be passed to the filter. XRegisterFilter registers a filter with the filtering machinery. This filter will be called on further calls to XFilterEvent for events generated on the specified display and window, when the event matches the mask. If window is NULL, the filter will match for any window value. For each set of display, window, filter, client_data, exactly one filter will be registered. If a filter is registered that matches a currently registered filter, then the specified event_mask augments the existing mask. Clients who want to filter nonmaskable events (GraphicsExpose, NoExpose, SelectionClear, SelectionNotify, SelectionRequest, ClientMessage and MappingNotify) should set nonmaskable to True. XUnRegisterFilter(display, window, filter, client_data) Display * display; specifies the display for which this filter is being removed. Window window; specifies the window for which this filter is being removed. Boolean (*filter)(); specifies the filter that is to be removed XIMValue client_data; specifies client data registered XUnRegisterFilter removes a filter registered with XRegisterFilter. If 29 XIM Public Review Draft display, window, filter and client_data do not match a registered filter, no filter is removed and no error is reported. The filter prototype is as follows. Boolean PrototypeFilter(display, window, evt, f_data) Display * display; the display for which filter is being called. Window window; the window for which filter is being called. XEvent *evt; the triggering event XIMValue client_data; client data previously registered { /* if event is filtered return True, else False */ } A filter function should not remove events from the queue (e.g. call XNex- tEvent). It should decide from context if the event is filtered or not. 6. Getting Composed Input To get composed input from an input method, use XmbLookupString or XwcLookup- String. int XmbLookupString(ic, event, buffer_return, bytes_buffer, keysym_return, status_return) XIC ic; specifies context for input processing. XKeyPressedEvent *event; specifies key press event. char *buffer_return; specifies multibyte string return buffer. int bytes_buffer; specifies space available in return buffer. KeySym *keysym_return; specifies Out: return keysym (if any). Status *status_return; flag specifying what is returned. int XwcLookupString(ic, event, buffer_return, bytes_buffer, keysym_return, status_return) XIC ic; specifies context for input processing. XKeyPressedEvent *event; specifies key press event. wchar_t *buffer_return; specifies wide char return buffer. int wchars_buffer; specifies space available in buffer. KeySym *keysym_return; specifies returned keysym (if any). Status *status_return; flag specifying what is returned. These functions return the string from the input method in buffer_return. If no string is returned buffer_return is unchanged. The keysym into which the keycode from the event was mapped is returned in keysym_return if keysym_return is non-NULL and status indicates that a KeySym was returned. If both a string and a keysym are returned, the keysym value does not necessarily correspond to the string returned. XmbLookupString will return the length of the string in bytes. XwcLookupString will return the length of the string in characters. These functions also detect any rebound keysyms (see XRebindKeysym) and return the specified bytes. since the last call. 30 XIM Public Review Draft The ic argument specifies an input context identifier returned from the XCreateIC() call. Unlike XLookupString, which returns only Latin-1 strings, XmbLookupString and XwcLookupString return text in the codeset of the locale bound to the input method of the specified input context. Note that each string returned by Xmb/wcLookupString begins in the initial state of the codeset of the locale (if the codeset of the locale is state- dependent). Caution: in order to insure proper input processing, it is essential that the client pass only KeyPress events to X*LookupString. The behavior of X*LookupString when the client passes a KeyRelease event is undefined. Clients should check return_status before using the other returned values. These two functions both return in return_status a value indicating what has been returned in the other arguments: o XBufferOverflow means that the input string to be returned is too large for the supplied buffer_return. The required size (XmbLookupString in bytes, XwcLookupString in characters) is returned as the value of the function, and the contents of buffer_return and keysym_return are not modified. The client should recall the function with the same event and a buffer of ade- quate size in order to obtain the string. o XLookupNone means that no consistent input has been composed so far. The contents of buffer_return and keysym_return are not modified, and the func- tion returns 0 as a value. o XLookupChars means some input characters have been composed. They are placed in buffer_return and the string length in octets is returned as the value of the function. The string is encoded in the locale bound to the input context. The contents of keysym_return is not modified. o XLookupKeySym means a KeySym has been returned instead of a string. The keysym is returned in keysym_return. The contents of buffer_return is not modified, and the function returns 0 as a value. o XLookupBoth means that both a KeySym and a string are returned, XKeySym and XString occur simultaneously. It does not make any difference if the input context passed as an argument to X*LookupString is the XIC currently in possession of the focus or not. Input may have been composed within an input context before it lost the focus and that input may be returned on subsequent calls to X*LookupString even though it does not have any more keyboard focus. 7. Conventions The various input method architecture are transparent to the client. However, clients should respect a number of conventions in order to work properly. Clients must also be aware of possible effects of synchronization between input method and library in the case of a remote input server. 31 XIM Public Review Draft 7.1. Client Conventions. A well-behaved client (or toolkit) should first query the input method style. If the client cannot satisfy the requirements of the supported styles (in terms of geometry management or callbacks), it should negotiate with the user con- tinuation of the program, or raise an exception or error of some sort. Of course, clients using a toolkit including an on-the-spot text editing facil- ity of some sort do not need to specify such callbacks. 7.2. Conventions for Input Method Synchronization A KeyPress event with a keycode value of 0 shall be used exclusively as a sig- nal that an input method has composed input which can be return by X*LookupString. No other use shall be made of a Keypress event with keycode 0. A front-end input method shall signal to clients that they have composed input by sending a synthetic KeyPress event to the focus window of the corresponding XIC, with a keycode value of 0. A back-end input method may change the keycode value of a KeyPress event to keycode 0 to indicate that there is data to be gathered from the filter. When callback support is specified by client, input methods will not take action unless they explicitly called back the client and obtained no response (the callback is not specified, or returned invalid data). 8. Acknowledgments This specification was generated after discussion on the mltalk mailing list, in several meetings, and several proposals were made by different entities or people. The contributors to the mltalk group have been: Tim Anderson (Motorola), Alka Badshah (OSF), Gabe Beged-Dov (HP), Chih-Chung Ko (III), Vera Cheng (III), Michael Collins (Digital Equipment Co.), Walt Daniels (IBM), Noritoshi Demizu (OMRON), Keisuke Fukui (Fujitsu), Hitoshoi Fukumoto (Nihon - Sun Microsystems), Tim Greenwood (Digital Equipment Co.), John Harvey (IBM), Fred Horman (AT&T), Vania Joloboff (OSF), Norikazu Kaiya (Fujitsu), Yuji Kamata (IBM), Yutaka Kataoka (OMRON), Ranee Khubchandani (Sun Microsystems), Akari Kon (NEC), Hiroshi Kuribayashi (OMRON), Teruhiko Kurosaka (Sun Microsys- tems), Seiji Kuwari (Omron), Sandra Martin (OSF), Bill McMahon (HP), Tom McFar- land (HP), Masato Morisaki (NTT), Nelson Ng (Sun), Takashi Nishimura (NTT Amer- ica), Makato Nishino (IBM), Akira Ohsone (Nihon Sun), Chris Peterson (MIT), Sam Shteingart (AT&T), Manish Sheth (AT&T), Bob Scheifler (MIT), Muneyoshi Suzuki (NTT), Cori Mehring (Digital Equipment Co.), Frank Rojas (IBM), Shoji Sugiyama (IBM), Eiji Tosa (IBM) Glenn Widener (Tektronix). 32