diff options
author | Klaus Schmidinger <vdr@tvdr.de> | 2013-02-02 12:44:33 +0100 |
---|---|---|
committer | Klaus Schmidinger <vdr@tvdr.de> | 2013-02-02 12:44:33 +0100 |
commit | 1bad5d1e6f5a9fbbc09081f07f5b4d9d780fe5db (patch) | |
tree | ea29c4c65090d49da9a859639565c880a0e16b42 | |
parent | bb7d8b3b5bdf35ff088c90120cd60c0e9c532e0c (diff) | |
download | vdr-1bad5d1e6f5a9fbbc09081f07f5b4d9d780fe5db.tar.gz vdr-1bad5d1e6f5a9fbbc09081f07f5b4d9d780fe5db.tar.bz2 |
Avoiding an extra key press event if the repeat function kicks in when controlling VDR via the PC keyboard
-rw-r--r-- | HISTORY | 4 | ||||
-rw-r--r-- | remote.c | 52 | ||||
-rw-r--r-- | remote.h | 3 |
3 files changed, 46 insertions, 13 deletions
@@ -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. @@ -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; } @@ -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(); |