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
|
#include <lib/driver/rcinput.h>
#include <lib/base/eerror.h>
#include <sys/ioctl.h>
#include <linux/input.h>
#include <sys/stat.h>
#include <lib/base/ebase.h>
#include <lib/base/init.h>
#include <lib/base/init_num.h>
#include <lib/driver/input_fake.h>
void eRCDeviceInputDev::handleCode(long rccode)
{
struct input_event *ev = (struct input_event *)rccode;
if (ev->type!=EV_KEY)
return;
// eDebug("%x %x %x", ev->value, ev->code, ev->type);
if (ev->type!=EV_KEY)
return;
int km = iskeyboard ? input->getKeyboardMode() : eRCInput::kmNone;
// eDebug("keyboard mode %d", km);
if (km == eRCInput::kmAll)
return;
if (km == eRCInput::kmAscii)
{
// eDebug("filtering.. %d", ev->code);
bool filtered = ( ev->code > 0 && ev->code < 61 );
switch (ev->code)
{
case KEY_RESERVED:
case KEY_ESC:
case KEY_TAB:
case KEY_BACKSPACE:
case KEY_ENTER:
case KEY_LEFTCTRL:
case KEY_RIGHTSHIFT:
case KEY_LEFTALT:
case KEY_CAPSLOCK:
case KEY_INSERT:
case KEY_DELETE:
case KEY_MUTE:
filtered=false;
default:
break;
}
if (filtered)
return;
// eDebug("passed!");
}
switch (ev->value)
{
case 0:
/*emit*/ input->keyPressed(eRCKey(this, ev->code, eRCKey::flagBreak));
break;
case 1:
/*emit*/ input->keyPressed(eRCKey(this, ev->code, 0));
break;
case 2:
/*emit*/ input->keyPressed(eRCKey(this, ev->code, eRCKey::flagRepeat));
break;
}
}
eRCDeviceInputDev::eRCDeviceInputDev(eRCInputEventDriver *driver)
:eRCDevice(driver->getDeviceName(), driver), iskeyboard(false)
{
int len=id.length();
int idx=0;
while(idx <= len-8)
{
if (!strncasecmp(&id[idx++], "KEYBOARD", 8))
{
iskeyboard=true;
break;
}
}
driver->setExclusive(!iskeyboard);
eDebug("Input device \"%s\" is %sa keyboard.", id.c_str(), iskeyboard ? "" : "not ");
}
const char *eRCDeviceInputDev::getDescription() const
{
return id.c_str();
}
class eInputDeviceInit
{
ePtrList<eRCInputEventDriver> m_drivers;
ePtrList<eRCDeviceInputDev> m_devices;
public:
eInputDeviceInit()
{
int i = 0;
while (1)
{
struct stat s;
char filename[128];
sprintf(filename, "/dev/input/event%d", i);
if (stat(filename, &s))
break;
eRCInputEventDriver *p;
m_drivers.push_back(p = new eRCInputEventDriver(filename));
m_devices.push_back(new eRCDeviceInputDev(p));
++i;
}
eDebug("Found %d input devices!", i);
}
~eInputDeviceInit()
{
while (m_drivers.size())
{
delete m_devices.back();
m_devices.pop_back();
delete m_drivers.back();
m_drivers.pop_back();
}
}
};
eAutoInitP0<eInputDeviceInit> init_rcinputdev(eAutoInitNumbers::rc+1, "input device driver");
|