aboutsummaryrefslogtreecommitdiff
path: root/libX11/specs/libX11/CH13
diff options
context:
space:
mode:
Diffstat (limited to 'libX11/specs/libX11/CH13')
-rw-r--r--libX11/specs/libX11/CH137673
1 files changed, 7673 insertions, 0 deletions
diff --git a/libX11/specs/libX11/CH13 b/libX11/specs/libX11/CH13
new file mode 100644
index 000000000..ed143c690
--- /dev/null
+++ b/libX11/specs/libX11/CH13
@@ -0,0 +1,7673 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" Permission to use, copy, modify and distribute this documentation for
+.\" any purpose and without fee is hereby granted, provided that the above
+.\" copyright notice appears in all copies and that both that copyright notice
+.\" and this permission notice appear in all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\"
+\&
+.sp 1
+.ce 3
+\s+1\fBChapter 13\fP\s-1
+
+\s+1\fBLocales and Internationalized Text Functions\fP\s-1
+.sp 2
+.nr H1 13
+.nr H2 0
+.nr H3 0
+.nr H4 0
+.nr H5 0
+.na
+.LP
+.XS
+Chapter 13: Locales and Internationalized Text Functions
+.XE
+An internationalized application is one that is adaptable to the requirements
+of different native languages, local customs, and character string encodings.
+The process of adapting the operation to a particular native language,
+local custom, or string encoding is called \fIlocalization\fP\^.
+A goal of internationalization is to permit localization
+without program source modifications or recompilation.
+.LP
+As one of the localization mechanisms,
+Xlib provides an X Input Method
+.Pn ( XIM )
+functional interface for internationalized text input
+and an X Output Method
+.Pn ( XOM )
+functional interface for internationalized text output.
+.LP
+Internationalization in X is based on the concept of a \fIlocale\fP.
+A locale defines the localized behavior of a program at run time.
+Locales affect Xlib in its:
+.IP \(bu 5
+Encoding and processing of input method text
+.IP \(bu 5
+Encoding of resource files and values
+.IP \(bu 5
+Encoding and imaging of text strings
+.IP \(bu 5
+Encoding and decoding for inter-client text communication
+.LP
+Characters from various languages are represented in a computer
+using an encoding.
+Different languages have different encodings,
+and there are even different encodings for the same characters
+in the same language.
+.LP
+This chapter defines support for localized text imaging and text input
+and describes the locale mechanism that controls all locale-dependent
+Xlib functions.
+Sets of functions are provided for multibyte (char *) text as well as
+wide character (wchar_t) text in the form supported
+by the host C language environment.
+The multibyte and wide character functions
+are equivalent except for the form of the text argument.
+.LP
+The Xlib internationalization functions are not meant to provide
+support for multilingual applications (mixing multiple languages
+within a single piece of text), but they make it possible to
+implement applications that work in limited fashion with more than
+one language in independent contexts.
+.LP
+The remainder of this chapter discusses:
+.IP \(bu 5
+X locale management
+.IP \(bu 5
+Locale and modifier dependencies
+.IP \(bu 5
+Variable argument lists
+.IP \(bu 5
+Output methods
+.IP \(bu 5
+Input methods
+.IP \(bu 5
+String constants
+.NH 2
+X Locale Management
+.XS
+\*(SN X Locale Management
+.XE
+.LP
+X supports one or more of the locales defined by the host environment.
+On implementations that conform to the ANSI C library,
+the locale announcement method is
+.PN setlocale .
+This function configures the locale operation of both
+the host C library and Xlib.
+The operation of Xlib is governed by the LC_CTYPE category;
+this is called the \fIcurrent locale\fP.
+An implementation is permitted to provide implementation-dependent
+mechanisms for announcing the locale in addition to
+.PN setlocale .
+.LP
+On implementations that do not conform to the ANSI C library,
+the locale announcement method is Xlib implementation-dependent.
+.LP
+The mechanism by which the semantic operation of Xlib is defined
+for a specific locale is implementation-dependent.
+.LP
+.sp
+X is not required to support all the locales supported by the host.
+To determine if the current locale is supported by X, use
+.PN XSupportsLocale .
+.IN "XSupportsLocale" "" "@DEF@"
+.sM
+.FD 0
+Bool XSupportsLocale\^(\|)
+.FN
+.LP
+.eM
+The
+.PN XSupportsLocale
+function returns
+.PN True
+if Xlib functions are capable of operating under the current locale.
+If it returns
+.PN False ,
+Xlib locale-dependent functions for which the
+.PN XLocaleNotSupported
+return status is defined will return
+.PN XLocaleNotSupported .
+Other Xlib locale-dependent routines will operate in the ``C'' locale.
+.LP
+The client is responsible for selecting its locale and X modifiers.
+Clients should provide a means for the user to override the clients'
+locale selection at client invocation.
+Most single-display X clients operate in a single locale
+for both X and the host processing environment.
+They will configure the locale by calling three functions:
+the host locale configuration function,
+.PN XSupportsLocale ,
+and
+.PN XSetLocaleModifiers .
+.LP
+The semantics of certain categories of X internationalization capabilities
+can be configured by setting modifiers.
+Modifiers are named by implementation-dependent and locale-specific strings.
+The only standard use for this capability at present
+is selecting one of several styles of keyboard input method.
+.LP
+.sp
+To configure Xlib locale modifiers for the current locale, use
+.PN XSetLocaleModifiers .
+.IN "XSetLocaleModifiers" "" "@DEF@"
+.sM
+.FD 0
+char *XSetLocaleModifiers\^(\^\fImodifier_list\fP\^)
+.br
+ char *\fImodifier_list\fP\^;
+.FN
+.IP \fImodifier_list\fP 1i
+Specifies the modifiers.
+.LP
+.eM
+The
+.PN XSetLocaleModifiers
+function sets the X modifiers for the current locale setting.
+The modifier_list argument is a null-terminated string of the form
+``{@\^\fIcategory\fP\^=\^\fIvalue\fP\^}'', that is,
+having zero or more concatenated ``@\^\fIcategory\fP\^=\^\fIvalue\fP\^''
+entries, where \fIcategory\fP is a category name
+and \fIvalue\fP is the (possibly empty) setting for that category.
+The values are encoded in the current locale.
+Category names are restricted to the POSIX Portable Filename Character Set.
+.LP
+The local host X locale modifiers announcer (on POSIX-compliant systems,
+the XMODIFIERS environment variable) is appended to the modifier_list to
+provide default values on the local host.
+If a given category appears more than once in the list,
+the first setting in the list is used.
+If a given category is not included in the full modifier list,
+the category is set to an implementation-dependent default
+for the current locale.
+An empty value for a category explicitly specifies the
+implementation-dependent default.
+.LP
+If the function is successful, it returns a pointer to a string.
+The contents of the string are such that a subsequent call with that string
+(in the same locale) will restore the modifiers to the same settings.
+If modifier_list is a NULL pointer,
+.PN XSetLocaleModifiers
+also returns a pointer to such a string,
+and the current locale modifiers are not changed.
+.LP
+If invalid values are given for one or more modifier categories supported by
+the locale, a NULL pointer is returned, and none of the
+current modifiers are changed.
+.LP
+At program startup,
+the modifiers that are in effect are unspecified until
+the first successful call to set them. Whenever the locale is changed, the
+modifiers that are in effect become unspecified until the next successful call
+to set them.
+Clients should always call
+.PN XSetLocaleModifiers
+with a non-NULL modifier_list after setting the locale
+before they call any locale-dependent Xlib routine.
+.LP
+The only standard modifier category currently defined is ``im'',
+which identifies the desired input method.
+The values for input method are not standardized.
+A single locale may use multiple input methods,
+switching input method under user control.
+The modifier may specify the initial input method in effect
+or an ordered list of input methods.
+Multiple input methods may be specified in a single im value string
+in an implementation-dependent manner.
+.LP
+The returned modifiers string is owned by Xlib and should not be modified or
+freed by the client.
+It may be freed by Xlib after the current locale or modifiers are changed.
+Until freed, it will not be modified by Xlib.
+.LP
+The recommended procedure for clients initializing their locale and modifiers
+is to obtain locale and modifier announcers separately from
+one of the following prioritized sources:
+.IP \(bu 5
+A command line option
+.IP \(bu 5
+A resource
+.IP \(bu 5
+The empty string ("\^")
+.LP
+The first of these that is defined should be used.
+Note that when a locale command line option or locale resource is defined,
+the effect should be to set all categories to the specified locale,
+overriding any category-specific settings in the local host environment.
+.NH 2
+Locale and Modifier Dependencies
+.XS
+\*(SN Locale and Modifier Dependencies
+.XE
+.LP
+The internationalized Xlib functions operate in the current locale
+configured by the host environment and X locale modifiers set by
+.PN XSetLocaleModifiers
+or in the locale and modifiers configured at the time
+some object supplied to the function was created.
+For each locale-dependent function,
+the following table describes the locale (and modifiers) dependency:
+.TS H
+lw(1.25i) lw(2.5i) lw(2i).
+_
+.sp 6p
+.B
+Locale from Affects the Function In
+.sp 6p
+_
+.sp 6p
+.TH
+.R
+ Locale Query/Configuration:
+.sp 6p
+T{
+.PN setlocale
+T} T{
+.PN XSupportsLocale
+T} T{
+Locale queried
+T}
+ T{
+.PN XSetLocaleModifiers
+T} T{
+Locale modified
+T}
+.sp
+ Resources:
+.sp 6p
+T{
+.PN setlocale
+T} T{
+.PN XrmGetFileDatabase
+T} T{
+Locale of
+.PN XrmDatabase
+T}
+ T{
+.PN XrmGetStringDatabase
+T}
+T{
+.PN XrmDatabase
+T} T{
+.PN XrmPutFileDatabase
+T} T{
+Locale of
+.PN XrmDatabase
+T}
+ T{
+.PN XrmLocaleOfDatabase
+T}
+.sp
+ Setting Standard Properties:
+.sp 6p
+T{
+.PN setlocale
+T} T{
+.PN XmbSetWMProperties
+T} T{
+Encoding of supplied/returned
+T}
+ text (some WM_ property
+ text in environment locale)
+.sp 6p
+T{
+.PN setlocale
+T} T{
+.PN XmbTextPropertyToTextList
+T} T{
+Encoding of supplied/returned text
+T}
+ T{
+.PN XwcTextPropertyToTextList
+T}
+ T{
+.PN XmbTextListToTextProperty
+T}
+ T{
+.PN XwcTextListToTextProperty
+T}
+.sp
+ Text Input:
+.sp 6p
+T{
+.PN setlocale
+T} T{
+.PN XOpenIM
+T} T{
+XIM input method selection
+T}
+ T{
+.PN XRegisterIMInstantiateCallback
+T} T{
+XIM selection
+T}
+ T{
+.PN XUnregisterIMInstantiateCallback
+T} T{
+XIM selection
+T}
+T{
+.PN XIM
+T} T{
+.PN XCreateIC
+T} T{
+XIC input method configuration
+T}
+ T{
+.PN XLocaleOfIM ,
+and so on
+T} T{
+Queried locale
+T}
+T{
+.PN XIC
+T} T{
+.PN XmbLookupString
+T} T{
+Keyboard layout
+T}
+ T{
+.PN XwcLookupString
+T} T{
+Encoding of returned text
+T}
+.sp
+ Text Drawing:
+.sp 6p
+T{
+.PN setlocale
+T} T{
+.PN XOpenOM
+T} T{
+XOM output method selection
+T}
+ T{
+.PN XCreateFontSet
+T} T{
+Charsets of fonts in
+.PN XFontSet
+T}
+T{
+.PN XOM
+T} T{
+.PN XCreateOC
+T} T{
+XOC output method configuration
+T}
+ T{
+.PN XLocaleOfOM ,
+and so on
+T} T{
+Queried locale
+T}
+T{
+.PN XFontSet
+T} T{
+.PN XmbDrawText ,
+T} T{
+Locale of supplied text
+T}
+ T{
+.PN XwcDrawText ,
+and so on
+T} T{
+Locale of supplied text
+T}
+ T{
+.PN XExtentsOfFontSet ,
+and so on
+T} T{
+Locale-dependent metrics
+T}
+ T{
+.PN XmbTextExtents ,
+T}
+ T{
+.PN XwcTextExtents ,
+and so on
+T}
+.sp
+ Xlib Errors:
+.sp 6p
+T{
+.PN setlocale
+T} T{
+.PN XGetErrorDatabaseText
+T} T{
+Locale of error message
+T}
+ T{
+.PN XGetErrorText
+T}
+.sp 6p
+_
+.TE
+.LP
+Clients may assume that a locale-encoded text string returned
+by an X function can be passed to a C library routine, or vice versa,
+if the locale is the same at the two calls.
+.LP
+All text strings processed by internationalized Xlib functions are assumed
+to begin in the initial state of the encoding of the locale, if the encoding
+is state-dependent.
+.LP
+All Xlib functions behave as if they do not change the current locale
+or X modifier setting.
+(This means that if they do change locale or call
+.PN XSetLocaleModifiers
+with a non-NULL argument, they must save and restore the current state on
+entry and exit.)
+Also, Xlib functions on implementations that conform to the ANSI C library do
+not alter the global state associated with the ANSI C functions
+.PN mblen ,
+.PN mbtowc ,
+.PN wctomb ,
+and
+.PN strtok .
+.NH 2
+Variable Argument Lists
+.XS
+\*(SN Variable Argument Lists
+.XE
+.LP
+Various functions in this chapter have arguments that conform
+to the ANSI C variable argument list calling convention.
+Each function denoted with an argument of the form ``...'' takes
+a variable-length list of name and value pairs,
+where each name is a string and each value is of type
+.PN XPointer .
+A name argument that is NULL identifies the end of the list.
+.LP
+A variable-length argument list may contain a nested list.
+If the name
+.PN XNVaNestedList
+is specified in place of an argument name,
+then the following value is interpreted as an
+.PN XVaNestedList
+value that specifies a list of values logically inserted into the
+original list at the point of declaration.
+A NULL identifies the end of a nested list.
+.LP
+.sp
+To allocate a nested variable argument list dynamically, use
+.PN XVaCreateNestedList .
+.IN "XVaCreateNestedList" "" @DEF@"
+.sM
+.FD 0
+typedef void * XVaNestedList;
+
+XVaNestedList XVaCreateNestedList\^(\^\fIdummy\fP\^, ...)
+.br
+ int \fIdummy\fP\^;
+.FN
+.IP \fIdummy\fP 1i
+Specifies an unused argument (required by ANSI C).
+.ds Al
+.IP ... 1i
+Specifies the variable length argument list\*(Al.
+.LP
+.eM
+The
+.PN XVaCreateNestedList
+function allocates memory and copies its arguments into
+a single list pointer,
+which may be used as a 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
+.PN XFree
+when it is no longer needed.
+.NH 2
+Output Methods
+.XS
+\*(SN Output Methods
+.XE
+.LP
+This section provides discussions of the following X Output Method
+(XOM) topics:
+.IP \(bu 5
+Output method overview
+.IP \(bu 5
+Output method functions
+.IP \(bu 5
+Output method values
+.IP \(bu 5
+Output context functions
+.IP \(bu 5
+Output context values
+.IP \(bu 5
+Creating and freeing a font set
+.IP \(bu 5
+Obtaining font set metrics
+.IP \(bu 5
+Drawing text using font sets
+.NH 3
+Output Method Overview
+.XS
+\*(SN Output Method Overview
+.XE
+.LP
+Locale-dependent text may include one or more text components, each of
+which may require different fonts and character set encodings.
+In some languages, each component might have a different
+drawing direction, and some components might contain
+context-dependent characters that change shape based on
+relationships with neighboring characters.
+.LP
+When drawing such locale-dependent text, some locale-specific
+knowledge is required;
+for example, what fonts are required to draw the text,
+how the text can be separated into components, and which
+fonts are selected to draw each component.
+Further, when bidirectional text must be drawn,
+the internal representation order of the text must be changed
+into the visual representation order to be drawn.
+.LP
+An X Output Method provides a functional interface so that clients
+do not have to deal directly with such locale-dependent details.
+Output methods provide the following capabilities:
+.IP \(bu 5
+Creating a set of fonts required to draw locale-dependent text.
+.IP \(bu 5
+Drawing locale-dependent text with a font set without the caller
+needing to be aware of locale dependencies.
+.IP \(bu 5
+Obtaining the escapement and extents in pixels of locale-dependent text.
+.IP \(bu 5
+Determining if bidirectional or context-dependent drawing is required
+in a specific locale with a specific font set.
+.LP
+Two different abstractions are used in the representation of
+the output method for clients.
+.LP
+The abstraction used to communicate with an output method
+is an opaque data structure represented by the
+.PN XOM
+data type.
+The abstraction for representing the state of a particular output thread
+is called an \fIoutput context\fP.
+The Xlib representation of an output context is an
+.PN XOC ,
+which is compatible with
+.PN XFontSet
+in terms of its functional interface, but is
+a broader, more generalized abstraction.
+.NH 3
+Output Method Functions
+.XS
+\*(SN Output Method Functions
+.XE
+.LP
+To open an output method, use
+.PN XOpenOM .
+.IN "XOpenOM" "" "@DEF@"
+.sM
+.FD 0
+XOM XOpenOM\^(\^\fIdisplay\fP\^, \fIdb\fP\^, \fIres_name\fP\^, \fIres_class\fP\^)
+.br
+ Display *\fIdisplay\fP\^;
+.br
+ XrmDatabase \fIdb\fP\^;
+.br
+ char *\fIres_name\fP\^;
+.br
+ char *\fIres_class\fP\^;
+.FN
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIdb\fP 1i
+Specifies a pointer to the resource database.
+.IP \fIres_name\fP 1i
+Specifies the full resource name of the application.
+.IP \fIres_class\fP 1i
+Specifies the full class name of the application.
+.LP
+.eM
+The
+.PN XOpenOM
+function opens an output method
+matching the current locale and modifiers specification.
+The current locale and modifiers are bound to the output method
+when
+.PN XOpenOM
+is called.
+The locale associated with an output method cannot be changed.
+.LP
+The specific output method to which this call will be routed
+is identified on the basis of the current locale and modifiers.
+.PN XOpenOM
+will identify a default output method corresponding to the
+current locale.
+That default can be modified using
+.PN XSetLocaleModifiers
+to set the output method modifier.
+.LP
+The db argument is the resource database to be used by the output method
+for looking up resources that are private to the output method.
+It is not intended that this database be used to look
+up values that can be set as OC values in an output context.
+If db is NULL,
+no database is passed to the output method.
+.LP
+The res_name and res_class arguments specify the resource name
+and class of the application.
+They are intended to be used as prefixes by the output method
+when looking up resources that are common to all output contexts
+that may be created for this output 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.
+.LP
+The res_name and res_class arguments are not assumed to exist beyond
+the call to
+.PN XOpenOM .
+The specified resource database is assumed to exist for the lifetime
+of the output method.
+.LP
+.PN XOpenOM
+returns NULL if no output method could be opened.
+.LP
+.sp
+To close an output method, use
+.PN XCloseOM .
+.IN "XCloseOM" "" "@DEF@"
+.sM
+.FD 0
+Status XCloseOM\^(\^\fIom\fP\^)
+.br
+ XOM \fIom\fP\^;
+.FN
+.IP \fIom\fP 1i
+Specifies the output method.
+.LP
+.eM
+The
+.PN XCloseOM
+function closes the specified output method.
+.LP
+.sp
+To set output method attributes, use
+.PN XSetOMValues .
+.IN "XSetOMValues" "" "@DEF@"
+.sM
+.FD 0
+char * XSetOMValues\^(\^\fIom\fP\^, ...)
+.br
+ XOM \fIom\fP\^;
+.FN
+.IP \fIom\fP 1i
+Specifies the output method.
+.ds Al \ to set XOM values
+.IP ... 1i
+Specifies the variable-length argument list\*(Al.
+.LP
+.eM
+The
+.PN XSetOMValues
+function presents a variable argument list programming interface
+for setting properties or features of the specified output method.
+This function returns NULL if it succeeds;
+otherwise,
+it returns the name of the first argument that could not be obtained.
+.LP
+No standard arguments are currently defined by Xlib.
+.LP
+.sp
+To query an output method, use
+.PN XGetOMValues .
+.IN "XGetOMValues" "" "@DEF@"
+.sM
+.FD 0
+char * XGetOMValues\^(\^\fIom\fP\^, ...)
+.br
+ XOM \fIom\fP\^;
+.FN
+.IP \fIom\fP 1i
+Specifies the output method.
+.ds Al \ to get XOM values
+.IP ... 1i
+Specifies the variable-length argument list\*(Al.
+.LP
+.eM
+The
+.PN XGetOMValues
+function presents a variable argument list programming interface
+for querying properties or features of the specified output method.
+This function returns NULL if it succeeds;
+otherwise,
+it returns the name of the first argument that could not be obtained.
+.LP
+To obtain the display associated with an output method, use
+.PN XDisplayOfOM .
+.IN "XDisplayOfOM" "" "@DEF@"
+.sM
+.FD 0
+Display * XDisplayOfOM\^(\^\fIom\fP\^)
+.br
+ XOM \fIom\fP\^;
+.FN
+.IP \fIom\fP 1i
+Specifies the output method.
+.LP
+.eM
+The
+.PN XDisplayOfOM
+function returns the display associated with the specified output method.
+.LP
+.sp
+To get the locale associated with an output method, use
+.PN XLocaleOfOM .
+.IN "XLocaleOfOM" "" "@DEF@"
+.sM
+.FD 0
+char * XLocaleOfOM\^(\^\fIom\fP\^)
+.br
+ XOM \fIom\fP\^;
+.FN
+.IP \fIom\fP 1i
+Specifies the output method.
+.LP
+.eM
+The
+.PN XLocaleOfOM
+returns the locale associated with the specified output method.
+.NH 3
+X Output Method Values
+.XS
+\*(SN X Output Method Values
+.XE
+.LP
+The following table describes how XOM values are interpreted by an
+output method.
+The first column lists the XOM values. The second column indicates
+how each of the XOM values are treated by a particular output style.
+.LP
+.LP
+The following key applies to this table.
+.TS H
+lw(1i) lw(4.75i).
+_
+.sp 6p
+.B
+Key Explanation
+.sp 6p
+_
+.sp 6p
+.TH
+.R
+G T{
+This value may be read using
+.PN XGetOMValues .
+T}
+.sp 6p
+_
+.TE
+.LP
+.TS H
+lw(2.25i) c
+lw(2.25i) c.
+_
+.sp 6p
+.B
+XOM Value Key
+.sp 6p
+_
+.sp 6p
+.TH
+.R
+T{
+.PN XNRequiredCharSet
+T} T{
+G
+T}
+T{
+.PN XNQueryOrientation
+T} T{
+G
+T}
+T{
+.PN XNDirectionalDependentDrawing
+T} T{
+G
+T}
+T{
+.PN XNContextualDrawing
+T} T{
+G
+T}
+.sp 6p
+_
+.TE
+.LP
+.NH 4
+Required Char Set
+.XS
+\*(SN Required Char Set
+.XE
+.LP
+The
+.PN XNRequiredCharSet
+argument returns the list of charsets that are required for loading the fonts
+needed for the locale.
+The value of the argument is a pointer to a structure of type
+.PN XOMCharSetList .
+.LP
+The
+.PN XOMCharSetList
+structure is defined as follows:
+.IN "XOMCharSetList" "" "@DEF@"
+.sM
+.LP
+.Ds 0
+.TA .5i 2.5i
+.ta .5i 2.5i
+typedef struct {
+ int charset_count;
+ char **charset_list;
+} XOMCharSetList;
+.De
+.LP
+.eM
+The charset_list member is a list of one or more null-terminated
+charset names, and the charset_count member is the number of
+charset names.
+.LP
+The required charset list is owned by Xlib and should not be modified or
+freed by the client.
+It will be freed by a call to
+.PN XCloseOM
+with the associated
+.PN XOM .
+Until freed, its contents will not be modified by Xlib.
+.LP
+.NH 4
+Query Orientation
+.XS
+\*(SN Query Orientation
+.XE
+.LP
+The
+.PN XNQueryOrientation
+argument returns the global orientation of text when drawn.
+Other than
+.PN XOMOrientation_LTR_TTB ,
+the set of orientations supported is locale-dependent.
+The value of the argument is a pointer to a structure of type
+.PN XOMOrientation .
+Clients are responsible for freeing the
+.PN XOMOrientation
+structure by using
+.PN XFree ;
+this also frees the contents of the structure.
+.LP
+.sM
+.Ds 0
+.TA .5i 2.5i
+.ta .5i 2.5i
+typedef struct {
+ int num_orientation;
+ XOrientation *orientation; /* Input Text description */
+} XOMOrientation;
+
+typedef enum {
+ XOMOrientation_LTR_TTB,
+ XOMOrientation_RTL_TTB,
+ XOMOrientation_TTB_LTR,
+ XOMOrientation_TTB_RTL,
+ XOMOrientation_Context
+} XOrientation;
+.De
+.LP
+.eM
+The possible value for XOrientation may be:
+.IP \(bu 5
+.PN XOMOrientation_LTR_TTB
+left-to-right, top-to-bottom global orientation
+.IP \(bu 5
+.PN XOMOrientation_RTL_TTB
+right-to-left, top-to-bottom global orientation
+.IP \(bu 5
+.PN XOMOrientation_TTB_LTR
+top-to-bottom, left-to-right global orientation
+.IP \(bu 5
+.PN XOMOrientation_TTB_RTL
+top-to-bottom, right-to-left global orientation
+.IP \(bu 5
+.PN XOMOrientation_Context
+contextual global orientation
+.LP
+.NH 4
+Directional Dependent Drawing
+.XS
+\*(SN Directional Dependent Drawing
+.XE
+.LP
+The
+.PN XNDirectionalDependentDrawing
+argument indicates whether the text rendering functions
+implement implicit handling of directional text. If this value
+is
+.PN True ,
+the output method has knowledge of directional
+dependencies and reorders text as necessary when
+rendering text. If this value is
+.PN False ,
+the output method does not implement any directional text
+handling, and all character directions are assumed to be left-to-right.
+.LP
+Regardless of the rendering order of characters,
+the origins of all characters are on the primary draw direction side
+of the drawing origin.
+.LP
+This OM value presents functionality identical to the
+.PN XDirectionalDependentDrawing
+function.
+.NH 4
+Context Dependent Drawing
+.XS
+\*(SN Context Dependent Drawing
+.XE
+.LP
+The
+.PN XNContextualDrawing
+argument indicates whether the text rendering functions
+implement implicit context-dependent drawing. If this value is
+.PN True ,
+the output method has knowledge of context dependencies and
+performs character shape editing, combining glyphs to present
+a single character as necessary. The actual shape editing is
+dependent on the locale implementation and the font set used.
+.LP
+This OM value presents functionality identical to the
+.PN XContextualDrawing
+function.
+.NH 3
+Output Context Functions
+.XS
+\*(SN Output Context Functions
+.XE
+.LP
+An output context is an abstraction that contains both the data
+required by an output method and the information required
+to display that data.
+There can be multiple output contexts for one output method.
+The programming interfaces for creating, reading, or modifying
+an output context use a variable argument list.
+The name elements of the argument lists are referred to as XOC values.
+It is intended that output methods be controlled by these XOC values.
+As new XOC values are created,
+they should be registered with the X Consortium.
+An
+.PN XOC
+can be used anywhere an
+.PN XFontSet
+can be used, and vice versa;
+.PN XFontSet
+is retained for compatibility with previous releases.
+The concepts of output methods and output contexts include broader,
+more generalized abstraction than font set,
+supporting complex and more intelligent text display, and dealing not only
+with multiple fonts but also with context dependencies.
+However,
+.PN XFontSet
+is widely used in several interfaces, so
+.PN XOC
+is defined as an upward compatible type of
+.PN XFontSet .
+.LP
+.sp
+To create an output context, use
+.PN XCreateOC .
+.IN "XCreateOC" "" "@DEF@"
+.sM
+.FD 0
+XOC XCreateOC\^(\^\fIom\fP\^, ...)
+.br
+ XOM \fIom\fP\^;
+.FN
+.IP \fIom\fP 1i
+Specifies the output method.
+.ds Al \ to set XOC values
+.IP ... 1i
+Specifies the variable-length argument list\*(Al.
+.LP
+.eM
+The
+.PN XCreateOC
+function creates an output context within the specified output method.
+.LP
+The base font names argument is mandatory at creation time, and
+the output context will not be created unless it is provided.
+All other output context values can be set later.
+.LP
+.PN XCreateOC
+returns NULL if no output context could be created.
+NULL can be returned for any of the following reasons:
+.IP \(bu 5
+A required argument was not set.
+.IP \(bu 5
+A read-only argument was set.
+.IP \(bu 5
+An argument name is not recognized.
+.IP \(bu 5
+The output method encountered an output method implementation-dependent error.
+.LP
+.PN XCreateOC
+can generate a
+.PN BadAtom
+error.
+.LP
+.sp
+To destroy an output context, use
+.PN XDestroyOC .
+.IN "XDestroyOC" "" "@DEF@"
+.sM
+.FD 0
+void XDestroyOC\^(\^\fIoc\fP\^)
+.br
+ XOC \fIoc\fP\^;
+.FN
+.IP \fIoc\fP 1i
+Specifies the output context.
+.LP
+.eM
+The
+.PN XDestroyOC
+function destroys the specified output context.
+.LP
+.sp
+To get the output method associated with an output context, use
+.PN XOMOfOC .
+.IN "XOMOfOC" "" "@DEF@"
+.sM
+.FD 0
+XOM XOMOfOC\^(\^\fIoc\fP\^)
+.br
+ XOC \fIoc\fP\^;
+.FN
+.IP \fIoc\fP 1i
+Specifies the output context.
+.LP
+.eM
+The
+.PN XOMOfOC
+function returns the output method associated with the
+specified output context.
+.LP
+.sp
+Xlib provides two functions for setting and reading output context values,
+respectively,
+.PN XSetOCValues
+and
+.PN XGetOCValues .
+Both functions have a variable-length argument list.
+In that argument list, any XOC value's name must be denoted
+with a character string using the X Portable Character Set.
+.LP
+.sp
+To set XOC values, use
+.PN XSetOCValues .
+.IN "XSetOCValues" "" "@DEF@"
+.sM
+.FD 0
+char * XSetOCValues\^(\^\fIoc\fP\^, ...)
+.br
+ XOC \fIoc\fP\^;
+.FN
+.IP \fIoc\fP 1i
+Specifies the output context.
+.ds Al \ to set XOC values
+.IP ... 1i
+Specifies the variable-length argument list\*(Al.
+.LP
+.eM
+The
+.PN XSetOCValues
+function returns NULL if no error occurred;
+otherwise,
+it returns the name of the first argument that could not be set.
+An argument might not be set for any of the following reasons:
+.IP \(bu 5
+The argument is read-only.
+.IP \(bu 5
+The argument name is not recognized.
+.IP \(bu 5
+An implementation-dependent error occurs.
+.LP
+Each value to be set must be an appropriate datum,
+matching the data type imposed by the semantics of the argument.
+.LP
+.PN XSetOCValues
+can generate a
+.PN BadAtom
+error.
+.LP
+.sp
+To obtain XOC values, use
+.PN XGetOCValues .
+.IN "XGetOCValues" "" "@DEF@"
+.sM
+.FD 0
+char * XGetOCValues\^(\^\fIoc\fP\^, ...)
+.br
+ XOC \fIoc\fP\^;
+.FN
+.IP \fIoc\fP 1i
+Specifies the output context.
+.ds Al \ to get XOC values
+.IP ... 1i
+Specifies the variable-length argument list\*(Al.
+.LP
+.eM
+The
+.PN XGetOCValues
+function returns NULL if no error occurred; otherwise,
+it returns the name of the first argument that could not be obtained.
+An argument might not be obtained for any of the following reasons:
+.IP \(bu 5
+The argument name is not recognized.
+.IP \(bu 5
+An implementation-dependent error occurs.
+.LP
+Each argument value
+following a name must point to a location where the value is to be stored.
+.NH 3
+Output Context Values
+.XS
+\*(SN Output Context Values
+.XE
+.LP
+The following table describes how XOC values are interpreted
+by an output method.
+The first column lists the XOC values.
+The second column indicates the alternative interfaces that function
+identically and are provided for compatibility with previous releases.
+The third column indicates how each of the XOC values is treated.
+.LP
+The following keys apply to this table.
+.TS H
+lw(1i) lw(4.75i).
+_
+.sp 6p
+.B
+Key Explanation
+.sp 6p
+_
+.TH
+.R
+C T{
+This value must be set with
+.PN XCreateOC .
+T}
+D T{
+This value may be set using
+.PN XCreateOC .
+If it is not set,
+.br
+a default is provided.
+T}
+G T{
+This value may be read using
+.PN XGetOCValues .
+T}
+S T{
+This value must be set using
+.PN XSetOCValues .
+T}
+.sp 6p
+_
+.TE
+.LP
+.TS H
+l c c
+l c c.
+_
+.sp 6p
+.B
+XOC Value Alternative Interface Key
+.sp 6p
+_
+.sp 6p
+.TH
+.R
+T{
+BaseFontName
+T} T{
+.PN XCreateFontSet
+T} T{
+C-G
+T}
+T{
+MissingCharSet
+T} T{
+.PN XCreateFontSet
+T} T{
+G
+T}
+T{
+DefaultString
+T} T{
+.PN XCreateFontSet
+T} T{
+G
+T}
+T{
+Orientation
+T} T{
+\-
+T} T{
+D-S-G
+T}
+T{
+ResourceName
+T} T{
+\-
+T} T{
+S-G
+T}
+T{
+ResourceClass
+T} T{
+\-
+T} T{
+S-G
+T}
+T{
+FontInfo
+T} T{
+.PN XFontsOfFontSet
+T} T{
+G
+T}
+T{
+OMAutomatic
+T} T{
+\-
+T} T{
+G
+T}
+.sp 6p
+_
+.TE
+.LP
+.NH 4
+Base Font Name
+.XS
+\*(SN Base Font Name
+.XE
+.LP
+The
+.PN XNBaseFontName
+argument is a list of base font names that Xlib uses
+to load the fonts needed for the locale.
+The base font names are a comma-separated list. The string is null-terminated
+and is assumed to be in the Host Portable Character Encoding;
+otherwise, the result is implementation-dependent.
+White space immediately on either side of a separating comma is ignored.
+.LP
+Use of XLFD font names permits Xlib to obtain the fonts needed for a
+variety of locales from a single locale-independent base font name.
+The single base font name should name a family of fonts whose members
+are encoded in the various charsets needed by the locales of interest.
+.LP
+An XLFD base font name can explicitly name a charset needed for the locale.
+This allows the user to specify an exact font for use with a charset required
+by a locale, fully controlling the font selection.
+.LP
+If a base font name is not an XLFD name,
+Xlib will attempt to obtain an XLFD name from the font properties
+for the font.
+If Xlib is successful, the
+.PN XGetOCValues
+function will return this XLFD name instead of the client-supplied name.
+.LP
+This argument must be set at creation time
+and cannot be changed.
+If no fonts exist for any of the required charsets,
+or if the locale definition in Xlib requires that a font exist
+for a particular charset and a font is not found for that charset,
+.PN XCreateOC
+returns NULL.
+.LP
+When querying for the
+.PN XNBaseFontName
+XOC value,
+.PN XGetOCValues
+returns a null-terminated string identifying the base font names that
+Xlib used to load the fonts needed for the locale.
+This string is owned by Xlib and should not be modified or freed by
+the client.
+The string will be freed by a call to
+.PN XDestroyOC
+with the associated
+.PN XOC .
+Until freed, the string contents will not be modified by Xlib.
+.NH 4
+Missing CharSet
+.XS
+\*(SN Missing CharSet
+.XE
+.LP
+The
+.PN XNMissingCharSet
+argument returns the list of required charsets that are missing from the
+font set.
+The value of the argument is a pointer to a structure of type
+.PN XOMCharSetList .
+.LP
+If fonts exist for all of the charsets required by the current locale,
+charset_list is set to NULL and charset_count is set to zero.
+If no fonts exist for one or more of the required charsets,
+charset_list is set to a list of one or more null-terminated charset names
+for which no fonts exist, and charset_count is set to the number of
+missing charsets.
+The charsets are from the list of the required charsets for
+the encoding of the locale and do not include any charsets to which Xlib
+may be able to remap a required charset.
+.LP
+The missing charset list is owned by Xlib and should not be modified or
+freed by the client.
+It will be freed by a call to
+.PN XDestroyOC
+with the associated
+.PN XOC .
+Until freed, its contents will not be modified by Xlib.
+.NH 4
+Default String
+.XS
+\*(SN Default String
+.XE
+.LP
+When a drawing or measuring function is called with an
+.PN XOC
+that has missing charsets, some characters in the locale will not be
+drawable.
+The
+.PN XNDefaultString
+argument returns a pointer to a string that represents the glyphs
+that are drawn with this
+.PN XOC
+when the charsets of the available fonts do not include all glyphs
+required to draw a character.
+The string does not necessarily consist of valid characters
+in the current locale and is not necessarily drawn with
+the fonts loaded for the font set,
+but the client can draw or measure the default glyphs
+by including this string in a string being drawn or measured with the
+.PN XOC .
+.LP
+If the
+.PN XNDefaultString
+argument returned the empty string ("\^"),
+no glyphs are drawn and the escapement is zero.
+The returned string is null-terminated.
+It is owned by Xlib and should not be modified or freed by the client.
+It will be freed by a call to
+.PN XDestroyOC
+with the associated
+.PN XOC .
+Until freed, its contents will not be modified by Xlib.
+.NH 4
+Orientation
+.XS
+\*(SN Orientation
+.XE
+.LP
+The
+.PN XNOrientation
+argument specifies the current orientation of text when drawn. The value of
+this argument is one of the values returned by the
+.PN XGetOMValues
+function with the
+.PN XNQueryOrientation
+argument specified in the
+.PN XOrientation
+list.
+The value of the argument is of type
+.PN XOrientation .
+When
+.PN XNOrientation
+is queried, the value specifies the current orientation.
+When
+.PN XNOrientation
+is set, a value is used to set the current orientation.
+.LP
+When
+.PN XOMOrientation_Context
+is set, the text orientation of the
+text is determined according to an implementation-defined method
+(for example, ISO 6429 control sequences), and the initial text orientation for
+locale-dependent Xlib functions is assumed to
+be
+.PN XOMOrientation_LTR_TTB .
+.LP
+The
+.PN XNOrientation
+value does not change the prime drawing direction
+for Xlib drawing functions.
+.NH 4
+Resource Name and Class
+.XS
+\*(SN Resource Name and Class
+.XE
+.LP
+The
+.PN XNResourceName
+and
+.PN XNResourceClass
+arguments are strings that specify the full name and class
+used by the client to obtain resources for the display of the output context.
+These values should be used as prefixes for name and class
+when looking up resources that may vary according to the output context.
+If these values are not set,
+the resources will not be fully specified.
+.LP
+It is not intended that values that can be set as XOM values be
+set as resources.
+.LP
+When querying for the
+.PN XNResourceName
+or
+.PN XNResourceClass
+XOC value,
+.PN XGetOCValues
+returns a null-terminated string.
+This string is owned by Xlib and should not be modified or freed by
+the client.
+The string will be freed by a call to
+.PN XDestroyOC
+with the associated
+.PN XOC
+or when the associated value is changed via
+.PN XSetOCValues .
+Until freed, the string contents will not be modified by Xlib.
+.NH 4
+Font Info
+.XS
+\*(SN Font Info
+.XE
+.LP
+The
+.PN XNFontInfo
+argument specifies a list of one or more
+.PN XFontStruct
+structures
+and font names for the fonts used for drawing by the given output context.
+The value of the argument is a pointer to a structure of type
+.PN XOMFontInfo .
+.LP
+.sM
+.Ds 0
+.TA .5i 2.5i
+.ta .5i 2.5i
+typedef struct {
+ int num_font;
+ XFontStruct **font_struct_list;
+ char **font_name_list;
+} XOMFontInfo;
+.De
+.LP
+.eM
+A list of pointers to the
+.PN XFontStruct
+structures is returned to font_struct_list.
+A list of pointers to null-terminated, fully-specified font name strings
+in the locale of the output context is returned to font_name_list.
+The font_name_list order corresponds to the font_struct_list order.
+The number of
+.PN XFontStruct
+structures and font names is returned to num_font.
+.LP
+Because it is not guaranteed that a given character will be imaged using a
+single font glyph,
+there is no provision for mapping a character or default string
+to the font properties, font ID, or direction hint for the font
+for the character.
+The client may access the
+.PN XFontStruct
+list to obtain these values for all the fonts currently in use.
+.LP
+Xlib does not guarantee that fonts are loaded from the server
+at the creation of an
+.PN XOC .
+Xlib may choose to cache font data, loading it only as needed to draw text
+or compute text dimensions.
+Therefore, existence of the per_char metrics in the
+.PN XFontStruct
+structures in the
+.PN XFontStructSet
+is undefined.
+Also, note that all properties in the
+.PN XFontStruct
+structures are in the STRING encoding.
+.LP
+The client must not free the
+.PN XOMFontInfo
+struct itself; it will be freed when the
+.PN XOC
+is closed.
+.NH 4
+OM Automatic
+.XS
+\*(SN OM Automatic
+.XE
+.LP
+The
+.PN XNOMAutomatic
+argument returns whether the associated output context was created by
+.PN XCreateFontSet
+or not. Because the
+.PN XFreeFontSet
+function not only destroys the output context but also closes the implicit
+output method associated with it,
+.PN XFreeFontSet
+should be used with any output context created by
+.PN XCreateFontSet .
+However, it is possible that a client does not know how the output context
+was created.
+Before a client destroys the output context,
+it can query whether
+.PN XNOMAutomatic
+is set to determine whether
+.PN XFreeFontSet
+or
+.PN XDestroyOC
+should be used to destroy the output context.
+.NH 3
+Creating and Freeing a Font Set
+.XS
+\*(SN Creating and Freeing a Font Set
+.XE
+.LP
+Xlib international text drawing is done using a set of one or more fonts,
+as needed for the locale of the text.
+Fonts are loaded according to a list of base font names
+supplied by the client and the charsets required by the locale.
+The
+.PN XFontSet
+is an opaque type representing the state of a particular output thread
+and is equivalent to the type
+.PN XOC .
+.LP
+.sp
+The
+.PN XCreateFontSet
+function is a convenience function for creating an output context using
+only default values. The returned
+.PN XFontSet
+has an implicitly created
+.PN XOM .
+This
+.PN XOM
+has an OM value
+.PN XNOMAutomatic
+automatically set to
+.PN True
+so that the output context self indicates whether it was created by
+.PN XCreateOC
+or
+.PN XCreateFontSet .
+.IN "XCreateFontSet" "" "@DEF@"
+.sM
+.FD 0
+XFontSet XCreateFontSet\^(\^\fIdisplay\fP\^, \fIbase_font_name_list\fP\^, \fImissing_charset_list_return\fP\^,
+.br
+ \fImissing_charset_count_return\fP\^, \fIdef_string_return\fP\^)
+.br
+ Display *\fIdisplay\fP\^;
+.br
+ char *\fIbase_font_name_list\fP\^;
+.br
+ char ***\fImissing_charset_list_return\fP\^;
+.br
+ int *\fImissing_charset_count_return\fP\^;
+.br
+ char **\fIdef_string_return\fP\^;
+.FN
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIbase_font_name_list\fP 1i
+Specifies the base font names.
+.IP \fImissing_charset_list_return\fP 1i
+Returns the missing charsets.
+.IP \fImissing_charset_count_return\fP 1i
+Returns the number of missing charsets.
+.IP \fIdef_string_return\fP 1i
+Returns the string drawn for missing charsets.
+.LP
+.eM
+The
+.PN XCreateFontSet
+function creates a font set for the specified display.
+The font set is bound to the current locale when
+.PN XCreateFontSet
+is called.
+The font set may be used in subsequent calls to obtain font
+and character information and to image text in the locale of the font set.
+.LP
+The base_font_name_list argument is a list of base font names
+that Xlib uses to load the fonts needed for the locale.
+The base font names are a comma-separated list.
+The string is null-terminated
+and is assumed to be in the Host Portable Character Encoding;
+otherwise, the result is implementation-dependent.
+White space immediately on either side of a separating comma is ignored.
+.LP
+Use of XLFD font names permits Xlib to obtain the fonts needed for a
+variety of locales from a single locale-independent base font name.
+The single base font name should name a family of fonts whose members
+are encoded in the various charsets needed by the locales of interest.
+.LP
+An XLFD base font name can explicitly name a charset needed for the locale.
+This allows the user to specify an exact font for use with a charset required
+by a locale, fully controlling the font selection.
+.LP
+If a base font name is not an XLFD name,
+Xlib will attempt to obtain an XLFD name from the font properties
+for the font.
+If this action is successful in obtaining an XLFD name, the
+.PN XBaseFontNameListOfFontSet
+function will return this XLFD name instead of the client-supplied name.
+.LP
+Xlib uses the following algorithm to select the fonts
+that will be used to display text with the
+.PN XFontSet .
+.LP
+For each font charset required by the locale,
+the base font name list is searched for the first appearance of one
+of the following cases that names a set of fonts that exist at the server:
+.IP \(bu 5
+The first XLFD-conforming base font name that specifies the required
+charset or a superset of the required charset in its
+.PN CharSetRegistry
+and
+.PN CharSetEncoding
+fields.
+The implementation may use a base font name whose specified charset
+is a superset of the required charset, for example,
+an ISO8859-1 font for an ASCII charset.
+.IP \(bu 5
+The first set of one or more XLFD-conforming base font names
+that specify one or more charsets that can be remapped to support the
+required charset.
+The Xlib implementation may recognize various mappings
+from a required charset to one or more other charsets
+and use the fonts for those charsets.
+For example, JIS Roman is ASCII with tilde and backslash replaced
+by yen and overbar;
+Xlib may load an ISO8859-1 font to support this character set
+if a JIS Roman font is not available.
+.IP \(bu 5
+The first XLFD-conforming font name or the first non-XLFD font name
+for which an XLFD font name can be obtained, combined with the
+required charset (replacing the
+.PN CharSetRegistry
+and
+.PN CharSetEncoding
+fields in the XLFD font name).
+As in case 1,
+the implementation may use a charset that is a superset
+of the required charset.
+.IP \(bu 5
+The first font name that can be mapped in some implementation-dependent
+manner to one or more fonts that support imaging text in the charset.
+.LP
+For example, assume that a locale required the charsets:
+.LP
+.Ds 0
+ISO8859-1
+JISX0208.1983
+JISX0201.1976
+GB2312-1980.0
+.De
+.LP
+The user could supply a base_font_name_list that explicitly specifies the
+charsets, ensuring that specific fonts are used if they exist.
+For example:
+.LP
+.Ds 0
+"-JIS-Fixed-Medium-R-Normal--26-180-100-100-C-240-JISX0208.1983-0,\\
+-JIS-Fixed-Medium-R-Normal--26-180-100-100-C-120-JISX0201.1976-0,\\
+-GB-Fixed-Medium-R-Normal--26-180-100-100-C-240-GB2312-1980.0,\\
+-Adobe-Courier-Bold-R-Normal--25-180-75-75-M-150-ISO8859-1"
+.De
+.LP
+Alternatively, the user could supply a base_font_name_list
+that omits the charsets,
+letting Xlib select font charsets required for the locale.
+For example:
+.LP
+.Ds 0
+"-JIS-Fixed-Medium-R-Normal--26-180-100-100-C-240,\\
+-JIS-Fixed-Medium-R-Normal--26-180-100-100-C-120,\\
+-GB-Fixed-Medium-R-Normal--26-180-100-100-C-240,\\
+-Adobe-Courier-Bold-R-Normal--25-180-100-100-M-150"
+.De
+.LP
+Alternatively, the user could simply supply a single base font name
+that allows Xlib to select from all available fonts
+that meet certain minimum XLFD property requirements.
+For example:
+.LP
+.Ds 0
+"-*-*-*-R-Normal--*-180-100-100-*-*"
+.De
+.LP
+If
+.PN XCreateFontSet
+is unable to create the font set,
+either because there is insufficient memory or because the current locale
+is not supported,
+.PN XCreateFontSet
+returns NULL, missing_charset_list_return is set to NULL,
+and missing_charset_count_return
+is set to zero.
+If fonts exist for all of the charsets required by the current locale,
+.PN XCreateFontSet
+returns a valid
+.PN XFontSet ,
+missing_charset_list_return is set to NULL,
+and missing_charset_count_return is set to zero.
+.LP
+If no font exists for one or more of the required charsets,
+.PN XCreateFontSet
+sets missing_charset_list_return to a
+list of one or more null-terminated charset names for which no font exists
+and sets missing_charset_count_return to the number of missing fonts.
+The charsets are from the list of the required charsets for
+the encoding of the locale and do not include any charsets to which Xlib
+may be able to remap a required charset.
+.LP
+If no font exists for any of the required charsets
+or if the locale definition in Xlib requires that a font exist
+for a particular charset and a font is not found for that charset,
+.PN XCreateFontSet
+returns NULL.
+Otherwise,
+.PN XCreateFontSet
+returns a valid
+.PN XFontSet
+to font_set.
+.LP
+When an Xmb/wc drawing or measuring function is called with an
+.PN XFontSet
+that has missing charsets, some characters in the locale will not be
+drawable.
+If def_string_return is non-NULL,
+.PN XCreateFontSet
+returns a pointer to a string that represents the glyphs
+that are drawn with this
+.PN XFontSet
+when the charsets of the available fonts do not include all font glyphs
+required to draw a codepoint.
+The string does not necessarily consist of valid characters
+in the current locale and is not necessarily drawn with
+the fonts loaded for the font set,
+but the client can draw and measure the default glyphs
+by including this string in a string being drawn or measured with the
+.PN XFontSet .
+.LP
+If the string returned to def_string_return is the empty string ("\^"),
+no glyphs are drawn, and the escapement is zero.
+The returned string is null-terminated.
+It is owned by Xlib and should not be modified or freed by the client.
+It will be freed by a call to
+.PN XFreeFontSet
+with the associated
+.PN XFontSet .
+Until freed, its contents will not be modified by Xlib.
+.LP
+The client is responsible for constructing an error message from the
+missing charset and default string information and may choose to continue
+operation in the case that some fonts did not exist.
+.LP
+The returned
+.PN XFontSet
+and missing charset list should be freed with
+.PN XFreeFontSet
+and
+.PN XFreeStringList ,
+respectively.
+The client-supplied base_font_name_list may be freed
+by the client after calling
+.PN XCreateFontSet .
+.LP
+.sp
+To obtain a list of
+.PN XFontStruct
+structures and full font names given an
+.PN XFontSet ,
+use
+.PN XFontsOfFontSet .
+.IN "XFontsOfFontSet" "" "@DEF@"
+.sM
+.FD 0
+int XFontsOfFontSet\^(\^\fIfont_set\fP\^, \fIfont_struct_list_return\fP\^, \fIfont_name_list_return\fP\^)
+.br
+ XFontSet \fIfont_set\fP\^;
+.br
+ XFontStruct ***\fIfont_struct_list_return\fP\^;
+.br
+ char ***\fIfont_name_list_return\fP\^;
+.FN
+.IP \fIfont_set\fP 1i
+Specifies the font set.
+.IP \fIfont_struct_list_return\fP 1i
+Returns the list of font structs.
+.IP \fIfont_name_list_return\fP 1i
+Returns the list of font names.
+.LP
+.eM
+The
+.PN XFontsOfFontSet
+function returns a list of one or more
+.PN XFontStructs
+and font names for the fonts used by the Xmb and Xwc layers
+for the given font set.
+A list of pointers to the
+.PN XFontStruct
+structures is returned to font_struct_list_return.
+A list of pointers to null-terminated, fully specified font name strings
+in the locale of the font set is returned to font_name_list_return.
+The font_name_list order corresponds to the font_struct_list order.
+The number of
+.PN XFontStruct
+structures and font names is returned as the value of the function.
+.LP
+Because it is not guaranteed that a given character will be imaged using a
+single font glyph,
+there is no provision for mapping a character or default string
+to the font properties, font ID, or direction hint for the font
+for the character.
+The client may access the
+.PN XFontStruct
+list to obtain these values for all the fonts currently in use.
+.LP
+Xlib does not guarantee that fonts are loaded from the server
+at the creation of an
+.PN XFontSet .
+Xlib may choose to cache font data, loading it only as needed to draw text
+or compute text dimensions.
+Therefore, existence of the per_char metrics in the
+.PN XFontStruct
+structures in the
+.PN XFontStructSet
+is undefined.
+Also, note that all properties in the
+.PN XFontStruct
+structures are in the STRING encoding.
+.LP
+The
+.PN XFontStruct
+and font name lists are owned by Xlib
+and should not be modified or freed by the client.
+They will be freed by a call to
+.PN XFreeFontSet
+with the associated
+.PN XFontSet .
+Until freed, their contents will not be modified by Xlib.
+.LP
+.sp
+To obtain the base font name list and the selected font name list given an
+.PN XFontSet ,
+use
+.PN XBaseFontNameListOfFontSet .
+.IN "XBaseFontNameListOfFontSet" "" "@DEF@"
+.sM
+.FD 0
+char *XBaseFontNameListOfFontSet\^(\^\fIfont_set\fP\^)
+.br
+ XFontSet \fIfont_set\fP\^;
+.FN
+.IP \fIfont_set\fP 1i
+Specifies the font set.
+.LP
+.eM
+The
+.PN XBaseFontNameListOfFontSet
+function returns the original base font name list supplied
+by the client when the
+.PN XFontSet
+was created.
+A null-terminated string containing a list of
+comma-separated font names is returned
+as the value of the function.
+White space may appear immediately on either side of separating commas.
+.LP
+If
+.PN XCreateFontSet
+obtained an XLFD name from the font properties for the font specified
+by a non-XLFD base name, the
+.PN XBaseFontNameListOfFontSet
+function will return the XLFD name instead of the non-XLFD base name.
+.LP
+The base font name list is owned by Xlib and should not be modified or
+freed by the client.
+It will be freed by a call to
+.PN XFreeFontSet
+with the associated
+.PN XFontSet .
+Until freed, its contents will not be modified by Xlib.
+.LP
+.sp
+To obtain the locale name given an
+.PN XFontSet ,
+use
+.PN XLocaleOfFontSet .
+.IN "XLocaleOfFontSet" "" "@DEF@"
+.sM
+.FD 0
+char *XLocaleOfFontSet\^(\^\fIfont_set\fP\^)
+.br
+ XFontSet \fIfont_set\fP\^;
+.FN
+.IP \fIfont_set\fP 1i
+Specifies the font set.
+.LP
+.eM
+The
+.PN XLocaleOfFontSet
+function
+returns the name of the locale bound to the specified
+.PN XFontSet ,
+as a null-terminated string.
+.LP
+The returned locale name string is owned by Xlib
+and should not be modified or freed by the client.
+It may be freed by a call to
+.PN XFreeFontSet
+with the associated
+.PN XFontSet .
+Until freed, it will not be modified by Xlib.
+.LP
+.sp
+The
+.PN XFreeFontSet
+function is a convenience function for freeing an output context.
+.PN XFreeFontSet
+also frees its associated
+.PN XOM
+if the output context was created by
+.PN XCreateFontSet .
+.IN "XFreeFontSet" "" "@DEF@"
+.sM
+.FD 0
+void XFreeFontSet\^(\^\fIdisplay\fP\^, \fIfont_set\fP\^)
+.br
+ Display *\fIdisplay\fP\^;
+.br
+ XFontSet \fIfont_set\fP\^;
+.FN
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIfont_set\fP 1i
+Specifies the font set.
+.LP
+.eM
+The
+.PN XFreeFontSet
+function frees the specified font set.
+The associated base font name list, font name list,
+.PN XFontStruct
+list, and
+.PN XFontSetExtents ,
+if any, are freed.
+.NH 3
+Obtaining Font Set Metrics
+.XS
+\*(SN Obtaining Font Set Metrics
+.XE
+.LP
+Metrics for the internationalized text drawing functions
+are defined in terms of a primary draw direction,
+which is the default direction in which the character origin advances
+for each succeeding character in the string.
+The Xlib interface is currently defined to support only a left-to-right
+primary draw direction.
+The drawing origin is the position passed to the drawing function
+when the text is drawn.
+The baseline is a line drawn through the drawing origin parallel
+to the primary draw direction.
+Character ink is the pixels painted in the foreground color
+and does not include interline or intercharacter spacing
+or image text background pixels.
+.LP
+The drawing functions are allowed to implement implicit text
+directionality control, reversing the order in which characters are
+rendered along the primary draw direction in response to locale-specific
+lexical analysis of the string.
+.LP
+Regardless of the character rendering order,
+the origins of all characters are on the primary draw direction side
+of the drawing origin.
+The screen location of a particular character image may be determined with
+.PN XmbTextPerCharExtents
+or
+.PN XwcTextPerCharExtents .
+.LP
+The drawing functions are allowed to implement context-dependent
+rendering, where the glyphs drawn for a string are not simply a
+concatenation of the glyphs that represent each individual character.
+A string of two characters drawn with
+.PN XmbDrawString
+may render differently than if the two characters
+were drawn with separate calls to
+.PN XmbDrawString .
+If the client appends or inserts a character
+in a previously drawn string,
+the client may need to redraw some adjacent characters
+to obtain proper rendering.
+.LP
+.sp
+To find out about direction-dependent rendering, use
+.PN XDirectionalDependentDrawing .
+.IN "XDirectionalDependentDrawing" "" "@DEF@"
+.sM
+.FD 0
+Bool XDirectionalDependentDrawing\^(\^\fIfont_set\fP\^)
+.br
+ XFontSet \fIfont_set\fP\^;
+.FN
+.IP \fIfont_set\fP 1i
+Specifies the font set.
+.LP
+.eM
+The
+.PN XDirectionalDependentDrawing
+function returns
+.PN True
+if the drawing functions implement implicit text directionality;
+otherwise, it returns
+.PN False .
+.LP
+.sp
+To find out about context-dependent rendering, use
+.PN XContextualDrawing .
+.IN "XContextualDrawing" "" "@DEF@"
+.sM
+.FD 0
+Bool XContextualDrawing\^(\^\fIfont_set\fP\^)
+.br
+ XFontSet \fIfont_set\fP\^;
+.FN
+.IP \fIfont_set\fP 1i
+Specifies the font set.
+.LP
+.eM
+The
+.PN XContextualDrawing
+function returns
+.PN True
+if text drawn with the font set might include context-dependent drawing;
+otherwise, it returns
+.PN False .
+.LP
+.sp
+To find out about context-dependent or direction-dependent rendering, use
+.PN XContextDependentDrawing .
+.IN "XContextDependentDrawing" "" "@DEF@"
+.sM
+.FD 0
+Bool XContextDependentDrawing\^(\^\fIfont_set\fP\^)
+.br
+ XFontSet \fIfont_set\fP\^;
+.FN
+.IP \fIfont_set\fP 1i
+Specifies the font set.
+.LP
+.eM
+The
+.PN XContextDependentDrawing
+function returns
+.PN True
+if the drawing functions implement implicit text directionality or
+if text drawn with the font_set might include context-dependent drawing;
+otherwise, it returns
+.PN False .
+.LP
+The drawing functions do not interpret newline, tab, or other control
+characters.
+The behavior when nonprinting characters other than space are drawn
+is implementation-dependent.
+It is the client's responsibility to interpret control characters
+in a text stream.
+.LP
+The maximum character extents for the fonts that are used by the text
+drawing layers can be accessed by the
+.PN XFontSetExtents
+structure:
+.IN "XFontSetExtents" "" "@DEF@"
+.LP
+.Ds 0
+.TA .5i 3i
+.ta .5i 3i
+typedef struct {
+ XRectangle max_ink_extent; /* over all drawable characters */
+ XRectangle max_logical_extent; /* over all drawable characters */
+} XFontSetExtents;
+.De
+.LP
+The
+.PN XRectangle
+structures used to return font set metrics are the usual Xlib screen-oriented
+rectangles
+with x, y giving the upper left corner, and width and height always positive.
+.LP
+The max_ink_extent member gives the maximum extent, over all drawable characters, of
+the rectangles that bound the character glyph image drawn in the
+foreground color, relative to a constant origin.
+See
+.PN XmbTextExtents
+and
+.PN XwcTextExtents
+for detailed semantics.
+.LP
+The max_logical_extent member gives the maximum extent,
+over all drawable characters, of the rectangles
+that specify minimum spacing to other graphical features,
+relative to a constant origin.
+Other graphical features drawn by the client, for example,
+a border surrounding the text, should not intersect this rectangle.
+The max_logical_extent member should be used to compute minimum
+interline spacing and the minimum area that must be allowed
+in a text field to draw a given number of arbitrary characters.
+.LP
+Due to context-dependent rendering,
+appending a given character to a string may change
+the string's extent by an amount other than that character's
+individual extent.
+.LP
+The rectangles for a given character in a string can be obtained from
+.PN XmbPerCharExtents
+or
+.PN XwcPerCharExtents .
+.LP
+.sp
+To obtain the maximum extents structure given an
+.PN XFontSet ,
+use
+.PN XExtentsOfFontSet .
+.IN "XExtentsOfFontSet" "" "@DEF@"
+.sM
+.FD 0
+XFontSetExtents *XExtentsOfFontSet\^(\^\fIfont_set\fP\^)
+.br
+ XFontSet \fIfont_set\fP\^;
+.FN
+.IP \fIfont_set\fP 1i
+Specifies the font set.
+.LP
+.eM
+The
+.PN XExtentsOfFontSet
+function returns an
+.PN XFontSetExtents
+structure for the fonts used by the Xmb and Xwc layers
+for the given font set.
+.LP
+The
+.PN XFontSetExtents
+structure is owned by Xlib and should not be modified
+or freed by the client.
+It will be freed by a call to
+.PN XFreeFontSet
+with the associated
+.PN XFontSet .
+Until freed, its contents will not be modified by Xlib.
+.LP
+.sp
+To obtain the escapement in pixels of the specified text as a value,
+use
+.PN XmbTextEscapement
+or
+.PN XwcTextEscapement .
+.IN "XmbTextEscapement" "" "@DEF@"
+.IN "XwcTextEscapement" "" "@DEF@"
+.sM
+.FD 0
+int XmbTextEscapement\^(\^\fIfont_set\fP\^, \fIstring\fP\^, \fInum_bytes\fP\^)
+.br
+ XFontSet \fIfont_set\fP\^;
+.br
+ char *\fIstring\fP\^;
+.br
+ int \fInum_bytes\fP\^;
+.FN
+.FD 0
+int XwcTextEscapement\^(\^\fIfont_set\fP\^, \fIstring\fP\^, \fInum_wchars\fP\^)
+.br
+ XFontSet \fIfont_set\fP\^;
+.br
+ wchar_t *\fIstring\fP\^;
+.br
+ int \fInum_wchars\fP\^;
+.FN
+.IP \fIfont_set\fP 1i
+Specifies the font set.
+.IP \fIstring\fP 1i
+Specifies the character string.
+.IP \fInum_bytes\fP 1i
+Specifies the number of bytes in the string argument.
+.IP \fInum_wchars\fP 1i
+Specifies the number of characters in the string argument.
+.LP
+.eM
+The
+.PN XmbTextEscapement
+and
+.PN XwcTextEscapement
+functions return the escapement in pixels of the specified string as a value,
+using the fonts loaded for the specified font set.
+The escapement is the distance in pixels in the primary draw
+direction from the drawing origin to the origin of the next character to
+be drawn, assuming that the rendering of the next character is not
+dependent on the supplied string.
+.LP
+Regardless of the character rendering order,
+the escapement is always positive.
+.LP
+.sp
+To obtain the overall_ink_return and overall_logical_return arguments,
+the overall bounding box of the string's image, and a logical bounding box,
+use
+.PN XmbTextExtents
+ or
+.PN XwcTextExtents .
+.IN "XmbTextExtents" "" "@DEF@"
+.IN "XwcTextExtents" "" "@DEF@"
+.sM
+.FD 0
+int XmbTextExtents\^(\^\fIfont_set\fP\^, \fIstring\fP\^, \fInum_bytes\fP\^, \fIoverall_ink_return\fP\^, \fIoverall_logical_return\fP\^)
+.br
+ XFontSet \fIfont_set\fP\^;
+.br
+ char *\fIstring\fP\^;
+.br
+ int \fInum_bytes\fP\^;
+.br
+ XRectangle *\fIoverall_ink_return\fP\^;
+.br
+ XRectangle *\fIoverall_logical_return\fP\^;
+.FN
+.FD 0
+int XwcTextExtents\^(\^\fIfont_set\fP\^, \fIstring\fP\^, \fInum_wchars\fP\^,
+\fIoverall_ink_return\fP\^, \fIoverall_logical_return\fP\^)
+.br
+ XFontSet \fIfont_set\fP\^;
+.br
+ wchar_t *\fIstring\fP\^;
+.br
+ int \fInum_wchars\fP\^;
+.br
+ XRectangle *\fIoverall_ink_return\fP\^;
+.br
+ XRectangle *\fIoverall_logical_return\fP\^;
+.FN
+.IP \fIfont_set\fP 1i
+Specifies the font set.
+.IP \fIstring\fP 1i
+Specifies the character string.
+.IP \fInum_bytes\fP 1i
+Specifies the number of bytes in the string argument.
+.IP \fInum_wchars\fP 1i
+Specifies the number of characters in the string argument.
+.ds Ov dimensions
+.IP \fIoverall_ink_return\fP 1i
+Returns the overall ink \*(Ov.
+.IP \fIoverall_logical_return\fP 1i
+Returns the overall logical \*(Ov.
+.LP
+.eM
+The
+.PN XmbTextExtents
+and
+.PN XwcTextExtents
+functions set the components of the specified overall_ink_return and
+overall_logical_return
+arguments to the overall bounding box of the string's image
+and a logical bounding box for spacing purposes, respectively.
+They return the value returned by
+.PN XmbTextEscapement
+or
+.PN XwcTextEscapement .
+These metrics are relative to the drawing origin of the string,
+using the fonts loaded for the specified font set.
+.LP
+If the overall_ink_return argument is non-NULL,
+it is set to the bounding box of the string's character ink.
+The overall_ink_return for a nondescending, horizontally drawn
+Latin character is conventionally entirely above the baseline;
+that is, overall_ink_return.height <= \-overall_ink_return.y.
+The overall_ink_return for a nonkerned character
+is entirely at, and to the right of, the origin;
+that is, overall_ink_return.x >= 0.
+A character consisting of a single pixel at the origin would set
+overall_ink_return fields y = 0, x = 0, width = 1, and height = 1.
+.LP
+If the overall_logical_return argument is non-NULL,
+it is set to the bounding box that provides minimum spacing
+to other graphical features for the string.
+Other graphical features, for example, a border surrounding the text,
+should not intersect this rectangle.
+.LP
+When the
+.PN XFontSet
+has missing charsets,
+metrics for each unavailable character are taken
+from the default string returned by
+.PN XCreateFontSet
+so that the metrics represent the text as it will actually be drawn.
+The behavior for an invalid codepoint is undefined.
+.LP
+To determine the effective drawing origin for a character in a drawn string,
+the client should call
+.PN XmbTextPerCharExtents
+on the entire string, then on the character,
+and subtract the x values of the returned
+rectangles for the character.
+This is useful to redraw portions of a line of text
+or to justify words, but for context-dependent rendering,
+the client should not assume that it can redraw the character by itself
+and get the same rendering.
+.LP
+.sp
+To obtain per-character information for a text string,
+use
+.PN XmbTextPerCharExtents
+or
+.PN XwcTextPerCharExtents .
+.IN "XmbTextPerCharExtents" "" "@DEF@"
+.IN "XwcTextPerCharExtents" "" "@DEF@"
+.sM
+.FD 0
+Status XmbTextPerCharExtents\^(\^\fIfont_set\fP\^, \fIstring\fP\^, \fInum_bytes\fP\^, \fIink_array_return\fP\^,
+.br
+ \fIlogical_array_return\fP\^, \fIarray_size\fP\^, \fInum_chars_return\fP\^, \fIoverall_ink_return\fP\^, \fIoverall_logical_return\fP\^)
+.br
+ XFontSet \fIfont_set\fP\^;
+.br
+ char *\fIstring\fP\^;
+.br
+ int \fInum_bytes\fP\^;
+.br
+ XRectangle *\fIink_array_return\fP\^;
+.br
+ XRectangle *\fIlogical_array_return\fP\^;
+.br
+ int \fIarray_size\fP\^;
+.br
+ int *\fInum_chars_return\fP\^;
+.br
+ XRectangle *\fIoverall_ink_return\fP\^;
+.br
+ XRectangle *\fIoverall_logical_return\fP\^;
+.FN
+.FD 0
+Status XwcTextPerCharExtents\^(\^\fIfont_set\fP\^, \fIstring\fP\^, \fInum_wchars\fP\^, \fIink_array_return\fP\^,
+.br
+ \fIlogical_array_return\fP\^, \fIarray_size\fP\^, \fInum_chars_return\fP\^, \fIoverall_ink_return\fP\^, \fIoverall_ink_return\fP\^)
+.br
+ XFontSet \fIfont_set\fP\^;
+.br
+ wchar_t *\fIstring\fP\^;
+.br
+ int \fInum_wchars\fP\^;
+.br
+ XRectangle *\fIink_array_return\fP\^;
+.br
+ XRectangle *\fIlogical_array_return\fP;
+.br
+ int \fIarray_size\fP\^;
+.br
+ int *\fInum_chars_return\fP\^;
+.br
+ XRectangle *\fIoverall_ink_return\fP\^;
+.br
+ XRectangle *\fIoverall_logical_return\fP\^;
+.FN
+.IP \fIfont_set\fP 1i
+Specifies the font set.
+.IP \fIstring\fP 1i
+Specifies the character string.
+.IP \fInum_bytes\fP 1i
+Specifies the number of bytes in the string argument.
+.IP \fInum_wchars\fP 1i
+Specifies the number of characters in the string argument.
+.IP \fIink_array_return\fP 1i
+Returns the ink dimensions for each character.
+.IP \fIlogical_array_return\fP 1i
+Returns the logical dimensions for each character.
+.IP \fIarray_size\fP 1i
+Specifies the size of ink_array_return and logical_array_return.
+The caller must pass in arrays of this size.
+.IP \fInum_chars_return\fP 1i
+Returns the number of characters in the string argument.
+.ds Ov extents of the entire string
+.IP \fIoverall_ink_return\fP 1i
+Returns the overall ink \*(Ov.
+.IP \fIoverall_logical_return\fP 1i
+Returns the overall logical \*(Ov.
+.LP
+.eM
+The
+.PN XmbTextPerCharExtents
+and
+.PN XwcTextPerCharExtents
+functions return the text dimensions of each character of the specified text,
+using the fonts loaded for the specified font set.
+Each successive element of ink_array_return and logical_array_return
+is set to the successive character's drawn metrics,
+relative to the drawing origin of the string and one
+rectangle
+for each character in the supplied text string.
+The number of elements of ink_array_return and logical_array_return
+that have been set is returned to num_chars_return.
+.LP
+Each element of ink_array_return is set to the bounding box
+of the corresponding character's drawn foreground color.
+Each element of logical_array_return is set to the bounding box
+that provides minimum spacing to other graphical features
+for the corresponding character.
+Other graphical features should not intersect any of the
+logical_array_return rectangles.
+.LP
+Note that an
+.PN XRectangle
+represents the effective drawing dimensions of the character,
+regardless of the number of font glyphs that are used to draw
+the character or the direction in which the character is drawn.
+If multiple characters map to a single character glyph,
+the dimensions of all the
+.PN XRectangles
+of those characters are the same.
+.LP
+When the
+.PN XFontSet
+has missing charsets, metrics for each unavailable
+character are taken from the default string returned by
+.PN XCreateFontSet
+so that the metrics represent the text as it will actually be drawn.
+The behavior for an invalid codepoint is undefined.
+.LP
+If the array_size is too small for the number of characters in the
+supplied text, the functions return zero
+and num_chars_return is set to the number of rectangles required.
+Otherwise, the functions return a nonzero value.
+.LP
+If the overall_ink_return or overall_logical_return argument is non-NULL,
+.PN XmbTextPerCharExtents
+and
+.PN XwcTextPerCharExtents
+return the maximum extent of the string's metrics to overall_ink_return
+or overall_logical_return, as returned by
+.PN XmbTextExtents
+or
+.PN XwcTextExtents .
+.NH 3
+Drawing Text Using Font Sets
+.XS
+\*(SN Drawing Text Using Font Sets
+.XE
+.LP
+The functions defined in this section
+draw text at a specified location in a drawable.
+They are similar to the functions
+.PN XDrawText ,
+.PN XDrawString ,
+and
+.PN XDrawImageString
+except that they work with font sets instead of single fonts
+and interpret the text based on the locale of the font set
+instead of treating the bytes of the string as direct font indexes.
+See section 8.6 for details of the use of Graphics Contexts (GCs)
+and possible protocol errors.
+If a
+.PN BadFont
+error is generated,
+characters prior to the offending character may have been drawn.
+.LP
+The text is drawn using the fonts loaded for the specified font set;
+the font in the GC is ignored and may be modified by the functions.
+No validation that all fonts conform to some width rule is performed.
+.LP
+The text functions
+.PN XmbDrawText
+and
+.PN XwcDrawText
+use the following structures:
+.LP
+.IN "XmbTextItem" "" "@DEF@"
+.sM
+.Ds 0
+.TA .5i 2.5i
+.ta .5i 2.5i
+typedef struct {
+ char *chars; /* pointer to string */
+ int nchars; /* number of bytes */
+ int delta; /* pixel delta between strings */
+ XFontSet font_set; /* fonts, None means don't change */
+} XmbTextItem;
+.De
+.LP
+.IN "XwcTextItem" "" "@DEF@"
+.Ds 0
+.TA .5i 2.5i
+.ta .5i 2.5i
+typedef struct {
+ wchar_t *chars; /* pointer to wide char string */
+ int nchars; /* number of wide characters */
+ int delta; /* pixel delta between strings */
+ XFontSet font_set; /* fonts, None means don't change */
+} XwcTextItem;
+.De
+.LP
+.eM
+.sp
+To draw text using multiple font sets in a given drawable, use
+.PN XmbDrawText
+or
+.PN XwcDrawText .
+.IN "XmbDrawText" "" "@DEF@"
+.IN "XwcDrawText" "" "@DEF@"
+.sM
+.FD 0
+void XmbDrawText\^(\^\fIdisplay\fP\^, \fId\fP\^, \fIgc\fP\^, \fIx\fP\^, \fIy\fP\^, \fIitems\fP\^, \fInitems\fP\^)
+.br
+ Display *\fIdisplay\fP\^;
+.br
+ Drawable \fId\fP\^;
+.br
+ GC \fIgc\fP\^;
+.br
+ int \fIx\fP\^, \fIy\fP\^;
+.br
+ XmbTextItem *\fIitems\fP\^;
+.br
+ int \fInitems\fP\^;
+.FN
+.FD 0
+void XwcDrawText\^(\^\fIdisplay\fP\^, \fId\fP\^, \fIgc\fP\^, \fIx\fP\^, \fIy\fP\^, \fIitems\fP\^, \fInitems\fP\^)
+.br
+ Display *\fIdisplay\fP\^;
+.br
+ Drawable \fId\fP\^;
+.br
+ GC \fIgc\fP\^;
+.br
+ int \fIx\fP\^, \fIy\fP\^;
+.br
+ XwcTextItem *\fIitems\fP\^;
+.br
+ int \fInitems\fP\^;
+.FN
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fId\fP 1i
+Specifies the drawable.
+.IP \fIgc\fP 1i
+Specifies the GC.
+.ds Xy
+.IP \fIx\fP 1i
+.br
+.ns
+.IP \fIy\fP 1i
+Specify the x and y coordinates\*(Xy.
+.IP \fIitems\fP 1i
+Specifies an array of text items.
+.IP \fInitems\fP 1i
+Specifies the number of text items in the array.
+.LP
+.eM
+The
+.PN XmbDrawText
+and
+.PN XwcDrawText
+functions allow complex spacing and font set shifts between text strings.
+Each text item is processed in turn, with the origin of a text
+element advanced in the primary draw direction by the escapement of the
+previous text item.
+A text item delta specifies an additional escapement of the text item
+drawing origin in the primary draw direction.
+A font_set member other than
+.PN None
+in an item causes the font set to be used for this and subsequent text items
+in the text_items list.
+Leading text items with a font_set member set to
+.PN None
+will not be drawn.
+.LP
+.PN XmbDrawText
+and
+.PN XwcDrawText
+do not perform any context-dependent rendering between text segments.
+Clients may compute the drawing metrics by passing each text segment to
+.PN XmbTextExtents
+and
+.PN XwcTextExtents
+or
+.PN XmbTextPerCharExtents
+and
+.PN XwcTextPerCharExtents .
+When the
+.PN XFontSet
+has missing charsets, each unavailable character is drawn
+with the default string returned by
+.PN XCreateFontSet .
+The behavior for an invalid codepoint is undefined.
+.LP
+.sp
+To draw text using a single font set in a given drawable, use
+.PN XmbDrawString
+or
+.PN XwcDrawString .
+.IN "XmbDrawString" "" "@DEF@"
+.IN "XwcDrawString" "" "@DEF@"
+.sM
+.FD 0
+void XmbDrawString\^(\^\fIdisplay\fP\^, \fId\fP\^, \fIfont_set\fP\^, \fIgc\fP\^, \fIx\fP\^, \fIy\fP\^, \fIstring\fP\^, \fInum_bytes\fP\^)
+.br
+ Display *\fIdisplay\fP\^;
+.br
+ Drawable \fId\fP\^;
+.br
+ XFontSet \fIfont_set\fP\^;
+.br
+ GC \fIgc\fP\^;
+.br
+ int \fIx\fP\^, \fIy\fP\^;
+.br
+ char *\fIstring\fP\^;
+.br
+ int \fInum_bytes\fP\^;
+.FN
+.FD 0
+void XwcDrawString\^(\^\fIdisplay\fP\^, \fId\fP\^, \fIfont_set\fP\^, \fIgc\fP\^, \fIx\fP\^, \fIy\fP\^, \fIstring\fP\^, \fInum_wchars\fP\^)
+.br
+ Display *\fIdisplay\fP\^;
+.br
+ Drawable \fId\fP\^;
+.br
+ XFontSet \fIfont_set\fP\^;
+.br
+ GC \fIgc\fP\^;
+.br
+ int \fIx\fP\^, \fIy\fP\^;
+.br
+ wchar_t *\fIstring\fP\^;
+.br
+ int \fInum_wchars\fP\^;
+.FN
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fId\fP 1i
+Specifies the drawable.
+.IP \fIfont_set\fP 1i
+Specifies the font set.
+.IP \fIgc\fP 1i
+Specifies the GC.
+.ds Xy
+.IP \fIx\fP 1i
+.br
+.ns
+.IP \fIy\fP 1i
+Specify the x and y coordinates\*(Xy.
+.IP \fIstring\fP 1i
+Specifies the character string.
+.IP \fInum_bytes\fP 1i
+Specifies the number of bytes in the string argument.
+.IP \fInum_wchars\fP 1i
+Specifies the number of characters in the string argument.
+.LP
+.eM
+The
+.PN XmbDrawString
+and
+.PN XwcDrawString
+functions draw the specified text with the foreground pixel.
+When the
+.PN XFontSet
+has missing charsets, each unavailable character is drawn
+with the default string returned by
+.PN XCreateFontSet .
+The behavior for an invalid codepoint is undefined.
+.LP
+.sp
+To draw image text using a single font set in a given drawable, use
+.PN XmbDrawImageString
+or
+.PN XwcDrawImageString .
+.IN "XmbDrawImageString" "" "@DEF@"
+.IN "XwcDrawImageString" "" "@DEF@"
+.sM
+.FD 0
+void XmbDrawImageString\^(\^\fIdisplay\fP\^, \fId\fP\^, \fIfont_set\fP\^, \fIgc\fP\^, \fIx\fP\^, \fIy\fP\^, \fIstring\fP\^, \fInum_bytes\fP\^)
+.br
+ Display *\fIdisplay\fP\^;
+.br
+ Drawable \fId\fP\^;
+.br
+ XFontSet \fIfont_set\fP\^;
+.br
+ GC \fIgc\fP\^;
+.br
+ int \fIx\fP\^, \fIy\fP\^;
+.br
+ char *\fIstring\fP\^;
+.br
+ int \fInum_bytes\fP\^;
+.FN
+.FD 0
+void XwcDrawImageString\^(\^\fIdisplay\fP\^, \fId\fP\^, \fIfont_set\fP\^, \fIgc\fP\^, \fIx\fP\^, \fIy\fP\^, \fIstring\fP\^, \fInum_wchars\fP\^)
+.br
+ Display *\fIdisplay\fP\^;
+.br
+ Drawable \fId\fP\^;
+.br
+ XFontSet \fIfont_set\fP\^;
+.br
+ GC \fIgc\fP\^;
+.br
+ int \fIx\fP\^, \fIy\fP\^;
+.br
+ wchar_t *\fIstring\fP\^;
+.br
+ int \fInum_wchars\fP\^;
+.FN
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fId\fP 1i
+Specifies the drawable.
+.IP \fIfont_set\fP 1i
+Specifies the font set.
+.IP \fIgc\fP 1i
+Specifies the GC.
+.ds Xy
+.IP \fIx\fP 1i
+.br
+.ns
+.IP \fIy\fP 1i
+Specify the x and y coordinates\*(Xy.
+.IP \fIstring\fP 1i
+Specifies the character string.
+.IP \fInum_bytes\fP 1i
+Specifies the number of bytes in the string argument.
+.IP \fInum_wchars\fP 1i
+Specifies the number of characters in the string argument.
+.LP
+.eM
+The
+.PN XmbDrawImageString
+and
+.PN XwcDrawImageString
+functions fill a destination rectangle with the background pixel defined
+in the GC and then paint the text with the foreground pixel.
+The filled rectangle is the rectangle returned to overall_logical_return by
+.PN XmbTextExtents
+or
+.PN XwcTextExtents
+for the same text and
+.PN XFontSet .
+.LP
+When the
+.PN XFontSet
+has missing charsets, each unavailable character is drawn
+with the default string returned by
+.PN XCreateFontSet .
+The behavior for an invalid codepoint is undefined.
+.NH 2
+Input Methods
+.XS
+\*(SN Input Methods
+.XE
+.LP
+This section provides discussions of the following X Input Method
+(XIM) topics:
+.IP \(bu 5
+Input method overview
+.IP \(bu 5
+Input method management
+.IP \(bu 5
+Input method functions
+.IP \(bu 5
+Input method values
+.IP \(bu 5
+Input context functions
+.IP \(bu 5
+Input context values
+.IP \(bu 5
+Input method callback semantics
+.IP \(bu 5
+Event filtering
+.IP \(bu 5
+Getting keyboard input
+.IP \(bu 5
+Input method conventions
+.NH 3
+Input Method Overview
+.XS
+\*(SN Input Method Overview
+.XE
+.LP
+This section provides definitions for terms and concepts used
+for internationalized text input and a brief overview of the
+intended use of the mechanisms provided by Xlib.
+.LP
+A large number of languages in the world use alphabets
+consisting of a small set of symbols (letters) to form words.
+To enter text into a computer in an alphabetic language,
+a user usually has a keyboard on which there exist 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 an English-based keyboard.
+They need to hit a combination of keystrokes
+to enter a character that does not exist directly on the keyboard.
+A number of algorithms have been developed for entering such characters.
+These are known as European input methods, compose input methods,
+or dead-key input methods.
+.LP
+Japanese is an example of a language with a phonetic symbol set,
+where each symbol represents a specific sound.
+There are two phonetic symbol sets in Japanese: Katakana and Hiragana.
+In general,
+Katakana is used for words that are of foreign origin,
+and Hiragana is used for writing native Japanese words.
+Collectively, the two systems are called Kana.
+Each set consists of 48 characters.
+.LP
+Korean also has a phonetic symbol set, called Hangul.
+Each of the 24 basic phonetic symbols (14 consonants and 10 vowels)
+represents a specific sound.
+A syllable is composed of two or three parts:
+the initial consonants, the vowels, and the optional last consonants.
+With Hangul,
+syllables can be treated as the basic units on which text processing is done.
+For example,
+a delete operation may work on a phonetic symbol or a syllable.
+Korean code sets include several thousands of these syllables.
+A user types the phonetic symbols that make up the syllables of the words
+to be entered.
+The display may change as each phonetic symbol is entered.
+For example,
+when the second phonetic symbol of a syllable is entered,
+the first phonetic symbol may change its shape and size.
+Likewise, when the third phonetic symbol is entered,
+the first two phonetic symbols may change their shape and size.
+.LP
+Not all languages rely solely on alphabetic or phonetic systems.
+Some languages, including Japanese and Korean, employ an
+ideographic writing system.
+In an ideographic 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 can be very large:
+approximately 50,000 have been identified in Hanzi,
+the Chinese ideographic system.
+.LP
+Two major aspects of ideographic systems impact their use with computers.
+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.
+This makes 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 mechanism is required for entering characters
+so that a keyboard with a reasonable number of keys can be used.
+Those input methods are usually based on phonetics,
+but there also exist methods based on the graphical properties of
+characters.
+.LP
+In Japan, both Kana and the ideographic system Kanji are used.
+In Korea, Hangul and sometimes the ideographic system Hanja are used.
+Now consider entering ideographs in Japan, Korea, China, and Taiwan.
+.LP
+In Japan, either Kana or English characters are typed and then a region
+is selected (sometimes automatically) for conversion to Kanji.
+Several Kanji characters may have the same phonetic representation.
+If that is the case with the string entered,
+a menu of characters is presented and
+the user must choose the appropriate one.
+If no choice is necessary or a preference has been established,
+the input method does the substitution directly.
+When Latin characters are converted to Kana or Kanji,
+it is called a romaji conversion.
+.LP
+In Korea, it is usually acceptable to keep Korean text in Hangul form,
+but some people may choose to write Hanja-originated words in Hanja
+rather than in Hangul.
+To change Hangul to Hanja,
+the user selects a region for conversion
+and then follows the same basic method as that described for Japanese.
+.LP
+Probably because there are well-accepted phonetic writing systems
+for Japanese and Korean,
+computer input methods in these countries for entering ideographs
+are fairly standard.
+Keyboard keys have both English characters and phonetic symbols
+engraved on them, and the user can switch between the two sets.
+.LP
+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.
+.LP
+Also, there are actually two ideographic sets used:
+Traditional Chinese (the original written Chinese)
+and Simplified Chinese.
+Several years ago,
+the People's Republic of China launched a campaign to simplify
+some ideographic characters and eliminate redundancies altogether.
+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.
+.NH 4
+Input Method Architecture
+.XS
+\*(SN Input Method Architecture
+.XE
+.LP
+As shown in the previous section,
+there are many different input methods in use today,
+each varying with language, culture, and history.
+A common feature of many input methods is that the user may type
+multiple keystrokes to compose a single character (or set
+of characters).
+The process of composing characters from keystrokes is called
+\fIpreediting\fP.
+It may require complex algorithms and large dictionaries
+involving substantial computer resources.
+.LP
+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 dictionaries, and so on.
+The input method areas of concern are as follows:
+.IP \(bu 5
+The \fIstatus\fP area is a logical extension of the
+LEDs that exist on the physical keyboard.
+It is a window that is intended to present the internal state
+of the input method that is critical to the user.
+The status area may consist of text data and bitmaps or some combination.
+.IP \(bu 5
+The \fIpreedit\fP area displays the
+intermediate text for those languages that are composing prior to
+the client handling the data.
+.IP \(bu 5
+The \fIauxiliary\fP 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 an input method.
+Auxiliary areas are managed by the input method independent of the client.
+Auxiliary areas are assumed to be separate dialogs,
+which are maintained by the input method.
+.LP
+There are various user interaction styles used for preediting.
+The ones supported by Xlib are as follows:
+.IP \(bu 5
+For \fIon-the-spot\fP input methods,
+preediting data will be displayed directly in the application window.
+Application data is moved to allow preedit data to appear
+at the point of insertion.
+.IP \(bu 5
+\fIOver-the-spot\fP preediting means that the data is displayed in
+a preedit window that is placed over the point of insertion.
+.IP \(bu 5
+\fIOff-the-spot\fP preediting means that the preedit window is
+inside the application window but not at the point of insertion.
+Often, this type of window is placed at the bottom of the application window.
+.IP \(bu 5
+\fIRoot-window\fP preediting refers to input methods that use a preedit
+window that is the child of
+.PN RootWindow .
+.LP
+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,
+a goal of the Xlib design is to allow an application
+to communicate with an input method placed in a separate process.
+Such a process is called an \fIinput server\fP.
+The server to which the application should connect is dependent on
+the environment when the application is started up,
+that is, the user language and the actual encoding to be used for it.
+The input method connection is said to be \fIlocale-dependent\fP.
+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).
+.LP
+Using an input server implies communication overhead,
+but applications can be migrated without relinking.
+Input methods can be implemented either as a
+stub communicating to an input server or as a local library.
+.LP
+An input method may be based on a \fIfront-end\fP or a \fIback-end\fP
+architecture.
+In a front-end architecture,
+there are two separate connections to the X server:
+keystrokes go directly from the X server to the input method on
+one connection and other events to the regular client connection.
+The input method is then acting as a filter and sends composed strings
+to the client.
+A front-end architecture requires synchronization between the
+two connections to avoid lost key events or locking issues.
+.LP
+In a back-end architecture,
+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 (that is, a server),
+there must be a special communication protocol between the back-end client
+and the input server.
+.LP
+A front-end architecture introduces synchronization issues
+and a filtering mechanism for noncharacter keystrokes
+(Function keys, Help, and so on).
+A back-end architecture sometimes implies more communication overhead
+and more process switching.
+If all three processes (X server, input server, client)
+are running on a single workstation,
+there are two process switches for each keystroke in a back-end
+architecture,
+but there is only one in a front-end architecture.
+.LP
+The abstraction used by a client to communicate with an input method
+is an opaque data structure represented by the
+.PN XIM
+data type.
+This data structure is returned by the
+.PN XOpenIM
+function, which opens an input method on a given display.
+Subsequent operations on this data structure encapsulate all communication
+between client and input method.
+There is no need for an X client to use any networking library
+or natural language package to use an input method.
+.LP
+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 (single) locale associated with the
+.PN XIM
+object.
+.NH 4
+Input Contexts
+.XS
+\*(SN Input Contexts
+.XE
+.LP
+Xlib provides the ability to manage a multi-threaded state for text input.
+A client may be using multiple windows,
+each window with multiple text entry areas,
+and the user possibly switching among them at any time.
+The abstraction for representing the state of a particular input thread
+is called an \fIinput context\fP.
+The Xlib representation of an input context is an
+.PN XIC .
+.LP
+An input context is the abstraction retaining the state, properties,
+and semantics 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 graphics output.
+.LP
+One input context belongs to exactly one input method.
+Different input contexts may be associated with the same input method,
+possibly with the same client window.
+An
+.PN XIC
+is created with the
+.PN XCreateIC
+function, providing an
+.PN XIM
+argument and affiliating the input context to the input method
+for its lifetime.
+When an input method is closed with
+.PN XCloseIM ,
+all of its affiliated input contexts should not be used any more
+(and should preferably be destroyed before closing the input method).
+.LP
+Considering the example of a client window with multiple text entry areas,
+the application programmer could, for example, choose to implement as follows:
+.IP \(bu 5
+As many input contexts are created as text entry areas, and the client
+will get the input accumulated on each context each time it looks up
+in that context.
+.IP \(bu 5
+A single context is created for a top-level window in the application.
+If such a window contains several text entry areas,
+each time the user moves to another text entry area,
+the client has to indicate changes in the context.
+.LP
+A range of choices can be made by application designers to use
+either a single or multiple input contexts,
+according to the needs of their application.
+.NH 4
+Getting Keyboard Input
+.XS
+\*(SN Getting Keyboard Input
+.XE
+.LP
+To obtain characters from an input method,
+a client must call the function
+.PN XmbLookupString
+or
+.PN XwcLookupString
+with an input context created from that input method.
+Both a locale and display are bound to an input method when it is opened,
+and an input context inherits this locale and display.
+Any strings returned by
+.PN XmbLookupString
+or
+.PN XwcLookupString
+will be encoded in that locale.
+.NH 4
+Focus Management
+.XS
+\*(SN Focus Management
+.XE
+.LP
+For each text entry area in which the
+.PN XmbLookupString
+or
+.PN XwcLookupString
+functions are used,
+there will be an associated input context.
+.LP
+When the application focus moves to a text entry area,
+the application must set the input context focus to the
+input context associated with that area.
+The input context focus is set by calling
+.PN XSetICFocus
+with the appropriate input context.
+.LP
+Also, when the application focus moves out of a text entry area, the
+application should unset the focus for the associated input context
+by calling
+.PN XUnsetICFocus .
+As an optimization, if
+.PN XSetICFocus
+is called successively on two different input contexts,
+setting the focus on the second
+will automatically unset the focus on the first.
+.LP
+To set and unset the input context focus correctly,
+it is necessary to track application-level focus changes.
+Such focus changes do not necessarily correspond to X server focus changes.
+.LP
+If a single input context
+is being used to do input for
+multiple text entry areas, it will also be necessary
+to set the focus window of the
+input context whenever the focus window changes
+(see section 13.5.6.3).
+.NH 4
+Geometry Management
+.XS
+\*(SN Geometry Management
+.XE
+.LP
+In most input method architectures
+(on-the-spot being the notable exception),
+the input method will perform the display of its own data.
+To provide better visual locality,
+it is often desirable to have the input method areas embedded within a client.
+To do this,
+the client may need to allocate space for an input method.
+Xlib 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.
+.LP
+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:
+.IP \(bu 5
+The client is responsible for the geometry of the input method window.
+.IP \(bu 5
+The input method is responsible for the contents of the input method window.
+.LP
+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 determine the size,
+and it must accept the size it is given.
+.LP
+Before a client provides geometry management for an input method,
+it must determine if geometry management is needed.
+The input method indicates the need for geometry management
+by setting
+.PN XIMPreeditArea
+or
+.PN XIMStatusArea
+in its
+.PN XIMStyles
+value returned by
+.PN XGetIMValues .
+When a client has decided that it will provide geometry management
+for an input method,
+it indicates that decision by setting the
+.PN XNInputStyle
+value in the
+.PN XIC .
+.LP
+After a client has established with the input method
+that it will do geometry management,
+the client must negotiate the geometry with the input method.
+The geometry is negotiated by the following steps:
+.IP \(bu 5
+The client suggests an area to the input method by setting the
+.PN XNAreaNeeded
+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 height to zero.
+Otherwise, it will set one of the values.
+.IP \(bu 5
+The client will get the XIC value
+.PN XNAreaNeeded .
+The input method will return its suggested size in this value.
+The input method should pay attention to any constraints suggested
+by the client.
+.IP \(bu 5
+The client sets the XIC value
+.PN XNArea
+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.
+.LP
+Clients doing geometry management must be aware that setting other
+XIC values may affect the geometry desired by an input method.
+For example,
+.PN XNFontSet
+and
+.PN XNLineSpacing
+may change the geometry desired by the input method.
+.LP
+The table of XIC values (see section 13.5.6)
+indicates the values that can cause the desired geometry to change
+when they are set.
+It is the responsibility of the client to renegotiate the geometry
+of the input method window when it is needed.
+.LP
+In addition,
+a geometry management callback is provided
+by which an input method can initiate a geometry change.
+.NH 4
+Event Filtering
+.XS
+\*(SN Event Filtering
+.XE
+.LP
+A filtering mechanism is provided to allow input methods
+to capture X events transparently to clients.
+It is expected that toolkits (or clients) using
+.PN XmbLookupString
+or
+.PN XwcLookupString
+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.
+.LP
+If there were no filter,
+a client could receive and discard events that are necessary
+for the proper functioning of an input method.
+The following provides a few examples of such events:
+.IP \(bu 5
+Expose events on preedit window in local mode.
+.IP \(bu 5
+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.
+.IP \(bu 5
+Key events can be sent to a filter before they are bound
+to translations such as those the X Toolkit Intrinsics library provides.
+.LP
+Clients are expected to get the XIC value
+.PN XNFilterEvents
+and augment the event mask for the client window with that event mask.
+This mask may be zero.
+.NH 4
+Callbacks
+.XS
+\*(SN Callbacks
+.XE
+.LP
+When an on-the-spot input method is implemented,
+only the client can insert or delete preedit data in place
+and possibly scroll existing text.
+This means that the echo of the keystrokes has to be achieved
+by the client itself, tightly coupled with the input method logic.
+.LP
+When the user enters a keystroke,
+the client calls
+.PN XmbLookupString
+or
+.PN XwcLookupString .
+At this point, in the on-the-spot case,
+the echo of the keystroke in the preedit has not yet been done.
+Before returning to the client logic that handles the input characters,
+the look-up function
+must call the echoing logic to insert the new keystroke.
+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,
+the input method logic has to call back to the client before it returns.
+The client code, that is, a callback procedure,
+is called from the input method logic.
+.LP
+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.
+It is possible for the client to specify, for each input context,
+what callback is to be called for each action.
+.LP
+There are also callbacks provided for feedback of status information
+and a callback to initiate a geometry request for an input method.
+.NH 4
+Visible Position Feedback Masks
+.XS
+\*(SN Visible Position Feedback Masks
+.XE
+.LP
+In the on-the-spot input style, there is a problem when
+attempting to draw preedit strings that are longer than the
+available space. Once the display area is exceeded, it is not
+clear how best to display the preedit string.
+The visible position feedback masks of
+.PN XIMText
+help resolve this problem by allowing the input method to specify hints that
+indicate the essential portions of the preedit string.
+For example, such hints can help developers implement
+scrolling of a long preedit string within a short preedit display area.
+.NH 4
+Preedit String Management
+.XS
+\*(SN Preedit String Management
+.XE
+.LP
+As highlighted before, the input method architecture provides
+preediting, which supports a type of preprocessor input composition.
+In this case, composition consists of interpreting a sequence
+of key events and returning a committed string via
+.PN XmbLookupString
+or
+.PN XwcLookupString .
+This provides the basics for input methods.
+.LP
+In addition to preediting based on key events, a general framework
+is provided to give a client that desires it more advanced preediting based
+on the text within the client. This framework is called
+\fIstring conversion\fP and is provided using XIC values.
+The fundamental concept of string conversion
+is to allow the input method to manipulate the client's
+text independent of any user preediting operation.
+.LP
+The need for string conversion is based on
+language needs and input method capabilities.
+The following are some examples of string conversion:
+.IP \(bu 5
+Transliteration conversion provides language-specific conversions
+within the input method.
+In the case of Korean input, users wish to convert a Hangul string
+into a Hanja string while in preediting, after preediting,
+or in other situations (for example, on a selected string).
+The conversion is triggered when the user
+presses a Hangul-to-Hanja key sequence (which may be input method specific).
+Sometimes the user may want to invoke the conversion after finishing
+preediting or on a user-selected string.
+Thus, the string to be converted is in an application buffer, not in
+the preedit area of the input method. The string conversion services
+allow the client to request this transliteration conversion from the
+input method.
+There are many other transliteration conversions defined for
+various languages, for example, Kana-to-Kanji conversion in Japanese.
+.sp
+The key to remember is that transliteration conversions are triggered
+at the request of the user and returned to the client
+immediately without affecting the preedit area of the input method.
+.IP \(bu 5
+Reconversion of a previously committed string or
+a selected string is supported by many input methods as a
+convenience to the user.
+For example, a user tends to mistype the commit key while
+preediting. In that case, some input methods provide a special
+key sequence to request a ``reconvert'' operation on the
+committed string, similiar to the undo facility provided by most
+text editors.
+Another example is where the user is proofreading a document
+that has some misconversions from preediting and wants to correct
+the misconverted text. Such reconversion is again triggered
+by the user invoking some special action, but reconversions should
+not affect the state of the preedit area.
+.IP \(bu 5
+Context-sensitive conversion is required for some languages
+and input methods that need to retrieve text that surrounds the
+current spot location (cursor position) of the client's buffer.
+Such text is needed when the preediting operation depends on
+some surrounding characters (usually preceding the spot location).
+For example,
+in Thai language input, certain character sequences may be invalid and
+the input method may want to check whether characters constitute a
+valid word. Input methods that do such context-dependent
+checking need to retrieve the characters surrounding the current
+cursor position to obtain complete words.
+.sp
+Unlike other conversions, this conversion is not explicitly
+requested by the user.
+Input methods that provide such context-sensitive conversion
+continuously need to request context from the client, and any change
+in the context of the spot location may affect such conversions.
+The client's context would be needed if the user moves the cursor
+and starts editing again.
+.sp
+For this reason, an input method supporting this type of conversion
+should take notice of when the client calls
+.PN XmbResetIC
+or
+.PN XwcResetIC ,
+which is usually an indication of a context change.
+.LP
+Context-sensitive conversions just need a copy of the client's text,
+while other conversions replace the client's text with new text
+to achieve the reconversion or transliteration. Yet in all
+cases the result of a conversion, either immediately or via preediting,
+is returned by the
+.PN XmbLookupString
+and
+.PN XwcLookupString
+functions.
+.LP
+String conversion support is dependent on the availability of the
+.PN XNStringConversion
+or
+.PN XNStringConversionCallback
+XIC values.
+Because the input method may not support string conversions,
+clients have to query the availability of string conversion
+operations by checking the supported XIC values list by calling
+.PN XGetIMValues
+with the
+.PN XNQueryICValuesList
+IM value.
+.LP
+The difference between these two values is whether the
+conversion is invoked by the client or the input method.
+The
+.PN XNStringConversion
+XIC value is used by clients to request
+a string conversion from the input method. The client
+is responsible for determining which events are used
+to trigger the string conversion and whether the string to be
+converted should be copied or deleted. The type of conversion
+is determined by the input method; the client can only
+pass the string to be converted. The client is guaranteed that
+no
+.PN XNStringConversionCallback
+will be issued when this value is set; thus, the client need
+only set one of these values.
+.LP
+The
+.PN XNStringConversionCallback
+XIC value is used by the client to notify the input method that
+it will accept requests from the input method for string conversion.
+If this value is set,
+it is the input method's responsibility to determine which
+events are used to trigger the string conversion.
+When such events occur, the input method issues a call to the
+client-supplied procedure to retrieve the string to be converted. The client's
+callback procedure is notified whether to copy or delete the string and
+is provided with hints as to the amount of text needed.
+The
+.PN XIMStringConversionCallbackStruct
+specifies which text should be passed back to the input method.
+.LP
+Finally, the input method may call the client's
+.PN XNStringConversionCallback
+procedure multiple times if the string returned from the callback is
+not sufficient to perform a successful conversion. The arguments
+to the client's procedure allow the input method to define a
+position (in character units) relative to the client's cursor position
+and the size of the text needed. By varying the position and size of
+the desired text in subsequent callbacks, the input method can retrieve
+additional text.
+.LP
+.NH 3
+Input Method Management
+.XS
+\*(SN Input Method Management
+.XE
+.LP
+The interface to input methods might appear to be simply creating
+an input method
+.Pn ( XOpenIM )
+and freeing an input method
+.Pn ( XCloseIM ).
+However, input methods may
+require complex communication with input method servers (IM servers),
+for example:
+.IP \(bu 5
+If the X server, IM server, and X clients are started asynchronously,
+some clients may attempt to connect to the IM server before it is
+fully operational, and fail.
+Therefore, some mechanism is needed to allow clients to detect when an IM
+server has started.
+.LP
+It is up to clients to decide what should be done when an IM server is
+not available (for example, wait, or use some other IM server).
+.LP
+.IP \(bu 5
+Some input methods may allow the underlying IM server to be switched.
+Such customization may be desired without restarting the entire client.
+.LP
+To support management of input methods in these cases, the following
+functions are provided:
+.TS
+lw(2.4i) lw(3.3i).
+T{
+.PN XRegisterIMInstantiateCallback
+T} T{
+This function allows clients to register a callback procedure
+to be called when Xlib detects that an IM server is up and available.
+T}
+T{
+.PN XOpenIM
+T} T{
+A client calls this function as a result of the callback procedure
+being called.
+T}
+T{
+.PN XSetIMValue ,
+.PN XSetICValue
+T} T{
+These functions use the XIM and XIC values,
+.PN XNDestroyCallback ,
+to allow a client
+to register a callback procedure to be called when Xlib detects that
+an IM server that was associated with an opened
+input method is no longer available.
+.sp 4p
+In addition, this function can be used to switch IM servers for those input
+methods that support such functionality. The IM value for switching IM
+servers is implementation-dependent; see the description below about
+switching IM servers.
+T}
+T{
+.PN XUnregisterIMInstantiateCallback
+T} T{
+This function removes a callback procedure registered by the client.
+T}
+.TE
+.LP
+Input methods that support switching of IM servers may exhibit some
+side-effects:
+.IP \(bu 5
+The input method will ensure that any new IM server supports any of the
+input styles being used by input contexts already associated with the
+input method.
+However, the list of supported input styles may be different.
+.LP
+.IP \(bu 5
+Geometry management requests on previously created input contexts
+may be initiated by the new IM server.
+.LP
+.NH 4
+Hot Keys
+.XS
+\*(SN Hot Keys
+.XE
+.LP
+Some clients need to guarantee which keys can be used to escape from the
+input method, regardless of the input method state;
+for example, the client-specific Help key or the keys to move the
+input focus.
+The HotKey mechanism allows clients
+to specify a set of keys for this purpose. However, the input
+method might not allow clients to specify hot keys.
+Therefore, clients have to query support of hot keys by checking the
+supported XIC values list by calling
+.PN XGetIMValues
+with the
+.PN XNQueryICValuesList
+IM value.
+When the hot keys specified conflict with the key bindings of the
+input method, hot keys take precedence over the key bindings of the input
+method.
+.LP
+.NH 4
+Preedit State Operation
+.XS
+\*(SN Preedit State Operation
+.XE
+.LP
+An input method may have several internal states, depending on its
+implementation and the locale. However, one state that is
+independent of locale and implementation is whether the input method
+is currently performing a preediting operation.
+Xlib provides the ability for an application to manage the preedit state
+programmatically. Two methods are provided for
+retrieving the preedit state of an input context.
+One method is to query the state by calling
+.PN XGetICValues
+with the
+.PN XNPreeditState
+XIC value.
+Another method is to receive notification whenever
+the preedit state is changed. To receive such notification,
+an application needs to register a callback by calling
+.PN XSetICValues
+with the
+.PN XNPreeditStateNotifyCallback
+XIC value.
+In order to change the preedit state programmatically, an application
+needs to call
+.PN XSetICValues
+with
+.PN XNPreeditState.
+.LP
+Availability of the preedit state is input method dependent. The input
+method may not provide the ability to set the state or to
+retrieve the state programmatically. Therefore, clients have to
+query availability of preedit state operations by checking the
+supported XIC values list by calling
+.PN XGetIMValues
+with the
+.PN XNQueryICValuesList
+IM value.
+.NH 3
+Input Method Functions
+.XS
+\*(SN Input Method Functions
+.XE
+.LP
+To open a connection, use
+.PN XOpenIM .
+.IN "XOpenIM" "" "@DEF@"
+.sM
+.FD 0
+XIM XOpenIM\^(\^\fIdisplay\fP\^, \fIdb\fP\^, \fIres_name\fP\^, \fIres_class\fP\^)
+.br
+ Display *\fIdisplay\fP\^;
+.br
+ XrmDatabase \fIdb\fP\^;
+.br
+ char *\fIres_name\fP\^;
+.br
+ char *\fIres_class\fP\^;
+.FN
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIdb\fP 1i
+Specifies a pointer to the resource database.
+.IP \fIres_name\fP 1i
+Specifies the full resource name of the application.
+.IP \fIres_class\fP 1i
+Specifies the full class name of the application.
+.LP
+.eM
+The
+.PN XOpenIM
+function 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 that the strings returned by
+.PN XmbLookupString
+or
+.PN XwcLookupString ,
+for any input context affiliated with a given input method,
+will be encoded in the locale current at the time the input method is opened.
+.LP
+The specific input method to which this call will be routed
+is identified on the basis of the current locale.
+.PN XOpenIM
+will identify a default input method corresponding to the
+current locale.
+That default can be modified using
+.PN XSetLocaleModifiers
+for the input method modifier.
+.LP
+The db argument is the resource database to be used by the input method
+for looking 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 db is NULL,
+no database is passed to the input method.
+.LP
+The res_name and res_class arguments 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.
+.LP
+The res_name and res_class arguments are not assumed to exist beyond
+the call to
+.PN XOpenIM .
+The specified resource database is assumed to exist for the lifetime
+of the input method.
+.LP
+.PN XOpenIM
+returns NULL if no input method could be opened.
+.LP
+.sp
+To close a connection, use
+.PN XCloseIM .
+.IN "XCloseIM" "" "@DEF@"
+.sM
+.FD 0
+Status XCloseIM\^(\^\fIim\fP\^)
+.br
+ XIM \fIim\fP\^;
+.FN
+.IP \fIim\fP 1i
+Specifies the input method.
+.LP
+.eM
+The
+.PN XCloseIM
+function closes the specified input method.
+.LP
+.sp
+To set input method attributes, use
+.PN XSetIMValues .
+.IN "XSetIMValues" "" "@DEF@"
+.sM
+.FD 0
+char * XSetIMValues\^(\^\fIim\fP\^, ...)
+.br
+ XIM \fIim\fP\^;
+.FN
+.IP \fIim\fP 1i
+Specifies the input method.
+.ds Al \ to set XIM values
+.IP ... 1i
+Specifies the variable-length argument list\*(Al.
+.LP
+.eM
+The
+.PN XSetIMValues
+function presents a variable argument list programming interface
+for setting attributes of the specified input method.
+It returns NULL if it succeeds;
+otherwise,
+it returns the name of the first argument that could not be set.
+Xlib does not attempt to set arguments from the supplied list that
+follow the failed argument;
+all arguments in the list preceding the failed argument have been set
+correctly.
+.LP
+.sp
+To query an input method, use
+.PN XGetIMValues .
+.IN "XGetIMValues" "" "@DEF@"
+.sM
+.FD 0
+char * XGetIMValues\^(\^\fIim\fP\^, ...)
+.br
+ XIM \fIim\fP\^;
+.FN
+.IP \fIim\fP 1i
+Specifies the input method.
+.ds Al \ to get XIM values
+.IP ... 1i
+Specifies the variable length argument list\*(Al.
+.LP
+.eM
+The
+.PN XGetIMValues
+function presents a variable argument list programming interface
+for querying properties or features of the specified input method.
+This function returns NULL if it succeeds;
+otherwise,
+it returns the name of the first argument that could not be obtained.
+.LP
+Each XIM value argument (following a name) must point to
+a location where the XIM value is to be stored.
+That is, if the XIM value is of type T,
+the argument must be of type T*.
+If T itself is a pointer type,
+then
+.PN XGetIMValues
+allocates memory to store the actual data,
+and the client is responsible for freeing this data by calling
+.PN XFree
+with the returned pointer.
+.LP
+.sp
+To obtain the display associated with an input method, use
+.PN XDisplayOfIM .
+.IN "XDisplayOfIM" "" "@DEF@"
+.sM
+.FD 0
+Display * XDisplayOfIM\^(\^\fIim\fP\^)
+.br
+ XIM \fIim\fP\^;
+.FN
+.IP \fIim\fP 1i
+Specifies the input method.
+.LP
+.eM
+The
+.PN XDisplayOfIM
+function returns the display associated with the specified input method.
+.LP
+.sp
+To get the locale associated with an input method, use
+.PN XLocaleOfIM .
+.IN "XLocaleOfIM" "" "@DEF@"
+.sM
+.FD 0
+char * XLocaleOfIM\^(\^\fIim\fP\^)
+.br
+ XIM \fIim\fP\^;
+.FN
+.IP \fIim\fP 1i
+Specifies the input method.
+.LP
+.eM
+The
+.PN XLocaleOfIM
+function returns the locale associated with the specified input method.
+.LP
+.sp
+To register an input method instantiate callback, use
+.PN XRegisterIMInstantiateCallback .
+.IN "XRegisterIMInstantiateCallback" "" "@DEF@"
+.sM
+.FD 0
+Bool XRegisterIMInstantiateCallback\^(\^\fIdisplay\fP\^, \fIdb\fP\^, \fIres_name\fP\^, \fIres_class\fP\^, \fIcallback\fP\^, \fIclient_data\fP\^)
+.br
+ Display *\fIdisplay\fP\^;
+.br
+ XrmDatabase \fIdb\fP\^;
+.br
+ char *\fIres_name\fP\^;
+.br
+ char *\fIres_class\fP\^;
+.br
+ XIMProc \fIcallback\fP\^;
+.br
+ XPointer *\fIclient_data\fP\^;
+.FN
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIdb\fP 1i
+Specifies a pointer to the resource database.
+.IP \fIres_name\fP 1i
+Specifies the full resource name of the application.
+.IP \fIres_class\fP 1i
+Specifies the full class name of the application.
+.IP \fIcallback\fP 1i
+Specifies a pointer to the input method instantiate callback.
+.IP \fIclient_data\fP 1i
+Specifies the additional client data.
+.LP
+.eM
+The
+.PN XRegisterIMInstantiateCallback
+function registers a callback to be invoked whenever a new input method
+becomes available for the specified display that matches the current
+locale and modifiers.
+.LP
+The function returns
+.PN True
+ if it succeeds; otherwise, it returns
+.PN False .
+.LP
+The generic prototype is as follows:
+.IN "IMInstantiateCallback" "" "@DEF@"
+.sM
+.FD 0
+void IMInstantiateCallback\^(\^\fIdisplay\fP\^, \fIclient_data\fP\^, \fIcall_data\fP\^)
+.br
+ Display *\fIdisplay\fP\^;
+.br
+ XPointer \fIclient_data\fP\^;
+.br
+ XPointer \fIcall_data\fP\^;
+.FN
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIclient_data\fP 1i
+Specifies the additional client data.
+.IP \fIcall_data\fP 1i
+Not used for this callback and always passed as NULL.
+.LP
+.eM
+To unregister an input method instantiation callback, use
+.PN XUnregisterIMInstantiateCallback .
+.IN "XUnregisterIMInstantiateCallback" "" "@DEF@"
+.sM
+.FD 0
+Bool XUnregisterIMInstantiateCallback\^(\^\fIdisplay\fP\^, \fIdb\fP\^, \fIres_name\fP\^, \fIres_class\fP\^, \fIcallback\fP\^, \fIclient_data\fP\^)
+.br
+ Display *\fIdisplay\fP\^;
+.br
+ XrmDatabase \fIdb\fP\^;
+.br
+ char *\fIres_name\fP\^;
+.br
+ char *\fIres_class\fP\^;
+.br
+ XIMProc \fIcallback\fP\^;
+.br
+ XPointer *\fIclient_data\fP\^;
+.FN
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIdb\fP 1i
+Specifies a pointer to the resource database.
+.IP \fIres_name\fP 1i
+Specifies the full resource name of the application.
+.IP \fIres_class\fP 1i
+Specifies the full class name of the application.
+.IP \fIcallback\fP 1i
+Specifies a pointer to the input method instantiate callback.
+.IP \fIclient_data\fP 1i
+Specifies the additional client data.
+.LP
+.eM
+The
+.PN XUnregisterIMInstantiateCallback
+function removes an input method instantiation callback previously
+registered.
+The function returns
+.PN True
+if it succeeds; otherwise, it returns
+.PN False .
+.NH 3
+Input Method Values
+.XS
+\*(SN Input Method Values
+.XE
+.LP
+The following table describes how XIM values are interpreted
+by an input method.
+The first column lists the XIM values.
+The second column indicates how each of the XIM values
+are treated by that input style.
+.LP
+.LP
+The following keys apply to this table.
+.TS H
+lw(1i) lw(4.75i).
+_
+.sp 6p
+.B
+Key Explanation
+.sp 6p
+_
+.TH
+.R
+D T{
+This value may be set using
+.PN XSetIMValues .
+If it is not set,
+.br
+a default is provided.
+T}
+S T{
+This value may be set using
+.PN XSetIMValues .
+T}
+G T{
+This value may be read using
+.PN XGetIMValues .
+T}
+.sp 6p
+_
+.TE
+.LP
+.TS H
+lw(2.25i) c
+lw(2.25i) c.
+_
+.sp 6p
+.B
+XIM Value Key
+.sp 6p
+_
+.sp 6p
+.TH
+.R
+T{
+.PN XNQueryInputStyle
+T} T{
+G
+T}
+T{
+.PN XNResourceName
+T} T{
+D-S-G
+T}
+T{
+.PN XNResourceClass
+T} T{
+D-S-G
+T}
+T{
+.PN XNDestroyCallback
+T} T{
+D-S-G
+T}
+T{
+.PN XNQueryIMValuesList
+T} T{
+G
+T}
+T{
+.PN XNQueryICValuesList
+T} T{
+G
+T}
+T{
+.PN XNVisiblePosition
+T} T{
+G
+T}
+T{
+.PN XNR6PreeditCallbackBehavior
+T} T{
+D-S-G
+T}
+.sp 6p
+_
+.TE
+.LP
+.PN XNR6PreeditCallbackBehavior
+is obsolete and its use is not recommended (see section 13.5.4.6).
+.LP
+.NH 4
+Query Input Style
+.XS
+\*(SN Query Input Style
+.XE
+.LP
+A client should always query the input method to determine which input
+styles are supported.
+The client should then find an input style it is capable of supporting.
+.LP
+If the client cannot find an input style that it can support,
+it should negotiate with the user the continuation of the program
+(exit, choose another input method, and so on).
+.LP
+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
+.PN XIMStyles .
+Clients are responsible for freeing the
+.PN XIMStyles
+structure.
+To do so, use
+.PN XFree .
+.LP
+The
+.PN XIMStyles
+structure is defined as follows:
+.LP
+.IN "XIMStyle" "" "@DEF@"
+.IN "XIMPreeditArea" "" "@DEF@"
+.IN "XIMPreeditCallbacks" "" "@DEF@"
+.IN "XIMPreeditPosition" "" "@DEF@"
+.IN "XIMPreeditNothing" "" "@DEF@"
+.IN "XIMPreeditNone" "" "@DEF@"
+.IN "XIMStatusArea" "" "@DEF@"
+.IN "XIMStatusCallbacks" "" "@DEF@"
+.IN "XIMStatusNothing" "" "@DEF@"
+.IN "XIMStatusNone" "" "@DEF@"
+.IN "XIMStyles" "" "@DEF@"
+.sM
+.Ds 0
+typedef unsigned long XIMStyle;
+.De
+.TS
+lw(.5i) lw(2i) lw(2.5i).
+T{
+#define
+T} T{
+.PN XIMPreeditArea
+T} T{
+0x0001L
+T}
+T{
+#define
+T} T{
+.PN XIMPreeditCallbacks
+T} T{
+0x0002L
+T}
+T{
+#define
+T} T{
+.PN XIMPreeditPosition
+T} T{
+0x0004L
+T}
+T{
+#define
+T} T{
+.PN XIMPreeditNothing
+T} T{
+0x0008L
+T}
+T{
+#define
+T} T{
+.PN XIMPreeditNone
+T} T{
+0x0010L
+T}
+.sp
+T{
+#define
+T} T{
+.PN XIMStatusArea
+T} T{
+0x0100L
+T}
+T{
+#define
+T} T{
+.PN XIMStatusCallbacks
+T} T{
+0x0200L
+T}
+T{
+#define
+T} T{
+.PN XIMStatusNothing
+T} T{
+0x0400L
+T}
+T{
+#define
+T} T{
+.PN XIMStatusNone
+T} T{
+0x0800L
+T}
+.TE
+.Ds 0
+.TA .5i 2.5i
+.ta .5i 2.5i
+typedef struct {
+ unsigned short count_styles;
+ XIMStyle * supported_styles;
+} XIMStyles;
+.De
+.LP
+.eM
+An
+.PN XIMStyles
+structure contains the number of input styles supported
+in its count_styles field.
+This is also the size of the supported_styles array.
+.LP
+The supported styles is a list of bitmask combinations,
+which indicate the combination of styles for each of the areas supported.
+These areas are described later.
+Each element in the list should select one of the bitmask values for
+each area.
+The list describes the complete set of combinations supported.
+Only these combinations are supported by the input method.
+.LP
+The preedit category defines what type of support is provided
+by the input method for preedit information.
+.IN "XIMPreeditArea" "" "@DEF@"
+.IN "XIMPreeditPosition" "" "@DEF@"
+.IN "XIMPreeditCallbacks" "" "@DEF@"
+.IN "XIMPreeditNothing" "" "@DEF@"
+.IN "XIMPreeditNone" "" "@DEF@"
+.TS
+lw(1.5i) lw(4.25i).
+T{
+.PN XIMPreeditArea
+T} T{
+If chosen,
+the input method would require the client to provide some area values
+for it to do its preediting.
+Refer to XIC values
+.PN XNArea
+and
+.PN XNAreaNeeded .
+T}
+T{
+.PN XIMPreeditPosition
+T} T{
+If chosen,
+the input method would require the client to provide positional values.
+Refer to XIC values
+.PN XNSpotLocation
+and
+.PN XNFocusWindow .
+T}
+T{
+.PN XIMPreeditCallbacks
+T} T{
+If chosen,
+the input method would require the client to define the set of preedit callbacks.
+Refer to XIC values
+.PN XNPreeditStartCallback ,
+.PN XNPreeditDoneCallback ,
+.PN XNPreeditDrawCallback ,
+and
+.PN XNPreeditCaretCallback .
+T}
+T{
+.PN XIMPreeditNothing
+T} T{
+If chosen, the input method can function without any preedit values.
+T}
+T{
+.PN XIMPreeditNone
+T} T{
+The input method does not provide any preedit feedback.
+Any preedit value is ignored.
+This style is mutually exclusive with the other preedit styles.
+T}
+.TE
+.LP
+The status category defines what type of support is provided
+by the input method for status information.
+.IN "XIMStatusArea" "" "@DEF@"
+.IN "XIMStatusCallbacks" "" "@DEF@"
+.IN "XIMStatusNothing" "" "@DEF@"
+.IN "XIMStatusNone" "" "@DEF@"
+.TS
+lw(1.5i) lw(4.25i).
+T{
+.PN XIMStatusArea
+T} T{
+The input method requires the client to provide
+some area values for it to do its status feedback.
+See
+.PN XNArea
+and
+.PN XNAreaNeeded .
+T}
+T{
+.PN XIMStatusCallbacks
+T} T{
+The input method requires the client to define the set of status callbacks,
+.PN XNStatusStartCallback ,
+.PN XNStatusDoneCallback ,
+and
+.PN XNStatusDrawCallback .
+T}
+T{
+.PN XIMStatusNothing
+T} T{
+The input method can function without any status values.
+T}
+T{
+.PN XIMStatusNone
+T} T{
+The input method does not provide any status feedback.
+If chosen, any status value is ignored.
+This style is mutually exclusive with the other status styles.
+T}
+.TE
+.NH 4
+Resource Name and Class
+.XS
+\*(SN Resource Name and Class
+.XE
+.LP
+The
+.PN XNResourceName
+and
+.PN XNResourceClass
+arguments are strings that specify the full name and class
+used by the input method.
+These values should be used as prefixes for the name and class
+when looking up resources that may vary according to the input method.
+If these values are not set,
+the resources will not be fully specified.
+.LP
+It is not intended that values that can be set as XIM values be
+set as resources.
+.LP
+.NH 4
+Destroy Callback
+.XS
+\*(SN Destroy Callback
+.XE
+.LP
+The
+.PN XNDestroyCallback
+argument is a pointer to a structure of type
+.PN XIMCallback .
+.PN XNDestroyCallback
+is triggered when an input method stops its service for any reason.
+After the callback is invoked, the input method is closed and the
+associated input context(s) are destroyed by Xlib.
+Therefore, the client should not call
+.PN XCloseIM
+or
+.PN XDestroyIC .
+.LP
+The generic prototype of this callback function is as follows:
+.IN "DestroyCallback" "" "@DEF@"
+.sM
+.FD 0
+void DestroyCallback\^(\^\fIim\fP\^, \fIclient_data\fP\^, \fIcall_data\fP\^)
+.br
+ XIM \fIim\fP\^;
+.br
+ XPointer \fIclient_data\fP\^;
+.br
+ XPointer \fIcall_data\fP\^;
+.FN
+.IP \fIim\fP 1i
+Specifies the input method.
+.IP \fIclient_data\fP 1i
+Specifies the additional client data.
+.IP \fIcall_data\fP 1i
+Not used for this callback and always passed as NULL.
+.LP
+.eM
+A DestroyCallback is always called with a NULL call_data argument.
+.LP
+.NH 4
+Query IM/IC Values List
+.XS
+\*(SN Query IM/IC Values List
+.XE
+.LP
+.PN XNQueryIMValuesList
+and
+.PN XNQueryICValuesList
+are used to query about XIM and XIC values supported by the input method.
+.LP
+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
+.PN XIMValuesList .
+Clients are responsible for freeing the
+.PN XIMValuesList
+structure.
+To do so, use
+.PN XFree .
+.LP
+The
+.PN XIMValuesList
+structure is defined as follows:
+.sM
+.Ds 0
+.TA .5i 2.5i
+.ta .5i 2.5i
+typedef struct {
+ unsigned short count_values;
+ char **supported_values;
+} XIMValuesList;
+.De
+.LP
+.eM
+.NH 4
+Visible Position
+.XS
+\*(SN Visible Position
+.XE
+.LP
+The
+.PN XNVisiblePosition
+argument indicates whether the visible position masks of
+.PN XIMFeedback
+in
+.PN XIMText
+are available.
+.LP
+The argument value must be a pointer to a location where the returned
+value will be stored. The returned value is of type
+.PN Bool .
+If the returned value is
+.PN True ,
+the input method uses the visible position masks of
+.PN XIMFeedback
+in
+.PN XIMText ;
+otherwise, the input method does not use the masks.
+.LP
+Because this XIM value is optional, a client should call
+.PN XGetIMValues
+with argument
+.PN XNQueryIMValues
+before using this argument.
+If the
+.PN XNVisiblePosition
+does not exist in the IM values list returned from
+.PN XNQueryIMValues ,
+the visible position masks of
+.PN XIMFeedback
+in
+.PN XIMText
+are not used to indicate the visible position.
+.LP
+.NH 4
+Preedit Callback Behavior
+.XS
+\*(SN Preedit Callback Behavior
+.XE
+.LP
+The
+.PN XNR6PreeditCallbackBehavior
+argument originally included in the X11R6 specification has been
+deprecated.\(dg
+.\" If XNR6PreeditCallbackBehavior is not deprecated, then its type
+.\" should be changed from *Bool to Bool.
+.FS \(dg
+During formulation of the X11R6 specification, the behavior of
+the R6 PreeditDrawCallbacks was going to differ significantly from
+that of the R5 callbacks.
+Late changes to the specification converged the R5 and R6 behaviors,
+eliminating the need for
+.PN XNR6PreeditCallbackBehavior .
+Unfortunately, this argument was not removed from the R6 specification
+before it was published.
+.FE
+.LP
+The
+.PN XNR6PreeditCallbackBehavior
+argument indicates whether the behavior of preedit callbacks regarding
+.PN XIMPreeditDrawCallbackStruct
+values follows Release 5 or Release 6 semantics.
+.LP
+The value is of type
+.PN Bool .
+When querying for
+.PN XNR6PreeditCallbackBehavior ,
+if the returned value is
+.PN True ,
+the input method uses the Release 6 behavior;
+otherwise, it uses the Release 5 behavior.
+The default value is
+.PN False .
+In order to use Release 6 semantics, the value of
+.PN XNR6PreeditCallbackBehavior
+must be set to
+.PN True .
+.LP
+Because this XIM value is optional, a client should call
+.PN XGetIMValues
+with argument
+.PN XNQueryIMValues
+before using this argument.
+If the
+.PN XNR6PreeditCallbackBehavior
+does not exist in the IM values list returned from
+.PN XNQueryIMValues ,
+the PreeditCallback behavior is Release 5 semantics.
+.LP
+.NH 3
+Input Context Functions
+.XS
+\*(SN Input Context Functions
+.XE
+.LP
+An input context is an abstraction that is used to contain both 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 interfaces for creating, reading, or modifying
+an input context use a variable argument list.
+The name elements of the argument lists are referred to as XIC values.
+It is intended that input methods be controlled by these XIC values.
+As new XIC values are created,
+they should be registered with the X Consortium.
+.LP
+.sp
+To create an input context, use
+.PN XCreateIC .
+.IN "XCreateIC" "" "@DEF@"
+.sM
+.FD 0
+XIC XCreateIC\^(\^\fIim\fP\^, ...)
+.br
+ XIM \fIim\fP\^;
+.FN
+.IP \fIim\fP 1i
+Specifies the input method.
+.ds Al \ to set XIC values
+.IP ... 1i
+Specifies the variable length argument list\*(Al.
+.LP
+.eM
+The
+.PN XCreateIC
+function creates a context within the specified input method.
+.LP
+Some of the arguments are mandatory at creation time, and
+the input context will not be created if those arguments are not provided.
+The mandatory 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.
+.LP
+.PN XCreateIC
+returns a NULL value if no input context could be created.
+A NULL value could be returned for any of the following reasons:
+.IP \(bu 5
+A required argument was not set.
+.IP \(bu 5
+A read-only argument was set (for example,
+.PN XNFilterEvents ).
+.IP \(bu 5
+The argument name is not recognized.
+.IP \(bu 5
+The input method encountered an input method implementation-dependent error.
+.LP
+.PN XCreateIC
+can generate
+.PN BadAtom ,
+.PN BadColor ,
+.PN BadPixmap ,
+and
+.PN BadWindow
+errors.
+.LP
+.sp
+To destroy an input context, use
+.PN XDestroyIC .
+.IN "XDestroyIC" "" "@DEF@"
+.sM
+.FD 0
+void XDestroyIC\^(\^\fIic\fP\^)
+.br
+ XIC \fIic\fP\^;
+.FN
+.IP \fIic\fP 1i
+Specifies the input context.
+.LP
+.eM
+.PN XDestroyIC
+destroys the specified input context.
+.LP
+.sp
+To communicate to and synchronize with input method
+for any changes in keyboard focus from the client side,
+use
+.PN XSetICFocus
+and
+.PN XUnsetICFocus .
+.IN "XSetICFocus" "" "@DEF@"
+.sM
+.FD 0
+void XSetICFocus\^(\^\fIic\fP\^)
+.br
+ XIC \fIic\fP\^;
+.FN
+.IP \fIic\fP 1i
+Specifies the input context.
+.LP
+.eM
+The
+.PN XSetICFocus
+function allows a client to notify an input method that the focus window
+attached to the specified input context has received keyboard focus.
+The input method should take action to provide appropriate feedback.
+Complete feedback specification is a matter of user interface policy.
+.LP
+Calling
+.PN XSetICFocus
+does not affect the focus window value.
+.LP
+.sp
+.IN "XUnsetICFocus" "" "@DEF@"
+.sM
+.FD 0
+void XUnsetICFocus\^(\^\fIic\fP\^)
+.br
+ XIC \fIic\fP\^;
+.FN
+.IP \fIic\fP 1i
+Specifies the input context.
+.LP
+.eM
+The
+.PN XUnsetICFocus
+function allows a client to notify an input method that the specified input context
+has lost the keyboard focus and that no more input is expected on the focus window
+attached to that input context.
+The input method should take action to provide appropriate feedback.
+Complete feedback specification is a matter of user interface policy.
+.LP
+Calling
+.PN XUnsetICFocus
+does not affect the focus window value;
+the client may still receive
+events from the input method that are directed to the focus window.
+.LP
+.sp
+To reset the state of an input context to its initial state, use
+.PN XmbResetIC
+or
+.PN XwcResetIC .
+.IN "XmbResetIC" "" "@DEF@"
+.IN "XwcResetIC" "" "@DE@"
+.sM
+.FD 0
+char * XmbResetIC\^(\^\fIic\fP\^)
+.br
+ XIC \fIic\fP\^;
+.FN
+.FD 0
+wchar_t * XwcResetIC\^(\^\fIic\fP\^)
+.br
+ XIC \fIic\fP\^;
+.FN
+.IP \fIic\fP 1i
+Specifies the input context.
+.LP
+.eM
+When
+.PN XNResetState
+is set to
+.PN XIMInitialState ,
+.PN XmbResetIC
+and
+.PN XwcResetIC
+reset an input context to its initial state;
+when
+.PN XNResetState
+is set to
+.PN XIMPreserveState ,
+the current input context state is preserved.
+In both cases, any input pending on that context is deleted.
+The input method is required to clear the preedit area, if any,
+and update the status accordingly.
+Calling
+.PN XmbResetIC
+or
+.PN XwcResetIC
+does not change the focus.
+.LP
+The return value of
+.PN XmbResetIC
+is its current preedit string as a multibyte string.
+If there is any preedit text drawn or visible to the user,
+then these procedures must return a non-NULL string.
+If there is no visible preedit text,
+then it is input method implementation-dependent
+whether these procedures return a non-NULL string or NULL.
+.LP
+The client should free the returned string by calling
+.PN XFree .
+.LP
+.sp
+To get the input method associated with an input context, use
+.PN XIMOfIC .
+.IN "XIMOfIC" "" "@DEF@"
+.sM
+.FD 0
+XIM XIMOfIC\^(\^\fIic\fP\^)
+.br
+ XIC \fIic\fP\^;
+.FN
+.IP \fIic\fP 1i
+Specifies the input context.
+.LP
+.eM
+The
+.PN XIMOfIC
+function returns the input method associated with the specified input context.
+.LP
+.sp
+Xlib provides two functions for setting and reading XIC values, respectively,
+.PN XSetICValues
+and
+.PN XGetICValues .
+Both functions have a variable-length argument list.
+In that argument list, any XIC value's name must be denoted
+with a character string using the X Portable Character Set.
+.LP
+.sp
+To set XIC values, use
+.PN XSetICValues .
+.IN "XSetICValues" "" "@DEF@"
+.sM
+.FD 0
+char * XSetICValues\^(\^\fIic\fP\^, ...)
+.br
+ XIC \fIic\fP\^;
+.FN
+.IP \fIic\fP 1i
+Specifies the input context.
+.ds Al \ to set XIC values
+.IP ... 1i
+Specifies the variable length argument list\*(Al.
+.LP
+.eM
+The
+.PN XSetICValues
+function returns NULL if no error occurred;
+otherwise,
+it returns the name of the first argument that could not be set.
+An argument might not be set for any of the following reasons:
+.IP \(bu 5
+The argument is read-only (for example,
+.PN XNFilterEvents ).
+.IP \(bu 5
+The argument name is not recognized.
+.IP \(bu 5
+An implementation-dependent error occurs.
+.LP
+Each value to be set must be an appropriate datum,
+matching the data type imposed by the semantics of the argument.
+.LP
+.PN XSetICValues
+can generate
+.PN BadAtom ,
+.PN BadColor ,
+.PN BadCursor ,
+.PN BadPixmap ,
+and
+.PN BadWindow
+errors.
+.LP
+.sp
+To obtain XIC values, use
+.PN XGetICValues .
+.IN "XGetICValues" "" "@DEF@"
+.sM
+.FD 0
+char * XGetICValues\^(\^\fIic\fP\^, ...)
+.br
+ XIC \fIic\fP\^;
+.FN
+.IP \fIic\fP 1i
+Specifies the input context.
+.ds Al \ to get XIC values
+.IP ... 1i
+Specifies the variable length argument list\*(Al.
+.LP
+.eM
+The
+.PN XGetICValues
+function returns NULL if no error occurred; otherwise,
+it returns the name of the first argument that could not be obtained.
+An argument could not be obtained for any of the following reasons:
+.IP \(bu 5
+The argument name is not recognized.
+.IP \(bu 5
+The input method encountered an implementation-dependent error.
+.LP
+Each IC attribute value argument (following a name) must point to
+a location where the IC value is to be stored.
+That is, if the IC value is of type T,
+the argument must be of type T*.
+If T itself is a pointer type,
+then
+.PN XGetICValues
+allocates memory to store the actual data,
+and the client is responsible for freeing this data by calling
+.PN XFree
+with the returned pointer.
+The exception to this rule is for an IC value of type
+.PN XVaNestedList
+(for preedit and status attributes).
+In this case, the argument must also be of type
+.PN XVaNestedList .
+Then, the rule of changing type T to T* and freeing the allocated data
+applies to each element of the nested list.
+.NH 3
+Input Context Values
+.XS
+\*(SN Input Context Values
+.XE
+.LP
+The following tables describe how XIC values are interpreted
+by an input method depending on the input style chosen by the
+user.
+.LP
+The first column lists the XIC values.
+The second column indicates which values are involved in affecting,
+negotiating, and setting the geometry of the input method windows.
+The subentries under the third column indicate the different
+input styles that are supported.
+Each of these columns indicates how each of the XIC values
+are treated by that input style.
+.LP
+The following keys apply to these tables.
+.TS H
+lw(1i) lw(4.75i).
+_
+.sp 6p
+.B
+Key Explanation
+.sp 6p
+_
+.TH
+.R
+C T{
+This value must be set with
+.PN XCreateIC .
+T}
+D T{
+This value may be set using
+.PN XCreateIC .
+If it is not set,
+a default is provided.
+T}
+G T{
+This value may be read using
+.PN XGetICValues .
+T}
+GN T{
+This value may cause geometry negotiation when its value is set by means of
+.PN XCreateIC
+or
+.PN XSetICValues .
+T}
+GR T{
+This value will be the response of the input method when any
+GN value is changed.
+T}
+GS T{
+This value will cause the geometry of the input method window to be set.
+T}
+O T{
+This value must be set once and only once.
+It need not be set at create time.
+T}
+S T{
+This value may be set with
+.PN XSetICValues .
+T}
+Ignored T{
+This value is ignored by the input method for the given input style.
+T}
+.sp 6p
+_
+.TE
+.LP
+.TS H
+c c c s s s s
+l c c c c c c
+c c c c c c c
+l c c c c c c.
+_
+.sp 6p
+.B
+ Input Style
+XIC Value Geometry Preedit Preedit Preedit Preedit Preedit
+ Management Callback Position Area Nothing None
+.sp 6p
+_
+.sp 6p
+.TH
+.R
+Input Style C-G C-G C-G C-G C-G
+Client Window O-G O-G O-G O-G 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
+Filter Events G G G G Ignored
+Destroy Callback D-S-G D-S-G D-S-G D-S-G D-S-G
+String Conversion Callback S-G S-G S-G S-G S-G
+String Conversion D-S-G D-S-G D-S-G D-S-G D-S-G
+Reset State D-S-G D-S-G D-S-G D-S-G Ignored
+HotKey S-G S-G S-G S-G Ignored
+HotKeyState D-S-G D-S-G D-S-G D-S-G Ignored
+.sp 6p
+\fBPreedit\fP
+Area GS Ignored D-S-G D-S-G Ignored Ignored
+Area Needed GN-GR Ignored Ignored S-G Ignored Ignored
+Spot Location Ignored D-S-G Ignored Ignored Ignored
+Colormap Ignored D-S-G D-S-G D-S-G Ignored
+Foreground Ignored D-S-G D-S-G D-S-G Ignored
+Background Ignored D-S-G D-S-G D-S-G Ignored
+Background Pixmap Ignored D-S-G D-S-G D-S-G Ignored
+Font Set GN Ignored D-S-G D-S-G D-S-G Ignored
+Line Spacing 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 State D-S-G D-S-G D-S-G D-S-G Ignored
+Preedit State Notify Callback S-G S-G S-G S-G Ignored
+Preedit Callbacks C-S-G Ignored Ignored Ignored Ignored
+.sp 6p
+_
+.TE
+.LP
+.TS H
+c c c s s s
+l c c c c c
+c c c c c c
+l c c c c c.
+_
+.sp 6p
+.B
+ Input Style
+XIC Value Geometry Status Status Status Status
+ Management Callback Area Nothing None
+.sp 6p
+_
+.sp 6p
+.TH
+.R
+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
+Filter Events G G G G
+.sp 6p
+\fBStatus\fP
+Area GS Ignored D-S-G Ignored Ignored
+Area Needed GN-GR Ignored S-G Ignored Ignored
+Colormap Ignored D-S-G D-S-G Ignored
+Foreground Ignored D-S-G D-S-G Ignored
+Background Ignored D-S-G D-S-G Ignored
+Background Pixmap Ignored D-S-G D-S-G Ignored
+Font Set GN Ignored D-S-G D-S-G Ignored
+Line Spacing GN Ignored D-S-G D-S-G Ignored
+Cursor Ignored D-S-G D-S-G Ignored
+Status Callbacks C-S-G Ignored Ignored Ignored
+.sp 6p
+_
+.TE
+.NH 4
+Input Style
+.XS
+\*(SN Input Style
+.XE
+.LP
+The
+.PN XNInputStyle
+argument specifies the input style to be used.
+The value of this argument must be one of the values returned by the
+.PN XGetIMValues
+function with the
+.PN XNQueryInputStyle
+argument specified in the supported_styles list.
+.LP
+Note that this argument must be set at creation time
+and cannot be changed.
+.NH 4
+Client Window
+.XS
+\*(SN Client Window
+.XE
+.LP
+.IN "XNClientWindow" "" "@DEF@"
+The
+.PN XNClientWindow
+argument specifies to the 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 and
+should be set before any input is done using this input context.
+If it is not set,
+the input method may not operate correctly.
+.LP
+If an attempt is made to set this value a second time with
+.PN XSetICValues ,
+the string
+.PN XNClientWindow
+will be returned by
+.PN XSetICValues ,
+and the client window will not be changed.
+.LP
+If the client window is not a valid window ID on the display
+attached to the input method,
+a
+.PN BadWindow
+error can be generated when this value is used by the input method.
+.NH 4
+Focus Window
+.XS
+\*(SN Focus Window
+.XE
+.LP
+.IN "XNFocusWindow" "" "@DEF@"
+The
+.PN XNFocusWindow
+argument specifies the focus window.
+The primary purpose of the
+.PN XNFocusWindow
+is to identify the window that will receive the key event when input
+is composed.
+In addition, the input method may possibly affect the focus window
+as follows:
+.IP \(bu 5
+Select events on it
+.IP \(bu 5
+Send events to it
+.IP \(bu 5
+Modify its properties
+.IP \(bu 5
+Grab the keyboard within that window
+.LP
+The associated value must be of type
+.PN Window .
+If the focus window is not a valid window ID on the display
+attached to the input method,
+a
+.PN BadWindow
+error can be generated when this value is used by the input method.
+.LP
+When this XIC value is left unspecified,
+the input method will use the client window as the default focus window.
+.NH 4
+Resource Name and Class
+.XS
+\*(SN Resource Name and Class
+.XE
+.LP
+.IN "XNResourceName" "" "@DEF@"
+.IN "XNResourceClass" "" "@DEF@"
+The
+.PN XNResourceName
+and
+.PN XNResourceClass
+arguments are strings that specify the full name and class
+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 input context.
+If these values are not set,
+the resources will not be fully specified.
+.LP
+It is not intended that values that can be set as XIC values be
+set as resources.
+.NH 4
+Geometry Callback
+.XS
+\*(SN Geometry Callback
+.XE
+.LP
+.IN "XNGeometryCallback" "" "@DEF@"
+The
+.PN XNGeometryCallback
+argument is a structure of type
+.PN XIMCallback
+(see section 13.5.6.13.12).
+.LP
+The
+.PN XNGeometryCallback
+argument specifies the geometry callback that 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 policy permits
+an input method to request the dynamic change of that input
+method's window.
+An input method that does dynamic change will need to filter any
+events that it uses to initiate the change.
+.NH 4
+Filter Events
+.XS
+\*(SN Filter Events
+.XE
+.LP
+.IN "XNFilterEvents" "" "@DEF@"
+The
+.PN XNFilterEvents
+argument returns the event mask that an input method needs
+to have selected for.
+The client is expected to augment its own event mask
+for the client window with this one.
+.LP
+This argument is read-only, is set by the input method at create time,
+and is never changed.
+.LP
+The type of this argument is
+.PN unsigned
+.PN long .
+Setting this value will cause an error.
+.NH 4
+Destroy Callback
+.XS
+\*(SN Destroy Callback
+.XE
+.LP
+The
+.PN XNDestroyCallback
+argument is a pointer to a structure of type
+.PN XIMCallback
+(see section 13.5.6.13.12). This callback is triggered when the input method
+stops its service for any reason; for example, when a connection to an IM
+server is broken. After the destroy callback is called,
+the input context is destroyed and the input method is closed.
+Therefore, the client should not call
+.PN XDestroyIC
+and
+.PN XCloseIM .
+.LP
+.NH 4
+String Conversion Callback
+.XS
+\*(SN String Conversion Callback
+.XE
+.LP
+The
+.PN XNStringConversionCallback
+argument is a structure of type
+.PN XIMCallback
+(see section 13.5.6.13.12).
+.LP
+The
+.PN XNStringConversionCallback
+argument specifies a string conversion callback. This callback
+is not required for correct operation of
+either the input method or the client. It can be set by a client
+to support string conversions that may be requested
+by the input method. An input method that does string conversions
+will filter any events that it uses to initiate the conversion.
+.LP
+Because this XIC value is optional, a client should call
+.PN XGetIMValues
+with argument
+.PN XNQueryICValuesList
+before using this argument.
+.LP
+.NH 4
+String Conversion
+.XS
+\*(SN String Conversion
+.XE
+.LP
+The
+.PN XNStringConversion
+argument is a structure of type
+.PN XIMStringConversionText .
+.LP
+The
+.PN XNStringConversion
+argument specifies the string to be converted by an input method.
+This argument is not required for correct operation of either
+the input method or the client.
+.LP
+String conversion facilitates the manipulation of text independent
+of preediting.
+It is essential for some input methods and clients to manipulate
+text by performing context-sensitive conversion,
+reconversion, or transliteration conversion on it.
+.LP
+Because this XIC value is optional, a client should call
+.PN XGetIMValues
+with argument
+.PN XNQueryICValuesList
+before using this argument.
+.LP
+The
+.PN XIMStringConversionText
+structure is defined as follows:
+.LP
+.sM
+.Ds 0
+
+typedef struct _XIMStringConversionText {
+ unsigned short length;
+ XIMStringConversionFeedback *feedback;
+ Bool encoding_is_wchar;
+ union {
+ char *mbs;
+ wchar_t *wcs;
+ } string;
+} XIMStringConversionText;
+
+typedef unsigned long XIMStringConversionFeedback;
+.De
+.LP
+.eM
+The feedback member is reserved for future use. The text to be
+converted is defined by the string and length members. The length
+is indicated in characters. To prevent the library from freeing memory
+pointed to by an uninitialized pointer, the client should set the feedback
+element to NULL.
+.LP
+.NH 4
+Reset State
+.XS
+\*(SN Reset State
+.XE
+.LP
+The
+.PN XNResetState
+argument specifies the state the input context will return to after calling
+.PN XmbResetIC
+or
+.PN XwcResetIC .
+.LP
+The XIC state may be set to its initial state, as specified by the
+.PN XNPreeditState
+value when
+.PN XCreateIC
+was called, or it may be set to preserve the current state.
+.LP
+The valid masks for
+.PN XIMResetState
+are as follows:
+.LP
+.IN "XIMInitialState" "" "@DEF@"
+.IN "XINPreserveState" "" "@DEF@"
+.sM
+.LP
+.Ds 0
+typedef unsigned long XIMResetState;
+.De
+.TS
+lw(.5i) lw(2i) lw(2i).
+T{
+#define
+T} T{
+.PN XIMInitialState
+T} T{
+(1L)
+T}
+T{
+#define
+T} T{
+.PN XIMPreserveState
+T} T{
+(1L<<1)
+T}
+.TE
+.LP
+.eM
+If
+.PN XIMInitialState
+is set, then
+.PN XmbResetIC
+and
+.PN XwcResetIC
+will return to the initial
+.PN XNPreeditState
+state of the XIC.
+.LP
+If
+.PN XIMPreserveState
+is set, then
+.PN XmbResetIC
+and
+.PN XwcResetIC
+will preserve the current state of the XIC.
+.LP
+If
+.PN XNResetState
+is left unspecified, the default is
+.PN XIMInitialState .
+.LP
+.PN XIMResetState
+values other than those specified above will default to
+.PN XIMInitialState .
+.LP
+Because this XIC value is optional, a client should call
+.PN XGetIMValues
+with argument
+.PN XNQueryICValuesList
+before using this argument.
+.LP
+.NH 4
+Hot Keys
+.XS
+\*(SN Hot Keys
+.XE
+.LP
+The
+.PN XNHotKey
+argument specifies the hot key list to the XIC.
+The hot key list is a pointer to the structure of type
+.PN XIMHotKeyTriggers ,
+which specifies the key events that must be received
+without any interruption of the input method.
+For the hot key list set with this argument to be utilized, the client
+must also set
+.PN XNHotKeyState
+to
+.PN XIMHotKeyStateON .
+.LP
+Because this XIC value is optional, a client should call
+.PN XGetIMValues
+with argument
+.PN XNQueryICValuesList
+before using this functionality.
+.LP
+The value of the argument is a pointer to a structure of type
+.PN XIMHotKeyTriggers .
+.LP
+If an event for a key in the hot key list is found, then the process will
+receive the event and it will be processed inside the client.
+.LP
+.sM
+.Ds 0
+.TA .5i 2.5i
+.ta .5i 2.5i
+typedef struct {
+ KeySym keysym;
+ unsigned int modifier;
+ unsigned int modifier_mask;
+} XIMHotKeyTrigger;
+
+typedef struct {
+ int num_hot_key;
+ XIMHotKeyTrigger *key;
+} XIMHotKeyTriggers;
+.De
+.LP
+.eM
+.LP
+The combination of modifier and modifier_mask are used to represent one of
+three states for each modifier:
+either the modifier must be on, or the modifier must be off, or the modifier
+is a ``don't care'' \- it may be on or off.
+When a modifier_mask bit is set to 0, the state of the associated modifier
+is ignored when evaluating whether the key is hot or not.
+.TS H
+lw(1i) lw(1i) lw(3i).
+_
+.sp 6p
+.B
+Modifier Bit Mask Bit Meaning
+.sp 6p
+_
+.sp 6p
+.TH
+.R
+T{
+0
+T} T{
+1
+T} T{
+The modifier must be off.
+T}
+T{
+1
+T} T{
+1
+T} T{
+The modifier must be on.
+T}
+T{
+n/a
+T} T{
+0
+T} T{
+Do not care if the modifier is on or off.
+T}
+.sp 6p
+_
+.TE
+.NH 4
+Hot Key State
+.XS
+\*(SN Hot Key State
+.XE
+.LP
+The
+.PN XNHotKeyState
+argument specifies the hot key state of the input method.
+This is usually used to switch the input method between hot key
+operation and normal input processing.
+.LP
+The value of the argument is a pointer to a structure of type
+XIMHotKeyState .
+.LP
+.sM
+.Ds 0
+.TA .5i 2.5i
+.ta .5i 2.5i
+typedef unsigned long XIMHotKeyState;
+.De
+.TS
+lw(.5i) lw(3i) lw(2i).
+T{
+#define
+T} T{
+.PN XIMHotKeyStateON
+T} T{
+(0x0001L)
+T}
+T{
+#define
+T} T{
+.PN XIMHotKeyStateOFF
+T} T{
+(0x0002L)
+T}
+.TE
+.LP
+.eM
+.LP
+If not specified, the default is
+.PN XIMHotKeyStateOFF .
+.LP
+.NH 4
+Preedit and Status Attributes
+.XS
+\*(SN Preedit and Status Attributes
+.XE
+.LP
+.IN "XNPreeditAttributes" "" "@DEF@"
+.IN "XNStatusAttributes" "" "@DEF@"
+The
+.PN XNPreeditAttributes
+and
+.PN XNStatusAttributes
+arguments specify to an input method the attributes to be used for the
+preedit and status areas,
+if any.
+Those attributes are passed to
+.PN XSetICValues
+or
+.PN XGetICValues
+as a nested variable-length list.
+The names to be used in these lists are described in the following sections.
+.NH 5
+Area
+.XS
+\*(SN Area
+.XE
+.LP
+.IN "XNArea" "" "@DEF@"
+The value of the
+.PN XNArea
+argument must be a pointer to a structure of type
+.PN XRectangle.
+The interpretation of the
+.PN XNArea
+argument is dependent on the input method style that has been set.
+.LP
+If the input method style is
+.PN XIMPreeditPosition ,
+.PN 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.
+Otherwise, the coordinates are assumed to be relative to the client window.
+If neither has been set,
+the results are undefined.
+.LP
+If
+.PN XNArea
+is not specified, is set to NULL, or is invalid,
+the input method will default the clipping region
+to the geometry of the
+.PN XNFocusWindow .
+If the area specified is NULL or invalid,
+the results are undefined.
+.LP
+If the input style is
+.PN XIMPreeditArea
+or
+.PN XIMStatusArea ,
+.PN 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 window
+with dimensions that fit the
+.PN 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
+.PN XNArea
+is not specified, is set to NULL, or is invalid,
+the results are undefined.
+.NH 5
+Area Needed
+.XS
+\*(SN Area Needed
+.XE
+.LP
+.IN "XNAreaNeeded" "" "@DEF@"
+When set, the
+.PN XNAreaNeeded
+argument 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
+.PN XRectangle .
+Note that the x, y values are not used
+and that nonzero values for width or height are the constraints
+that the client wishes the input method to respect.
+.LP
+When read, the
+.PN XNAreaNeeded
+argument specifies the preferred geometry desired by the input method
+for the area.
+.LP
+This argument is only valid if the input style is
+.PN XIMPreeditArea
+or
+.PN XIMStatusArea .
+It is used for geometry negotiation between the client and the input method
+and has no other effect on the input method
+(see section 13.5.1.5).
+.NH 5
+Spot Location
+.XS
+\*(SN Spot Location
+.XE
+.LP
+.IN "XNSpotLocation" "" "@DEF@"
+The
+.PN XNSpotLocation
+argument specifies to the input method the coordinates of the spot
+to be used by an input method executing with
+.PN XNInputStyle
+set to
+.PN XIMPreeditPosition .
+When specified to any input method other than
+.PN XIMPreeditPosition ,
+this XIC value is ignored.
+.LP
+The x coordinate specifies the position where the next character
+would be inserted.
+The y coordinate is the position of the baseline used
+by the current text line in the focus window.
+The x and y coordinates are relative to the focus window, if it has been set;
+otherwise, they are relative to the client window.
+If neither the focus window nor the client window has been set,
+the results are undefined.
+.LP
+The value of the argument is a pointer to a structure of type
+.PN XPoint .
+.NH 5
+Colormap
+.XS
+\*(SN Colormap
+.XE
+.LP
+Two different arguments can be used to indicate what colormap the input method
+should use to allocate colors, a colormap ID, or a standard colormap name.
+.LP
+.IN "XNColormap" "" "@DEF@"
+The
+.PN XNColormap
+argument is used to specify a colormap ID.
+The argument value is of type
+.PN Colormap .
+An invalid argument may generate a
+.PN BadColor
+error when it is used by the input method.
+.LP
+.IN "XNStdColormap" "" "@DEF@"
+The
+.PN XNStdColormap
+argument is used to indicate the name of the standard colormap
+in which the input method should allocate colors.
+The argument value is an
+.PN Atom
+that should be a valid atom for calling
+.PN XGetRGBColormaps .
+An invalid argument may generate a
+.PN BadAtom
+error when it is used by the input method.
+.LP
+If the colormap is left unspecified,
+the client window colormap becomes the default.
+.NH 5
+Foreground and Background
+.XS
+\*(SN Foreground and Background
+.XE
+.LP
+.IN "XNForeground" "" "@DEF@"
+.IN "XNBackground" "" "@DEF@"
+The
+.PN XNForeground
+and
+.PN XNBackground
+arguments specify the foreground and background pixel, respectively.
+The argument value is of type
+.PN unsigned
+.PN long .
+It must be a valid pixel in the input method colormap.
+.LP
+If these values are left unspecified,
+the default is determined by the input method.
+.NH 5
+Background Pixmap
+.XS
+\*(SN Background Pixmap
+.XE
+.LP
+The
+.PN XNBackgroundPixmap
+argument specifies a background pixmap to be used as the background of the
+window.
+The value must be of type
+.PN Pixmap .
+An invalid argument may generate a
+.PN BadPixmap
+error when it is used by the input method.
+.LP
+If this value is left unspecified,
+the default is determined by the input method.
+.NH 5
+Font Set
+.XS
+\*(SN Font Set
+.XE
+.LP
+.IN "XNFontSet" "" "@DEF@"
+The
+.PN XNFontSet
+argument specifies to the input method what font set is to be used.
+The argument value is of type
+.PN XFontSet .
+.LP
+If this value is left unspecified,
+the default is determined by the input method.
+.NH 5
+Line Spacing
+.XS
+\*(SN Line Spacing
+.XE
+.LP
+The
+.PN XNLineSpace
+argument specifies to the input method what line spacing is to be used
+in the preedit window if more than one line is to be used.
+This argument is of type
+.PN int .
+.LP
+If this value is left unspecified,
+the default is determined by the input method.
+.NH 5
+Cursor
+.XS
+\*(SN Cursor
+.XE
+.LP
+.IN "XNCursor" "" "DEF@"
+The
+.PN XNCursor
+argument specifies to the input method what cursor is to be used
+in the specified window.
+This argument is of type
+.PN Cursor .
+.LP
+An invalid argument may generate a
+.PN BadCursor
+error when it is used by the input method.
+If this value is left unspecified,
+the default is determined by the input method.
+.NH 5
+Preedit State
+.XS
+\*(SN Preedit State
+.XE
+.LP
+The
+.PN XNPreeditState
+argument specifies the state of input preediting for the input method.
+Input preediting can be on or off.
+.LP
+The valid mask names for
+.PN XNPreeditState
+are as follows:
+.LP
+.IN "XIMPreeditUnknown" "" "@DEV@"
+.IN "XIMPreeditEnable" "" "@DEF@"
+.IN "XIMPreeditDisable" "" "@DEV@"
+.sM
+.LP
+.Ds 0
+typedef unsigned long XIMPreeditState;
+.De
+.TS
+lw(.5i) lw(2i) lw(2i).
+T{
+#define
+T} T{
+.PN XIMPreeditUnknown
+T} T{
+0L
+T}
+T{
+#define
+T} T{
+.PN XIMPreeditEnable
+T} T{
+1L
+T}
+T{
+#define
+T} T{
+.PN XIMPreeditDisable
+T} T{
+(1L<<1)
+T}
+.TE
+.LP
+.eM
+If a value of
+.PN XIMPreeditEnable
+is set, then input preediting is turned on by the input method.
+.LP
+If a value of
+.PN XIMPreeditDisable
+is set, then input preediting is turned off by the input method.
+.LP
+If
+.PN XNPreeditState
+is left unspecified, then the state will be implementation-dependent.
+.LP
+When
+.PN XNResetState
+is set to
+.PN XIMInitialState ,
+the
+.PN XNPreeditState
+value specified at the creation time will be reflected as the initial state for
+.PN XmbResetIC
+and
+.PN XwcResetIC .
+.LP
+Because this XIC value is optional, a client should call
+.PN XGetIMValues
+with argument
+.PN XNQueryICValuesList
+before using this argument.
+.NH 5
+Preedit State Notify Callback
+.XS
+\*(SN Preedit State Notify Callback
+.XE
+.LP
+The preedit state notify callback is triggered by the input method
+when the preediting state has changed.
+The value of the
+.PN XNPreeditStateNotifyCallback
+argument is a pointer to a structure of type
+.PN XIMCallback .
+The generic prototype is as follows:
+.IN "PreeditStateNotifyCallback" "" "@DEF@"
+.sM
+.FD 0
+void PreeditStateNotifyCallback\^(\^\fIic\fP\^, \fIclient_data\fP\^, \fIcall_data\fP\^)
+.br
+ XIC \fIic\fP\^;
+.br
+ XPointer \fIclient_data\fP\^;
+.br
+ XIMPreeditStateNotifyCallbackStruct *\fIcall_data\fP\^;
+.FN
+.IP \fIic\fP 1i
+Specifies the input context.
+.IP \fIclient_data\fP 1i
+Specifies the additional client data.
+.IP \fIcall_data\fP 1i
+Specifies the current preedit state.
+.LP
+.eM
+The
+.PN XIMPreeditStateNotifyCallbackStruct
+structure is defined as follows:
+.LP
+.IN "XIMPreeditStateNotifyCallbackStruct" "" "@DEF@"
+.sM
+.Ds 0
+.TA .5i 2.5i
+.ta .5i 2.5i
+typedef struct _XIMPreeditStateNotifyCallbackStruct {
+ XIMPreeditState state;
+} XIMPreeditStateNotifyCallbackStruct;
+.De
+.LP
+.eM
+.LP
+Because this XIC value is optional, a client should call
+.PN XGetIMValues
+with argument
+.PN XNQueryICValuesList
+before using this argument.
+.NH 5
+Preedit and Status Callbacks
+.XS
+\*(SN Preedit and Status Callbacks
+.XE
+.LP
+A client that wants to support the input style
+.PN XIMPreeditCallbacks
+must provide a set of preedit callbacks to the input method.
+The set of preedit callbacks is as follows:
+.IN "XNPreeditStartCallback" "" "@DEF@"
+.IN "XNPreeditDoneCallback" "" "@DEF@"
+.IN "XNPreeditDrawCallback" "" "@DEF@"
+.IN "XNPreeditCaretCallback" "" "@DEF@"
+.TS
+lw(1.75i) lw(4i).
+T{
+.PN XNPreeditStartCallback
+T} T{
+This is called when the input method starts preedit.
+T}
+T{
+.PN XNPreeditDoneCallback
+T} T{
+This is called when the input method stops preedit.
+T}
+T{
+.PN XNPreeditDrawCallback
+T} T{
+This is called when a number of preedit keystrokes should be echoed.
+T}
+T{
+.PN XNPreeditCaretCallback
+T} T{
+This is called to move the text insertion point within the preedit string.
+T}
+.TE
+.LP
+A client that wants to support the input style
+.PN XIMStatusCallbacks
+must provide a set of status callbacks to the input method.
+The set of status callbacks is as follows:
+.IN "XNStatusStartCallback" "" "@DEF@"
+.IN "XNStatusDoneCallback" "" "@DEF@"
+.IN "XNStatusDrawCallback" "" "@DEF@"
+.TS
+lw(1.75i) lw(4i).
+T{
+.PN XNStatusStartCallback
+T} T{
+This is called when the input method initializes the status area.
+T}
+T{
+.PN XNStatusDoneCallback
+T} T{
+This is called when the input method no longer needs the status area.
+T}
+T{
+.PN XNStatusDrawCallback
+T} T{
+This is called when updating of the status area is required.
+T}
+.TE
+.LP
+The value of any status or preedit argument is a pointer
+to a structure of type
+.PN XIMCallback .
+.IN "XIMProc" "" "@DEF@"
+.IN "XIMCallback" "" "@DEF@"
+.sM
+.LP
+.Ds 0
+.TA .5i 2.5i
+.ta .5i 2.5i
+typedef void (*XIMProc)();
+
+typedef struct {
+ XPointer client_data;
+ XIMProc callback;
+} XIMCallback;
+.De
+.LP
+.eM
+Each callback has some particular semantics and will carry the data
+that expresses the environment necessary to the client
+into a specific data structure.
+This paragraph only describes the arguments to be used to set
+the callback.
+.LP
+Setting any of these values while doing preedit
+may cause unexpected results.
+.NH 3
+Input Method Callback Semantics
+.XS
+\*(SN Input Method Callback Semantics
+.XE
+.LP
+XIM callbacks are procedures defined by clients or text drawing packages
+that are 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 triggered,
+and what their arguments are.
+This information is mostly useful for X toolkit implementors.
+.LP
+Callbacks are mostly provided so that clients (or text editing
+packages) can implement on-the-spot preediting in their own window.
+In that case,
+the input method needs to communicate and synchronize with the client.
+The input method needs to communicate changes in the preedit window
+when it is under control of the client.
+Those callbacks allow the client to initialize the preedit area,
+display a new preedit string,
+move the text insertion point during preedit,
+terminate preedit, or update the status area.
+.LP
+All callback procedures follow the generic prototype:
+.IN "CallbackPrototype" "" "@DEF@"
+.sM
+.FD 0
+void CallbackPrototype\^(\^\fIic\fP\^, \fIclient_data\fP\^, \fIcall_data\fP\^)
+.br
+ XIC \fIic\fP\^;
+.br
+ XPointer \fIclient_data\fP\^;
+.br
+ SomeType \fIcall_data\fP\^;
+.FN
+.IP \fIic\fP 1i
+Specifies the input context.
+.IP \fIclient_data\fP 1i
+Specifies the additional client data.
+.IP \fIcall_data\fP 1i
+Specifies data specific to the callback.
+.LP
+.eM
+The call_data argument is a structure that expresses the arguments needed
+to achieve the semantics;
+that is,
+it is a specific data structure appropriate to the callback.
+In cases where no data is needed in the callback,
+this call_data argument is NULL.
+The client_data argument is a closure that has been initially specified
+by the client when specifying the callback and passed back.
+It may serve, for example, to inherit application context in the callback.
+.LP
+The following paragraphs describe the programming semantics
+and specific data structure associated with the different reasons.
+.NH 4
+Geometry Callback
+.XS
+\*(SN Geometry Callback
+.XE
+.LP
+The geometry callback is triggered by the input method
+to indicate that it wants the client to negotiate geometry.
+The generic prototype is as follows:
+.IN "GeometryCallback" "" "@DEF@"
+.sM
+.FD 0
+void GeometryCallback\^(\^\fIic\fP\^, \fIclient_data\fP\^, \fIcall_data\fP\^)
+.br
+ XIC \fIic\fP\^;
+.br
+ XPointer \fIclient_data\fP\^;
+.br
+ XPointer \fIcall_data\fP\^;
+.FN
+.IP \fIic\fP 1i
+Specifies the input context.
+.IP \fIclient_data\fP 1i
+Specifies the additional client data.
+.IP \fIcall_data\fP 1i
+Not used for this callback and always passed as NULL.
+.LP
+.eM
+The callback is called with a NULL call_data argument.
+.NH 4
+Destroy Callback
+.XS
+\*(SN Destroy Callback
+.XE
+.LP
+The destroy callback is triggered by the input method
+when it stops service for any reason.
+After the callback is invoked, the input context will be freed by Xlib.
+The generic prototype is as follows:
+.IN "DestroyCallback" "" "@DEF@"
+.sM
+.FD 0
+void DestroyCallback\^(\^\fIic\fP\^, \fIclient_data\fP\^, \fIcall_data\fP\^)
+.br
+ XIC \fIic\fP\^;
+.br
+ XPointer \fIclient_data\fP\^;
+.br
+ XPointer \fIcall_data\fP\^;
+.FN
+.IP \fIic\fP 1i
+Specifies the input context.
+.IP \fIclient_data\fP 1i
+Specifies the additional client data.
+.IP \fIcall_data\fP 1i
+Not used for this callback and always passed as NULL.
+.LP
+.eM
+The callback is called with a NULL call_data argument.
+.NH 4
+String Conversion Callback
+.XS
+\*(SN String Conversion Callback
+.XE
+.LP
+The string conversion callback is triggered by the input method
+to request the client to return the string to be converted. The
+returned string may be either a multibyte or wide character string,
+with an encoding matching the locale bound to the input context.
+The callback prototype is as follows:
+.IN "StringConversionCallback" "" "@DEF@"
+.sM
+.FD 0
+void StringConversionCallback\^(\^\fIic\fP\^, \fIclient_data\fP\^, \fIcall_data\fP\^)
+.br
+ XIC \fIic\fP\^;
+.br
+ XPointer \fIclient_data\fP\^;
+.br
+ XIMStringConversionCallbackStruct *\fIcall_data\fP\^;
+.FN
+.IP \fIic\fP 1i
+Specifies the input method.
+.IP \fIclient_data\fP 1i
+Specifies the additional client data.
+.IP \fIcall_data\fP 1i
+Specifies the amount of the string to be converted.
+.LP
+.eM
+The callback is passed an
+.PN XIMStringConversionCallbackStruct
+structure in the call_data argument.
+The text member is an
+.PN XIMStringConversionText
+structure (see section 13.5.6.9) to be filled in by the client
+and describes the text to be sent to the input method.
+The data pointed to by the
+string and feedback elements of the
+.PN XIMStringConversionText
+structure will be freed using
+.PN XFree
+by the input method
+after the callback returns. So the client should not point to
+internal buffers that are critical to the client.
+Similarly, because the feedback element is currently reserved for future
+use, the client should set feedback to NULL to prevent the library from
+freeing memory at some random location due to an uninitialized pointer.
+.LP
+The
+.PN XIMStringConversionCallbackStruct
+structure is defined as follows:
+.LP
+.IN "XIMStringConversionCallbackStruct" "" "@DEF@"
+.sM
+.LP
+.Ds 0
+typedef struct _XIMStringConversionCallbackStruct {
+ XIMStringConversionPosition position;
+ XIMCaretDirection direction;
+ short factor;
+ XIMStringConversionOperation operation;
+ XIMStringConversionText *text;
+} XIMStringConversionCallbackStruct;
+
+typedef short XIMStringConversionPosition;
+
+typedef unsigned short XIMStringConversionOperation;
+
+.De
+.LP
+.TS
+lw(.5i) lw(3i) lw(2i).
+T{
+#define
+T} T{
+.PN XIMStringConversionSubstitution
+T} T{
+(0x0001)
+T}
+T{
+#define
+T} T{
+.PN XIMStringConversionRetrieval
+T} T{
+(0x0002)
+T}
+.TE
+.LP
+.eM
+.PN XIMStringConversionPosition
+specifies the starting position of the string to be returned
+in the
+.PN XIMStringConversionText
+structure. The value identifies a position, in units of characters,
+relative to the client's cursor position in the client's buffer.
+.LP
+The ending position of the text buffer is determined by
+the direction and factor members. Specifically, it is the character position
+relative to the starting point as defined by the
+.PN XIMCaretDirection .
+The factor member of
+.PN XIMStringConversionCallbackStruct
+specifies the number of
+.PN XIMCaretDirection
+positions to be applied. For example, if the direction specifies
+.PN XIMLineEnd
+and factor is 1, then all characters from the starting position to
+the end of the current display line are returned. If the direction
+specifies
+.PN XIMForwardChar
+or
+.PN XIMBackwardChar ,
+then the factor specifies a relative position, indicated in characters,
+from the starting position.
+.LP
+.PN XIMStringConversionOperation
+specifies whether the string to be converted should be
+deleted (substitution) or copied (retrieval) from the client's
+buffer. When the
+.PN XIMStringConversionOperation
+is
+.PN XIMStringConversionSubstitution ,
+the client must delete the string to be converted from its own buffer.
+When the
+.PN XIMStringConversionOperation
+is
+.PN XIMStringConversionRetrieval ,
+the client must not delete the string to be converted from its buffer.
+The substitute operation is typically used for reconversion and
+transliteration conversion,
+while the retrieval operation is typically used for context-sensitive
+conversion.
+.NH 4
+Preedit State Callbacks
+.XS
+\*(SN Preedit State Callbacks
+.XE
+.LP
+When the input method turns preediting on or off, a
+.PN PreeditStartCallback
+or
+.PN PreeditDoneCallback
+callback is triggered to let the toolkit do the setup
+or the cleanup for the preedit region.
+.IN "PreeditStartCallback" "" "@DEF@"
+.sM
+.FD 0
+int PreeditStartCallback\^(\^\fIic\fP\^, \fIclient_data\fP\^, \fIcall_data\fP\^)
+.br
+ XIC \fIic\fP\^;
+.br
+ XPointer \fIclient_data\fP\^;
+.br
+ XPointer \fIcall_data\fP\^;
+.FN
+.IP \fIic\fP 1i
+Specifies the input context.
+.IP \fIclient_data\fP 1i
+Specifies the additional client data.
+.IP \fIcall_data\fP 1i
+Not used for this callback and always passed as NULL.
+.LP
+.eM
+When preedit starts on the specified input context,
+the callback is called with a NULL call_data argument.
+.PN PreeditStartCallback
+will return the maximum size of the preedit string.
+A positive number indicates the maximum number of bytes allowed
+in the preedit string,
+and a value of \-1 indicates there is no limit.
+.IN "PreeditDoneCallback" "" "@DEF@"
+.sM
+.FD 0
+void PreeditDoneCallback\^(\^\fIic\fP\^, \fIclient_data\fP\^, \fIcall_data\fP\^)
+.br
+ XIC \fIic\fP\^;
+.br
+ XPointer \fIclient_data\fP\^;
+.br
+ XPointer \fIcall_data\fP\^;
+.FN
+.IP \fIic\fP 1i
+Specifies the input context.
+.IP \fIclient_data\fP 1i
+Specifies the additional client data.
+.IP \fIcall_data\fP 1i
+Not used for this callback and always passed as NULL.
+.LP
+.eM
+When preedit stops on the specified input context,
+the callback is called with a NULL call_data argument.
+The client can release the data allocated by
+.PN PreeditStartCallback .
+.LP
+.PN PreeditStartCallback
+should initialize appropriate data needed for
+displaying preedit information and for handling further
+.PN PreeditDrawCallback
+calls.
+Once
+.PN PreeditStartCallback
+is called, it will not be called again before
+.PN PreeditDoneCallback
+has been called.
+.NH 4
+Preedit Draw Callback
+.XS
+\*(SN Preedit Draw Callback
+.XE
+.LP
+This callback is triggered to draw and insert, delete or replace,
+preedit text in the preedit region.
+The preedit 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 multibyte or wide character string,
+whose encoding matches the locale bound to the input context.
+The callback prototype
+is as follows:
+.IN "PreeditDrawCallback" "" "@DEF@"
+.sM
+.FD 0
+void PreeditDrawCallback\^(\^\fIic\fP\^, \fIclient_data\fP\^, \fIcall_data\fP\^)
+.br
+ XIC \fIic\fP\^;
+.br
+ XPointer \fIclient_data\fP\^;
+.br
+ XIMPreeditDrawCallbackStruct *\fIcall_data\fP\^;
+.FN
+.IP \fIic\fP 1i
+Specifies the input context.
+.IP \fIclient_data\fP 1i
+Specifies the additional client data.
+.IP \fIcall_data\fP 1i
+Specifies the preedit drawing information.
+.LP
+.eM
+The callback is passed an
+.PN 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.
+.LP
+The
+.PN XIMPreeditDrawCallbackStruct
+structure is defined as follows:
+.LP
+.IN "XIMPreeditDrawCallbackStruct" "" "@DEF@"
+.sM
+.Ds 0
+.TA .5i 2.5i
+.ta .5i 2.5i
+typedef struct _XIMPreeditDrawCallbackStruct {
+ int caret; /* Cursor offset within preedit string */
+ int chg_first; /* Starting change position */
+ int chg_length; /* Length of the change in character count */
+ XIMText *text;
+} XIMPreeditDrawCallbackStruct;
+.De
+.LP
+.eM
+The client must keep updating a buffer of the preedit text
+and the callback arguments referring to indexes in that buffer.
+The call_data fields have specific meanings according to the operation,
+as follows:
+.IP \(bu 5
+To indicate text deletion,
+the call_data member specifies a NULL text field.
+The text to be deleted is then the current text in the buffer
+from position chg_first (starting at zero) on a character length
+of chg_length.
+.IP \(bu 5
+When text is non-NULL,
+it indicates insertion or replacement of text in the buffer.
+.IP
+The chg_length member
+identifies the number of characters in the current preedit buffer
+that are affected by this call.
+A positive chg_length indicates that chg_length number of characters, starting
+at chg_first, must be deleted or must be replaced by text, whose length is
+specified in the
+.PN XIMText
+structure.
+.IP
+A chg_length value of zero indicates that text must be inserted
+right at the position specified by chg_first.
+A value of zero for chg_first specifies the first character in the buffer.
+.IP
+chg_length and chg_first combine to identify the modification required to
+the preedit buffer; beginning at chg_first, replace chg_length number of
+characters with the text in the supplied
+.PN XIMText
+structure. For example, suppose the preedit buffer contains the string "ABCDE".
+.IP
+.DS I
+.ft C
+Text: A B C D E
+ ^ ^ ^ ^ ^ ^
+CharPos: 0 1 2 3 4 5
+.sp
+.ft P
+.DE
+The CharPos in the diagram shows the location of the character position
+relative to the character.
+.IP
+If the value of chg_first is 1 and the value of chg_length is 3, this
+says to replace 3 characters beginning at character position 1 with the
+string in the
+.PN XIMText
+structure.
+Hence, BCD would be replaced by the value in the structure.
+.IP
+Though chg_length and chg_first are both signed integers they will
+never have a negative value.
+.IP \(bu 5
+The caret member
+identifies the character position before which the cursor should
+be placed \- after modification to the preedit buffer has been completed.
+For example, if caret is zero, the cursor is at
+the beginning of the buffer. If the caret is one, the cursor is between
+the first and second character.
+.LP
+.IN "XIMText" "" @DEF@"
+.sM
+.Ds
+.TA .5i 1.5i 3i
+typedef struct _XIMText {
+ unsigned short length;
+ XIMFeedback * feedback;
+ Bool encoding_is_wchar;
+ union {
+ char * multi_byte;
+ wchar_t * wide_char;
+ } string;
+} XIMText;
+.De
+.LP
+.eM
+The text string passed is actually a structure specifying as follows:
+.IP \(bu 5
+The length member is the text length in characters.
+.IP \(bu 5
+The encoding_is_wchar member is a value that indicates
+if the text string is encoded in wide character or multibyte format.
+The text string may be passed either as multibyte or as wide character;
+the input method controls in which form data is passed.
+The client's
+callback routine must be able to handle data passed in either form.
+.IP \(bu 5
+The string member is the text string.
+.IP \(bu 5
+The feedback member indicates rendering type for each character in the
+string member.
+If string is NULL (indicating that only highlighting of the existing
+preedit buffer should be updated), feedback points to length highlight
+elements that should be applied to the existing preedit buffer, beginning
+at chg_first.
+.LP
+The feedback member expresses 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
+(for example, primary, secondary) or in specific ways (reverse, underline).
+When generic indications are given,
+the client is free to choose the rendering style.
+It is necessary, however, that primary and secondary be mapped
+to two distinct rendering styles.
+.LP
+If an input method wants to control display of the preedit string, an
+input method can indicate the visibility hints using feedbacks in
+a specific way.
+The
+.PN XIMVisibleToForward ,
+.PN XIMVisibleToBackward ,
+and
+.PN XIMVisibleCenter
+masks are exclusively used for these visibility hints.
+The
+.PN XIMVisibleToForward
+mask
+indicates that the preedit text is preferably displayed in the
+primary draw direction from the
+caret position in the preedit area forward.
+The
+.PN XIMVisibleToBackward
+mask
+indicates that the preedit text is preferably displayed from
+the caret position in the preedit area backward, relative to the primary
+draw direction.
+The
+.PN XIMVisibleCenter
+mask
+indicates that the preedit text is preferably displayed with
+the caret position in the preedit area centered.
+.LP
+The insertion point of the preedit string could exist outside of
+the visible area when visibility hints are used.
+Only one of the
+masks
+is valid for the entire preedit string, and only one character
+can hold one of these feedbacks for a given input context at one time.
+This feedback may be OR'ed together with another highlight (such as
+.PN XIMReverse ).
+Only the most recently set feedback is valid, and any previous
+feedback is automatically canceled. This is a hint to the client, and
+the client is free to choose how to display the preedit string.
+.LP
+The feedback member also specifies how rendering of the text argument
+should be performed.
+If the feedback is NULL,
+the callback should apply the same feedback as is used for the surrounding
+characters in the preedit buffer; if chg_first is at a highlight boundary,
+the client can choose which of the two highlights to use.
+If feedback is not NULL, feedback specifies an array defining the
+rendering for each
+character of the string, and the length of the array is thus length.
+.LP
+If an input method wants to indicate that it is only updating the feedback of
+the preedit text without changing the content of it,
+the
+.PN XIMText
+structure will contain a NULL value for the string field,
+the number of characters affected (relative to chg_first)
+will be in the length field,
+and the feedback field will point to an array of
+.PN XIMFeedback .
+.LP
+Each element in the feedback array is a bitmask represented by a value of type
+.PN XIMFeedback .
+The valid mask names are as follows:
+.LP
+.IN "XIMReverse" "" "@DEF@"
+.IN "XIMUnderline" "" "@DEF@"
+.IN "XIMHighlight" "" "@DEF@"
+.IN "XIMPrimary" "" "@DEF@"
+.IN "XIMSecondary" "" "@DEF@"
+.IN "XIMTertiary" "" "@DEF@"
+.IN "XIMVisibleToForward" "" "@DEF@"
+.IN "XIMVisibleToBackward" "" "@DEF@"
+.IN "XIMVisibleCenter" "" "@DEF@"
+.sM
+.LP
+.Ds 0
+typedef unsigned long XIMFeedback;
+.De
+.TS
+lw(.5i) lw(2i) lw(2i).
+T{
+#define
+T} T{
+.PN XIMReverse
+T} T{
+1L
+T}
+T{
+#define
+T} T{
+.PN XIMUnderline
+T} T{
+(1L<<1)
+T}
+T{
+#define
+T} T{
+.PN XIMHighlight
+T} T{
+(1L<<2)
+T}
+T{
+#define
+T} T{
+.PN XIMPrimary
+T} T{
+(1L<<5)\(dg
+T}
+T{
+#define
+T} T{
+.PN XIMSecondary
+T} T{
+(1L<<6)\(dg
+T}
+T{
+#define
+T} T{
+.PN XIMTertiary
+T} T{
+(1L<<7)\(dg
+T}
+T{
+#define
+T} T{
+.PN XIMVisibleToForward
+T} T{
+(1L<<8)
+T}
+T{
+#define
+T} T{
+.PN XIMVisibleToBackward
+T} T{
+(1L<<9)
+T}
+T{
+#define
+T} T{
+.PN XIMVisibleCenter
+T} T{
+(1L<<10)
+T}
+.TE
+.LP
+.eM
+.LP
+Characters drawn with the
+.PN XIMReverse
+highlight should be drawn by swapping the foreground and background colors
+used to draw normal, unhighlighted characters.
+Characters drawn with the
+.PN XIMUnderline
+highlight should be underlined.
+Characters drawn with the
+.PN XIMHighlight ,
+.PN XIMPrimary ,
+.PN XIMSecondary ,
+and
+.PN XIMTertiary
+highlights should be drawn in some unique manner that must be different
+from
+.PN XIMReverse
+and
+.PN XIMUnderline .
+.FS \(dg
+The values for
+.PN XIMPrimary ,
+.PN XIMSecondary ,
+and
+.PN XIMTertiary
+were incorrectly defined in the R5 specification.
+The X Consortium's X11R5
+implementation correctly implemented the values for these highlights.
+The value of these highlights has been corrected in this specification
+to agree with the values in the Consortium's X11R5 and X11R6 implementations.
+.FE
+.NH 4
+Preedit Caret Callback
+.XS
+\*(SN Preedit Caret Callback
+.XE
+.LP
+An input method may have its own navigation keys to allow the user
+to move the text insertion point in the preedit area
+(for example, to 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.
+.IN "PreeditCaretCallback" "" "@DEF@"
+.sM
+.FD 0
+void PreeditCaretCallback\^(\^\fIic\fP\^, \fIclient_data\fP\^, \fIcall_data\fP\^)
+.br
+ XIC \fIic\fP\^;
+.br
+ XPointer \fIclient_data\fP\^;
+.br
+ XIMPreeditCaretCallbackStruct *\fIcall_data\fP\^;
+.FN
+.IP \fIic\fP 1i
+Specifies the input context.
+.IP \fIclient_data\fP 1i
+Specifies the additional client data.
+.IP \fIcall_data\fP 1i
+Specifies the preedit caret information.
+.LP
+.eM
+The input method will trigger PreeditCaretCallback
+to move the text insertion point during preedit.
+The call_data argument contains a pointer to an
+.PN XIMPreeditCaretCallbackStruct
+structure,
+which 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 the initial position.
+.LP
+The
+.PN XIMPreeditCaretCallbackStruct
+structure is defined as follows:
+.IN "XIMPreeditCaretCallbackStruct" "" "@DEF@"
+.LP
+.sM
+.Ds 0
+.TA .5i 2.5i
+.ta .5i 2.5i
+typedef struct _XIMPreeditCaretCallbackStruct {
+ int position; /* Caret offset within preedit string */
+ XIMCaretDirection direction; /* Caret moves direction */
+ XIMCaretStyle style; /* Feedback of the caret */
+} XIMPreeditCaretCallbackStruct;
+.De
+.LP
+.eM
+The
+.PN XIMCaretStyle
+structure is defined as follows:
+.LP
+.IN "XIMCaretStyle" "" "@DEF@"
+.sM
+.Ds 0
+.TA .5i 2.5i
+.ta .5i 2.5i
+typedef enum {
+ XIMIsInvisible, /* Disable caret feedback */
+ XIMIsPrimary, /* UI defined caret feedback */
+ XIMIsSecondary, /* UI defined caret feedback */
+} XIMCaretStyle;
+.De
+.LP
+.eM
+The
+.PN XIMCaretDirection
+structure is defined as follows:
+.IN "XIMCaretDirection" "" "@DEF@"
+.LP
+.sM
+.Ds 0
+.TA .5i 2.5i
+.ta .5i 2.5i
+typedef enum {
+ XIMForwardChar, XIMBackwardChar,
+ XIMForwardWord, XIMBackwardWord,
+ XIMCaretUp, XIMCaretDown,
+ XIMNextLine, XIMPreviousLine,
+ XIMLineStart, XIMLineEnd,
+ XIMAbsolutePosition,
+ XIMDontChange,
+ } XIMCaretDirection;
+.De
+.LP
+.eM
+These values are defined as follows:
+.IN "XIMForwardChar" "" "@DEF@"
+.IN "XIMBackwardChar" "" "@DEF@"
+.IN "XIMForwardWord" "" "@DEF@"
+.IN "XIMBackwardWord" "" "@DEF@"
+.IN "XIMCaretUp" "" "@DEF@"
+.IN "XIMCaretDown" "" "@DEF@"
+.TS
+lw(1.5i) lw(4.25i).
+T{
+.PN XIMForwardChar
+T} T{
+Move the caret forward one character position.
+T}
+T{
+.PN XIMBackwardChar
+T} T{
+Move the caret backward one character position.
+T}
+T{
+.PN XIMForwardWord
+T} T{
+Move the caret forward one word.
+T}
+T{
+.PN XIMBackwardWord
+T} T{
+Move the caret backward one word.
+T}
+T{
+.PN XIMCaretUp
+T} T{
+Move the caret up one line keeping the current horizontal offset.
+T}
+T{
+.PN XIMCaretDown
+T} T{
+Move the caret down one line keeping the current horizontal offset.
+T}
+T{
+.PN XIMPreviousLine
+T} T{
+Move the caret to the beginning of the previous line.
+T}
+T{
+.PN XIMNextLine
+T} T{
+Move the caret to the beginning of the next line.
+T}
+T{
+.PN XIMLineStart
+T} T{
+Move the caret to the beginning of the current display line
+that contains the caret.
+T}
+T{
+.PN XIMLineEnd
+T} T{
+Move the caret to the end of the current display line
+that contains the caret.
+T}
+T{
+.PN XIMAbsolutePosition
+T} T{
+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 preedit text.
+Hence, a value of zero means move back to the beginning of the preedit text.
+T}
+T{
+.PN XIMDontChange
+T} T{
+The caret position does not change.
+T}
+.TE
+.IN "XIMNextLine" "" "@DEF@"
+.IN "XIMPreviousLine" "" "@DEF@"
+.IN "XIMLineStart" "" "@DEF@"
+.IN "XIMLineEnd" "" "@DEF@"
+.IN "XIMAbsolutePosition" "" "@DEF@"
+.IN "XIMDontChange" "" "@DEF@"
+.NH 4
+Status Callbacks
+.XS
+\*(SN Status Callbacks
+.XE
+.LP
+An input method may communicate changes in the status of an input context
+(for example, created, destroyed, or focus changes) with three status
+callbacks: StatusStartCallback, StatusDoneCallback, and StatusDrawCallback.
+.LP
+.sp
+When the input context is created or gains focus,
+the input method calls the StatusStartCallback callback.
+.IN "StatusStartCallback" "" "@DEF@"
+.sM
+.FD 0
+void StatusStartCallback\^(\^\fIic\fP\^, \fIclient_data\fP\^, \fIcall_data\fP\^)
+.br
+ XIC \fIic\fP\^;
+.br
+ XPointer \fIclient_data\fP\^;
+.br
+ XPointer \fIcall_data\fP\^;
+.FN
+.IP \fIic\fP 1i
+Specifies the input context.
+.IP \fIclient_data\fP 1i
+Specifies the additional client data.
+.IP \fIcall_data\fP 1i
+Not used for this callback and always passed as NULL.
+.LP
+.eM
+The callback should initialize appropriate data for displaying status
+and for responding to StatusDrawCallback calls.
+Once StatusStartCallback is called,
+it will not be called again before StatusDoneCallback has been called.
+.LP
+.sp
+When an input context
+is destroyed or when it loses focus, the input method calls StatusDoneCallback.
+.IN "StatusDoneCallback" "" "@DEF@"
+.sM
+.FD 0
+void StatusDoneCallback\^(\^\fIic\fP\^, \fIclient_data\fP\^, \fIcall_data\fP\^)
+.br
+ XIC \fIic\fP\^;
+.br
+ XPointer \fIclient_data\fP\^;
+.br
+ XPointer \fIcall_data\fP\^;
+.FN
+.IP \fIic\fP 1i
+Specifies the input context.
+.IP \fIclient_data\fP 1i
+Specifies the additional client data.
+.IP \fIcall_data\fP 1i
+Not used for this callback and always passed as NULL.
+.LP
+.eM
+The callback may release any data allocated on
+.PN StatusStart .
+.LP
+.sp
+When an input context status has to be updated, the input method calls
+StatusDrawCallback.
+.IN "StatusDrawCallback" "" "@DEF@"
+.sM
+.FD 0
+void StatusDrawCallback\^(\^\fIic\fP\^, \fIclient_data\fP\^, \fIcall_data\fP\^)
+.br
+ XIC \fIic\fP\^;
+.br
+ XPointer \fIclient_data\fP\^;
+.br
+ XIMStatusDrawCallbackStruct *\fIcall_data\fP\^;
+.FN
+.IP \fIic\fP 1i
+Specifies the input context.
+.IP \fIclient_data\fP 1i
+Specifies the additional client data.
+.IP \fIcall_data\fP 1i
+Specifies the status drawing information.
+.LP
+.eM
+The callback should update the status area by either drawing a string
+or imaging a bitmap in the status area.
+.LP
+The
+.PN XIMStatusDataType
+and
+.PN XIMStatusDrawCallbackStruct
+structures are defined as follows:
+.IN "XIMStatusDataType" "" "@DEF@"
+.IN "XIMStatusDrawCallbackStruct" "" "@DEF@"
+.LP
+.sM
+.Ds 0
+.TA .5i 1i 3i
+.ta .5i 1i 3i
+typedef enum {
+ XIMTextType,
+ XIMBitmapType,
+} XIMStatusDataType;
+
+typedef struct _XIMStatusDrawCallbackStruct {
+ XIMStatusDataType type;
+ union {
+ XIMText *text;
+ Pixmap bitmap;
+ } data;
+} XIMStatusDrawCallbackStruct;
+.De
+.LP
+.eM
+.LP
+The feedback styles
+.PN XIMVisibleToForward ,
+.PN XIMVisibleToBackward ,
+and
+.PN XIMVisibleToCenter
+are not relevant and will not appear in the
+.PN XIMFeedback
+element of the
+.PN XIMText
+structure.
+.LP
+.NH 3
+Event Filtering
+.XS
+\*(SN Event Filtering
+.XE
+.LP
+Xlib provides the ability for an input method
+to register a filter internal to Xlib.
+This filter is called by a client (or toolkit) by calling
+.PN XFilterEvent
+after calling
+.PN XNextEvent .
+Any client that uses the
+.PN XIM
+interface should call
+.PN 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
+(for example, modal grabs).
+.LP
+Clients may not know how many filters there are, if any,
+and what they do.
+They may only know if an event has been filtered on return of
+.PN XFilterEvent .
+Clients should discard filtered events.
+.sp
+.LP
+To filter an event, use
+.PN XFilterEvent .
+.IN "XFilterEvent" "" "@DEF@"
+.sM
+.FD 0
+Bool XFilterEvent\^(\^\fIevent\fP\^, \fIw\fP\^)
+.br
+ XEvent *\fIevent\fP\^;
+.br
+ Window \fIw\fP\^;
+.FN
+.ds Ev event to filter
+.IP \fIevent\fP 1i
+Specifies the \*(Ev.
+.ds Wi for which the filter is to be applied
+.IP \fIw\fP 1i
+Specifies the window \*(Wi.
+.LP
+.eM
+If the window argument is
+.PN None ,
+.PN XFilterEvent
+applies the filter to the window specified in the
+.PN XEvent
+structure.
+The window argument is provided so that layers above Xlib
+that do event redirection can indicate to which window an event
+has been redirected.
+.LP
+If
+.PN XFilterEvent
+returns
+.PN True ,
+then some input method has filtered the event,
+and the client should discard the event.
+If
+.PN XFilterEvent
+returns
+.PN False ,
+then the client should continue processing the event.
+.LP
+If a grab has occurred in the client and
+.PN XFilterEvent
+returns
+.PN True ,
+the client should ungrab the keyboard.
+.NH 3
+Getting Keyboard Input
+.XS
+\*(SN Getting Keyboard Input
+.XE
+.LP
+To get composed input from an input method,
+use
+.PN XmbLookupString
+or
+.PN XwcLookupString .
+.IN "XmbLookupString" "" "@DEF@"
+.IN "XwcLookupString" "" "@DEF@"
+.sM
+.FD 0
+int XmbLookupString\^(\^\fIic\fP\^, \fIevent\fP\^, \fIbuffer_return\fP\^, \fIbytes_buffer\fP\^, \fIkeysym_return\fP\^, \fIstatus_return\fP\^)
+.br
+ XIC \fIic\fP\^;
+.br
+ XKeyPressedEvent *\fIevent\fP;
+.br
+ char *\fIbuffer_return\fP\^;
+.br
+ int \fIbytes_buffer\fP\^;
+.br
+ KeySym *\fIkeysym_return\fP\^;
+.br
+ Status *\fIstatus_return\fP\^;
+.FN
+.FD 0
+int XwcLookupString\^(\^\fIic\fP\^, \fIevent\fP\^, \fIbuffer_return\fP\^, \fIbytes_buffer\fP\^, \fIkeysym_return\fP\^, \fIstatus_return\fP\^)
+.br
+ XIC \fIic\fP\^;
+.br
+ XKeyPressedEvent *\fIevent\fP\^;
+.br
+ wchar_t *\fIbuffer_return\fP\^;
+.br
+ int \fIwchars_buffer\fP\^;
+.br
+ KeySym *\fIkeysym_return\fP\^;
+.br
+ Status *\fIstatus_return\fP\^;
+.FN
+.IP \fIic\fP 1i
+Specifies the input context.
+.ds Ev key event to be used
+.IP \fIevent\fP 1i
+Specifies the \*(Ev.
+.IP \fIbuffer_return\fP 1i
+Returns a multibyte string or wide character string (if any)
+from the input method.
+.IP \fIbytes_buffer\fP 1i
+.br
+.ns
+.IP \fIwchars_buffer\fP 1i
+Specifies space available in the return buffer.
+.IP \fIkeysym_return\fP 1i
+Returns the KeySym computed from the event if this argument is not NULL.
+.IP \fIstatus_return\fP 1i
+Returns a value indicating what kind of data is returned.
+.LP
+.eM
+The
+.PN XmbLookupString
+and
+.PN XwcLookupString
+functions return the string from the input method specified
+in the buffer_return argument.
+If no string is returned,
+the buffer_return argument is unchanged.
+.LP
+The KeySym into which the KeyCode from the event was mapped is returned
+in the keysym_return argument if it is non-NULL and the status_return
+argument 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.
+.LP
+.PN XmbLookupString
+returns the length of the string in bytes, and
+.PN XwcLookupString
+returns the length of the string in characters.
+Both
+.PN XmbLookupString
+and
+.PN XwcLookupString
+return text in the encoding of the locale bound to the input method
+of the specified input context.
+.LP
+Each string returned by
+.PN XmbLookupString
+and
+.PN XwcLookupString
+begins in the initial state of the encoding of the locale
+(if the encoding of the locale is state-dependent).
+.NT
+To insure proper input processing,
+it is essential that the client pass only
+.PN KeyPress
+events to
+.PN XmbLookupString
+and
+.PN XwcLookupString .
+Their behavior when a client passes a
+.PN KeyRelease
+event is undefined.
+.NE
+.LP
+Clients should check the status_return argument before
+using the other returned values.
+These two functions both return a value to status_return
+that indicates what has been returned in the other arguments.
+The possible values returned are:
+.TS
+lw(1.5i) lw(4.3i).
+T{
+.PN XBufferOverflow
+T} T{
+The input string to be returned is too large for the supplied buffer_return.
+The required size
+.Pn ( XmbLookupString
+in bytes;
+.PN 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 adequate size to obtain the string.
+T}
+T{
+.PN XLookupNone
+T} T{
+No consistent input has been composed so far.
+The contents of buffer_return and keysym_return are not modified,
+and the function returns zero.
+T}
+T{
+.PN XLookupChars
+T} T{
+Some input characters have been composed.
+They are placed in the buffer_return argument,
+and the string length is returned as the value of the function.
+The string is encoded in the locale bound to the input context.
+The content of the keysym_return argument is not modified.
+T}
+T{
+.PN XLookupKeySym
+T} T{
+A KeySym has been returned instead of a string
+and is returned in keysym_return.
+The content of the buffer_return argument is not modified,
+and the function returns zero.
+T}
+T{
+.PN XLookupBoth
+T} T{
+Both a KeySym and a string are returned;
+.PN XLookupChars
+and
+.PN XLookupKeySym
+occur simultaneously.
+T}
+.TE
+.LP
+It does not make any difference if the input context passed as an argument to
+.PN XmbLookupString
+and
+.PN XwcLookupString
+is the one 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
+.PN XmbLookupString
+or
+.PN XwcLookupString
+even though it does not have any more keyboard focus.
+.NH 3
+Input Method Conventions
+.XS
+\*(SN Input Method Conventions
+.XE
+.LP
+The input method architecture is 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.
+.NH 4
+Client Conventions
+.XS
+\*(SN Client Conventions
+.XE
+.LP
+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 continuation of the program
+or raise an exception or error of some sort.
+.NH 4
+Synchronization Conventions
+.XS
+\*(SN Synchronization Conventions
+.XE
+.LP
+A
+.PN KeyPress
+event with a KeyCode of zero is used exclusively as a
+signal that an input method has composed input that can be returned by
+.PN XmbLookupString
+or
+.PN XwcLookupString .
+No other use is made of a
+.PN KeyPress
+event with KeyCode of zero.
+.LP
+Such an event may be generated by either a front-end
+or a back-end input method in an implementation-dependent manner.
+Some possible ways to generate this event include:
+.IP \(bu 5
+A synthetic event sent by an input method server
+.IP \(bu 5
+An artificial event created by a input method filter and pushed
+onto a client's event queue
+.IP \(bu 5
+A
+.PN KeyPress
+event whose KeyCode value is modified by an input method filter
+.LP
+When callback support is specified by the 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).
+.NH 2
+String Constants
+.XS
+\*(SN String Constants
+.XE
+.LP
+The following symbols for string constants are defined in
+.hN X11/Xlib.h .
+Although they are shown here with particular macro definitions,
+they may be implemented as macros, as global symbols, or as a
+mixture of the two. The string pointer value itself
+is not significant; clients must not assume that inequality of two
+values implies inequality of the actual string data.
+.IN "XNVaNestedList" "" "@DEF@"
+.IN "XNSeparatorofNestedList "" "@DEF@"
+.IN "XNQueryInputStyle" "" "@DEF@"
+.IN "XNClientWindow" "" "@DEF@"
+.IN "XNInputStyle" "" "@DEF@"
+.IN "XNFocusWindow" "" "@DEF@"
+.IN "XNResourceName" "" "@DEF@"
+.IN "XNResourceClass" "" "@DEF@"
+.IN "XNGeometryCallback" "" "@DEF@"
+.IN "XNDestroyCallback" "" "@DEF@"
+.IN "XNFilterEvents" "" "@DEF@"
+.IN "XNPreeditStartCallback" "" "@DEF@"
+.IN "XNPreeditDoneCallback" "" "@DEF@"
+.IN "XNPreeditDrawCallback" "" "@DEF@"
+.IN "XNPreeditCaretCallback" "" "@DEF@"
+.IN "XNPreeditStateNotifyCallback" "" "@DEF@"
+.IN "XNPreeditAttributes" "" "@DEF@"
+.IN "XNStatusStartCallback" "" "@DEF@"
+.IN "XNStatusDoneCallback" "" "@DEF@"
+.IN "XNStatusDrawCallback" "" "@DEF@"
+.IN "XNStatusAttributes" "" "@DEF@"
+.IN "XNArea" "" "@DEF@"
+.IN "XNAreaNeeded" "" "@DEF@"
+.IN "XNSpotLocation" "" "@DEF@"
+.IN "XNColormap" "" "@DEF@"
+.IN "XNStdColormap" "" "@DEF@"
+.IN "XNForeground" "" "@DEF@"
+.IN "XNBackground" "" "@DEF@"
+.IN "XNBackgroundPixmap" "" "@DEF@"
+.IN "XNFontSet" "" "@DEF@"
+.IN "XNLineSpace" "" "@DEF@"
+.IN "XNCursor" "" "@DEF@"
+.TS
+lw(.5i) lw(2.75i) lw(2.5i).
+T{
+#define
+T} T{
+.PN XNVaNestedList
+T} T{
+"XNVaNestedList"
+T}
+T{
+#define
+T} T{
+.PN XNSeparatorofNestedList
+T} T{
+"separatorofNestedList"
+T}
+T{
+#define
+T} T{
+.PN XNQueryInputStyle
+T} T{
+"queryInputStyle"
+T}
+T{
+#define
+T} T{
+.PN XNClientWindow
+T} T{
+"clientWindow"
+T}
+T{
+#define
+T} T{
+.PN XNInputStyle
+T} T{
+"inputStyle"
+T}
+T{
+#define
+T} T{
+.PN XNFocusWindow
+T} T{
+"focusWindow"
+T}
+T{
+#define
+T} T{
+.PN XNResourceName
+T} T{
+"resourceName"
+T}
+T{
+#define
+T} T{
+.PN XNResourceClass
+T} T{
+"resourceClass"
+T}
+T{
+#define
+T} T{
+.PN XNGeometryCallback
+T} T{
+"geometryCallback"
+T}
+T{
+#define
+T} T{
+.PN XNDestroyCallback
+T} T{
+"destroyCallback"
+T}
+T{
+#define
+T} T{
+.PN XNFilterEvents
+T} T{
+"filterEvents"
+T}
+T{
+#define
+T} T{
+.PN XNPreeditStartCallback
+T} T{
+"preeditStartCallback"
+T}
+T{
+#define
+T} T{
+.PN XNPreeditDoneCallback
+T} T{
+"preeditDoneCallback"
+T}
+T{
+#define
+T} T{
+.PN XNPreeditDrawCallback
+T} T{
+"preeditDrawCallback"
+T}
+T{
+#define
+T} T{
+.PN XNPreeditCaretCallback
+T} T{
+"preeditCaretCallback"
+T}
+T{
+#define
+T} T{
+.PN XNPreeditStateNotifyCallback
+T} T{
+"preeditStateNotifyCallback"
+T}
+T{
+#define
+T} T{
+.PN XNPreeditAttributes
+T} T{
+"preeditAttributes"
+T}
+.TE
+.sp -1
+.TS
+lw(.5i) lw(2.75i) lw(2.5i).
+T{
+#define
+T} T{
+.PN XNStatusStartCallback
+T} T{
+"statusStartCallback"
+T}
+T{
+#define
+T} T{
+.PN XNStatusDoneCallback
+T} T{
+"statusDoneCallback"
+T}
+T{
+#define
+T} T{
+.PN XNStatusDrawCallback
+T} T{
+"statusDrawCallback"
+T}
+T{
+#define
+T} T{
+.PN XNStatusAttributes
+T} T{
+"statusAttributes"
+T}
+T{
+#define
+T} T{
+.PN XNArea
+T} T{
+"area"
+T}
+T{
+#define
+T} T{
+.PN XNAreaNeeded
+T} T{
+"areaNeeded"
+T}
+T{
+#define
+T} T{
+.PN XNSpotLocation
+T} T{
+"spotLocation"
+T}
+T{
+#define
+T} T{
+.PN XNColormap
+T} T{
+"colorMap"
+T}
+T{
+#define
+T} T{
+.PN XNStdColormap
+T} T{
+"stdColorMap"
+T}
+T{
+#define
+T} T{
+.PN XNForeground
+T} T{
+"foreground"
+T}
+T{
+#define
+T} T{
+.PN XNBackground
+T} T{
+"background"
+T}
+T{
+#define
+T} T{
+.PN XNBackgroundPixmap
+T} T{
+"backgroundPixmap"
+T}
+T{
+#define
+T} T{
+.PN XNFontSet
+T} T{
+"fontSet"
+T}
+T{
+#define
+T} T{
+.PN XNLineSpace
+T} T{
+"lineSpace"
+T}
+T{
+#define
+T} T{
+.PN XNCursor
+T} T{
+"cursor"
+T}
+.TE
+.sp -1
+.TS
+lw(.5i) lw(2.75i) lw(2.5i).
+T{
+#define
+T} T{
+.PN XNQueryIMValuesList
+T} T{
+"queryIMValuesList"
+T}
+T{
+#define
+T} T{
+.PN XNQueryICValuesList
+T} T{
+"queryICValuesList"
+T}
+T{
+#define
+T} T{
+.PN XNStringConversionCallback
+T} T{
+"stringConversionCallback"
+T}
+T{
+#define
+T} T{
+.PN XNStringConversion
+T} T{
+"stringConversion"
+T}
+T{
+#define
+T} T{
+.PN XNResetState
+T} T{
+"resetState"
+T}
+T{
+#define
+T} T{
+.PN XNHotKey
+T} T{
+"hotkey"
+T}
+T{
+#define
+T} T{
+.PN XNHotKeyState
+T} T{
+"hotkeyState"
+T}
+T{
+#define
+T} T{
+.PN XNPreeditState
+T} T{
+"preeditState"
+T}
+T{
+#define
+T} T{
+.PN XNVisiblePosition
+T} T{
+"visiblePosition"
+T}
+T{
+#define
+T} T{
+.PN XNR6PreeditCallbackBehavior
+T} T{
+"r6PreeditCallback"
+T}
+.TE
+.sp -1
+.IN "XNQueryIMValuesList" "" "@DEF@"
+.IN "XNQueryICValuesList" "" "@DEF@"
+.IN "XNStringConversionCallback" "" "@DEF@"
+.IN "XNStringConversion" "" "@DEF@"
+.IN "XNResetState" "" "@DEF@"
+.IN "XNHotKey" "" "@DEF@"
+.IN "XNHotKeyState" "" "@DEF@"
+.IN "XNPreeditState" "" "@DEF@"
+.IN "XNVisiblePosition" "" "@DEF@"
+.IN "XNR6PreeditCallbackBehavior" "" "@DEF@"
+.TS
+lw(.5i) lw(2.75i) lw(2.5i).
+T{
+#define
+T} T{
+.PN XNRequiredCharSet
+T} T{
+"requiredCharSet"
+T}
+T{
+#define
+T} T{
+.PN XNQueryOrientation
+T} T{
+"queryOrientation"
+T}
+T{
+#define
+T} T{
+.PN XNDirectionalDependentDrawing
+T} T{
+"directionalDependentDrawing"
+T}
+T{
+#define
+T} T{
+.PN XNContextualDrawing
+T} T{
+"contextualDrawing"
+T}
+T{
+#define
+T} T{
+.PN XNBaseFontName
+T} T{
+"baseFontName"
+T}
+T{
+#define
+T} T{
+.PN XNMissingCharSet
+T} T{
+"missingCharSet"
+T}
+T{
+#define
+T} T{
+.PN XNDefaultString
+T} T{
+"defaultString"
+T}
+T{
+#define
+T} T{
+.PN XNOrientation
+T} T{
+"orientation"
+T}
+T{
+#define
+T} T{
+.PN XNFontInfo
+T} T{
+"fontInfo"
+T}
+T{
+#define
+T} T{
+.PN XNOMAutomatic
+T} T{
+"omAutomatic"
+T}
+.TE
+.IN "XNRequiredCharSet" "" "@DEF@"
+.IN "XNQueryOrientation" "" "@DEF@"
+.IN "XNDirectionalDependentDrawing" "" "@DEF@"
+.IN "XNContextualDrawing" "" "@DEF@"
+.IN "XNBaseFontName" "" "@DEF@"
+.IN "XNMissingCharSet" "" "@DEF@"
+.IN "XNDefaultString" "" "@DEF@"
+.IN "XNOrientation" "" "@DEF@"
+.IN "XNFontInfo" "" "@DEF@"
+.IN "XNOMAutomatic" "" "@DEF@"
+.bp