rsence 2.0.9.23 → 2.1.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.
Files changed (74) hide show
  1. data/INSTALL.rdoc +61 -49
  2. data/README.rdoc +20 -4
  3. data/VERSION +1 -1
  4. data/conf/default_conf.yaml +8 -0
  5. data/conf/rsence_command_strings.yaml +31 -20
  6. data/docs/ExampleGuiPlugin.rdoc +2 -2
  7. data/js/comm/comm.js +27 -5
  8. data/js/comm/transporter/transporter.js +1 -1
  9. data/js/comm/values/values.js +12 -5
  10. data/js/controls/button/button.js +12 -2
  11. data/js/controls/dialogs/alert_sheet/alert_sheet.js +13 -1
  12. data/js/controls/dialogs/confirm_sheet/confirm_sheet.js +13 -2
  13. data/js/controls/dialogs/sheet/sheet.js +35 -28
  14. data/js/controls/imageview/imageview.js +13 -13
  15. data/js/controls/progress/progressindicator/progressindicator.js +5 -5
  16. data/js/controls/sliders/slider/slider.js +4 -31
  17. data/js/controls/stepper/stepper.js +12 -19
  18. data/js/controls/textcontrol/textcontrol.js +0 -50
  19. data/js/controls/textcontrol/themes/default/textcontrol.html +1 -1
  20. data/js/controls/window/window.js +1 -1
  21. data/js/core/elem/elem.js +146 -160
  22. data/js/core/rsence_ns/rsence_ns.js +7 -0
  23. data/js/foundation/control/eventresponder/eventresponder.js +8 -7
  24. data/js/foundation/eventmanager/eventmanager.js +81 -48
  25. data/js/foundation/geom/rect/rect.js +1 -1
  26. data/js/foundation/json_renderer/json_renderer.js +4 -1
  27. data/js/foundation/system/system.js +37 -34
  28. data/js/foundation/view/morphanimation/morphanimation.js +53 -43
  29. data/js/foundation/view/view.js +119 -118
  30. data/js/lists/listitems/listitems.js +10 -10
  31. data/js/lists/propertylist/js.inc +0 -0
  32. data/js/lists/propertylist/propertylist.js +574 -0
  33. data/js/lists/propertylist/propertylisteditor/js.inc +0 -0
  34. data/js/lists/propertylist/propertylisteditor/propertylisteditor.js +233 -0
  35. data/js/lists/radiobuttonlist/radiobuttonlist.js +15 -8
  36. data/js/menus/minimenu/js.inc +0 -0
  37. data/js/menus/minimenu/minimenu.js +139 -0
  38. data/js/menus/minimenu/minimenuitem/js.inc +0 -0
  39. data/js/menus/minimenu/minimenuitem/minimenuitem.js +33 -0
  40. data/js/menus/minimenu/minimenuitem/themes/default/minimenuitem.css +45 -0
  41. data/js/menus/minimenu/minimenuitem/themes/default/minimenuitem.html +4 -0
  42. data/js/menus/minimenu/minimenuitem/themes/default/minimenuitem_checkmark.png +0 -0
  43. data/js/menus/minimenu/themes/default/minimenu.css +63 -0
  44. data/js/menus/minimenu/themes/default/minimenu.html +7 -0
  45. data/js/menus/minimenu/themes/default/minimenu.png +0 -0
  46. data/js/util/reloadapp/reloadapp.js +1 -1
  47. data/lib/conf/argv.rb +40 -11
  48. data/lib/daemon/daemon.rb +63 -22
  49. data/lib/plugins/gui_plugin.rb +28 -31
  50. data/lib/plugins/guiparser.rb +37 -7
  51. data/lib/plugins/plugin.rb +260 -28
  52. data/lib/plugins/plugin_base.rb +14 -0
  53. data/lib/plugins/plugin_plugins.rb +11 -1
  54. data/lib/plugins/pluginmanager.rb +127 -44
  55. data/lib/plugins/plugins.rb +10 -1
  56. data/lib/session/msg.rb +25 -1
  57. data/lib/session/sessionmanager.rb +11 -2
  58. data/lib/session/sessionstorage.rb +14 -14
  59. data/lib/transporter/transporter.rb +29 -13
  60. data/lib/values/hvalue.rb +30 -0
  61. data/plugins/client_pkg/info.yaml +2 -2
  62. data/plugins/{index_html → main}/img/loading.gif +0 -0
  63. data/plugins/{index_html → main}/img/riassence.gif +0 -0
  64. data/plugins/main/info.yaml +5 -4
  65. data/plugins/main/main.rb +180 -24
  66. data/plugins/{index_html → main}/tmpl/index.html +4 -2
  67. data/plugins/ticket/info.yaml +2 -2
  68. data/plugins/ticket/lib/upload.rb +57 -5
  69. data/plugins/ticket/ticket.rb +10 -4
  70. data/setup/welcome/info.yaml +2 -2
  71. data/setup/welcome/text/welcome.html +1 -1
  72. metadata +22 -11
  73. data/plugins/index_html/index_html.rb +0 -120
  74. data/plugins/index_html/info.yaml +0 -18
@@ -0,0 +1,45 @@
1
+
2
+ .minimenuitem_control,
3
+ .minimenuitem_label,
4
+ .minimenuitem_state {
5
+ position: absolute;
6
+ top: 0px; height: 15px;
7
+ }
8
+
9
+ .minimenuitem_control {
10
+ left: 0px; right: 0px;
11
+ cursor: pointer;
12
+ }
13
+ .minimenuitem_control:hover {
14
+ background-color: #fff;
15
+ }
16
+
17
+ .minimenuitem_state {
18
+ left: 0px; top: 1px; height: 12px; width: 12px;
19
+ background-image: #{this.getCssFilePath('minimenuitem_checkmark.png')};
20
+ }
21
+ .checked .minimenuitem_state {
22
+ visibility: inherit;
23
+ }
24
+ .unchecked .minimenuitem_state {
25
+ visibility: hidden;
26
+ }
27
+
28
+ .minimenuitem_label {
29
+ left: 14px; right: 11px; top: 0px;
30
+ height: 15px; line-height: 15px;
31
+ text-align: left;
32
+ text-overflow: ellipsis;
33
+ overflow: hidden;
34
+ white-space:nowrap;
35
+ vertical-align: middle;
36
+ font-family: Arial, sans-serif;
37
+ font-size: 11px;
38
+ color: #333;
39
+ }
40
+ .minimenuitem_label:hover {
41
+ color: #000;
42
+ }
43
+ .disabled .minimenuitem_control {
44
+ opacity: 0.8;
45
+ }
@@ -0,0 +1,4 @@
1
+ <div class="minimenuitem_control#{this.value?' checked':' unchecked'}" id="control#{_ID}">
2
+ <div class="minimenuitem_state" id="state#{_ID}"></div>
3
+ <div class="minimenuitem_label" id="label#{_ID}">#{this.label}</div>
4
+ </div>
@@ -0,0 +1,63 @@
1
+
2
+ .minimenu_control,
3
+ .minimenu_edge_left,
4
+ .minimenu_center,
5
+ .minimenu_edge_right,
6
+ .minimenu_label,
7
+ .minimenu_antiselect {
8
+ position: absolute;
9
+ top: 0px; height: 15px;
10
+ }
11
+
12
+ .minimenu_control {
13
+ left: 0px; right: 0px;
14
+ cursor: pointer;
15
+ }
16
+ .disabled .minimenu_control {
17
+ cursor: default;
18
+ }
19
+
20
+ .minimenu_edge_left,
21
+ .minimenu_center,
22
+ .minimenu_edge_right {
23
+ background-image: #{this.getCssFilePath('minimenu.png')};
24
+ }
25
+
26
+ .minimenu_edge_left {
27
+ left: 0px; width: 7px;
28
+ background-position: 0px 0px;
29
+ }
30
+
31
+ .minimenu_edge_right {
32
+ right: 0px; width: 13px;
33
+ background-position: -7px 0px;
34
+ }
35
+
36
+ .minimenu_center {
37
+ left: 7px; right: 13px;
38
+ background-position: 0px -15px;
39
+ background-repeat: repeat-x;
40
+ }
41
+
42
+ .minimenu_label {
43
+ left: 6px; right: 11px; top: 0px;
44
+ height: 15px; line-height: 15px;
45
+ text-align: left;
46
+ text-overflow: ellipsis;
47
+ overflow: hidden;
48
+ white-space:nowrap;
49
+ vertical-align: middle;
50
+ font-family: Arial, sans-serif;
51
+ font-size: 11px;
52
+ color: #333;
53
+ }
54
+ .minimenu_control:hover > .minimenu_label {
55
+ color: #000;
56
+ }
57
+ .disabled .minimenu_control {
58
+ opacity: 0.8;
59
+ }
60
+
61
+ .minimenu_antiselect {
62
+ left: 0px; right: 0px;
63
+ }
@@ -0,0 +1,7 @@
1
+ <div class="minimenu_control" id="control#{_ID}">
2
+ <div class="minimenu_edge_left"></div>
3
+ <div class="minimenu_center"></div>
4
+ <div class="minimenu_edge_right"></div>
5
+ <div class="minimenu_label" id="label#{_ID}">#{this.label}</div>
6
+ <div class="minimenu_antiselect"></div>
7
+ </div>
@@ -127,7 +127,7 @@ ReloadApp = HApplication.extend({
127
127
  );
128
128
  }
129
129
  }).nu(
130
- HRect.nu( _alertX, _alertY, _alertX+_alertWidth, _alertY+_alertHeight ),
130
+ HRect.nu( 0, 0, _alertWidth, _alertHeight ),
131
131
  _this, {
132
132
  label: _title,
133
133
  value: 0
data/lib/conf/argv.rb CHANGED
@@ -19,6 +19,25 @@ module RSence
19
19
  return (not ['i386-mingw32','x86-mingw32'].include?(RUBY_PLATFORM))
20
20
  end
21
21
 
22
+ # @private Returns true, if platform is linux
23
+ def self.linux?
24
+ return RUBY_PLATFORM.end_with?('-linux')
25
+ end
26
+
27
+ # @private Returns true, if platform is Mac OS X
28
+ def self.darwin?
29
+ return RUBY_PLATFORM.include?('-darwin')
30
+ end
31
+
32
+ # @private Returns signal name that resembles INFO or PWR (extra signal to poll for server status)
33
+ def self.info_signal_name
34
+ if self.linux?
35
+ return 'PWR'
36
+ else
37
+ return 'INFO'
38
+ end
39
+ end
40
+
22
41
  # @private ARGVParser is the "user interface" as a command-line argument parser.
23
42
  # It parses the command-line arguments and sets up things accordingly.
24
43
  class ARGVParser
@@ -32,10 +51,10 @@ module RSence
32
51
  # system that fully implements POSIX standard signals.
33
52
  # These are necessary to send signals to the background process.
34
53
  if not RSence.pid_support?
35
- @@cmds = [ :run, :initenv, :version, :help ]
54
+ @@cmds = [ :run, :init, :initenv, :version, :help ]
36
55
  else
37
56
  @@cmds = [ :run, :status, :start, :stop, :restart, :save,
38
- :initenv, :version, :help ]
57
+ :init, :initenv, :version, :help ]
39
58
  end
40
59
 
41
60
  help_avail_cmds = @@cmds.map{|cmd|cmd.to_s}.join("\n ")
@@ -315,7 +334,12 @@ module RSence
315
334
  if RUBY_VERSION.to_f >= 1.9
316
335
  sock = TCPSocket.open( addr, port )
317
336
  else
318
- sock = TCPsocket.open( addr, port )
337
+ begin
338
+ sock = TCPsocket.open( addr, port )
339
+ rescue NameError => e
340
+ warn "TCPsocket not available, trying TCPSocket.."
341
+ sock = TCPSocket.open( addr, port )
342
+ end
319
343
  end
320
344
  sock.close
321
345
  return true
@@ -327,7 +351,8 @@ module RSence
327
351
  end
328
352
  end
329
353
 
330
- # Main argument parser for the status command, sends the USR2 POSIX signal to the process, if running.
354
+ # Main argument parser for the status command, sends the INFO (or PWR on linux) POSIX signal to
355
+ # the process, if running.
331
356
  # Checks if the process responds on the port and address it's configured for.
332
357
  def parse_status_argv
333
358
  init_args
@@ -406,8 +431,9 @@ module RSence
406
431
  pid_fn = config[:daemon][:pid_fn]
407
432
  if File.exists?( pid_fn )
408
433
  pid = File.read( pid_fn ).to_i
434
+ sig_name = RSence.info_signal_name
409
435
  pid_status = RSence::SIGComm.wait_signal_response(
410
- pid, pid_fn, 'USR2', 3
436
+ pid, pid_fn, sig_name, 3
411
437
  )
412
438
  else
413
439
  warn @@strs[:messages][:no_pid_file] if @args[:verbose]
@@ -504,7 +530,7 @@ module RSence
504
530
  pid = File.read( pid_fn ).to_i
505
531
  saving_message = @@strs[:messages][:saving_message]
506
532
  pid_status = RSence::SIGComm.wait_signal_response(
507
- pid, pid_fn, 'USR1', 30, saving_message, '.', 0.1, true
533
+ pid, pid_fn, 'USR2', 30, saving_message, '.', 0.1, true
508
534
  )
509
535
  else
510
536
  warn @@strs[:messages][:no_pid_file] if @args[:verbose]
@@ -703,10 +729,13 @@ module RSence
703
729
  run_dir = File.expand_path( 'run', env_dir )
704
730
  Dir.mkdir( run_dir )
705
731
  unless create_blank
706
- welcome_plugin_dir = File.join( SERVER_PATH, 'setup', 'welcome' )
707
- welcome_plugin_dst = File.join( plugins_dir, 'welcome' )
708
- puts ERB.new( @@strs[:initenv][:installing_welcome_plugin] ).result( binding )
709
- FileUtils.cp_r( welcome_plugin_dir, welcome_plugin_dst )
732
+ print @@strs[:initenv][:install_welcome]
733
+ if yesno(true)
734
+ welcome_plugin_dir = File.join( SERVER_PATH, 'setup', 'welcome' )
735
+ welcome_plugin_dst = File.join( plugins_dir, 'welcome' )
736
+ puts ERB.new( @@strs[:initenv][:installing_welcome_plugin] ).result( binding )
737
+ FileUtils.cp_r( welcome_plugin_dir, welcome_plugin_dst )
738
+ end
710
739
  end
711
740
  puts @@strs[:initenv][:creating_files]
712
741
  conf_file = File.join( conf_dir, 'config.yaml' )
@@ -768,7 +797,7 @@ module RSence
768
797
  parse_status_argv
769
798
  elsif cmd == :save
770
799
  parse_save_argv
771
- elsif cmd == :initenv
800
+ elsif cmd == :initenv or cmd == :init
772
801
  parse_initenv_argv
773
802
  end
774
803
  else
data/lib/daemon/daemon.rb CHANGED
@@ -47,7 +47,7 @@ module RSence
47
47
  end
48
48
 
49
49
  def self.responds?( daemon )
50
- wait_signal_response( daemon, 'USR2' )
50
+ wait_signal_response( daemon, RSence.info_signal_name )
51
51
  end
52
52
 
53
53
  # Reads the pid file and calls the process.
@@ -111,10 +111,22 @@ module RSence
111
111
  daemon.usr1
112
112
  write_signal_response( daemon, 'USR1' )
113
113
  end
114
- Signal.trap('USR2') do
114
+ Signal.trap( 'USR2' ) do
115
115
  daemon.usr2
116
116
  write_signal_response( daemon, 'USR2' )
117
117
  end
118
+ # Signal.trap( 'PWR' ) do
119
+ # daemon.pwr
120
+ # write_signal_response( daemon, 'PWR' )
121
+ # end
122
+ Signal.trap( 'ALRM' ) do
123
+ daemon.alrm
124
+ write_signal_response( daemon, 'ALRM' )
125
+ end
126
+ Signal.trap( RSence.info_signal_name ) do
127
+ daemon.info
128
+ write_signal_response( daemon, RSence.info_signal_name )
129
+ end
118
130
  ['INT', 'TERM', 'KILL'].each do | signal |
119
131
  Signal.trap( signal ) do
120
132
  puts "RSence killed with signal #{signal.inspect}" if RSence.args[:verbose]
@@ -194,12 +206,12 @@ module RSence
194
206
  sleep 1 while true
195
207
  end
196
208
 
197
- # Sends the USR1 signal to the process, which in turn
209
+ # Sends the PWR signal to the process, which in turn
198
210
  # calls the save method of the daemon.
199
211
  def self.save( daemon )
200
212
  status_ = status( daemon )
201
213
  if status_
202
- if wait_signal_response( daemon, 'USR1', 10, 'saving.', 'saved', 0.3 )
214
+ if wait_signal_response( daemon, 'PWR', 10, 'saving.', 'saved', 0.3 )
203
215
  puts "Session data saved."
204
216
  else
205
217
  puts "Warning: saving timed out! Session data not saved."
@@ -256,10 +268,19 @@ module RSence
256
268
 
257
269
  # @private Simple process control, constructed here and called from Daemon::Controller
258
270
  class HTTPDaemon
259
-
271
+
272
+ def ps_name
273
+ config = RSence.config
274
+ url = "http://#{config[:http_server][:bind_address]}:#{config[:http_server][:port]}#{config[:base_url]}"
275
+ env_path = RSence.args[:env_path]
276
+ "RSence-#{RSence.version} on #{url} in #{env_path}"
277
+ end
278
+
260
279
  # RSence top-level run handler. Almost identical to start.
261
280
  def run
262
-
281
+
282
+ $0 = ps_name
283
+
263
284
  puts "Starting as a foreground process." if RSence.args[:verbose]
264
285
  puts "Press CTRL-C to terminate."
265
286
 
@@ -278,30 +299,32 @@ module RSence
278
299
  )
279
300
 
280
301
  end
281
-
302
+
282
303
  # Returns the pid file path.
283
304
  def pid_fn
284
305
  RSence.config[:daemon][:pid_fn]
285
306
  end
286
-
307
+
287
308
  # Returns the log path.
288
309
  def log_fn
289
310
  RSence.config[:daemon][:log_fn]
290
311
  end
291
-
312
+
292
313
  # Returns the configured bind address
293
314
  def addr
294
315
  RSence.config[:http_server][:bind_address]
295
316
  end
296
-
317
+
297
318
  # Returns the configured port.
298
319
  def port
299
320
  RSence.config[:http_server][:port]
300
321
  end
301
-
322
+
302
323
  # Called by Controller#start, contains RSence-specific operations
303
324
  def start
304
-
325
+
326
+ $0 = ps_name
327
+
305
328
  @transporter = Transporter.new
306
329
 
307
330
  conf = RSence.config[:http_server]
@@ -321,17 +344,40 @@ module RSence
321
344
  yield @broker
322
345
 
323
346
  end
324
-
347
+
325
348
  # Called by Controller#stop, contains RSence-specific operations
326
349
  def stop
327
350
  @transporter.shutdown
328
351
  end
329
-
330
- # Called on USR1 signals (save data)
352
+
353
+ # # Called on PWR signals (save data)
354
+ # def pwr
355
+ # save
356
+ # end
357
+
358
+ # Called on INFO (PWR) signals ("Alive?")
359
+ def info
360
+ puts "#{Time.now.strftime('%Y-%m-%d %H:%M:%S')} -- RSence version #{RSence.version} is running."
361
+ end
362
+
363
+ # Called on ALRM signals (save data, reload all plugins manually)
364
+ def alrm
365
+ save
366
+ @transporter.plugins.shutdown
367
+ @transporter.plugins.init_bundles!
368
+ end
369
+
370
+ # Called on usr1 signals (updates bundles manually, like the regular intervals of the -a switch and forces client to be rebuilt)
331
371
  def usr1
372
+ @transporter.plugins.update_bundles!
373
+ # @transporter.plugins.client_pkg.rebuild_client
374
+ end
375
+
376
+ # Called on USR2 signals
377
+ def usr2
332
378
  save
333
379
  end
334
-
380
+
335
381
  # Save state
336
382
  def save
337
383
  puts "#{Time.now.strftime('%Y-%m-%d %H:%M:%S')} -- Saving state..."
@@ -342,12 +388,7 @@ module RSence
342
388
  @transporter.online = transporter_state
343
389
  puts "#{Time.now.strftime('%Y-%m-%d %H:%M:%S')} -- State saved."
344
390
  end
345
-
346
- # Called on USR2 signals ("Alive?")
347
- def usr2
348
- puts "#{Time.now.strftime('%Y-%m-%d %H:%M:%S')} -- RSence version #{RSence.version} is running."
349
- end
350
-
391
+
351
392
  # Main entry point, daemonizes itself using Controller.
352
393
  def daemonize!
353
394
  Daemon.daemonize( self )
@@ -29,27 +29,20 @@ module RSence
29
29
  # @return [:GUIPlugin]
30
30
  def self.bundle_type; :GUIPlugin; end
31
31
 
32
-
33
- # @private Placeholder for actual gui yaml file.
34
- @@default_yaml_src = <<-END
35
- type: GUITree
36
- version: 0.6
37
-
38
- class: RSence.GUIApp
39
- options:
40
- label: "Dummy Application"
41
-
42
- END
43
-
44
32
  # In addition to {Plugin__#init Plugin#init}, also automatically initializes a {GUIParser} instance as +@gui+
45
33
  #
46
34
  # @return [nil]
47
35
  def init
48
36
  super
49
37
  yaml_src = file_read( "gui/#{@name}.yaml" )
50
- yaml_src = file_read( "gui/main.yaml" ) unless yaml_src
51
- yaml_src = @@default_yaml_src unless yaml_src
52
- @gui = GUIParser.new( self, yaml_src )
38
+ unless yaml_src
39
+ yaml_src = file_read( "gui/main.yaml" )
40
+ end
41
+ if yaml_src
42
+ @gui = GUIParser.new( self, yaml_src, @name )
43
+ else
44
+ @gui = nil
45
+ end
53
46
  @client_pkgs = false
54
47
  end
55
48
 
@@ -79,13 +72,14 @@ options:
79
72
  # end
80
73
  #
81
74
  def gui_params( msg )
75
+ return unless @gui
82
76
  { :values => @gui.values( get_ses( msg ) ) }
83
77
  end
84
78
 
85
79
  # @private Method that implements +client_pkgs.yaml+ loading
86
80
  def install_client_pkgs
87
81
  if @client_pkgs
88
- warn "install_client_pkgs: called with @client_pkgs defined; returning"
82
+ warn "install_client_pkgs: called with @client_pkgs defined (#{@client_pkgs.inspect}); returning" if RSence.args[:debug]
89
83
  return
90
84
  end
91
85
  @client_pkgs = yaml_read( 'client_pkgs.yaml' )
@@ -93,14 +87,14 @@ options:
93
87
  if @client_pkgs.has_key?(:src_dirs)
94
88
  @client_pkgs[:src_dirs].each do |src_dir|
95
89
  src_dir = bundle_path( src_dir[2..-1] ) if src_dir.start_with?('./')
96
- @plugins.client_pkg.add_src_dir( src_dir )
90
+ client_pkg.add_src_dir( src_dir )
97
91
  end
98
92
  end
99
- @plugins.client_pkg.add_packages( @client_pkgs[:packages ] ) if @client_pkgs.has_key?(:packages )
100
- @plugins.client_pkg.add_themes( @client_pkgs[:theme_names ] ) if @client_pkgs.has_key?(:theme_names )
101
- @plugins.client_pkg.add_gfx_formats( @client_pkgs[:gfx_formats ] ) if @client_pkgs.has_key?(:gfx_formats )
102
- @plugins.client_pkg.add_reserved_names( @client_pkgs[:reserved_names] ) if @client_pkgs.has_key?(:reserved_names)
103
- @plugins.client_pkg.rebuild_client
93
+ client_pkg.add_packages( @client_pkgs[:packages ] ) if @client_pkgs.has_key?(:packages )
94
+ client_pkg.add_themes( @client_pkgs[:theme_names ] ) if @client_pkgs.has_key?(:theme_names )
95
+ client_pkg.add_gfx_formats( @client_pkgs[:gfx_formats ] ) if @client_pkgs.has_key?(:gfx_formats )
96
+ client_pkg.add_reserved_names( @client_pkgs[:reserved_names] ) if @client_pkgs.has_key?(:reserved_names)
97
+ client_pkg.rebuild_client
104
98
  end
105
99
  end
106
100
 
@@ -112,14 +106,14 @@ options:
112
106
  if @client_pkgs.has_key?(:src_dirs)
113
107
  @client_pkgs[:src_dirs].each do |src_dir|
114
108
  src_dir = bundle_path( src_dir[2..-1] ) if src_dir.start_with?('./')
115
- @plugins.client_pkg.del_src_dir( src_dir )
109
+ client_pkg.del_src_dir( src_dir )
116
110
  end
117
111
  end
118
- @plugins.client_pkg.del_reserved_names( @client_pkgs[:reserved_names] ) if @client_pkgs.has_key?(:reserved_names)
119
- @plugins.client_pkg.del_gfx_formats( @client_pkgs[:gfx_formats ] ) if @client_pkgs.has_key?(:gfx_formats )
120
- @plugins.client_pkg.del_themes( @client_pkgs[:theme_names ] ) if @client_pkgs.has_key?(:theme_names )
121
- @plugins.client_pkg.del_packages( @client_pkgs[:packages].keys ) if @client_pkgs.has_key?(:packages )
122
- @plugins.client_pkg.rebuild_client
112
+ client_pkg.del_reserved_names( @client_pkgs[:reserved_names] ) if @client_pkgs.has_key?(:reserved_names)
113
+ client_pkg.del_gfx_formats( @client_pkgs[:gfx_formats ] ) if @client_pkgs.has_key?(:gfx_formats )
114
+ client_pkg.del_themes( @client_pkgs[:theme_names ] ) if @client_pkgs.has_key?(:theme_names )
115
+ client_pkg.del_packages( @client_pkgs[:packages].keys ) if @client_pkgs.has_key?(:packages )
116
+ client_pkg.rebuild_client
123
117
  end
124
118
  @client_pkgs = false
125
119
  end
@@ -136,9 +130,10 @@ options:
136
130
  uninstall_client_pkgs if @client_pkgs
137
131
  end
138
132
 
139
- # @private Sends gui specification to the main plugin
140
- def spec_ui( msg )
141
- # TODO
133
+ # @private Returns structured, processed gui tree to the caller.
134
+ def struct_ui( msg )
135
+ return {} unless @gui
136
+ @gui.struct( msg, gui_params( msg ) )
142
137
  end
143
138
 
144
139
  # Automatically inits the UI using {GUIParser#init}
@@ -147,11 +142,13 @@ options:
147
142
  #
148
143
  # @return [nil]
149
144
  def init_ui( msg )
145
+ return unless @gui
150
146
  @gui.init( msg, gui_params( msg ) )
151
147
  end
152
148
 
153
149
  # @private Automatically kills the UI using {GUIParser#kill}
154
150
  def kill_ui( msg )
151
+ return unless @gui
155
152
  @gui.kill( msg )
156
153
  end
157
154