Changeset View
Changeset View
Standalone View
Standalone View
applet/contents/ui/main.qml
Show All 38 Lines | 33 | Item { | |||
---|---|---|---|---|---|
39 | property string displayName: i18n("Audio Volume") | 39 | property string displayName: i18n("Audio Volume") | ||
40 | property QtObject draggedStream: null | 40 | property QtObject draggedStream: null | ||
41 | 41 | | |||
42 | Layout.minimumHeight: units.gridUnit * 12 | 42 | Layout.minimumHeight: units.gridUnit * 12 | ||
43 | Layout.minimumWidth: units.gridUnit * 12 | 43 | Layout.minimumWidth: units.gridUnit * 12 | ||
44 | Layout.preferredHeight: units.gridUnit * 20 | 44 | Layout.preferredHeight: units.gridUnit * 20 | ||
45 | Layout.preferredWidth: units.gridUnit * 20 | 45 | Layout.preferredWidth: units.gridUnit * 20 | ||
46 | 46 | | |||
47 | Plasmoid.icon: paSinkModel.preferredSink ? Icon.name(paSinkModel.preferredSink.volume, paSinkModel.preferredSink.muted) : Icon.name(0, true) | 47 | Plasmoid.icon: paSinkModel.preferredSink && !isDummyOutput(paSinkModel.preferredSink) ? Icon.name(paSinkModel.preferredSink.volume, paSinkModel.preferredSink.muted) | ||
48 | : Icon.name(0, true) | ||||
48 | Plasmoid.switchWidth: units.gridUnit * 12 | 49 | Plasmoid.switchWidth: units.gridUnit * 12 | ||
49 | Plasmoid.switchHeight: units.gridUnit * 12 | 50 | Plasmoid.switchHeight: units.gridUnit * 12 | ||
50 | Plasmoid.toolTipMainText: { | 51 | Plasmoid.toolTipMainText: { | ||
51 | var sink = paSinkModel.preferredSink; | 52 | var sink = paSinkModel.preferredSink; | ||
52 | if (!sink) { | 53 | if (!sink) { | ||
53 | return displayName; | 54 | return displayName; | ||
54 | } | 55 | } | ||
55 | 56 | | |||
56 | if (sink.muted) { | 57 | if (sink.muted) { | ||
57 | return i18n("Audio Muted"); | 58 | return i18n("Audio Muted"); | ||
58 | } else { | 59 | } else { | ||
59 | return i18n("Volume at %1%", volumePercent(sink.volume)); | 60 | return i18n("Volume at %1%", volumePercent(sink.volume)); | ||
60 | } | 61 | } | ||
61 | } | 62 | } | ||
62 | Plasmoid.toolTipSubText: paSinkModel.preferredSink ? paSinkModel.preferredSink.description : "" | 63 | Plasmoid.toolTipSubText: paSinkModel.preferredSink ? paSinkModel.preferredSink.description : "" | ||
63 | 64 | | |||
65 | function isDummyOutput(output) { | ||||
66 | // DEFAULT_SINK_NAME in module-always-sink.c | ||||
67 | return output && output.name === "auto_null" | ||||
68 | } | ||||
69 | | ||||
64 | function boundVolume(volume) { | 70 | function boundVolume(volume) { | ||
65 | return Math.max(PulseAudio.MinimalVolume, Math.min(volume, maxVolumeValue)); | 71 | return Math.max(PulseAudio.MinimalVolume, Math.min(volume, maxVolumeValue)); | ||
66 | } | 72 | } | ||
67 | 73 | | |||
68 | function volumePercent(volume, max) { | 74 | function volumePercent(volume, max) { | ||
69 | if (!max) { | 75 | if (!max) { | ||
70 | max = PulseAudio.NormalVolume; | 76 | max = PulseAudio.NormalVolume; | ||
71 | } | 77 | } | ||
72 | return Math.round(volume / max * 100.0); | 78 | return Math.round(volume / max * 100.0); | ||
73 | } | 79 | } | ||
74 | 80 | | |||
75 | function increaseVolume() { | 81 | function increaseVolume() { | ||
76 | if (!paSinkModel.preferredSink) { | 82 | if (!paSinkModel.preferredSink || isDummyOutput(paSinkModel.preferredSink)) { | ||
77 | return; | 83 | return; | ||
78 | } | 84 | } | ||
79 | var volume = boundVolume(paSinkModel.preferredSink.volume + volumeStep); | 85 | var volume = boundVolume(paSinkModel.preferredSink.volume + volumeStep); | ||
80 | var percent = volumePercent(volume, maxVolumeValue); | 86 | var percent = volumePercent(volume, maxVolumeValue); | ||
81 | paSinkModel.preferredSink.muted = percent == 0; | 87 | paSinkModel.preferredSink.muted = percent == 0; | ||
82 | paSinkModel.preferredSink.volume = volume; | 88 | paSinkModel.preferredSink.volume = volume; | ||
83 | osd.show(percent); | 89 | osd.show(percent); | ||
84 | playFeedback(); | 90 | playFeedback(); | ||
85 | } | 91 | } | ||
86 | 92 | | |||
87 | function decreaseVolume() { | 93 | function decreaseVolume() { | ||
88 | if (!paSinkModel.preferredSink) { | 94 | if (!paSinkModel.preferredSink || isDummyOutput(paSinkModel.preferredSink)) { | ||
89 | return; | 95 | return; | ||
90 | } | 96 | } | ||
91 | var volume = boundVolume(paSinkModel.preferredSink.volume - volumeStep); | 97 | var volume = boundVolume(paSinkModel.preferredSink.volume - volumeStep); | ||
92 | var percent = volumePercent(volume, maxVolumeValue); | 98 | var percent = volumePercent(volume, maxVolumeValue); | ||
93 | paSinkModel.preferredSink.muted = percent == 0; | 99 | paSinkModel.preferredSink.muted = percent == 0; | ||
94 | paSinkModel.preferredSink.volume = volume; | 100 | paSinkModel.preferredSink.volume = volume; | ||
95 | osd.show(percent); | 101 | osd.show(percent); | ||
96 | playFeedback(); | 102 | playFeedback(); | ||
97 | } | 103 | } | ||
98 | 104 | | |||
99 | function muteVolume() { | 105 | function muteVolume() { | ||
100 | if (!paSinkModel.preferredSink) { | 106 | if (!paSinkModel.preferredSink || isDummyOutput(paSinkModel.preferredSink)) { | ||
101 | return; | 107 | return; | ||
102 | } | 108 | } | ||
103 | var toMute = !paSinkModel.preferredSink.muted; | 109 | var toMute = !paSinkModel.preferredSink.muted; | ||
104 | paSinkModel.preferredSink.muted = toMute; | 110 | paSinkModel.preferredSink.muted = toMute; | ||
105 | osd.show(toMute ? 0 : volumePercent(paSinkModel.preferredSink.volume, maxVolumeValue)); | 111 | osd.show(toMute ? 0 : volumePercent(paSinkModel.preferredSink.volume, maxVolumeValue)); | ||
106 | playFeedback(); | 112 | playFeedback(); | ||
107 | } | 113 | } | ||
108 | 114 | | |||
▲ Show 20 Lines • Show All 52 Lines • ▼ Show 20 Line(s) | 161 | onDefaultSinkChanged: { | |||
161 | if (!initalDefaultSinkIsSet) { | 167 | if (!initalDefaultSinkIsSet) { | ||
162 | initalDefaultSinkIsSet = true; | 168 | initalDefaultSinkIsSet = true; | ||
163 | return; | 169 | return; | ||
164 | } | 170 | } | ||
165 | 171 | | |||
166 | var icon = Icon.formFactorIcon(defaultSink.formFactor); | 172 | var icon = Icon.formFactorIcon(defaultSink.formFactor); | ||
167 | if (!icon) { | 173 | if (!icon) { | ||
168 | // Show "muted" icon for Dummy output | 174 | // Show "muted" icon for Dummy output | ||
169 | // DEFAULT_SINK_NAME in module-always-sink.c | 175 | if (isDummyOutput(defaultSink)) { | ||
170 | if (defaultSink.name === "auto_null") { | | |||
171 | icon = "audio-volume-muted"; | 176 | icon = "audio-volume-muted"; | ||
172 | } | 177 | } | ||
173 | } | 178 | } | ||
174 | 179 | | |||
175 | if (!icon) { | 180 | if (!icon) { | ||
176 | icon = Icon.name(defaultSink.volume, defaultSink.muted); | 181 | icon = Icon.name(defaultSink.volume, defaultSink.muted); | ||
177 | } | 182 | } | ||
178 | osd.showText(icon, defaultSink.description); | 183 | osd.showText(icon, defaultSink.description); | ||
▲ Show 20 Lines • Show All 322 Lines • Show Last 20 Lines |