Ticket #7939: tv_jumppoints_v4.patch

File tv_jumppoints_v4.patch, 4.3 KB (added by Jim Stichnoth <stichnot@…>, 10 years ago)
  • libs/libmythtv/tv_play.cpp

     
    34693469
    34703470void TV::ProcessKeypress(PlayerContext *actx, QKeyEvent *e)
    34713471{
     3472    QStringList actions;
     3473    bool handled = GetMythMainWindow()->
     3474        TranslateKeyPress("TV Playback", e, actions, false);
     3475    if (handled)
     3476        VERBOSE(VB_IMPORTANT,
     3477                "ProcessKeypress(): "
     3478                "TranslateKeyPress() unexpectedly returned true");
     3479    bool isJumpingToMain = has_action("ESCAPE", actions) &&
     3480        GetMythMainWindow()->IsExitingToMain();
     3481    unsigned iterations = 0;
     3482    // Set a limit on the number of iterations in case pressing escape
     3483    // repeatedly somehow gets into a loop.
     3484    const unsigned kMaxIterations = 10;
     3485    do {
     3486        ++iterations;
     3487
    34723488    bool ignoreKeys = actx->IsPlayerChangingBuffers();
    34733489#if DEBUG_ACTIONS
    34743490    VERBOSE(VB_IMPORTANT, LOC + QString("ProcessKeypress() ignoreKeys: %1")
     
    34813497        idleTimerId = StartTimer(db_idle_timeout, __LINE__);
    34823498    }
    34833499
    3484     QStringList actions;
    3485     bool handled = false;
     3500    handled = false;
    34863501
    34873502    if (ignoreKeys)
    34883503    {
     
    34903505                  "TV Playback", e, actions);
    34913506
    34923507        if (handled || actions.isEmpty())
    3493             return;
     3508            continue;
    34943509
    34953510        bool esc   = has_action("ESCAPE", actions);
    34963511        bool pause = has_action("PAUSE",  actions);
    34973512        bool play  = has_action("PLAY",   actions);
    34983513
    34993514        if ((!esc || browsemode) && !pause && !play)
    3500             return;
     3515            continue;
    35013516    }
    35023517
    35033518    OSD *osd = GetOSDLock(actx);
    35043519    if (osd && osd->DialogVisible())
    35053520    {
    3506         osd->DialogHandleKeypress(e);
     3521        if (GetMythMainWindow()->IsExitingToMain())
     3522            osd->DialogQuit();
     3523        else
     3524            osd->DialogHandleKeypress(e);
    35073525        handled = true;
    35083526    }
    35093527
     
    35303548    ReturnOSDLock(actx, osd);
    35313549
    35323550    if (handled)
    3533         return;
     3551        continue;
    35343552
    35353553    // If text is already queued up, be more lax on what is ok.
    35363554    // This allows hex teletext entry and minor channel entry.
     
    35423560        if (ok || txt=="_" || txt=="-" || txt=="#" || txt==".")
    35433561        {
    35443562            AddKeyToInputQueue(actx, txt.at(0).toLatin1());
    3545             return;
     3563            continue;
    35463564        }
    35473565    }
    35483566
     3567    bool should_continue;
    35493568    // Teletext menu
    35503569    actx->LockDeletePlayer(__FILE__, __LINE__);
    35513570    if (actx->player && (actx->player->GetCaptionMode() == kDisplayTeletextMenu))
     
    35563575
    35573576        if (!handled && !tt_actions.isEmpty())
    35583577        {
     3578            should_continue = false;
    35593579            for (int i = 0; i < tt_actions.size(); i++)
    35603580            {
    35613581                if (actx->player->HandleTeletextAction(tt_actions[i]))
    35623582                {
    35633583                    actx->UnlockDeletePlayer(__FILE__, __LINE__);
    3564                     return;
     3584                    should_continue = true;
     3585                    break;
    35653586                }
    35663587            }
     3588            if (should_continue)
     3589                continue;
    35673590        }
    35683591    }
    35693592
     
    35763599
    35773600        if (!handled && !itv_actions.isEmpty())
    35783601        {
     3602            should_continue = false;
    35793603            for (int i = 0; i < itv_actions.size(); i++)
    35803604            {
    35813605                if (actx->player->ITVHandleAction(itv_actions[i]))
    35823606                {
    35833607                    actx->UnlockDeletePlayer(__FILE__, __LINE__);
    3584                     return;
     3608                    should_continue = true;
     3609                    break;
    35853610                }
    35863611            }
     3612            if (should_continue)
     3613                continue;
    35873614        }
    35883615    }
    35893616    actx->UnlockDeletePlayer(__FILE__, __LINE__);
     
    35923619              "TV Playback", e, actions);
    35933620
    35943621    if (handled || actions.isEmpty())
    3595         return;
     3622        continue;
    35963623
    35973624    handled = false;
    35983625
     
    36183645#endif // DEBUG_ACTIONS
    36193646
    36203647    if (handled)
    3621         return;
     3648        continue;
    36223649
    36233650    if (!handled)
    36243651    {
     
    36353662            }
    36363663        }
    36373664    }
     3665
     3666    } while (isJumpingToMain &&
     3667             exitPlayerTimerId == 0 &&
     3668             iterations <= kMaxIterations);
    36383669}
    36393670
    36403671bool TV::BrowseHandleAction(PlayerContext *ctx, const QStringList &actions)