Ticket #10053: mythinputevent-2011-10-18.diff

File mythinputevent-2011-10-18.diff, 21.9 KB (added by Xavier Hervy <xavier.hervy@…>, 13 years ago)
  • mythtv/libs/libmythui/libmythui.pro

    diff --git a/mythtv/libs/libmythui/libmythui.pro b/mythtv/libs/libmythui/libmythui.pro
    index 32b839e..869fdba 100644
    a b HEADERS += mythgenerictree.h mythuibuttontree.h mythuiutils.h 
    3030HEADERS += mythvirtualkeyboard.h mythuishape.h mythuiguidegrid.h
    3131HEADERS += mythrender_base.h mythfontmanager.h mythuieditbar.h
    3232HEADERS += mythdisplay.h mythuivideo.h mythudplistener.h
    33 HEADERS += mythuiexp.h
     33HEADERS += mythuiexp.h mythinputmanager.h mythinputevent.h
    3434
    3535SOURCES  = mythmainwindow.cpp mythpainter.cpp mythimage.cpp mythrect.cpp
    3636SOURCES += myththemebase.cpp  mythpainter_qimage.cpp mythpainter_yuva.cpp
    SOURCES += themeinfo.cpp mythxdisplay.cpp DisplayRes.cpp DisplayResScreen.cpp 
    4747SOURCES += mythgenerictree.cpp mythuibuttontree.cpp mythuiutils.cpp
    4848SOURCES += mythvirtualkeyboard.cpp mythuishape.cpp mythuiguidegrid.cpp
    4949SOURCES += mythfontmanager.cpp mythuieditbar.cpp
    50 SOURCES += mythdisplay.cpp mythuivideo.cpp mythudplistener.cpp
     50SOURCES += mythdisplay.cpp mythuivideo.cpp mythudplistener.cpp mythinputevent.cpp
    5151
    5252
    5353inc.path = $${PREFIX}/include/mythtv/libmythui/
    inc.files += mythuiprogressbar.h mythuiwebbrowser.h mythuiutils.h 
    6464inc.files += x11colors.h mythgenerictree.h mythuibuttontree.h
    6565inc.files += mythvirtualkeyboard.h mythuishape.h mythuiguidegrid.h
    6666inc.files += mythuieditbar.h mythuifilebrowser.h mythuivideo.h
    67 inc.files += mythuiexp.h mythuiactions.h
     67inc.files += mythuiexp.h mythuiactions.h mythinputevent.h
    6868
    6969INSTALLS += inc
    7070
  • mythtv/libs/libmythui/lirc.cpp

    diff --git a/mythtv/libs/libmythui/lirc.cpp b/mythtv/libs/libmythui/lirc.cpp
    index aa9b6e0..057ff90 100644
    a b using namespace std; 
    2222#include "mythdb.h"
    2323#include "mythsystem.h"
    2424#include "lircevent.h"
     25#include "mythinputevent.h"
    2526#include "lirc_client.h"
    2627
    2728#include <sys/types.h>
    bool LIRC::Init(void) 
    297298            LOG(vtype, LOG_ERR, LOC +
    298299                QString("Failed to read config file '%1'").arg(configFile));
    299300
    300             lirc_deinit(d->lircState);
     301            /*lirc_deinit(d->lircState);
    301302            d->lircState = NULL;
    302             return false;
     303            return false;*/
     304            return true;
    303305        }
    304306    }
    305307
    bool LIRC::IsDoRunSet(void) const 
    330332    return doRun;
    331333}
    332334
     335/**
     336 * Send a MythInoutEvent from date
     337 * use when no .lircrc found or config can not be converted to QKeyEvnt
     338 */
     339void LIRC::processData(const QByteArray &data)
     340{
     341    QString remoteName;
     342    QString buttonName;
     343    QString code(data);
     344    QStringList codes = code.split(" ");
     345    if (codes.size() == 4)
     346    {
     347        buttonName=QString(codes.at(2));
     348        remoteName=QString(codes.at(3));
     349        LOG(VB_GENERAL, LOG_ERR, QString("lircd: %1 %2")
     350                .arg(buttonName).arg(remoteName));
     351        MythInputEvent * event = new MythInputEvent("lirc", remoteName, buttonName);
     352        QCoreApplication::postEvent(m_mainWindow, event);
     353    }
     354}
     355
    333356void LIRC::Process(const QByteArray &data)
    334357{
    335358    QMutexLocker static_lock(&lirclib_lock);
    336359
    337     // lirc_code2char will make code point to a static datafer..
    338     char *code = NULL;
    339     int ret = lirc_code2char(
    340         d->lircState, d->lircConfig, const_cast<char*>(data.constData()), &code);
    341 
    342     while ((0 == ret) && code)
     360    if (d->lircConfig)
    343361    {
    344         QString lirctext(code);
    345         QString qtcode = code;
    346         qtcode.replace("ctrl-",  "ctrl+",  Qt::CaseInsensitive);
    347         qtcode.replace("alt-",   "alt+",   Qt::CaseInsensitive);
    348         qtcode.replace("shift-", "shift+", Qt::CaseInsensitive);
    349         qtcode.replace("meta-",  "meta+",  Qt::CaseInsensitive);
    350         QKeySequence a(qtcode);
    351 
    352         // Send a dummy keycode if we couldn't convert the key sequence.
    353         // This is done so the main code can output a warning for bad
    354         // mappings.
    355         if (!a.count())
    356         {
    357             QCoreApplication::postEvent(
    358                 m_mainWindow, new LircKeycodeEvent(
    359                     QEvent::KeyPress, 0,
    360                     (Qt::KeyboardModifiers)
    361                     LircKeycodeEvent::kLIRCInvalidKeyCombo,
    362                     QString(), lirctext));
    363         }
     362        // lirc_code2char will make code point to a static datafer..
     363        char *code = NULL;
     364        int ret = lirc_code2char(
     365            d->lircState, d->lircConfig, const_cast<char*>(data.constData()), &code);
    364366
    365         vector<LircKeycodeEvent*> keyReleases;
    366         for (unsigned int i = 0; i < a.count(); i++)
     367            LOG(VB_GENERAL, LOG_ERR, QString("lircd: ret %1")
     368                    .arg(ret));
     369
     370        while ((0 == ret) && code)
    367371        {
    368             int keycode = a[i];
    369             Qt::KeyboardModifiers mod = Qt::NoModifier;
    370             mod |= (Qt::SHIFT & keycode) ? Qt::ShiftModifier : Qt::NoModifier;
    371             mod |= (Qt::META  & keycode) ? Qt::MetaModifier  : Qt::NoModifier;
    372             mod |= (Qt::CTRL  & keycode) ? Qt::ControlModifier: Qt::NoModifier;
    373             mod |= (Qt::ALT   & keycode) ? Qt::AltModifier   : Qt::NoModifier;
    374 
    375             keycode &= ~Qt::MODIFIER_MASK;
    376 
    377             QString text = "";
    378             if (!mod)
    379                 text = QString(QChar(keycode));
    380 
    381             QCoreApplication::postEvent(
    382                 m_mainWindow, new LircKeycodeEvent(
    383                     QEvent::KeyPress, keycode, mod, text, lirctext));
    384 
    385             keyReleases.push_back(
    386                 new LircKeycodeEvent(
    387                     QEvent::KeyRelease, keycode, mod, text, lirctext));
    388         }
     372            QString lirctext(code);
     373            QString qtcode = code;
     374            qtcode.replace("ctrl-",  "ctrl+",  Qt::CaseInsensitive);
     375            qtcode.replace("alt-",   "alt+",   Qt::CaseInsensitive);
     376            qtcode.replace("shift-", "shift+", Qt::CaseInsensitive);
     377            qtcode.replace("meta-",  "meta+",  Qt::CaseInsensitive);
     378            QKeySequence a(qtcode);
     379
     380            LOG(VB_GENERAL, LOG_ERR, QString("lircd:  %1")
     381                    .arg(code));
     382
     383            // Send a dummy keycode if we couldn't convert the key sequence.
     384            // This is done so the main code can output a warning for bad
     385            // mappings.
     386            if (!a.count())
     387            {
     388            LOG(VB_GENERAL, LOG_ERR, QString("lircd: dummy code %1")
     389                    .arg(QString(data)));
     390                processData(data);
     391                /*QCoreApplication::postEvent(
     392                    m_mainWindow, new LircKeycodeEvent(
     393                        QEvent::KeyPress, 0,
     394                        (Qt::KeyboardModifiers)
     395                        LircKeycodeEvent::kLIRCInvalidKeyCombo,
     396                        QString(), lirctext));*/
     397            }
     398
     399            vector<LircKeycodeEvent*> keyReleases;
     400            for (unsigned int i = 0; i < a.count(); i++)
     401            {
     402                int keycode = a[i];
     403                Qt::KeyboardModifiers mod = Qt::NoModifier;
     404                mod |= (Qt::SHIFT & keycode) ? Qt::ShiftModifier : Qt::NoModifier;
     405                mod |= (Qt::META  & keycode) ? Qt::MetaModifier  : Qt::NoModifier;
     406                mod |= (Qt::CTRL  & keycode) ? Qt::ControlModifier: Qt::NoModifier;
     407                mod |= (Qt::ALT   & keycode) ? Qt::AltModifier   : Qt::NoModifier;
     408
     409                keycode &= ~Qt::MODIFIER_MASK;
     410
     411                QString text = "";
     412                if (!mod)
     413                    text = QString(QChar(keycode));
     414
     415                QCoreApplication::postEvent(
     416                    m_mainWindow, new LircKeycodeEvent(
     417                        QEvent::KeyPress, keycode, mod, text, lirctext));
     418
     419                keyReleases.push_back(
     420                    new LircKeycodeEvent(
     421                        QEvent::KeyRelease, keycode, mod, text, lirctext));
     422            }
    389423
    390         for (int i = (int)keyReleases.size() - 1; i>=0; i--)
    391             QCoreApplication::postEvent(m_mainWindow, keyReleases[i]);
     424            for (int i = (int)keyReleases.size() - 1; i>=0; i--)
     425                QCoreApplication::postEvent(m_mainWindow, keyReleases[i]);
    392426
    393         ret = lirc_code2char(
    394             d->lircState, d->lircConfig, const_cast<char*>(data.constData()), &code);
     427            ret = lirc_code2char(
     428                d->lircState, d->lircConfig, const_cast<char*>(data.constData()), &code);
     429        }
     430    }
     431    else
     432    {
     433        processData(data);
    395434    }
    396435}
    397436
  • mythtv/libs/libmythui/lirc.h

    diff --git a/mythtv/libs/libmythui/lirc.h b/mythtv/libs/libmythui/lirc.h
    index a75d1a4..f44d703 100644
    a b class LIRC : public QObject, public MThread 
    4242    virtual void run(void);
    4343    QList<QByteArray> GetCodes(void);
    4444    void Process(const QByteArray &data);
     45    void processData(const QByteArray &data);
    4546
    4647    mutable QMutex  lock;
    4748    static  QMutex  lirclib_lock;
  • mythtv/libs/libmythui/mythmainwindow.cpp

    diff --git a/mythtv/libs/libmythui/mythmainwindow.cpp b/mythtv/libs/libmythui/mythmainwindow.cpp
    index e69e4fd..2e4fc37 100644
    a b using namespace std; 
    5252#include "lircevent.h"
    5353#include "mythudplistener.h"
    5454#include "mythrender_base.h"
     55#include "mythinputmanager.h"
    5556
    5657#ifdef USING_APPLEREMOTE
    5758#include "AppleRemoteListener.h"
    struct MPData { 
    115116    MediaPlayCallback playFn;
    116117};
    117118
     119
     120class ButtonMapping
     121{
     122  public:
     123    ButtonMapping(const QString &buttonName):m_buttonName(buttonName),m_jump(0){};
     124    QString buttonName(){return m_buttonName;};
     125    void addMapping(const QString &context, const QString & action)
     126    {
     127        m_contextMapping[context].append(action);
     128    }
     129
     130    bool getMapping(const QString &context, QStringList &actions)
     131    {
     132        if (m_contextMapping.count(context) > 0)
     133        {
     134            actions += m_contextMapping[context];
     135            return true;
     136        }
     137        return false;
     138    };
     139   
     140    void addJump(JumpData * jump)
     141    {
     142        m_jump=jump;
     143    }
     144
     145    JumpData * getJump()
     146    {
     147        return m_jump;
     148    }
     149    void clearJump(const QString &destination)
     150    {
     151        if (m_jump && m_jump->destination == destination)
     152            m_jump=NULL;
     153    }
     154
     155  private:
     156    QString m_buttonName;
     157    JumpData * m_jump;
     158    QMap<QString,QStringList> m_contextMapping; //i.e context -> action(s)
     159};
     160
     161class RemoteMapping
     162{
     163  public:
     164    RemoteMapping(const QString &remoteName):m_remoteName(remoteName){}
     165    QString remoteName(){return m_remoteName;};
     166    void addMapping(const QString &buttonName, const QString &context, const QString & action)
     167    {
     168        if (!m_buttonMapping.contains(buttonName))
     169        {
     170            m_buttonMapping[buttonName]=new ButtonMapping(buttonName);
     171        }
     172        m_buttonMapping[buttonName]->addMapping(context, action);
     173    }
     174    bool getMapping(const QString &buttonName, const QString &context, QStringList &actions)
     175    {
     176        if (m_buttonMapping.contains(buttonName))
     177            return m_buttonMapping[buttonName]->getMapping(context, actions);
     178        return false;
     179    }
     180    void addJump(const QString &buttonName, JumpData * jump)
     181    {
     182        if (!m_buttonMapping.contains(buttonName))
     183        {
     184            m_buttonMapping[buttonName]=new ButtonMapping(buttonName);
     185        }
     186        m_buttonMapping[buttonName]->addJump(jump);
     187    }
     188    JumpData * getJump(const QString &buttonName)
     189    {
     190        ButtonMapping * buttonMapping = m_buttonMapping.value(buttonName);
     191        if (buttonMapping)
     192        {
     193            return buttonMapping->getJump();
     194        }
     195        return NULL;
     196    }
     197    void clearJump(const QString &destination)
     198    {
     199        ButtonMapping*buttonMapping;
     200        foreach (buttonMapping, m_buttonMapping)
     201            buttonMapping->clearJump(destination);
     202    }
     203  private:
     204    QMap<QString,ButtonMapping*> m_buttonMapping;
     205    QString m_remoteName;
     206};
     207
     208class InputMapping
     209{
     210  public:
     211    InputMapping(const QString &inputName)
     212        :m_inputName(inputName){};
     213    QString inputName(){return m_inputName;};
     214    void addMapping(const QString &remoteName, const QString &buttonName, const QString &context, const QString & action)
     215    {
     216        if (!m_remoteMapping.contains(remoteName))
     217        {
     218            m_remoteMapping[remoteName]=new RemoteMapping(remoteName);
     219        }
     220        m_remoteMapping[remoteName]->addMapping(buttonName, context, action);
     221    }
     222    bool getMapping(const QString &remoteName, const QString &buttonName, const QString &context, QStringList &actions)
     223    {
     224        if (m_remoteMapping.contains(remoteName))
     225            return m_remoteMapping[remoteName]->getMapping(buttonName, context, actions);
     226        return true;
     227    }
     228    void addJump(const QString &remoteName, const QString &buttonName, JumpData * jump)
     229    {
     230        if (!m_remoteMapping.contains(remoteName))
     231        {
     232            m_remoteMapping[remoteName]=new RemoteMapping(remoteName);
     233        }
     234        m_remoteMapping[remoteName]->addJump(buttonName, jump);
     235    }
     236    JumpData * getJump(const QString &remoteName, const QString &buttonName)
     237    {
     238        if (m_remoteMapping.contains(remoteName))
     239        {
     240            return m_remoteMapping[remoteName]->getJump(buttonName);
     241        }
     242        return NULL;
     243    }
     244    void clearJump(const QString &destination)
     245    {
     246        RemoteMapping*remoteMapping;
     247        foreach (remoteMapping, m_remoteMapping)
     248            remoteMapping->clearJump(destination);
     249    }
     250  private:
     251    QMap <QString,RemoteMapping*> m_remoteMapping;
     252    QString m_inputName;
     253};
     254
     255
    118256class MythMainWindowPrivate
    119257{
    120258  public:
    class MythMainWindowPrivate (this hunk was shorter than expected) 
    211351    QMap<int, JumpData*> jumpMap;
    212352    QMap<QString, JumpData> destinationMap;
    213353    QMap<QString, MPData> mediaPluginMap;
     354    QMap<QString, InputMapping*> inputsMapping;
    214355
    215356    void (*exitmenucallback)(void);
    216357
    void MythMainWindow::ExitToMainMenu(void) 
    14301583    }
    14311584}
    14321585
     1586bool MythMainWindow::TranslateKeyPress(const QString &context,
     1587                                       MythInputEvent *e, QStringList &actions,
     1588                                       bool allowJumps)
     1589{
     1590    actions.clear();
     1591
     1592    QStringList localActions;
     1593
     1594    JumpData * jump = NULL;
     1595
     1596    if (allowJumps)
     1597    {
     1598        InputMapping * inputMapping = d->inputsMapping.value(e->inputName());
     1599        if (inputMapping)
     1600        {
     1601            jump = inputMapping->getJump(e->remoteName(),
     1602                    e->buttonName());
     1603            if (jump)
     1604            {
     1605                inputMapping->getMapping(e->remoteName(),
     1606                        e->buttonName(), context, localActions);
     1607                if (localActions.contains(jump->localAction))
     1608                    allowJumps = false;               
     1609            }
     1610        }
     1611    }
     1612
     1613    if (allowJumps && jump && !jump->exittomain && d->exitmenucallback == NULL)
     1614    {
     1615        d->exitingtomain = true;
     1616        d->exitmenucallback = jump->callback;
     1617        QCoreApplication::postEvent(
     1618            this, new QEvent(MythEvent::kExitToMainMenuEventType));
     1619        return true;
     1620    }
     1621
     1622    if (d->inputsMapping.value(e->inputName()))
     1623    {
     1624        d->inputsMapping.value(e->inputName())->getMapping(e->remoteName(),
     1625            e->buttonName(), context, actions);
     1626
     1627        d->inputsMapping.value(e->inputName())->getMapping(e->remoteName(),
     1628            e->buttonName(), "Global", actions);
     1629    }
     1630    return false;
     1631}
     1632
    14331633/**
    14341634 * \brief Get a list of actions for a keypress in the given context
    14351635 * \param context The context in which to lookup the keypress for actions.
    bool MythMainWindow::TranslateKeyPress(const QString &context, 
    14441644                                       QKeyEvent *e, QStringList &actions,
    14451645                                       bool allowJumps)
    14461646{
     1647    MythInputEvent * me = dynamic_cast<MythInputEvent *>(e);
     1648    if (me)
     1649    {
     1650        bool handled =  TranslateKeyPress(context,me, actions, allowJumps);
     1651        if (handled || actions.size()>0)
     1652            return handled;
     1653    }
     1654
    14471655    actions.clear();
    14481656
    14491657    // Special case for custom QKeyEvent where the action is embedded directly
    void MythMainWindow::RegisterKey(const QString &context, const QString &action, 
    15791787    {
    15801788        query.prepare("SELECT keylist, description FROM keybindings WHERE "
    15811789                      "context = :CONTEXT AND action = :ACTION AND "
    1582                       "hostname = :HOSTNAME ;");
     1790                      "hostname = :HOSTNAME AND input='' AND device='';");
    15831791        query.bindValue(":CONTEXT", context);
    15841792        query.bindValue(":ACTION", action);
    15851793        query.bindValue(":HOSTNAME", GetMythDB()->GetHostName());
    void MythMainWindow::RegisterKey(const QString &context, const QString &action, 
    16171825            QString inskey = keybind;
    16181826
    16191827            query.prepare("INSERT INTO keybindings (context, action, "
    1620                           "description, keylist, hostname) VALUES "
     1828                          "description, keylist, hostname, input, device) VALUES "
    16211829                          "( :CONTEXT, :ACTION, :DESCRIPTION, :KEYLIST, "
    1622                           ":HOSTNAME );");
     1830                          ":HOSTNAME , '', '');");
    16231831            query.bindValue(":CONTEXT", context);
    16241832            query.bindValue(":ACTION", action);
    16251833            query.bindValue(":DESCRIPTION", description);
    void MythMainWindow::RegisterKey(const QString &context, const QString &action, 
    16341842    }
    16351843
    16361844    BindKey(context, action, keybind);
     1845
     1846    if (d->m_useDB && query.isConnected())
     1847    {
     1848        query.prepare("SELECT input, device, keylist FROM keybindings WHERE "
     1849                      "context = :CONTEXT AND action = :ACTION AND "
     1850                      "hostname = :HOSTNAME AND input!='' AND device!='';");
     1851        query.bindValue(":CONTEXT", context);
     1852        query.bindValue(":ACTION", action);
     1853        query.bindValue(":HOSTNAME", GetMythDB()->GetHostName());
     1854        if (query.exec())
     1855        {
     1856        while (query.next())
     1857        {
     1858            QString inputName  = query.value(0).toString();
     1859            QString remoteName = query.value(1).toString();
     1860            QString buttonName = query.value(2).toString();
     1861            LOG(VB_GENERAL, LOG_ERR,
     1862            QString("MythMainWindow::RegisterKey %1 %2 %3")
     1863                    .arg(inputName).arg(remoteName).arg(buttonName));
     1864            if (!d->inputsMapping.value(inputName))
     1865                d->inputsMapping[inputName]=new InputMapping(inputName);
     1866            d->inputsMapping[inputName]->addMapping(remoteName, buttonName, context, action);
     1867        }
     1868        }
     1869    }
    16371870}
    16381871
    16391872QString MythMainWindow::GetKey(const QString &context,
    QString MythMainWindow::GetKey(const QString &context, 
    16601893
    16611894void MythMainWindow::ClearJump(const QString &destination)
    16621895{
     1896    InputMapping * inputMapping;
     1897    foreach(inputMapping, d->inputsMapping)
     1898        inputMapping->clearJump(destination);
     1899
    16631900    /* make sure that the jump point exists (using [] would add it)*/
    16641901    if (d->destinationMap.find(destination) == d->destinationMap.end())
    16651902    {
    void MythMainWindow::RegisterJump(const QString &destination, 
    17291966    if (query.isConnected())
    17301967    {
    17311968        query.prepare("SELECT keylist FROM jumppoints WHERE "
    1732                       "destination = :DEST and hostname = :HOST ;");
     1969                      "destination = :DEST and hostname = :HOST and input='' and device='';");
    17331970        query.bindValue(":DEST", destination);
    17341971        query.bindValue(":HOST", GetMythDB()->GetHostName());
    17351972
    void MythMainWindow::RegisterJump(const QString &destination, 
    17421979            QString inskey = keybind;
    17431980
    17441981            query.prepare("INSERT INTO jumppoints (destination, description, "
    1745                           "keylist, hostname) VALUES ( :DEST, :DESC, :KEYLIST, "
    1746                           ":HOST );");
     1982                          "keylist, hostname, input, device) VALUES ( :DEST, :DESC, :KEYLIST, "
     1983                          ":HOST, '', '' );");
    17471984            query.bindValue(":DEST", destination);
    17481985            query.bindValue(":DESC", description);
    17491986            query.bindValue(":KEYLIST", inskey);
    void MythMainWindow::RegisterJump(const QString &destination, 
    17611998    d->destinationMap[destination] = jd;
    17621999
    17632000    BindJump(destination, keybind);
     2001
     2002    //TODO Xavier load additionnal jumppoint for remote
     2003    if (query.isConnected())
     2004    {
     2005        query.prepare("SELECT input, device, keylist FROM jumppoints WHERE "
     2006                      "destination = :DEST and hostname = :HOST and input!='' and device!='';");
     2007        query.bindValue(":DEST", destination);
     2008        query.bindValue(":HOST", GetMythDB()->GetHostName());
     2009
     2010        if (query.exec() && query.next())
     2011        {
     2012            QString inputName  = query.value(0).toString();
     2013            QString remoteName = query.value(1).toString();
     2014            QString buttonName = query.value(2).toString();
     2015
     2016            if (!d->inputsMapping.value(inputName))
     2017                d->inputsMapping[inputName]=new InputMapping(inputName);
     2018            d->inputsMapping[inputName]->addJump(remoteName, buttonName, &jd);
     2019        }
     2020    }
    17642021}
    17652022
    17662023void MythMainWindow::ClearAllJumps()
  • mythtv/libs/libmythui/mythmainwindow.h

    diff --git a/mythtv/libs/libmythui/mythmainwindow.h b/mythtv/libs/libmythui/mythmainwindow.h
    index 46ea69d..75f4844 100644
    a b  
    66#include "mythuiactions.h"
    77#include "mythuitype.h"
    88#include "mythscreenstack.h"
     9#include "mythinputevent.h"
    910
    1011class QEvent;
    1112
    class MUI_PUBLIC MythMainWindow : public QWidget 
    4849    MythScreenStack *GetStack(const QString &stackname);
    4950    MythScreenStack *GetStackAt(int pos);
    5051
     52    bool TranslateKeyPress(const QString &context, MythInputEvent *e,
     53                           QStringList &actions, bool allowJumps = true)
     54                           MUNUSED_RESULT;
     55
    5156    bool TranslateKeyPress(const QString &context, QKeyEvent *e,
    5257                           QStringList &actions, bool allowJumps = true)
    5358                           MUNUSED_RESULT;