summaryrefslogtreecommitdiff
path: root/remote.c
diff options
context:
space:
mode:
authorKlaus Schmidinger <kls (at) cadsoft (dot) de>2002-12-08 18:00:00 +0100
committerKlaus Schmidinger <kls (at) cadsoft (dot) de>2002-12-08 18:00:00 +0100
commit2b15337b71d71c5e486efe738a507b550bb28843 (patch)
treedcd6fe2d5a57366e0c39ab1fd400ec20a4226ed6 /remote.c
parent96ebdbf4b1e495d44f8f837068af7c2d925bab62 (diff)
downloadvdr-patch-lnbsharing-2b15337b71d71c5e486efe738a507b550bb28843.tar.gz
vdr-patch-lnbsharing-2b15337b71d71c5e486efe738a507b550bb28843.tar.bz2
Version 1.1.19vdr-1.1.19
- The character '|' in description texts of EPG records is now interpreted as a newline character (suggested by Gerhard Steiner). - Updated 'channels.conf.cable' (thanks to Andreas Kool). - Improved handling of repeated remote keys. - The RCU now only sets the channel number display when there are no incoming remote control keys, which improves reaction on repeated keys. - The actual tuning is now done in a separate thread, which makes zapping through the channels a lot faster and no longer gets stuck on channels that don't broadcast. This also makes "Motor-DiSEqC" work (thanks to Reinhard Walter Buchner for his help in testing this). Since switching channels now no longer explicitly waits for a channel lock in the foreground thread, the "panic level" mechanism is no longer used (maybe we don't need it any more, anyway). - The keyboard is now by default always active to control VDR. The 'make' option REMOTE=KBD is therefore obsolete. When compiling VDR with REMOTE=RCU or REMOTE=LIRC, the keyboard can thus now be active together with the remote control. If you want to build VDR _without_ keyboard support you can set NO_KBD=1 in the 'make' call. Since the keyboard codes are now different from the ones used previously (which were mapped by the 'ncurses' library) you will need to go through the "Learning keys" procedure again. To do so, either delete the file /video/remote.conf or remove the KBD.* entries from it before starting this version of VDR. (Thanks to Thomas Sailer for pointing out how to set the terminal parameters to read from the keyboard). - The 'ncurses' library is now only necessary when compiling VDR with DEBUG_OSD=1.
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