Changeset 808 for trunk


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.

Location:
trunk/src/gui
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/gui/kernel/qwidget_pm.cpp

    r807 r808  
    13901390        if (destroyWindow && !(windowType() == Qt::Desktop) &&
    13911391            d->frameWinId() != NULLHANDLE) {
    1392             // make sure the backing store is deleted before destroying HWND --
    1393             // QPMDiveWindowSurface depends on that
    1394             delete d->topData()->backingStore;
    1395             d->topData()->backingStore = 0;
    1396             // now destroy HWND
     1392            // destroy HWND
    13971393            HWND id = d->frameWinId();
    13981394#if defined(QT_DEBUGWINCREATEDESTROY)
     
    14701466
    14711467    if (old_fid != NULLHANDLE && q->windowType() != Qt::Desktop) {
    1472         // make sure the backing store is deleted before destroying HWND --
    1473         // QPMDiveWindowSurface depends on that
    1474         if (extra && extra->topextra) {
    1475             delete extra->topextra->backingStore;
    1476             extra->topextra->backingStore = 0;
    1477             // zero the to-be-destroyed frame HWND just in case
    1478             extra->topextra->fId = NULLHANDLE;
    1479         }
    1480         // now destroy HWND
     1468        // destroy HWND
    14811469        qt_WinDestroyWindow(old_fid);
    14821470    }
  • 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.