on xenial help sign in
Avoid volume control changes when both volume keys are pressed.
commit8c22a7855e0b7192557580cf3fc74a1eff7914d2 authorAlberto Aguirre <alberto.aguirre@canonical.com> dateWed 29 Oct 2014, 19:21 (12 years ago) parent771480d
3 files changed+77−39
qml/Components/ScreenGrabber.qml+6−33 qml/Components/VolumeKeyFilter.qml+63 qml/Shell.qml+8−6
qml/Components/ScreenGrabber.qml+6−33
@@ -26,14 +26,6 @@ Rectangle {
2626 anchors.fill: parent
2727 opacity: 0.0
2828
29−
30− QtObject {
31− id: keyState
32− property bool volumeUpPressed: false
33− property bool volumeDownPressed: false
34− property bool ignoreKeyRepeats: false
35− }
36−
3729 ScreenGrabber {
3830 id: screenGrabber
3931 objectName: "screenGrabber"
@@ -45,33 +37,14 @@ Rectangle {
4537 source: "/system/media/audio/ui/camera_click.ogg"
4638 }
4739
48− function onKeyPressed(key) {
49− if (!enabled || keyState.ignoreKeyRepeats)
40+ function capture() {
41+ if (!enabled)
5042 return;
5143
52− if (key == Qt.Key_VolumeUp)
53− keyState.volumeUpPressed = true;
54− else if (key == Qt.Key_VolumeDown)
55− keyState.volumeDownPressed = true;
56−
57− if (keyState.volumeDownPressed && keyState.volumeUpPressed) {
58− // Only take one screenshot if both keys are held
59− keyState.ignoreKeyRepeats = true;
60− visible = true;
61− shutterSound.stop();
62− shutterSound.play();
63− fadeIn.start();
64− }
65− }
66−
67− function onKeyReleased(key) {
68− if (key == Qt.Key_VolumeUp) {
69− keyState.volumeUpPressed = false;
70− keyState.ignoreKeyRepeats = false;
71− } else if (key == Qt.Key_VolumeDown) {
72− keyState.volumeDownPressed = false;
73− keyState.ignoreKeyRepeats = false;
74− }
44+ visible = true;
45+ shutterSound.stop();
46+ shutterSound.play();
47+ fadeIn.start();
7548 }
7649
7750 NumberAnimation on opacity {
qml/Components/VolumeKeyFilter.qmlnew file+63
@@ -0,0 +1,63 @@
1+/*
2+ * Copyright (C) 2014 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+import QtQuick 2.0
18+/*!
19+ \brief A filter for volume keys
20+
21+A filter which treats volume keys as single tri-state key with the states:
22+VolumeUp Pressed, VolumeDown Pressed or Volume Up+Down pressed
23+*/
24+QtObject {
25+ id: root
26+
27+ signal volumeUpPressed()
28+ signal volumeDownPressed()
29+ signal bothVolumeKeysPressed()
30+
31+ property bool volumeUpKeyPressed: false
32+ property bool volumeDownKeyPressed: false
33+ property bool aVolumeKeyWasReleased: true
34+
35+ function onKeyPressed(key) {
36+ if (key == Qt.Key_VolumeUp)
37+ volumeUpKeyPressed = true;
38+ else if (key == Qt.Key_VolumeDown)
39+ volumeDownKeyPressed = true;
40+
41+ if (volumeDownKeyPressed && volumeUpKeyPressed) {
42+ //avoids sending a signal repeatedly if both keys are held
43+ //instead one of the keys must have been previously released
44+ if (aVolumeKeyWasReleased)
45+ bothVolumeKeysPressed();
46+ aVolumeKeyWasReleased = false;
47+ } else if (volumeDownKeyPressed) {
48+ volumeDownPressed();
49+ } else if (volumeUpKeyPressed) {
50+ volumeUpPressed();
51+ }
52+ }
53+
54+ function onKeyReleased(key) {
55+ if (key == Qt.Key_VolumeUp) {
56+ volumeUpKeyPressed = false;
57+ aVolumeKeyWasReleased = true;
58+ } else if (key == Qt.Key_VolumeDown) {
59+ volumeDownKeyPressed = false;
60+ aVolumeKeyWasReleased = true;
61+ }
62+ }
63+}
qml/Shell.qml+8−6
@@ -144,28 +144,30 @@ Item {
144144 value: launcher.shown || launcher.dashSwipe
145145 }
146146
147+ VolumeKeyFilter {
148+ id: volumeKeyFilter
149+ onVolumeDownPressed: volumeControl.volumeDown()
150+ onVolumeUpPressed: volumeControl.volumeUp()
151+ onBothVolumeKeysPressed: screenGrabber.capture()
152+ }
147153
148154 WindowKeysFilter {
149− // Handle but do not filter out volume keys
150− Keys.onVolumeUpPressed: { volumeControl.volumeUp(); event.accepted = false; }
151− Keys.onVolumeDownPressed: { volumeControl.volumeDown(); event.accepted = false; }
152−
153155 Keys.onPressed: {
154− screenGrabber.onKeyPressed(event.key);
155156 if (event.key == Qt.Key_PowerOff || event.key == Qt.Key_PowerDown) {
156157 dialogs.onPowerKeyPressed();
157158 event.accepted = true;
158159 } else {
160+ volumeKeyFilter.onKeyPressed(event.key);
159161 event.accepted = false;
160162 }
161163 }
162164
163165 Keys.onReleased: {
164− screenGrabber.onKeyReleased(event.key);
165166 if (event.key == Qt.Key_PowerOff || event.key == Qt.Key_PowerDown) {
166167 dialogs.onPowerKeyReleased();
167168 event.accepted = true;
168169 } else {
170+ volumeKeyFilter.onKeyReleased(event.key);
169171 event.accepted = false;
170172 }
171173 }