diff --git a/mythtv/libs/libmythservicecontracts/services/frontendServices.h b/mythtv/libs/libmythservicecontracts/services/frontendServices.h index 00cfda5..2eb4933 100644 --- a/mythtv/libs/libmythservicecontracts/services/frontendServices.h +++ b/mythtv/libs/libmythservicecontracts/services/frontendServices.h @@ -8,12 +8,13 @@ class SERVICE_PUBLIC FrontendServices : public Service { Q_OBJECT - Q_CLASSINFO( "version", "2.0" ); + Q_CLASSINFO( "version", "2.1" ); Q_CLASSINFO( "SendMessage_Method", "POST" ) Q_CLASSINFO( "SendNotification_Method", "POST" ) Q_CLASSINFO( "SendAction_Method", "POST" ) Q_CLASSINFO( "PlayRecording_Method", "POST" ) Q_CLASSINFO( "PlayVideo_Method", "POST" ) + Q_CLASSINFO( "SendKey_Method", "POST" ) public: @@ -50,6 +51,7 @@ class SERVICE_PUBLIC FrontendServices : public Service bool UseBookmark) = 0; virtual QStringList GetContextList(void) = 0; virtual DTC::FrontendActionList* GetActionList(const QString &Context) = 0; + virtual bool SendKey(const QString &Key) = 0; }; diff --git a/mythtv/programs/mythfrontend/services/frontend.cpp b/mythtv/programs/mythfrontend/services/frontend.cpp index de4f3c8..83621fd 100644 --- a/mythtv/programs/mythfrontend/services/frontend.cpp +++ b/mythtv/programs/mythfrontend/services/frontend.cpp @@ -1,5 +1,6 @@ #include #include +#include #include // for usleep @@ -315,3 +316,124 @@ void Frontend::InitialiseActions(void) foreach (QString actions, gActionList) LOG(VB_GENERAL, LOG_DEBUG, LOC + QString("Action: %1").arg(actions)); } + +bool Frontend::SendKey(const QString &sKey) +{ + int keyCode; + int ret = false; + QObject *keyDest = NULL; + QKeyEvent *event = NULL; + QMap keyMap; + QString keyText; + QString msg; + + keyMap["up"] = Qt::Key_Up; + keyMap["down"] = Qt::Key_Down; + keyMap["left"] = Qt::Key_Left; + keyMap["right"] = Qt::Key_Right; + keyMap["home"] = Qt::Key_Home; + keyMap["end"] = Qt::Key_End; + keyMap["enter"] = Qt::Key_Enter; + keyMap["return"] = Qt::Key_Return; + keyMap["pageup"] = Qt::Key_PageUp; + keyMap["pagedown"] = Qt::Key_PageDown; + keyMap["escape"] = Qt::Key_Escape; + keyMap["tab"] = Qt::Key_Tab; + keyMap["backtab"] = Qt::Key_Backtab; + keyMap["space"] = Qt::Key_Space; + keyMap["backspace"] = Qt::Key_Backspace; + keyMap["insert"] = Qt::Key_Insert; + keyMap["delete"] = Qt::Key_Delete; + keyMap["plus"] = Qt::Key_Plus; + keyMap["comma"] = Qt::Key_Comma; + keyMap["minus"] = Qt::Key_Minus; + keyMap["underscore"] = Qt::Key_Underscore; + keyMap["period"] = Qt::Key_Period; + keyMap["numbersign"] = Qt::Key_NumberSign; + keyMap["poundsign"] = Qt::Key_NumberSign; + keyMap["hash"] = Qt::Key_NumberSign; + keyMap["bracketleft"] = Qt::Key_BracketLeft; + keyMap["bracketright"] = Qt::Key_BracketRight; + keyMap["backslash"] = Qt::Key_Backslash; + keyMap["dollar"] = Qt::Key_Dollar; + keyMap["percent"] = Qt::Key_Percent; + keyMap["ampersand"] = Qt::Key_Ampersand; + keyMap["parenleft"] = Qt::Key_ParenLeft; + keyMap["parenright"] = Qt::Key_ParenRight; + keyMap["asterisk"] = Qt::Key_Asterisk; + keyMap["question"] = Qt::Key_Question; + keyMap["slash"] = Qt::Key_Slash; + keyMap["colon"] = Qt::Key_Colon; + keyMap["semicolon"] = Qt::Key_Semicolon; + keyMap["less"] = Qt::Key_Less; + keyMap["equal"] = Qt::Key_Equal; + keyMap["greater"] = Qt::Key_Greater; + keyMap["f1"] = Qt::Key_F1; + keyMap["f2"] = Qt::Key_F2; + keyMap["f3"] = Qt::Key_F3; + keyMap["f4"] = Qt::Key_F4; + keyMap["f5"] = Qt::Key_F5; + keyMap["f6"] = Qt::Key_F6; + keyMap["f7"] = Qt::Key_F7; + keyMap["f8"] = Qt::Key_F8; + keyMap["f9"] = Qt::Key_F9; + keyMap["f10"] = Qt::Key_F10; + keyMap["f11"] = Qt::Key_F11; + keyMap["f12"] = Qt::Key_F12; + keyMap["f13"] = Qt::Key_F13; + keyMap["f14"] = Qt::Key_F14; + keyMap["f15"] = Qt::Key_F15; + keyMap["f16"] = Qt::Key_F16; + keyMap["f17"] = Qt::Key_F17; + keyMap["f18"] = Qt::Key_F18; + keyMap["f19"] = Qt::Key_F19; + keyMap["f20"] = Qt::Key_F20; + keyMap["f21"] = Qt::Key_F21; + keyMap["f22"] = Qt::Key_F22; + keyMap["f23"] = Qt::Key_F23; + keyMap["f24"] = Qt::Key_F24; + + if (GetMythMainWindow()) + keyDest = GetMythMainWindow(); + else + { + LOG(VB_UPNP, LOG_WARNING, + LOC + QString("ERROR: Application has no main window!")); + return ret; + } + + if (GetMythMainWindow()->currentWidget()) + keyDest = GetMythMainWindow()->currentWidget()->focusWidget(); + + if (!sKey.isEmpty() && keyMap.contains(sKey.toLower())) + { + keyCode = keyMap[sKey.toLower()]; + ret = true; + } + else if (sKey.size() == 1) + { + keyCode = (int) sKey.toAscii().data()[0] & 0x7f; + ret = true; + } + else + msg = QString("Unknown Key: %1").arg(sKey); + + if (ret) + { + GetMythUI()->ResetScreensaver(); + + event = new QKeyEvent(QEvent::KeyPress, keyCode, Qt::NoModifier, + keyText); + QCoreApplication::postEvent(keyDest, event); + + event = new QKeyEvent(QEvent::KeyRelease, keyCode, Qt::NoModifier, + keyText); + QCoreApplication::postEvent(keyDest, event); + + msg = QString("SendKey sent: %1").arg(sKey); + } + + LOG(VB_UPNP, LOG_INFO, LOC + msg); + + return ret; +} diff --git a/mythtv/programs/mythfrontend/services/frontend.h b/mythtv/programs/mythfrontend/services/frontend.h index 5761faa..41657ab 100644 --- a/mythtv/programs/mythfrontend/services/frontend.h +++ b/mythtv/programs/mythfrontend/services/frontend.h @@ -42,6 +42,7 @@ class Frontend : public FrontendServices static bool IsValidAction(const QString &action); static void InitialiseActions(void); + bool SendKey(const QString &Key); protected: static QStringList gActionList;