diff options
| -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(); | 
