Skip to content

Commit

Permalink
fix: delay connect native state change signal
Browse files Browse the repository at this point in the history
Change-Id: I0ed487799fb233db476f97a6036a315732a2ad1d
  • Loading branch information
Iceyer committed Feb 11, 2018
1 parent 7c7a4e3 commit 48e23bc
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 8 deletions.
1 change: 1 addition & 0 deletions src/widgets/dthememanager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -231,6 +231,7 @@ class DThemeManagerPrivate : public DCORE_NAMESPACE::DObjectPrivate
void registerWidget(QWidget *widget, const QString &filename, const QStringList &propertys)
{
if (filename.isEmpty()) {
qWarning() << "can not load qss with out filename" << widget;
return;
}

Expand Down
30 changes: 22 additions & 8 deletions src/widgets/dtitlebar.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,7 @@ class DTitlebarPrivate : public DTK_CORE_NAMESPACE::DObjectPrivate
void updateButtonsState(Qt::WindowFlags type);
void updateButtonsFunc();
void handleParentWindowStateChange();
void handleParentWindowIdChange();
void _q_toggleWindowState();
void _q_showMinimized();
void _q_onTopWindowMotifHintsChanged(quint32 winId);
Expand Down Expand Up @@ -216,12 +217,9 @@ void DTitlebarPrivate::init()
q->connect(DWindowManagerHelper::instance(), SIGNAL(windowMotifWMHintsChanged(quint32)),
q, SLOT(_q_onTopWindowMotifHintsChanged(quint32)));

if (targetWindow()) {
q->connect(targetWindow()->windowHandle(), &QWindow::windowStateChanged,
q, [ = ](Qt::WindowState) {
handleParentWindowStateChange();
});
}
// connect state change if parent has native window
// or connect when parent winid change
handleParentWindowIdChange();
}

QWidget *DTitlebarPrivate::targetWindow()
Expand Down Expand Up @@ -341,6 +339,22 @@ void DTitlebarPrivate::handleParentWindowStateChange()
updateButtonsState(targetWindow()->windowFlags());
}

//!
//! \brief DTitlebarPrivate::handleParentWindowIdChange
//! Them WindowStateChnage Event will miss some state changed message,
//! So use windowHandle::windowStateChanged instead
void DTitlebarPrivate::handleParentWindowIdChange()
{
D_Q(DTitlebar);
if (targetWindow()->windowHandle()) {
q->disconnect(targetWindow()->windowHandle(), &QWindow::windowStateChanged, q, Q_NULLPTR);
q->connect(targetWindow()->windowHandle(), &QWindow::windowStateChanged,
q, [ = ](Qt::WindowState) {
handleParentWindowStateChange();
});
}
}

void DTitlebarPrivate::_q_toggleWindowState()
{
QWidget *parentWindow = targetWindow();
Expand Down Expand Up @@ -623,8 +637,8 @@ bool DTitlebar::eventFilter(QObject *obj, QEvent *event)

switch (event->type()) {
// !!! NO state change when fullscreen state change to nostate ?
case QEvent::WindowStateChange: {
d->handleParentWindowStateChange();
case QEvent::WinIdChange: {
d->handleParentWindowIdChange();
break;
}
case QEvent::ShowToParent:
Expand Down

0 comments on commit 48e23bc

Please sign in to comment.