2
* Copyright (C) 2014-2015 Canonical, Ltd.
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.
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.
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/>.
21
\brief A mapper for the physical keys on the device
23
A mapper to handle events triggered by pressing physical keys on a device.
29
This allows for handling the following events
31
* Volume Decreases/Increases
39
signal powerKeyLongPressed;
40
signal volumeDownTriggered;
41
signal volumeUpTriggered;
42
signal screenshotTriggered;
47
property bool volumeDownKeyPressed: false
48
property bool volumeUpKeyPressed: false
49
property bool ignoreVolumeEvents: false
53
id: powerKeyLongPressTimer
56
onTriggered: root.powerKeyLongPressed();
60
function onKeyPressed(event) {
61
if ((event.key == Qt.Key_PowerDown || event.key == Qt.Key_PowerOff)
62
&& !event.isAutoRepeat) {
64
// FIXME: We only consider power key presses if the screen is
65
// on because of bugs 1410830/1409003. The theory is that when
66
// those bugs are encountered, there is a >2s delay between the
67
// power press event and the power release event, which causes
68
// the shutdown dialog to appear on resume. So to avoid that
69
// symptom while we investigate the root cause, we simply won't
70
// initiate any dialogs when the screen is off.
71
if (Powerd.status === Powerd.On) {
72
powerKeyLongPressTimer.restart();
74
event.accepted = true;
75
} else if ((event.key == Qt.Key_MediaTogglePlayPause || event.key == Qt.Key_MediaPlay)
76
&& !event.isAutoRepeat) {
77
event.accepted = callManager.handleMediaKey(false);
78
} else if (event.key == Qt.Key_VolumeDown) {
79
if (event.isAutoRepeat && !d.ignoreVolumeEvents) root.volumeDownTriggered();
80
else if (!event.isAutoRepeat) {
81
if (d.volumeUpKeyPressed) {
82
if (Powerd.status === Powerd.On) root.screenshotTriggered();
83
d.ignoreVolumeEvents = true;
85
d.volumeDownKeyPressed = true;
87
} else if (event.key == Qt.Key_VolumeUp) {
88
if (event.isAutoRepeat && !d.ignoreVolumeEvents) root.volumeUpTriggered();
89
else if (!event.isAutoRepeat) {
90
if (d.volumeDownKeyPressed) {
91
if (Powerd.status === Powerd.On) root.screenshotTriggered();
92
d.ignoreVolumeEvents = true;
94
d.volumeUpKeyPressed = true;
99
function onKeyReleased(event) {
100
if (event.key == Qt.Key_PowerDown || event.key == Qt.Key_PowerOff) {
101
powerKeyLongPressTimer.stop();
102
event.accepted = true;
103
} else if (event.key == Qt.Key_VolumeDown) {
104
if (!d.ignoreVolumeEvents) root.volumeDownTriggered();
105
d.volumeDownKeyPressed = false;
106
if (!d.volumeUpKeyPressed) d.ignoreVolumeEvents = false;
107
} else if (event.key == Qt.Key_VolumeUp) {
108
if (!d.ignoreVolumeEvents) root.volumeUpTriggered();
109
d.volumeUpKeyPressed = false;
110
if (!d.volumeDownKeyPressed) d.ignoreVolumeEvents = false;