mirror of
https://github.com/VDR4Arch/vdr.git
synced 2023-10-10 13:36:52 +02: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:
parent
125872e75f
commit
816e6847aa
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
|
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).
|
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
|
- Fixed missing initialization of 'number' in cChannel (thanks to Martin Hammerschmid
|
||||||
for reporting this one).
|
for reporting this one).
|
||||||
@ -1832,3 +1832,5 @@ Video Disk Recorder Revision History
|
|||||||
for reporting this one).
|
for reporting this one).
|
||||||
- Now taking an active SVDRP connection into account when doing shutdown or
|
- Now taking an active SVDRP connection into account when doing shutdown or
|
||||||
housekeeping (suggested by Emil Naepflein).
|
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:
|
# Format:
|
||||||
#
|
#
|
||||||
# macrokey key1 key2 key3...
|
# macrokey key1 key2 key3...
|
||||||
|
# macrokey @plugin key1 key2 key3...
|
||||||
#
|
#
|
||||||
# See man vdr(5)
|
# 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
|
* See the main source file 'vdr.c' for copyright information and
|
||||||
* how to reach the author.
|
* 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 "keys.h"
|
||||||
|
#include "plugin.h"
|
||||||
|
|
||||||
static tKey keyTable[] = { // "Up" and "Down" must be the first two keys!
|
static tKey keyTable[] = { // "Up" and "Down" must be the first two keys!
|
||||||
{ kUp, "Up" },
|
{ kUp, "Up" },
|
||||||
@ -182,6 +183,12 @@ cKeyMacro::cKeyMacro(void)
|
|||||||
{
|
{
|
||||||
for (int i = 0; i < MAXKEYSINMACRO; i++)
|
for (int i = 0; i < MAXKEYSINMACRO; i++)
|
||||||
macro[i] = kNone;
|
macro[i] = kNone;
|
||||||
|
plugin = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
cKeyMacro::~cKeyMacro()
|
||||||
|
{
|
||||||
|
free(plugin);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool cKeyMacro::Parse(char *s)
|
bool cKeyMacro::Parse(char *s)
|
||||||
@ -190,10 +197,35 @@ bool cKeyMacro::Parse(char *s)
|
|||||||
char *p;
|
char *p;
|
||||||
while ((p = strtok(s, " \t")) != NULL) {
|
while ((p = strtok(s, " \t")) != NULL) {
|
||||||
if (n < MAXKEYSINMACRO) {
|
if (n < MAXKEYSINMACRO) {
|
||||||
macro[n] = cKey::FromString(p);
|
if (*p == '@') {
|
||||||
if (macro[n] == kNone) {
|
if (plugin) {
|
||||||
esyslog("ERROR: unknown key '%s'", p);
|
esyslog("ERROR: only one @plugin allowed per macro");
|
||||||
return false;
|
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++;
|
n++;
|
||||||
s = NULL;
|
s = NULL;
|
||||||
|
7
keys.h
7
keys.h
@ -4,7 +4,7 @@
|
|||||||
* See the main source file 'vdr.c' for copyright information and
|
* See the main source file 'vdr.c' for copyright information and
|
||||||
* how to reach the author.
|
* 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
|
#ifndef __KEYS_H
|
||||||
@ -46,6 +46,8 @@ enum eKeys { // "Up" and "Down" must be the first two keys!
|
|||||||
kCommands,
|
kCommands,
|
||||||
kUser1, kUser2, kUser3, kUser4, kUser5, kUser6, kUser7, kUser8, kUser9,
|
kUser1, kUser2, kUser3, kUser4, kUser5, kUser6, kUser7, kUser8, kUser9,
|
||||||
kNone,
|
kNone,
|
||||||
|
// The following codes are used internally:
|
||||||
|
k_Plugin,
|
||||||
k_Setup,
|
k_Setup,
|
||||||
// The following flags are OR'd with the above codes:
|
// The following flags are OR'd with the above codes:
|
||||||
k_Repeat = 0x8000,
|
k_Repeat = 0x8000,
|
||||||
@ -105,10 +107,13 @@ extern cKeys Keys;
|
|||||||
class cKeyMacro : public cListObject {
|
class cKeyMacro : public cListObject {
|
||||||
private:
|
private:
|
||||||
eKeys macro[MAXKEYSINMACRO];
|
eKeys macro[MAXKEYSINMACRO];
|
||||||
|
char *plugin;
|
||||||
public:
|
public:
|
||||||
cKeyMacro(void);
|
cKeyMacro(void);
|
||||||
|
~cKeyMacro();
|
||||||
bool Parse(char *s);
|
bool Parse(char *s);
|
||||||
const eKeys *Macro(void) const { return macro; }
|
const eKeys *Macro(void) const { return macro; }
|
||||||
|
const char *Plugin(void) const { return plugin; }
|
||||||
};
|
};
|
||||||
|
|
||||||
class cKeyMacros : public cConfig<cKeyMacro> {
|
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
|
* See the main source file 'vdr.c' for copyright information and
|
||||||
* how to reach the author.
|
* 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"
|
#include "menu.h"
|
||||||
@ -2178,11 +2178,11 @@ cMenuPluginItem::cMenuPluginItem(const char *Name, int Index)
|
|||||||
|
|
||||||
cOsdObject *cMenuMain::pluginOsdObject = NULL;
|
cOsdObject *cMenuMain::pluginOsdObject = NULL;
|
||||||
|
|
||||||
cMenuMain::cMenuMain(bool Replaying, eOSState State)
|
cMenuMain::cMenuMain(bool Replaying, eOSState State, const char *Plugin)
|
||||||
:cOsdMenu("")
|
:cOsdMenu("")
|
||||||
{
|
{
|
||||||
replaying = Replaying;
|
replaying = Replaying;
|
||||||
Set();
|
Set(Plugin);
|
||||||
|
|
||||||
// Initial submenus:
|
// Initial submenus:
|
||||||
|
|
||||||
@ -2193,6 +2193,7 @@ cMenuMain::cMenuMain(bool Replaying, eOSState State)
|
|||||||
case osRecordings: AddSubMenu(new cMenuRecordings(NULL, 0, true)); break;
|
case osRecordings: AddSubMenu(new cMenuRecordings(NULL, 0, true)); break;
|
||||||
case osSetup: AddSubMenu(new cMenuSetup); break;
|
case osSetup: AddSubMenu(new cMenuSetup); break;
|
||||||
case osCommands: AddSubMenu(new cMenuCommands(tr("Commands"), &Commands)); break;
|
case osCommands: AddSubMenu(new cMenuCommands(tr("Commands"), &Commands)); break;
|
||||||
|
case osPlugin: break; // the actual work is done in Set()
|
||||||
default: break;
|
default: break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2204,7 +2205,7 @@ cOsdObject *cMenuMain::PluginOsdObject(void)
|
|||||||
return o;
|
return o;
|
||||||
}
|
}
|
||||||
|
|
||||||
void cMenuMain::Set(void)
|
void cMenuMain::Set(const char *Plugin)
|
||||||
{
|
{
|
||||||
Clear();
|
Clear();
|
||||||
//SetTitle("VDR"); // this is done below, including disk usage
|
//SetTitle("VDR"); // this is done below, including disk usage
|
||||||
@ -2237,7 +2238,7 @@ void cMenuMain::Set(void)
|
|||||||
if (p) {
|
if (p) {
|
||||||
const char *item = p->MainMenuEntry();
|
const char *item = p->MainMenuEntry();
|
||||||
if (item)
|
if (item)
|
||||||
Add(new cMenuPluginItem(hk(item), i));
|
Add(new cMenuPluginItem(hk(item), i), Plugin && strcmp(Plugin, p->Name()) == 0);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
break;
|
break;
|
||||||
|
6
menu.h
6
menu.h
@ -4,7 +4,7 @@
|
|||||||
* See the main source file 'vdr.c' for copyright information and
|
* See the main source file 'vdr.c' for copyright information and
|
||||||
* how to reach the author.
|
* 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
|
#ifndef __MENU_H
|
||||||
@ -21,9 +21,9 @@ private:
|
|||||||
time_t lastActivity;
|
time_t lastActivity;
|
||||||
bool replaying;
|
bool replaying;
|
||||||
static cOsdObject *pluginOsdObject;
|
static cOsdObject *pluginOsdObject;
|
||||||
void Set(void);
|
void Set(const char *Plugin = NULL);
|
||||||
public:
|
public:
|
||||||
cMenuMain(bool Replaying, eOSState State = osUnknown);
|
cMenuMain(bool Replaying, eOSState State = osUnknown, const char *Plugin = NULL);
|
||||||
virtual eOSState ProcessKey(eKeys Key);
|
virtual eOSState ProcessKey(eKeys Key);
|
||||||
static cOsdObject *PluginOsdObject(void);
|
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
|
* See the main source file 'vdr.c' for copyright information and
|
||||||
* how to reach the author.
|
* 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"
|
#include "remote.h"
|
||||||
@ -31,6 +31,7 @@ cRemote *cRemote::learning = NULL;
|
|||||||
char *cRemote::unknownCode = NULL;
|
char *cRemote::unknownCode = NULL;
|
||||||
cMutex cRemote::mutex;
|
cMutex cRemote::mutex;
|
||||||
cCondVar cRemote::keyPressed;
|
cCondVar cRemote::keyPressed;
|
||||||
|
const char *cRemote::plugin = NULL;
|
||||||
|
|
||||||
cRemote::cRemote(const char *Name)
|
cRemote::cRemote(const char *Name)
|
||||||
{
|
{
|
||||||
@ -88,6 +89,7 @@ bool cRemote::PutMacro(eKeys Key)
|
|||||||
{
|
{
|
||||||
const cKeyMacro *km = KeyMacros.Get(Key);
|
const cKeyMacro *km = KeyMacros.Get(Key);
|
||||||
if (km) {
|
if (km) {
|
||||||
|
plugin = km->Plugin();
|
||||||
for (int i = 1; i < MAXKEYSINMACRO; i++) {
|
for (int i = 1; i < MAXKEYSINMACRO; i++) {
|
||||||
if (km->Macro()[i] != kNone) {
|
if (km->Macro()[i] != kNone) {
|
||||||
if (!Put(km->Macro()[i]))
|
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
|
* See the main source file 'vdr.c' for copyright information and
|
||||||
* how to reach the author.
|
* 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
|
#ifndef __REMOTE_H
|
||||||
@ -26,6 +26,7 @@ private:
|
|||||||
static char *unknownCode;
|
static char *unknownCode;
|
||||||
static cMutex mutex;
|
static cMutex mutex;
|
||||||
static cCondVar keyPressed;
|
static cCondVar keyPressed;
|
||||||
|
static const char *plugin;
|
||||||
char *name;
|
char *name;
|
||||||
protected:
|
protected:
|
||||||
cRemote(const char *Name);
|
cRemote(const char *Name);
|
||||||
@ -41,6 +42,7 @@ public:
|
|||||||
static void Clear(void);
|
static void Clear(void);
|
||||||
static bool Put(eKeys Key);
|
static bool Put(eKeys Key);
|
||||||
static bool PutMacro(eKeys Key);
|
static bool PutMacro(eKeys Key);
|
||||||
|
static const char *GetPlugin(void) { return plugin; }
|
||||||
static eKeys Get(int WaitMs = 1000, char **UnknownCode = NULL);
|
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
|
.\" License as specified in the file COPYING that comes with the
|
||||||
.\" vdr distribution.
|
.\" 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"
|
.TH vdr 5 "24 Nov 2002" "1.2.0" "Video Disk Recorder Files"
|
||||||
.SH NAME
|
.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
|
The file \fIkeymacros.conf\fR contains user defined macros that will be executed
|
||||||
whenever the given key is pressed. The format is
|
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
|
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
|
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
|
\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
|
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
|
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.
|
\fIUser1\fR...\fIUser9\fR keys will always execute their macro function.
|
||||||
There may be up to 15 keys in such a key sequence.
|
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
|
* 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>
|
#include <getopt.h>
|
||||||
@ -480,7 +480,7 @@ int main(int argc, char *argv[])
|
|||||||
Menu = new cMenuMain(cControl::Control());
|
Menu = new cMenuMain(cControl::Control());
|
||||||
Temp = NULL;
|
Temp = NULL;
|
||||||
break;
|
break;
|
||||||
#define DirectMainFunction(function)\
|
#define DirectMainFunction(function...)\
|
||||||
DELETENULL(Menu);\
|
DELETENULL(Menu);\
|
||||||
if (cControl::Control())\
|
if (cControl::Control())\
|
||||||
cControl::Control()->Hide();\
|
cControl::Control()->Hide();\
|
||||||
@ -493,6 +493,7 @@ int main(int argc, char *argv[])
|
|||||||
case kSetup: DirectMainFunction(osSetup); break;
|
case kSetup: DirectMainFunction(osSetup); break;
|
||||||
case kCommands: DirectMainFunction(osCommands); break;
|
case kCommands: DirectMainFunction(osCommands); break;
|
||||||
case kUser1 ... kUser9: cRemote::PutMacro(key); break;
|
case kUser1 ... kUser9: cRemote::PutMacro(key); break;
|
||||||
|
case k_Plugin: DirectMainFunction(osPlugin, cRemote::GetPlugin()); break;
|
||||||
// Channel up/down:
|
// Channel up/down:
|
||||||
case kChanUp|k_Repeat:
|
case kChanUp|k_Repeat:
|
||||||
case kChanUp:
|
case kChanUp:
|
||||||
|
Loading…
Reference in New Issue
Block a user