Commit 4dc8ea34 authored by Frank Reininghaus's avatar Frank Reininghaus

Find out the main window by calling the parent widget's window() member

KFileItemModel calls the dir lister's setMainWindow() method to make
sure that the dir lister caches authentication data. However, the method
used to determine the main window (qApp->activeWindow()) is not
guaranteed to yield the DolphinMainWindow or the KonqMainWindow. In
particular, if "Split View" is enabled in Dolphin's settings dialog, the
active window is the dialog, and when it is closed, any later access to
the stored pointer leads to a crash.

A better method is to verify that the model's parent is a QWidget and
then use this widget's window(). I had to make a small modification in
DolphinMainWindow to make sure that it also works correctly when the
view is split (the new view container had been created with a 0 parent

I tested it in Dolphin and Konqueror and verified that the "main window"
passed to the dir lister is really the application's main window.

BUG: 306459
FIXED-IN: 4.9.3
parent b3789357
......@@ -2057,7 +2057,13 @@ void DolphinMainWindow::createSecondaryView(int tabIndex)
const int newWidth = (viewTab.primaryView->width() - splitter->handleWidth()) / 2;
const DolphinView* view = viewTab.primaryView->view();
viewTab.secondaryView = createViewContainer(view->url(), 0);
// The final parent of the new view container will be set by adding it
// to the splitter. However, we must make sure that the DolphinMainWindow
// is a parent of the view container already when it is constructed
// because this enables the container's KFileItemModel to assign its
// dir lister to the right main window. The dir lister can then cache
// authentication data.
viewTab.secondaryView = createViewContainer(view->url(), this);
splitter->setSizes(QList<int>() << newWidth << newWidth);
......@@ -31,6 +31,7 @@
#include <QApplication>
#include <QMimeData>
#include <QTimer>
#include <QWidget>
......@@ -59,7 +60,11 @@ KFileItemModel::KFileItemModel(QObject* parent) :
m_dirLister = new KFileItemModelDirLister(this);
const QWidget* parentWidget = qobject_cast<QWidget*>(parent);
if (parentWidget) {
connect(m_dirLister, SIGNAL(started(KUrl)), this, SIGNAL(directoryLoadingStarted()));
connect(m_dirLister, SIGNAL(canceled()), this, SLOT(slotCanceled()));
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment