-
Notifications
You must be signed in to change notification settings - Fork 0
/
HELPER-PROTOCOL
352 lines (239 loc) · 12.6 KB
/
HELPER-PROTOCOL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
To communicate between uim-related processes such as GUI applications and
toolbar applets, uim uses the helper system. This file describes the helper
protocol within uim.
* Network topology and message passing
The message based helper protocol participants form a peer-to-peer star
topology network connected via central uim-helper-server using UNIX domain
socket.
+-----------------+ ----- uim-toolbar-gtk
uim app1 ----- |uim-helper-server| ----- uim app2
uim app3 ----- +-----------------+ ----- uim configuration tool
Although uim-helper-server is named as 'server', it only means 'listen to
the connections'. The server is currently implemented as simple message
reflector, so the network always behaves as broadcasting.
msg +-----------------+ ----> uim-toolbar-gtk
uim app1 ----> |uim-helper-server| ----> uim app2
uim app3 <---- +-----------------+ ----> uim configuration tool
All participants receives the message from uim app1
Since the broadcasting behavior, the protocol does not have the
specification about 'response message'. Any messages are delivered to all
participants and implicitly done. The sender cannot know any receiver
information such as 'properly received' or 'how many participants are
accepted the message'.
Although the message layer does not specifies neither response message nor
unicast, higher layer virtually provides it. Some messages behave as
'request' and 'response to the request' in semantic view (of course the 2
messages are not related in message layer). See 'prop_list_get' and
'prop_list_update' as example.
In another situation, the helper system can simulate unicast message by
following way.
+-----------------+ ----> uim-toolbar-gtk
uim app1 <---- |uim-helper-server| ----> uim app2
uim app3 ----> +-----------------+ ----> uim configuration tool
focus_in
(1) uim app3 send focus_in message to declare that "I've activated"
prop_activate
+-----------------+ <---- uim-toolbar-gtk
uim app1 <---- |uim-helper-server| ----> uim app2
uim app3 <---- +-----------------+ ----> uim configuration tool
(2) uim-toolbar-gtk send prop_activate
prop_activate
+-----------------+ <---- uim-toolbar-gtk
uim app1 x---- |uim-helper-server| ----x uim app2
uim app3 <---- +-----------------+ ----x uim configuration tool
(3) inactive processes ignore the message
All messages in the protocol are defined as follows.
* Message format in (extended) BNF
The protocol data consist of human readable messages on an IPC
connection. Each messages are consist of arbitrary lines of text and
delimited from another message by "\n\n".
session = messages
messages = messages message | message
message = (focus_in |
focus_out |
prop_activate |
prop_list_get |
prop_list_update |
im_list |
im_list_get |
im_change_this_text_area_only |
im_change_whole_desktop |
im_change_this_application_only |
prop_update_custom |
custom_reload_notify |
commit_string |
im_switcher_start |
im_switcher_quit) "\n"
charset_specifier = "charset=" charset "\n"
charset = "UTF-8" | "EUC-JP" | "GB18030" |
<or any name that can be specified as iconv_open(3) argument>
str = str <any characters except for '\0', '\t' or '\n'> | ""
identifier = [_a-zA-Z][_a-zA-Z0-9]*
* Focus notification messages
- focus_in
This message declares that the sender has gotten a focus. This means that
the focused context of this process has become 'active context' and any
other contexts have become 'inactive context'. It implies that only active
context can respond to some messages prop_list_get, prop_label_get,
prop_activate, im_list_get and commit_string. Contexts in other processes
have to become inactive by receiving focus_in message from another
process.
Invoke uim_helper_client_focus_in() to send this message.
focus_in = "focus_in\n"
- focus_out
This message notifies that the sender has been lost a focus. This message
is currently not received by official uim suites.
Invoke uim_helper_client_focus_out() to send this message.
focus_out = "focus_out\n"
* Property messages
The concept 'property' in uim means 'properties of input method'. An input
method (in accurately, input context) can own arbitrary number of
properties. A property is ordinarily appeared for user as a popup menu
with an indicator. Such indicator will be appeared simultaneously for user
if the input method has 2 or more properties. One property controls one
variable state of the input method such as 'input mode' or 'keymap'.
action_id = identifier
- prop_activate
This message notifies that a command named as action_id has been
activated. This message is usually sent from toolbar applets in response
to an user selection and received by corresponding IM. Once received, the
prop-handler of current IM has been invoked with action_id. Several
IMs use action_id as 'input mode' such as 'hiragana', 'katakana',
'direct' and so on, and switches to activated input mode on receiving.
See also prop_list_update.
prop_activate = "prop_activate\n" action_id "\n"
- prop_list_get
This message requests a prop_list_update. The request sender will receive
prop_list_update in response to this message. This message is typically
used for active acquiring of prop_list by toolber applets at start up. If
this message has not been sent, the applet has to passively wait for
prop_list_update that will be notified by current IM to show correct
information.
Invoke uim_helper_client_get_prop_list() to send this message.
See also prop_list_update
prop_list_get = "prop_list_get\n"
- prop_list_update
This message notifies that a set of menu items typically for toolbar
applets. A message is consist of branches which contains arbitrary number
of leaves. A branch represents a property which is shown as (popup) menu
for user, and a leaf represents a menu item of the branch.
indication_id is an identifier that specifies visual appearance of the
item. The ID roughly considerable as "icon name", and so the message
receiver can use it to form filename for the corresponding icon
(e.g. "anthy" -> "/path/to/somewhere/32x32/anthy.png"). There is a special
ID. If the ID is "separator", message receivers should display the leaf as
toolkit-native separator. But it is not necessary since the "separator"
appears as dummy item with no action if the receiver is not aware of it.
iconic_label is a very short string typically 1 character to be used as
icon. For example, "a" means 'direct input'. This field should be
translated with gettext(3) or equivalent. See safe_gettext() of
toolbar-common-gtk.c.
label_string is a short string to be shown in the menu, or used as tooltip
of the button. This field should be translated with gettext(3) or
equivalent.
short_desc is a short description string usually used as tooltip of the
menu item. This field should be translated with gettext(3) or equivalent.
action_id is an identifier of the menu item. This will be
notified to other processes by prop_activate when this menu item has been
selected by user.
activity means that whether this menu item is selected. Only one menu item
per branch should be notified as "*" which means 'selected'.
Invoke im-update-prop-list to send this message.
See also prop_activate.
prop_list_update = "prop_list_update\n" charset_specifier parts
parts = parts part | part
part = branch leaves
branch = "branch\t" indication_id "\t" iconic_label "\t" label_string "\n"
leaves = leaves leaf | leaf
leaf = "leaf\t" indication_id "\t" iconic_label "\t"
label_string "\t" short_desc "\t" action_id "\t" activity "\n"
indication_id = identifier | "separator"
iconic_label = str
label_string = str
short_desc = str
activity = "*" | ""
* IM management messages
imname is an identifier name of the input method written in ASCII.
imname = str
- im_list
This message notifies that the set of currently available input methods.
imlang is an i18n-ized free format human readable string such as
"Japanese".
imshort_description is a short description of the input method. This
string is currently not i18n-ized (i.e. written in English).
selectedflag specifies which input method of all available one is
currently selected. At most one input method has the value "selected".
See also im_list_get
im_list = "im_list\n" charset_specifier iminfos
iminfos = iminfos iminfo | iminfo
iminfo = imname "\t" imlang "\t" imshort_description "\t" selectedflag"\n"
imlang = human_readable_language_name
imshort_description = str
selectedflag = "selected" | ""
human_readable_language_name = str
- im_list_get
This message requests a im_list. The request sender will receive im_list
from currently focused input context in response to this message. This
message is typically used for active acquiring of im_list by im-switcher
application (such as uim-im-switcher) at start up.
See also im_list, focus_in
im_list_get = "im_list_get\n"
- im_change_this_text_area_only
This message notifies that currently focused input context must be
switched its input method to specified imname. All receivers must properly
accept or discard this message in accordance with focus management.
See also focus_in
im_change_this_text_area_only = "im_change_this_text_area_only\n" imname "\n"
- im_change_this_application_only
This message notifies that all input context of the application that has
currently focused input context must be switched its input method to
specified imname. All receiver processes must properly accept or discard
this message in accordance with focus management.
See also focus_in
im_change_this_application_only = "im_change_this_application_only\n" imname "\n"
- im_change_whole_desktop
This message notifies that all input contexts in local machine must be
switched its input method to specified imname. All receiver processes must
accept this message and switch all input context of the process.
im_change_whole_desktop = "im_change_whole_desktop\n" imname "\n"
* Other messages
- prop_update_custom
Update a custom value of received process. The received message are
evaluated as (custom-set! custom_sym custom_value) and immediately affects
the running IMs. Both custom_sym and custom_value will be strictly
validated to prevent crashing or abuse. Invalid messages will be simply
ignored.
custom_sym and custom_value are delimited by "\n" instead of "\t" to allow
"\t" to be included in the value.
The command name 'prop_update_custom' is wrongly named by misunderstanding
about naming convention of the helper protocol. It should be renamed as
'custom_set'.
prop_update_custom = "prop_update_custom\n" custom_sym "\n" custom_value "\n"
custom_sym = /^[-\?a-zA-Z0-9]+$/
custom_value = <valid S-expression>
- custom_reload_notify
This is a notification message to reload configrations. If a process
receive this message, the process should reload configrations
somehow. This message maybe needless in the future.
custom_reload_notify = "custom_reload_notify\n"
- commit_string
This message commits a string to currently focused context. See also
focus_in.
commit_string = "commit_string\n" charset_specifier str_to_commit "\n"
str_to_commit = /^[^\n]+$/
- im_switcher_start
This message notifies that a new uim-im-switcher is started.
When an existing old uim-im-switcher receives im_switcher_start,
the existing uim-im-switcher must send im_switcher_quit
to quit newly started uim-im-switcher.
See also im_switcher_quit.
im_switcher_start = "im_switcher_start\n"
- im_switcher_quit
This message requests newly started uim-im-switcher to quit.
All uim-im-switcher must quit immediately after received this message.
See also im_switcher_start.
im_switcher_quit = "im_switcher_quit\n"
Local Variables:
mode: indented-text
fill-column: 78
End: