zik 0.16.2 → 0.17.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.
data/gui/preference.rb CHANGED
@@ -196,7 +196,7 @@ class Preference_window < Gtk::Window
196
196
  @@exist=false
197
197
 
198
198
  def Preference_window.show(parent, playlist, config, page=:default, cdlist=nil, cdplayer=nil, cdgui=nil)
199
- pages={:default=>0, :browse=>0, :playlist=>1, :player=>2, :cd=>3}
199
+ pages={:default=>0, :global=>0, :browse=>1, :playlist=>2, :player=>3, :cd=>4}
200
200
  if @@exist
201
201
  @@window.hide; @@window.show
202
202
  else
@@ -218,6 +218,33 @@ class Preference_window < Gtk::Window
218
218
  def initialize(parent, playlist, config, cdlist, cdplayer, cdgui)
219
219
  @@exist=true
220
220
 
221
+ #*********************Global page******************************
222
+ #theme
223
+ themes=Dir.glob(File.join(Theme_dir, '*/')).map{|d| d.split('/')[-1]}
224
+ #Add user themes-> themes.uniq! + priority to user themes (to be tested: themes.reverse!.uniq!)
225
+ @theme_combo=Gtk::ComboBox.new
226
+ themes.each_with_index{|theme, i|
227
+ @theme_combo.append_text(theme)
228
+ @theme_combo.active=i if config['theme']==theme
229
+ }
230
+
231
+ theme_frame=Gtk::Frame.new(_("Theme"))
232
+ theme_frame.border_width=$border
233
+ theme_frame.add(@theme_combo)
234
+
235
+
236
+ #session
237
+ @bsocket1=Gtk::RadioButton.new(_("Single"))
238
+ @bsocket2=Gtk::RadioButton.new(@bsocket1, _("Multi"))
239
+ config['socket'] ? @bsocket1.active=true : @bsocket2.active=true
240
+
241
+ @socket_frame=Gtk::Frame.new(_("Session"))
242
+ @socket_frame.border_width=$border
243
+ @socket_frame.add(hpack([@bsocket1, @bsocket2]))
244
+
245
+ #Main
246
+ @global_box=vpack(theme_frame, @socket_frame)
247
+
221
248
  #*********************Browser page******************************
222
249
  #Directories
223
250
  @dirbox=DirBox.new(self)
@@ -280,14 +307,6 @@ class Preference_window < Gtk::Window
280
307
  @wbrowser.add_with_viewport(@browser_box)
281
308
 
282
309
  #*********************Playlist page*****************************
283
- #session
284
- @bsocket1=Gtk::RadioButton.new(_("Single"))
285
- @bsocket2=Gtk::RadioButton.new(@bsocket1, _("Multi"))
286
- config['socket'] ? @bsocket2.active=true : @bsocket1.active=true
287
-
288
- @socket_frame=Gtk::Frame.new(_("Session"))
289
- @socket_frame.border_width=$border
290
- @socket_frame.add(hpack([@bsocket1, @bsocket2]))
291
310
  #format
292
311
  @format_selector=FormatSelector.new(config['name_format'])
293
312
  @format_label=Gtk::Label.new(_('Format used to display songs\' name. Set all to None if you want to use file name.'))
@@ -335,8 +354,11 @@ class Preference_window < Gtk::Window
335
354
  @relative_frame.add(vpack([@brelative, @relative_label]))
336
355
 
337
356
  #main
338
- @playlist_box=vpack([@socket_frame, @format_frame, @color_frame, @compact_frame,
357
+ @playlist_box=vpack([@format_frame, @color_frame, @compact_frame,
339
358
  @sort2_frame, @relative_frame])
359
+ @wplaylist=Gtk::ScrolledWindow.new
360
+ @wplaylist.set_policy(Gtk::POLICY_AUTOMATIC,Gtk::POLICY_AUTOMATIC)
361
+ @wplaylist.add_with_viewport(@playlist_box)
340
362
 
341
363
  #*********************Player page*******************************
342
364
  @bplay=Gtk::CheckButton.new(_('Play on start'))
@@ -401,8 +423,9 @@ class Preference_window < Gtk::Window
401
423
  #*********************Main window*******************************
402
424
  @notebook=Gtk::Notebook.new
403
425
  @notebook.tab_pos=Gtk::POS_LEFT
426
+ @notebook.append_page(@global_box, Gtk::Label.new(_('Global')))
404
427
  @notebook.append_page(@wbrowser, Gtk::Label.new(_('Browser')))
405
- @notebook.append_page(@playlist_box, Gtk::Label.new(_('Playlist')))
428
+ @notebook.append_page(@wplaylist, Gtk::Label.new(_('Playlist')))
406
429
  @notebook.append_page(@player_box, Gtk::Label.new(_('Player')))
407
430
  @notebook.append_page(@cd_box, Gtk::Label.new(_('Cd')))
408
431
  @notebook.append_page(@wmodule, Gtk::Label.new(_('Modules'))) if $module
@@ -412,20 +435,33 @@ class Preference_window < Gtk::Window
412
435
  @bok=Gtk::Button.new(Gtk::Stock::OK)
413
436
  @bok.signal_connect('clicked'){
414
437
  oldconfig={}; oldconfig.merge!(config)
415
- config.merge!({'directory'=>@dirbox.sdirectory, 'extension'=>@extbox.sext,
438
+ h={'directory'=>@dirbox.sdirectory, 'extension'=>@extbox.sext,
416
439
  'sort_directories_first'=>@bsortdir.active?, 'sort_case_sensitive'=>@bsortcase.active?, 'refresh_on_start'=>@brefresh.active?,
417
440
  'search_in_path'=>@bpath.active?, 'search_in_title'=>@btitle.active?,
418
441
  'search_in_artist'=>@bartist.active?, 'search_in_album'=>@balbum.active?, 'search_in_genre'=>@bgenre.active?,
419
- 'socket'=>@bsocket2.active?,
442
+ 'theme'=>@theme_combo.active_text,
420
443
  'name_format'=>@format_selector.format, 'relative_playlist'=>@brelative.active?,
421
444
  'compact'=>@bcompact.active?,
422
445
  'sort_by_track'=>@bsorttrack.active?, 'playing_color'=>@color_entry.text,
423
446
  'play_on_start'=>@bplay.active?, 'shuffle'=>@bshuffle.active?, 'repeat'=>@brepeat.active?,
424
- 'cd_device'=>@device_entry.text, 'cd_web'=>@bweb.active?})
447
+ 'cd_device'=>@device_entry.text, 'cd_web'=>@bweb.active?}
448
+ h['theme']=@theme_combo.active_text if @theme_combo.active_text
449
+ config.merge!(h)
425
450
  if $module
426
451
  config['module']=''
427
452
  @module_hbuttons.each_pair{|key, value| config['module']+=key+',' if value.active?}
428
453
  end
454
+ unless oldconfig['theme']==config['theme']
455
+ parent.change_theme
456
+ end
457
+ unless oldconfig['socket']==config['socket']
458
+ if config['socket']
459
+ require File.join(Data_dir, 'gui/socket')
460
+ ZiKSocket.start_server(parent, config, playlist)
461
+ else
462
+ ZiKSocket.clean
463
+ end
464
+ end
429
465
  begin
430
466
  Gdk::Color.parse(config['playing_color'])
431
467
  rescue
@@ -480,6 +516,7 @@ class Preference_window < Gtk::Window
480
516
  self.skip_taskbar_hint=true
481
517
  self.skip_pager_hint=true
482
518
  self.title=_('Preferences')
519
+ self.set_default_size(800, 800)
483
520
  self.icon=Gdk::Pixbuf.new(File.join(Pix_dir,'ZiK.svg'))
484
521
 
485
522
  self.signal_connect("delete_event") {quit;true}
data/gui/socket.rb CHANGED
@@ -19,6 +19,8 @@ This file is part of ZiK.
19
19
  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
20
20
  =end
21
21
 
22
+ require 'socket'
23
+
22
24
  module ZiKSocket
23
25
  #Address and clean function are defined in ZiK.rb
24
26
  Welcome_message="Hi! This is #{$name} through unix socket."
@@ -33,7 +35,9 @@ class CloseServer < Exception; end
33
35
  end
34
36
 
35
37
  def ZiKSocket.start_server(gui, config, playlist)
36
- Thread.new{ZiKSocket::Server.new(gui, config, playlist)}
38
+ ErrorError.new(_("Single session: server not started."), true) if Thread.new{
39
+ ZiKSocket::Server.new(gui, config, playlist)
40
+ }.status.nil?#Except raise in thread used to start server.
37
41
  end
38
42
 
39
43
  class Server
data/mod/brainz.rb CHANGED
@@ -41,7 +41,10 @@ module Brainz
41
41
  require File.join(@dir, 'brainz', 'dialogs')
42
42
  require File.join(@dir, 'brainz', 'widget')
43
43
  @widget=Widget.new(zik)
44
- pack(@widget, true, false)
44
+ vbox=Gtk::VBox.new
45
+ vbox.show
46
+ vbox.pack_start(@widget, false, false)
47
+ pack(vbox, true, false)
45
48
  it=Gtk::MenuItem.new("Brainz")
46
49
  it.signal_connect('activate'){
47
50
  s=zik.list_selection.selected_rows
@@ -39,16 +39,16 @@ def Brainz.tag(zik, zikSong)
39
39
  begin
40
40
  puids=song.puids
41
41
  raise PuidsError.new if puids.nil?
42
- ModErrorInfo.new(self, "get puids: #{puids.join(', ')}.")
42
+ ModErrorInfo.new(Brainz.mod, "get puids: #{puids.join(', ')}.")
43
43
  song.get_tag
44
44
  TagDialog.new(zik, song)
45
45
  rescue PuidsParseError
46
- ModErrorError.new(self, _("Cannot retrieve song id (parse error)."), true)
46
+ ModErrorError.new(Brainz.mod, _("Cannot retrieve song id (parse error)."), true)
47
47
  rescue PuidsError
48
- ModErrorError.new(self, _("Cannot retrieve song id."), true)
48
+ ModErrorError.new(Brainz.mod, _("Cannot retrieve song id."), true)
49
49
  end
50
50
  else
51
- ModErrorError.new(self, _("Only files are supported."), true)
51
+ ModErrorError.new(Brainz.mod, _("Only files are supported."), true)
52
52
  end
53
53
  zik.cursor=Gdk::Cursor::ARROW
54
54
  end
data/mod/hotkeys.rb CHANGED
@@ -44,29 +44,22 @@ module Hotkeys
44
44
 
45
45
  def @m.load
46
46
  unless @loaded
47
- #Some deprecated code to be cleaned
48
- #Since 0.2.0 rghk is required using the 'globalhotkeys' string
49
- rghk='globalhotkeys'
50
47
  begin
51
- require rghk
48
+ require 'globalhotkeys'
52
49
  @rghk=true
53
50
 
54
51
  @kb_prev||=GlobalHotKeys::KeyBinder.new
55
52
  @kb_stop||=GlobalHotKeys::KeyBinder.new
56
53
  @kb_play||=GlobalHotKeys::KeyBinder.new
57
54
  @kb_next||=GlobalHotKeys::KeyBinder.new
55
+ @kb_hide||=GlobalHotKeys::KeyBinder.new
58
56
  reload(true)
59
57
 
60
58
  ModErrorInfo.new(self, "module loaded.")
61
59
  @loaded=true
62
60
  rescue LoadError
63
- if rghk=='globalhotkeys'
64
- rghk='rghk'
65
- retry
66
- else
67
61
  ModErrorLoadError.new(self, _("Cannot find rghk. Please install it."))
68
62
  @loaded=false
69
- end
70
63
  end
71
64
  else
72
65
  false
@@ -99,6 +92,8 @@ module Hotkeys
99
92
  save_key(@wconfig.eplay.text, :play_key)
100
93
  save_mask([@wconfig.bcnext, @wconfig.bsnext, @wconfig.banext], :next_mask)
101
94
  save_key(@wconfig.enext.text, :next_key)
95
+ save_mask([@wconfig.bchide, @wconfig.bshide, @wconfig.bahide], :hide_mask)
96
+ save_key(@wconfig.ehide.text, :hide_key)
102
97
  reload
103
98
  end
104
99
  end
@@ -111,11 +106,23 @@ private
111
106
 
112
107
  def @m.reload(force=false)
113
108
  if @loaded||force
114
- [@kb_prev, @kb_stop, @kb_play, @kb_next].each{|kb| kb.unbind}
115
- @kb_prev.bind(Gdk::Keyval.from_name(@config[:prev_key]), @config[:prev_mask]){@zik.previous_song}
116
- @kb_stop.bind(Gdk::Keyval.from_name(@config[:stop_key]), @config[:stop_mask]){@zik.stop}
117
- @kb_play.bind(Gdk::Keyval.from_name(@config[:play_key]), @config[:play_mask]){@zik.playpause}
118
- @kb_next.bind(Gdk::Keyval.from_name(@config[:next_key]), @config[:next_mask]){@zik.next_song}
109
+ [@kb_prev, @kb_stop, @kb_play, @kb_next, @kb_hide].each{|kb| kb.unbind}
110
+ begin
111
+ @kb_prev.bind(Gdk::Keyval.from_name(@config[:prev_key]),
112
+ @config[:prev_mask]){@zik.previous_song}
113
+ @kb_stop.bind(Gdk::Keyval.from_name(@config[:stop_key]),
114
+ @config[:stop_mask]){@zik.stop}
115
+ @kb_play.bind(Gdk::Keyval.from_name(@config[:play_key]),
116
+ @config[:play_mask]){@zik.playpause}
117
+ @kb_next.bind(Gdk::Keyval.from_name(@config[:next_key]),
118
+ @config[:next_mask]){@zik.next_song}
119
+ @kb_hide.bind(Gdk::Keyval.from_name(@config[:hide_key]),
120
+ @config[:hide_mask]){@zik.visible? ? @zik.hide : @zik.show}
121
+ rescue GlobalHotKeys::XlibError
122
+ mess=_("Cannot bind these keys.")
123
+ ModErrorError.new(self, mess, true,
124
+ mess+_( "They must already used by another programm."))
125
+ end
119
126
  end
120
127
  end
121
128
 
@@ -24,8 +24,9 @@ module Hotkeys
24
24
  class Configuration < Hash
25
25
  def initialize(dir)
26
26
  @file=File.join(dir,'hotkeysrc')
27
- default={:prev_mask=>0, :prev_key=>"F9", :stop_mask=>0, :stop_key=>"F10", :play_mask=>0, :play_key=>"F11",
28
- :next_mask=>0, :next_key=>"F12"}
27
+ default={:prev_mask=>0, :prev_key=>"F9", :stop_mask=>0, :stop_key=>"F10",
28
+ :play_mask=>0, :play_key=>"F11", :next_mask=>0, :next_key=>"F12",
29
+ :hide_mask=>0, :hide_key=>"F8"}
29
30
  super
30
31
  self.merge!(default)
31
32
  if File.exist?(@file)
@@ -79,6 +80,7 @@ private
79
80
  self[:stop_mask]=self[:stop_mask].to_i
80
81
  self[:play_mask]=self[:play_mask].to_i
81
82
  self[:next_mask]=self[:next_mask].to_i
83
+ self[:hide_mask]=self[:hide_mask].to_i
82
84
  end
83
85
  end
84
86
  end
@@ -22,8 +22,8 @@ This file is part of ZiK.
22
22
 
23
23
  module Hotkeys
24
24
  class ConfigWidget < Gtk::Table
25
- attr_reader :eprev, :estop, :eplay, :enext, :bcprev, :bsprev, :baprev, :bcstop, :bsstop, :bastop,
26
- :bcplay, :bsplay, :baplay, :bcnext, :bsnext, :banext
25
+ attr_reader :eprev, :estop, :eplay, :enext, :ehide, :bcprev, :bsprev, :baprev, :bcstop, :bsstop, :bastop,
26
+ :bcplay, :bsplay, :baplay, :bcnext, :bsnext, :banext, :bchide, :bshide, :bahide
27
27
 
28
28
  def initialize(config)
29
29
  @lprev=Gtk::Label.new(_("Previous:\t"))
@@ -66,7 +66,17 @@ class ConfigWidget < Gtk::Table
66
66
  @enext=Gtk::Entry.new
67
67
  @enext.text=config[:next_key]
68
68
 
69
- super(4, 5)
69
+ @lhide=Gtk::Label.new(_("Hide/show:\t"))
70
+ @bchide=Gtk::CheckButton.new('Ctrl')
71
+ @bchide.active=config[:hide_mask]&GlobalHotKeys::Modifier::CONTROL_MASK==GlobalHotKeys::Modifier::CONTROL_MASK
72
+ @bshide=Gtk::CheckButton.new('Shift')
73
+ @bshide.active=config[:hide_mask]&GlobalHotKeys::Modifier::SHIFT_MASK==GlobalHotKeys::Modifier::SHIFT_MASK
74
+ @bahide=Gtk::CheckButton.new('Alt')
75
+ @bahide.active=config[:hide_mask]&GlobalHotKeys::Modifier::MOD1_MASK==GlobalHotKeys::Modifier::MOD1_MASK
76
+ @ehide=Gtk::Entry.new
77
+ @ehide.text=config[:hide_key]
78
+
79
+ super(5, 5)
70
80
  #self.column_spacings=$border
71
81
  self.attach(@lprev, 0, 1, 0, 1, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, $border)
72
82
  self.attach(@bcprev, 1, 2, 0, 1)
@@ -88,6 +98,11 @@ class ConfigWidget < Gtk::Table
88
98
  self.attach(@bsnext, 2, 3, 3, 4)
89
99
  self.attach(@banext, 3, 4, 3, 4)
90
100
  self.attach(@enext, 4, 5, 3, 4, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, $border)
101
+ self.attach(@lhide, 0, 1, 4, 5, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, $border)
102
+ self.attach(@bchide, 1, 2, 4, 5)
103
+ self.attach(@bshide, 2, 3, 4, 5)
104
+ self.attach(@bahide, 3, 4, 4, 5)
105
+ self.attach(@ehide, 4, 5, 4, 5, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, $border)
91
106
  end
92
107
  end
93
108
  end
data/mod/trayicon.rb CHANGED
@@ -45,6 +45,7 @@ module Trayicon
45
45
  end
46
46
  }
47
47
  @zik.signal_connect('stop'){@tray.tooltip='ZiK' if @loaded}
48
+ reload
48
49
  ModErrorInfo.new(self, "module loaded.")
49
50
  @loaded=true
50
51
  else
@@ -56,7 +57,8 @@ module Trayicon
56
57
  if @loaded
57
58
  #@tray.destroy #No method to destroy an Gtk::StatusIcon.
58
59
  @tray.visible=false
59
- ModErrorInfo.new(self, ModErrorINFO, "module unloaded.")
60
+ @zik.delete_event_connect
61
+ ModErrorInfo.new(self, "module unloaded.")
60
62
  @loaded=false
61
63
  true
62
64
  else
@@ -71,6 +73,8 @@ module Trayicon
71
73
  def @m.saveconfig
72
74
  if @loaded
73
75
  @config[:scroll_event]=@wconfig.bscroll.active?
76
+ @config[:hide]=@wconfig.bhide.active?
77
+ reload
74
78
  true
75
79
  else
76
80
  false
@@ -80,4 +84,14 @@ module Trayicon
80
84
  def @m.quit
81
85
  @config.save if @config
82
86
  end
87
+
88
+ private
89
+
90
+ def @m.reload
91
+ if @config[:hide]
92
+ @zik.delete_event_connect{@zik.hide; true}
93
+ else
94
+ @zik.delete_event_connect
95
+ end
96
+ end
83
97
  end
@@ -24,7 +24,7 @@ module Trayicon
24
24
  class Configuration < Hash
25
25
  def initialize(dir)
26
26
  @file=File.join(dir,'trayiconrc')
27
- default={:scroll_event=>false}
27
+ default={:scroll_event=>false, :hide=>false}
28
28
  super
29
29
  self.merge!(default)
30
30
  if File.exist?(@file)
@@ -74,6 +74,7 @@ class Configuration < Hash
74
74
  private
75
75
  def str2value
76
76
  self[:scroll_event]=="true" ? self[:scroll_event]=true : self[:scroll_event]=false
77
+ self[:hide]=="true" ? self[:hide]=true : self[:hide]=false
77
78
  end
78
79
  end
79
80
  end
@@ -21,15 +21,22 @@ This file is part of ZiK.
21
21
  =end
22
22
 
23
23
  module Trayicon
24
- class ConfigWidget < Gtk::Frame
25
- attr_reader :bscroll
24
+ class ConfigWidget < Gtk::VBox
25
+ attr_reader :bscroll, :bhide
26
26
 
27
27
  def initialize(config)
28
28
  @bscroll=Gtk::CheckButton.new(_("Check to add interactions with third button mouse.\ndown : next song.\nup : previous song.\nCtrl+down : decrease volume.\nCtrl+up : increase volume."))
29
29
  @bscroll.active=config[:scroll_event]
30
+ @fscroll=Gtk::Frame.new(_('Scroll actions'))
31
+ @fscroll.add(@bscroll)
30
32
 
31
- super(_('Scroll actions'))
32
- self.add(@bscroll)
33
+ @bhide=Gtk::CheckButton.new(_("Hide ZiK on close"))
34
+ @bhide.active=config[:hide]
35
+
36
+ super()
37
+ self.spacing=$border
38
+ self.pack_start(@fscroll, false)
39
+ self.pack_start(@bhide, false)
33
40
  end
34
41
  end
35
42
  end
data/player/cdplayer.rb CHANGED
@@ -95,11 +95,11 @@ class Player
95
95
  private
96
96
 
97
97
  def got_bus_message(message)
98
- case message.type
99
- when Gst::Message::ERROR
98
+ case message
99
+ when Gst::MessageError
100
100
  ErrorError.new(_("Gstreamer error."), true)
101
101
  stop
102
- when Gst::Message::EOS
102
+ when Gst::MessageEos
103
103
  @gui.next_song#Use Dbus to propagate message instead of :gui ???
104
104
  end
105
105
  true#Without this line only the first message is processed
data/player/player.rb CHANGED
@@ -97,10 +97,10 @@ private
97
97
  Gst::InstallPlugins
98
98
  def got_bus_message(message)
99
99
  case message
100
- when Gst::Message::ERROR
100
+ when Gst::MessageError
101
101
  ErrorError.new(_("Gstreamer error."), true)
102
102
  @gui.next_song_on_error
103
- when Gst::Message::EOS
103
+ when Gst::MessageEos
104
104
  @gui.next_song#Use Dbus to propagate message instead of :gui or a SIGNAL???
105
105
  when Gst::MissingMessage
106
106
  ErrorInfo.new("Missing plugins.")
@@ -119,11 +119,11 @@ private
119
119
  end
120
120
  rescue NameError
121
121
  def got_bus_message(message)
122
- case message.type
123
- when Gst::Message::ERROR
122
+ case message
123
+ when Gst::MessageError
124
124
  ErrorError.new(_("Gstreamer error."), true)
125
125
  @gui.next_song_on_error
126
- when Gst::Message::EOS
126
+ when Gst::MessageEos
127
127
  @gui.next_song#Use Dbus to propagate message instead of :gui or a SIGNAL???
128
128
  end
129
129
  true#Without this line only the first message is processed
@@ -63,12 +63,12 @@ private
63
63
  begin
64
64
  Gst::InstallPlugins
65
65
  def got_bus_message(message)
66
- case message.type
67
- when Gst::Message::ERROR
66
+ case message
67
+ when Gst::MessageError
68
68
  ErrorError.new(_('Gstreamer error'), true)
69
69
  stop
70
70
  next_stream
71
- when Gst::Message::EOS
71
+ when Gst::MessageEos
72
72
  @gui.next_song#Use Dbus to propagate message instead of :gui ???
73
73
  when Gst::MissingMessage
74
74
  ErrorInfo.new("Missing plugins.")
@@ -88,12 +88,12 @@ private
88
88
  end
89
89
  rescue NameError
90
90
  def got_bus_message(message)
91
- case message.type
92
- when Gst::Message::ERROR
91
+ case message
92
+ when Gst::MessageError
93
93
  ErrorError.new(_('Gstreamer error'), true)
94
94
  stop
95
95
  next_stream
96
- when Gst::Message::EOS
96
+ when Gst::MessageEos
97
97
  @gui.next_song#Use Dbus to propagate message instead of :gui ???
98
98
  end
99
99
  true#Without this line only the first message is processed