summaryrefslogtreecommitdiff
path: root/remote.c
diff options
context:
space:
mode:
Diffstat (limited to 'remote.c')
-rw-r--r--remote.c67
1 files changed, 48 insertions, 19 deletions
diff --git a/remote.c b/remote.c
index 7157a5f..d4f1702 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 1.32 2002/12/01 10:40:04 kls Exp $
+ * $Id: remote.c 1.34 2002/12/08 13:37:13 kls Exp $
*/
#include "remote.h"
@@ -13,13 +13,7 @@
#include <string.h>
#include <sys/types.h>
#include <sys/time.h>
-#include <termios.h>
#include <unistd.h>
-
-#if defined REMOTE_KBD
-#include <ncurses.h>
-#endif
-
#include "tools.h"
// --- cRemote ---------------------------------------------------------------
@@ -68,7 +62,7 @@ bool cRemote::Put(eKeys Key)
{
if (Key != kNone) {
cMutexLock MutexLock(&mutex);
- if ((Key & k_Release) != 0)
+ if (in != out && (keys[out] & k_Repeat) && (Key & k_Release))
Clear();
int d = out - in;
if (d <= 0)
@@ -155,30 +149,65 @@ cRemotes Remotes;
// --- cKbdRemote ------------------------------------------------------------
-#if defined REMOTE_KBD
-
cKbdRemote::cKbdRemote(void)
:cRemote("KBD")
{
+ active = false;
+ tcgetattr(STDIN_FILENO, &savedTm);
+ struct termios tm;
+ if (tcgetattr(STDIN_FILENO, &tm) == 0) {
+ tm.c_iflag = 0;
+ tm.c_lflag &= ~(ICANON | ECHO);
+ tm.c_cc[VMIN] = 0;
+ tm.c_cc[VTIME] = 0;
+ tcsetattr(STDIN_FILENO, TCSANOW, &tm);
+ }
Start();
}
cKbdRemote::~cKbdRemote()
{
- Cancel();
+ active = false;
+ Cancel(3);
+ tcsetattr(STDIN_FILENO, TCSANOW, &savedTm);
}
void cKbdRemote::Action(void)
{
dsyslog("KBD remote control thread started (pid=%d)", getpid());
cPoller Poller(STDIN_FILENO);
- for (;;) {//XXX
- int Command = getch();
- if (Command != EOF)
- Put(Command);
- Poller.Poll(100);
- }
+ active = true;
+ while (active) {
+ if (Poller.Poll(100)) {
+ uint64 Command = 0;
+ uint i = 0;
+ int t0 = time_ms();
+ while (active && i < sizeof(Command)) {
+ uchar ch;
+ int r = read(STDIN_FILENO, &ch, 1);
+ if (r == 1) {
+ Command <<= 8;
+ Command |= ch;
+ i++;
+ }
+ else if (r == 0) {
+ // don't know why, but sometimes special keys that start with
+ // 0x1B ('ESC') cause a short gap between the 0x1B and the rest
+ // of their codes, so we'll need to wait some 100ms to see if
+ // there is more coming up - or whether this really is the 'ESC'
+ // key (if somebody knows how to clean this up, please let me know):
+ if (Command == 0x1B && time_ms() - t0 < 100)
+ continue;
+ if (Command)
+ Put(Command);
+ break;
+ }
+ else {
+ LOG_ERROR;
+ break;
+ }
+ }
+ }
+ }
dsyslog("KBD remote control thread ended (pid=%d)", getpid());
}
-
-#endif