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
|
--- daemons/hw_devinput.c.orig
+++ daemons/hw_devinput.c
@@ -376,9 +376,15 @@ int devinput_decode(struct ir_remote *re
return 1;
}
+/* simulate key repeat if receiving the same scancode again */
+#define RPT_SCAN
+
char *devinput_rec(struct ir_remote *remotes)
{
struct input_event event;
+#ifdef RPT_SCAN
+ static struct input_event rptevent, scancodeevent;
+#endif
int rd;
ir_code value;
@@ -399,6 +405,56 @@ char *devinput_rec(struct ir_remote *rem
LOGPRINTF(1, "time %ld.%06ld type %d code %d value %d", event.time.tv_sec, event.time.tv_usec, event.type,
event.code, event.value);
+#ifdef RPT_SCAN
+ repeat_state = RPT_UNKNOWN;
+ if (event.type == EV_KEY) {
+ if (event.code == rptevent.code &&
+ event.value == 1 &&
+ event.type == rptevent.type &&
+ scancodeevent.type == EV_MSC) {
+ struct timeval difft;
+
+ difft = event.time;
+ difft.tv_sec -= scancodeevent.time.tv_sec;
+ difft.tv_usec -= scancodeevent.time.tv_usec;
+ if (difft.tv_usec < 0) {
+ difft.tv_sec--;
+ difft.tv_usec += 1000000;
+ }
+ if (difft.tv_sec == 0 && difft.tv_usec < 150000) {
+ repeat_state = RPT_YES;
+ }
+ }
+ rptevent = event;
+ scancodeevent.time = event.time;
+ } else if (event.type == EV_MSC && event.code == MSC_SCAN) {
+ if (scancodeevent.type == EV_MSC &&
+ event.value == scancodeevent.value) {
+ if (rptevent.type == EV_KEY && rptevent.value != 0) {
+ struct timeval difft;
+
+ difft = event.time;
+ difft.tv_sec -= scancodeevent.time.tv_sec;
+ difft.tv_usec -= scancodeevent.time.tv_usec;
+ if (difft.tv_usec < 0) {
+ difft.tv_sec--;
+ difft.tv_usec += 1000000;
+ }
+ scancodeevent = event;
+ event = rptevent;
+ if (difft.tv_sec == 0 && difft.tv_usec < 250000) {
+ event.value = 2;
+ repeat_state = RPT_YES;
+ } else {
+ event.value = 1;
+ repeat_state = RPT_NO;
+ }
+ }
+ } else if (rptevent.type == EV_KEY && rptevent.value <= 1) {
+ scancodeevent = event;
+ }
+ }
+#endif
value = (unsigned)event.value;
#ifdef EV_SW
if (value == 2 && (event.type == EV_KEY || event.type == EV_SW)) {
@@ -418,6 +474,9 @@ char *devinput_rec(struct ir_remote *rem
if (event.value == 2) {
repeat_state = RPT_YES;
} else {
+#ifdef RPT_SCAN
+ if (repeat_state == RPT_UNKNOWN)
+#endif
repeat_state = RPT_NO;
}
} else {
|