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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
|
/*
* inputEvent.cpp
*
* Created on: 06.09.2010
* Author: brs
*/
#include <QBuffer>
#include <QByteArray>
#include <QCoreApplication>
#include <QDataStream>
#include <QKeyEvent>
#include <QMouseEvent>
#include <QString>
#include "inputEvent.h"
#include <src/util/consoleLogger.h>
// We implement operators to serialize and load an event:
QDataStream& operator <<(QDataStream& ostrm, InputEvent const& evt)
{
ostrm << evt.type_ << evt.code_ << evt.value_;
return ostrm;
}
QDataStream& operator >>(QDataStream& istrm, InputEvent& evt)
{
istrm >> evt.type_ >> evt.code_ >> evt.value_;
return istrm;
}
void eventToString(InputEvent const& evt, QString& str)
{
QByteArray ba;
QBuffer buf(&ba);
buf.open(QIODevice::WriteOnly);
QDataStream out(&buf);
out << evt;
str = QString::fromAscii(ba.toBase64());
}
bool eventFromString(QString const& str, InputEvent& evt)
{
// TODO This does not do proper error checking. Only use from trusted sources!
QByteArray ba = QByteArray::fromBase64(str.toAscii());
QBuffer buf(&ba);
buf.open(QIODevice::ReadOnly);
QDataStream in(&buf);
in >> evt;
return true;
}
quint16 InputEvent::mouseButtonsFromQt(int b)
{
quint16 ret = 0;
if(b & Qt::LeftButton)
{
ret |= EB_LEFT;
}
if(b & Qt::RightButton)
{
ret |= EB_RIGHT;
}
if(b & Qt::MidButton)
{
ret |= EB_MIDDLE;
}
return ret;
}
InputEvent InputEvent::mousePressRelease(int qt_button, int qt_buttons)
{
quint16 button = mouseButtonsFromQt(qt_button);
quint16 buttons = mouseButtonsFromQt(qt_buttons);
quint16 code;
if(buttons & button)
{
code = EC_PRESS;
}
else
{
code = EC_RELEASE;
}
quint32 value = ((quint32)button << 16) | buttons;
return InputEvent(ET_BUTTON, code, value);
}
InputEvent InputEvent::keyboardPress(int key, int mods)
{
quint32 value = key | mods;
return InputEvent(ET_KEY, EC_PRESS, value);
}
InputEvent InputEvent::keyboardRelease(int key, int mods)
{
quint32 value = key | mods;
return InputEvent(ET_KEY, EC_RELEASE, value);
}
#define describe(list, description, type, code, value) \
list.append(SpecialInputEventDescription(InputEvent::type, InputEvent::code, value, description))
QList<SpecialInputEventDescription> SpecialInputEventDescription::describeSpecialEvents()
{
QList<SpecialInputEventDescription> list;
describe(list, InputEvent::tr("Say Hello"), ET_SPECIAL, EC_SAY_HELLO, 0);
describe(list, InputEvent::tr("Reboot"), ET_SPECIAL, EC_REBOOT, 0);
describe(list, InputEvent::tr("Kill X Server"), ET_SPECIAL, EC_KILL_X, 0);
describe(list, InputEvent::tr("Reboot immediately"), ET_SPECIAL, EC_SYSRQ, 'b');
describe(list, InputEvent::tr("Power off immediately"), ET_SPECIAL, EC_SYSRQ, 'o');
describe(list, InputEvent::tr("Crash System"), ET_SPECIAL, EC_SYSRQ, 'c');
describe(list, InputEvent::tr("Turn off raw keyboard mode"), ET_SPECIAL, EC_SYSRQ, 'r');
describe(list, InputEvent::tr("Send SIGTERM to all"), ET_SPECIAL, EC_SYSRQ, 'e');
describe(list, InputEvent::tr("Send SIGKILL to all"), ET_SPECIAL, EC_SYSRQ, 'i');
describe(list, InputEvent::tr("Kill all on this terminal"), ET_SPECIAL, EC_SYSRQ, 'k');
describe(list, InputEvent::tr("Activate OOM killer"), ET_SPECIAL, EC_SYSRQ, 'f');
describe(list, InputEvent::tr("Make real-time tasks niceable"), ET_SPECIAL, EC_SYSRQ, 'n');
describe(list, InputEvent::tr("Force-thaw filesystems"), ET_SPECIAL, EC_SYSRQ, 'j');
describe(list, InputEvent::tr("Sync all mounted filesystems"), ET_SPECIAL, EC_SYSRQ, 's');
describe(list, InputEvent::tr("Remount all readonly"), ET_SPECIAL, EC_SYSRQ, 'u');
describe(list, InputEvent::tr("Show all held locks"), ET_SPECIAL, EC_SYSRQ, 'd');
describe(list, InputEvent::tr("Show stack traces"), ET_SPECIAL, EC_SYSRQ, 'l');
describe(list, InputEvent::tr("Dump memory info"), ET_SPECIAL, EC_SYSRQ, 'm');
describe(list, InputEvent::tr("Dump registers and flags"), ET_SPECIAL, EC_SYSRQ, 'p');
describe(list, InputEvent::tr("Dump timers and clockevents"), ET_SPECIAL, EC_SYSRQ, 'q');
describe(list, InputEvent::tr("Dump task list"), ET_SPECIAL, EC_SYSRQ, 't');
describe(list, InputEvent::tr("Dump uninterruptible tasks"), ET_SPECIAL, EC_SYSRQ, 'w');
describe(list, InputEvent::tr("Dump ftrace buffer"), ET_SPECIAL, EC_SYSRQ, 'z');
return list;
}
|