08a006d08a
'__' instead.
86 lines
2.3 KiB
C
86 lines
2.3 KiB
C
--- 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 {
|