Skip to content

Commit 901c8ce

Browse files
committed
QPA: fix spontaneous deadlock when closing windows
1 parent 1ec83f8 commit 901c8ce

File tree

2 files changed

+25
-10
lines changed

2 files changed

+25
-10
lines changed

platforms/qhaikuplatform/haiku/qhaikuwindow.cpp

+19-8
Original file line numberDiff line numberDiff line change
@@ -199,6 +199,18 @@ void QtHaikuWindow::MessageReceived(BMessage* msg)
199199
return;
200200
}
201201
switch(msg->what) {
202+
case kCloseWindow:
203+
{
204+
Quit();
205+
return;
206+
}
207+
case kSetTitle:
208+
{
209+
const char *title = msg->FindString("title");
210+
if (title != NULL)
211+
SetTitle(title);
212+
return;
213+
}
202214
case kQuitApplication:
203215
{
204216
be_app->PostMessage(B_QUIT_REQUESTED);
@@ -295,7 +307,7 @@ QHaikuWindow::QHaikuWindow(QWindow *wnd)
295307
, m_visible(false)
296308
, m_pendingGeometryChangeOnShow(true)
297309
{
298-
connect(m_window, SIGNAL(quitRequested()), SLOT(platformWindowQuitRequested()), Qt::BlockingQueuedConnection);
310+
connect(m_window, SIGNAL(quitRequested()), SLOT(platformWindowQuitRequested()));
299311
connect(m_window, SIGNAL(windowMoved(QPoint)), SLOT(platformWindowMoved(QPoint)));
300312
connect(m_window, SIGNAL(windowResized(QSize)), SLOT(platformWindowResized(QSize)));
301313
connect(m_window, SIGNAL(windowActivated(bool)), SLOT(platformWindowActivated(bool)));
@@ -331,10 +343,10 @@ QHaikuWindow::QHaikuWindow(QWindow *wnd)
331343
}
332344

333345

334-
QHaikuWindow::~QHaikuWindow()
346+
void QHaikuWindow::destroy()
335347
{
336-
m_window->Lock();
337-
m_window->Quit();
348+
m_window->PostMessage(kCloseWindow);
349+
m_window = NULL;
338350
}
339351

340352

@@ -450,7 +462,9 @@ void QHaikuWindow::setWindowTitle(const QString &title)
450462
{
451463
QString newTitle = QPlatformWindow::formatWindowTitle(title, QStringLiteral(" - "));
452464
newTitle = QPlatformTheme::removeMnemonics(newTitle).trimmed();
453-
m_window->SetTitle(newTitle.toUtf8().constData());
465+
BMessage message(kSetTitle);
466+
message.AddString("title", newTitle.toUtf8().constData());
467+
m_window->PostMessage(&message);
454468
}
455469

456470

@@ -568,8 +582,6 @@ void QHaikuWindow::setVisible(bool visible)
568582
if (visible == m_visible)
569583
return;
570584

571-
m_window->Lock();
572-
573585
if (visible) {
574586
if (window()->type() == Qt::Popup) {
575587
m_window->SetWorkspaces(B_CURRENT_WORKSPACE);
@@ -584,7 +596,6 @@ void QHaikuWindow::setVisible(bool visible)
584596
setWindowFlags(window()->flags());
585597
m_window->Hide();
586598
}
587-
m_window->Unlock();
588599

589600
if (visible) {
590601
if (window()->type() != Qt::ToolTip)

platforms/qhaikuplatform/haiku/qhaikuwindow.h

+6-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
/****************************************************************************
22
**
33
** Copyright (C) 2017 The Qt Company Ltd.
4-
** Copyright (C) 2015-2017 Gerasim Troeglazov,
4+
** Copyright (C) 2015-2020 Gerasim Troeglazov,
55
** Contact: 3dEyes@gmail.com
66
**
77
** This file is part of the plugins of the Qt Toolkit.
@@ -65,6 +65,8 @@
6565
#define kQuitApplication 'QAPP'
6666
#define kSizeGripEnable 'SGEN'
6767
#define kSizeGripDisable 'SGDI'
68+
#define kSetTitle 'TITL'
69+
#define kCloseWindow 'CLWN'
6870

6971
QT_BEGIN_NAMESPACE
7072

@@ -119,7 +121,9 @@ class QHaikuWindow : public QObject, public QPlatformWindow
119121
Q_OBJECT
120122
public:
121123
QHaikuWindow(QWindow *window);
122-
~QHaikuWindow();
124+
~QHaikuWindow() {};
125+
126+
virtual void destroy();
123127

124128
void setGeometry(const QRect &rect) override;
125129
void setWindowTitle(const QString &title) override;

0 commit comments

Comments
 (0)