Index: libs/libmythtv/tv_play.h
===================================================================
--- libs/libmythtv/tv_play.h	(revision 23103)
+++ libs/libmythtv/tv_play.h	(working copy)
@@ -187,6 +187,7 @@
 
     // User input processing commands
     void ProcessKeypress(PlayerContext*, QKeyEvent *e);
+    void ProcessKeypressInternal(PlayerContext*, QKeyEvent *e);
     void ProcessNetworkControlCommand(PlayerContext *, const QString &command);
     void customEvent(QEvent *e);
     bool HandleTrackAction(PlayerContext*, const QString &action);
Index: libs/libmythtv/tv_play.cpp
===================================================================
--- libs/libmythtv/tv_play.cpp	(revision 23103)
+++ libs/libmythtv/tv_play.cpp	(working copy)
@@ -3516,6 +3516,29 @@
 
 void TV::ProcessKeypress(PlayerContext *actx, QKeyEvent *e)
 {
+    QStringList actions;
+    bool handled = GetMythMainWindow()->
+        TranslateKeyPress("TV Playback", e, actions, false);
+    if (handled)
+        VERBOSE(VB_IMPORTANT,
+                "ProcessKeypress(): "
+                "TranslateKeyPress() unexpectedly returned true");
+    bool isJumpingToMain = has_action("ESCAPE", actions) &&
+        GetMythMainWindow()->IsExitingToMain();
+    unsigned iterations = 0;
+    // Set a limit on the number of iterations in case pressing escape
+    // repeatedly somehow gets into a loop.
+    const unsigned kMaxIterations = 10;
+    do {
+        ProcessKeypressInternal(actx, e);
+        ++iterations;
+    } while (isJumpingToMain &&
+             exitPlayerTimerId == 0 &&
+             iterations <= kMaxIterations);
+}
+
+void TV::ProcessKeypressInternal(PlayerContext *actx, QKeyEvent *e)
+{
     bool ignoreKeys = actx->IsNVPChangingBuffers();
 #if DEBUG_ACTIONS
     VERBOSE(VB_IMPORTANT, LOC + QString("ProcessKeypress() ignoreKeys: %1")
