Ticket #13234: 20180313_1533_longpress.patch

File 20180313_1533_longpress.patch, 7.7 KB (added by Peter Bennett, 6 years ago)

Latest Long Press patch

  • mythtv/libs/libmythtv/tv_play.cpp

    diff --git a/mythtv/libs/libmythtv/tv_play.cpp b/mythtv/libs/libmythtv/tv_play.cpp
    index d6fcb27..b6d27c9 100644
    a b bool TV::eventFilter(QObject *o, QEvent *e) 
    36643664
    36653665    // Intercept keypress events unless they need to be handled by a main UI
    36663666    // screen (e.g. GuideGrid, ProgramFinder)
     3667    QScopedPointer<QEvent> sNewEvent(NULL);
     3668    if (GetMythMainWindow()->keyLongPressFilter(&e, sNewEvent))
     3669        return false;
     3670
    36673671    if (QEvent::KeyPress == e->type())
    36683672        return ignoreKeyPresses ? false : event(e);
    36693673    if (MythGestureEvent::kEventType == e->type())
  • mythtv/libs/libmythui/mythmainwindow.cpp

    diff --git a/mythtv/libs/libmythui/mythmainwindow.cpp b/mythtv/libs/libmythui/mythmainwindow.cpp
    index 1a60f0b..1a468bf 100644
    a b using namespace std; 
    8888
    8989#define GESTURE_TIMEOUT 1000
    9090#define STANDBY_TIMEOUT 90 // Minutes
     91#define LONGPRESS_INTERVAL 1000
    9192
    9293#define LOC      QString("MythMainWindow: ")
    9394
    class MythMainWindowPrivate 
    199200        disableIdle(false),
    200201        NC(NULL),
    201202        firstinit(true),
    202         m_bSavedPOS(false)
     203        m_bSavedPOS(false),
     204        m_longPressKeyCode(0),
     205        m_longPressTime(0)
    203206    {
    204207    }
    205208
    class MythMainWindowPrivate 
    299302        // window aspect
    300303    bool firstinit;
    301304    bool m_bSavedPOS;
     305    // Support for long press
     306    int m_longPressKeyCode;
     307    ulong m_longPressTime;
    302308};
    303309
    304310// Make keynum in QKeyEvent be equivalent to what's in QKeySequence
    void MythMainWindow::InitKeys() 
    12561262    RegisterKey("Global", "ESCAPE", QT_TRANSLATE_NOOP("MythControls",
    12571263        "Escape"),                "Esc");
    12581264    RegisterKey("Global", "MENU", QT_TRANSLATE_NOOP("MythControls",
    1259         "Pop-up menu"),             "M");
     1265        "Pop-up menu"),             "M,Meta+Enter");
    12601266    RegisterKey("Global", "INFO", QT_TRANSLATE_NOOP("MythControls",
    12611267        "More information"),        "I");
    12621268    RegisterKey("Global", "DELETE", QT_TRANSLATE_NOOP("MythControls",
    void MythMainWindow::InitKeys() 
    13861392        "System Exit"),                     "");
    13871393    RegisterKey("Main Menu",    "STANDBYMODE",QT_TRANSLATE_NOOP("MythControls",
    13881394        "Enter Standby Mode"),              "");
     1395    RegisterKey("Long Press",    "LONGPRESS1",QT_TRANSLATE_NOOP("MythControls",
     1396        "Up to 16 Keys that allow Long Press"),      "Enter");
     1397    RegisterKey("Long Press",    "LONGPRESS2",QT_TRANSLATE_NOOP("MythControls",
     1398        "Up to 16 Keys that allow Long Press"),      "");
     1399    RegisterKey("Long Press",    "LONGPRESS3",QT_TRANSLATE_NOOP("MythControls",
     1400        "Up to 16 Keys that allow Long Press"),      "");
     1401    RegisterKey("Long Press",    "LONGPRESS4",QT_TRANSLATE_NOOP("MythControls",
     1402        "Up to 16 Keys that allow Long Press"),      "");
    13891403}
    13901404
    13911405void MythMainWindow::ReloadKeys()
    void MythMainWindow::mouseTimeout(void) 
    21622176        QCoreApplication::postEvent(this, e);
    21632177}
    21642178
     2179// Return code = true to skip further processing, false to continue
     2180// sNewEvent: Caller must pass in a QScopedPointer that will be used
     2181// to delete a new event if one is created.
     2182bool MythMainWindow::keyLongPressFilter(QEvent **e,
     2183    QScopedPointer<QEvent> &sNewEvent)
     2184{
     2185    QEvent *newEvent = NULL;
     2186    QKeyEvent *ke = dynamic_cast<QKeyEvent*>(*e);
     2187    if (!ke)
     2188        return false;
     2189    int keycode = ke->key();
     2190
     2191    switch ((*e)->type())
     2192    {
     2193        case QEvent::KeyPress:
     2194        {
     2195            // Check if we are in the middle of a long press
     2196            if (keycode != 0 && keycode == d->m_longPressKeyCode)
     2197            {
     2198                if (ke->timestamp() - d->m_longPressTime < LONGPRESS_INTERVAL
     2199                    || d->m_longPressTime == 0)
     2200                {
     2201                    // waiting for release of key.
     2202                    return true; // discard the key press
     2203                }
     2204                else
     2205                {
     2206                    // expired log press - generate long key
     2207                    newEvent = new QKeyEvent(QEvent::KeyPress, keycode,
     2208                        ke->modifiers() | Qt::MetaModifier, ke->nativeScanCode(),
     2209                        ke->nativeVirtualKey(), ke->nativeModifiers(),
     2210                        ke->text(), false,1);
     2211                    *e = newEvent;
     2212                    sNewEvent.reset(newEvent);
     2213                    d->m_longPressTime = 0;   // indicate we have generated the long press
     2214                    return false;
     2215                }
     2216            }
     2217            d->m_longPressKeyCode = 0;
     2218            QStringList actions;
     2219            bool handled = TranslateKeyPress("Long Press",
     2220                               ke, actions,false);
     2221            if (handled)
     2222            {
     2223                // This shoudl never happen,, because we passed in false
     2224                // to say do not process jump points and yet it returned true
     2225                // to say it processed a jump point.
     2226                LOG(VB_GUI, LOG_ERR, QString("TranslateKeyPress Long Press Invalid Response"));
     2227                return true;
     2228            }
     2229            if (actions.size()>0 && actions[0].startsWith("LONGPRESS"))
     2230            {
     2231                // Beginning of a press
     2232                d->m_longPressKeyCode = keycode;
     2233                d->m_longPressTime = ke->timestamp();
     2234                return true; // discard the key press
     2235            }
     2236            break;
     2237        }
     2238        case QEvent::KeyRelease:
     2239        {
     2240            if (keycode != 0 && keycode == d->m_longPressKeyCode)
     2241            {
     2242                if (ke->isAutoRepeat())
     2243                    return true;
     2244                if (d->m_longPressTime > 0)
     2245                {
     2246                    // short press or non-repeating keyboard - generate key
     2247                    Qt::KeyboardModifiers modifier = Qt::NoModifier;
     2248                    if (ke->timestamp() - d->m_longPressTime >= LONGPRESS_INTERVAL)
     2249                        // non-repeatng keyboard
     2250                        modifier = Qt::MetaModifier;
     2251                    newEvent = new QKeyEvent(QEvent::KeyPress, keycode,
     2252                        ke->modifiers() | modifier, ke->nativeScanCode(),
     2253                        ke->nativeVirtualKey(), ke->nativeModifiers(),
     2254                        ke->text(), false,1);
     2255                    *e = newEvent;
     2256                    sNewEvent.reset(newEvent);
     2257                    d->m_longPressKeyCode = 0;
     2258                    return false;
     2259                }
     2260                else
     2261                {
     2262                    // end of long press
     2263                    d->m_longPressKeyCode = 0;
     2264                    return true;
     2265                }
     2266            }
     2267            break;
     2268        }
     2269    }
     2270    return false;
     2271}
     2272
    21652273bool MythMainWindow::eventFilter(QObject *, QEvent *e)
    21662274{
    21672275    MythGestureEvent *ge;
    bool MythMainWindow::eventFilter(QObject *, QEvent *e) 
    21702278    if (!d->AllowInput)
    21712279        return true;
    21722280
     2281    QScopedPointer<QEvent> sNewEvent(NULL);
     2282    if (keyLongPressFilter(&e, sNewEvent))
     2283        return false;
     2284
    21732285    switch (e->type())
    21742286    {
    21752287        case QEvent::KeyPress:
  • mythtv/libs/libmythui/mythmainwindow.h

    diff --git a/mythtv/libs/libmythui/mythmainwindow.h b/mythtv/libs/libmythui/mythmainwindow.h
    index 9195982..79424c3 100644
    a b class MUI_PUBLIC MythMainWindow : public QWidget 
    5454    bool TranslateKeyPress(const QString &context, QKeyEvent *e,
    5555                           QStringList &actions, bool allowJumps = true)
    5656                           MUNUSED_RESULT;
     57    bool keyLongPressFilter(QEvent **e,
     58        QScopedPointer<QEvent> &sNewEvent);
    5759
    5860    void ReloadKeys(void);
    5961    void ClearKey(const QString &context, const QString &action);