em-ruby-dbus 0.11.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (76) hide show
  1. checksums.yaml +7 -0
  2. data/COPYING +504 -0
  3. data/NEWS +253 -0
  4. data/README.md +93 -0
  5. data/Rakefile +58 -0
  6. data/VERSION +1 -0
  7. data/doc/Reference.md +207 -0
  8. data/doc/Tutorial.md +480 -0
  9. data/doc/ex-calling-methods.body.rb +8 -0
  10. data/doc/ex-calling-methods.rb +3 -0
  11. data/doc/ex-properties.body.rb +9 -0
  12. data/doc/ex-properties.rb +3 -0
  13. data/doc/ex-setup.rb +7 -0
  14. data/doc/ex-signal.body.rb +20 -0
  15. data/doc/ex-signal.rb +3 -0
  16. data/doc/example-helper.rb +6 -0
  17. data/em-ruby-dbus.gemspec +20 -0
  18. data/examples/gdbus/gdbus +255 -0
  19. data/examples/gdbus/gdbus.glade +184 -0
  20. data/examples/gdbus/launch.sh +4 -0
  21. data/examples/no-introspect/nm-test.rb +21 -0
  22. data/examples/no-introspect/tracker-test.rb +16 -0
  23. data/examples/rhythmbox/playpause.rb +25 -0
  24. data/examples/service/call_service.rb +25 -0
  25. data/examples/service/service_newapi.rb +51 -0
  26. data/examples/simple/call_introspect.rb +34 -0
  27. data/examples/simple/properties.rb +19 -0
  28. data/examples/utils/listnames.rb +11 -0
  29. data/examples/utils/notify.rb +19 -0
  30. data/lib/dbus.rb +82 -0
  31. data/lib/dbus/auth.rb +269 -0
  32. data/lib/dbus/bus.rb +739 -0
  33. data/lib/dbus/core_ext/array/extract_options.rb +31 -0
  34. data/lib/dbus/core_ext/class/attribute.rb +129 -0
  35. data/lib/dbus/core_ext/kernel/singleton_class.rb +8 -0
  36. data/lib/dbus/core_ext/module/remove_method.rb +14 -0
  37. data/lib/dbus/error.rb +46 -0
  38. data/lib/dbus/export.rb +128 -0
  39. data/lib/dbus/introspect.rb +219 -0
  40. data/lib/dbus/logger.rb +31 -0
  41. data/lib/dbus/loop-em.rb +19 -0
  42. data/lib/dbus/marshall.rb +434 -0
  43. data/lib/dbus/matchrule.rb +101 -0
  44. data/lib/dbus/message.rb +276 -0
  45. data/lib/dbus/message_queue.rb +166 -0
  46. data/lib/dbus/proxy_object.rb +149 -0
  47. data/lib/dbus/proxy_object_factory.rb +41 -0
  48. data/lib/dbus/proxy_object_interface.rb +128 -0
  49. data/lib/dbus/type.rb +193 -0
  50. data/lib/dbus/xml.rb +161 -0
  51. data/test/async_spec.rb +47 -0
  52. data/test/binding_spec.rb +74 -0
  53. data/test/bus_and_xml_backend_spec.rb +39 -0
  54. data/test/bus_driver_spec.rb +20 -0
  55. data/test/bus_spec.rb +20 -0
  56. data/test/byte_array_spec.rb +38 -0
  57. data/test/err_msg_spec.rb +42 -0
  58. data/test/introspect_xml_parser_spec.rb +26 -0
  59. data/test/introspection_spec.rb +32 -0
  60. data/test/main_loop_spec.rb +82 -0
  61. data/test/property_spec.rb +53 -0
  62. data/test/server_robustness_spec.rb +66 -0
  63. data/test/server_spec.rb +53 -0
  64. data/test/service_newapi.rb +217 -0
  65. data/test/session_bus_spec_manual.rb +15 -0
  66. data/test/signal_spec.rb +90 -0
  67. data/test/spec_helper.rb +33 -0
  68. data/test/thread_safety_spec.rb +31 -0
  69. data/test/tools/dbus-launch-simple +35 -0
  70. data/test/tools/dbus-limited-session.conf +28 -0
  71. data/test/tools/test_env +13 -0
  72. data/test/tools/test_server +39 -0
  73. data/test/type_spec.rb +19 -0
  74. data/test/value_spec.rb +81 -0
  75. data/test/variant_spec.rb +66 -0
  76. metadata +145 -0
@@ -0,0 +1,8 @@
1
+ mybus = DBus.session_bus
2
+ service = mybus['org.freedesktop.ScreenSaver']
3
+ object = service.object '/ScreenSaver'
4
+ object.introspect
5
+ loop do
6
+ object.SimulateUserActivity
7
+ sleep 5 * 60
8
+ end
@@ -0,0 +1,3 @@
1
+ #! /usr/bin/env ruby
2
+ require 'example-helper.rb'
3
+ example 'ex-calling-methods.body.rb'
@@ -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}"
@@ -0,0 +1,3 @@
1
+ #! /usr/bin/env ruby
2
+ require 'example-helper.rb'
3
+ example 'ex-properties.body.rb'
data/doc/ex-setup.rb ADDED
@@ -0,0 +1,7 @@
1
+ #! /usr/bin/env ruby
2
+ require 'rubygems' # Not needed since Ruby 1.9
3
+ require 'dbus' # The gem is 'ruby-dbus' but the require is 'dbus'
4
+
5
+ # Connect to a well-known address. Most apps need only one of them.
6
+ mybus = DBus.session_bus
7
+ sysbus = DBus.system_bus
@@ -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,3 @@
1
+ #! /usr/bin/env ruby
2
+ require 'example-helper.rb'
3
+ example 'ex-signal.body.rb'
@@ -0,0 +1,6 @@
1
+ # Fin
2
+ $:.unshift File.expand_path("../../lib", __FILE__)
3
+ load 'ex-setup.rb'
4
+ def example(filename)
5
+ eval(File.read(filename), binding, filename, 1)
6
+ end
@@ -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>