Ticket #4128: 4128-v1.patch

File 4128-v1.patch, 14.1 KB (added by danielk, 18 years ago)

Fix for segfault

  • libs/libmyth/settings.cpp

     
    187187    return widget;
    188188}
    189189
     190void VerticalConfigurationGroup::widgetInvalid(QObject *obj)
     191{
     192    widget = (widget == obj) ? NULL : widget;
     193}
     194
     195void VerticalConfigurationGroup::deleteLater(void)
     196{
     197    for (uint i = 0; i < childwidget.size() && i < children.size(); i++)
     198    {
     199        if (children[i] && childwidget[i])
     200            children[i]->widgetInvalid(childwidget[i]);
     201    }
     202    childwidget.clear();
     203    ConfigurationGroup::deleteLater();
     204}
     205
    190206bool VerticalConfigurationGroup::replaceChild(
    191207    Configurable *old_child, Configurable *new_child)
    192208{
     
    207223        if (childwidget[i])
    208224        {
    209225            layout->remove(childwidget[i]);
     226            old_child->widgetInvalid(childwidget[i]);
    210227            childwidget[i]->deleteLater();
    211228            childwidget[i] = NULL;
    212229        }
    213230
     231        bool was_visible = old_child->isVisible();
     232        bool was_enabled = old_child->isEnabled();
     233
    214234        old_child->deleteLater();
    215235
    216         if (children[i]->isVisible())
     236        if (was_visible)
    217237        {
    218             childwidget[i] = children[i]->configWidget(confgrp, widget, NULL);
     238            childwidget[i] = new_child->configWidget(confgrp, widget, NULL);
    219239            layout->add(childwidget[i]);
    220             children[i]->setEnabled(children[i]->isEnabled());
     240            new_child->setEnabled(was_enabled);
    221241            childwidget[i]->resize(1,1);
    222242            childwidget[i]->show();
    223243        }
     
    353373    return widget;
    354374}
    355375
     376StackedConfigurationGroup::~StackedConfigurationGroup()
     377{
     378    for (uint i = 0; i < childwidget.size() && i < children.size(); i++)
     379    {
     380        if (children[i] && childwidget[i])
     381            children[i]->widgetInvalid(childwidget[i]);
     382    }
     383    childwidget.clear();
     384    ConfigurationGroup::deleteLater();
     385}
     386
     387void StackedConfigurationGroup::deleteLater(void)
     388{
     389    for (uint i = 0; i < childwidget.size() && i < children.size(); i++)
     390    {
     391        if (children[i] && childwidget[i])
     392            children[i]->widgetInvalid(childwidget[i]);
     393    }
     394    childwidget.clear();
     395    ConfigurationGroup::deleteLater();
     396}
     397
    356398QWidget* StackedConfigurationGroup::configWidget(ConfigurationGroup *cg,
    357399                                                 QWidget* parent,
    358400                                                 const char* widgetName)
     
    401443    }
    402444}
    403445
     446void StackedConfigurationGroup::widgetInvalid(QObject *obj)
     447{
     448    widget = (widget == obj) ? NULL : widget;
     449}
     450
    404451void StackedConfigurationGroup::removeChild(Configurable *child)
    405452{
    406453    childList::iterator it = find(children.begin(), children.end(), child);
     
    418465    childwidget.erase(cit);
    419466
    420467    if (widget && cw)
     468    {
     469        child->widgetInvalid(cw);
    421470        widget->removeWidget(cw);
     471    }
    422472}
    423473
    424474QWidget* TabbedConfigurationGroup::configWidget(ConfigurationGroup *cg,
     
    626676    return widget;
    627677}
    628678
     679void TriggeredConfigurationGroup::widgetInvalid(QObject *obj)
     680{
     681    widget = (widget == obj) ? NULL : widget;
     682}
     683
    629684int SelectSetting::findSelection(const QString &label, QString value) const
    630685{
    631686    value = (value.isEmpty()) ? label : value;
     
    10811136        connect(widget, SIGNAL(highlighted(int)),
    10821137                this, SLOT(setValue(int)));
    10831138
    1084     connect(widget, SIGNAL(destroyed()),
    1085             this, SLOT(widgetDestroyed()));
    10861139    connect(this, SIGNAL(selectionsCleared()),
    10871140            widget, SLOT(clear()));
    10881141
     
    10931146    return box;
    10941147}
    10951148
     1149void ComboBoxSetting::widgetInvalid(QObject *obj)
     1150{
     1151    widget = (widget == obj) ? NULL : widget;
     1152}
     1153
    10961154void ComboBoxSetting::setEnabled(bool b)
    10971155{
    10981156    Configurable::setEnabled(b);
     
    13021360    return widget;
    13031361}
    13041362
     1363void CheckBoxSetting::widgetInvalid(QObject *obj)
     1364{
     1365    widget = (widget == obj) ? NULL : widget;
     1366}
     1367
    13051368void CheckBoxSetting::setEnabled(bool fEnabled)
    13061369{
    13071370    BooleanSetting::setEnabled(fEnabled);
     
    13371400        MythDialog::keyPressEvent(e);
    13381401}
    13391402
     1403ConfigurationDialog::~ConfigurationDialog()
     1404{
     1405    for (uint i = 0; (i < childwidget.size()) && (i < cfgChildren.size()); i++)
     1406    {
     1407        if (cfgChildren[i] && childwidget[i])
     1408            cfgChildren[i]->widgetInvalid(childwidget[i]);
     1409    }
     1410    childwidget.clear();
     1411    cfgGrp->deleteLater();
     1412}
     1413
    13401414MythDialog* ConfigurationDialog::dialogWidget(MythMainWindow *parent,
    13411415                                              const char *widgetName)
    13421416{
     
    13491423    QVBoxLayout *layout = new QVBoxLayout(dialog, (int)(20 * hmult));
    13501424
    13511425    ChildList::iterator it = cfgChildren.begin();
    1352     for (; it != cfgChildren.end(); ++it)
     1426    childwidget.clear();
     1427    childwidget.resize(cfgChildren.size());
     1428    for (uint i = 0; it != cfgChildren.end(); ++it, ++i)
    13531429    {
    13541430        if ((*it)->isVisible())
    1355             layout->addWidget((*it)->configWidget(cfgGrp, dialog));
     1431        {
     1432            childwidget[i] = (*it)->configWidget(cfgGrp, dialog);
     1433            layout->addWidget(childwidget[i]);
     1434        }
    13561435    }
    13571436
    13581437    return dialog;
     
    13731452    if ((QDialog::Accepted == ret) && saveOnAccept)
    13741453        save();
    13751454
     1455    for (uint i = 0; (i < childwidget.size()) && (i < cfgChildren.size()); i++)
     1456    {
     1457        if (cfgChildren[i] && childwidget[i])
     1458            cfgChildren[i]->widgetInvalid(childwidget[i]);
     1459    }
     1460    childwidget.clear();
     1461
    13761462    dialog->deleteLater();
    13771463    dialog = NULL;
    13781464
     
    14421528    }
    14431529}
    14441530
     1531JumpConfigurationWizard::~JumpConfigurationWizard()
     1532{
     1533    for (uint i = 0; i < childwidget.size() && i < cfgChildren.size(); i++)
     1534    {
     1535        if (cfgChildren[i] && childwidget[i])
     1536            cfgChildren[i]->widgetInvalid(childwidget[i]);
     1537    }
     1538    childwidget.clear();
     1539}
     1540
     1541void JumpConfigurationWizard::deleteLater(void)
     1542{
     1543    for (uint i = 0; i < childwidget.size() && i < cfgChildren.size(); i++)
     1544    {
     1545        if (cfgChildren[i] && childwidget[i])
     1546            cfgChildren[i]->widgetInvalid(childwidget[i]);
     1547    }
     1548    childwidget.clear();
     1549    QObject::deleteLater();
     1550}
     1551
    14451552MythDialog *JumpConfigurationWizard::dialogWidget(MythMainWindow *parent,
    14461553                                                  const char *widgetName)
    14471554{
     
    14511558    QObject::connect(cfgGrp, SIGNAL(changeHelpText(QString)),
    14521559                     wizard, SLOT(  setHelpText(   QString)));
    14531560
    1454     childWidgets.clear();
     1561    childwidget.clear();
    14551562    QStringList labels, helptext;
    14561563    for (uint i = 0; i < cfgChildren.size(); i++)
    14571564    {
    14581565        if (cfgChildren[i]->isVisible())
    14591566        {
    1460             childWidgets.push_back(cfgChildren[i]->configWidget(cfgGrp, parent));
     1567            childwidget.push_back(cfgChildren[i]->configWidget(cfgGrp, parent));
    14611568            labels.push_back(cfgChildren[i]->getLabel());
    14621569            helptext.push_back(cfgChildren[i]->getHelpText());
    14631570        }
     
    14701577    connect(jumppane, SIGNAL(pressed( QString)),
    14711578            this,     SLOT(  showPage(QString)));
    14721579
    1473     for (uint i = 0; i < childWidgets.size(); i++)
     1580    for (uint i = 0; i < childwidget.size(); i++)
    14741581    {
    1475         wizard->addPage(childWidgets[i], labels[i]);
    1476         wizard->setFinishEnabled(childWidgets[i], true);
     1582        wizard->addPage(childwidget[i], labels[i]);
     1583        wizard->setFinishEnabled(childwidget[i], true);
    14771584    }
    14781585
    14791586    return wizard;
     
    14821589void JumpConfigurationWizard::showPage(QString page)
    14831590{
    14841591    uint pagenum = page.toUInt();
    1485     if (pagenum >= childWidgets.size() || !dialog)
     1592    if (pagenum >= childwidget.size() || !dialog)
    14861593        return;
    1487     ((MythJumpWizard*)(dialog))->showPage(childWidgets[pagenum]);
     1594    ((MythJumpWizard*)(dialog))->showPage(childwidget[pagenum]);
    14881595}
    14891596
    14901597void SimpleDBStorage::load()
     
    15941701
    15951702void ListBoxSetting::clearSelections(void)
    15961703{
     1704    VERBOSE(VB_IMPORTANT, "clearSelections(void) widget: "
     1705            <<bxwidget<<":"<<widget);
    15971706    SelectSetting::clearSelections();
    15981707    if (widget)
    15991708        widget->clear();
     
    16121721
    16131722QWidget* ListBoxSetting::configWidget(ConfigurationGroup *cg, QWidget* parent,
    16141723                                      const char* widgetName) {
     1724    if (bxwidget)
     1725        VERBOSE(VB_IMPORTANT, "configWidget called while there "
     1726                "is an existing widget: "<<bxwidget);
     1727
    16151728    QWidget* box = new QVBox(parent, widgetName);
    16161729    box->setBackgroundOrigin(QWidget::WindowOrigin);
    16171730
     1731    VERBOSE(VB_IMPORTANT, "configWidget->"<<box);
     1732
    16181733    if (getLabel() != "")
    16191734    {
    16201735        QLabel* label = new QLabel(box);
     
    16221737        label->setBackgroundOrigin(QWidget::WindowOrigin);
    16231738    }
    16241739
     1740    bxwidget = box;
    16251741    widget = new MythListBox(box);
    16261742    widget->setBackgroundOrigin(QWidget::WindowOrigin);
    16271743    widget->setHelpText(getHelpText());
     
    16541770    widget->setFocus();
    16551771    widget->setSelectionMode(selectionMode);
    16561772
    1657     return box;
     1773    return bxwidget;
    16581774}
    16591775
     1776void ListBoxSetting::widgetInvalid(QObject *obj)
     1777{
     1778    VERBOSE(VB_IMPORTANT, "widgetInvalid("<<obj<<") == "
     1779            <<bxwidget<<":"<<widget<<"?");
     1780    if (bxwidget == obj)
     1781    {
     1782        widget   = NULL;
     1783        bxwidget = NULL;
     1784    }
     1785}
     1786
    16601787void ListBoxSetting::setSelectionMode(MythListBox::SelectionMode mode)
    16611788{
    16621789   selectionMode = mode;
  • libs/libmyth/mythcontext.h

     
    209209
    210210/// Update this whenever the plug-in API changes.
    211211/// Including changes in the libmythtv class methods used by plug-ins.
    212 #define MYTH_BINARY_VERSION "0.21.20071104-1"
     212#define MYTH_BINARY_VERSION "0.21.20071105-2"
    213213
    214214/** \brief Increment this whenever the MythTV network protocol changes.
    215215 *
  • libs/libmyth/settings.h

     
    135135
    136136    Storage *GetStorage(void) { return storage; }
    137137
     138    virtual void widgetInvalid(QObject*) { }
     139
    138140  public slots:
    139141    virtual void enableOnSet(const QString &val);
    140142    virtual void enableOnUnset(const QString &val);
     
    380382    virtual void setEnabled(bool b);
    381383    virtual void setVisible(bool b);
    382384
     385    virtual void widgetInvalid(QObject *obj);
     386
    383387public slots:
    384388    void addSelection(const QString &label,
    385389                      QString value = QString::null,
     
    387391    bool removeSelection(const QString &label,
    388392                         QString value = QString::null);
    389393
    390 protected slots:
    391     void widgetDestroyed() { widget=NULL; };
    392 
    393394private:
    394395    bool rw;
    395396    MythComboBox *widget;
     
    402403    Q_OBJECT
    403404public:
    404405    ListBoxSetting(Storage *_storage) :
    405         SelectSetting(_storage), widget(NULL),
     406        SelectSetting(_storage), bxwidget(NULL), widget(NULL),
    406407        selectionMode(MythListBox::Single) { }
    407408
    408409    virtual QWidget* configWidget(ConfigurationGroup *cg, QWidget* parent,
     
    417418
    418419    virtual void clearSelections(void);
    419420
     421    virtual void widgetInvalid(QObject *obj);
     422
    420423signals:
    421424    void accepted(int);
    422425    void menuButtonPressed(int);
     
    428431                      QString        value  = QString::null,
    429432                      bool           select = false);
    430433
    431 protected slots:
    432434    void setValueByIndex(int index);
    433435protected:
     436    QWidget*     bxwidget;
    434437    MythListBox* widget;
    435438    MythListBox::SelectionMode selectionMode;
    436439};
     
    493496    virtual QWidget* configWidget(ConfigurationGroup *cg, QWidget* parent,
    494497                                  const char* widgetName = 0);
    495498    virtual void setEnabled(bool b);
     499
     500    virtual void widgetInvalid(QObject*);
     501
    496502protected:
    497503    MythCheckBox *widget;
    498504};
     
    894900    {
    895901    }
    896902
     903    virtual void deleteLater(void);
     904
    897905    virtual QWidget *configWidget(ConfigurationGroup *cg,
    898906                                  QWidget            *parent,
    899907                                  const char         *widgetName);
     
    901909    bool replaceChild(Configurable *old_child, Configurable *new_child);
    902910    void repaint(void);
    903911
     912    virtual void widgetInvalid(QObject *obj);
     913
    904914  protected:
    905915    /// You need to call deleteLater to delete QObject
    906916    virtual ~VerticalConfigurationGroup() { }
     
    967977    {
    968978    }
    969979
     980    virtual void deleteLater(void);
     981
    970982    virtual QWidget* configWidget(ConfigurationGroup *cg, QWidget* parent,
    971983                                  const char* widgetName = 0);
    972984
     
    979991
    980992    void addChild(Configurable*);
    981993    void removeChild(Configurable*);
     994    virtual void widgetInvalid(QObject *obj);
    982995
    983996  signals:
    984997    void raiseWidget(int);
    985998
    986999  protected:
    9871000    /// You need to call deleteLater to delete QObject
    988     virtual ~StackedConfigurationGroup() { }
     1001    virtual ~StackedConfigurationGroup();
    9891002
    9901003  protected:
    9911004    vector<QWidget*>    childwidget;
     
    10341047
    10351048    void repaint(void);
    10361049
     1050    virtual void widgetInvalid(QObject *obj);
     1051
    10371052    // Sets
    10381053
    10391054    void SetVertical(bool vert);
     
    11631178{
    11641179  public:
    11651180    ConfigurationDialog() : dialog(NULL), cfgGrp(new ConfigurationGroup()) { }
    1166     virtual ~ConfigurationDialog() { cfgGrp->deleteLater(); }
     1181    virtual ~ConfigurationDialog();
    11671182
    11681183    // Make a modal dialog containing configWidget
    11691184    virtual MythDialog *dialogWidget(MythMainWindow *parent,
     
    11871202    typedef vector<Configurable*> ChildList;
    11881203
    11891204    ChildList           cfgChildren;
     1205    vector<QWidget*>    childwidget;
    11901206    MythDialog         *dialog;
    11911207    ConfigurationGroup *cfgGrp;
    11921208};
     
    12161232    virtual MythDialog *dialogWidget(MythMainWindow *parent,
    12171233                                     const char     *widgetName);
    12181234
     1235    virtual void deleteLater(void);
     1236
    12191237  protected slots:
    12201238    void showPage(QString);
    12211239
    12221240  protected:
    12231241    /// You need to call deleteLater to delete QObject
    1224     virtual ~JumpConfigurationWizard() { }
    1225 
    1226   protected:
    1227     vector<QWidget*> childWidgets;
     1242    virtual ~JumpConfigurationWizard();
    12281243};
    12291244
    12301245class MPUBLIC JumpPane : public VerticalConfigurationGroup