From 1bad5d1e6f5a9fbbc09081f07f5b4d9d780fe5db Mon Sep 17 00:00:00 2001 From: Klaus Schmidinger Date: Sat, 2 Feb 2013 12:44:33 +0100 Subject: Avoiding an extra key press event if the repeat function kicks in when controlling VDR via the PC keyboard --- HISTORY | 4 +++- remote.c | 52 +++++++++++++++++++++++++++++++++++++++++----------- remote.h | 3 ++- 3 files changed, 46 insertions(+), 13 deletions(-) diff --git a/HISTORY b/HISTORY index 7dee0748..2401b51b 100644 --- a/HISTORY +++ b/HISTORY @@ -7534,7 +7534,7 @@ Video Disk Recorder Revision History - Reduced the number of retries in cTransfer::Receive() to avoid blocking recordings in case the primary device can't handle the current live signal. -2013-02-01: Version 1.7.37 +2013-02-03: Version 1.7.37 - Now also using FindHeader() in cMpeg2Fixer::AdjTref() (pointed out by Sören Moch). - Added missing template for DVBDIR to Make.config.template (reported by Derek Kelly). @@ -7560,3 +7560,5 @@ Video Disk Recorder Revision History - Improved LIRC timing for repeat function. - When pausing live video, the current audio and subtitle tracks are now retained. - Added some notes about plugin Makefiles to PLUGINS.html. +- Avoiding an extra key press event if the repeat function kicks in when controlling + VDR via the PC keyboard. diff --git a/remote.c b/remote.c index 3f20d026..023fd665 100644 --- a/remote.c +++ b/remote.c @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: remote.c 2.6 2013/01/13 12:01:52 kls Exp $ + * $Id: remote.c 2.7 2013/02/02 12:44:33 kls Exp $ */ #include "remote.h" @@ -295,6 +295,14 @@ int cKbdRemote::MapCodeToFunc(uint64_t Code) return kfNone; } +void cKbdRemote::PutKey(uint64_t Code, bool Repeat, bool Release) +{ + if (rawMode || !Put(Code, Repeat, Release)) { + if (int func = MapCodeToFunc(Code)) + Put(KBDKEY(func), Repeat, Release); + } +} + int cKbdRemote::ReadKey(void) { cPoller Poller(STDIN_FILENO); @@ -356,24 +364,46 @@ uint64_t cKbdRemote::ReadKeySequence(void) void cKbdRemote::Action(void) { + uint64_t FirstCommand = 0; uint64_t LastCommand = 0; + bool Delayed = false; bool Repeat = false; while (Running()) { uint64_t Command = ReadKeySequence(); - if (LastCommand && Command != LastCommand && Repeat) { - if (!rawMode) - Put(LastCommand, false, true); - Repeat = false; - } if (Command) { - if (Command == LastCommand) + if (Command == LastCommand) { + // If two keyboard events with the same command come in without an intermediate + // timeout, this is a long key press that caused the repeat function to kick in: + Delayed = false; + FirstCommand = 0; + PutKey(Command, true); Repeat = true; - if (rawMode || !Put(Command, Repeat)) { - int func = MapCodeToFunc(Command); - if (func) - Put(KBDKEY(func)); } + else if (Command == FirstCommand) { + // If the same command comes in twice with an intermediate timeout, we + // need to delay the second command to see whether it is going to be + // a repeat function or a separate key press: + Delayed = true; + } + else { + // This is a totally new key press, so we accept it immediately: + PutKey(Command); + Delayed = false; + FirstCommand = Command; + } + } + else if (Repeat) { + // Timeout after a repeat function, so we generate a 'release': + PutKey(LastCommand, false, true); + Repeat = false; + } + else if (Delayed && FirstCommand) { + // Timeout after two normal key presses of the same key, so accept the + // delayed key: + PutKey(FirstCommand); + Delayed = false; + FirstCommand = 0; } LastCommand = Command; } diff --git a/remote.h b/remote.h index 46ad9564..7c081d47 100644 --- a/remote.h +++ b/remote.h @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: remote.h 1.41 2008/02/23 14:38:47 kls Exp $ + * $Id: remote.h 2.1 2013/02/02 12:44:33 kls Exp $ */ #ifndef __REMOTE_H @@ -111,6 +111,7 @@ private: int ReadKey(void); uint64_t ReadKeySequence(void); int MapCodeToFunc(uint64_t Code); + void PutKey(uint64_t Code, bool Repeat = false, bool Release = false); public: cKbdRemote(void); virtual ~cKbdRemote(); -- cgit v1.2.3