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
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
|
<!-- ##### SECTION Title ##### -->
GtkUIManager
<!-- ##### SECTION Short_Description ##### -->
Constructing menus and toolbars from an XML description
<!-- ##### SECTION Long_Description ##### -->
<para>
A #GtkUIManager constructs a user interface (menus and toolbars) from
one or more UI definitions, which reference actions from one or more
action groups.
</para>
<refsect2 id="XML-UI"><title>UI Definitions</title>
<para>
The UI definitions are specified in an XML format which can be
roughly described by the following DTD.
</para>
<para>
Do not confuse the GtkUIManager UI Definitions described here with
the similarly named <link linkend="BUILDER-UI">GtkBuilder UI
Definitions</link>.
</para>
<para>
<programlisting><![CDATA[
<!ELEMENT ui (menubar|toolbar|popup|accelerator)* >
<!ELEMENT menubar (menuitem|separator|placeholder|menu)* >
<!ELEMENT menu (menuitem|separator|placeholder|menu)* >
<!ELEMENT popup (menuitem|separator|placeholder|menu)* >
<!ELEMENT toolbar (toolitem|separator|placeholder)* >
<!ELEMENT placeholder (menuitem|toolitem|separator|placeholder|menu)* >
<!ELEMENT menuitem EMPTY >
<!ELEMENT toolitem (menu?) >
<!ELEMENT separator EMPTY >
<!ELEMENT accelerator EMPTY >
<!ATTLIST menubar name #IMPLIED
action #IMPLIED >
<!ATTLIST toolbar name #IMPLIED
action #IMPLIED >
<!ATTLIST popup name #IMPLIED
action #IMPLIED
accelerators (true|false) #IMPLIED >
<!ATTLIST placeholder name #IMPLIED
action #IMPLIED >
<!ATTLIST separator name #IMPLIED
action #IMPLIED
expand (true|false) #IMPLIED >
<!ATTLIST menu name #IMPLIED
action #REQUIRED
position (top|bot) #IMPLIED >
<!ATTLIST menuitem name #IMPLIED
action #REQUIRED
position (top|bot) #IMPLIED
always-show-image (true|false) #IMPLIED >
<!ATTLIST toolitem name #IMPLIED
action #REQUIRED
position (top|bot) #IMPLIED >
<!ATTLIST accelerator name #IMPLIED
action #REQUIRED >
]]></programlisting>
There are some additional restrictions beyond those specified in the
DTD, e.g. every toolitem must have a toolbar in its anchestry and
every menuitem must have a menubar or popup in its anchestry. Since
a #GMarkup parser is used to parse the UI description, it must not only
be valid XML, but valid #GMarkup.
</para>
<para>
If a name is not specified, it defaults to the action. If an action is
not specified either, the element name is used. The name and action
attributes must not contain '/' characters after parsing (since that
would mess up path lookup) and must be usable as XML attributes when
enclosed in doublequotes, thus they must not '"' characters or references
to the &quot; entity.
</para>
<example>
<title>A UI definition</title>
<programlisting>
<ui>
<menubar>
<menu name="FileMenu" action="FileMenuAction">
<menuitem name="New" action="New2Action" />
<placeholder name="FileMenuAdditions" />
</menu>
<menu name="JustifyMenu" action="JustifyMenuAction">
<menuitem name="Left" action="justify-left"/>
<menuitem name="Centre" action="justify-center"/>
<menuitem name="Right" action="justify-right"/>
<menuitem name="Fill" action="justify-fill"/>
</menu>
</menubar>
<toolbar action="toolbar1">
<placeholder name="JustifyToolItems">
<separator/>
<toolitem name="Left" action="justify-left"/>
<toolitem name="Centre" action="justify-center"/>
<toolitem name="Right" action="justify-right"/>
<toolitem name="Fill" action="justify-fill"/>
<separator/>
</placeholder>
</toolbar>
</ui>
</programlisting>
</example>
<para>
The constructed widget hierarchy is very similar to the element tree
of the XML, with the exception that placeholders are merged into their
parents. The correspondence of XML elements to widgets should be
almost obvious:
<variablelist>
<varlistentry><term>menubar</term>
<listitem><para>a #GtkMenuBar</para></listitem>
</varlistentry>
<varlistentry><term>toolbar</term>
<listitem><para>a #GtkToolbar</para></listitem>
</varlistentry>
<varlistentry><term>popup</term>
<listitem><para>a toplevel #GtkMenu</para></listitem>
</varlistentry>
<varlistentry><term>menu</term>
<listitem><para>a #GtkMenu attached to a menuitem</para></listitem>
</varlistentry>
<varlistentry><term>menuitem</term>
<listitem><para>a #GtkMenuItem subclass, the exact type depends on the
action</para></listitem>
</varlistentry>
<varlistentry><term>toolitem</term>
<listitem><para>a #GtkToolItem subclass, the exact type depends on the
action. Note that toolitem elements may contain a menu element, but only
if their associated action specifies a #GtkMenuToolButton as proxy.</para></listitem>
</varlistentry>
<varlistentry><term>separator</term>
<listitem><para>a #GtkSeparatorMenuItem or
#GtkSeparatorToolItem</para></listitem>
</varlistentry>
<varlistentry><term>accelerator</term>
<listitem><para>a keyboard accelerator</para></listitem>
</varlistentry>
</variablelist>
</para>
<para>
The "position" attribute determines where a constructed widget is positioned
wrt. to its siblings in the partially constructed tree. If it is
"top", the widget is prepended, otherwise it is appended.
</para>
</refsect2>
<refsect2 id="UI-Merging">
<title>UI Merging</title>
<para>
The most remarkable feature of #GtkUIManager is that it can overlay a set
of menuitems and toolitems over another one, and demerge them later.
</para>
<para>
Merging is done based on the names of the XML elements. Each element is
identified by a path which consists of the names of its anchestors, separated
by slashes. For example, the menuitem named "Left" in the example above
has the path <literal>/ui/menubar/JustifyMenu/Left</literal> and the
toolitem with the same name has path
<literal>/ui/toolbar1/JustifyToolItems/Left</literal>.
</para>
</refsect2>
<refsect2>
<title>Accelerators</title>
<para>
Every action has an accelerator path. Accelerators are installed together with
menuitem proxies, but they can also be explicitly added with <accelerator>
elements in the UI definition. This makes it possible to have accelerators for
actions even if they have no visible proxies.
</para>
</refsect2>
<refsect2 id="Smart-Separators">
<title>Smart Separators</title>
<para>
The separators created by #GtkUIManager are "smart", i.e. they do not show up
in the UI unless they end up between two visible menu or tool items. Separators
which are located at the very beginning or end of the menu or toolbar
containing them, or multiple separators next to each other, are hidden. This
is a useful feature, since the merging of UI elements from multiple sources
can make it hard or impossible to determine in advance whether a separator
will end up in such an unfortunate position.
</para>
<para>
For separators in toolbars, you can set <literal>expand="true"</literal> to
turn them from a small, visible separator to an expanding, invisible one.
Toolitems following an expanding separator are effectively right-aligned.
</para>
</refsect2>
<refsect2>
<title>Empty Menus</title>
<para>
Submenus pose similar problems to separators inconnection with merging. It is
impossible to know in advance whether they will end up empty after merging.
#GtkUIManager offers two ways to treat empty submenus:
<itemizedlist>
<listitem><para>make them disappear by hiding the menu item they're attached to
</para></listitem>
<listitem><para>add an insensitive "Empty" item
</para></listitem>
</itemizedlist>
The behaviour is chosen based on the "hide_if_empty" property of the action
to which the submenu is associated.
</para>
</refsect2>
<refsect2 id="GtkUIManager-BUILDER-UI">
<title>GtkUIManager as GtkBuildable</title>
<para>
The GtkUIManager implementation of the GtkBuildable interface accepts
GtkActionGroup objects as <child> elements in UI definitions.
</para>
<para>
A GtkUIManager UI definition as described above can be embedded in
an GtkUIManager <object> element in a GtkBuilder UI definition.
</para>
<para>
The widgets that are constructed by a GtkUIManager can be embedded in
other parts of the constructed user interface with the help of the
"constructor" attribute. See the example below.
</para>
<example>
<title>An embedded GtkUIManager UI definition</title>
<programlisting><![CDATA[
<object class="GtkUIManager" id="uiman">
<child>
<object class="GtkActionGroup" id="actiongroup">
<child>
<object class="GtkAction" id="file">
<property name="label">_File</property>
</object>
</child>
</object>
</child>
<ui>
<menubar name="menubar1">
<menu action="file">
</menu>
</menubar>
</ui>
</object>
<object class="GtkWindow" id="main-window">
<child>
<object class="GtkMenuBar" id="menubar1" constructor="uiman"/>
</child>
</object>
]]></programlisting>
</example>
</refsect2>
<!-- ##### SECTION See_Also ##### -->
<para>
#GtkBuilder
</para>
<!-- ##### SECTION Stability_Level ##### -->
<!-- ##### SECTION Image ##### -->
<!-- ##### STRUCT GtkUIManager ##### -->
<para>
The <structname>GtkUIManager</structname> struct contains only private
members and should not be accessed directly.
</para>
<!-- ##### SIGNAL GtkUIManager::actions-changed ##### -->
<para>
</para>
@uimanager: the object which received the signal.
<!-- ##### SIGNAL GtkUIManager::add-widget ##### -->
<para>
</para>
@uimanager: the object which received the signal.
@widget:
<!-- ##### SIGNAL GtkUIManager::connect-proxy ##### -->
<para>
</para>
@uimanager: the object which received the signal.
@arg1:
@widget:
<!-- ##### SIGNAL GtkUIManager::disconnect-proxy ##### -->
<para>
</para>
@uimanager: the object which received the signal.
@arg1:
@widget:
<!-- ##### SIGNAL GtkUIManager::post-activate ##### -->
<para>
</para>
@uimanager: the object which received the signal.
@arg1:
<!-- ##### SIGNAL GtkUIManager::pre-activate ##### -->
<para>
</para>
@uimanager: the object which received the signal.
@arg1:
<!-- ##### ARG GtkUIManager:add-tearoffs ##### -->
<para>
</para>
<!-- ##### ARG GtkUIManager:ui ##### -->
<para>
</para>
<!-- ##### FUNCTION gtk_ui_manager_new ##### -->
<para>
</para>
@void:
@Returns:
<!-- ##### FUNCTION gtk_ui_manager_set_add_tearoffs ##### -->
<para>
</para>
@manager:
@add_tearoffs:
<!-- ##### FUNCTION gtk_ui_manager_get_add_tearoffs ##### -->
<para>
</para>
@manager:
@Returns:
<!-- ##### FUNCTION gtk_ui_manager_insert_action_group ##### -->
<para>
</para>
@manager:
@action_group:
@pos:
<!-- ##### FUNCTION gtk_ui_manager_remove_action_group ##### -->
<para>
</para>
@manager:
@action_group:
<!-- ##### FUNCTION gtk_ui_manager_get_action_groups ##### -->
<para>
</para>
@manager:
@Returns:
<!-- ##### FUNCTION gtk_ui_manager_get_accel_group ##### -->
<para>
</para>
@manager:
@Returns:
<!-- ##### FUNCTION gtk_ui_manager_get_widget ##### -->
<para>
</para>
@manager:
@path:
@Returns:
<!-- ##### FUNCTION gtk_ui_manager_get_toplevels ##### -->
<para>
</para>
@manager:
@types:
@Returns:
<!-- ##### FUNCTION gtk_ui_manager_get_action ##### -->
<para>
</para>
@manager:
@path:
@Returns:
<!-- ##### FUNCTION gtk_ui_manager_add_ui_from_string ##### -->
<para>
</para>
@manager:
@buffer:
@length:
@error:
@Returns:
<!-- ##### FUNCTION gtk_ui_manager_add_ui_from_file ##### -->
<para>
</para>
@manager:
@filename:
@error:
@Returns:
<!-- ##### FUNCTION gtk_ui_manager_new_merge_id ##### -->
<para>
</para>
@manager:
@Returns:
<!-- ##### ENUM GtkUIManagerItemType ##### -->
<para>
These enumeration values are used by gtk_ui_manager_add_ui() to determine
what UI element to create.
</para>
@GTK_UI_MANAGER_AUTO: Pick the type of the UI element according to context.
@GTK_UI_MANAGER_MENUBAR: Create a menubar.
@GTK_UI_MANAGER_MENU: Create a menu.
@GTK_UI_MANAGER_TOOLBAR: Create a toolbar.
@GTK_UI_MANAGER_PLACEHOLDER: Insert a placeholder.
@GTK_UI_MANAGER_POPUP: Create a popup menu.
@GTK_UI_MANAGER_MENUITEM: Create a menuitem.
@GTK_UI_MANAGER_TOOLITEM: Create a toolitem.
@GTK_UI_MANAGER_SEPARATOR: Create a separator.
@GTK_UI_MANAGER_ACCELERATOR: Install an accelerator.
@GTK_UI_MANAGER_POPUP_WITH_ACCELS: Same as %GTK_UI_MANAGER_POPUP, but the actions' accelerators are shown.
<!-- ##### FUNCTION gtk_ui_manager_add_ui ##### -->
<para>
</para>
@manager:
@merge_id:
@path:
@name:
@action:
@type:
@top:
<!-- ##### FUNCTION gtk_ui_manager_remove_ui ##### -->
<para>
</para>
@manager:
@merge_id:
<!-- ##### FUNCTION gtk_ui_manager_get_ui ##### -->
<para>
</para>
@manager:
@Returns:
<!-- ##### FUNCTION gtk_ui_manager_ensure_update ##### -->
<para>
</para>
@manager:
|