Ignore:
Timestamp:
Oct 27, 2010, 6:11:22 PM (15 years ago)
Author:
Dmitry A. Kuminov
Message:

gui: Fixed a crash that could happen at program termination in Dive mode if a top-level window had a native HWND window embedded in it. This was partly a r775 regression and also supersedes this change at all. Closes #184.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/gui/painting/qwindowsurface_pm.cpp

    r787 r808  
    352352    struct WidgetData
    353353    {
    354         QWidget *widget;
    355354        int widgetHeight;
    356355        bool vrnDirty;
     
    360359
    361360    WidgetData data;
    362     QMap<HWND, WidgetData> *subWidgets;
     361    QMap<, WidgetData> *subWidgets;
    363362
    364363    void addWidget(QWidget *widget);
     
    369368        if (widget == that->window())
    370369            return &data;
    371         if (!subWidgets || !subWidgets->contains(widget->internalWinId()))
     370        if (!subWidgets || !subWidgets->contains(widget))
    372371            return 0;
    373         return &(*subWidgets)[widget->internalWinId()];
     372        return &(*subWidgets)[widget];
    374373    }
    375374
     
    386385        // lazily create the sub-widget map (only when really necessary)
    387386        if (!subWidgets)
    388             subWidgets = new QMap<HWND, WidgetData>();
    389         wd = &(*subWidgets)[widget->internalWinId()];
    390     }
    391 
    392     wd->widget = widget;
     387            subWidgets = new QMap<QWidget *, WidgetData>();
     388        wd = &(*subWidgets)[widget];
     389    }
     390
    393391    wd->vrnDirty = true;
    394392    wd->widgetHeight = 0;
     
    418416        widget->removeEventFilter(this);
    419417        widget->removePmEventFilter(this);
    420         subWidgets->remove(widget->internalWinId());
     418        subWidgets->remove(widget);
    421419    }
    422420}
     
    425423{
    426424    QWidget *widget = qobject_cast<QWidget *>(obj);
    427     if (event->type() == QEvent::ParentAboutToChange) {
     425    if (event->type() == QEvent::ParentAboutToChange ||
     426        event->type() == QEvent::Destroy) {
    428427        removeWidget(widget);
    429428    }
     
    466465                data.vrnDirty = true;
    467466                if (subWidgets) {
    468                     foreach(HWND hwnd, subWidgets->keys())
    469                         (*subWidgets)[hwnd].vrnDirty = true;
     467                    foreach(, subWidgets->keys())
     468                        (*subWidgets)[].vrnDirty = true;
    470469                }
    471470            }
     
    487486                data.vrnDirty = true;
    488487                if (subWidgets) {
    489                     foreach(HWND hwnd, subWidgets->keys())
    490                         (*subWidgets)[hwnd].vrnDirty = true;
     488                    foreach(, subWidgets->keys())
     489                        (*subWidgets)[].vrnDirty = true;
    491490                }
    492491            }
     
    530529{
    531530    if (d->subWidgets) {
    532         foreach(HWND hwnd, d->subWidgets->keys())
    533             d->removeWidget((*d->subWidgets)[hwnd].widget);
     531        QList<QWidget *> keys = d->subWidgets->keys();
     532        foreach(QWidget *w, keys)
     533            d->removeWidget(w);
    534534        Q_ASSERT(d->subWidgets->count() == 0);
    535535        delete d->subWidgets;
Note: See TracChangeset for help on using the changeset viewer.