|

楼主 |
发表于 2007-12-22 18:52:28
|
显示全部楼层
XIM Public Review Draft
3.3.7.1. Area
The value of the argument XNArea must be a pointer to a structure of type XRec-
tangle. The interpretation of argument XNArea is dependent on the input method
style set in the IC.
If the input method style is XIMPreEditPosition, XNArea specifies the clipping
region within which preediting will take place. If the focus window has been
set the coordinates are assumed to be relative to the focus window. If the
focus window has not been set the coordinates are assumed to be relative to the
client window. If neither has been set, the results are undefined. If XNArea
is not specified the input method will default the clipping region to the
geometry of the XNFocusWindow. If the area specified is NULL or invalid the
results are undefined.
If the input style is XIMPreEditArea or XIMStatusArea, XNArea specifies the
geometry provided by the client to the input method. The input method may use
this area to display its data, either PreEdit or Status depending on the area
designated. The input method may create a window as a child of the client win-
dow with dimensions that fit the XNArea. The coordinates are relative to the
client window. If the client window has not been set yet, the input method
should save these values and apply them when the client window is set. If
XNArea is not specified, is set to NULL or is invalid, the results are unde-
fined.
3.3.7.2. Area Needed
When set, argument XNAreaNeeded specifies the geometry suggested by the client
for this area (PreEdit or Status). The value associated with the argument must
be a pointer to a structure of type XRectangle. The x, y values are not used.
Non-zero values for width or height are constraints that the client wishes the
input method to respect.
When read, argument XNAreaNeeded specifies the preferred geometry desired by
the input method for the area.
This argument is only valid if the input style is XIMPreEditArea or XIMSta-
tusArea. It is used for geometry negotiation between the client and the input
method and has no other effect upon the input method (refer to Geometry Manage-
ment.)
3.3.7.3. Spot Location
Argument XNSpotLocation specifies to input method the coordinates of the
"spot", to be used by an input method executing with XNInputStyle set to
XIMPreEditPosition. When specified to any input method other than NeedPosition
this slot is ignored.
The x coordinate specifies the position where the next character would be
inserted. The y coordinate is the position of the baseline used by current
text line in the focus window. The x and y coordinates are relative to the
focus window if it has been set, else they are relative to the client window.
20
XIM Public Review Draft
If neither focus window nor client window has been set the results are unde-
fined.
The value of the argument is a pointer to a structure of type XPoint.
3.3.7.4. Colormap
Two arguments can be used to indicate what colormap the input method should use
to allocate colors: one as a colormap XID, the other as a standard colormap
name. Argument XNColormap is used to specify a colormap id. Argument value is
of type Colormap. This argument may generate a BadColormap error when the
colormap is used by the input method. Argument XNStdColormap is used to indi-
cate the name of the standard colormap in which input method should to allocate
colors. Argument value is an Atom that should be a valid atom for calling
XGetStandardColormap. This argument may generate BadAtom or BadColormap error
when it is used by the input method.
If colormap is left unspecified, it is defaulted to client window colormap.
3.3.7.5. Foreground and background.
Arguments XNForeground and XNBackground specifies respectively the foreground
and background pixel. Argument value is of type unsigned long. It must be a
valid pixel in the input method colormap. Error BadPixel is raised when this
argument is used by the input method if pixel is not a valid pixel for the
colormap in use by the input method.
If these values are left unspecified, the default is determined by the input
method.
3.3.7.6. Background pixmap.
Argument XNBackgroundPixmap specifies a background pixmap to be used as the
background of the window. Slot value must be of type Pixmap. Can generate
error BadPixmap when this argument is used by the input method.
If this value is left unspecified, the default is determined by the input
method.
3.3.7.7. FontSet
Argument XNFontSet specifies to input method what fontset is to be used. Argu-
ment value is of type XFontSet.
If this value is left unspecified, the default is determined by the input
method.
3.3.7.8. Line Spacing
Argument XNLineSpace specifies to input method what line spacing is to be used
in pre-edit window if more than one line is to be used. The slot value is of
type int.
21
XIM Public Review Draft
If this value is left unspecified, the default is determined by the input
method.
3.3.7.9. Cursor
Argument XNCursor specifies to input method what cursor is to be used in the
specified window. The slot value is of type Cursor.
If this value is left unspecified, the default is determined by the input
method.
3.3.7.10. PreEdit/Status Callbacks
A client that wishes to support the input style XIMPreEditCallbacks must pro-
vide a set of pre-edit callbacks to the input method. The set of pre-edit call-
backs are:
o XNPreEditStartCallback called when the input method starts pre-edit.
o XNPreEditDoneCallback called when the input method stops pre-edit.
o XNPreEditDrawCallback called when a number pre-edit keystrokes should be
echoed.
o XNPreEditCaretCallback called to move text insertion point within pre-edit
string
A client that wishes to support the input style XIMStatusCallbacks must provide
a set of status callbacks to the input method. The set of status callbacks are:
o XNStatusStartCallback called when the input method initializes status area.
o XNStatusDoneCallback called when the input method no longer needs status
area.
o XNStatusDrawCallback called when updating the status area is required.
The value of any status or pre-edit argument is a pointer to a structure of
type XIMCallback.
typedef struct {
XIMValue client_data;
XIMProc callback;
} XIMCallback;
Each callback has some particular semantics and will carry the data expressing
the environment necessary to the client into a specific data structure. This
paragraph only describes the arguments to be used to set the callback. For a
complete description of the semantics see section 4.
Setting any of these values while doing preedit may cause unexpected results.
22
XIM Public Review Draft
4. Callbacks semantics
Callbacks are functions defined by clients or text drawing packages, to be
called from the input method when selected events occur. Most clients will use
a text editing package, or a toolkit, and hence will not need to define such
callbacks. This section defines the callback semantics, when they are trig-
gered, and what their arguments are; it is mostly useful for toolkit implemen-
tors.
Callbacks are mostly provided so that clients (or text editing packages), can
implement on-the-spot pre-editing in their own window. In that case, the input
method needs to communicate and synchronize with the client. Input method
needs to communicate changes in the pre-edit window when it is under control of
the client. Those callbacks allow the client to initialize the pre-edit area,
display a new pre-edit string, move the text insertion point inside pre-edit,
terminate pre-edit, update the status area.
All callback functions follow the generic prototype:
void CallbackPrototype(ic, client_data, call_data)
XIC ic; specifies the originator of callback.
XIMValue client_data; specifies additional client data.
XCallbackStruct *callback_data; specifies specific callback data.
The callback_data is a structure expressing the arguments needed to achieve the
semantics: a specific data structure appropriate to the callback. In cases
where no data is needed in the callback, this callback_data is NULL. The
client_data argument is a closure, initially specified by the client when
specifying the callback and passed back. It may serve, for example, to inherit
application context in the callback.
The following paragraphs describe the semantics and specific data structure
associated with the different reasons.
4.1. Geometry Callback
The geometry callback is triggered by the input method to indicate that it
wants the client to negotiate geometry.
void GeometryCallback(ic, client_data, call_data)
XIC ic; specifies the originator of callback.
XIMValue client_data; client data.
void * call_data; specific callback data.
GeometryCallback is called with a NULL call_data argument.
4.2. PreEdit State Callbacks
When the input method turns input conversion on or off, PreEditStartCallback or
PreEditDoneCallback is triggered in order to let the toolkit do the setup or
the cleanup for the pre-edit region.
23
XIM Public Review Draft
int PreEditStartCallback(ic, client_data, call_data)
XIC ic; specifies the originator of callback.
XIMValue client_data; client data.
void * call_data; specific callback data.
When pre-edit starts on the specified ic, the callback is called, with a NULL
call_data argument. PreEditStartCallback will return the maximum size of the
pre-edit string. A positive number indicates the maximum number of bytes
allowed in the pre-edit string, a value of -1 indicates there is no limit.
void PreEditDoneCallback(ic, client_data, call_data)
XIC ic; specifies the originator of callback.
XIMValue client_data; client data.
void * call_data; specific callback data.
When pre-edit stops on the specified ic, the callback is called, with a NULL
call_data argument. The client can release the data allocated by PreEditStart-
Callback.
PreEditStartCallback should initialize appropriate data needed for displaying
pre-edit information and for handling further PreEditDrawCallback calls. Once
PreEditStartCallback is called, it shall not be called again before PreEdit-
DoneCallback has been called.
4.3. PreEditDraw Callback
This callback is triggered to draw and insert, delete or replace, pre-edit text
in the pre-edit region. The pre-edit text may include unconverted input text
such as Japanese kana, converted text such as Japanese Kanji characters, or
characters of both kinds. That string is either a multi-byte or wide-character
string, whose encoding matches the locale bound to the XIC. The callback proto-
type is as follows:
void PreEditDrawCallback(ic, client_data, call_data)
XIC ic; the originator of callback.
XIMValue client_data; client data.
XIMPreEditDrawCallbackStruct *call_data; callback data.
The callback is passed a XIMPreEditDrawCallbackStruct structure in the
call_data argument. The text member of this structure contains the text to be
drawn. After the string has been drawn, the caret should be moved to the
specified location.
typedef struct _XIMPreEditDrawCallbackStruct {
int caret; /* Cursor offset within pre-edit string */
int chg_first; /* Starting change position */
int chg_length; /* Length of the change in character count */
XIMText text;
} XIMPreEditDrawCallbackStruct ;
24
XIM Public Review Draft
The client must keep updating a buffer of the pre-edit text, the callback argu-
ments referring to indexes in that buffer. The call_data fields have specific
meanings according to the operation:
o To indicate text deletion, the call_data specifies a NULL text field. The
text to be deleted is then the current text in buffer from position
chg_first (starting at zero) on a (character) length of chg_length.
o When text is non-NULL it indicates insertion or replacement of text in the
buffer.
A positive chg_length indicates that the characters starting from chg_first
to ch_first+chg_length must be deleted, and replaced by text, whose length
is specified in the XIMText structure.
A chg_length value of 0 indicates that text must be inserted right at the
position specified by chg_first. A value of 0 for chg_first specifies the
first character in the buffer.
o caret: index in the the pre-edit text buffer specifying the character after
which the cursor should move after text has been drawn or deleted.
typedef struct _XIMText {
unsigned short length;
XIMFeedback * feedback;
Bool encoding_is_wchar;
union {
char * multi_byte;
wchar_t * wide_char;
} string;
} XIMText;
The text string passed is actually a structure specifying:
o length: the text length in characters.
o encoding_is_wchar: indicates if the string is passed encoded in wide charac-
ter or multi-byte.
o string: the text string.
o feedback: indicates rendering type.
The feedback field express the types of rendering feedback the callback should
apply when drawing text. Rendering of the text to be drawn is specified either
in generic ways (e.g. primary, secondary) or in specific ways (reverse, under-
line). When generic indications are given, the client is free to choose the
rendering style. It is necessary however that primary and secondary are mapped
to two distinct rendering styles.
The feedback field specifies how the rendering of the text argument should be
achieved. If feedback is NULL, then rendering is assumed to be the same as
rendering of other characters in the text entry. Otherwise, feedback specifies
25
XIM Public Review Draft
an array defining the rendering of each character of the string (hence the
length of the array is length).
If an IM wishes to indicate that it is only updating the feedback of the pre-
edit text without changing the content of it, XIMText should contain a NULL
value for the string field, the number of characters affected in the length
field and the feedback field should point to an array of XIMFeedback.
Each element in the array is a bit mask represented by a value of type XIMFeed-
back. The valid masks names are as follows.
typedef unsigned char XIMFeedback;
#define XIMReverse 1L
#define XIMUnderline (1L<<1)
#define XIMHighlight (1L<<2)
#define XIMPrimary (1L<<6)
#define XIMSecondary (1L<<7)
#define XIMTertiary (1L<<8)
4.4. PreEditCaretCallback
An input method may have its own "navigation keys" to allow the user to move
the text insertion point in the pre-edit area (e.g. move backward or forward).
Consequently, input method needs to indicate to the client that it should move
the text insertion point. It then calls the PreEditCaretCallback
void PreEditCaretCallback(ic, client_data, call_data)
XIC ic; the originator of callback.
XIMValue client_data; specifies additional client data.
XPreEditCaretCallbackStruct *call_data; specific callback data.
Input method will trigger PreEditCaretCallback to move the text insertion point
during pre-edit. The call_data argument contains a pointer to an XPreEditCaret-
Callback structure. This structure indicates where the caret should be moved.
The callback must move the insertion point to its new location and return, in
field position, the new offset value from initial position.
typedef struct _XIMPreEditCaretCallbackStruct {
int position; /* Caret offset within pre-edit string */
XIMCaretDirection direction; /* Caret moves direction */
XIMCaretStyle style; /* Feedback of the caret */
} XIMPreEditCaretCallbackStruct ;
typedef enum {
XIMInvisible, /* Disable caret feedback */
XIMPrimary, /* UI defined caret feedback */
XIMSecondary, /* UI defined caret feedback */
} XIMCaretStyle;
26
XIM Public Review Draft
typedef enum {
XIMForwardChar, XIMBackwardChar,
XIMForwardWord, XIMBackwardWord,
XIMCaretUp, XIMCaretDown,
XIMNextLine, XIMPreviousLine,
XIMLineStart, XIMLineEnd,
XIMAbsolutePosition,
XIMDontChange
} XIMCaretDirection;
The meaning of those values are:
o XIMForwardChar: Move caret forward one character position
o XIMBackwardChar: Move caret backward one character position
o XIMForwardWord: Move caret forward one word position
o XIMBackwardWord: Move caret backward one word position
o XIMCaretUp: Move caret up one line keeping current offset.
o XIMCaretDown: Move caret down one line keeping current offset.
o XIMPreviousLine: Move caret up one line.
o XIMNextLine: Move caret down one line
o XIMLineStart: Move caret to beginning of the current display line containing
the caret.
o XIMLineEnd: Move caret to end of the current display line containing the
caret.
o XIMAbsolutePosition: The callback must move to the location specified by the
position field of the callback data, indicated in characters, starting from
the beginning of the pre-edit text. Hence a value of zero means: move back
to beginning of the pre-edit text.
o XIMDontChange: The caret position does not change.
4.5. Status Callbacks
An input method may communicate changes in the status of an input context
(created, destroyed, or focus changes), with three status callbacks: Sta-
tusStartCallback , StatusDoneCallback , StatusDrawCallback
When the XIC is created or when the XIC gains focus, IM calls StatusStartCall-
back callback.
void StatusStartCallback(ic, client_data, call_data)
XIC ic; the originator of callback.
XIMValue client_data; specifies additional client data.
XIMValue call_data; specific callback data.
27
XIM Public Review Draft
The callback should initialize appropriate data for displaying status and be
prepared to further StatusDrawCallback calls. Once StatusStartCallback is
called, it shall not be called again before StatusDoneCallback has been called.
When an XIC is destroyed or when focus is lost by the XIC, IM calls StatusDone-
Callback.
void StatusDoneCallback(ic, client_data, call_data)
XIC ic; the originator of callback.
XIMValue client_data; specifies additional client data.
XIMValue call_data; specific callback data.
The callback may release any data allocated on StatusStart.
When an XIC status has to be updated, IM calls StatusDrawCallback.
void StatusDrawCallback(ic, client_data, call_data)
XIC ic; the originator of callback.
XIMValue client_data; specifies additional client data.
XIMValue call_data; specific callback data.
The callback should update the status area by either drawing a string, or imag-
ing a bitmap in the status area.
typedef enum {
TextType,
Bitmaptype,
} XIMStatusDataType;
typedef struct _XIMStatusDrawCallbackStruct {
XIMStatusDataType type;
union {
XIMText text;
Pixmap bitmap;
} data;
} XIMStatusDrawCallbackStruct ;
5. Filtering
Xlib provides the ability for an input method (or any other code) to register a
filter with Xlib. This filter is called by a client (or toolkit) by calling
XFilterEvent after calling XNextEvent. Any client that uses the XIM interface
should call XFilterEvent to allow input methods to process their events without
knowledge of the client's dispatching mechanism. A client's user interface
policy may determine the priority of event filters with respect to other event
handling mechanisms, (e.g. modal grabs).
A package that wants to do event filtering, e.g. an input method, must register
its filter with the filtering machinery. It can add or remove filters using
the two functions XRegisterFilter, XUnRegisterFilter There may be zero or more
filters for the same event. Clients may not know how many filters there are,
28
XIM Public Review Draft
if any, and what they do. They may only know if an event has been filtered on
return of XFilterEvent. Clients should discard filtered events.
Boolean XFilterEvent(evt, window)
XEvent * evt;
Window window; specifies the window for which this filter should be applied
XFilterEvent is called with an XEvent and a Window. Window specifies the win-
dow for which this filter should be applied. If window is NULL, the window
from evt is applied. Window is provided so that layers above Xlib that do
event redirection can indicate to which window an event has been redirected.
XFilterEvent searches its list of filters for a filter that matches the display
and event type from the event and window. When XFilterEvent finds a filter
that matches it will call that filter. If that filter returns True, XFil-
terEvent immediately returns True, without looking for more filters. If no
filters are found that filter the event, False is returned. Filters are called
in the order in which they were registered.
If a grab has occurred in the client, and the filter is returning True, the
client should ungrab the keyboard.
To register a filter, use XRegisterFilter
void XRegisterFilter(display, window, event_mask, filter, client_data)
Display * display; specifies the display for which this filter is being registered
Window window; specifies the window for which this filter is being registered
unsigned long event_mask; specifies the event mask for which to call the filter.
Boolean nonmaskable; specifies whether the filter should be called on the nonmaskable events
Boolean (*filter)(); specifies the filter to be called
XIMValue client_data; additional client data to be passed to the filter.
XRegisterFilter registers a filter with the filtering machinery. This filter
will be called on further calls to XFilterEvent for events generated on the
specified display and window, when the event matches the mask. If window is
NULL, the filter will match for any window value.
For each set of display, window, filter, client_data, exactly one filter will
be registered. If a filter is registered that matches a currently registered
filter, then the specified event_mask augments the existing mask. Clients who
want to filter nonmaskable events (GraphicsExpose, NoExpose, SelectionClear,
SelectionNotify, SelectionRequest, ClientMessage and MappingNotify) should set
nonmaskable to True.
XUnRegisterFilter(display, window, filter, client_data)
Display * display; specifies the display for which this filter is being removed.
Window window; specifies the window for which this filter is being removed.
Boolean (*filter)(); specifies the filter that is to be removed
XIMValue client_data; specifies client data registered
XUnRegisterFilter removes a filter registered with XRegisterFilter. If
29
XIM Public Review Draft
display, window, filter and client_data do not match a registered filter, no
filter is removed and no error is reported.
The filter prototype is as follows.
Boolean PrototypeFilter(display, window, evt, f_data)
Display * display; the display for which filter is being called.
Window window; the window for which filter is being called.
XEvent *evt; the triggering event
XIMValue client_data; client data previously registered
{
/* if event is filtered return True, else False */
}
A filter function should not remove events from the queue (e.g. call XNex-
tEvent). It should decide from context if the event is filtered or not.
6. Getting Composed Input
To get composed input from an input method, use XmbLookupString or XwcLookup-
String.
int XmbLookupString(ic, event, buffer_return, bytes_buffer, keysym_return, status_return)
XIC ic; specifies context for input processing.
XKeyPressedEvent *event; specifies key press event.
char *buffer_return; specifies multibyte string return buffer.
int bytes_buffer; specifies space available in return buffer.
KeySym *keysym_return; specifies Out: return keysym (if any).
Status *status_return; flag specifying what is returned.
int XwcLookupString(ic, event, buffer_return, bytes_buffer, keysym_return, status_return)
XIC ic; specifies context for input processing.
XKeyPressedEvent *event; specifies key press event.
wchar_t *buffer_return; specifies wide char return buffer.
int wchars_buffer; specifies space available in buffer.
KeySym *keysym_return; specifies returned keysym (if any).
Status *status_return; flag specifying what is returned.
These functions return the string from the input method in buffer_return. If
no string is returned buffer_return is unchanged.
The keysym into which the keycode from the event was mapped is returned in
keysym_return if keysym_return is non-NULL and status indicates that a KeySym
was returned. If both a string and a keysym are returned, the keysym value
does not necessarily correspond to the string returned.
XmbLookupString will return the length of the string in bytes. XwcLookupString
will return the length of the string in characters.
These functions also detect any rebound keysyms (see XRebindKeysym) and return
the specified bytes. since the last call.
30
XIM Public Review Draft
The ic argument specifies an input context identifier returned from the
XCreateIC() call. Unlike XLookupString, which returns only Latin-1 strings,
XmbLookupString and XwcLookupString return text in the codeset of the locale
bound to the input method of the specified input context.
Note that each string returned by Xmb/wcLookupString begins in the initial
state of the codeset of the locale (if the codeset of the locale is state-
dependent).
Caution: in order to insure proper input processing, it is essential that the
client pass only KeyPress events to X*LookupString. The behavior of
X*LookupString when the client passes a KeyRelease event is undefined.
Clients should check return_status before using the other returned values.
These two functions both return in return_status a value indicating what has
been returned in the other arguments:
o XBufferOverflow means that the input string to be returned is too large for
the supplied buffer_return. The required size (XmbLookupString in bytes,
XwcLookupString in characters) is returned as the value of the function, and
the contents of buffer_return and keysym_return are not modified. The
client should recall the function with the same event and a buffer of ade-
quate size in order to obtain the string.
o XLookupNone means that no consistent input has been composed so far. The
contents of buffer_return and keysym_return are not modified, and the func-
tion returns 0 as a value.
o XLookupChars means some input characters have been composed. They are
placed in buffer_return and the string length in octets is returned as the
value of the function. The string is encoded in the locale bound to the
input context. The contents of keysym_return is not modified.
o XLookupKeySym means a KeySym has been returned instead of a string. The
keysym is returned in keysym_return. The contents of buffer_return is not
modified, and the function returns 0 as a value.
o XLookupBoth means that both a KeySym and a string are returned, XKeySym and
XString occur simultaneously.
It does not make any difference if the input context passed as an argument to
X*LookupString is the XIC currently in possession of the focus or not. Input
may have been composed within an input context before it lost the focus and
that input may be returned on subsequent calls to X*LookupString even though it
does not have any more keyboard focus.
7. Conventions
The various input method architecture are transparent to the client. However,
clients should respect a number of conventions in order to work properly.
Clients must also be aware of possible effects of synchronization between input
method and library in the case of a remote input server.
31
XIM Public Review Draft
7.1. Client Conventions.
A well-behaved client (or toolkit) should first query the input method style.
If the client cannot satisfy the requirements of the supported styles (in terms
of geometry management or callbacks), it should negotiate with the user con-
tinuation of the program, or raise an exception or error of some sort.
Of course, clients using a toolkit including an on-the-spot text editing facil-
ity of some sort do not need to specify such callbacks.
7.2. Conventions for Input Method Synchronization
A KeyPress event with a keycode value of 0 shall be used exclusively as a sig-
nal that an input method has composed input which can be return by
X*LookupString. No other use shall be made of a Keypress event with keycode 0.
A front-end input method shall signal to clients that they have composed input
by sending a synthetic KeyPress event to the focus window of the corresponding
XIC, with a keycode value of 0.
A back-end input method may change the keycode value of a KeyPress event to
keycode 0 to indicate that there is data to be gathered from the filter.
When callback support is specified by client, input methods will not take
action unless they explicitly called back the client and obtained no response
(the callback is not specified, or returned invalid data).
8. Acknowledgments
This specification was generated after discussion on the mltalk mailing list,
in several meetings, and several proposals were made by different entities or
people. The contributors to the mltalk group have been:
Tim Anderson (Motorola), Alka Badshah (OSF), Gabe Beged-Dov (HP), Chih-Chung Ko
(III), Vera Cheng (III), Michael Collins (Digital Equipment Co.), Walt Daniels
(IBM), Noritoshi Demizu (OMRON), Keisuke Fukui (Fujitsu), Hitoshoi Fukumoto
(Nihon - Sun Microsystems), Tim Greenwood (Digital Equipment Co.), John Harvey
(IBM), Fred Horman (AT&T), Vania Joloboff (OSF), Norikazu Kaiya (Fujitsu), Yuji
Kamata (IBM), Yutaka Kataoka (OMRON), Ranee Khubchandani (Sun Microsystems),
Akari Kon (NEC), Hiroshi Kuribayashi (OMRON), Teruhiko Kurosaka (Sun Microsys-
tems), Seiji Kuwari (Omron), Sandra Martin (OSF), Bill McMahon (HP), Tom McFar-
land (HP), Masato Morisaki (NTT), Nelson Ng (Sun), Takashi Nishimura (NTT Amer-
ica), Makato Nishino (IBM), Akira Ohsone (Nihon Sun), Chris Peterson (MIT), Sam
Shteingart (AT&T), Manish Sheth (AT&T), Bob Scheifler (MIT), Muneyoshi Suzuki
(NTT), Cori Mehring (Digital Equipment Co.), Frank Rojas (IBM), Shoji Sugiyama
(IBM), Eiji Tosa (IBM) Glenn Widener (Tektronix).
32 |
|