em-ruby-dbus 0.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/COPYING +504 -0
- data/NEWS +253 -0
- data/README.md +93 -0
- data/Rakefile +58 -0
- data/VERSION +1 -0
- data/doc/Reference.md +207 -0
- data/doc/Tutorial.md +480 -0
- data/doc/ex-calling-methods.body.rb +8 -0
- data/doc/ex-calling-methods.rb +3 -0
- data/doc/ex-properties.body.rb +9 -0
- data/doc/ex-properties.rb +3 -0
- data/doc/ex-setup.rb +7 -0
- data/doc/ex-signal.body.rb +20 -0
- data/doc/ex-signal.rb +3 -0
- data/doc/example-helper.rb +6 -0
- data/em-ruby-dbus.gemspec +20 -0
- data/examples/gdbus/gdbus +255 -0
- data/examples/gdbus/gdbus.glade +184 -0
- data/examples/gdbus/launch.sh +4 -0
- data/examples/no-introspect/nm-test.rb +21 -0
- data/examples/no-introspect/tracker-test.rb +16 -0
- data/examples/rhythmbox/playpause.rb +25 -0
- data/examples/service/call_service.rb +25 -0
- data/examples/service/service_newapi.rb +51 -0
- data/examples/simple/call_introspect.rb +34 -0
- data/examples/simple/properties.rb +19 -0
- data/examples/utils/listnames.rb +11 -0
- data/examples/utils/notify.rb +19 -0
- data/lib/dbus.rb +82 -0
- data/lib/dbus/auth.rb +269 -0
- data/lib/dbus/bus.rb +739 -0
- data/lib/dbus/core_ext/array/extract_options.rb +31 -0
- data/lib/dbus/core_ext/class/attribute.rb +129 -0
- data/lib/dbus/core_ext/kernel/singleton_class.rb +8 -0
- data/lib/dbus/core_ext/module/remove_method.rb +14 -0
- data/lib/dbus/error.rb +46 -0
- data/lib/dbus/export.rb +128 -0
- data/lib/dbus/introspect.rb +219 -0
- data/lib/dbus/logger.rb +31 -0
- data/lib/dbus/loop-em.rb +19 -0
- data/lib/dbus/marshall.rb +434 -0
- data/lib/dbus/matchrule.rb +101 -0
- data/lib/dbus/message.rb +276 -0
- data/lib/dbus/message_queue.rb +166 -0
- data/lib/dbus/proxy_object.rb +149 -0
- data/lib/dbus/proxy_object_factory.rb +41 -0
- data/lib/dbus/proxy_object_interface.rb +128 -0
- data/lib/dbus/type.rb +193 -0
- data/lib/dbus/xml.rb +161 -0
- data/test/async_spec.rb +47 -0
- data/test/binding_spec.rb +74 -0
- data/test/bus_and_xml_backend_spec.rb +39 -0
- data/test/bus_driver_spec.rb +20 -0
- data/test/bus_spec.rb +20 -0
- data/test/byte_array_spec.rb +38 -0
- data/test/err_msg_spec.rb +42 -0
- data/test/introspect_xml_parser_spec.rb +26 -0
- data/test/introspection_spec.rb +32 -0
- data/test/main_loop_spec.rb +82 -0
- data/test/property_spec.rb +53 -0
- data/test/server_robustness_spec.rb +66 -0
- data/test/server_spec.rb +53 -0
- data/test/service_newapi.rb +217 -0
- data/test/session_bus_spec_manual.rb +15 -0
- data/test/signal_spec.rb +90 -0
- data/test/spec_helper.rb +33 -0
- data/test/thread_safety_spec.rb +31 -0
- data/test/tools/dbus-launch-simple +35 -0
- data/test/tools/dbus-limited-session.conf +28 -0
- data/test/tools/test_env +13 -0
- data/test/tools/test_server +39 -0
- data/test/type_spec.rb +19 -0
- data/test/value_spec.rb +81 -0
- data/test/variant_spec.rb +66 -0
- metadata +145 -0
@@ -0,0 +1,9 @@
|
|
1
|
+
sysbus = DBus.system_bus
|
2
|
+
upower_s = sysbus['org.freedesktop.UPower']
|
3
|
+
upower_o = upower_s.object '/org/freedesktop/UPower'
|
4
|
+
upower_o.introspect
|
5
|
+
upower_i = upower_o['org.freedesktop.UPower']
|
6
|
+
|
7
|
+
on_battery = upower_i['OnBattery']
|
8
|
+
|
9
|
+
puts "Is the computer on battery now? #{on_battery}"
|
data/doc/ex-setup.rb
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
sysbus = DBus.system_bus
|
2
|
+
login_s = sysbus['org.freedesktop.login1'] # part of systemd
|
3
|
+
login_o = login_s.object '/org/freedesktop/login1'
|
4
|
+
login_o.introspect
|
5
|
+
login_o.default_iface = 'org.freedesktop.login1.Manager'
|
6
|
+
|
7
|
+
# to trigger this signal, login on the Linux console
|
8
|
+
login_o.on_signal("SessionNew") do |name, opath|
|
9
|
+
puts "New session: #{name}"
|
10
|
+
|
11
|
+
session_o = login_s.object(opath)
|
12
|
+
session_o.introspect
|
13
|
+
session_i = session_o['org.freedesktop.login1.Session']
|
14
|
+
uid, user_opath = session_i['User']
|
15
|
+
puts "Its UID: #{uid}"
|
16
|
+
end
|
17
|
+
|
18
|
+
main = DBus::Main.new
|
19
|
+
main << sysbus
|
20
|
+
main.run
|
data/doc/ex-signal.rb
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
# -*- ruby -*-
|
2
|
+
require "rubygems"
|
3
|
+
require "rake"
|
4
|
+
|
5
|
+
GEMSPEC = Gem::Specification.new do |s|
|
6
|
+
s.name = "em-ruby-dbus"
|
7
|
+
# s.rubyforge_project = nil
|
8
|
+
s.summary = "Ruby module for interaction with D-Bus (with EventMachine support)"
|
9
|
+
s.description = "Pure Ruby module for interaction with D-Bus IPC system"
|
10
|
+
s.version = File.read("VERSION").strip
|
11
|
+
s.license = "LGPL v2.1"
|
12
|
+
s.author = "Ruby DBus Team"
|
13
|
+
s.email = "ruby-dbus-devel@lists.luon.net"
|
14
|
+
s.homepage = "https://github.com/saepia/em-ruby-dbus"
|
15
|
+
s.files = FileList["{doc,examples,lib,test}/**/*", "COPYING", "NEWS", "Rakefile", "README.md", "em-ruby-dbus.gemspec", "VERSION"].to_a.sort
|
16
|
+
s.require_path = "lib"
|
17
|
+
s.required_ruby_version = ">= 1.9.3"
|
18
|
+
s.add_development_dependency("packaging_rake_tasks")
|
19
|
+
s.add_development_dependency("rspec")
|
20
|
+
end
|
@@ -0,0 +1,255 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# This is a quite complex example using internal lower level API.
|
4
|
+
# Not a good starting point, but might be usefull if you want to do tricky
|
5
|
+
# stuff.
|
6
|
+
# -- Arnaud
|
7
|
+
|
8
|
+
require 'dbus'
|
9
|
+
require 'libglade2'
|
10
|
+
|
11
|
+
$enable_system = false
|
12
|
+
|
13
|
+
class MethodCallWindow
|
14
|
+
def initialize(pwindow, intf, meth)
|
15
|
+
@intf, @meth = intf, meth
|
16
|
+
@entries = Array.new
|
17
|
+
@dialog = Gtk::Dialog.new(meth.name, pwindow,
|
18
|
+
Gtk::Dialog::MODAL | Gtk::Dialog::NO_SEPARATOR,
|
19
|
+
[Gtk::Stock::OK, Gtk::Dialog::RESPONSE_OK],
|
20
|
+
[Gtk::Stock::CANCEL, Gtk::Dialog::RESPONSE_CANCEL])
|
21
|
+
|
22
|
+
@meth.params.each do |param|
|
23
|
+
shbox = Gtk::HBox.new(true, 0)
|
24
|
+
label = Gtk::Label.new("#{param[0]} (#{param[1]})")
|
25
|
+
input = Gtk::Entry.new
|
26
|
+
@entries << input
|
27
|
+
shbox.pack_start(label, true, true, 0)
|
28
|
+
shbox.pack_start(input, true, true, 0)
|
29
|
+
@dialog.vbox.pack_start(shbox, true, true, 0)
|
30
|
+
@dialog.vbox.show_all
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def run
|
35
|
+
on_ok if @dialog.run == Gtk::Dialog::RESPONSE_OK
|
36
|
+
@dialog.destroy
|
37
|
+
end
|
38
|
+
|
39
|
+
def on_ok
|
40
|
+
bus = @intf.object.bus
|
41
|
+
m = DBus::Message.new(DBus::Message::METHOD_CALL)
|
42
|
+
m.path = @intf.object.path
|
43
|
+
m.interface = @intf.name
|
44
|
+
m.destination = @intf.object.destination
|
45
|
+
m.member = @meth.name
|
46
|
+
m.sender = bus.unique_name
|
47
|
+
@meth.params.each_with_index do |param, idx|
|
48
|
+
entry = @entries[idx]
|
49
|
+
data = nil
|
50
|
+
case param[1]
|
51
|
+
when "u", "i"
|
52
|
+
data = entry.text.to_i
|
53
|
+
when "s"
|
54
|
+
data = entry.text
|
55
|
+
when /^a/
|
56
|
+
begin
|
57
|
+
data = eval(entry.text)
|
58
|
+
rescue
|
59
|
+
puts "Incorrect data: #{data}"
|
60
|
+
end
|
61
|
+
end
|
62
|
+
m.add_param(param[1], data)
|
63
|
+
end
|
64
|
+
bus.on_return(m) do |retm|
|
65
|
+
if retm.is_a?(DBus::Error)
|
66
|
+
puts "Error: #{retm.inspect}"
|
67
|
+
else
|
68
|
+
puts "Method #{m.member} returns: #{retm.params.inspect}"
|
69
|
+
end
|
70
|
+
end
|
71
|
+
bus.send(m.marshall)
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
class DBusUI
|
76
|
+
def initialize
|
77
|
+
@glade = GladeXML.new("gdbus.glade") { |h| method(h) } # This block is like
|
78
|
+
# black magic :)
|
79
|
+
@sessiontreeview = @glade.get_widget("sessiontreeview")
|
80
|
+
setup_treeview_renderer(@sessiontreeview, 'D-Bus Objects')
|
81
|
+
@sessiontreeview.selection.signal_connect("changed") do |selection|
|
82
|
+
on_treeview_selection_changed(selection)
|
83
|
+
end
|
84
|
+
|
85
|
+
@systemtreeview = @glade.get_widget("systemtreeview")
|
86
|
+
setup_treeview_renderer(@systemtreeview, 'D-Bus Objects')
|
87
|
+
@systemtreeview.selection.signal_connect("changed") do |selection|
|
88
|
+
on_treeview_selection_changed(selection)
|
89
|
+
end
|
90
|
+
|
91
|
+
@methsigtreeview = @glade.get_widget("methsigtreeview")
|
92
|
+
# ierk
|
93
|
+
setup_methodview_renderer(@methsigtreeview)
|
94
|
+
|
95
|
+
@window = @glade.get_widget("window1")
|
96
|
+
@window.show_all
|
97
|
+
start_buses
|
98
|
+
end
|
99
|
+
|
100
|
+
def beautify_method(meth)
|
101
|
+
# Damn, this need to be rewritten :p
|
102
|
+
s = meth.name + "("
|
103
|
+
if meth.kind_of?(DBus::Method)
|
104
|
+
s += (meth.params.collect { |a| "in #{a[0]}:#{a[1]}" } +
|
105
|
+
meth.rets.collect { |a| "out #{a[0]}:#{a[1]}" }).join(", ")
|
106
|
+
elsif meth.kind_of?(DBus::Signal)
|
107
|
+
s += (meth.params.collect { |a| "in #{a[0]}:#{a[1]}" }).join(", ")
|
108
|
+
end
|
109
|
+
s += ")"
|
110
|
+
s
|
111
|
+
end
|
112
|
+
|
113
|
+
def on_treeview_selection_changed(selection)
|
114
|
+
selected = selection.selected
|
115
|
+
model = Gtk::ListStore.new(String, String, DBus::Method,
|
116
|
+
DBus::ProxyObjectInterface)
|
117
|
+
@methsigtreeview.model = model
|
118
|
+
if selected
|
119
|
+
if intf = selected[1]
|
120
|
+
intf.methods.keys.sort.each do |mi|
|
121
|
+
m = intf.methods[mi]
|
122
|
+
subiter = model.append
|
123
|
+
subiter[0] = beautify_method(m)
|
124
|
+
subiter[1] = "M"
|
125
|
+
subiter[2] = m
|
126
|
+
subiter[3] = intf
|
127
|
+
end
|
128
|
+
intf.signals.keys.sort.each do |mi|
|
129
|
+
m = intf.signals[mi]
|
130
|
+
subiter = model.append
|
131
|
+
subiter[0] = beautify_method(m)
|
132
|
+
subiter[1] = "S"
|
133
|
+
subiter[2] = m
|
134
|
+
subiter[3] = intf
|
135
|
+
end
|
136
|
+
end
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
140
|
+
def on_method_activated(view, path, column)
|
141
|
+
name = view.model.get_iter(path)[0]
|
142
|
+
puts "Clicked on: #{name.inspect}"
|
143
|
+
type = view.model.get_iter(path)[1]
|
144
|
+
intf = view.model.get_iter(path)[2]
|
145
|
+
if type == "M"
|
146
|
+
method = view.model.get_iter(path)[2]
|
147
|
+
intf = view.model.get_iter(path)[3]
|
148
|
+
MethodCallWindow.new(@window, intf, method).run
|
149
|
+
elsif type == "S"
|
150
|
+
signal = view.model.get_iter(path)[2]
|
151
|
+
intf = view.model.get_iter(path)[3]
|
152
|
+
mr = DBus::MatchRule.new.from_signal(intf, signal)
|
153
|
+
puts "*** Registering matchrule: #{mr.to_s} ***"
|
154
|
+
intf.object.bus.add_match(mr) do |sig|
|
155
|
+
puts "Got #{sig.member}(#{sig.params.join(',')})"
|
156
|
+
end
|
157
|
+
end
|
158
|
+
end
|
159
|
+
|
160
|
+
def on_sessiontreeview_row_activated(view, path, column)
|
161
|
+
name = view.model.get_iter(path)[0]
|
162
|
+
puts "Clicked on: #{name.inspect}"
|
163
|
+
intf = view.model.get_iter(path)[1]
|
164
|
+
end
|
165
|
+
|
166
|
+
def on_window_delete_event(window, event)
|
167
|
+
Gtk.main_quit
|
168
|
+
end
|
169
|
+
|
170
|
+
def setup_methodview_renderer(treeview)
|
171
|
+
renderer = Gtk::CellRendererText.new
|
172
|
+
col_offset = treeview.insert_column(-1, "T", renderer, 'text' => 1)
|
173
|
+
col_offset = treeview.insert_column(-1, "Name", renderer, 'text' => 0)
|
174
|
+
column = treeview.get_column(col_offset - 1)
|
175
|
+
column.clickable = true
|
176
|
+
end
|
177
|
+
|
178
|
+
def setup_treeview_renderer(treeview, str)
|
179
|
+
renderer = Gtk::CellRendererText.new
|
180
|
+
col_offset = treeview.insert_column(-1, str, renderer, 'text' => 0)
|
181
|
+
column = treeview.get_column(col_offset - 1)
|
182
|
+
column.clickable = true
|
183
|
+
end
|
184
|
+
|
185
|
+
def process_input(bus)
|
186
|
+
# THIS is the bad ass loop
|
187
|
+
# we should return to the glib main loop from time to time. Anyone with a
|
188
|
+
# proper way to handle it ?
|
189
|
+
bus.update_buffer
|
190
|
+
bus.messages.each do |msg|
|
191
|
+
bus.process(msg)
|
192
|
+
end
|
193
|
+
end
|
194
|
+
|
195
|
+
def start_buses
|
196
|
+
# call glibize to get dbus messages from the glib mainloop
|
197
|
+
DBus::SessionBus.instance.glibize
|
198
|
+
DBus::SystemBus.instance.glibize if $enable_system
|
199
|
+
|
200
|
+
DBus::SessionBus.instance.proxy.ListNames do |msg, names|
|
201
|
+
fill_treeview(DBus::SessionBus.instance, @sessiontreeview, names)
|
202
|
+
end
|
203
|
+
if $enable_system
|
204
|
+
DBus::SystemBus.instance.proxy.ListNames do |msg, names|
|
205
|
+
fill_treeview(DBus::SystemBus.instance, @systemtreeview, names)
|
206
|
+
end
|
207
|
+
end
|
208
|
+
end
|
209
|
+
|
210
|
+
def walk_node(model, iter, node)
|
211
|
+
node.each_pair do |key, val|
|
212
|
+
subiter = model.append(iter)
|
213
|
+
subiter[0] = key
|
214
|
+
walk_node(model, subiter, val)
|
215
|
+
end
|
216
|
+
unless node.object.nil?
|
217
|
+
node.object.interfaces.sort.each do |ifname|
|
218
|
+
subiter = model.append(iter)
|
219
|
+
subiter[0] = ifname
|
220
|
+
subiter[1] = node.object[ifname]
|
221
|
+
end
|
222
|
+
end
|
223
|
+
end
|
224
|
+
|
225
|
+
def introspect_services(model, bus)
|
226
|
+
el = @introspect_array.shift
|
227
|
+
if not el =~ /^:/
|
228
|
+
iter = model.append(nil)
|
229
|
+
iter[0] = el
|
230
|
+
puts "introspecting: #{el}"
|
231
|
+
begin
|
232
|
+
service = bus.service(el).introspect
|
233
|
+
walk_node(model, iter, service.root)
|
234
|
+
rescue Exception => e
|
235
|
+
puts "DBus Error:"
|
236
|
+
puts e.backtrace.join("\n")
|
237
|
+
end
|
238
|
+
end
|
239
|
+
|
240
|
+
not @introspect_array.empty?
|
241
|
+
end
|
242
|
+
|
243
|
+
def fill_treeview(bus, treeview, array)
|
244
|
+
model = Gtk::TreeStore.new(String, DBus::ProxyObjectInterface)
|
245
|
+
treeview.model = model
|
246
|
+
@introspect_array = array.sort
|
247
|
+
Gtk::idle_add { introspect_services(model, bus) }
|
248
|
+
end
|
249
|
+
|
250
|
+
def main
|
251
|
+
Gtk.main
|
252
|
+
end
|
253
|
+
end
|
254
|
+
|
255
|
+
DBusUI.new.main
|
@@ -0,0 +1,184 @@
|
|
1
|
+
<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*-->
|
2
|
+
<!DOCTYPE glade-interface SYSTEM "http://glade.gnome.org/glade-2.0.dtd">
|
3
|
+
|
4
|
+
<glade-interface>
|
5
|
+
|
6
|
+
<widget class="GtkWindow" id="window1">
|
7
|
+
<property name="visible">True</property>
|
8
|
+
<property name="title" translatable="yes">GD-Bus</property>
|
9
|
+
<property name="type">GTK_WINDOW_TOPLEVEL</property>
|
10
|
+
<property name="window_position">GTK_WIN_POS_NONE</property>
|
11
|
+
<property name="modal">False</property>
|
12
|
+
<property name="default_width">500</property>
|
13
|
+
<property name="default_height">400</property>
|
14
|
+
<property name="resizable">True</property>
|
15
|
+
<property name="destroy_with_parent">False</property>
|
16
|
+
<property name="decorated">True</property>
|
17
|
+
<property name="skip_taskbar_hint">False</property>
|
18
|
+
<property name="skip_pager_hint">False</property>
|
19
|
+
<property name="type_hint">GDK_WINDOW_TYPE_HINT_NORMAL</property>
|
20
|
+
<property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
|
21
|
+
<property name="focus_on_map">True</property>
|
22
|
+
<property name="urgency_hint">False</property>
|
23
|
+
<signal name="delete_event" handler="on_window_delete_event" last_modification_time="Sat, 17 Mar 2007 14:49:13 GMT"/>
|
24
|
+
|
25
|
+
<child>
|
26
|
+
<widget class="GtkHPaned" id="hpaned1">
|
27
|
+
<property name="visible">True</property>
|
28
|
+
<property name="can_focus">True</property>
|
29
|
+
|
30
|
+
<child>
|
31
|
+
<widget class="GtkNotebook" id="notebook1">
|
32
|
+
<property name="visible">True</property>
|
33
|
+
<property name="can_focus">True</property>
|
34
|
+
<property name="show_tabs">True</property>
|
35
|
+
<property name="show_border">True</property>
|
36
|
+
<property name="tab_pos">GTK_POS_TOP</property>
|
37
|
+
<property name="scrollable">False</property>
|
38
|
+
<property name="enable_popup">False</property>
|
39
|
+
|
40
|
+
<child>
|
41
|
+
<widget class="GtkScrolledWindow" id="scrolledwindow3">
|
42
|
+
<property name="visible">True</property>
|
43
|
+
<property name="can_focus">True</property>
|
44
|
+
<property name="hscrollbar_policy">GTK_POLICY_ALWAYS</property>
|
45
|
+
<property name="vscrollbar_policy">GTK_POLICY_ALWAYS</property>
|
46
|
+
<property name="shadow_type">GTK_SHADOW_IN</property>
|
47
|
+
<property name="window_placement">GTK_CORNER_TOP_LEFT</property>
|
48
|
+
|
49
|
+
<child>
|
50
|
+
<widget class="GtkTreeView" id="sessiontreeview">
|
51
|
+
<property name="visible">True</property>
|
52
|
+
<property name="can_focus">True</property>
|
53
|
+
<property name="headers_visible">True</property>
|
54
|
+
<property name="rules_hint">False</property>
|
55
|
+
<property name="reorderable">False</property>
|
56
|
+
<property name="enable_search">True</property>
|
57
|
+
<property name="fixed_height_mode">False</property>
|
58
|
+
<property name="hover_selection">False</property>
|
59
|
+
<property name="hover_expand">False</property>
|
60
|
+
<signal name="row_activated" handler="on_sessiontreeview_row_activated" last_modification_time="Sat, 17 Mar 2007 10:17:11 GMT"/>
|
61
|
+
</widget>
|
62
|
+
</child>
|
63
|
+
</widget>
|
64
|
+
<packing>
|
65
|
+
<property name="tab_expand">False</property>
|
66
|
+
<property name="tab_fill">True</property>
|
67
|
+
</packing>
|
68
|
+
</child>
|
69
|
+
|
70
|
+
<child>
|
71
|
+
<widget class="GtkLabel" id="label1">
|
72
|
+
<property name="visible">True</property>
|
73
|
+
<property name="label" translatable="yes">Session</property>
|
74
|
+
<property name="use_underline">False</property>
|
75
|
+
<property name="use_markup">False</property>
|
76
|
+
<property name="justify">GTK_JUSTIFY_LEFT</property>
|
77
|
+
<property name="wrap">False</property>
|
78
|
+
<property name="selectable">False</property>
|
79
|
+
<property name="xalign">0.5</property>
|
80
|
+
<property name="yalign">0.5</property>
|
81
|
+
<property name="xpad">0</property>
|
82
|
+
<property name="ypad">0</property>
|
83
|
+
<property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
|
84
|
+
<property name="width_chars">-1</property>
|
85
|
+
<property name="single_line_mode">False</property>
|
86
|
+
<property name="angle">0</property>
|
87
|
+
</widget>
|
88
|
+
<packing>
|
89
|
+
<property name="type">tab</property>
|
90
|
+
</packing>
|
91
|
+
</child>
|
92
|
+
|
93
|
+
<child>
|
94
|
+
<widget class="GtkScrolledWindow" id="scrolledwindow5">
|
95
|
+
<property name="visible">True</property>
|
96
|
+
<property name="can_focus">True</property>
|
97
|
+
<property name="hscrollbar_policy">GTK_POLICY_ALWAYS</property>
|
98
|
+
<property name="vscrollbar_policy">GTK_POLICY_ALWAYS</property>
|
99
|
+
<property name="shadow_type">GTK_SHADOW_IN</property>
|
100
|
+
<property name="window_placement">GTK_CORNER_TOP_LEFT</property>
|
101
|
+
|
102
|
+
<child>
|
103
|
+
<widget class="GtkTreeView" id="systemtreeview">
|
104
|
+
<property name="visible">True</property>
|
105
|
+
<property name="can_focus">True</property>
|
106
|
+
<property name="headers_visible">True</property>
|
107
|
+
<property name="rules_hint">False</property>
|
108
|
+
<property name="reorderable">False</property>
|
109
|
+
<property name="enable_search">True</property>
|
110
|
+
<property name="fixed_height_mode">False</property>
|
111
|
+
<property name="hover_selection">False</property>
|
112
|
+
<property name="hover_expand">False</property>
|
113
|
+
</widget>
|
114
|
+
</child>
|
115
|
+
</widget>
|
116
|
+
<packing>
|
117
|
+
<property name="tab_expand">False</property>
|
118
|
+
<property name="tab_fill">True</property>
|
119
|
+
</packing>
|
120
|
+
</child>
|
121
|
+
|
122
|
+
<child>
|
123
|
+
<widget class="GtkLabel" id="label2">
|
124
|
+
<property name="visible">True</property>
|
125
|
+
<property name="label" translatable="yes">System</property>
|
126
|
+
<property name="use_underline">False</property>
|
127
|
+
<property name="use_markup">False</property>
|
128
|
+
<property name="justify">GTK_JUSTIFY_LEFT</property>
|
129
|
+
<property name="wrap">False</property>
|
130
|
+
<property name="selectable">False</property>
|
131
|
+
<property name="xalign">0.5</property>
|
132
|
+
<property name="yalign">0.5</property>
|
133
|
+
<property name="xpad">0</property>
|
134
|
+
<property name="ypad">0</property>
|
135
|
+
<property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
|
136
|
+
<property name="width_chars">-1</property>
|
137
|
+
<property name="single_line_mode">False</property>
|
138
|
+
<property name="angle">0</property>
|
139
|
+
</widget>
|
140
|
+
<packing>
|
141
|
+
<property name="type">tab</property>
|
142
|
+
</packing>
|
143
|
+
</child>
|
144
|
+
</widget>
|
145
|
+
<packing>
|
146
|
+
<property name="shrink">True</property>
|
147
|
+
<property name="resize">False</property>
|
148
|
+
</packing>
|
149
|
+
</child>
|
150
|
+
|
151
|
+
<child>
|
152
|
+
<widget class="GtkScrolledWindow" id="scrolledwindow4">
|
153
|
+
<property name="visible">True</property>
|
154
|
+
<property name="can_focus">True</property>
|
155
|
+
<property name="hscrollbar_policy">GTK_POLICY_ALWAYS</property>
|
156
|
+
<property name="vscrollbar_policy">GTK_POLICY_ALWAYS</property>
|
157
|
+
<property name="shadow_type">GTK_SHADOW_IN</property>
|
158
|
+
<property name="window_placement">GTK_CORNER_TOP_LEFT</property>
|
159
|
+
|
160
|
+
<child>
|
161
|
+
<widget class="GtkTreeView" id="methsigtreeview">
|
162
|
+
<property name="visible">True</property>
|
163
|
+
<property name="can_focus">True</property>
|
164
|
+
<property name="headers_visible">True</property>
|
165
|
+
<property name="rules_hint">False</property>
|
166
|
+
<property name="reorderable">False</property>
|
167
|
+
<property name="enable_search">True</property>
|
168
|
+
<property name="fixed_height_mode">False</property>
|
169
|
+
<property name="hover_selection">False</property>
|
170
|
+
<property name="hover_expand">False</property>
|
171
|
+
<signal name="row_activated" handler="on_method_activated" last_modification_time="Sat, 17 Mar 2007 14:49:13 GMT"/>
|
172
|
+
</widget>
|
173
|
+
</child>
|
174
|
+
</widget>
|
175
|
+
<packing>
|
176
|
+
<property name="shrink">True</property>
|
177
|
+
<property name="resize">False</property>
|
178
|
+
</packing>
|
179
|
+
</child>
|
180
|
+
</widget>
|
181
|
+
</child>
|
182
|
+
</widget>
|
183
|
+
|
184
|
+
</glade-interface>
|