mirror of
				https://github.com/vdr-projects/vdr.git
				synced 2025-03-01 10:50:46 +00:00 
			
		
		
		
	Macros in 'keymacros.conf' can now use "@plugin" to directly access the main menu function of a given plugin
This commit is contained in:
		
							
								
								
									
										4
									
								
								HISTORY
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								HISTORY
									
									
									
									
									
								
							@@ -1813,7 +1813,7 @@ Video Disk Recorder Revision History
 | 
			
		||||
  makes far jumps, so that a lock file might end up with a time stamp that lies
 | 
			
		||||
  in the distant future (thanks to Oliver Endriss).
 | 
			
		||||
 | 
			
		||||
2002-11-30: Version 1.1.18
 | 
			
		||||
2002-12-01: Version 1.1.18
 | 
			
		||||
 | 
			
		||||
- Fixed missing initialization of 'number' in cChannel (thanks to Martin Hammerschmid
 | 
			
		||||
  for reporting this one).
 | 
			
		||||
@@ -1832,3 +1832,5 @@ Video Disk Recorder Revision History
 | 
			
		||||
  for reporting this one).
 | 
			
		||||
- Now taking an active SVDRP connection into account when doing shutdown or
 | 
			
		||||
  housekeeping (suggested by Emil Naepflein).
 | 
			
		||||
- Macros in 'keymacros.conf' can now use "@plugin" to directly access the main menu
 | 
			
		||||
  function of a given plugin (see man vdr(5) for details).
 | 
			
		||||
 
 | 
			
		||||
@@ -3,6 +3,7 @@
 | 
			
		||||
# Format:
 | 
			
		||||
#
 | 
			
		||||
# macrokey  key1 key2 key3...
 | 
			
		||||
# macrokey  @plugin key1 key2 key3...
 | 
			
		||||
#
 | 
			
		||||
# See man vdr(5)
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										42
									
								
								keys.c
									
									
									
									
									
								
							
							
						
						
									
										42
									
								
								keys.c
									
									
									
									
									
								
							@@ -4,10 +4,11 @@
 | 
			
		||||
 * See the main source file 'vdr.c' for copyright information and
 | 
			
		||||
 * how to reach the author.
 | 
			
		||||
 *
 | 
			
		||||
 * $Id: keys.c 1.3 2002/10/27 15:19:40 kls Exp $
 | 
			
		||||
 * $Id: keys.c 1.4 2002/11/30 16:01:37 kls Exp $
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "keys.h"
 | 
			
		||||
#include "plugin.h"
 | 
			
		||||
 | 
			
		||||
static tKey keyTable[] = { // "Up" and "Down" must be the first two keys!
 | 
			
		||||
                    { kUp,            "Up"         },
 | 
			
		||||
@@ -182,6 +183,12 @@ cKeyMacro::cKeyMacro(void)
 | 
			
		||||
{
 | 
			
		||||
  for (int i = 0; i < MAXKEYSINMACRO; i++)
 | 
			
		||||
      macro[i] = kNone;
 | 
			
		||||
  plugin = NULL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
cKeyMacro::~cKeyMacro()
 | 
			
		||||
{
 | 
			
		||||
  free(plugin);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool cKeyMacro::Parse(char *s)
 | 
			
		||||
@@ -190,10 +197,35 @@ bool cKeyMacro::Parse(char *s)
 | 
			
		||||
  char *p;
 | 
			
		||||
  while ((p = strtok(s, " \t")) != NULL) {
 | 
			
		||||
        if (n < MAXKEYSINMACRO) {
 | 
			
		||||
           macro[n] = cKey::FromString(p);
 | 
			
		||||
           if (macro[n] == kNone) {
 | 
			
		||||
              esyslog("ERROR: unknown key '%s'", p);
 | 
			
		||||
              return false;
 | 
			
		||||
           if (*p == '@') {
 | 
			
		||||
              if (plugin) {
 | 
			
		||||
                 esyslog("ERROR: only one @plugin allowed per macro");
 | 
			
		||||
                 return false;
 | 
			
		||||
                 }
 | 
			
		||||
              if (!n) {
 | 
			
		||||
                 esyslog("ERROR: @plugin can't be first in macro");
 | 
			
		||||
                 return false;
 | 
			
		||||
                 }
 | 
			
		||||
              macro[n++] = k_Plugin;
 | 
			
		||||
              if (n < MAXKEYSINMACRO) {
 | 
			
		||||
                 macro[n] = kOk;
 | 
			
		||||
                 plugin = strdup(p + 1);
 | 
			
		||||
                 if (!cPluginManager::GetPlugin(plugin)) {
 | 
			
		||||
                    esyslog("ERROR: unknown plugin '%s'", plugin);
 | 
			
		||||
                    return false;
 | 
			
		||||
                    }
 | 
			
		||||
                 }
 | 
			
		||||
              else {
 | 
			
		||||
                 esyslog("ERROR: key macro too long");
 | 
			
		||||
                 return false;
 | 
			
		||||
                 }
 | 
			
		||||
              }
 | 
			
		||||
           else {
 | 
			
		||||
              macro[n] = cKey::FromString(p);
 | 
			
		||||
              if (macro[n] == kNone) {
 | 
			
		||||
                 esyslog("ERROR: unknown key '%s'", p);
 | 
			
		||||
                 return false;
 | 
			
		||||
                 }
 | 
			
		||||
              }
 | 
			
		||||
           n++;
 | 
			
		||||
           s = NULL;
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										7
									
								
								keys.h
									
									
									
									
									
								
							
							
						
						
									
										7
									
								
								keys.h
									
									
									
									
									
								
							@@ -4,7 +4,7 @@
 | 
			
		||||
 * See the main source file 'vdr.c' for copyright information and
 | 
			
		||||
 * how to reach the author.
 | 
			
		||||
 *
 | 
			
		||||
 * $Id: keys.h 1.3 2002/10/27 15:18:21 kls Exp $
 | 
			
		||||
 * $Id: keys.h 1.4 2002/12/01 10:43:26 kls Exp $
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef __KEYS_H
 | 
			
		||||
@@ -46,6 +46,8 @@ enum eKeys { // "Up" and "Down" must be the first two keys!
 | 
			
		||||
             kCommands,
 | 
			
		||||
             kUser1, kUser2, kUser3, kUser4, kUser5, kUser6, kUser7, kUser8, kUser9,
 | 
			
		||||
             kNone,
 | 
			
		||||
             // The following codes are used internally:
 | 
			
		||||
             k_Plugin,
 | 
			
		||||
             k_Setup,
 | 
			
		||||
             // The following flags are OR'd with the above codes:
 | 
			
		||||
             k_Repeat  = 0x8000,
 | 
			
		||||
@@ -105,10 +107,13 @@ extern cKeys Keys;
 | 
			
		||||
class cKeyMacro : public cListObject {
 | 
			
		||||
private:
 | 
			
		||||
  eKeys macro[MAXKEYSINMACRO];
 | 
			
		||||
  char *plugin;
 | 
			
		||||
public:
 | 
			
		||||
  cKeyMacro(void);
 | 
			
		||||
  ~cKeyMacro();
 | 
			
		||||
  bool Parse(char *s);
 | 
			
		||||
  const eKeys *Macro(void) const { return macro; }
 | 
			
		||||
  const char *Plugin(void) const { return plugin; }
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
class cKeyMacros : public cConfig<cKeyMacro> {
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										11
									
								
								menu.c
									
									
									
									
									
								
							
							
						
						
									
										11
									
								
								menu.c
									
									
									
									
									
								
							@@ -4,7 +4,7 @@
 | 
			
		||||
 * See the main source file 'vdr.c' for copyright information and
 | 
			
		||||
 * how to reach the author.
 | 
			
		||||
 *
 | 
			
		||||
 * $Id: menu.c 1.227 2002/11/29 14:06:38 kls Exp $
 | 
			
		||||
 * $Id: menu.c 1.228 2002/12/01 10:31:55 kls Exp $
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "menu.h"
 | 
			
		||||
@@ -2178,11 +2178,11 @@ cMenuPluginItem::cMenuPluginItem(const char *Name, int Index)
 | 
			
		||||
 | 
			
		||||
cOsdObject *cMenuMain::pluginOsdObject = NULL;
 | 
			
		||||
 | 
			
		||||
cMenuMain::cMenuMain(bool Replaying, eOSState State)
 | 
			
		||||
cMenuMain::cMenuMain(bool Replaying, eOSState State, const char *Plugin)
 | 
			
		||||
:cOsdMenu("")
 | 
			
		||||
{
 | 
			
		||||
  replaying = Replaying;
 | 
			
		||||
  Set();
 | 
			
		||||
  Set(Plugin);
 | 
			
		||||
 | 
			
		||||
  // Initial submenus:
 | 
			
		||||
 | 
			
		||||
@@ -2193,6 +2193,7 @@ cMenuMain::cMenuMain(bool Replaying, eOSState State)
 | 
			
		||||
    case osRecordings: AddSubMenu(new cMenuRecordings(NULL, 0, true)); break;
 | 
			
		||||
    case osSetup:      AddSubMenu(new cMenuSetup); break;
 | 
			
		||||
    case osCommands:   AddSubMenu(new cMenuCommands(tr("Commands"), &Commands)); break;
 | 
			
		||||
    case osPlugin:     break; // the actual work is done in Set()
 | 
			
		||||
    default: break;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -2204,7 +2205,7 @@ cOsdObject *cMenuMain::PluginOsdObject(void)
 | 
			
		||||
  return o;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void cMenuMain::Set(void)
 | 
			
		||||
void cMenuMain::Set(const char *Plugin)
 | 
			
		||||
{
 | 
			
		||||
  Clear();
 | 
			
		||||
  //SetTitle("VDR"); // this is done below, including disk usage
 | 
			
		||||
@@ -2237,7 +2238,7 @@ void cMenuMain::Set(void)
 | 
			
		||||
      if (p) {
 | 
			
		||||
         const char *item = p->MainMenuEntry();
 | 
			
		||||
         if (item)
 | 
			
		||||
            Add(new cMenuPluginItem(hk(item), i));
 | 
			
		||||
            Add(new cMenuPluginItem(hk(item), i), Plugin && strcmp(Plugin, p->Name()) == 0);
 | 
			
		||||
         }
 | 
			
		||||
      else
 | 
			
		||||
         break;
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										6
									
								
								menu.h
									
									
									
									
									
								
							
							
						
						
									
										6
									
								
								menu.h
									
									
									
									
									
								
							@@ -4,7 +4,7 @@
 | 
			
		||||
 * See the main source file 'vdr.c' for copyright information and
 | 
			
		||||
 * how to reach the author.
 | 
			
		||||
 *
 | 
			
		||||
 * $Id: menu.h 1.50 2002/11/23 14:51:32 kls Exp $
 | 
			
		||||
 * $Id: menu.h 1.51 2002/11/30 15:55:39 kls Exp $
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef __MENU_H
 | 
			
		||||
@@ -21,9 +21,9 @@ private:
 | 
			
		||||
  time_t lastActivity;
 | 
			
		||||
  bool replaying;
 | 
			
		||||
  static cOsdObject *pluginOsdObject;
 | 
			
		||||
  void Set(void);
 | 
			
		||||
  void Set(const char *Plugin = NULL);
 | 
			
		||||
public:
 | 
			
		||||
  cMenuMain(bool Replaying, eOSState State = osUnknown);
 | 
			
		||||
  cMenuMain(bool Replaying, eOSState State = osUnknown, const char *Plugin = NULL);
 | 
			
		||||
  virtual eOSState ProcessKey(eKeys Key);
 | 
			
		||||
  static cOsdObject *PluginOsdObject(void);
 | 
			
		||||
  };
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										4
									
								
								remote.c
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								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.31 2002/11/01 10:50:13 kls Exp $
 | 
			
		||||
 * $Id: remote.c 1.32 2002/12/01 10:40:04 kls Exp $
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "remote.h"
 | 
			
		||||
@@ -31,6 +31,7 @@ cRemote *cRemote::learning = NULL;
 | 
			
		||||
char *cRemote::unknownCode = NULL;
 | 
			
		||||
cMutex cRemote::mutex;
 | 
			
		||||
cCondVar cRemote::keyPressed;
 | 
			
		||||
const char *cRemote::plugin = NULL;
 | 
			
		||||
 | 
			
		||||
cRemote::cRemote(const char *Name)
 | 
			
		||||
{
 | 
			
		||||
@@ -88,6 +89,7 @@ bool cRemote::PutMacro(eKeys Key)
 | 
			
		||||
{
 | 
			
		||||
  const cKeyMacro *km = KeyMacros.Get(Key);
 | 
			
		||||
  if (km) {
 | 
			
		||||
     plugin = km->Plugin();
 | 
			
		||||
     for (int i = 1; i < MAXKEYSINMACRO; i++) {
 | 
			
		||||
         if (km->Macro()[i] != kNone) {
 | 
			
		||||
            if (!Put(km->Macro()[i]))
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										4
									
								
								remote.h
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								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.20 2002/11/09 11:07:33 kls Exp $
 | 
			
		||||
 * $Id: remote.h 1.21 2002/12/01 10:39:10 kls Exp $
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef __REMOTE_H
 | 
			
		||||
@@ -26,6 +26,7 @@ private:
 | 
			
		||||
  static char *unknownCode;
 | 
			
		||||
  static cMutex mutex;
 | 
			
		||||
  static cCondVar keyPressed;
 | 
			
		||||
  static const char *plugin;
 | 
			
		||||
  char *name;
 | 
			
		||||
protected:
 | 
			
		||||
  cRemote(const char *Name);
 | 
			
		||||
@@ -41,6 +42,7 @@ public:
 | 
			
		||||
  static void Clear(void);
 | 
			
		||||
  static bool Put(eKeys Key);
 | 
			
		||||
  static bool PutMacro(eKeys Key);
 | 
			
		||||
  static const char *GetPlugin(void) { return plugin; }
 | 
			
		||||
  static eKeys Get(int WaitMs = 1000, char **UnknownCode = NULL);
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										19
									
								
								vdr.5
									
									
									
									
									
								
							
							
						
						
									
										19
									
								
								vdr.5
									
									
									
									
									
								
							@@ -8,7 +8,7 @@
 | 
			
		||||
.\" License as specified in the file COPYING that comes with the
 | 
			
		||||
.\" vdr distribution.
 | 
			
		||||
.\"
 | 
			
		||||
.\" $Id: vdr.5 1.15 2002/11/29 14:13:40 kls Exp $
 | 
			
		||||
.\" $Id: vdr.5 1.16 2002/12/01 10:34:40 kls Exp $
 | 
			
		||||
.\"
 | 
			
		||||
.TH vdr 5 "24 Nov 2002" "1.2.0" "Video Disk Recorder Files"
 | 
			
		||||
.SH NAME
 | 
			
		||||
@@ -363,13 +363,26 @@ this remote control delivers when the given key is pressed.
 | 
			
		||||
The file \fIkeymacros.conf\fR contains user defined macros that will be executed
 | 
			
		||||
whenever the given key is pressed. The format is
 | 
			
		||||
 | 
			
		||||
\fBmacrokey  key1 key2 key3...\fR
 | 
			
		||||
\fBmacrokey  [@plugin] key1 key2 key3...\fR
 | 
			
		||||
 | 
			
		||||
where \fBmacrokey\fR is the key that shall initiate execution of this macro
 | 
			
		||||
and can be one of \fIRed\fR, \fIGreen\fR, \fIYellow\fR, \fIBlue\fR or
 | 
			
		||||
\fIUser1\fR...\fIUser9\fR. The rest of the line consists of a set of
 | 
			
		||||
keys, which will be executed just as if they had been pressed in the given
 | 
			
		||||
sequence. Note that the color keys will only execute their macro function
 | 
			
		||||
sequence. The optional \fB@plugin\fR can be used to automatically select
 | 
			
		||||
the given plugin from the main menu (provided that plugin has a main menu
 | 
			
		||||
entry). \fBplugin\fR is the name of the plugin, exactly as given in the -P
 | 
			
		||||
option when starting VDR. There can be only one \fB@plugin\fR per key macro,
 | 
			
		||||
and it implicitly adds an \fIOk\fR key to the macro definition (in order to
 | 
			
		||||
actually select the plugins main menu entry), which counts against the total
 | 
			
		||||
number of keys in the macro. For instance
 | 
			
		||||
 | 
			
		||||
\fBUser1 @abc Down Down Ok\fR
 | 
			
		||||
 | 
			
		||||
would call the main menu function of the "abc" plugin and execute two "Down"
 | 
			
		||||
key presses, followed by "Ok".
 | 
			
		||||
.br
 | 
			
		||||
Note that the color keys will only execute their macro function
 | 
			
		||||
in "normal viewing" mode (i.e. when no other menu or player is active). The
 | 
			
		||||
\fIUser1\fR...\fIUser9\fR keys will always execute their macro function.
 | 
			
		||||
There may be up to 15 keys in such a key sequence.
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										5
									
								
								vdr.c
									
									
									
									
									
								
							
							
						
						
									
										5
									
								
								vdr.c
									
									
									
									
									
								
							@@ -22,7 +22,7 @@
 | 
			
		||||
 *
 | 
			
		||||
 * The project's page is at http://www.cadsoft.de/people/kls/vdr
 | 
			
		||||
 *
 | 
			
		||||
 * $Id: vdr.c 1.135 2002/11/30 14:37:45 kls Exp $
 | 
			
		||||
 * $Id: vdr.c 1.136 2002/12/01 10:44:48 kls Exp $
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include <getopt.h>
 | 
			
		||||
@@ -480,7 +480,7 @@ int main(int argc, char *argv[])
 | 
			
		||||
               Menu = new cMenuMain(cControl::Control());
 | 
			
		||||
               Temp = NULL;
 | 
			
		||||
               break;
 | 
			
		||||
          #define DirectMainFunction(function)\
 | 
			
		||||
          #define DirectMainFunction(function...)\
 | 
			
		||||
            DELETENULL(Menu);\
 | 
			
		||||
            if (cControl::Control())\
 | 
			
		||||
               cControl::Control()->Hide();\
 | 
			
		||||
@@ -493,6 +493,7 @@ int main(int argc, char *argv[])
 | 
			
		||||
          case kSetup:      DirectMainFunction(osSetup); break;
 | 
			
		||||
          case kCommands:   DirectMainFunction(osCommands); break;
 | 
			
		||||
          case kUser1 ... kUser9: cRemote::PutMacro(key); break;
 | 
			
		||||
          case k_Plugin:    DirectMainFunction(osPlugin, cRemote::GetPlugin()); break;
 | 
			
		||||
          // Channel up/down:
 | 
			
		||||
          case kChanUp|k_Repeat:
 | 
			
		||||
          case kChanUp:
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user