Index: mythplugins/mythmusic/mythmusic/playbackbox.cpp
===================================================================
--- mythplugins/mythmusic/mythmusic/playbackbox.cpp	(revision 14901)
+++ mythplugins/mythmusic/mythmusic/playbackbox.cpp	(working copy)
@@ -680,9 +680,9 @@
     SmartPlaylistDialog dialog(gContext->GetMainWindow(), "smartplaylistdialog");
     dialog.setSmartPlaylist(curSmartPlaylistCategory, curSmartPlaylistName);
 
-    int res = dialog.ExecPopup();
+    DialogCode res = dialog.ExecPopup();
 
-    if (res > 0)
+    if (kDialogCodeRejected != res)
     {
         dialog.getSmartPlaylist(curSmartPlaylistCategory, curSmartPlaylistName);
         updatePlaylistFromSmartPlaylist();
@@ -698,9 +698,9 @@
 
     SearchDialog dialog(gContext->GetMainWindow(), "searchdialog");
 
-    int res = dialog.ExecPopupAtXY(-1, 20);
+    DialogCode res = dialog.ExecPopupAtXY(-1, 20);
 
-    if (res != -1)
+    if (kDialogCodeRejected != res)
     {
           QString whereClause;
           dialog.getWhereClause(whereClause);
@@ -999,7 +999,7 @@
 
     EditMetadataDialog editDialog(editMeta, gContext->GetMainWindow(),
                       "edit_metadata", "music-", "edit metadata");
-    if (editDialog.exec())
+    if (kDialogCodeRejected != editDialog.exec())
     {
         // update the metadata copy stored in all_music
         if (all_music->updateMetadata(editMeta->ID(), editMeta))
@@ -2365,18 +2365,22 @@
     dupsCheck->setBackgroundOrigin(ParentOrigin);
     popup->addWidget(dupsCheck);
 
-    int res = popup->ExecPopup();
+    DialogCode res = popup->ExecPopup();
     switch (res)
     {
-        case 0:
+        case kDialogCodeButton0:
             insertOption = PL_REPLACE;
             break;
-        case 1:
+        case kDialogCodeButton1:
             insertOption = PL_INSERTAFTERCURRENT;
             break;
-        case 2:
+        case kDialogCodeButton2:
             insertOption = PL_INSERTATEND;
             break;
+        case kDialogCodeRejected:
+        default:
+            popup->deleteLater();
+            return false;
     }
 
     bRemoveDups = dupsCheck->isChecked();
@@ -2406,7 +2410,7 @@
 
     popup->deleteLater();
 
-    return (res >= 0);
+    return true;
 }
 
 QString PlaybackBoxMusic::getTimeString(int exTime, int maxTime)
Index: mythplugins/mythmusic/mythmusic/search.cpp
===================================================================
--- mythplugins/mythmusic/mythmusic/search.cpp	(revision 14901)
+++ mythplugins/mythmusic/mythmusic/search.cpp	(working copy)
@@ -46,8 +46,8 @@
     addWidget(listbox);
 
     // buttons
-    okButton = addButton(tr("OK"), this, SLOT(okPressed()));
-    cancelButton = addButton(tr("Cancel"), this, SLOT(cancelPressed()));
+    okButton = addButton(tr("OK"), this, SLOT(accept()));
+    cancelButton = addButton(tr("Cancel"), this, SLOT(reject()));
 
     // Initially, fill list with all music
     runQuery("");
@@ -223,7 +223,7 @@
 {
     unsigned int id = ((SearchListBoxItem*)listbox->item(i))->getId();
     whereClause = QString("WHERE song_id='%1';").arg(id);
-    done(0);
+    accept();
 }
 
 
@@ -236,16 +236,6 @@
 {
 }
 
-void SearchDialog::okPressed(void)
-{
-    done(0);
-}
-
-void SearchDialog::cancelPressed(void)
-{
-    done(-1);
-}
-
 void SearchListBoxItem::paint(QPainter *p)
 {
     int itemHeight = height(listBox());
Index: mythplugins/mythmusic/mythmusic/globalsettings.cpp
===================================================================
--- mythplugins/mythmusic/mythmusic/globalsettings.cpp	(revision 14901)
+++ mythplugins/mythmusic/mythmusic/globalsettings.cpp	(working copy)
@@ -673,7 +673,7 @@
 {
     VisualizationsEditor *dialog = new VisualizationsEditor(visModesEdit->getValue(),
             gContext->GetMainWindow(), "viseditor");
-    if (dialog->exec() == 1)
+    if (kDialogCodeAccepted == dialog->exec())
         visModesEdit->setValue(dialog->getSelectedModes());
 
     delete dialog;
Index: mythplugins/mythmusic/mythmusic/directoryfinder.cpp
===================================================================
--- mythplugins/mythmusic/mythmusic/directoryfinder.cpp	(revision 14901)
+++ mythplugins/mythmusic/mythmusic/directoryfinder.cpp	(working copy)
@@ -171,7 +171,7 @@
          || !m_cancelButton || !m_homeButton)
     {
         cout << "DirectoryFinder: Your theme is missing some UI elements! Bailing out." << endl;
-        QTimer::singleShot(100, this, SLOT(done(int)));
+        QTimer::singleShot(100, this, SLOT(reject()));
     }
 
     // load pixmaps
Index: mythplugins/mythmusic/mythmusic/cdrip.cpp
===================================================================
--- mythplugins/mythmusic/mythmusic/cdrip.cpp	(revision 14901)
+++ mythplugins/mythmusic/mythmusic/cdrip.cpp	(working copy)
@@ -738,32 +738,37 @@
                         dlg->AddButton("No To All");
                         dlg->AddButton("Yes");
                         dlg->AddButton("Yes To All");
-                        int res = dlg->exec();
+                        DialogCode res = dlg->exec();
                         dlg->deleteLater();
                         dlg = NULL;
 
-                        if (res == 1)
+                        if (kDialogCodeButton0 == res)
                         {
                             delete ripTrack;
                             delete metadata;
                         }
-                        else if (res == 2)
+                        else if (kDialogCodeButton1 == res)
                         {
                             noToAll = true;
                             delete ripTrack;
                             delete metadata;
                         }
-                        else if (res == 3)
+                        else if (kDialogCodeButton2 == res)
                         {
                             deleteTrack(m_artistName, m_albumName, title);
                             m_tracks->push_back(ripTrack);
                         }
-                        else if (res == 4)
+                        else if (kDialogCodeButton3 == res)
                         {
                             yesToAll = true;
                             deleteTrack(m_artistName, m_albumName, title);
                             m_tracks->push_back(ripTrack);
                         }
+                        else // treat cancel as no
+                        {
+                            delete ripTrack;
+                            delete metadata;
+                        }
                     }
                 }
             }
@@ -1176,8 +1181,8 @@
 
     RipStatus statusDialog(m_CDdevice, m_tracks, m_qualitySelector->getCurrentInt(),
                            gContext->GetMainWindow(), "edit metadata");
-    int res = statusDialog.exec();
-    if (res == Accepted)
+    DialogCode rescode = statusDialog.exec();
+    if (kDialogCodeAccepted == rescode)
     {
         bool EjectCD = gContext->GetNumSetting("EjectCDAfterRipping", 1);
         if (EjectCD) 
@@ -1396,7 +1401,8 @@
     searchDialog->setCaption(caption);
     searchDialog->setSearchText(value);
     searchDialog->setItems(m_searchList);
-    if (searchDialog->ExecPopupAtXY(-1, 8) == 0)
+    DialogCode rescode = searchDialog->ExecPopupAtXY(-1, 8);
+    if (kDialogCodeRejected != rescode)
     {
         value = searchDialog->getResult();
         res = true;
@@ -1416,7 +1422,7 @@
                                   "edit_metadata", "music-", "edit metadata");
     editDialog.setSaveMetadataOnly();
 
-    if (editDialog.exec())
+    if (kDialogCodeRejected != editDialog.exec())
     {
         updateTrackList();
     }
Index: mythplugins/mythmusic/mythmusic/smartplaylist.cpp
===================================================================
--- mythplugins/mythmusic/mythmusic/smartplaylist.cpp	(revision 14901)
+++ mythplugins/mythmusic/mythmusic/smartplaylist.cpp	(working copy)
@@ -624,14 +624,15 @@
     
     SmartPLDateDialog *dateDialog = new SmartPLDateDialog(gContext->GetMainWindow(), "");
     dateDialog->setDate(combo->currentText());
-    if (dateDialog->ExecPopup() == 0)
+    if (kDialogCodeAccepted == dateDialog->ExecPopup())
     {
         combo->insertItem(dateDialog->getDate());
         combo->setCurrentText(dateDialog->getDate());
         res = true;
     }
-    
-    delete dateDialog;
+
+    dateDialog->hide();
+    dateDialog->deleteLater();
 }
           
 bool SmartPLCriteriaRow::showList(QString caption, QString &value)
@@ -642,13 +643,13 @@
     searchDialog->setCaption(caption);
     searchDialog->setSearchText(value);
     searchDialog->setItems(searchList);
-    if (searchDialog->ExecPopup() == 0)
+    if (kDialogCodeAccepted == searchDialog->ExecPopup())
     {
         value = searchDialog->getResult();
         res = true;
     }
 
-    delete searchDialog;
+    searchDialog->deleteLater();
 
     return res;
 }
@@ -1089,7 +1090,7 @@
     connect(titleEdit, SIGNAL(textChanged(void)), this, SLOT(titleChanged(void)));
     connect(categoryButton, SIGNAL(clicked()), this, SLOT(categoryClicked()));
     connect(saveButton, SIGNAL(clicked()), this, SLOT(saveClicked()));
-    connect(cancelButton, SIGNAL(clicked()), this, SLOT(cancelClicked()));
+    connect(cancelButton, SIGNAL(clicked()), this, SLOT(reject()));
     connect(showResultsButton, SIGNAL(clicked()), this, SLOT(showResultsClicked()));
     connect(orderByButton, SIGNAL(clicked()), this, SLOT(orderByClicked()));
     
@@ -1211,7 +1212,7 @@
         row->saveToDatabase(ID);
     }
     
-    done(0);        
+    reject();        
 }
 
 void SmartPlaylistEditor::newSmartPlaylist(QString category)
@@ -1308,11 +1309,6 @@
     }
 }
 
-void SmartPlaylistEditor::cancelClicked(void)
-{
-    done(-1);
-}
-
 void SmartPlaylistEditor::categoryClicked(void)
 {
    showCategoryPopup();
@@ -1514,7 +1510,7 @@
     
     orderByDialog->setFieldList(orderByCombo->currentText());
     
-    if (orderByDialog->ExecPopup() == 0)
+    if (kDialogCodeAccepted == orderByDialog->ExecPopup())
         orderByCombo->setCurrentText(orderByDialog->getFieldList());
     
     delete orderByDialog;
@@ -1874,7 +1870,7 @@
             if (action == "ESCAPE")
             {
                 handled = true;
-                done(-1);        
+                reject();
             }
             else if (action == "LEFT")
             {
@@ -2176,7 +2172,7 @@
     connect(moveDownButton, SIGNAL(clicked()), this, SLOT(moveDownPressed()));
     connect(ascendingButton, SIGNAL(clicked()), this, SLOT(ascendingPressed()));
     connect(descendingButton, SIGNAL(clicked()), this, SLOT(descendingPressed()));
-    connect(okButton, SIGNAL(clicked()), this, SLOT(okPressed()));
+    connect(okButton, SIGNAL(clicked()), this, SLOT(accept()));
     
     connect(listbox, SIGNAL(selectionChanged(QListBoxItem*)), this, 
             SLOT(listBoxSelectionChanged(QListBoxItem*)));
@@ -2243,7 +2239,7 @@
             if (action == "ESCAPE")
             {
                 handled = true;
-                done(-1);        
+                reject();
             }
             else if (action == "LEFT")
             {
@@ -2298,7 +2294,7 @@
             else if (action == "7")
             {
                 handled = true;
-                okPressed();
+                accept();
             }
         }
     }
@@ -2367,11 +2363,6 @@
     listbox->setSelected(listbox->selectedItem()->next(), true);
 }
 
-void SmartPLOrderByDialog::okPressed(void)
-{
-    done(0);
-}
-
 void SmartPLOrderByDialog::orderByChanged(void)
 {
     bool found = false;
@@ -2551,8 +2542,8 @@
 
     addLayout(vbox, 0);
     
-    connect(okButton, SIGNAL(clicked()), this, SLOT(okPressed()));
-    connect(cancelButton, SIGNAL(clicked()), this, SLOT(cancelPressed()));
+    connect(okButton, SIGNAL(clicked()), this, SLOT(accept()));
+    connect(cancelButton, SIGNAL(clicked()), this, SLOT(reject()));
 
     connect(fixedRadio, SIGNAL(toggled(bool)), this, SLOT(fixedCheckToggled(bool)));
     connect(nowRadio, SIGNAL(toggled(bool)), this, SLOT(nowCheckToggled(bool)));
@@ -2661,7 +2652,7 @@
             if (action == "ESCAPE")
             {
                 handled = true;
-                done(-1);        
+                reject();
             }
             else if (action == "LEFT")
             {
@@ -2689,16 +2680,6 @@
         MythPopupBox::keyPressEvent(e);
 }
 
-void SmartPLDateDialog::okPressed(void)
-{
-    done(0);
-}
-
-void SmartPLDateDialog::cancelPressed(void)
-{
-    done(-1);
-}
-
 void SmartPLDateDialog::fixedCheckToggled(bool on)
 {
     daySpinEdit->setEnabled(on);
Index: mythplugins/mythmusic/mythmusic/editmetadata.cpp
===================================================================
--- mythplugins/mythmusic/mythmusic/editmetadata.cpp	(revision 14901)
+++ mythplugins/mythmusic/mythmusic/editmetadata.cpp	(working copy)
@@ -521,7 +521,8 @@
     searchDialog->setCaption(caption);
     searchDialog->setSearchText(value);
     searchDialog->setItems(searchList);
-    if (searchDialog->ExecPopupAtXY(-1, 8) == 0)
+    DialogCode rescode = searchDialog->ExecPopupAtXY(-1, 8);
+    if (kDialogCodeRejected != rescode)
     {
         value = searchDialog->getResult();
         res = true;
@@ -600,7 +601,7 @@
 void EditMetadataDialog::closeDialog()
 {
     cancelPopup();
-    done(1);  
+    accept();
 }
 
 void EditMetadataDialog::showSaveMenu()
@@ -654,7 +655,7 @@
     cancelPopup();
 
     *m_sourceMetadata = m_metadata;
-    done(1);
+    accept();
 }
 
 void EditMetadataDialog::saveToDatabase()
@@ -663,7 +664,7 @@
 
     m_metadata->dumpToDatabase();
     *m_sourceMetadata = m_metadata;
-    done(1);
+    accept();
 }
 
 void EditMetadataDialog::saveToFile()
@@ -685,7 +686,7 @@
         decoder->commitMetadata(m_metadata);
         delete decoder;
     }
-    done(1);
+    accept();
 }
 
 void EditMetadataDialog::saveAll()
@@ -727,7 +728,8 @@
     menu->addButton(albumArt->getTypeName(IT_CD));
     menu->addButton(albumArt->getTypeName(IT_INLAY));
 
-    int res = menu->ExecPopup();
+    DialogCode ret = menu->ExecPopup();
+    int res = MythDialog::CalcItemIndex(ret);
 
     if ((IT_UNKNOWN <= res) && (res < IT_LAST))
     {
Index: mythplugins/mythmusic/mythmusic/smartplaylist.h
===================================================================
--- mythplugins/mythmusic/mythmusic/smartplaylist.h	(revision 14901)
+++ mythplugins/mythmusic/mythmusic/smartplaylist.h	(working copy)
@@ -112,7 +112,6 @@
     void updateMatches(void);
     void categoryClicked(void);
     void saveClicked(void);
-    void cancelClicked(void);
     void showResultsClicked(void);
     
     // category popup
@@ -232,7 +231,6 @@
     void descendingPressed(void);
     void orderByChanged(void);
     void listBoxSelectionChanged(QListBoxItem *item);
-    void okPressed(void);
     
  protected:
     void keyPressEvent(QKeyEvent *e);
@@ -271,9 +269,6 @@
     void addDaysCheckToggled(bool on);
     void valueChanged(void);
     
-    void okPressed(void);
-    void cancelPressed(void);
-        
  protected:
     void keyPressEvent(QKeyEvent *e);
 
Index: mythplugins/mythmusic/mythmusic/importmusic.h
===================================================================
--- mythplugins/mythmusic/mythmusic/importmusic.h	(revision 14901)
+++ mythplugins/mythmusic/mythmusic/importmusic.h	(working copy)
@@ -150,7 +150,6 @@
     void copyPressed(void);
     void prevPressed(void);
     void nextPressed(void);
-    void exitPressed(void);
     void selectorChanged(int item);
 
   private:
Index: mythplugins/mythmusic/mythmusic/search.h
===================================================================
--- mythplugins/mythmusic/mythmusic/search.h	(revision 14901)
+++ mythplugins/mythmusic/mythmusic/search.h	(working copy)
@@ -33,8 +33,6 @@
 
     void searchTextChanged(const QString &searchText);
     void itemSelected(int i);
-    void okPressed(void);
-    void cancelPressed(void);
 
   private:
 
Index: mythplugins/mythmusic/mythmusic/importmusic.cpp
===================================================================
--- mythplugins/mythmusic/mythmusic/importmusic.cpp	(revision 14901)
+++ mythplugins/mythmusic/mythmusic/importmusic.cpp	(working copy)
@@ -356,9 +356,9 @@
 {
     DirectoryFinder finder(m_location_edit->getText(),
                            gContext->GetMainWindow(), "directory finder");
-    bool res = finder.exec();
+    DialogCode res = finder.exec();
 
-    if (res)
+    if (kDialogCodeRejected != res)
     {
         m_location_edit->setText(finder.getSelected());
         editLostFocus();
@@ -671,7 +671,7 @@
                                   "edit_metadata", "music-", "edit metadata");
     editDialog.setSaveMetadataOnly();
 
-    if (editDialog.exec())
+    if (kDialogCodeRejected != editDialog.exec())
     {
         m_tracks->at(m_currentTrack)->metadataHasChanged = true;
         m_tracks->at(m_currentTrack)->isNewTune = Ripper::isNewTune(
@@ -1007,7 +1007,7 @@
     if (m_exit_button)
     {
         m_exit_button->setText(tr("Exit"));
-        connect(m_exit_button, SIGNAL(pushed()), this, SLOT(exitPressed()));
+        connect(m_exit_button, SIGNAL(pushed()), this, SLOT(reject()));
     }
 
     m_prev_button = getUIPushButtonType("prev_button");
@@ -1042,11 +1042,6 @@
     updateStatus();
 }
 
-void ImportCoverArtDialog::exitPressed()
-{
-    done(0);
-}
-
 void ImportCoverArtDialog::copyPressed()
 {
     if (m_filelist.size() > 0)
Index: mythplugins/mytharchive/mytharchive/videoselector.cpp
===================================================================
--- mythplugins/mytharchive/mytharchive/videoselector.cpp	(revision 14901)
+++ mythplugins/mytharchive/mytharchive/videoselector.cpp	(working copy)
@@ -55,7 +55,7 @@
 
         if (action == "ESCAPE")
         {
-            done(0);
+            reject();
         }
         else if (action == "DOWN")
         {
@@ -602,7 +602,7 @@
                 password,
                 gContext->GetMainWindow());
         pwd->exec();
-        delete pwd;
+        pwd->deleteLater();
         if (ok)
         {
             //  All is good
Index: mythplugins/mytharchive/mytharchive/logviewer.h
===================================================================
--- mythplugins/mytharchive/mytharchive/logviewer.h	(revision 14901)
+++ mythplugins/mytharchive/mytharchive/logviewer.h	(working copy)
@@ -21,7 +21,6 @@
     void setFilenames(const QString &progressLog, const QString &fullLog);
 
   protected slots:
-    void exitClicked(void);
     void cancelClicked(void);
     void updateClicked(void);
     void updateTimerTimeout(void);
Index: mythplugins/mytharchive/mytharchive/fileselector.cpp
===================================================================
--- mythplugins/mytharchive/mytharchive/fileselector.cpp	(revision 14901)
+++ mythplugins/mytharchive/mytharchive/fileselector.cpp	(working copy)
@@ -206,7 +206,7 @@
          || !m_cancelButton || !m_homeButton)
     {
         cout << "FileSelector: Your theme is missing some UI elements! Bailing out." << endl;
-        QTimer::singleShot(100, this, SLOT(done(int)));
+        QTimer::singleShot(100, this, SLOT(reject()));
     }
 
     // load pixmaps
Index: mythplugins/mytharchive/mytharchive/main.cpp
===================================================================
--- mythplugins/mytharchive/mytharchive/main.cpp	(revision 14901)
+++ mythplugins/mytharchive/mytharchive/main.cpp	(working copy)
@@ -103,8 +103,6 @@
 void runCreateDVD(void)
 {
 #ifdef CREATE_DVD 
-    int res;
-
     QString commandline;
     QString tempDir = getTempDirectory(true);
 
@@ -132,12 +130,12 @@
     burnWiz = new MythburnWizard(gContext->GetMainWindow(),
                              "mythburn_wizard", "mythburn-");
     qApp->unlock();
-    res = burnWiz->exec();
+    DialogCode res = burnWiz->exec();
     qApp->lock();
     qApp->processEvents();
     delete burnWiz;
 
-    if (res == 0)
+    if (kDialogCodeRejected == res)
         return;
 
     // now show the log viewer
@@ -152,8 +150,6 @@
 void runCreateArchive(void)
 {
 #ifdef CREATE_NATIVE
-    int res;
-
     QString commandline;
     QString tempDir = getTempDirectory(true);
 
@@ -181,12 +177,12 @@
     nativeWiz = new ExportNativeWizard(gContext->GetMainWindow(),
                                  "exportnative_wizard", "mythnative-");
     qApp->unlock();
-    res = nativeWiz->exec();
+    DialogCode res = nativeWiz->exec();
     qApp->lock();
     qApp->processEvents();
     delete nativeWiz;
 
-    if (res == 0)
+    if (kDialogCodeRejected == res)
         return;
 
     // now show the log viewer
@@ -231,10 +227,10 @@
     ImportNativeWizard wiz("/", filter, gContext->GetMainWindow(),
                           "import_native_wizard", "mythnative-", "import native wizard");
     qApp->unlock();
-    int res = wiz.exec();
+    DialogCode res = wiz.exec();
     qApp->lock();
 
-    if (res == 0)
+    if (kDialogCodeRejected == res)
         return;
 
     // now show the log viewer
@@ -311,8 +307,6 @@
         return;
     }
 
-    int res;
-
     // ask the user what type of disk to burn to
     DialogBox *dialog = new DialogBox(gContext->GetMainWindow(),
             QObject::tr("\nPlace a blank DVD in the drive and select an option below."));
@@ -322,13 +316,17 @@
     dialog->AddButton(QObject::tr("Burn DVD Rewritable (Force Erase)"));
     dialog->AddButton(QObject::tr("Cancel"));
 
-    res = dialog->exec();
+    DialogCode res = dialog->exec();
     dialog->deleteLater();
 
-    // cancel pressed?
-    if (res == 4)
+    // cancel pressed or escape hit?
+    if ((kDialogCodeButton3 == res) || (kDialogCodeRejected == res))
         return;
 
+    int fmt = MythDialog::CalcItemIndex(res);
+    if ((fmt < 0) || (fmt > 2))
+        return;
+
     QString tempDir = getTempDirectory(true);
 
     if (tempDir == "")
@@ -346,8 +344,8 @@
     if (QFile::exists(logDir + "/mythburncancel.lck"))
         QFile::remove(logDir + "/mythburncancel.lck");
 
-    QString sArchiveFormat = QString::number(res - 1);
-    QString sEraseDVDRW = (res == 3 ? "1" : "0");
+    QString sArchiveFormat = QString::number(fmt);
+    QString sEraseDVDRW = (kDialogCodeButton2 == res) ? "1" : "0";
     QString sNativeFormat = (gContext->GetSetting("MythArchiveLastRunType").startsWith("Native") ? "1" : "0");
 
     commandline = "mytharchivehelper -b " + sArchiveFormat + " " + sEraseDVDRW  + " " + sNativeFormat;
Index: mythplugins/mytharchive/mytharchive/editmetadata.h
===================================================================
--- mythplugins/mytharchive/mytharchive/editmetadata.h	(revision 14901)
+++ mythplugins/mytharchive/mytharchive/editmetadata.h	(working copy)
@@ -32,7 +32,6 @@
     void closeDialog();
     void showSaveMenu();
     void savePressed();
-    void cancelPressed();
     void editLostFocus();
 
   private:
Index: mythplugins/mytharchive/mytharchive/importnativewizard.cpp
===================================================================
--- mythplugins/mytharchive/mytharchive/importnativewizard.cpp	(revision 14901)
+++ mythplugins/mytharchive/mytharchive/importnativewizard.cpp	(working copy)
@@ -259,7 +259,7 @@
          || !m_prevButton || !m_cancelButton || !m_homeButton)
     {
         cout << "ImportNativeWizard: Your theme is missing some UI elements! Bailing out." << endl;
-        QTimer::singleShot(100, this, SLOT(done(int)));
+        QTimer::singleShot(100, this, SLOT(reject()));
     }
 
     // load pixmaps
@@ -718,13 +718,14 @@
     searchDialog->setCaption(caption);
     searchDialog->setSearchText(value);
     searchDialog->setItems(m_searchList);
-    if (searchDialog->ExecPopupAtXY(-1, 8) == 0)
+    DialogCode rescode = searchDialog->ExecPopupAtXY(-1, 8);
+    if (kDialogCodeRejected != rescode)
     {
         value = searchDialog->getResult();
         res = true;
     }
 
-    delete searchDialog;
+    searchDialog->deleteLater();
     setActiveWindow();
 
     return res;
Index: mythplugins/mytharchive/mytharchive/logviewer.cpp
===================================================================
--- mythplugins/mytharchive/mytharchive/logviewer.cpp	(revision 14901)
+++ mythplugins/mytharchive/mytharchive/logviewer.cpp	(working copy)
@@ -100,7 +100,7 @@
 
     hbox->addWidget(m_exitButton);
 
-    connect(m_exitButton, SIGNAL(clicked()), this, SLOT(exitClicked()));
+    connect(m_exitButton, SIGNAL(clicked()), this, SLOT(reject()));
     connect(m_cancelButton, SIGNAL(clicked()), this, SLOT(cancelClicked()));
     connect(m_updateButton, SIGNAL(clicked()), this, SLOT(updateClicked()));
     connect(m_autoupdateCheck, SIGNAL(toggled(bool)), this, SLOT(toggleAutoUpdate(bool)));
@@ -150,11 +150,6 @@
     m_updateTimer->changeInterval(value * 1000);
 }
 
-void LogViewer::exitClicked(void)
-{
-    done(-1);
-}
-
 void LogViewer::cancelClicked(void)
 {
     QString tempDir = gContext->GetSetting("MythArchiveTempDir", "");
Index: mythplugins/mytharchive/mytharchive/exportnativewizard.cpp
===================================================================
--- mythplugins/mytharchive/mytharchive/exportnativewizard.cpp	(revision 14901)
+++ mythplugins/mytharchive/mytharchive/exportnativewizard.cpp	(working copy)
@@ -679,7 +679,7 @@
     FileSelector selector(FSTYPE_FILE, "/", "*.*", gContext->GetMainWindow(),
                           "file_selector", "mytharchive-", "file selector");
     qApp->unlock();
-    bool res = selector.exec();
+    bool res = (kDialogCodeRejected != selector.exec());
 
     if (res)
     {
Index: mythplugins/mytharchive/mytharchive/recordingselector.cpp
===================================================================
--- mythplugins/mytharchive/mytharchive/recordingselector.cpp	(revision 14901)
+++ mythplugins/mytharchive/mytharchive/recordingselector.cpp	(working copy)
@@ -56,7 +56,7 @@
 
         if (action == "ESCAPE")
         {
-            done(0);
+            done(kDialogCodeRejected);
         }
         else if (action == "DOWN")
         {
Index: mythplugins/mytharchive/mytharchive/editmetadata.cpp
===================================================================
--- mythplugins/mytharchive/mytharchive/editmetadata.cpp	(revision 14901)
+++ mythplugins/mytharchive/mytharchive/editmetadata.cpp	(working copy)
@@ -146,7 +146,7 @@
     if (cancel_button)
     {
         cancel_button->setText(tr("Cancel"));
-        connect(cancel_button, SIGNAL(pushed()), this, SLOT(cancelPressed()));
+        connect(cancel_button, SIGNAL(pushed()), this, SLOT(reject()));
     }
 
     buildFocusList();
@@ -182,14 +182,9 @@
 {
     *sourceMetadata = workMetadata;
     sourceMetadata->editedDetails = true;
-    done(1);
+    done(kDialogCodeAccepted);
 }
 
-void EditMetadataDialog::cancelPressed()
-{
-    done(Rejected);
-}
-
 EditMetadataDialog::~EditMetadataDialog()
 {
 }
Index: mythplugins/mytharchive/mytharchive/mythburnwizard.cpp
===================================================================
--- mythplugins/mytharchive/mytharchive/mythburnwizard.cpp	(revision 14901)
+++ mythplugins/mytharchive/mytharchive/mythburnwizard.cpp	(working copy)
@@ -1402,7 +1402,7 @@
 
     EditMetadataDialog editDialog(curItem, gContext->GetMainWindow(),
                                   "edit_metadata", "mythburn-", "edit metadata");
-    if (editDialog.exec())
+    if (kDialogCodeRejected != editDialog.exec())
     {
         // update widgets to reflect any changes
         titleChanged(item);
@@ -1476,7 +1476,7 @@
     FileSelector selector(FSTYPE_FILE, "/", "*.*", gContext->GetMainWindow(),
                           "file_selector", "mytharchive-", "file selector");
     qApp->unlock();
-    bool res = selector.exec();
+    bool res = (kDialogCodeRejected != selector.exec());
 
     if (res)
     {
Index: mythplugins/mythbrowser/mythbrowser/tabview.cpp
===================================================================
--- mythplugins/mythbrowser/mythbrowser/tabview.cpp	(revision 14901)
+++ mythplugins/mythbrowser/mythbrowser/tabview.cpp	(working copy)
@@ -327,14 +327,14 @@
     url->setText(((WebPage*)mytab->currentPage())->browser->baseURL().htmlURL());
     popup->addWidget(url);
 
-    popup->addButton(tr("OK"));
-    popup->addButton(tr("Cancel"));
+    popup->addButton(tr("OK"),     popup, SLOT(accept()));
+    popup->addButton(tr("Cancel"), popup, SLOT(reject()));
 
     qApp->removeEventFilter(this);
-    int res = popup->ExecPopup();
+    DialogCode res = popup->ExecPopup();
     qApp->installEventFilter(this);
 
-    if (res == 0)
+    if (kDialogCodeAccepted == res)
     {
         QString sGroup = group->text();
         QString sDesc = desc->text();
@@ -396,14 +396,14 @@
     popup->addWidget(editor);
     editor->setFocus(); 
 
-    popup->addButton(tr("OK"));
-    popup->addButton(tr("Cancel"));
+    popup->addButton(tr("OK"),     popup, SLOT(accept()));
+    popup->addButton(tr("Cancel"), popup, SLOT(reject()));
 
     qApp->removeEventFilter(this);
-    int res = popup->ExecPopup();
+    DialogCode res = popup->ExecPopup();
     qApp->installEventFilter(this);
 
-    if (res == 0)
+    if (kDialogCodeAccepted == res)
     {
         QString sURL = editor->text();
         if (!sURL.startsWith("http://") && !sURL.startsWith("https://") &&
@@ -606,11 +606,12 @@
                         return true;
 
                     inputToggled = true;
-                    VirtualKeyboard *keyboard = new VirtualKeyboard(gContext->GetMainWindow(), 
-                                    ((WebPage*)mytab->currentPage())->browser->view());
+                    VirtualKeyboard *keyboard = new VirtualKeyboard(
+                        gContext->GetMainWindow(), 
+                        ((WebPage*)mytab->currentPage())->browser->view());
                     gContext->GetMainWindow()->detach(keyboard);
                     keyboard->exec();
-                    delete keyboard;
+                    keyboard->deleteLater();
 
                     inputToggled = false;
                 }
Index: mythplugins/mythgallery/mythgallery/iconview.cpp
===================================================================
--- mythplugins/mythgallery/mythgallery/iconview.cpp	(revision 14901)
+++ mythplugins/mythgallery/mythgallery/iconview.cpp	(working copy)
@@ -1335,9 +1335,9 @@
 
     importDlg->AddButton(tr("No"));
     importDlg->AddButton(tr("Yes"));
-    int code = importDlg->exec();
+    DialogCode code = importDlg->exec();
     importDlg->deleteLater();
-    if (2 != code)
+    if (kDialogCodeButton1 != code)
         return;
 
     // Makes import directory samba/windows friendly (no colon)
Index: mythplugins/mythweather/mythweather/weatherSetup.cpp
===================================================================
--- mythplugins/mythweather/mythweather/weatherSetup.cpp	(revision 14901)
+++ mythplugins/mythweather/mythweather/weatherSetup.cpp	(working copy)
@@ -688,18 +688,18 @@
     accept();
 }
 
-typedef QMap<uint, QString> CommandMap;
+typedef QMap<DialogCode, QString> CommandMap;
 
-static uint add_button(QStringList   &buttons,
+static DialogCode add_button(QStringList   &buttons,
                              CommandMap    &commands,
                              const QString &button_text,
                              const QString &command)
 {
     int idx = buttons.size();
     buttons += button_text;
-    commands[idx] = command;
+    commands[(DialogCode)((int)kDialogCodeButton0 + idx)] = command;
 
-    return idx;
+    return (DialogCode)((int)kDialogCodeButton0 + idx);
 }
 
 void ScreenSetup::doListSelect(UIListBtnType *list,
@@ -725,10 +725,11 @@
         add_button(buttons, commands, tr("Move Down"), "move_down");
         add_button(buttons, commands, tr("Remove"),    "remove");
 
-        int cancelbtn =
+        DialogCode cancelbtn =
             add_button(buttons, commands, tr("Cancel"), "cancel");
+        commands[kDialogCodeRejected] = "cancel";
 
-        int res = MythPopupBox::showButtonPopup(
+        DialogCode res = MythPopupBox::ShowButtonPopup(
             gContext->GetMainWindow(), "Manipulate Screen",
             tr("Action to take on screen ") + selected->text(),
             buttons, cancelbtn);
@@ -888,16 +889,17 @@
     units_t *units = &si->units;
     QStringList unitsBtns;
     unitsBtns << tr("English Units") << tr("SI Units");
-    int ret = MythPopupBox::showButtonPopup(
-            gContext->GetMainWindow(), "Change Units",
-            tr("Select units for screen ") + name, unitsBtns,
-            *units == ENG_UNITS ? 0 : 1);
+    DialogCode ret = MythPopupBox::ShowButtonPopup(
+        gContext->GetMainWindow(), "Change Units",
+        tr("Select units for screen ") + name, unitsBtns,
+        *units == ENG_UNITS ? kDialogCodeButton0 : kDialogCodeButton1);
+
     switch (ret)
     {
-        case 0:
+        case kDialogCodeButton0:
             *units = ENG_UNITS;
             break;
-        case 1:
+        case kDialogCodeButton1:
             *units = SI_UNITS;
             break;
         default:
Index: mythplugins/mythcontrols/mythcontrols/keygrabber.h
===================================================================
--- mythplugins/mythcontrols/mythcontrols/keygrabber.h	(revision 14901)
+++ mythplugins/mythcontrols/mythcontrols/keygrabber.h	(working copy)
@@ -46,10 +46,6 @@
 
     virtual void deleteLater(void);
 
-  public slots:
-    void Accept(void) { done(1); }
-    void Cancel(void) { done(0); }
-
   protected:
     void Teardown(void);
     ~KeyGrabPopupBox(); // use deleteLater() instead for thread safety
Index: mythplugins/mythcontrols/mythcontrols/mythcontrols.cpp
===================================================================
--- mythplugins/mythcontrols/mythcontrols/mythcontrols.cpp	(revision 14901)
+++ mythplugins/mythcontrols/mythcontrols/mythcontrols.cpp	(working copy)
@@ -260,34 +260,34 @@
     buttons += tr("Keys By Context");
     buttons += QObject::tr("Cancel");
 
-    int code = MythPopupBox::showButtonPopup(
+    DialogCode code = MythPopupBox::ShowButtonPopup(
         gContext->GetMainWindow(), "mcviewmenu", tr("Change View"),
-        buttons, 3);
+        buttons, kDialogCodeButton3);
 
     QStringList contents;
     QString leftcaption, rightcaption;
 
     switch (code)
     {
-        case 0:
+        case kDialogCodeButton0:
             leftcaption = tr(CAPTION_CONTEXT);
             rightcaption = tr(CAPTION_ACTION);
             m_currentView = kActionsByContext;
             contents = m_bindings->GetContexts();
             break;
-        case 1:
+        case kDialogCodeButton1:
             leftcaption = tr(CAPTION_CONTEXT);
             rightcaption = tr(CAPTION_KEY);
             m_currentView = kKeysByContext;
             contents = m_bindings->GetContexts();
             break;
-        case 2:
+        case kDialogCodeButton2:
             leftcaption = tr(CAPTION_KEY);
             rightcaption = tr(CAPTION_CONTEXT);
             m_currentView = kContextsByKey;
             contents = m_bindings->GetKeys();
             break;
-        case 3:
+        case kDialogCodeButton3:
         default:
             return;
     }
@@ -328,19 +328,19 @@
             buttons += tr("Change View");
             buttons += QObject::tr("Cancel");
 
-            int code = MythPopupBox::showButtonPopup(
+            DialogCode code = MythPopupBox::ShowButtonPopup(
                 gContext->GetMainWindow(), "optionmenu", tr("Options"),
-                buttons, 2);
+                buttons, kDialogCodeButton2);
 
             switch (code)
             {
-                case 0:
+                case kDialogCodeButton0:
                     Save();
                     break;
-                case 1:
+                case kDialogCodeButton1:
                     ChangeView();
                     break;
-                case 2:
+                case kDialogCodeButton2:
                 default:
                     break;
             }
@@ -368,13 +368,13 @@
                     buttons += tr("Remove Binding");
                     buttons += QObject::tr("Cancel");
 
-                    int code = MythPopupBox::showButtonPopup(
+                    DialogCode code = MythPopupBox::ShowButtonPopup(
                         gContext->GetMainWindow(), "actionmenu",
-                        tr("Modify Action"), buttons, 2);
+                        tr("Modify Action"), buttons, kDialogCodeButton2);
 
-                    if (0 == code)
+                    if (kDialogCodeButton0 == code)
                         AddKeyToAction();
-                    else if (1 == code)
+                    else if (kDialogCodeButton1 == code)
                         DeleteKey();
                 }
                 else // for blank keys, no reason to ask what to do
@@ -395,13 +395,16 @@
                     buttons += tr("Exit without saving changes");
                     buttons += tr("Save then Exit");
 
-                    int code = MythPopupBox::showButtonPopup(
+                    DialogCode code = MythPopupBox::ShowButtonPopup(
                         gContext->GetMainWindow(), "exitmenu",
                         tr("Exiting, but there are unsaved changes.")+"\n\n"+
-                        tr("Which would you prefer?"), buttons, 1);
+                        tr("Which would you prefer?"), buttons,
+                        kDialogCodeButton1);
 
-                    if (1 == code)
+                    if (kDialogCodeButton1 == code)
                         Save();
+                    else if (kDialogCodeRejected == code)
+                        handled = true;
                 }
             }
             else if (m_focusedUIElement == m_rightList)
@@ -762,11 +765,11 @@
              "Do you want to bind it anyway?")
         .arg(conflict->GetAction()).arg(conflict->GetContext());
 
-    int res = MythPopupBox::show2ButtonPopup(
+    DialogCode res = MythPopupBox::Show2ButtonPopup(
         gContext->GetMainWindow(), tr("Conflict Warning"),
-        msg, tr("Bind Key"), QObject::tr("Cancel"), 2);
+        msg, tr("Bind Key"), QObject::tr("Cancel"), kDialogCodeButton1);
 
-    return (0 == res);
+    return (kDialogCodeButton0 == res);
 }
 
 /** \fn MythControls::AddKeyToAction(void)
@@ -781,12 +784,12 @@
 {
     /* grab a key from the user */
     KeyGrabPopupBox *getkey = new KeyGrabPopupBox(gContext->GetMainWindow());
-    int        code = getkey->ExecPopup();
+    DialogCode code = getkey->ExecPopup();
     QString    key  = getkey->GetCapturedKey();
     getkey->deleteLater();
     getkey = NULL;
 
-    if (MythDialog::Rejected == code)
+    if (kDialogCodeRejected == code)
         return; // user hit Cancel button
 
     QString     action  = GetCurrentAction();
Index: mythplugins/mythvideo/mythvideo/videodlg.h
===================================================================
--- mythplugins/mythvideo/mythvideo/videodlg.h	(revision 14901)
+++ mythplugins/mythvideo/mythvideo/videodlg.h	(working copy)
@@ -25,8 +25,6 @@
                 const QString &lwinName, const QString &lname,
                 VideoList *video_list);
 
-    virtual ~VideoDialog();
-
     virtual void playVideo(Metadata *someItem);
 
     GenericTree *getVideoTreeRoot(void);
@@ -48,6 +46,7 @@
     virtual void slotWatchVideo();
 
   protected:
+    virtual ~VideoDialog(); // use deleteLater() instead for thread safety
     virtual void updateBackground(void);
     virtual void parseContainer(QDomElement&) = 0;
     virtual void loadWindow(QDomElement &element);
Index: mythplugins/mythvideo/mythvideo/videomanager.h
===================================================================
--- mythplugins/mythvideo/mythvideo/videomanager.h	(revision 14901)
+++ mythplugins/mythvideo/mythvideo/videomanager.h	(working copy)
@@ -28,7 +28,6 @@
   public:
     VideoManager(MythMainWindow *lparent, const QString &lname,
                  VideoList *video_list);
-    ~VideoManager();
     int videoExitType() { return 0; }
 
   public slots:
@@ -55,6 +54,7 @@
     void exitWin();
 
   protected:
+    ~VideoManager(); // use deleteLater() instead for thread safety
     void paintEvent(QPaintEvent *e);
     void keyPressEvent(QKeyEvent *e);
     void doWaitBackground(QPainter &p, const QString &titleText);
Index: mythplugins/mythvideo/mythvideo/main.cpp
===================================================================
--- mythplugins/mythvideo/mythvideo/main.cpp	(revision 14901)
+++ mythplugins/mythvideo/mythvideo/main.cpp	(working copy)
@@ -71,12 +71,49 @@
     };
 
     template <typename T>
+    class q_screen_inst
+    {
+      public:
+        q_screen_inst(T *inst, const QString &loc_name) : m_inst(inst),
+            m_location_name(loc_name)
+        {
+        }
+
+        int run()
+        {
+            gContext->addCurrentLocation(m_location_name);
+            qApp->unlock();
+            m_inst->exec();
+            qApp->lock();
+            gContext->removeCurrentLocation();
+            return m_inst->videoExitType();
+        }
+
+        ~q_screen_inst()
+        {
+            m_inst->deleteLater();
+            m_inst = NULL;
+        }
+
+      private:
+        T *m_inst;
+        const QString &m_location_name;
+    };
+
+    template <typename T>
     int exec_screen(T *inst, const QString &loc_name)
     {
         screen_inst<T> si(inst, loc_name);
         return si.run();
     }
 
+    template <typename T>
+    int q_exec_screen(T *inst, const QString &loc_name)
+    {
+        q_screen_inst<T> si(inst, loc_name);
+        return si.run();
+    }
+
     class screens
     {
       private:
@@ -87,10 +124,10 @@
                 VideoScanner scanner;
                 scanner.doScan(GetVideoDirs());
 
-                return exec_screen(new VideoManager(gContext->GetMainWindow(),
-                                                    "video manager",
-                                                    video_list),
-                                   "videomanager");
+                return q_exec_screen(
+                    new VideoManager(gContext->GetMainWindow(),
+                                     "video manager", video_list),
+                    "videomanager");
             }
             return 0;
         }
@@ -112,9 +149,9 @@
 
         static int runVideoGallery(VideoList *video_list)
         {
-            return exec_screen(new VideoGallery(gContext->GetMainWindow(),
-                                                "video gallery", video_list),
-                               "videogallery");
+            return q_exec_screen(new VideoGallery(gContext->GetMainWindow(),
+                                                  "video gallery", video_list),
+                                 "videogallery");
         }
 
       public:
Index: mythplugins/mythvideo/mythvideo/videotree.cpp
===================================================================
--- mythplugins/mythvideo/mythvideo/videotree.cpp	(revision 14901)
+++ mythplugins/mythvideo/mythvideo/videotree.cpp	(working copy)
@@ -296,7 +296,7 @@
             {
                 if (m_imp->m_use_arrow_accel)
                 {
-                    done(1);
+                    accept();
                 }
                 else
                     handled = false;
@@ -521,7 +521,8 @@
                                               MythPopupBox::Small,true);
         plotLabel->setAlignment(Qt::AlignJustify | Qt::WordBreak);
 
-        QButton * okButton = plotbox->addButton(tr("Ok"));
+        QButton *okButton = plotbox->addButton(
+            QObject::tr("OK"), plotbox, SLOT(accept()));
         okButton->setFocus();
 
         plotbox->ExecPopup();
Index: mythplugins/mythvideo/mythvideo/videogallery.h
===================================================================
--- mythplugins/mythvideo/mythvideo/videogallery.h	(revision 14901)
+++ mythplugins/mythvideo/mythvideo/videogallery.h	(working copy)
@@ -33,6 +33,7 @@
     void handleVideoSelect();
 
   protected:
+    ~VideoGallery() {} // use deleteLater instead for thread safety
     virtual void parseContainer(QDomElement &element);
     virtual void fetchVideos();
     void doMenu(bool info = false);
Index: mythplugins/mythvideo/mythvideo/videodlg.cpp
===================================================================
--- mythplugins/mythvideo/mythvideo/videodlg.cpp	(revision 14901)
+++ mythplugins/mythvideo/mythvideo/videodlg.cpp	(working copy)
@@ -157,7 +157,8 @@
                                               MythPopupBox::Small,true);
         plotLabel->setAlignment(Qt::AlignJustify | Qt::WordBreak);
 
-        QButton * okButton = plotbox->addButton(tr("Ok"));
+        QButton *okButton = plotbox->addButton(
+            tr("OK"), plotbox, SLOT(accept()));
         okButton->setFocus();
 
         plotbox->ExecPopup();
Index: mythplugins/mythvideo/mythvideo/titledialog.cpp
===================================================================
--- mythplugins/mythvideo/mythvideo/titledialog.cpp	(revision 14901)
+++ mythplugins/mythvideo/mythvideo/titledialog.cpp	(working copy)
@@ -440,7 +440,7 @@
             os << job_string << "\n" ;
         }
     }
-    done(0);
+    reject();
 }
 
 void TitleDialog::takeFocusAwayFromEditor(bool up_or_down)
@@ -534,9 +534,10 @@
 
 TitleDialog::~TitleDialog()
 {
-    if(name_editor)
+    if (name_editor)
     {
-        delete name_editor;
+        name_editor->deleteLater();
+        name_editor = NULL;
     }
 }
 
Index: mythplugins/mythvideo/mythvideo/fileassoc.cpp
===================================================================
--- mythplugins/mythvideo/mythvideo/fileassoc.cpp	(revision 14901)
+++ mythplugins/mythvideo/mythvideo/fileassoc.cpp	(working copy)
@@ -330,7 +330,7 @@
 void FileAssocDialog::saveAndExit()
 {
     saveFileAssociations();
-    done(0);
+    reject();
 }
 
 void FileAssocDialog::toggleDefault(bool yes_or_no)
@@ -410,7 +410,7 @@
 void FileAssocDialog::removeExtensionPopup()
 {
     new_extension_popup->close();
-    delete new_extension_editor;
+    new_extension_editor->deleteLater();
     new_extension_editor = NULL;
     new_extension_popup->deleteLater();
     new_extension_popup = NULL;
@@ -503,6 +503,7 @@
     file_associations.clear();
     if (command_editor)
     {
-        delete command_editor;
+        command_editor->deleteLater();
+        command_editor = NULL;
     }
 }
Index: mythplugins/mythvideo/mythvideo/videoscan.cpp
===================================================================
--- mythplugins/mythvideo/mythvideo/videoscan.cpp	(revision 14901)
+++ mythplugins/mythvideo/mythvideo/videoscan.cpp	(working copy)
@@ -112,20 +112,26 @@
     buttonText += QObject::tr("Yes");
     buttonText += QObject::tr("Yes to all");
 
-    int result = MythPopupBox::showButtonPopup(gContext->GetMainWindow(),
-            QObject::tr("File Missing"),
-            QString(QObject::tr("%1 appears to be missing.\nRemove it "
-                                "from the database?")).arg(filename),
-            buttonText, 1);
+    DialogCode result = MythPopupBox::ShowButtonPopup(
+        gContext->GetMainWindow(),
+        QObject::tr("File Missing"),
+        QObject::tr("%1 appears to be missing.\n"
+                    "Remove it from the database?").arg(filename),
+        buttonText, kDialogCodeButton0);
+
     switch (result)
     {
-        case 1:
+        case kDialogCodeRejected:
+        case kDialogCodeButton0:
+        default:
+            break;
+        case kDialogCodeButton1:
             m_KeepAll = true;
             break;
-        case 2:
+        case kDialogCodeButton2:
             m_dbmetadata->purgeByID(id);
             break;
-        case 3:
+        case kDialogCodeButton3:
             m_RemoveAll = true;
             m_dbmetadata->purgeByID(id);
             break;
Index: mythplugins/mythvideo/mythvideo/videofilter.cpp
===================================================================
--- mythplugins/mythvideo/mythvideo/videofilter.cpp	(revision 14901)
+++ mythplugins/mythvideo/mythvideo/videofilter.cpp	(working copy)
@@ -671,7 +671,7 @@
 void VideoFilterDialog::saveAndExit()
 {
     m_fsp->setSettings(m_settings);
-    done(0);
+    reject();
 }
 
 void VideoFilterDialog::setYear(int new_year)
Index: mythplugins/mythvideo/mythvideo/editmetadata.cpp
===================================================================
--- mythplugins/mythvideo/mythvideo/editmetadata.cpp	(revision 14901)
+++ mythplugins/mythvideo/mythvideo/editmetadata.cpp	(working copy)
@@ -367,7 +367,7 @@
     //  All done
     //
 
-    done(0);
+    reject();
 }
 
 void EditMetadataDialog::setTitle(QString new_title)
@@ -437,7 +437,7 @@
         checkedSetText(coverart_text, new_coverart_file);
     }
 
-    delete nca;
+    nca->deleteLater();
 }
 
 void EditMetadataDialog::wireUpTheme()
@@ -532,14 +532,19 @@
 {
     if (title_editor)
     {
-        delete title_editor;
+        title_editor->deleteLater();
+        title_editor = NULL;
     }
+
     if (player_editor)
     {
-        delete player_editor;
+        player_editor->deleteLater();
+        player_editor = NULL;
     }
+
     if (working_metadata)
     {
         delete working_metadata;
+        working_metadata = NULL;
     }
 }
Index: mythplugins/mythvideo/mythvideo/parentalcontrols.cpp
===================================================================
--- mythplugins/mythvideo/mythvideo/parentalcontrols.cpp	(revision 14901)
+++ mythplugins/mythvideo/mythvideo/parentalcontrols.cpp	(working copy)
@@ -156,12 +156,12 @@
   public:
     MythMultiPasswordDialog(const QString &message, const QStringList &pwlist,
                             MythMainWindow *lparent, const char *lname = 0);
-    ~MythMultiPasswordDialog();
 
   private slots:
     void checkPassword(const QString &password);
 
   protected:
+    ~MythMultiPasswordDialog(); // use deleteLater for thread safety
     void keyPressEvent(QKeyEvent *e);
 
   private:
@@ -228,7 +228,7 @@
          ++p)
     {
         if (password == *p)
-            done(1);
+            accept();
     }
 }
 
@@ -363,8 +363,8 @@
             new MythMultiPasswordDialog(QObject::tr("Parental Pin:"),
                                         valid_passwords,
                                         gContext->GetMainWindow());
-    bool ok = pwd->exec();
-    delete pwd;
+    bool ok = (kDialogCodeRejected != pwd->exec());
+    pwd->deleteLater();
 
     if (ok)
     {
Index: mythplugins/mythgame/mythgame/gamesettings.h
===================================================================
--- mythplugins/mythgame/mythgame/gamesettings.h	(revision 14901)
+++ mythplugins/mythgame/mythgame/gamesettings.h	(working copy)
@@ -121,7 +121,7 @@
     virtual MythDialog *dialogWidget(MythMainWindow *parent,
                                      const char     *widgetName=0);
 
-    virtual int exec();
+    virtual DialogCode exec(void);
     virtual void load();
     virtual void save() { };
 
Index: mythplugins/mythgame/mythgame/gamehandler.cpp
===================================================================
--- mythplugins/mythgame/mythgame/gamehandler.cpp	(revision 14901)
+++ mythplugins/mythgame/mythgame/gamehandler.cpp	(working copy)
@@ -206,20 +206,26 @@
     buttonText += QObject::tr("Yes to all");
 
 
-    int result = MythPopupBox::showButtonPopup(gContext->GetMainWindow(), 
-                               QObject::tr("File Missing"),
-                               QString(QObject::tr("%1 appears to be missing.\nRemove it"
-                                                   " from the database?")).arg(filename),
-                                                    buttonText, 0 );
+    DialogCode result = MythPopupBox::ShowButtonPopup(
+        gContext->GetMainWindow(), 
+        QObject::tr("File Missing"),
+        QString(QObject::tr("%1 appears to be missing.\nRemove it"
+                            " from the database?")).arg(filename),
+        buttonText, kDialogCodeButton0);
+
     switch (result)
     {
-        case 1:
+        case kDialogCodeButton0:
+        case kDialogCodeRejected:
+        default:
+            break;
+        case kDialogCodeButton1:
             m_KeepAll = true;
             break;
-        case 2:
+        case kDialogCodeButton2:
             purgeGameDB(filename , RomPath);
             break;
-        case 3:
+        case kDialogCodeButton3:
             m_RemoveAll = true;
             purgeGameDB(filename , RomPath);
             break;
@@ -533,18 +539,22 @@
     buttonText += QObject::tr("No");
     buttonText += QObject::tr("Yes");
 
-    int result = MythPopupBox::showButtonPopup(gContext->GetMainWindow(),
-                               QObject::tr("Are you sure?"),
-                               QString(QObject::tr("This will clear all Game Meta Data\n"
-                                                   "from the database. Are you sure you\n"
-                                                   "want to do this?" )),
-                                                    buttonText, 0 );
+    DialogCode result = MythPopupBox::ShowButtonPopup(
+        gContext->GetMainWindow(),
+        QObject::tr("Are you sure?"),
+        QString(QObject::tr("This will clear all Game Meta Data\n"
+                            "from the database. Are you sure you\n"
+                            "want to do this?" )),
+        buttonText, kDialogCodeButton0);
+
     switch (result)
     {
-        case 0:
+        case kDialogCodeRejected:
+        case kDialogCodeButton0:
+        default:
             // Do Nothing
             break;
-        case 1:
+        case kDialogCodeButton1:
             MSqlQuery query(MSqlQuery::InitCon());
             QString thequery = "DELETE FROM gamemetadata;";
             query.exec(thequery);
Index: mythplugins/mythgame/mythgame/rominfo.cpp
===================================================================
--- mythplugins/mythgame/mythgame/rominfo.cpp	(revision 14901)
+++ mythplugins/mythgame/mythgame/rominfo.cpp	(working copy)
@@ -20,9 +20,13 @@
     QString rom_ver = Version();
 
     GameEditDialog romeditdlg(Romname().latin1());
-    int res = romeditdlg.exec();
 
-    if (res) {
+    DialogCode res = romeditdlg.exec();
+
+    if (kDialogCodeRejected == res)
+        return;
+
+    {
         MSqlQuery query(MSqlQuery::InitCon());
         QString thequery = QString("SELECT gamename,genre,year,country,publisher,favorite FROM gamemetadata "
                                        " WHERE gametype = '%1' AND romname = '%2'; ")
Index: mythplugins/mythgame/mythgame/gametree.cpp
===================================================================
--- mythplugins/mythgame/mythgame/gametree.cpp	(revision 14901)
+++ mythplugins/mythgame/mythgame/gametree.cpp	(working copy)
@@ -360,14 +360,20 @@
                 GameHandler::Launchgame(item->getRomInfo(),NULL);
             else if (item->getRomInfo()->RomCount() > 1)
             {
-                QStringList players = QStringList::split(",", item->getRomInfo()->AllSystems());
-                players += "Cancel";
+                QString all_systems = item->getRomInfo()->AllSystems();
+                QStringList players = QStringList::split(",", all_systems);
+                players += QObject::tr("Cancel");
 
-                int val = MythPopupBox::showButtonPopup(gContext->GetMainWindow(), "", tr("Players Available. \n\n Please pick one."), players,0);
+                DialogCode val = MythPopupBox::ShowButtonPopup(
+                    gContext->GetMainWindow(),
+                    "", tr("Players Available. \n\n Please pick one."),
+                    players, kDialogCodeButton0);
 
-                if (val != -1) {
-                    QString systemname = getElement(players,val);
-                    if ((systemname) && (systemname != "Cancel"))
+                int idx = MythDialog::CalcItemIndex(val);
+                if ((0 <= idx) && (idx < ((int)players.size() - 1)))
+                {
+                    QString systemname = getElement(players, idx);
+                    if (!systemname.isEmpty())
                         GameHandler::Launchgame(item->getRomInfo(),systemname);
                 }
             } 
Index: mythplugins/mythgame/mythgame/gamesettings.cpp
===================================================================
--- mythplugins/mythgame/mythgame/gamesettings.cpp	(revision 14901)
+++ mythplugins/mythgame/mythgame/gamesettings.cpp	(working copy)
@@ -251,11 +251,12 @@
     addChild(listbox);
 }
 
-int MythGamePlayerEditor::exec() {
-    while (ConfigurationDialog::exec() == QDialog::Accepted)
+DialogCode MythGamePlayerEditor::exec(void)
+{
+    while (ConfigurationDialog::exec() == kDialogCodeAccepted)
         edit();
 
-    return QDialog::Rejected;
+    return kDialogCodeRejected;
 }
 
 void MythGamePlayerEditor::load(void)
@@ -284,14 +285,14 @@
     }
     else
     {   
-        int val = MythPopupBox::show2ButtonPopup(gContext->GetMainWindow(),
-                                                 "",
-                                                 tr("Game Player Menu"),
-                                                 tr("Edit.."),                                                                   tr("Delete.."), 1);
-
-        if (val == 0)
+        DialogCode val = MythPopupBox::Show2ButtonPopup(
+            gContext->GetMainWindow(),
+            "", tr("Game Player Menu"),
+            tr("Edit.."), tr("Delete.."), kDialogCodeButton1);
+        
+        if (kDialogCodeButton0 == val)
             edit();
-        else if (val == 1)
+        else if (kDialogCodeButton1 == val)
             del();
     }
 }
@@ -309,13 +310,14 @@
 
 void MythGamePlayerEditor::del(void)
 {
-    int val = MythPopupBox::show2ButtonPopup(gContext->GetMainWindow(), "",
-                                          tr("Are you sure you want to delete "
-                                             "this item?"),
-                                             tr("Yes, delete It"),
-                                             tr("No, don't"), 2);
+    DialogCode val = MythPopupBox::Show2ButtonPopup(
+        gContext->GetMainWindow(), "",
+        tr("Are you sure you want to delete "
+           "this item?"),
+        tr("Yes, delete It"),
+        tr("No, don't"), kDialogCodeButton1);
 
-    if (val == 0)
+    if (kDialogCodeButton0 == val)
     {
         MSqlQuery query(MSqlQuery::InitCon());
         query.prepare("DELETE FROM gameplayers "
Index: mythplugins/mythphone/mythphone/phoneui.cpp
===================================================================
--- mythplugins/mythphone/mythphone/phoneui.cpp	(revision 14901)
+++ mythplugins/mythphone/mythphone/phoneui.cpp	(working copy)
@@ -617,19 +617,23 @@
 {
     if ((!loopbackMode) && (rtpAudio == 0) && (rtpVideo == 0))
     {
-        int loop = MythPopupBox::show2ButtonPopup(gContext->GetMainWindow(), "AskLoopback", "Loopback Audio and video at ...", "Socket on this machine", "NAT Device", 1);
+        DialogCode loop = MythPopupBox::Show2ButtonPopup(
+            gContext->GetMainWindow(),
+            "AskLoopback", tr("Loopback Audio and video at ..."),
+            tr("Socket on this machine"), tr("NAT Device"),
+            kDialogCodeButton0);
         QString loopIp;
         switch (loop)
         {
-        default:
-        case -1:
-            return;
-        case 0:
-            loopIp = sipStack->getLocalIpAddress();
-            break;
-        case 1:
-            loopIp = sipStack->getNatIpAddress();
-            break;
+            default:
+            case kDialogCodeRejected:
+                return;
+            case kDialogCodeButton0:
+                loopIp = sipStack->getLocalIpAddress();
+                break;
+            case kDialogCodeButton1:
+                loopIp = sipStack->getNatIpAddress();
+                break;
         }
         phoneUIStatusBar->DisplayCallState(QString(tr("Audio and Video Looped to ") + loopIp));
         int lvPort = atoi((const char *)gContext->GetSetting("VideoLocalPort"));
Index: mythplugins/mythzoneminder/mythzoneminder/zmevents.cpp
===================================================================
--- mythplugins/mythzoneminder/mythzoneminder/zmevents.cpp	(revision 14901)
+++ mythplugins/mythzoneminder/mythzoneminder/zmevents.cpp	(working copy)
@@ -611,14 +611,14 @@
 
     popup->addButton(tr("Delete All"));
 
-    int res = popup->ExecPopup();
+    DialogCode res = popup->ExecPopup();
     switch (res)
     {
-        case 0:
+        case kDialogCodeButton0:
             // refresh event list;
                 getEventList();
             break;
-        case 1:
+        case kDialogCodeButton1:
             if (getContext() == 1)
             {
                 // switch to grid view;
@@ -630,7 +630,7 @@
                 setView(false);
             }
             break;
-        case 2:
+        case kDialogCodeButton2:
             //delete all events
             if (class ZMClient *zm = ZMClient::get())
             {
@@ -649,6 +649,9 @@
                 busy->deleteLater();
             }
             break;
+        case kDialogCodeRejected:
+        default:
+            break;
     }
 
     popup->deleteLater();
Index: mythplugins/mythzoneminder/mythzoneminder/zmliveplayer.cpp
===================================================================
--- mythplugins/mythzoneminder/mythzoneminder/zmliveplayer.cpp	(revision 14901)
+++ mythplugins/mythzoneminder/mythzoneminder/zmliveplayer.cpp	(working copy)
@@ -74,7 +74,7 @@
     {
         MythPopupBox::showOkPopup(gContext->GetMainWindow(), "No monitors",
                                   tr("Cannot find any monitors. Bailing out!"));
-        done(0);
+        reject();
         return;
     }
 
Index: mythplugins/mythnews/mythnews/mythnews.cpp
===================================================================
--- mythplugins/mythnews/mythnews/mythnews.cpp	(revision 14901)
+++ mythplugins/mythnews/mythnews/mythnews.cpp	(working copy)
@@ -1038,8 +1038,8 @@
 
     popup->addLayout(vbox, 0);
 
-    popup->addButton(tr("OK"));
-    popup->addButton(tr("Cancel"));
+    popup->addButton(tr("OK"),     popup, SLOT(accept()));
+    popup->addButton(tr("Cancel"), popup, SLOT(reject()));
 
     QString siteName = "";
     if (edit)
@@ -1058,9 +1058,9 @@
         }
     }
 
-    int res = popup->ExecPopup();
+    DialogCode res = popup->ExecPopup();
 
-    if (res == 0)
+    if (kDialogCodeAccepted == res)
     {
         if (edit && siteName != "")
             removeFromDB(siteName);
@@ -1070,7 +1070,7 @@
 
     popup->deleteLater();
 
-    return (res == 0);
+    return (kDialogCodeAccepted == res);
 }
 
 void MythNews::showMenu()
Index: mythtv/libs/libmythtv/channeleditor.cpp
===================================================================
--- mythtv/libs/libmythtv/channeleditor.cpp	(revision 14901)
+++ mythtv/libs/libmythtv/channeleditor.cpp	(working copy)
@@ -326,13 +326,12 @@
          tr("Are you sure you would like to delete the channels on %1?")
          .arg(currentLabel));
 
-    int val = MythPopupBox::show2ButtonPopup(
-        gContext->GetMainWindow(), "",
-        chan_msg,
+    DialogCode val = MythPopupBox::Show2ButtonPopup(
+        gContext->GetMainWindow(), "", chan_msg,
         tr("Yes, delete the channels"),
-        tr("No, don't"), 2);
+        tr("No, don't"), kDialogCodeButton1);
 
-    if (val != 0) 
+    if (kDialogCodeButton0 != val)
         return;
 
     MSqlQuery query(MSqlQuery::InitCon());
@@ -389,10 +388,10 @@
     return dialog;
 }
 
-int ChannelEditor::exec()
+DialogCode ChannelEditor::exec(void)
 {
-    while (ConfigurationDialog::exec() == QDialog::Accepted)  {}
-    return QDialog::Rejected;
+    while (ConfigurationDialog::exec() == kDialogCodeAccepted)  {}
+    return kDialogCodeRejected;
 }
 
 void ChannelEditor::edit()
@@ -414,13 +413,13 @@
 {
     id = list->getValue().toInt();
 
-    int val = MythPopupBox::show2ButtonPopup(
-        gContext->GetMainWindow(), "",
-        tr("Are you sure you would like to delete this channel?"),
+    DialogCode val = MythPopupBox::Show2ButtonPopup(
+        gContext->GetMainWindow(),
+        "", tr("Are you sure you would like to delete this channel?"),
         tr("Yes, delete the channel"),
-        tr("No, don't"), 2);
+        tr("No, don't"), kDialogCodeButton1);
 
-    if (val == 0) 
+    if (kDialogCodeButton0 == val)
     {
         MSqlQuery query(MSqlQuery::InitCon());
         query.prepare("DELETE FROM channel WHERE chanid = :CHID ;");
@@ -439,15 +438,14 @@
        edit();
     else
     {
-        int val = MythPopupBox::show2ButtonPopup(gContext->GetMainWindow(),
-                                                 "",
-                                                 tr("Channel Menu"),
-                                                 tr("Edit.."),
-                                                 tr("Delete.."), 1);
+        DialogCode val = MythPopupBox::Show2ButtonPopup(
+            gContext->GetMainWindow(),
+            "", tr("Channel Menu"),
+            tr("Edit.."), tr("Delete.."), kDialogCodeButton0);
 
-        if (val == 0)
+        if (kDialogCodeButton0 == val)
             emit edit();
-        else if (val == 1)
+        else if (kDialogCodeButton1 == val)
             emit del();
         else
             list->setFocus();
Index: mythtv/libs/libmythtv/customedit.cpp
===================================================================
--- mythtv/libs/libmythtv/customedit.cpp	(revision 14901)
+++ mythtv/libs/libmythtv/customedit.cpp	(working copy)
@@ -570,7 +570,7 @@
     msg += m_description->text();
 
     DialogBox *storediag = new DialogBox(gContext->GetMainWindow(), msg);
-    int button = 1, sebtn = -1, exbtn = -1, deletebtn = -1, cancelbtn = -1;
+    int button = 0, sebtn = -1, exbtn = -1, deletebtn = -1, cancelbtn = -1;
 
     QString action = QObject::tr("Store");
     if (nameExists)
@@ -600,7 +600,8 @@
     storediag->AddButton(QObject::tr("Cancel"));
     cancelbtn = button++;
 
-    int ret = storediag->exec();
+    DialogCode code = storediag->exec();
+    int ret = MythDialog::CalcItemIndex(code);
     storediag->deleteLater();
     storediag = NULL;
 
Index: mythtv/libs/libmythtv/progdetails.h
===================================================================
--- mythtv/libs/libmythtv/progdetails.h	(revision 14901)
+++ mythtv/libs/libmythtv/progdetails.h	(working copy)
@@ -21,7 +21,6 @@
 
   protected slots:
     virtual void keyPressEvent(QKeyEvent *e);
-    void done(void);
 
   private:
     void wireUpTheme(void);
Index: mythtv/libs/libmythtv/NuppelVideoPlayer.cpp
===================================================================
--- mythtv/libs/libmythtv/NuppelVideoPlayer.cpp	(revision 14901)
+++ mythtv/libs/libmythtv/NuppelVideoPlayer.cpp	(working copy)
@@ -3149,7 +3149,7 @@
          !gContext->GetNumSetting("PVR350InternalAudioOnly")))
     {
         QString errMsg = ReinitAudio();
-        int ret = 1;
+        DialogCode ret = kDialogCodeButton0;
         if ((errMsg != QString::null) && !using_null_videoout &&
             gContext->GetNumSetting("AudioNag", 1))
         {
@@ -3173,11 +3173,11 @@
             qApp->unlock();
         }
             
-        if (ret == 2)
+        if (kDialogCodeButton1 == ret)
             gContext->SaveSetting("AudioNag", 0);
-        if (ret == 3)
+        if (kDialogCodeButton2 == ret)
             gContext->SetSetting("AudioNag", 0);
-        else if (ret == 4)
+        else if ((kDialogCodeButton3 == ret) || (kDialogCodeRejected == ret))
             return;
     }
 
Index: mythtv/libs/libmythtv/previouslist.cpp
===================================================================
--- mythtv/libs/libmythtv/previouslist.cpp	(revision 14901)
+++ mythtv/libs/libmythtv/previouslist.cpp	(working copy)
@@ -336,7 +336,7 @@
 
     int view = chooseListBox->currentItem();
 
-    choosePopup->done(0);
+    choosePopup->AcceptItem(view);
 
     if (view == curView)
         return;
@@ -712,7 +712,7 @@
                              "delete any recordings.");
     
     DialogBox *dlg = new DialogBox(gContext->GetMainWindow(), message);
-    int button = 1, ok = -1, cleardup = -1, setdup = -1, rm_episode = -1,
+    int button = 0, ok = -1, cleardup = -1, setdup = -1, rm_episode = -1,
         rm_title = -1;
     // int rm_generics = -1;
 
@@ -739,7 +739,8 @@
     //                   "for duplicate matching"));
     // rm_generics = button++;
 
-    int ret = dlg->exec();
+    DialogCode code = dlg->exec();
+    int ret = MythDialog::CalcItemIndex(code);
     dlg->deleteLater();
     dlg = NULL;
 
Index: mythtv/libs/libmythtv/proglist.h
===================================================================
--- mythtv/libs/libmythtv/proglist.h	(revision 14901)
+++ mythtv/libs/libmythtv/proglist.h	(working copy)
@@ -40,7 +40,7 @@
     void cursorUp(bool page = false);
     void prevView(void);
     void nextView(void);
-    void setViewFromList(void);
+    void setViewFromList(int);
     void chooseEditChanged(void);
     void chooseListBoxChanged(void);
     void setViewFromEdit(void);
Index: mythtv/libs/libmythtv/playgroup.cpp
===================================================================
--- mythtv/libs/libmythtv/playgroup.cpp	(revision 14901)
+++ mythtv/libs/libmythtv/playgroup.cpp	(working copy)
@@ -262,12 +262,13 @@
     QString message = tr("Delete playback group:") +
         QString("\n'%1'?").arg(name);
 
-    int value = MythPopupBox::show2ButtonPopup(gContext->GetMainWindow(),
-                                               "", message,
-                                               tr("Yes, delete group"),
-                                               tr("No, Don't delete group"), 2);
+    DialogCode value = MythPopupBox::Show2ButtonPopup(
+        gContext->GetMainWindow(),
+        "", message,
+        tr("Yes, delete group"),
+        tr("No, Don't delete group"), kDialogCodeButton1);
 
-    if (value == 0)
+    if (kDialogCodeButton0 == value)
     {
         MSqlQuery query(MSqlQuery::InitCon());
         query.prepare("DELETE FROM playgroup WHERE name = :NAME;");
@@ -302,12 +303,12 @@
     listbox->setValue(lastValue);
 }
 
-int PlayGroupEditor::exec(void)
+DialogCode PlayGroupEditor::exec(void)
 {
-    while (ConfigurationDialog::exec() == QDialog::Accepted)
+    while (ConfigurationDialog::exec() == kDialogCodeAccepted)
         open(listbox->getValue());
 
-    return QDialog::Rejected;
+    return kDialogCodeRejected;
 }
 
 MythDialog* PlayGroupEditor::dialogWidget(MythMainWindow* parent,
Index: mythtv/libs/libmythtv/videosource.h
===================================================================
--- mythtv/libs/libmythtv/videosource.h	(revision 14901)
+++ mythtv/libs/libmythtv/videosource.h	(working copy)
@@ -542,7 +542,7 @@
 
     virtual MythDialog* dialogWidget(MythMainWindow* parent,
                                      const char* widgetName=0);
-    virtual int exec();
+    virtual DialogCode exec(void);
     virtual void load();
     virtual void save() { };
 
@@ -568,7 +568,7 @@
     bool cardTypesInclude(const int& SourceID, 
                           const QString& thecardtype);
 
-    virtual int exec();
+    virtual DialogCode exec(void);
     virtual void load();
     virtual void save() { };
 
@@ -588,7 +588,7 @@
   public:
     CardInputEditor();
 
-    virtual int exec();
+    virtual DialogCode exec(void);
     virtual void load();
     virtual void save() { };
 
Index: mythtv/libs/libmythtv/proglist.cpp
===================================================================
--- mythtv/libs/libmythtv/proglist.cpp	(revision 14901)
+++ mythtv/libs/libmythtv/proglist.cpp	(working copy)
@@ -397,13 +397,13 @@
     refillAll = true;
 }
 
-void ProgLister::setViewFromList(void)
+void ProgLister::setViewFromList(int item)
 {
+    int view = item;
+
     if (!choosePopup || (!chooseListBox && !chooseEditButton))
         return;
 
-    int view = chooseListBox->currentItem();
-
     if (type == plTitleSearch || type == plKeywordSearch || 
         type == plPeopleSearch)
     {
@@ -426,7 +426,7 @@
         }
     }
 
-    choosePopup->done(0);
+    choosePopup->AcceptItem(item);
 
     if (view == curView)
         return;
@@ -517,7 +517,7 @@
 
     updateKeywordInDB(text);
   
-    choosePopup->done(0);
+    choosePopup->accept();
 
     fillViewList(text);
 
@@ -549,7 +549,7 @@
 
     updateKeywordInDB(text);
 
-    powerPopup->done(0);
+    powerPopup->accept();
 
     fillViewList(text);
 
@@ -676,7 +676,7 @@
     viewList[curView] = searchTime.toString(fullDateFormat);
     viewTextList[curView] = viewList[curView];
 
-    choosePopup->done(0);
+    choosePopup->accept();
 
     curItem = -1;
     refillAll = true;
@@ -716,7 +716,8 @@
             chooseListBox->setCurrentItem(curView);
         choosePopup->addWidget(chooseListBox);
 
-        connect(chooseListBox, SIGNAL(accepted(int)), this, SLOT(setViewFromList()));
+        connect(chooseListBox, SIGNAL(accepted(int)),
+                this,          SLOT(setViewFromList(int)));
 
         chooseListBox->setFocus();
         choosePopup->ExecPopup();
@@ -771,7 +772,8 @@
         chooseRecordButton->setEnabled(chooseLineEdit->text()
                                        .stripWhiteSpace().length() > 0);
 
-        connect(chooseListBox, SIGNAL(accepted(int)), this, SLOT(setViewFromList()));
+        connect(chooseListBox, SIGNAL(accepted(int)),
+                this,          SLOT(setViewFromList(int)));
         connect(chooseListBox, SIGNAL(menuButtonPressed(int)), chooseLineEdit, SLOT(setFocus()));
         connect(chooseListBox, SIGNAL(selectionChanged()), this, SLOT(chooseListBoxChanged()));
         connect(chooseLineEdit, SIGNAL(textChanged()), this, SLOT(chooseEditChanged()));
@@ -837,8 +839,8 @@
         chooseDeleteButton->setEnabled(curView >= 0);
         chooseRecordButton->setEnabled(curView >= 0);
 
-        connect(chooseListBox, SIGNAL(accepted(int)), this,
-                               SLOT(setViewFromList()));
+        connect(chooseListBox, SIGNAL(accepted(int)),
+                this,          SLOT(setViewFromList(int)));
         connect(chooseListBox, SIGNAL(menuButtonPressed(int)),chooseEditButton,
                                SLOT(setFocus()));
         connect(chooseListBox, SIGNAL(selectionChanged()), this,
@@ -1034,7 +1036,7 @@
     powerDescEdit->setText(field[2]);
 
     powerTitleEdit->setFocus();
-    choosePopup->done(0);
+    choosePopup->accept();
     powerPopup->ExecPopup();
 
     powerTitleEdit    = NULL; // deleted by popup delete
Index: mythtv/libs/libmythtv/playgroup.h
===================================================================
--- mythtv/libs/libmythtv/playgroup.h	(revision 14901)
+++ mythtv/libs/libmythtv/playgroup.h	(working copy)
@@ -29,7 +29,7 @@
 
   public:
     PlayGroupEditor(void);
-    virtual int exec(void);
+    virtual DialogCode exec(void);
     virtual void load(void);
     virtual void save(void) { };
     virtual void save(QString) { };
Index: mythtv/libs/libmythtv/scanwizardhelpers.h
===================================================================
--- mythtv/libs/libmythtv/scanwizardhelpers.h	(revision 14901)
+++ mythtv/libs/libmythtv/scanwizardhelpers.h	(working copy)
@@ -65,7 +65,7 @@
   public:
     ScanProgressPopup(bool lock, bool strength, bool snr);
 
-    virtual int exec(void);
+    virtual DialogCode exec(void);
 
     void SetStatusSignalToNoise(int value);
     void SetStatusSignalStrength(int value);
Index: mythtv/libs/libmythtv/progdetails.cpp
===================================================================
--- mythtv/libs/libmythtv/progdetails.cpp	(revision 14901)
+++ mythtv/libs/libmythtv/progdetails.cpp	(working copy)
@@ -94,7 +94,7 @@
             QString action = actions[i];
             handled = true;
             if (action == "ESCAPE" || action == "SELECT")
-                done();
+                reject();
             else if (action == "UP")
             {
                 if (getCurrentFocusWidget() == m_richText)
@@ -144,15 +144,10 @@
     if (m_okButton)
     {
         m_okButton->setText(tr("OK"));
-        connect(m_okButton, SIGNAL(pushed()), this, SLOT(done()));
+        connect(m_okButton, SIGNAL(pushed()), this, SLOT(accept()));
     }
 
     m_richText = getUIRichTextType("richtext");
 
     buildFocusList();
 }
-
-void ProgDetails::done()
-{
-    MythDialog::done(0);
-}
Index: mythtv/libs/libmythtv/scanwizardscanner.cpp
===================================================================
--- mythtv/libs/libmythtv/scanwizardscanner.cpp	(revision 14901)
+++ mythtv/libs/libmythtv/scanwizardscanner.cpp	(working copy)
@@ -634,7 +634,7 @@
 
 void ScanWizardScanner::RunPopup(void)
 {
-    int ret = popupProgress->exec();
+    DialogCode ret = popupProgress->exec();
 
     popupLock.lock();
     popupProgress->deleteLater();
Index: mythtv/libs/libmythtv/profilegroup.h
===================================================================
--- mythtv/libs/libmythtv/profilegroup.h	(revision 14901)
+++ mythtv/libs/libmythtv/profilegroup.h	(working copy)
@@ -119,7 +119,7 @@
         listbox(new ListBoxSetting(this)), dialog(NULL), redraw(true)
         { addChild(listbox); }
 
-    virtual int exec();
+    virtual DialogCode exec(void);
     virtual void load();
     virtual void save() {};
 
Index: mythtv/libs/libmythtv/channeleditor.h
===================================================================
--- mythtv/libs/libmythtv/channeleditor.h	(revision 14901)
+++ mythtv/libs/libmythtv/channeleditor.h	(working copy)
@@ -12,7 +12,7 @@
     Q_OBJECT
 public:
     ChannelEditor();
-    virtual int exec();
+    virtual DialogCode exec(void);
 
     MythDialog* dialogWidget(MythMainWindow *parent, const char* name);
 
Index: mythtv/libs/libmythtv/scheduledrecording.h
===================================================================
--- mythtv/libs/libmythtv/scheduledrecording.h	(revision 14901)
+++ mythtv/libs/libmythtv/scheduledrecording.h	(working copy)
@@ -111,7 +111,7 @@
     virtual void modifyPowerSearchByID(int rid, QString textname,
                                        QString from, QString forwhat);
 
-    virtual int exec(bool saveOnExec = true, bool doLoad = false);
+    virtual DialogCode exec(bool saveOnExec = true, bool doLoad = false);
         
     void remove();
     int getRecordID(void) const { return id->intValue(); };
@@ -275,7 +275,7 @@
     ScheduledRecordingEditor() : listbox(new ListBoxSetting(this))
         { addChild(listbox); }
 
-    virtual int exec();
+    virtual DialogCode exec(void);
     virtual void load();
     virtual void save() { };
 
Index: mythtv/libs/libmythtv/recordingprofile.h
===================================================================
--- mythtv/libs/libmythtv/recordingprofile.h	(revision 14901)
+++ mythtv/libs/libmythtv/recordingprofile.h	(working copy)
@@ -85,7 +85,7 @@
     virtual void loadByID(int id);
     virtual bool loadByType(QString name, QString cardtype);
     virtual bool loadByGroup(QString name, QString group);
-    virtual int exec();
+    virtual DialogCode exec(void);
 
     // sets
     void setCodecTypes();
@@ -135,7 +135,7 @@
   public:
     RecordingProfileEditor(int id, QString profName);
 
-    virtual int exec();
+    virtual DialogCode exec(void);
     virtual void load();
     virtual void save() { };
     virtual void save(QString /*destination*/) { }
Index: mythtv/libs/libmythtv/tv_play.cpp
===================================================================
--- mythtv/libs/libmythtv/tv_play.cpp	(revision 14901)
+++ mythtv/libs/libmythtv/tv_play.cpp	(working copy)
@@ -145,15 +145,17 @@
                         recTitles.append(buttonTitle);
                         it++;
                     }
-                    int ret = MythPopupBox::showButtonPopup(
-                                    gContext->GetMainWindow(),
-                                    "",
-                                    tr("All Tuners are Busy.\n"
-                                       "Select a Current Recording"),
-                                    recTitles, 1);
-                    if ((0 < ret) && (ret <= (int)reclist->size()))
+                    DialogCode ret = MythPopupBox::ShowButtonPopup(
+                        gContext->GetMainWindow(),
+                        "",
+                        tr("All Tuners are Busy.\n"
+                           "Select a Current Recording"),
+                        recTitles, kDialogCodeButton1);
+
+                    int idx = MythDialog::CalcItemIndex(ret) - 1;
+                    if ((0 <= idx) && (idx < (int)reclist->size()))
                     {
-                        p = reclist->at(ret - 1);
+                        p = reclist->at(idx);
                         curProgram = new ProgramInfo(*p);
                     }
                     else
@@ -7766,7 +7768,9 @@
                                                 recGroupPassword,
                                                 gContext->GetMainWindow());
         pwd->exec();
-        delete pwd;
+        pwd->deleteLater();
+        pwd = NULL;
+
         qApp->unlock();
         if (!ok)
         {
Index: mythtv/libs/libmythtv/storagegroup.cpp
===================================================================
--- mythtv/libs/libmythtv/storagegroup.cpp	(revision 14901)
+++ mythtv/libs/libmythtv/storagegroup.cpp	(working copy)
@@ -418,12 +418,13 @@
     QString message =
         tr("Remove '%1'\nDirectory From Storage Group?").arg(name);
 
-    int value =
-        MythPopupBox::show2ButtonPopup(gContext->GetMainWindow(), "", message,
-                                       tr("Yes, remove directory"),
-                                       tr("No, Don't remove directory"), 2);
+    DialogCode value = MythPopupBox::Show2ButtonPopup(
+        gContext->GetMainWindow(), "", message,
+        tr("Yes, remove directory"),
+        tr("No, Don't remove directory"),
+        kDialogCodeButton1);
 
-    if (value == 0)
+    if (kDialogCodeButton0 == value)
     {
         MSqlQuery query(MSqlQuery::InitCon());
         query.prepare("DELETE FROM storagegroup "
@@ -476,11 +477,12 @@
     listbox->setValue(lastValue);
 }
 
-int StorageGroupEditor::exec() {
-    while (ConfigurationDialog::exec() == QDialog::Accepted)
+DialogCode StorageGroupEditor::exec(void)
+{
+    while (ConfigurationDialog::exec() == kDialogCodeAccepted)
         open(listbox->getValue());
 
-    return QDialog::Rejected;
+    return kDialogCodeRejected;
 }
 
 MythDialog* StorageGroupEditor::dialogWidget(MythMainWindow* parent,
@@ -557,12 +559,13 @@
 
     QString message = tr("Delete '%1' Storage Group?").arg(dispGroup);
 
-    int value = MythPopupBox::show2ButtonPopup(gContext->GetMainWindow(),
-                                               "", message,
-                                               tr("Yes, delete group"),
-                                               tr("No, Don't delete group"), 2);
+    DialogCode value = MythPopupBox::Show2ButtonPopup(
+        gContext->GetMainWindow(),
+        "", message,
+        tr("Yes, delete group"),
+        tr("No, Don't delete group"), kDialogCodeButton1);
 
-    if (value == 0)
+    if (kDialogCodeButton0 == value)
     {
         MSqlQuery query(MSqlQuery::InitCon());
         query.prepare("DELETE FROM storagegroup "
@@ -673,11 +676,12 @@
     listbox->setValue(lastValue);
 }
 
-int StorageGroupListEditor::exec() {
-    while (ConfigurationDialog::exec() == QDialog::Accepted)
+DialogCode StorageGroupListEditor::exec(void)
+{
+    while (ConfigurationDialog::exec() == kDialogCodeAccepted)
         open(listbox->getValue());
 
-    return QDialog::Rejected;
+    return kDialogCodeRejected;
 }
 
 MythDialog* StorageGroupListEditor::dialogWidget(MythMainWindow* parent,
Index: mythtv/libs/libmythtv/videosource.cpp
===================================================================
--- mythtv/libs/libmythtv/videosource.cpp	(revision 14901)
+++ mythtv/libs/libmythtv/videosource.cpp	(working copy)
@@ -2011,12 +2011,12 @@
     addChild(listbox);
 }
 
-int CaptureCardEditor::exec(void)
+DialogCode CaptureCardEditor::exec(void)
 {
-    while (ConfigurationDialog::exec() == QDialog::Accepted)
+    while (ConfigurationDialog::exec() == kDialogCodeAccepted)
         edit();
 
-    return QDialog::Rejected;
+    return kDialogCodeRejected;
 }
 
 void CaptureCardEditor::load(void)
@@ -2048,17 +2048,17 @@
     } 
     else 
     {
-        int val = MythPopupBox::show2ButtonPopup(
+        DialogCode val = MythPopupBox::Show2ButtonPopup(
             gContext->GetMainWindow(),
             "",
             tr("Capture Card Menu"),
             tr("Edit.."),
             tr("Delete.."),
-            1);
+            kDialogCodeButton0);
 
-        if (val == 0)
+        if (kDialogCodeButton0 == val)
             edit();
-        else if (val == 1)
+        else if (kDialogCodeButton1 == val)
             del();
     }
 }
@@ -2068,14 +2068,14 @@
     const int cardid = listbox->getValue().toInt();
     if (-1 == cardid)
     {
-        int val = MythPopupBox::show2ButtonPopup(
+        DialogCode val = MythPopupBox::Show2ButtonPopup(
             gContext->GetMainWindow(), "",
             tr("Are you sure you want to delete "
                "ALL capture cards on %1?").arg(gContext->GetHostName()),
             tr("Yes, delete capture cards"),
-            tr("No, don't"), 2);
+            tr("No, don't"), kDialogCodeButton1);
 
-        if (0 == val)
+        if (kDialogCodeButton0 == val)
         {
             MSqlQuery cards(MSqlQuery::InitCon());
 
@@ -2104,14 +2104,14 @@
     }
     else if (-2 == cardid)
     {
-        int val = MythPopupBox::show2ButtonPopup(
+        DialogCode val = MythPopupBox::Show2ButtonPopup(
             gContext->GetMainWindow(), "",
             tr("Are you sure you want to delete "
                "ALL capture cards?"),
             tr("Yes, delete capture cards"),
-            tr("No, don't"), 2);
+            tr("No, don't"), kDialogCodeButton1);
 
-        if (0 == val)
+        if (kDialogCodeButton0 == val)
         {
             MSqlQuery query(MSqlQuery::InitCon());
             query.exec("TRUNCATE TABLE capturecard;");
@@ -2130,13 +2130,13 @@
 
 void CaptureCardEditor::del(void)
 {
-    int val = MythPopupBox::show2ButtonPopup(
+    DialogCode val = MythPopupBox::Show2ButtonPopup(
         gContext->GetMainWindow(), "",
         tr("Are you sure you want to delete this capture card?"),
         tr("Yes, delete capture card"),
-        tr("No, don't"), 2);
+        tr("No, don't"), kDialogCodeButton1);
 
-    if (val == 0)
+    if (kDialogCodeButton0 == val)
     {
         CardUtil::DeleteCard(listbox->getValue().toUInt());
         load();
@@ -2159,11 +2159,12 @@
     return dialog;
 }
 
-int VideoSourceEditor::exec() {
-    while (ConfigurationDialog::exec() == QDialog::Accepted)
+DialogCode VideoSourceEditor::exec(void)
+{
+    while (ConfigurationDialog::exec() == kDialogCodeAccepted)
         edit();
 
-    return QDialog::Rejected;
+    return kDialogCodeRejected;
 }
 
 void VideoSourceEditor::load(void)
@@ -2183,17 +2184,17 @@
     } 
     else 
     {
-        int val = MythPopupBox::show2ButtonPopup(
+        DialogCode val = MythPopupBox::Show2ButtonPopup(
             gContext->GetMainWindow(),
             "",
             tr("Video Source Menu"),
             tr("Edit.."),
             tr("Delete.."),
-            1);
+            kDialogCodeButton0);
 
-        if (val == 0)
+        if (kDialogCodeButton0 == val)
             edit();
-        else if (val == 1)
+        else if (kDialogCodeButton1 == val)
             del();
     }
 }
@@ -2203,14 +2204,14 @@
     const int sourceid = listbox->getValue().toInt();
     if (-1 == sourceid)
     {
-        int val = MythPopupBox::show2ButtonPopup(
+        DialogCode val = MythPopupBox::Show2ButtonPopup(
             gContext->GetMainWindow(), "",
             tr("Are you sure you want to delete "
                "ALL video sources?"),
             tr("Yes, delete video sources"),
-            tr("No, don't"), 2);
+            tr("No, don't"), kDialogCodeButton1);
 
-        if (0 == val)
+        if (kDialogCodeButton0 == val)
         {
             MSqlQuery query(MSqlQuery::InitCon());
             query.exec("TRUNCATE TABLE channel;");
@@ -2235,15 +2236,15 @@
 
 void VideoSourceEditor::del() 
 {
-    int val = MythPopupBox::show2ButtonPopup(
+    DialogCode val = MythPopupBox::Show2ButtonPopup(
         gContext->GetMainWindow(), "",
         tr("Are you sure you want to delete "
            "this video source?"),
         tr("Yes, delete video source"),
         tr("No, don't"),
-        2);
+        kDialogCodeButton1);
 
-    if (val == 0)
+    if (kDialogCodeButton0 == val)
     {
         MSqlQuery query(MSqlQuery::InitCon());
 
@@ -2287,12 +2288,12 @@
     addChild(listbox);
 }
 
-int CardInputEditor::exec(void)
+DialogCode CardInputEditor::exec(void)
 {
-    while (ConfigurationDialog::exec() == QDialog::Accepted)
+    while (ConfigurationDialog::exec() == kDialogCodeAccepted)
         cardinputs[listbox->getValue().toInt()]->exec();
 
-    return QDialog::Rejected;
+    return kDialogCodeRejected;
 }
 
 void CardInputEditor::load() 
Index: mythtv/libs/libmythtv/diseqcsettings.cpp
===================================================================
--- mythtv/libs/libmythtv/diseqcsettings.cpp	(revision 14901)
+++ mythtv/libs/libmythtv/diseqcsettings.cpp	(working copy)
@@ -461,10 +461,10 @@
         addChild(new RotorPosMap(rotor));
     }
 
-    virtual int exec(void)
+    virtual DialogCode exec(void)
     {
-        while (ConfigurationDialog::exec() == QDialog::Accepted);
-        return QDialog::Rejected;
+        while (ConfigurationDialog::exec() == kDialogCodeAccepted);
+        return kDialogCodeRejected;
     }
 };
 
@@ -944,16 +944,16 @@
 
     popup->addWidget(list);
     connect(list,  SIGNAL(accepted(int)),
-            popup, SLOT(  done(    int)));
+            popup, SLOT(  AcceptItem(int)));
     list->setFocus();
 
-    int res = popup->ExecPopup();
+    DialogCode res = popup->ExecPopup();
     type = (DiSEqCDevDevice::dvbdev_t)list->currentItem();
 
     popup->hide();
     popup->deleteLater();
 
-    return res >= 0;
+    return kDialogCodeRejected != res;
 }
 
 void DeviceTree::CreateRootNodeDialog(void)
@@ -1084,10 +1084,10 @@
     addChild(new DeviceTree(tree));
 }
 
-int DTVDeviceTreeWizard::exec(void)
+DialogCode DTVDeviceTreeWizard::exec(void)
 {
-    while (ConfigurationDialog::exec() == QDialog::Accepted);
-    return QDialog::Rejected;
+    while (ConfigurationDialog::exec() == kDialogCodeAccepted);
+    return kDialogCodeRejected;
 }
 
 //////////////////////////////////////// SwitchSetting
Index: mythtv/libs/libmythtv/profilegroup.cpp
===================================================================
--- mythtv/libs/libmythtv/profilegroup.cpp	(revision 14901)
+++ mythtv/libs/libmythtv/profilegroup.cpp	(working copy)
@@ -244,9 +244,9 @@
     listbox->addSelection(QObject::tr("(Create new profile group)"), "0");
 }
 
-int ProfileGroupEditor::exec() 
+DialogCode ProfileGroupEditor::exec(void)
 {
-    int ret = QDialog::Accepted;
+    DialogCode ret = kDialogCodeAccepted;
     redraw = true;
 
     while ((QDialog::Accepted == ret) || redraw)
@@ -278,7 +278,7 @@
             open(listbox->getValue().toInt());
     }
 
-    return QDialog::Rejected;
+    return kDialogCodeRejected;
 }
 
 void ProfileGroupEditor::callDelete(void)
@@ -296,12 +296,13 @@
         QString message = QObject::tr("Delete profile group:") + 
                           QString("\n'%1'?").arg(ProfileGroup::getName(id));
 
-        int value = MythPopupBox::show2ButtonPopup(gContext->GetMainWindow(),
-                                                   "", message, 
-                                     QObject::tr("Yes, delete group"),
-                                     QObject::tr("No, Don't delete group"), 2);
+        DialogCode value = MythPopupBox::Show2ButtonPopup(
+            gContext->GetMainWindow(),
+            "", message, 
+            QObject::tr("Yes, delete group"),
+            QObject::tr("No, Don't delete group"), kDialogCodeButton1);
 
-        if (value == 0)
+        if (kDialogCodeButton0 == value)
         {
             querystr = QString("DELETE codecparams FROM codecparams, "
                             "recordingprofiles WHERE " 
Index: mythtv/libs/libmythtv/transporteditor.h
===================================================================
--- mythtv/libs/libmythtv/transporteditor.h	(revision 14901)
+++ mythtv/libs/libmythtv/transporteditor.h	(working copy)
@@ -74,7 +74,7 @@
   public:
     TransportListEditor(uint initial_sourceid);
 
-    virtual int exec(void);
+    virtual DialogCode exec(void);
 
   public slots:
     void Menu(void);
Index: mythtv/libs/libmythtv/programinfo.cpp
===================================================================
--- mythtv/libs/libmythtv/programinfo.cpp	(revision 14901)
+++ mythtv/libs/libmythtv/programinfo.cpp	(working copy)
@@ -4168,7 +4168,7 @@
     message += RecStatusDesc();
 
     DialogBox *dlg = new DialogBox(gContext->GetMainWindow(), message);
-    int button = 1, ok = -1, react = -1, stop = -1, addov = -1, forget = -1,
+    int button = 0, ok = -1, react = -1, stop = -1, addov = -1, forget = -1,
         clearov = -1, edend = -1, ednorm = -1, edcust = -1;
 
     dlg->AddButton(QObject::tr("OK"));
@@ -4248,7 +4248,8 @@
         }
     }
 
-    int ret = dlg->exec();
+    DialogCode code = dlg->exec();
+    int ret = MythDialog::CalcItemIndex(code);
     dlg->deleteLater();
     dlg = NULL;
 
@@ -4338,7 +4339,7 @@
     }
 
     DialogBox *dlg = new DialogBox(gContext->GetMainWindow(), message);
-    int button = 1, ok = -1, react = -1, addov = -1, clearov = -1,
+    int button = 0, ok = -1, react = -1, addov = -1, clearov = -1,
         ednorm = -1, edcust = -1, forget = -1, addov1 = -1, forget1 = -1;
 
     dlg->AddButton(QObject::tr("OK"));
@@ -4424,7 +4425,8 @@
         }
     }
 
-    int ret = dlg->exec();
+    DialogCode code = dlg->exec();
+    int ret = MythDialog::CalcItemIndex(code);
     dlg->deleteLater();
     dlg = NULL;
 
Index: mythtv/libs/libmythtv/scheduledrecording.cpp
===================================================================
--- mythtv/libs/libmythtv/scheduledrecording.cpp	(revision 14901)
+++ mythtv/libs/libmythtv/scheduledrecording.cpp	(working copy)
@@ -721,12 +721,12 @@
 }
 
 
-int ScheduledRecordingEditor::exec(void) 
+DialogCode ScheduledRecordingEditor::exec(void)
 {
-    while (ConfigurationDialog::exec() == QDialog::Accepted)
+    while (ConfigurationDialog::exec() == kDialogCodeAccepted)
         open(listbox->getValue().toInt());
 
-    return QDialog::Rejected;
+    return kDialogCodeRejected;
 }
 
 void ScheduledRecordingEditor::open(int id) {
@@ -743,7 +743,7 @@
 
 ///////////////////////////////////////////////////////////////////////////////
 
-int ScheduledRecording::exec(bool saveOnExec, bool doLoad)
+DialogCode ScheduledRecording::exec(bool saveOnExec, bool doLoad)
 {
     if (!dialog)
         dialog = new ScheduledRecordingDialog(this);
Index: mythtv/libs/libmythtv/recordingprofile.cpp
===================================================================
--- mythtv/libs/libmythtv/recordingprofile.cpp	(revision 14901)
+++ mythtv/libs/libmythtv/recordingprofile.cpp	(working copy)
@@ -1319,7 +1319,7 @@
         audioSettings->selectCodecs(groupType());
 }
 
-int RecordingProfile::exec(void)
+DialogCode RecordingProfile::exec(void)
 {
     MythDialog *dialog = dialogWidget(
         gContext->GetMainWindow(), "Recording Profile");
@@ -1333,7 +1333,7 @@
     if (tr_filters)
         FiltersChanged(tr_filters->getValue());
     
-    int ret = dialog->exec();
+    DialogCode ret = dialog->exec();
 
     dialog->deleteLater();
 
@@ -1414,12 +1414,12 @@
     RecordingProfile::fillSelections(listbox, group);
 }
 
-int RecordingProfileEditor::exec(void)
+DialogCode RecordingProfileEditor::exec(void)
 {
-    while (ConfigurationDialog::exec() == QDialog::Accepted)
+    while (ConfigurationDialog::exec() == kDialogCodeAccepted)
         open(listbox->getValue().toInt());
 
-    return QDialog::Rejected;
+    return kDialogCodeRejected;
 }
 
 void RecordingProfile::fillSelections(SelectSetting *setting, int group,
Index: mythtv/libs/libmythtv/transporteditor.cpp
===================================================================
--- mythtv/libs/libmythtv/transporteditor.cpp	(revision 14901)
+++ mythtv/libs/libmythtv/transporteditor.cpp	(working copy)
@@ -288,11 +288,11 @@
     connect(m_list, SIGNAL(deleteButtonPressed(int)), this, SLOT(Delete()));
 }
 
-int TransportListEditor::exec(void)
+DialogCode TransportListEditor::exec(void)
 {
-    while (ConfigurationDialog::exec() == QDialog::Accepted);
+    while (ConfigurationDialog::exec() == kDialogCodeAccepted);
 
-    return QDialog::Rejected;
+    return kDialogCodeRejected;
 }
 
 void TransportListEditor::Edit(void)
@@ -315,13 +315,13 @@
 {
     uint mplexid = m_list->getValue().toInt();
 
-    int val = MythPopupBox::show2ButtonPopup(
+    DialogCode val = MythPopupBox::Show2ButtonPopup(
         gContext->GetMainWindow(), "", 
         tr("Are you sure you would like to delete this transport?"), 
         tr("Yes, delete the transport"), 
-        tr("No, don't"), 2);
+        tr("No, don't"), kDialogCodeButton1);
 
-    if (val == 1)
+    if (kDialogCodeButton0 != val)
         return;
 
     MSqlQuery query(MSqlQuery::InitCon());
@@ -350,16 +350,16 @@
        return;
     }
 
-    int val = MythPopupBox::show2ButtonPopup(
+    DialogCode val = MythPopupBox::Show2ButtonPopup(
         gContext->GetMainWindow(), 
         "", 
         tr("Transport Menu"), 
         tr("Edit.."), 
-        tr("Delete.."), 1);
+        tr("Delete.."), kDialogCodeButton0);
 
-    if (val == 0)
+    if (kDialogCodeButton0 == val)
         emit Edit();
-    else if (val == 1)
+    else if (kDialogCodeButton1 == val)
         emit Delete();
     else
         m_list->setFocus();
Index: mythtv/libs/libmythtv/storagegroup.h
===================================================================
--- mythtv/libs/libmythtv/storagegroup.h	(revision 14901)
+++ mythtv/libs/libmythtv/storagegroup.h	(working copy)
@@ -36,7 +36,7 @@
     Q_OBJECT
   public:
     StorageGroupEditor(QString group);
-    virtual int exec(void);
+    virtual DialogCode exec(void);
     virtual void load(void);
     virtual void save(void) { };
     virtual void save(QString) { };
@@ -59,7 +59,7 @@
     Q_OBJECT
   public:
     StorageGroupListEditor(void);
-    virtual int exec(void);
+    virtual DialogCode exec(void);
     virtual void load(void);
     virtual void save(void) { };
     virtual void save(QString) { };
Index: mythtv/libs/libmythtv/scanwizardhelpers.cpp
===================================================================
--- mythtv/libs/libmythtv/scanwizardhelpers.cpp	(revision 14901)
+++ mythtv/libs/libmythtv/scanwizardhelpers.cpp	(working copy)
@@ -165,7 +165,7 @@
     setLabel(msg);
 }
 
-int ScanProgressPopup::exec(void)
+DialogCode ScanProgressPopup::exec(void)
 {
     if (!dialog)
     {
@@ -173,7 +173,7 @@
             dialogWidget(gContext->GetMainWindow(),
                          "ConfigurationPopupDialog");
     }
-    dialog->setResult(0);
+    dialog->setResult(kDialogCodeRejected);
 
     done = false;
     dialog->ShowPopup(this, SLOT(PopupDone(int)));
Index: mythtv/libs/libmythtv/diseqcsettings.h
===================================================================
--- mythtv/libs/libmythtv/diseqcsettings.h	(revision 14901)
+++ mythtv/libs/libmythtv/diseqcsettings.h	(working copy)
@@ -130,7 +130,7 @@
   public:
     DTVDeviceTreeWizard(DiSEqCDevTree &tree);
 
-    virtual int exec(void);
+    virtual DialogCode exec(void);
 };
 
 class DTVDeviceConfigGroup : public VerticalConfigurationGroup
Index: mythtv/libs/libmythui/myththemedmenu.cpp
===================================================================
--- mythtv/libs/libmythui/myththemedmenu.cpp	(revision 14901)
+++ mythtv/libs/libmythui/myththemedmenu.cpp	(working copy)
@@ -2411,7 +2411,7 @@
         MythPasswordDialog *pwd = new MythPasswordDialog(text, &ok, password,
                                                      gContext->GetMainWindow());
         pwd->exec();
-        delete pwd;
+        pwd->deleteLater();
 
         if (ok)
         {
Index: mythtv/libs/libmyth/settings.cpp
===================================================================
--- mythtv/libs/libmyth/settings.cpp	(revision 14901)
+++ mythtv/libs/libmyth/settings.cpp	(working copy)
@@ -1488,7 +1488,7 @@
     return dialog;
 }
 
-int ConfigurationDialog::exec(bool saveOnAccept, bool doLoad) 
+DialogCode ConfigurationDialog::exec(bool saveOnAccept, bool doLoad) 
 {
     if (doLoad)
         load();
@@ -1498,7 +1498,7 @@
 
     dialog->Show();
 
-    int ret = dialog->exec();
+    DialogCode ret = dialog->exec();
 
     if ((QDialog::Accepted == ret) && saveOnAccept)
         save();
@@ -2086,7 +2086,7 @@
         label->setText(str);
 }
 
-int ConfigurationPopupDialog::exec(bool saveOnAccept)
+DialogCode ConfigurationPopupDialog::exec(bool saveOnAccept)
 {
     storage->load();
 
@@ -2094,7 +2094,7 @@
         dialogWidget(gContext->GetMainWindow(), "ConfigurationPopupDialog");
     dialog->ShowPopup(this);
 
-    int ret = dialog->exec();
+    DialogCode ret = dialog->exec();
 
     if ((QDialog::Accepted == ret) && saveOnAccept)
         storage->save();
Index: mythtv/libs/libmyth/mythdialogs.cpp
===================================================================
--- mythtv/libs/libmyth/mythdialogs.cpp	(revision 14901)
+++ mythtv/libs/libmyth/mythdialogs.cpp	(working copy)
@@ -39,11 +39,13 @@
 #include "screensaver.h"
 #include "mythdbcon.h"
 
+/** \class MythDialog
+ *  \brief Base dialog for most dialogs in MythTV using the old UI
+ */
+
 MythDialog::MythDialog(MythMainWindow *parent, const char *name, bool setsize)
-          : QFrame(parent, name)
+    : QFrame(parent, name), rescode(kDialogCodeAccepted)
 {
-    rescode = 0;
-
     if (!parent)
     {
         cerr << "Trying to create a dialog without a parent.\n";
@@ -115,18 +117,43 @@
     show();
 }
 
+void MythDialog::setResult(DialogCode r)
+{
+    if ((r < kDialogCodeRejected) ||
+        ((kDialogCodeAccepted < r) && (r < kDialogCodeListStart)))
+    {
+        VERBOSE(VB_IMPORTANT, "Programmer Error: MythDialog::setResult("
+                <<r<<") called with invalid DialogCode");
+    }
+
+    rescode = r;
+}
+
 void MythDialog::done(int r)
 {
     hide();
-    setResult(r);
+    setResult((DialogCode) r);
     close();
 }
 
 void MythDialog::AcceptItem(int i)
 {
-    done(ListStart + i);
+    if (i < 0)
+    {
+        VERBOSE(VB_IMPORTANT, "Programmer Error: MythDialog::AcceptItem("
+                <<i<<") called with negative index");
+        reject();
+        return;
+    }
+
+    done((DialogCode)((int)kDialogCodeListStart + (int)i));
 }
 
+int MythDialog::CalcItemIndex(DialogCode code)
+{
+    return (int)code - (int)kDialogCodeListStart;
+}
+
 void MythDialog::accept()
 {
     done(Accepted);
@@ -137,22 +164,22 @@
     done(Rejected);
 }
 
-int MythDialog::exec()
+DialogCode MythDialog::exec(void)
 {
     if (in_loop) 
     {
         qWarning("MythDialog::exec: Recursive call detected.");
-        return -1;
+        return kDialogCodeRejected;
     }
 
-    setResult(Rejected);
+    setResult(kDialogCodeRejected);
 
     Show();
 
     in_loop = TRUE;
     qApp->enter_loop();
 
-    int res = result();
+    DialogCode res = result();
 
     return res;
 }
@@ -213,6 +240,20 @@
     }
 }
 
+/** \class MythPopupBox
+ *  \brief Child of MythDialog used for most popup menus in MythTV
+ *
+ *  Most users of this class just call one of the static functions
+ *  These create a dialog and block until it returns with a DialogCode.
+ *
+ *  When creating an instance yourself and using ExecPopup() or
+ *  ShowPopup() you can optionally pass it a target and slot for
+ *  the popupDone(int) signal. It will be sent with the DialogCode
+ *  that the exec function returns, except it is cast to an int.
+ *  This is most useful for ShowPopup() which doesn't block or
+ *  return the result() when the popup is finished.
+ */
+
 MythPopupBox::MythPopupBox(MythMainWindow *parent, const char *name)
             : MythDialog(parent, name, false)
 {
@@ -465,6 +506,12 @@
         MythDialog::keyPressEvent(e);
 }
 
+void MythPopupBox::AcceptItem(int i)
+{
+    MythDialog::AcceptItem(i);
+    emit popupDone(rescode);
+}
+
 void MythPopupBox::accept(void)
 {
     MythDialog::done(MythDialog::Accepted);
@@ -477,21 +524,21 @@
     emit popupDone(MythDialog::Rejected);
 }
 
-int MythPopupBox::ExecPopup(QObject *target, const char *slot)
+DialogCode MythPopupBox::ExecPopup(QObject *target, const char *slot)
 {
     if (!target)
-        ShowPopup(this, SLOT(defaultExitHandler(int)));
+        ShowPopup(this, SLOT(done(int)));
     else
         ShowPopup(target, slot);
 
     return exec();
 }
 
-int MythPopupBox::ExecPopupAtXY(int destx, int desty,
-                            QObject *target, const char *slot)
+DialogCode MythPopupBox::ExecPopupAtXY(int destx, int desty,
+                                       QObject *target, const char *slot)
 {
     if (!target)
-        ShowPopupAtXY(destx, desty, this, SLOT(defaultExitHandler(int)));
+        ShowPopupAtXY(destx, desty, this, SLOT(done(int)));
     else
         ShowPopupAtXY(destx, desty, target, slot);
 
@@ -526,7 +573,7 @@
     }
     if (foundbutton)
     {
-        done(i);
+        AcceptItem(i);
         return;
     }
 
@@ -553,25 +600,20 @@
     }
     if (foundbutton)
     {
-        done(i);
+        AcceptItem(i);
         return;
     }
 
     VERBOSE(VB_IMPORTANT, "MythPopupBox::defaultButtonPressedHandler(void)"
             "\n\t\t\tWe should never get here!");
-    done(Rejected);
+    done(kDialogCodeRejected);
 }
 
-void MythPopupBox::defaultExitHandler(int r)
-{
-    done(r);
-}
-
-static int show_ok_popup(
+bool MythPopupBox::showOkPopup(
     MythMainWindow *parent,
     const QString  &title,
     const QString  &message,
-    QString         button_msg = QString::null)
+    QString         button_msg)
 {
     if (button_msg.isEmpty())
         button_msg = QObject::tr("OK");
@@ -581,7 +623,7 @@
     popup->addLabel(message, MythPopupBox::Medium, true);
     QButton *okButton = popup->addButton(button_msg, popup, SLOT(accept()));
     okButton->setFocus();
-    int ret = popup->ExecPopup();
+    bool ret = (kDialogCodeAccepted == popup->ExecPopup());
 
     popup->hide();
     popup->deleteLater();
@@ -589,18 +631,6 @@
     return ret;
 }
 
-void MythPopupBox::showOkPopup(MythMainWindow *parent, QString title,
-                               QString message)
-{
-    show_ok_popup(parent, title, message);
-}
-
-void MythPopupBox::showExitPopup(MythMainWindow *parent, QString title,
-                                 QString message)
-{
-    show_ok_popup(parent, title, message, tr("Exit"));
-}
-
 bool MythPopupBox::showOkCancelPopup(MythMainWindow *parent, QString title,
                                      QString message, bool focusOk)
 {
@@ -691,48 +721,27 @@
 }
 
 
-int MythPopupBox::show2ButtonPopup(MythMainWindow *parent, QString title,
-                                   QString message, QString button1msg,
-                                   QString button2msg, int defvalue)
+DialogCode MythPopupBox::ShowButtonPopup(
+    MythMainWindow    *parent,
+    const QString     &title,
+    const QString     &message,
+    const QStringList &buttonmsgs,
+    DialogCode         default_button)
 {
     MythPopupBox *popup = new MythPopupBox(parent, title);
 
     popup->addLabel(message, Medium, true);
     popup->addLabel("");
 
-    QButton *but1 = popup->addButton(button1msg);
-    QButton *but2 = popup->addButton(button2msg);
-
-    if (defvalue == 1)
-        but1->setFocus();
-    else
-        but2->setFocus();
-
-    int ret = popup->ExecPopup();
-
-    popup->hide();
-    popup->deleteLater();
-
-    return ret;
-}
-
-int MythPopupBox::showButtonPopup(MythMainWindow *parent, QString title,
-                                  QString message, QStringList buttonmsgs,
-                                  int defvalue)
-{
-    MythPopupBox *popup = new MythPopupBox(parent, title);
-
-    popup->addLabel(message, Medium, true);
-    popup->addLabel("");
-
+    const uint def = CalcItemIndex(default_button);
     for (unsigned int i = 0; i < buttonmsgs.size(); i++ )
     {
         QButton *but = popup->addButton(buttonmsgs[i]);
-        if (defvalue == (int)i)
+        if (def == i)
             but->setFocus();
     }
 
-    int ret = popup->ExecPopup();
+    DialogCode ret = popup->ExecPopup();
 
     popup->hide();
     popup->deleteLater();
@@ -948,7 +957,7 @@
             .arg(window_name).arg(theme_filename);
         MythPopupBox::showOkPopup(gContext->GetMainWindow(),
                                   tr("Missing UI Element"), msg);
-        done(-1);
+        reject();
         return;
     }
 }
@@ -1055,9 +1064,22 @@
 MythThemedDialog::~MythThemedDialog()
 {
     if (theme)
+    {
         delete theme;
+        theme = NULL;
+    }
 }
 
+void MythThemedDialog::deleteLater(void)
+{
+    if (theme)
+    {
+        delete theme;
+        theme = NULL;
+    }
+    MythDialog::deleteLater();
+}
+
 void MythThemedDialog::loadWindow(QDomElement &element)
 {
     //
@@ -1962,7 +1984,7 @@
     if (the_text == target_text)
     {
         *success_flag = true;
-        done(0);
+        accept();
     }
     else
     {
@@ -1993,11 +2015,11 @@
     listbox = new MythListBox(this);
     listbox->setScrollBar(false);
     listbox->setBottomScrollBar(false);
-    connect(listbox, SIGNAL(accepted(int)), this, SLOT(itemSelected(int)));
+    connect(listbox, SIGNAL(accepted(int)), this, SLOT(AcceptItem(int)));
     addWidget(listbox);
-    
-    ok_button = addButton(tr("OK"), this, SLOT(okPressed()));
-    cancel_button = addButton(tr("Cancel"), this, SLOT(cancelPressed()));
+
+    ok_button     = addButton(tr("OK"),     this, SLOT(accept()));
+    cancel_button = addButton(tr("Cancel"), this, SLOT(reject()));
 }
 
 void MythSearchDialog::keyPressEvent(QKeyEvent *e)
@@ -2012,7 +2034,7 @@
             if (action == "ESCAPE")
             {
                 handled = true;
-                done(-1);        
+                reject();
             }
             if (action == "LEFT")
             {
@@ -2027,7 +2049,7 @@
             if (action == "SELECT")
             {
                 handled = true;
-                done(0);
+                accept();
             }
         }
     }
@@ -2035,63 +2057,78 @@
         MythPopupBox::keyPressEvent(e);
 }
 
-void MythSearchDialog::itemSelected(int index)
-{
-    (void)index;
-    done(0);
-}
-
 void MythSearchDialog::setCaption(QString text)
 {
-    caption->setText(text);
+    if (caption)
+        caption->setText(text);
 }
 
 void MythSearchDialog::setSearchText(QString text)
 {
-    editor->setText(text);
-    editor->setCursorPosition(0, editor->text().length());
+    if (editor)
+    {
+        editor->setText(text);
+        editor->setCursorPosition(0, editor->text().length());
+    }
 }
 
 void MythSearchDialog::searchTextChanged(void)
 {
-    listbox->setCurrentItem(editor->text(), false,  true);
-    listbox->setTopItem(listbox->currentItem());
+    if (listbox && editor)
+    {
+        listbox->setCurrentItem(editor->text(), false,  true);
+        listbox->setTopItem(listbox->currentItem());
+    }
 }
 
 QString MythSearchDialog::getResult(void)
 {
-    return listbox->currentText();
+    if (listbox)
+        return listbox->currentText();
+
+    // Don't return QString::null, might cause segfaults due to
+    // code that doesn't check the return value...
+    return "";
 }
 
 void MythSearchDialog::setItems(QStringList items)
 {
-   listbox->insertStringList(items);
-   searchTextChanged();
+    if (listbox)
+    {
+        listbox->insertStringList(items);
+        searchTextChanged();
+    }
 }
 
-void MythSearchDialog::okPressed(void)
+MythSearchDialog::~MythSearchDialog()
 {
-    done(0);  
+    Teardown();
 }
 
-void MythSearchDialog::cancelPressed(void)
+void MythSearchDialog::deleteLater(void)
 {
-    done(-1);
+    Teardown();
+    MythPopupBox::deleteLater();
 }
 
-MythSearchDialog::~MythSearchDialog()
+void MythSearchDialog::Teardown(void)
 {
+    caption       = NULL; // deleted by Qt
+
+    if (editor)
+    {
+        editor->disconnect();
+        editor    = NULL; // deleted by Qt
+    }
+
     if (listbox)
     {
-        delete listbox;
-        listbox = NULL;
-    }    
-    
-    if (editor)
-    {
-        delete editor;
-        editor = NULL;
-    }    
+        listbox->disconnect();
+        listbox   = NULL; // deleted by Qt
+    }
+
+    ok_button     = NULL; // deleted by Qt
+    cancel_button = NULL; // deleted by Qt
 }
 
 /*
@@ -2141,7 +2178,7 @@
                        "element. \n\nReturning to the previous menu."));
         MythPopupBox::showOkPopup(gContext->GetMainWindow(),
                                   tr("Missing UI Element"), msg);
-        done(-1);
+        reject();
         return;
     }
 
@@ -2176,7 +2213,7 @@
                        "\n\nReturning to the previous menu."));
         MythPopupBox::showOkPopup(gContext->GetMainWindow(),
                                   tr("Missing UI Element"), msg);
-        done(-1);
+        reject();
         return;
     }    
     
@@ -2383,7 +2420,7 @@
     if (type > -1)
     {
         *selected_file = image_files[type];
-        done(0);
+        accept();
     }   
 }
 
@@ -2409,14 +2446,14 @@
         VERBOSE(VB_IMPORTANT, 
                 "MythScrollDialog: Programmer error, trying to create "
                 "a dialog without a parent.");
-        done(-1);
+        done(kDialogCodeRejected);
         return;
     }
 
     m_parent     = parent;
     m_scrollMode = mode;
         
-    m_resCode    = 0;
+    m_resCode    = kDialogCodeRejected;
     m_inLoop     = false;
     
     gContext->GetScreenSettings(m_xbase, m_screenWidth, m_wmult,
@@ -2511,7 +2548,7 @@
                    m_screenHeight*areaHTimes);
 }
 
-int MythScrollDialog::result() const
+DialogCode MythScrollDialog::result(void) const
 {
     return m_resCode;    
 }
@@ -2535,23 +2572,23 @@
     }
 }
 
-int MythScrollDialog::exec()
+DialogCode MythScrollDialog::exec(void)
 {
     if (m_inLoop) 
     {
         std::cerr << "MythScrollDialog::exec: Recursive call detected."
                   << std::endl;
-        return -1;
+        return kDialogCodeRejected;
     }
 
-    setResult(Rejected);
+    setResult(kDialogCodeRejected);
 
     show();
 
     m_inLoop = true;
     qApp->enter_loop();
 
-    int res = result();
+    DialogCode res = result();
 
     return res;
 }
@@ -2559,21 +2596,21 @@
 void MythScrollDialog::done(int r)
 {
     hide();
-    setResult(r);
+    setResult((DialogCode)r);
     close();
 }
 
 void MythScrollDialog::accept()
 {
-    done(Accepted);
+    done(kDialogCodeAccepted);
 }
 
 void MythScrollDialog::reject()
 {
-    done(Rejected);
+    done(kDialogCodeRejected);
 }
 
-void MythScrollDialog::setResult(int r)
+void MythScrollDialog::setResult(DialogCode r)
 {
     m_resCode = r;    
 }
Index: mythtv/libs/libmyth/mythwidgets.cpp
===================================================================
--- mythtv/libs/libmyth/mythwidgets.cpp	(revision 14901)
+++ mythtv/libs/libmyth/mythwidgets.cpp	(working copy)
@@ -16,18 +16,55 @@
 #include "virtualkeyboard.h"
 #include "libmythui/mythmainwindow.h"
 
+typedef VirtualKeyboard* QWidgetP;
+static void qt_delete(QWidgetP &widget)
+{
+    if (widget)
+    {
+        widget->disconnect();
+        widget->hide();
+        widget->deleteLater();
+        widget = NULL;
+    }
+}
+
+MythComboBox::MythComboBox(bool rw, QWidget *parent, const char *name) :
+    QComboBox(rw, parent, name),
+    popup(NULL), helptext(QString::null), AcceptOnSelect(false),
+    useVirtualKeyboard(true), allowVirtualKeyboard(rw),
+    popupPosition(VK_POSBELOWEDIT), step(1)
+{
+    useVirtualKeyboard = gContext->GetNumSetting("UseVirtualKeyboard", 1);
+}
+
 MythComboBox::~MythComboBox()
 {
-    if (popup)
-        delete popup;
+    Teardown();
 }
 
-void MythComboBox::Init()
+void MythComboBox::deleteLater(void)
 {
-    popup = NULL;
-    popupPosition = VK_POSBELOWEDIT;
+    Teardown();
+    QComboBox::deleteLater();
 }
 
+void MythComboBox::Teardown(void)
+{
+    qt_delete(popup);
+}
+
+void MythComboBox::popupVirtualKeyboard(void)
+{
+    qt_delete(popup);
+
+    popup = new VirtualKeyboard(gContext->GetMainWindow(), this);
+    gContext->GetMainWindow()->detach(popup);
+    popup->exec();
+
+    qt_delete(popup);
+}
+
+
 void MythComboBox::keyPressEvent(QKeyEvent *e)
 {
     bool handled = false;
@@ -73,19 +110,13 @@
             else if (action == "SELECT" && AcceptOnSelect)
                 emit accepted(currentItem());
             else if (action == "SELECT" && 
-                    (e->text().isNull() ||
+                    (e->text().isEmpty() ||
                     (e->key() == Qt::Key_Enter) ||
                     (e->key() == Qt::Key_Return) ||
                     (e->key() == Qt::Key_Space)))
             {
-                if ((allowVirtualKeyboard) &&  (gContext->GetNumSetting("UseVirtualKeyboard", 1) == 1))
-                {
-                    popup = new VirtualKeyboard(gContext->GetMainWindow(), this);
-                    gContext->GetMainWindow()->detach(popup);
-                    popup->exec();
-                    delete popup;
-                    popup = NULL;
-                }
+                if (useVirtualKeyboard && allowVirtualKeyboard)
+                    popupVirtualKeyboard();
                 else
                    handled = true;
             }
@@ -354,18 +385,54 @@
     QSlider::focusOutEvent(e);
 }
 
+MythLineEdit::MythLineEdit(QWidget *parent, const char* widgetName) :
+    QLineEdit(parent, widgetName),
+    popup(NULL), helptext(QString::null), rw(true),
+    useVirtualKeyboard(true),
+    allowVirtualKeyboard(true),
+    popupPosition(VK_POSBELOWEDIT)
+{
+    useVirtualKeyboard = gContext->GetNumSetting("UseVirtualKeyboard", 1);
+}
+
+MythLineEdit::MythLineEdit(
+    const QString &contents, QWidget *parent, const char* widgetName) :
+    QLineEdit(contents, parent, widgetName),
+    popup(NULL), helptext(QString::null), rw(true),
+    useVirtualKeyboard(true),
+    allowVirtualKeyboard(true),
+    popupPosition(VK_POSBELOWEDIT)
+{
+    useVirtualKeyboard = gContext->GetNumSetting("UseVirtualKeyboard", 1);
+}
+
 MythLineEdit::~MythLineEdit()
 {
-    if (popup)
-        delete popup;
+    Teardown();
 }
 
-void MythLineEdit::Init()
+void MythLineEdit::deleteLater(void)
 {
-    popup = NULL;
-    popupPosition = VK_POSBELOWEDIT;
+    Teardown();
+    QLineEdit::deleteLater();
 }
 
+void MythLineEdit::Teardown(void)
+{
+    qt_delete(popup);
+}
+
+void MythLineEdit::popupVirtualKeyboard(void)
+{
+    qt_delete(popup);
+
+    popup = new VirtualKeyboard(gContext->GetMainWindow(), this);
+    gContext->GetMainWindow()->detach(popup);
+    popup->exec();
+
+    qt_delete(popup);
+}
+
 void MythLineEdit::keyPressEvent(QKeyEvent *e)
 {
     bool handled = false;
@@ -383,23 +450,16 @@
             else if (action == "DOWN")
                 focusNextPrevChild(true);
             else if (action == "SELECT" && 
-                    (e->text().isNull() ||
+                    (e->text().isEmpty() ||
                     (e->key() == Qt::Key_Enter) ||
                     (e->key() == Qt::Key_Return)))
             {
-                if ((allowVirtualKeyboard) && rw &&
-                    (gContext->GetNumSetting("UseVirtualKeyboard", 1) == 1))
-                {
-                    popup = new VirtualKeyboard(gContext->GetMainWindow(), this);
-                    gContext->GetMainWindow()->detach(popup);
-                    popup->exec();
-                    delete popup;
-                    popup = NULL;
-                }
+                if (useVirtualKeyboard && allowVirtualKeyboard && rw)
+                    popupVirtualKeyboard();
                 else
                     handled = false;
             }
-            else if (action == "SELECT" && e->text().isNull() )
+            else if (action == "SELECT" && e->text().isEmpty() )
                 e->ignore();
             else
                 handled = false;
@@ -412,17 +472,22 @@
             QLineEdit::keyPressEvent(e);
 }
 
-void MythLineEdit::setText(const QString& text) 
+void MythLineEdit::setText(const QString &text)
 {
     // Don't mess with the cursor position; it causes
     // counter-intuitive behaviour due to interactions with the
     // communication with the settings stuff
 
     int pos = cursorPosition();
-    QLineEdit::setText(text);
+    QLineEdit::setText(QDeepCopy<QString>(text));
     setCursorPosition(pos);
 }
 
+QString MythLineEdit::text(void)
+{
+    return QDeepCopy<QString>(QLineEdit::text());
+}
+
 void MythLineEdit::focusInEvent(QFocusEvent *e)
 {
     emit changeHelpText(helptext);
@@ -534,6 +599,7 @@
     connect(cycle_timer, SIGNAL(timeout()), this, SLOT(endCycle()));
     
     popup = NULL;
+    useVirtualKeyboard = gContext->GetNumSetting("UseVirtualKeyboard", 1);
     popupPosition = VK_POSBELOWEDIT;
 }
 
@@ -731,10 +797,15 @@
     //  of MythLineEdit, and I'm sure he had
     //  a reason ...
     getCursorPosition(&para, &pos);
-    QTextEdit::setText(text);
+    QTextEdit::setText(QDeepCopy<QString>(text));
     setCursorPosition(para, pos);
 }
 
+QString MythRemoteLineEdit::text(void)
+{
+    return QDeepCopy<QString>(QTextEdit::text());
+}
+
 void MythRemoteLineEdit::keyPressEvent(QKeyEvent *e)
 {
     bool handled = false;
@@ -766,19 +837,12 @@
             }
             else if ((action == "SELECT") &&
                      (!active_cycle) &&
-                     ((e->text().isNull()) ||
+                     ((e->text().isEmpty()) ||
                       (e->key() == Qt::Key_Enter) || 
                       (e->key() == Qt::Key_Return)))
             {
-                if (gContext->GetNumSetting("UseVirtualKeyboard", 1) == 1)
-                {
-                    popup = new VirtualKeyboard(gContext->GetMainWindow(), this);
-                    gContext->GetMainWindow()->detach(popup);
-                    popup->exec();
-                    delete popup;
-                    popup = NULL;
-                }
- 
+                if (useVirtualKeyboard)
+                    popupVirtualKeyboard();
             }
             else
                 handled = false;
@@ -976,18 +1040,40 @@
     QTextEdit::focusOutEvent(e);
 }
 
-
 MythRemoteLineEdit::~MythRemoteLineEdit()
 {
+    Teardown();
+}
+
+void MythRemoteLineEdit::deleteLater(void)
+{
+    Teardown();
+    QTextEdit::deleteLater();
+}
+
+void MythRemoteLineEdit::Teardown(void)
+{
     if (cycle_timer)
     {
-        delete cycle_timer;
+        cycle_timer->disconnect();
+        cycle_timer->deleteLater();
+        cycle_timer = NULL;
     }
 
-    if (popup)
-        delete popup;
+    qt_delete(popup);
 }
 
+void MythRemoteLineEdit::popupVirtualKeyboard(void)
+{
+    qt_delete(popup);
+
+    popup = new VirtualKeyboard(gContext->GetMainWindow(), this);
+    gContext->GetMainWindow()->detach(popup);
+    popup->exec();
+
+    qt_delete(popup);
+}
+
 void MythRemoteLineEdit::insert(QString text)
 {
     QTextEdit::insert(text);
Index: mythtv/libs/libmyth/dialogbox.cpp
===================================================================
--- mythtv/libs/libmyth/dialogbox.cpp	(revision 14901)
+++ mythtv/libs/libmyth/dialogbox.cpp	(working copy)
@@ -59,5 +59,5 @@
 void DialogBox::buttonPressed(int which)
 {
     if (buttongroup->find(which) != checkbox)
-        done(which + 1);
+        AcceptItem(which);
 }
Index: mythtv/libs/libmyth/uilistbtntype.cpp
===================================================================
--- mythtv/libs/libmyth/uilistbtntype.cpp	(revision 14901)
+++ mythtv/libs/libmyth/uilistbtntype.cpp	(working copy)
@@ -1503,11 +1503,11 @@
     searchEdit->setFocus();
 
     popup->addButton(tr("Search"));
-    popup->addButton(tr("Cancel"));
+    popup->addButton(tr("Cancel"), popup, SLOT(reject()));
 
-    int res = popup->ExecPopup();
+    DialogCode res = popup->ExecPopup();
 
-    if (res == 0)
+    if (kDialogCodeButton0 == res)
     {
         m_incSearch = searchEdit->text();
         m_bIncSearchContains = (modeCombo->currentItem() == 1);
@@ -1517,7 +1517,7 @@
     popup->hide();
     popup->deleteLater();
 
-    return (res == 0);
+    return (kDialogCodeButton0 == res);
 }
 
 bool UIListBtnType::incSearchNext(void)
Index: mythtv/libs/libmyth/uitypes.cpp
===================================================================
--- mythtv/libs/libmyth/uitypes.cpp	(revision 14901)
+++ mythtv/libs/libmyth/uitypes.cpp	(working copy)
@@ -2850,7 +2850,8 @@
 {
     if (edit)
     {
-        delete edit;
+        edit->hide();
+        edit->deleteLater();
         edit = NULL;
     }    
 }
@@ -4334,9 +4335,9 @@
     popup->addButton(tr("Search"));
     popup->addButton(tr("Cancel"));
 
-    int res = popup->ExecPopup();
+    DialogCode res = popup->ExecPopup();
 
-    if (res == 0)
+    if (kDialogCodeButton0 == res)
     {
         incSearch = searchEdit->text();
         bIncSearchContains = (modeCombo->currentItem() == 1);
@@ -4346,7 +4347,7 @@
     popup->hide();
     popup->deleteLater();
 
-    return (res == 0);
+    return (kDialogCodeButton0 == res);
 }
 
 bool UIManagedTreeListType::incSearchNext(void)
@@ -5947,7 +5948,7 @@
     if (!m_parentDialog)
         return;
 
-    m_parentDialog->done(0);
+    m_parentDialog->done(kDialogCodeAccepted);
 }
 
 void UIKeyboardType::updateButtons()
Index: mythtv/libs/libmyth/mythcontext.cpp
===================================================================
--- mythtv/libs/libmyth/mythcontext.cpp	(revision 14901)
+++ mythtv/libs/libmyth/mythcontext.cpp	(working copy)
@@ -3060,41 +3060,48 @@
         }
 
         if (returnValue == MYTH_SCHEMA_ERROR)
-            MythPopupBox::showExitPopup(d->mainWindow,
-                                        "Database Upgrade Error", message);
+        {
+            MythPopupBox::showOkPopup(
+                d->mainWindow, "Database Upgrade Error",
+                message, QObject::tr("Exit"));
+        }
         else
         {
             QStringList buttonNames;
-            int         selected;
 
             buttonNames += QObject::tr("Exit");
             buttonNames += QObject::tr("Upgrade");
             if (expertMode)
                 buttonNames += QObject::tr("Use current schema");
 
-            selected = MythPopupBox::showButtonPopup(d->mainWindow,
-                                                     "Database Upgrade",
-                                                     message, buttonNames, -1);
+            DialogCode selected = MythPopupBox::ShowButtonPopup(
+                d->mainWindow, "Database Upgrade", message,
+                buttonNames, kDialogCodeButton0);
+
             // The annoying extra confirmation:
-            if (selected == 1)
+            if (kDialogCodeButton1 == selected)
             {
                 message = tr("This cannot be un-done, so having a"
                              " database backup would be a good idea.");
                 if (connections)
                     message += "\n\n" + warnOtherCl;
 
-                selected = MythPopupBox::showButtonPopup(d->mainWindow,
-                                                         "Database Upgrade",
-                                                         message,
-                                                         buttonNames, -1);
+                selected = MythPopupBox::ShowButtonPopup(
+                    d->mainWindow, "Database Upgrade", message,
+                    buttonNames, kDialogCodeButton0);
             }
 
             switch (selected)
             {
-                case 0:  returnValue = MYTH_SCHEMA_EXIT;         break;
-                case 1:  returnValue = MYTH_SCHEMA_UPGRADE;      break;
-                case 2:  returnValue = MYTH_SCHEMA_USE_EXISTING; break;
-                default: returnValue = MYTH_SCHEMA_ERROR;
+                case kDialogCodeRejected:
+                case kDialogCodeButton0:
+                    returnValue = MYTH_SCHEMA_EXIT;         break;
+                case kDialogCodeButton1:
+                    returnValue = MYTH_SCHEMA_UPGRADE;      break;
+                case kDialogCodeButton2:
+                    returnValue = MYTH_SCHEMA_USE_EXISTING; break;
+                default:
+                    returnValue = MYTH_SCHEMA_ERROR;
             }
         }
 
Index: mythtv/libs/libmyth/mythcontext.h
===================================================================
--- mythtv/libs/libmyth/mythcontext.h	(revision 14901)
+++ mythtv/libs/libmyth/mythcontext.h	(working copy)
@@ -209,7 +209,7 @@
 
 /// Update this whenever the plug-in API changes.
 /// Including changes in the libmythtv class methods used by plug-ins.
-#define MYTH_BINARY_VERSION "0.21.20071115-1"
+#define MYTH_BINARY_VERSION "0.21.20071115-2"
 
 /** \brief Increment this whenever the MythTV network protocol changes.
  *
Index: mythtv/libs/libmyth/settings.h
===================================================================
--- mythtv/libs/libmyth/settings.h	(revision 14901)
+++ mythtv/libs/libmyth/settings.h	(working copy)
@@ -1153,7 +1153,7 @@
     virtual MythDialog *dialogWidget(
         MythMainWindow *parent, const char* widgetName);
 
-    int exec(bool saveOnAccept = true);
+    virtual DialogCode exec(bool saveOnAccept = true);
 
     virtual void setLabel(QString str);
 
@@ -1206,7 +1206,7 @@
                                      const char     *widgetName);
 
     // Show a dialogWidget, and save if accepted
-    virtual int exec(bool saveOnExec = true, bool doLoad = true);
+    virtual DialogCode exec(bool saveOnExec = true, bool doLoad = true);
 
     virtual void load(void) { cfgGrp->load(); }
     virtual void save(void) { cfgGrp->save(); }
Index: mythtv/libs/libmyth/mythmediamonitor.cpp
===================================================================
--- mythtv/libs/libmyth/mythmediamonitor.cpp	(revision 14901)
+++ mythtv/libs/libmyth/mythmediamonitor.cpp	(working copy)
@@ -144,25 +144,24 @@
         return drives.front();
     }
 
-    MythPopupBox *popup = new MythPopupBox(
-        gContext->GetMainWindow(), "select drive");
-
-    popup->addLabel(label);
+    QStringList buttonmsgs;
     for (it = drives.begin(); it != drives.end(); ++it)
-        popup->addButton(DevName(*it));
+        buttonmsgs += DevName(*it);
+    buttonmsgs += tr("Cancel");
+    const DialogCode cancelbtn = (DialogCode)
+        (((int)kDialogCodeButton0) + buttonmsgs.size() - 1);
 
-    popup->addButton(tr("Cancel"))->setFocus();
+    DialogCode ret = MythPopupBox::ShowButtonPopup(
+        gContext->GetMainWindow(), "select drive", label,
+        buttonmsgs, cancelbtn);
 
-    int ret = popup->ExecPopup();
-    popup->hide();
-    popup->deleteLater();
-
     // If the user cancelled, return a special value
-    if (ret < 0)
+    if ((kDialogCodeRejected == ret) || (cancelbtn == ret))
         return (MythMediaDevice *)-1;
 
-    if ((uint)ret < drives.count())
-        return drives[ret];
+    uint idx = MythDialog::CalcItemIndex(ret);
+    if (idx < drives.count())
+        return drives[idx];
 
     return NULL;
 }
Index: mythtv/libs/libmyth/virtualkeyboard.h
===================================================================
--- mythtv/libs/libmyth/virtualkeyboard.h	(revision 14901)
+++ mythtv/libs/libmyth/virtualkeyboard.h	(working copy)
@@ -24,16 +24,21 @@
                     QWidget *parentEdit,
                     const char *name = 0,
                     bool setsize = true);
-    ~VirtualKeyboard();
 
   public slots:
-    void switchLayout(QString language);
-    virtual void show();
+    virtual void SwitchLayout(const QString &language);
+    virtual void Show(void);
     virtual void hide();
 
+    virtual void deleteLater(void);
+
   protected slots:
     virtual void keyPressEvent(QKeyEvent *e);
 
+  protected:
+    void Teardown(void);
+    ~VirtualKeyboard(); // use deleteLater() instead for thread safety
+
   private:
     UIKeyboardType *m_keyboard;
     QWidget        *m_parentEdit;
Index: mythtv/libs/libmyth/mythdialogs.h
===================================================================
--- mythtv/libs/libmyth/mythdialogs.h	(revision 14901)
+++ mythtv/libs/libmyth/mythdialogs.h	(working copy)
@@ -50,6 +50,32 @@
 
 #include "libmythui/mythmainwindow.h"
 
+typedef enum DialogCode
+{
+    kDialogCodeRejected  = QDialog::Rejected,
+    kDialogCodeAccepted  = QDialog::Accepted,
+    kDialogCodeListStart = 0x10,
+    kDialogCodeButton0   = 0x10,
+    kDialogCodeButton1   = 0x11,
+    kDialogCodeButton2   = 0x12,
+    kDialogCodeButton3   = 0x13,
+    kDialogCodeButton4   = 0x14,
+    kDialogCodeButton5   = 0x15,
+    kDialogCodeButton6   = 0x16,
+    kDialogCodeButton7   = 0x17,
+    kDialogCodeButton8   = 0x18,
+    kDialogCodeButton9   = 0x19,
+} DialogCode;
+
+inline bool operator==(const DialogCode &a, const QDialog::DialogCode &b)
+{ return ((int)a) == ((int)b); }
+inline bool operator==(const QDialog::DialogCode &a, const DialogCode &b)
+{ return ((int)a) == ((int)b); }
+inline bool operator!=(const DialogCode &a, const QDialog::DialogCode &b)
+{ return ((int)a) == ((int)b); }
+inline bool operator!=(const QDialog::DialogCode &a, const DialogCode &b)
+{ return ((int)a) == ((int)b); }
+
 class MPUBLIC MythDialog : public QFrame
 {
     Q_OBJECT
@@ -57,14 +83,12 @@
     MythDialog(MythMainWindow *parent, const char *name = 0, 
                bool setsize = true);
 
-    enum DialogCode
-    {
-        Rejected  = 0,
-        Accepted  = 1,
-        ListStart = 0x10,
-    };
+    // these are for backward compatibility..
+    static const DialogCode Rejected  = kDialogCodeRejected;
+    static const DialogCode Accepted  = kDialogCodeAccepted;
+    static const DialogCode ListStart = kDialogCodeListStart;
 
-    int result(void) const { return rescode; }
+    DialogCode result(void) const { return rescode; }
 
     virtual void Show(void);
 
@@ -74,18 +98,18 @@
    
     virtual bool onMediaEvent(MythMediaDevice * mediadevice); 
     
-    void setResult(int r) { rescode = r; }
+    void setResult(DialogCode r);
 
     virtual void deleteLater(void);
 
+    static int CalcItemIndex(DialogCode code);
+
  signals:
     void menuButtonPressed();
 
   public slots:
-    int exec();
-    virtual void done( int );
-
-  protected slots:
+    DialogCode exec(void);
+    virtual void done(int); // Must be given a valid DialogCode
     virtual void AcceptItem(int);
     virtual void accept();
     virtual void reject();
@@ -102,7 +126,7 @@
  
     MythMainWindow *m_parent;
 
-    int rescode;
+    DialogCode rescode;
 
     bool in_loop;
 
@@ -133,28 +157,46 @@
     void ShowPopupAtXY(int destx, int desty, 
                        QObject *target = NULL, const char *slot = NULL);
 
-    int ExecPopup(QObject *target = NULL, const char *slot = NULL);
-    int ExecPopupAtXY(int destx, int desty,
-                      QObject *target = NULL, const char *slot = NULL);
+    DialogCode ExecPopup(QObject *target = NULL, const char *slot = NULL);
+    DialogCode ExecPopupAtXY(int destx, int desty,
+                             QObject *target = NULL, const char *slot = NULL);
 
-    static void showOkPopup(MythMainWindow *parent, QString title,
-                            QString message);
-    static void showExitPopup(MythMainWindow *parent, QString title,
-                              QString message);
+    static bool showOkPopup(MythMainWindow *parent,
+                            const QString  &title,
+                            const QString  &message,
+                            QString         button_msg = QString::null);
+
     static bool showOkCancelPopup(MythMainWindow *parent, QString title,
                                   QString message, bool focusOk);
-    static int show2ButtonPopup(MythMainWindow *parent, QString title,
-                                QString message, QString button1msg,
-                                QString button2msg, int defvalue);
-    static int showButtonPopup(MythMainWindow *parent, QString title,
-                               QString message, QStringList buttonmsgs,
-                               int defvalue);
 
+    static DialogCode Show2ButtonPopup(
+        MythMainWindow *parent,
+        const QString &title, const QString &message,
+        const QString &button1msg, const QString &button2msg,
+        DialogCode default_button)
+    {
+        QStringList buttonmsgs;
+        buttonmsgs += (button1msg.isEmpty()) ?
+            QString("Button 1") : button1msg;
+        buttonmsgs += (button2msg.isEmpty()) ?
+            QString("Button 2") : button2msg;
+        return ShowButtonPopup(
+            parent, title, message, buttonmsgs, default_button);
+    }
+
+    static DialogCode ShowButtonPopup(
+        MythMainWindow *parent,
+        const QString &title, const QString &message,
+        const QStringList &buttonmsgs,
+        DialogCode default_button);
+
     static bool showGetTextPopup(MythMainWindow *parent, QString title,
                                  QString message, QString& text);
     static QString showPasswordPopup(MythMainWindow *parent,
                                      QString title, QString message);
 
+  public slots:
+    virtual void AcceptItem(int);
     virtual void accept(void);
     virtual void reject(void);
 
@@ -168,7 +210,6 @@
 
   protected slots:
     void defaultButtonPressedHandler(void);
-    void defaultExitHandler(int);
 
   private:
     QVBoxLayout *vbox;
@@ -290,8 +331,6 @@
     MythThemedDialog(MythMainWindow *parent, const char *name = 0,
                      bool setsize = true);
 
-   ~MythThemedDialog();
-
     virtual bool loadThemedWindow(QString window_name, QString theme_filename);
     virtual void loadWindow(QDomElement &);
     virtual void parseContainer(QDomElement &);
@@ -329,7 +368,7 @@
     int  getContext(){return context;}
 
   public slots:
-
+    virtual void deleteLater(void);
     virtual void updateBackground();
     virtual void initForeground();
     virtual void updateForeground();
@@ -342,6 +381,7 @@
     virtual void activateCurrent();
 
   protected:
+    ~MythThemedDialog(); // use deleteLater() instead for thread safety
 
     void paintEvent(QPaintEvent* e);
     UIType *widget_with_current_focus;
@@ -383,14 +423,12 @@
                         MythMainWindow *parent, 
                         const char *name = 0, 
                         bool setsize = true);
-    ~MythPasswordDialog();
-
   public slots:
   
     void checkPassword(const QString &);
 
- protected:
- 
+  protected:
+    ~MythPasswordDialog(); // use deleteLater() instead for thread safety
     void keyPressEvent(QKeyEvent *e);
 
   private:
@@ -407,21 +445,22 @@
   public:
 
     MythSearchDialog(MythMainWindow *parent, const char *name = 0); 
-    ~MythSearchDialog();
 
   public: 
     void setCaption(QString text);
     void setSearchText(QString text);
     void setItems(QStringList items); 
     QString getResult(void);
-    
- protected slots:
-    void okPressed(void);
-    void cancelPressed(void);   
+
+  public slots:
+    virtual void deleteLater(void);
+
+  protected slots:
     void searchTextChanged(void);
-    void itemSelected(int index);
      
- protected:
+  protected:
+    void Teardown(void);
+    ~MythSearchDialog(); // use deleteLater() instead for thread safety
     void keyPressEvent(QKeyEvent *e);
 
   private:
@@ -453,8 +492,6 @@
                         QString theme_filename = "", 
                         const char *name = 0,
                         bool setsize=true);
-    ~MythImageFileDialog();
-
   public slots:
   
     void handleTreeListSelection(int, IntVector*);
@@ -463,7 +500,7 @@
     void buildFileList(QString directory);
 
   protected:
-  
+    ~MythImageFileDialog(); // use deleteLater() instead for thread safety
     void keyPressEvent(QKeyEvent *e);
 
   private:
@@ -486,11 +523,6 @@
     
   public:
 
-    enum DialogCode {
-        Rejected,
-        Accepted
-    };
-
     enum ScrollMode {
         HScroll=0,
         VScroll
@@ -498,16 +530,15 @@
 
     MythScrollDialog(MythMainWindow *parent, ScrollMode mode=HScroll,
                      const char *name = 0);
-    ~MythScrollDialog();
 
     void setArea(int w, int h);
     void setAreaMultiplied(int areaWTimes, int areaHTimes);
 
-    int  result() const;
+    DialogCode result(void) const;
 
   public slots:
 
-    int  exec();
+    DialogCode exec(void);
     virtual void done(int);
     virtual void show();
     virtual void hide();
@@ -519,11 +550,11 @@
     virtual void reject();
 
   protected:
-
+    ~MythScrollDialog(); // use deleteLater() instead for thread safety
     void         keyPressEvent(QKeyEvent *e);
     virtual void paintEvent(QRegion& region, int x, int y, int w, int h);
 
-    void setResult(int r);
+    void setResult(DialogCode r);
     void viewportPaintEvent(QPaintEvent *pe);
 
     MythMainWindow *m_parent;
@@ -537,7 +568,7 @@
     QFont           m_defaultMediumFont;
     QFont           m_defaultSmallFont;
 
-    int             m_resCode;
+    DialogCode      m_resCode;
     bool            m_inLoop;
     
     QPixmap        *m_bgPixmap;
Index: mythtv/libs/libmyth/virtualkeyboard.cpp
===================================================================
--- mythtv/libs/libmyth/virtualkeyboard.cpp	(revision 14901)
+++ mythtv/libs/libmyth/virtualkeyboard.cpp	(working copy)
@@ -1,6 +1,3 @@
-#include <iostream>
-using namespace std;
-
 #include <qpixmap.h>
 #include <qimage.h>
 #include <qapplication.h>
@@ -10,6 +7,10 @@
 #include "mythdialogs.h"
 #include "uitypes.h"
 
+#define LOC      QString("VirtualKeyboard: ")
+#define LOC_WARN QString("VirtualKeyboard, Warning: ")
+#define LOC_ERR  QString("VirtualKeyboard, Error: ")
+
 VirtualKeyboard::VirtualKeyboard(MythMainWindow *parent,
                     QWidget *parentEdit,
                     const char *name,
@@ -20,13 +21,20 @@
     setLineWidth(1);
     m_parentEdit = parentEdit;
 
-    switchLayout(gContext->GetLanguageAndVariant());
+    SwitchLayout(gContext->GetLanguageAndVariant());
 }
 
-void VirtualKeyboard::switchLayout(QString language)
+void VirtualKeyboard::SwitchLayout(const QString &lang)
 {
-    language = language.lower();
+    if (!m_parentEdit)
+    {
+        VERBOSE(VB_IMPORTANT, LOC_ERR + "No edit receiving output");
+        reject();
+        return;
+    }
 
+    QString language = lang.lower();
+
     // figure out which of the english layouts to use (UK or US)
     if (language.left(2) == "en")
     {
@@ -44,14 +52,16 @@
 
     if (!loadThemedWindow("keyboard", theme_file))
     {
-        VERBOSE(VB_GENERAL,
-            QString("VirtualKeyboard: cannot find layout for '%1'").arg(language));
+        VERBOSE(VB_GENERAL, LOC_WARN + 
+                QString("Cannot find layout for '%1'").arg(language));
 
         // cannot find layout so fallback to US English layout
         if (!loadThemedWindow("keyboard", "keyboard/en_us_"))
         {
-            VERBOSE(VB_IMPORTANT, "VirtualKeyboard: cannot find layout for US English");
-            done(-1);
+            VERBOSE(VB_IMPORTANT, LOC_ERR + 
+                    "Cannot find layout for US English");
+
+            reject();
             return;
         }
     }
@@ -61,9 +71,10 @@
 
     if (!container)
     {
-        cerr << "VirtualKeyboard: cannot find the 'keyboard_container'"
-                " in your theme" << endl;
-        done(-1);
+        VERBOSE(VB_IMPORTANT, LOC_ERR + 
+                "Cannot find the 'keyboard_container' in your theme");
+
+        reject();
         return;
     }
 
@@ -161,8 +172,10 @@
     m_keyboard = getUIKeyboardType("keyboard");
     if (!m_keyboard)
     {
-        cerr << "VirtualKeyboard: cannot find the UIKeyboardType in your theme" << endl;
-        done(-1);
+        VERBOSE(VB_IMPORTANT, LOC_ERR +
+                "Cannot find the UIKeyboardType in your theme");
+
+        reject();
         return;
     }
 
@@ -179,13 +192,25 @@
 
 VirtualKeyboard::~VirtualKeyboard(void)
 {
+    Teardown();
 }
 
-void VirtualKeyboard::show()
+void VirtualKeyboard::deleteLater(void)
 {
+    Teardown();
+}
+
+void VirtualKeyboard::Teardown(void)
+{
+    m_keyboard   = NULL;
+    m_parentEdit = NULL;
+}
+
+void VirtualKeyboard::Show(void)
+{
     grabKeyboard();
 
-    MythDialog::show();
+    MythDialog::Show();
 
     if (m_parentEdit)
         m_parentEdit->setFocus();
@@ -212,14 +237,14 @@
             QString action = actions[i];
             handled = true;
             if (action == "ESCAPE")
-                done(0);
+                accept();
             else
                 handled = false;
         }
     }
 
     //just pass all unhandled key events for the keyboard to handle
-    if (!handled)
+    if (!handled && m_keyboard)
         m_keyboard->keyPressEvent(e);
 }
 
Index: mythtv/libs/libmyth/mythwidgets.h
===================================================================
--- mythtv/libs/libmyth/mythwidgets.h	(revision 14901)
+++ mythtv/libs/libmyth/mythwidgets.h	(working copy)
@@ -41,12 +41,8 @@
 {
     Q_OBJECT
   public:
-    MythComboBox(bool rw, QWidget* parent=0, const char* name=0):
-        QComboBox(rw, parent, name) { AcceptOnSelect = false; step = 1; 
-            allowVirtualKeyboard = rw; Init(); };
+    MythComboBox(bool rw, QWidget* parent=0, const char* name=0);
 
-    virtual ~MythComboBox();
-
     void setHelpText(QString help) { helptext = help; }
     void setAcceptOnSelect(bool Accept) { AcceptOnSelect = Accept; }
     void setStep(int _step = 1) { step = _step; }
@@ -61,20 +57,25 @@
     void gotFocus();
 
   public slots:
+    virtual void deleteLater(void);
     void insertItem(const QString& item) {
         QComboBox::insertItem(item);
     };
 
   protected:
+    void Teardown(void);
+    virtual ~MythComboBox(); // use deleteLater for thread safety
     virtual void keyPressEvent (QKeyEvent *e);
     virtual void focusInEvent(QFocusEvent *e);
     virtual void focusOutEvent(QFocusEvent *e);
     void Init(void);
+    virtual void popupVirtualKeyboard(void);
 
   private:
     VirtualKeyboard *popup;
     QString helptext;
     bool AcceptOnSelect;
+    bool useVirtualKeyboard;
     bool allowVirtualKeyboard;
     PopupPosition popupPosition;
     int step;
@@ -133,17 +134,9 @@
 {
     Q_OBJECT
   public:
-    MythLineEdit(QWidget *parent=NULL, const char* widgetName=0) :
-      QLineEdit(parent, widgetName)
-	    { rw = true; allowVirtualKeyboard = true; Init(); };
+    MythLineEdit(QWidget *parent=NULL, const char* widgetName=0);
+    MythLineEdit(const QString &text, QWidget *p=NULL, const char *name=0);
 
-    MythLineEdit(const QString& contents, QWidget *parent=NULL, 
-                 const char* widgetName=0) :
-      QLineEdit(contents, parent, widgetName)
-	    { rw = true; allowVirtualKeyboard = true; Init(); };
-
-    virtual ~MythLineEdit();
-
     void setHelpText(QString help) { helptext = help; };
     void setRW(bool readwrite = true) { rw = readwrite; };
     void setRO() { rw = false; };
@@ -152,24 +145,31 @@
     void setPopupPosition(PopupPosition pos) { popupPosition = pos; }
     PopupPosition getPopupPosition(void) { return popupPosition; }
 
- public slots:
-     virtual void setText(const QString& text);
+    virtual QString text();
 
+  public slots:
+    virtual void deleteLater(void);
+    virtual void setText(const QString &text);
+
   signals:
     void changeHelpText(QString);
 
   protected:
+    void Teardown(void);
+    virtual ~MythLineEdit(); // use deleteLater for thread safety
+
     virtual void keyPressEvent(QKeyEvent *e);
     virtual void focusInEvent(QFocusEvent *e); 
     virtual void focusOutEvent(QFocusEvent *e);
     virtual void hideEvent(QHideEvent *e);
     virtual void mouseDoubleClickEvent(QMouseEvent *e);
-    void Init(void);
+    virtual void popupVirtualKeyboard(void);
 
   private:
     VirtualKeyboard *popup;
     QString helptext;
     bool rw;
+    bool useVirtualKeyboard;
     bool allowVirtualKeyboard;
     PopupPosition popupPosition;
 };
@@ -187,7 +187,7 @@
     MythRemoteLineEdit( const QString & contents, QWidget * parent, const char * name = 0 );    
     MythRemoteLineEdit( QFont *a_font, QWidget * parent, const char * name = 0 );    
     MythRemoteLineEdit( int lines, QWidget * parent, const char * name = 0 );
-   ~MythRemoteLineEdit();
+
     void setHelpText(QString help) { helptext = help; }
     void setCycleTime(float desired_interval); // in seconds
     void setCharacterColors(QColor unselected, QColor selected, QColor special);
@@ -197,6 +197,8 @@
     void setPopupPosition(PopupPosition pos) { popupPosition = pos; };
     PopupPosition getPopupPosition(void) { return popupPosition; };
 
+    virtual QString text();
+
   signals:
 
     void    shiftState(bool);
@@ -208,14 +210,16 @@
     void    textChanged(QString);
 
   public slots:
-    
+    virtual void deleteLater(void);
     virtual void setText(const QString& text);
     
   protected:
-    
+    void Teardown(void);
+    virtual ~MythRemoteLineEdit(); // use deleteLater for thread safety
     virtual void focusInEvent(QFocusEvent *e);
     virtual void focusOutEvent(QFocusEvent *e);
     virtual void keyPressEvent(QKeyEvent *e);
+    virtual void popupVirtualKeyboard(void);
 
   private slots:
 
@@ -255,7 +259,8 @@
     int m_lines;
 
     VirtualKeyboard *popup;
-    PopupPosition popupPosition;
+    bool             useVirtualKeyboard;
+    PopupPosition    popupPosition;
 };
 
 class MPUBLIC MythTable : public QTable
Index: mythtv/libs/libmyth/dialogbox.h
===================================================================
--- mythtv/libs/libmyth/dialogbox.h	(revision 14901)
+++ mythtv/libs/libmyth/dialogbox.h	(working copy)
@@ -20,6 +20,7 @@
 
     bool getCheckBoxState(void) {  if (checkbox) return checkbox->isChecked();
                                    return false; }
+
   protected slots:
     void buttonPressed(int which);
 
Index: mythtv/programs/mythfrontend/playbackbox.cpp
===================================================================
--- mythtv/programs/mythfrontend/playbackbox.cpp	(revision 14901)
+++ mythtv/programs/mythfrontend/playbackbox.cpp	(working copy)
@@ -486,7 +486,7 @@
     }
 }
 
-int PlaybackBox::exec(void)
+DialogCode PlaybackBox::exec(void)
 {
     if (recGroup != "")
         return MythDialog::exec();
@@ -497,7 +497,7 @@
         return MythDialog::exec();
     }
 
-    return 0;
+    return kDialogCodeRejected;
 }
 
 /* blocks until playing has stopped */
@@ -4633,7 +4633,8 @@
 
     iconhelp->addLayout(grid);
 
-    QButton *button = iconhelp->addButton(tr("Ok"));
+    QButton *button = iconhelp->addButton(
+        QObject::tr("OK"), iconhelp, SLOT(accept()));
     button->setFocus();
 
     iconhelp->ExecPopup();
@@ -4763,7 +4764,7 @@
     recGroupPopup->addWidget(exitbutton);
     connect(exitbutton, SIGNAL(clicked()), recGroupPopup, SLOT(reject()));
 
-    int result = recGroupPopup->ExecPopup();
+    DialogCode result = recGroupPopup->ExecPopup();
 
     if (result != MythDialog::Rejected)
     {
@@ -4929,7 +4930,7 @@
     connect(recGroupListBox, SIGNAL(currentChanged(QListBoxItem *)), this,
             SLOT(recGroupChooserListBoxChanged()));
 
-    int result = recGroupPopup->ExecPopup();
+    DialogCode result = recGroupPopup->ExecPopup();
 
     if (result != MythDialog::Rejected)
         setGroupFilter();
@@ -4989,7 +4990,7 @@
                                                      recGroupPassword,
                                                      gContext->GetMainWindow());
         pwd->exec();
-        delete pwd;
+        pwd->deleteLater();
         if (!ok)
         {
             recGroupPassword = savedPW;
@@ -5131,7 +5132,7 @@
             SLOT(recGroupChangerListBoxChanged()));
     connect(recGroupOkButton, SIGNAL(clicked()), recGroupPopup, SLOT(accept()));
 
-    int result = recGroupPopup->ExecPopup();
+    DialogCode result = recGroupPopup->ExecPopup();
 
     if (result != MythDialog::Rejected)
         setRecGroup();
@@ -5182,7 +5183,7 @@
     connect(recGroupListBox, SIGNAL(accepted(int)),
             recGroupPopup,   SLOT(AcceptItem(int)));
 
-    int result = recGroupPopup->ExecPopup();
+    DialogCode result = recGroupPopup->ExecPopup();
 
     if (result != MythDialog::Rejected)
         setPlayGroup();
@@ -5219,7 +5220,7 @@
 
     connect(recGroupOkButton, SIGNAL(clicked()), recGroupPopup, SLOT(accept()));
 
-    int result = recGroupPopup->ExecPopup();
+    DialogCode result = recGroupPopup->ExecPopup();
 
     if (result == MythDialog::Accepted)
         setRecTitle();
Index: mythtv/programs/mythfrontend/main.cpp
===================================================================
--- mythtv/programs/mythfrontend/main.cpp	(revision 14901)
+++ mythtv/programs/mythfrontend/main.cpp	(working copy)
@@ -359,10 +359,10 @@
     else if (sel == "settings appearance") 
     {
         AppearanceSettings *settings = new AppearanceSettings();
-        int res = settings->exec();
+        DialogCode res = settings->exec();
         delete settings;
 
-        if (res)
+        if (kDialogCodeRejected != res)
         {
             qApp->processEvents();
             GetMythMainWindow()->JumpTo("Reload Theme");
@@ -458,15 +458,8 @@
     DialogBox *dlg = new DialogBox(gContext->GetMainWindow(), title);
 
     dlg->AddButton(QObject::tr("No"));
-    int result;
+    DialogCode result = kDialogCodeRejected;
 
-    enum {
-        kDialogCodeButton0 = 1,
-        kDialogCodeButton1 = 2,
-        kDialogCodeButton2 = 3,
-        kDialogCodeButton3 = 4,
-    };
-
     int ret = NO_EXIT;
     switch (exitMenuStyle)
     {
@@ -719,18 +712,19 @@
                     long long pos = (long long)(atoi((*++it).ascii()) & 0xffffffffLL);
                     if (pos > 0)
                     {
-                        QString msg = QString("DVD contains a bookmark");
-                        QString button1msg = QString("Play from bookmark");
-                        QString button2msg = QString("Play from beginning");
+                        QString msg = QObject::tr("DVD contains a bookmark");
+                        QString btn0msg = QObject::tr("Play from bookmark");
+                        QString btn1msg = QObject::tr("Play from beginning");
         
-                        int ret = MythPopupBox::show2ButtonPopup(gContext->GetMainWindow(),
-                                                            "", msg,
-                                                            button1msg,
-                                                            button2msg,
-                                                            1);
-                        if (ret == 1)
+                        DialogCode ret = MythPopupBox::Show2ButtonPopup(
+                            gContext->GetMainWindow(),
+                            "", msg,
+                            btn0msg,
+                            btn1msg,
+                            kDialogCodeButton0);
+                        if (kDialogCodeButton1 == ret)
                             pginfo->setIgnoreBookmark(true);
-                        else if (ret == -1)
+                        else if (kDialogCodeRejected == ret)
                         {
                             delete tmprbuf;
                             delete pginfo;
Index: mythtv/programs/mythfrontend/statusbox.cpp
===================================================================
--- mythtv/programs/mythfrontend/statusbox.cpp	(revision 14901)
+++ mythtv/programs/mythfrontend/statusbox.cpp	(working copy)
@@ -361,12 +361,14 @@
             if ((inContent) &&
                 (currentItem == QObject::tr("Log Entries")))
             {
-                int retval = MythPopupBox::show2ButtonPopup(my_parent,
-                                 QString("AckLogEntry"),
-                                 QObject::tr("Acknowledge all log entries at "
-                                             "this priority level or lower?"),
-                                 QObject::tr("Yes"), QObject::tr("No"), 0);
-                if (retval == 0)
+                DialogCode retval = MythPopupBox::Show2ButtonPopup(
+                    my_parent, QString("AckLogEntry"),
+                    QObject::tr("Acknowledge all log entries at "
+                                "this priority level or lower?"),
+                    QObject::tr("Yes"), QObject::tr("No"),
+                    kDialogCodeButton0);
+
+                if (kDialogCodeButton0 == retval)
                 {
                     MSqlQuery query(MSqlQuery::InitCon());
                     query.prepare("UPDATE mythlog SET acknowledged = 1 "
@@ -552,13 +554,13 @@
     {
         if (currentItem == QObject::tr("Log Entries"))
         {
-            int retval;
+            DialogCode retval = MythPopupBox::Show2ButtonPopup(
+                my_parent,
+                QString("AckLogEntry"),
+                QObject::tr("Acknowledge this log entry?"),
+                QObject::tr("Yes"), QObject::tr("No"), kDialogCodeButton0);
 
-            retval = MythPopupBox::show2ButtonPopup(my_parent,
-                                   QString("AckLogEntry"),
-                                   QObject::tr("Acknowledge this log entry?"),
-                                   QObject::tr("Yes"), QObject::tr("No"), 0);
-            if (retval == 0)
+            if (kDialogCodeButton0 == retval)
             {
                 MSqlQuery query(MSqlQuery::InitCon());
                 query.prepare("UPDATE mythlog SET acknowledged = 1 "
@@ -572,20 +574,17 @@
         {
             QStringList msgs;
             int jobStatus;
-            int retval;
 
             jobStatus = JobQueue::GetJobStatus(
                                 contentData[contentPos].toInt());
 
             if (jobStatus == JOB_QUEUED)
             {
-                retval = MythPopupBox::show2ButtonPopup(my_parent,
-                                       QString("JobQueuePopup"),
-                                       QObject::tr("Delete Job?"),
-                                       QObject::tr("Yes"),
-                                       QObject::tr("No"), 2);
-                cout << "Popup result = " << retval << endl;
-                if (retval == 0)
+                DialogCode retval = MythPopupBox::Show2ButtonPopup(
+                    my_parent,
+                    QString("JobQueuePopup"), QObject::tr("Delete Job?"),
+                    QObject::tr("Yes"), QObject::tr("No"), kDialogCodeButton1);
+                if (kDialogCodeButton0 == retval)
                 {
                     JobQueue::DeleteJob(contentData[contentPos].toInt());
                     doJobQueueStatus();
@@ -598,16 +597,17 @@
                 msgs << QObject::tr("Pause");
                 msgs << QObject::tr("Stop");
                 msgs << QObject::tr("No Change");
-                retval = MythPopupBox::showButtonPopup(my_parent,
-                                       QString("JobQueuePopup"),
-                                       QObject::tr("Job Queue Actions:"),
-                                       msgs, 2);
-                if (retval == 0)
+                DialogCode retval = MythPopupBox::ShowButtonPopup(
+                    my_parent,
+                    QString("JobQueuePopup"),
+                    QObject::tr("Job Queue Actions:"),
+                    msgs, kDialogCodeButton2);
+                if (kDialogCodeButton0 == retval)
                 {
                     JobQueue::PauseJob(contentData[contentPos].toInt());
                     doJobQueueStatus();
                 }
-                else if (retval == 1)
+                else if (kDialogCodeButton1 == retval)
                 {
                     JobQueue::StopJob(contentData[contentPos].toInt());
                     doJobQueueStatus();
@@ -618,16 +618,18 @@
                 msgs << QObject::tr("Resume");
                 msgs << QObject::tr("Stop");
                 msgs << QObject::tr("No Change");
-                retval = MythPopupBox::showButtonPopup(my_parent,
-                                       QString("JobQueuePopup"),
-                                       QObject::tr("Job Queue Actions:"),
-                                       msgs, 2);
-                if (retval == 0)
+                DialogCode retval = MythPopupBox::ShowButtonPopup(
+                    my_parent,
+                    QString("JobQueuePopup"),
+                    QObject::tr("Job Queue Actions:"),
+                    msgs, kDialogCodeButton2);
+
+                if (kDialogCodeButton0 == retval)
                 {
                     JobQueue::ResumeJob(contentData[contentPos].toInt());
                     doJobQueueStatus();
                 }
-                else if (retval == 1)
+                else if (kDialogCodeButton1 == retval)
                 {
                     JobQueue::StopJob(contentData[contentPos].toInt());
                     doJobQueueStatus();
@@ -635,12 +637,13 @@
             }
             else if (jobStatus & JOB_DONE)
             {
-                retval = MythPopupBox::show2ButtonPopup(my_parent,
-                                       QString("JobQueuePopup"),
-                                       QObject::tr("Requeue Job?"),
-                                       QObject::tr("Yes"),
-                                       QObject::tr("No"), 1);
-                if (retval == 0)
+                DialogCode retval = MythPopupBox::Show2ButtonPopup(
+                    my_parent,
+                    QString("JobQueuePopup"),
+                    QObject::tr("Requeue Job?"),
+                    QObject::tr("Yes"), QObject::tr("No"), kDialogCodeButton0);
+
+                if (kDialogCodeButton0 == retval)
                 {
                     JobQueue::ChangeJobStatus(contentData[contentPos].toInt(),
                                               JOB_QUEUED);
@@ -657,22 +660,22 @@
             if (rec) 
             {
                 QStringList msgs;
-                int retval;
 
                 msgs << QObject::tr("Delete Now");
                 msgs << QObject::tr("Disable AutoExpire");
                 msgs << QObject::tr("No Change");
                 
-                retval = MythPopupBox::showButtonPopup(my_parent,
-                             QString("AutoExpirePopup"),
-                             QObject::tr("AutoExpire Actions:"),
-                             msgs, 2);
+                DialogCode retval = MythPopupBox::ShowButtonPopup(
+                    my_parent,
+                    QString("AutoExpirePopup"),
+                    QObject::tr("AutoExpire Actions:"),
+                    msgs, kDialogCodeButton2);
 
-                if (retval == 0 && REC_CAN_BE_DELETED(rec))
+                if ((kDialogCodeButton0 == retval) && REC_CAN_BE_DELETED(rec))
                 {
                     RemoteDeleteRecording(rec, false, false);
                 }
-                else if (retval == 1)
+                else if (kDialogCodeButton1 == retval)
                 {
                     rec->SetAutoExpire(0);
                     if ((rec)->recgroup == "LiveTV")
Index: mythtv/programs/mythfrontend/playbackbox.h
===================================================================
--- mythtv/programs/mythfrontend/playbackbox.h	(revision 14901)
+++ mythtv/programs/mythfrontend/playbackbox.h	(working copy)
@@ -106,7 +106,7 @@
     static ProgramInfo *RunPlaybackBox(void *player);
 
   public slots:
-    int exec();
+    DialogCode exec();
 
   protected slots:
     void timeout(void);
Index: mythtv/programs/mythtv-setup/main.cpp
===================================================================
--- mythtv/programs/mythtv-setup/main.cpp	(revision 14901)
+++ mythtv/programs/mythtv-setup/main.cpp	(working copy)
@@ -310,15 +310,14 @@
 
     if (backendIsRunning)
     {
-        int val = MythPopupBox::show2ButtonPopup(
+        DialogCode val = MythPopupBox::Show2ButtonPopup(
             gContext->GetMainWindow(), QObject::tr("WARNING"),
             warn,
             QObject::tr("Continue"),
-            QObject::tr("Exit"), 1);
-        if (1 == val)
-            return 0;
+            QObject::tr("Exit"), kDialogCodeButton0);
 
-        backendIsRunning = true;
+        if (kDialogCodeButton1 == val)
+            return 0;
     }
 
     REG_KEY("qt", "DELETE", "Delete", "D");
@@ -348,7 +347,7 @@
             dia->AddButton(QObject::tr("Yes please"));
             dia->AddButton(QObject::tr("No, I know what I am doing"));
 
-            if (dia->exec() == 2)
+            if (kDialogCodeButton1 == dia->exec())
                 haveProblems = false;
             dia->deleteLater();
         }
Index: mythtv/programs/mythwelcome/welcomedialog.h
===================================================================
--- mythtv/programs/mythwelcome/welcomedialog.h	(revision 14901)
+++ mythtv/programs/mythwelcome/welcomedialog.h	(working copy)
@@ -23,7 +23,7 @@
     void keyPressEvent(QKeyEvent *e);
     void customEvent(QCustomEvent *e);
     void wireUpTheme();
-    int exec(void);
+    DialogCode exec(void);
     
   protected slots:
     void startFrontendClick(void);
Index: mythtv/programs/mythwelcome/welcomedialog.cpp
===================================================================
--- mythtv/programs/mythwelcome/welcomedialog.cpp	(revision 14901)
+++ mythtv/programs/mythwelcome/welcomedialog.cpp	(working copy)
@@ -84,7 +84,7 @@
     QTimer::singleShot(500, this, SLOT(startFrontend()));
 }
 
-int WelcomeDialog::exec()
+DialogCode WelcomeDialog::exec(void)
 {
     // mythshutdown --startup returns 0 for automatic startup
     //                                1 for manual startup 
@@ -203,7 +203,7 @@
         else if (action == "INFO")
         {
             MythWelcomeSettings settings;
-            if (settings.exec() == 1)
+            if (kDialogCodeAccepted == settings.exec())
             {
                 RemoteSendMessage("CLEAR_SETTINGS_CACHE");
                 updateStatus();
@@ -213,7 +213,7 @@
         else if (action == "SHOWSETTINGS")
         {
             MythShutdownSettings settings;
-            if (settings.exec() == 1)
+            if (kDialogCodeAccepted == settings.exec())
                 RemoteSendMessage("CLEAR_SETTINGS_CACHE");
         }
         else if (action == "0")
@@ -296,7 +296,7 @@
 
 void WelcomeDialog::closeDialog()
 {
-    done(1);
+    done(kDialogCodeAccepted);
 }
 
 WelcomeDialog::~WelcomeDialog()
@@ -703,7 +703,7 @@
                          SLOT(shutdownNow()));
     popup->addButton(tr("Exit"), this,
                          SLOT(closeDialog()));
-    popup->addButton(tr("Cancel"), this, SLOT(cancelPopup()));
+    popup->addButton(tr("Cancel"), popup, SLOT(reject()));
 
     popup->ShowPopup(this, SLOT(donePopup(int)));
 
