3 # LADITools - Linux Audio Desktop Integration Tools
4 # wmladi - Window maker dockapp for jackdbus
5 # Copyright (C) 2012 Alessio Treglia <quadrispro@ubuntu.com>
6 # Copyright (C) 2007-2010, Marc-Olivier Barre <marco@marcochapeau.org>
7 # Copyright (C) 2007-2009, Nedko Arnaudov <nedko@arnaudov.name>
9 # This program is free software: you can redistribute it and/or modify
10 # it under the terms of the GNU General Public License as published by
11 # the Free Software Foundation, either version 3 of the License, or
12 # (at your option) any later version.
14 # This program is distributed in the hope that it will be useful,
15 # but WITHOUT ANY WARRANTY; without even the implied warranty of
16 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 # GNU General Public License for more details.
19 # You should have received a copy of the GNU General Public License
20 # along with this program. If not, see <http://www.gnu.org/licenses/>.
25 from wmdocklib
import wmoo
, pywmhelpers
29 from gi
.repository
import Gdk
31 sig_handler
= signal
.getsignal(signal
.SIGTERM
)
32 signal
.signal(signal
.SIGINT
, sig_handler
)
34 from laditools
import _gettext_domain
35 gettext
.install(_gettext_domain
)
37 from laditools
import get_version_string
38 from laditools
import LadiConfiguration
39 from laditools
import LadiApp
41 from gi
.repository
import Gtk
42 from gi
.repository
import GObject
44 from laditools
.gtk
import LadiMenu
46 # Default configuration
50 class wmladi (wmoo
.Application
, LadiMenu
, LadiApp
):
53 _appname_long
= _("LADI WindowMaker dockapp")
54 _appid
= 'org.linuxaudio.ladi.wmlami'
56 # Default configuration
62 # Handle the configuration
63 self
.global_config
= LadiConfiguration (self
.appname
,
65 self
.config_dict
= self
.global_config
.get_config_section (self
.appname
)
66 autostart
= bool(eval(self
.config_dict
['autostart']))
67 wmoo
.Application
.__init
__ (
69 #background = os.path.dirname(sys.argv[0]) + os.sep + "wmjackctl.xpm",
73 LadiMenu
.__init
__(self
, autostart
)
75 self
.addCallback (self
.on_button_release
, 'buttonrelease', area
=(0,0,64,64))
79 self
.lines
.append ("")
83 def set_starting_status (self
):
84 self
.set_line (0, "JACK")
85 self
.set_line (1, "Starting")
91 def on_button_release (self
, event
):
92 if event
['button'] == 3:
95 def set_line (self
, line
, text
):
96 self
.lines
[line
] = text
97 while len (self
.lines
[line
]) < 9:
98 self
.lines
[line
] += ' '
100 def clear_line (self
, line
):
101 self
.set_line (line
, "")
109 if self
.jack_is_started():
113 if self
.jack_is_realtime():
118 if self
.a2j_is_available():
120 if self
.a2j_is_started():
127 self
.set_line(0, line0
)
128 self
.set_line(1, "started")
129 self
.set_line(2, "%.3f %%" % self
.jack_get_load())
131 xruns
= self
.jack_get_xruns()
133 self
.set_line(3, "no xruns")
135 self
.set_line(3, "1 xrun")
137 self
.set_line(3, "lot xruns")
139 self
.set_line(3, "%s xruns" % xruns
)
141 rate
= self
.jack_get_sample_rate()
142 if rate
% 1000.0 == 0:
143 self
.set_line(4, "%.0f Khz" % (rate
/ 1000.0))
145 self
.set_line(4, "%.1f Khz" % (rate
/ 1000.0))
147 self
.set_line(5, "%.1f ms" % self
.jack_get_latency())
149 self
.set_line(0, "JACK")
150 self
.set_line(1, "stopped")
157 self
.clear_diagnose_text()
159 self
.set_diagnose_text(repr(e
))
162 self
.set_line(0, "JACK")
163 self
.set_line(1, "is sick")
168 self
.clear_jack_proxies()
170 self
.put_lines (self
.lines
)
171 wmoo
.Application
.update (self
)
172 LadiMenu
.update(self
)
174 def put_lines (self
, lines
):
178 self
.putString (x
, y
, line
)
181 def do_dockapp (self
, user_data
= None):
182 """this is called from event loop. events are examined and if a
183 callback has been registered, it is called, passing it the event as
186 event
= pywmhelpers
.getEvent ()
187 while not event
is None:
188 if event
['type'] == 'destroynotify':
191 for evtype
, key
, area
, callback
in self
._events
:
192 if evtype
is not None and evtype
!= event
['type']: continue
193 if key
is not None and key
!= event
['button']: continue
195 if not area
[0] <= event
['x'] <= area
[2]: continue
196 if not area
[1] <= event
['y'] <= area
[3]: continue
200 event
= pywmhelpers
.getEvent ()
205 def run_sleep (self
):
208 while Gtk
.events_pending ():
209 Gtk
.main_iteration ()
211 while Gtk
.events_pending ():
212 Gtk
.main_iteration ()
213 time
.sleep (self
._sleep
)
217 GObject
.timeout_add (int(self
._sleep
* 1000), self
.do_dockapp
, None)
222 self
.global_config
.set_config_section (self
.appname
, self
.config_dict
)
223 self
.global_config
.save ()
225 def position_menu(self
, menu
, data
):
226 _
, x
, y
, _
= Gdk
.Display
.get_default().get_pointer()
229 def menu_activate(self
):
230 menu
= self
.create_menu()
232 menu
.popup(parent_menu_shell
=None,
233 parent_menu_item
=None,
234 func
=self
.position_menu
,
242 if __name__
== '__main__':
243 parser
= argparse
.ArgumentParser(description
=_('Window maker dockapp for jackdbus'),
244 epilog
=_('This program is part of the LADITools suite.'))
245 parser
.add_argument('--version', action
='version', version
="%(prog)s " + get_version_string())