[mythtv] [PATCH] MythTV LIRC KeyPress Spawn External App
Dan Morphis
dan at milkcarton.com
Fri Mar 19 22:11:52 EST 2004
This patch allows mythtv to spawn an external app when lirc receives a
key. Why would you want this? Well, some people on the lists have
expressed interest in knowing when the system has received their button
presses. One could use it to toggle a parallel port driven LED. Or as
I do with Enrique Vidal's improved transmitter circuit (which has a led
in it); send a lirc command which causes no action on the cable box, but
causes lirc to pulse dtr thereby lighting up my ir and regular led.
The patch of course defaults to doing nothing if the user hasn't
specified/doesn't want said action to happen. I've attached the sample
script I use to cause the LED in my transmitter circuit to function.
Alternatly, people could build the circuit described in "Re:
[mythtv-users] LED Recording feature" and pulse the parallel port.
Enjoy!
-dan
-------------- next part --------------
Index: libs/libmyth/lirc.cpp
===================================================================
RCS file: /var/lib/mythcvs/mythtv/libs/libmyth/lirc.cpp,v
retrieving revision 1.6
diff -u -d -r1.6 lirc.cpp
--- libs/libmyth/lirc.cpp 25 Jan 2004 08:27:42 -0000 1.6
+++ libs/libmyth/lirc.cpp 20 Mar 2004 02:41:41 -0000
@@ -3,6 +3,9 @@
#include <qkeysequence.h>
#include <cstdio>
#include <cerrno>
+#include "mythcontext.h"
+
+#include <sys/wait.h>
#include <iostream>
using namespace std;
@@ -83,6 +86,39 @@
QApplication::postEvent(mainWindow, new LircKeycodeEvent(code,
keycode, false));
}
+
+ //Spawn app to thwap led (or what ever the user has picked if
+ // anything) to give positive feedback that a key was received
+ QString external_app = gContext->GetSetting("LircKeyPressedApp") + " &";
+ if(external_app != " &")
+ {
+ pid_t child = fork();
+ if (child < 0)
+ {
+ perror("fork");
+ }
+ else if (child == 0)
+ {
+ for(int i = 3; i < sysconf(_SC_OPEN_MAX) - 1; ++i)
+ close(i);
+ execl("/bin/sh", "sh", "-c", external_app.ascii(), NULL);
+ perror("exec");
+ _exit(1);
+ }
+ else
+ {
+ int status;
+ if (waitpid(child, &status, 0) < 0)
+ {
+ perror("waitpid");
+ }
+ else if (status != 0)
+ {
+ cerr << "External key pressed command exited with status "
+ << status << endl;
+ }
+ }
+ }
}
free(ir);
Index: programs/mythfrontend/globalsettings.cpp
===================================================================
RCS file: /var/lib/mythcvs/mythtv/programs/mythfrontend/globalsettings.cpp,v
retrieving revision 1.147
diff -u -d -r1.147 globalsettings.cpp
--- programs/mythfrontend/globalsettings.cpp 14 Mar 2004 07:35:33 -0000 1.147
+++ programs/mythfrontend/globalsettings.cpp 20 Mar 2004 02:41:44 -0000
@@ -958,6 +958,17 @@
};
};
+class LircKeyPressedApp: public LineEditSetting, public GlobalSetting {
+public:
+ LircKeyPressedApp():
+ GlobalSetting("LircKeyPressedApp") {
+ setLabel(QObject::tr("Keypress Application"));
+ setValue("");
+ setHelpText(QObject::tr("External application or script to run when "
+ "a keypress is received by lirc"));
+ };
+};
+
class SetupPinCode: public LineEditSetting, public GlobalSetting {
public:
SetupPinCode():
@@ -1937,6 +1948,7 @@
general->addChild(new AllowQuitShutdown());
general->addChild(new NoPromptOnExit());
general->addChild(new HaltCommand());
+ general->addChild(new LircKeyPressedApp());
general->addChild(new SetupPinCodeRequired());
general->addChild(new SetupPinCode());
general->addChild(new EnableMediaMon());
-------------- next part --------------
#!/bin/sh
REMOTE_NAME=GI #DVD-Panasonic-0490
KEY=EXIT
irsend SEND_ONCE $REMOTE_NAME $KEY
More information about the mythtv-dev
mailing list