[vte] vteapp: Add search
- From: Christian Persch <chpe src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [vte] vteapp: Add search
- Date: Tue, 22 Sep 2015 17:58:47 +0000 (UTC)
commit 2184b99ecd9cb5a9c84cbf0d3aa960855a92ae20
Author: Christian Persch <chpe gnome org>
Date: Tue Sep 22 19:58:32 2015 +0200
vteapp: Add search
And also port to using gtk templates.
src/Makefile.am | 2 +
src/app.gresource.xml | 1 +
src/app.ui | 178 +++++++++++++++++++----------------
src/app.vala | 156 ++++++++++++++++++++++++++++---
src/search-popover.ui | 249 +++++++++++++++++++++++++++++++++++++++++++++++++
5 files changed, 492 insertions(+), 94 deletions(-)
---
diff --git a/src/Makefile.am b/src/Makefile.am
index eba172a..27909df 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -271,6 +271,7 @@ nodist_vte_ VTE_API_MAJOR_VERSION@_ VTE_API_MINOR_VERSION@_SOURCES = \
$(NULL)
vte_ VTE_API_MAJOR_VERSION@_ VTE_API_MINOR_VERSION@_VALAFLAGS = \
+ --target-glib=2.38 \
--vapidir=. \
--girdir=. \
--pkg=posix \
@@ -309,6 +310,7 @@ CLEANFILES += \
EXTRA_DIST += \
app.gresource.xml \
app.ui \
+ search-popover.ui \
$(NULL)
appresources.c: app.gresource.xml Makefile $(shell $(GLIB_COMPILE_RESOURCES) --generate-dependencies
--sourcedir $(srcdir) $(srcdir)/app.gresource.xml)
diff --git a/src/app.gresource.xml b/src/app.gresource.xml
index 5c1d086..9095d32 100644
--- a/src/app.gresource.xml
+++ b/src/app.gresource.xml
@@ -18,5 +18,6 @@
<gresources>
<gresource prefix="/org/gnome/vte/test/app">
<file alias="ui/window.ui" compressed="true" preprocess="xml-stripblanks">app.ui</file>
+ <file alias="ui/search-popover.ui" compressed="true"
preprocess="xml-stripblanks">search-popover.ui</file>
</gresource>
</gresources>
diff --git a/src/app.ui b/src/app.ui
index f3cc4f8..c538df1 100644
--- a/src/app.ui
+++ b/src/app.ui
@@ -1,106 +1,124 @@
<?xml version="1.0" encoding="UTF-8"?>
-<!-- Generated with glade 3.16.0 on Fri Apr 18 10:59:58 2014 -->
+<!-- Generated with glade 3.19.0 -->
<interface>
- <!-- interface-requires gtk+ 3.10 -->
- <object class="GtkBox" id="main-box">
- <property name="visible">True</property>
+ <requires lib="gtk+" version="3.10"/>
+ <template class="TestWindow" parent="GtkApplicationWindow">
<property name="can_focus">False</property>
- <property name="orientation">vertical</property>
<child>
- <object class="GtkToolbar" id="toolbar">
+ <object class="GtkBox" id="main_box">
<property name="visible">True</property>
<property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
<child>
- <object class="GtkToolButton" id="copy-toolbutton">
+ <object class="GtkToolbar" id="toolbar">
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="tooltip_text" translatable="yes">Copy</property>
- <property name="action_name">win.copy</property>
- <property name="label" translatable="yes">Copy</property>
- <property name="icon_name">edit-copy</property>
+ <child>
+ <object class="GtkToolButton" id="copy_toolbutton">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="tooltip_text" translatable="yes">Copy</property>
+ <property name="action_name">win.copy</property>
+ <property name="label" translatable="yes">Copy</property>
+ <property name="icon_name">edit-copy-symbolic</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="paste_toolbutton">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="tooltip_text" translatable="yes">Paste</property>
+ <property name="action_name">win.paste</property>
+ <property name="label" translatable="yes">Paste</property>
+ <property name="icon_name">edit-paste-symbolic</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="reset_toolbutton">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="tooltip_text" translatable="yes">Reset (use Ctrl to reset and
clear)</property>
+ <property name="action_name">win.reset</property>
+ <property name="label" translatable="yes">Reset</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToggleToolButton" id="input_enabled_toolbutton">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="tooltip_text" translatable="yes">Toggle input enabled setting</property>
+ <property name="is_important">True</property>
+ <property name="action_name">win.input-enabled</property>
+ <property name="label" translatable="yes">Input</property>
+ <property name="icon_name">input-keyboard</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToggleToolButton" id="search_toolbutton">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Search</property>
+ <property name="use_underline">True</property>
+ <property name="icon_name">edit-find-symbolic</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
</object>
<packing>
<property name="expand">False</property>
- <property name="homogeneous">False</property>
- </packing>
- </child>
- <child>
- <object class="GtkToolButton" id="paste-toolbutton">
- <property name="visible">True</property>
- <property name="can_focus">False</property>
- <property name="tooltip_text" translatable="yes">Paste</property>
- <property name="action_name">win.paste</property>
- <property name="label" translatable="yes">Paste</property>
- <property name="icon_name">edit-paste</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="homogeneous">False</property>
- </packing>
- </child>
- <child>
- <object class="GtkToolButton" id="reset-toolbutton">
- <property name="visible">True</property>
- <property name="can_focus">False</property>
- <property name="tooltip_text" translatable="yes">Reset (use Ctrl to reset and clear)</property>
- <property name="action_name">win.reset</property>
- <property name="label" translatable="yes">Reset</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="homogeneous">False</property>
- </packing>
- </child>
- <child>
- <object class="GtkToggleToolButton" id="input-enabled-toolbutton">
- <property name="visible">True</property>
- <property name="can_focus">False</property>
- <property name="tooltip_text" translatable="yes">Toggle input enabled setting</property>
- <property name="is_important">True</property>
- <property name="action_name">win.input-enabled</property>
- <property name="label" translatable="yes">Input</property>
- <property name="icon_name">input-keyboard</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="homogeneous">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
</packing>
</child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkBox" id="terminal-box">
- <property name="visible">True</property>
- <property name="can_focus">False</property>
- <child>
- <placeholder/>
- </child>
<child>
- <object class="GtkScrollbar" id="scrollbar">
+ <object class="GtkBox" id="terminal_box">
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="orientation">vertical</property>
- <property name="restrict_to_fill_level">False</property>
- <property name="fill_level">0</property>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <object class="GtkScrollbar" id="scrollbar">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <property name="restrict_to_fill_level">False</property>
+ <property name="fill_level">0</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="pack_type">end</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
</object>
<packing>
- <property name="expand">False</property>
+ <property name="expand">True</property>
<property name="fill">True</property>
- <property name="pack_type">end</property>
<property name="position">1</property>
</packing>
</child>
</object>
- <packing>
- <property name="expand">True</property>
- <property name="fill">True</property>
- <property name="position">1</property>
- </packing>
</child>
- </object>
+ </template>
</interface>
diff --git a/src/app.vala b/src/app.vala
index e102e46..f329e90 100644
--- a/src/app.vala
+++ b/src/app.vala
@@ -19,12 +19,130 @@
namespace Test
{
+[GtkTemplate (ui = "/org/gnome/vte/test/app/ui/search-popover.ui")]
+class SearchPopover : Gtk.Popover
+{
+ public Vte.Terminal terminal { get; construct set; }
+
+ [GtkChild] private Gtk.SearchEntry search_entry;
+ [GtkChild] private Gtk.Button search_prev_button;
+ [GtkChild] private Gtk.Button search_next_button;
+ [GtkChild] private Gtk.Button close_button;
+ [GtkChild] private Gtk.ToggleButton match_case_checkbutton;
+ [GtkChild] private Gtk.ToggleButton entire_word_checkbutton;
+ [GtkChild] private Gtk.ToggleButton regex_checkbutton;
+ [GtkChild] private Gtk.ToggleButton wrap_around_checkbutton;
+ [GtkChild] private Gtk.Button reveal_button;
+ [GtkChild] private Gtk.Revealer revealer;
+
+ private GLib.RegexCompileFlags regex_flags = 0;
+ private GLib.Regex? regex = null;
+
+ public SearchPopover(Vte.Terminal term,
+ Gtk.Widget relative_to)
+ {
+ Object(relative_to: relative_to, terminal: term);
+
+ close_button.clicked.connect(() => { hide(); });
+ reveal_button.bind_property("active", revealer, "reveal-child");
+
+ search_entry.next_match.connect(() => { search(false); });
+ search_entry.previous_match.connect(() => { search(true); });
+ search_entry.search_changed.connect(() => { update_regex(); });
+
+ search_next_button.clicked.connect(() => { search(false); });
+ search_prev_button.clicked.connect(() => { search(true); });
+
+ match_case_checkbutton.toggled.connect(() => { update_regex(); });
+ entire_word_checkbutton.toggled.connect(() => { update_regex(); });
+ regex_checkbutton.toggled.connect(() => { update_regex(); });
+
+ wrap_around_checkbutton.toggled.connect(() => {
+ terminal.search_set_wrap_around(wrap_around_checkbutton.active);
+ });
+
+ update_sensitivity();
+ }
+
+ private void update_sensitivity()
+ {
+ bool can_search = regex != null;
+
+ search_prev_button.set_sensitive(can_search);
+ search_next_button.set_sensitive(can_search);
+ }
+
+ private void update_regex()
+ {
+ GLib.RegexCompileFlags flags;
+ string search_text;
+ string pattern;
+
+ search_text = search_entry.get_text();
+ flags = GLib.RegexCompileFlags.OPTIMIZE;
+
+ if (!match_case_checkbutton.active)
+ flags |= GLib.RegexCompileFlags.CASELESS;
+
+ if (regex_checkbutton.active) {
+ pattern = search_text;
+ flags |= GLib.RegexCompileFlags.MULTILINE;
+ } else {
+ pattern = GLib.Regex.escape_string(search_text);
+ }
+
+ if (entire_word_checkbutton.active)
+ pattern = "\\b" + pattern + "\\b";
+
+ if (regex != null &&
+ regex_flags == flags &&
+ pattern == regex.get_pattern())
+ return;
+
+ regex_flags = flags;
+ if (search_text.length != 0) {
+ try {
+ regex = new GLib.Regex(pattern, flags, 0);
+ } catch (Error e) {
+ regex = null;
+ }
+ } else {
+ regex = null;
+ }
+
+ terminal.search_set_gregex(regex, 0);
+ update_sensitivity();
+ }
+
+ private void search(bool backward)
+ {
+ if (regex == null)
+ return;
+
+ if (backward)
+ terminal.search_find_previous();
+ else
+ terminal.search_find_next();
+ }
+
+} /* class SearchPopover */
+
+[GtkTemplate (ui = "/org/gnome/vte/test/app/ui/window.ui")]
class Window : Gtk.ApplicationWindow
{
+ [GtkChild] private Gtk.Toolbar toolbar;
+ [GtkChild] private Gtk.Scrollbar scrollbar;
+ [GtkChild] private Gtk.Box terminal_box;
+ /* [GtkChild] private Gtk.ToolButton copy_toolbutton; */
+ /* [GtkChild] private Gtk.ToolButton paste_toolbutton; */
+ /* [GtkChild] private Gtk.ToolButton reset_toolbutton; */
+ /* [GtkChild] private Gtk.ToggleToolButton input_enabled_toolbutton; */
+ [GtkChild] private Gtk.ToggleToolButton search_toolbutton;
+
private Vte.Terminal terminal;
- private Gtk.Scrollbar scrollbar;
private Gtk.Clipboard clipboard;
private GLib.Pid child_pid;
+ private SearchPopover? search_popover;
private string[] builtin_dingus = {
"(((gopher|news|telnet|nntp|file|http|ftp|https)://)|(www|ftp)[-A-Za-z0-9]*\\.)[-A-Za-z0-9\\.]+(:[0-9]*)?",
@@ -35,7 +153,8 @@ class Window : Gtk.ApplicationWindow
{ "copy", action_copy_cb },
{ "copy-match", action_copy_match_cb, "s" },
{ "paste", action_paste_cb },
- { "reset", action_reset_cb }
+ { "reset", action_reset_cb },
+ { "find", action_find_cb }
};
public Window(App app)
@@ -64,20 +183,13 @@ class Window : Gtk.ApplicationWindow
app_paintable = true;
}
- var ui = new Gtk.Builder.from_resource("/org/gnome/vte/test/app/ui/window.ui");
- add(ui.get_object("main-box") as Gtk.Widget);
-
- var box = ui.get_object("terminal-box") as Gtk.Box;
-
- if (App.Options.no_toolbar) {
- var toolbar = ui.get_object("toolbar") as Gtk.Widget;
+ if (App.Options.no_toolbar)
toolbar.hide();
- }
- terminal = new Vte.Terminal();
+ search_toolbutton.toggled.connect(search_toolbutton_toggled_cb);
- /* Connect scrollbar */
- scrollbar = ui.get_object("scrollbar") as Gtk.Scrollbar;
+ /* Create terminal and connect scrollbar */
+ terminal = new Vte.Terminal();
scrollbar.set_adjustment(terminal.get_vadjustment());
/* Signals */
@@ -150,7 +262,7 @@ class Window : Gtk.ApplicationWindow
add_action(new GLib.PropertyAction ("input-enabled", terminal, "input-enabled"));
/* Done! */
- box.pack_start(terminal);
+ terminal_box.pack_start(terminal);
terminal.show();
update_paste_sensitivity();
@@ -359,6 +471,22 @@ class Window : Gtk.ApplicationWindow
terminal.reset(true, clear);
}
+ private void action_find_cb()
+ {
+ search_toolbutton.active = true;
+ }
+
+ private void search_toolbutton_toggled_cb()
+ {
+ if (search_toolbutton.active && search_popover == null) {
+ search_popover = new SearchPopover(terminal, search_toolbutton);
+ search_popover.closed.connect(() => { search_toolbutton.set_active(false); });
+ }
+
+ if (search_popover.visible != search_toolbutton.active)
+ search_popover.set_visible(search_toolbutton.active);
+ }
+
private bool button_press_event_cb(Gtk.Widget widget, Gdk.EventButton event)
{
if (event.button != 3)
diff --git a/src/search-popover.ui b/src/search-popover.ui
new file mode 100644
index 0000000..429e371
--- /dev/null
+++ b/src/search-popover.ui
@@ -0,0 +1,249 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.19.0 -->
+<interface>
+ <requires lib="gtk+" version="3.16"/>
+ <template class="TestSearchPopover" parent="GtkPopover">
+ <property name="can_focus">False</property>
+ <property name="transitions_enabled">False</property>
+ <child>
+ <object class="GtkBox" id="box1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_left">12</property>
+ <property name="margin_right">12</property>
+ <property name="margin_top">12</property>
+ <property name="margin_bottom">12</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="box2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">18</property>
+ <child>
+ <object class="GtkBox" id="box4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSearchEntry" id="search_entry">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="activates_default">True</property>
+ <property name="width_chars">30</property>
+ <property name="primary_icon_name">edit-find-symbolic</property>
+ <property name="primary_icon_activatable">False</property>
+ <property name="primary_icon_sensitive">False</property>
+ <property name="placeholder_text" translatable="yes">Search</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="search_prev_button">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="tooltip_text" translatable="yes">Search for previous
occurrence</property>
+ <property name="focus_on_click">False</property>
+ <child>
+ <object class="GtkImage" id="image2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="icon_name">go-up-symbolic</property>
+ <property name="use_fallback">True</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="search_next_button">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="can_default">True</property>
+ <property name="receives_default">True</property>
+ <property name="tooltip_text" translatable="yes">Search for next occurrence</property>
+ <property name="focus_on_click">False</property>
+ <child>
+ <object class="GtkImage" id="image3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="icon_name">go-down-symbolic</property>
+ <property name="use_fallback">True</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <style>
+ <class name="linked"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToggleButton" id="reveal_button">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="tooltip_text" translatable="yes">Toggle search options</property>
+ <property name="focus_on_click">False</property>
+ <child>
+ <object class="GtkImage" id="image1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="icon_name">view-context-menu-symbolic</property>
+ <property name="use_fallback">True</property>
+ </object>
+ </child>
+ <accessibility>
+ <relation type="controller-for" target="revealer"/>
+ </accessibility>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="close_button">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="focus_on_click">False</property>
+ <child>
+ <object class="GtkImage" id="image4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="icon_name">window-close-symbolic</property>
+ <property name="use_fallback">True</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkRevealer" id="revealer">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="transition_type">none</property>
+ <child>
+ <object class="GtkBox" id="box3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">18</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">6</property>
+ <child>
+ <object class="GtkCheckButton" id="match_case_checkbutton">
+ <property name="label" translatable="yes">_Match case</property>
+ <property name="use_action_appearance">False</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="xalign">0</property>
+ <property name="yalign">0.49000000953674316</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="entire_word_checkbutton">
+ <property name="label" translatable="yes">Match _entire word only</property>
+ <property name="use_action_appearance">False</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="xalign">0</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="regex_checkbutton">
+ <property name="label" translatable="yes">Match as _regular expression</property>
+ <property name="use_action_appearance">False</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="xalign">0</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="wrap_around_checkbutton">
+ <property name="label" translatable="yes">_Wrap around</property>
+ <property name="use_action_appearance">False</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="xalign">0</property>
+ <property name="active">True</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </template>
+</interface>
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]