1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
|
#!/usr/bin/env python
"A simple volume control applet."
import gtk
import subprocess
__author__ = "Joakim \"JockeTF\" Soderlund"
__date__ = "2008-08-22"
__license__ = "Public domain."
# Binaries to execute.
OSSMIX = "ossmix"
OSSXMIX = "ossxmix"
# The device to control.
DEVICE = "vmix0-outvol"
# The maximum outvol volume in decibels.
MAX_DB = 25.0
# Sets an icon for different volume levels.
LEVELS = (
(22, "audio-volume-high"),
(18, "audio-volume-medium"),
(0, "audio-volume-low"),
(-1, "audio-volume-muted"),
)
class StatusIcon():
"The status icon."
def __init__(self):
self.icon = gtk.StatusIcon()
self.icon.connect("scroll-event", self.scrollEvent)
self.icon.connect("activate", self.clickEvent)
self.set_visible = self.icon.set_visible
self.update()
def scrollEvent(self, widget, event, *args):
"Changes the volume when the user scrolls on the volume applet."
if event.direction == gtk.gdk.SCROLL_UP:
subprocess.call([OSSMIX, DEVICE, "--", "+%.1f" % self.getStep()])
elif event.direction == gtk.gdk.SCROLL_DOWN:
subprocess.call([OSSMIX, DEVICE, "--", "-%.1f" % self.getStep()])
self.update()
def clickEvent(self, widget, *args):
"Starts or closes ossxmix when the volume applet is clicked."
if not hasattr(self, "ossxmix"):
self.ossxmix = subprocess.Popen([OSSXMIX, "-S"])
else:
if self.ossxmix.poll() == None:
self.ossxmix.terminate()
else:
self.ossxmix = subprocess.Popen([OSSXMIX, "-S"])
self.update()
def getVolume(self):
"Returns the current volume in decibels as a float."
process = subprocess.Popen([OSSMIX, DEVICE], stdout=subprocess.PIPE)
volume = float(process.communicate()[0].split()[-2])
process.wait()
return volume
def getStep(self):
"Returns the next volume step to make in decibels as a float."
return (MAX_DB - self.getVolume() + 1) * 0.1
def getIconName(self):
"Returns the icon name for the current volume level."
volume = self.getVolume()
for level in LEVELS:
if level[0] < volume:
return level[1]
def update(self, *args):
"Updates the volume applet's tooltip and icon."
self.icon.set_tooltip("Volume: %.1f dB" % self.getVolume())
self.icon.set_from_icon_name(self.getIconName())
if __name__ == "__main__":
icon = StatusIcon()
icon.set_visible(True)
try:
gtk.main()
except KeyboardInterrupt:
print("")
|