From 238d243481669fc54011db7bc939268d1b6390df Mon Sep 17 00:00:00 2001
From: Tobias Maier <diespambox@gmx.net>
Date: Wed, 4 Jul 2012 08:43:55 +0200
Subject: [PATCH] Enable mythconfirmation dialog to pause playback. If a
 MythUserMessage with ExtraData set to "pauseplayback"
 (instead of a timeout) is received while in playback,
 playback is paused until the dialog is dissmissed.

---
 mythtv/libs/libmythtv/osd.cpp     |   35 ++++++++++++++++++++++++-----------
 mythtv/libs/libmythtv/osd.h       |    2 +-
 mythtv/libs/libmythtv/tv_play.cpp |   21 ++++++++++++++++++++-
 3 files changed, 45 insertions(+), 13 deletions(-)

diff --git a/mythtv/libs/libmythtv/osd.cpp b/mythtv/libs/libmythtv/osd.cpp
index 6b2f09f..3b5a4b4 100644
--- a/mythtv/libs/libmythtv/osd.cpp
+++ b/mythtv/libs/libmythtv/osd.cpp
@@ -967,7 +967,8 @@ void OSD::DialogQuit(void)
     m_PulsedDialogText = QString();
 }
 
-void OSD::DialogShow(const QString &window, const QString &text, int updatefor)
+void OSD::DialogShow(const QString &window, const QString &text, int updatefor,
+        const QString &confirmationData)
 {
     if (m_Dialog)
     {
@@ -1009,19 +1010,31 @@ void OSD::DialogShow(const QString &window, const QString &text, int updatefor)
             MythConfirmationDialog *cbox = dynamic_cast<MythConfirmationDialog*>(m_Dialog);
             if (cbox)
             {
-                cbox->SetReturnEvent(m_ParentObject, window);
-                cbox->SetData("DIALOG_CONFIRM_X_X");
+                PositionWindow(dialog);
+                m_Dialog = dialog;
+                MythDialogBox *dbox = dynamic_cast<MythDialogBox*>(m_Dialog);
+                if (dbox)
+                    dbox->SetReturnEvent(m_ParentObject, window);
+                MythConfirmationDialog *cbox = dynamic_cast<MythConfirmationDialog*>(m_Dialog);
+                if (cbox)
+                {
+                    cbox->SetReturnEvent(m_ParentObject, window);
+                    if (!confirmationData.isEmpty() && confirmationData.contains("_"))
+                        cbox->SetData(QString("DIALOG_CONFIRM_%1").arg(confirmationData));
+                    else
+                        cbox->SetData("DIALOG_CONFIRM_X_X");
+                }
+                m_Children.insert(window, m_Dialog);
             }
-            m_Children.insert(window, m_Dialog);
-        }
-        else
-        {
+            else
+            {
+                RevertUIScale();
+                delete dialog;
+                return;
+            }
+
             RevertUIScale();
-            delete dialog;
-            return;
         }
-            
-        RevertUIScale();
     }
 
     if (updatefor)
diff --git a/mythtv/libs/libmythtv/osd.h b/mythtv/libs/libmythtv/osd.h
index 2136fa2..b6615ea 100644
--- a/mythtv/libs/libmythtv/osd.h
+++ b/mythtv/libs/libmythtv/osd.h
@@ -167,7 +167,7 @@ class OSD
     bool DialogHandleKeypress(QKeyEvent *e);
     void DialogQuit(void);
     void DialogShow(const QString &window, const QString &text = "",
-                    int updatefor = 0);
+                    int updatefor = 0, const QString  &confirmationData ="");
     void DialogSetText(const QString &text);
     void DialogBack(QString text = "", QVariant data = 0, bool exit = false);
     void DialogAddButton(QString text, QVariant data,
diff --git a/mythtv/libs/libmythtv/tv_play.cpp b/mythtv/libs/libmythtv/tv_play.cpp
index 750b3dd..ddd127b 100644
--- a/mythtv/libs/libmythtv/tv_play.cpp
+++ b/mythtv/libs/libmythtv/tv_play.cpp
@@ -8713,20 +8713,35 @@ void TV::customEvent(QEvent *e)
             return;
 
         uint timeout = 0;
+        bool pausePlayback = false;
         if (me->ExtraDataCount() == 1)
         {
             uint t = me->ExtraData(0).toUInt();
             if (t > 0 && t < 1000)
                 timeout = t * 1000;
+
+            if (t == 0 && me->ExtraData(0).contains("pauseplayback"))
+                pausePlayback = true;
         }
 
         if (timeout > 0)
             message += " (%d)";
 
+
         PlayerContext *mctx = GetPlayerReadLock(0, __FILE__, __LINE__);
+
+        QString confirmationData;
+        if (pausePlayback && !ContextIsPaused(mctx, __FILE__, __LINE__))
+        {
+            gTV->NormalSpeed(mctx);
+            gTV->StopFFRew(mctx);
+            gTV->DoTogglePause(mctx, false);
+            confirmationData = "RESUME_PLAYBACK";
+        }
+
         OSD *osd = GetOSDLock(mctx);
         if (osd)
-            osd->DialogShow(OSD_DLG_CONFIRM, message, timeout);
+            osd->DialogShow(OSD_DLG_CONFIRM, message, timeout, confirmationData);
         ReturnOSDLock(mctx, osd);
         ReturnPlayerLock(mctx);
 
@@ -8753,6 +8768,7 @@ void TV::customEvent(QEvent *e)
     {
         DialogCompletionEvent *dce =
             reinterpret_cast<DialogCompletionEvent*>(e);
+
         OSDDialogEvent(dce->GetResult(), dce->GetResultText(),
                        dce->GetData().toString());
         return;
@@ -10171,6 +10187,9 @@ void TV::OSDDialogEvent(int result, QString text, QString action)
         }
         else if (valid && desc[0] == "CONFIRM")
         {
+            if (desc[1] == "RESUME" && desc[2] == "PLAYBACK")
+                if (ContextIsPaused(actx, __FILE__, __LINE__))
+                    gTV->DoTogglePause(actx, false);
         }
         else
         {
-- 
1.7.8.6

