From dbc67d9ff8f389d417e66e4c9e1cf96b1a2aefe4 Mon Sep 17 00:00:00 2001 From: zhangkun Date: Wed, 27 Nov 2024 11:52:58 +0800 Subject: [PATCH] fix: some windows have dual title bars MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 使用windowhandle的close()去关闭窗口 - DDialog和DMainWindow适配Treeland pms: BUG-286173 --- include/widgets/dtitlebar.h | 1 + src/widgets/dabstractdialog.cpp | 7 +------ src/widgets/dfloatingmessage.cpp | 16 +++++++++------- src/widgets/dmainwindow.cpp | 12 +++--------- src/widgets/dtitlebar.cpp | 10 +++++++++- 5 files changed, 23 insertions(+), 23 deletions(-) diff --git a/include/widgets/dtitlebar.h b/include/widgets/dtitlebar.h index 859e03866..fb6ca64b1 100644 --- a/include/widgets/dtitlebar.h +++ b/include/widgets/dtitlebar.h @@ -119,6 +119,7 @@ private Q_SLOTS: D_PRIVATE_SLOT(void _q_toggleWindowState()) D_PRIVATE_SLOT(void _q_showMinimized()) D_PRIVATE_SLOT(void _q_onTopWindowMotifHintsChanged(quint32)) + D_PRIVATE_SLOT(void _q_closeWindow()) #ifndef QT_NO_MENU D_PRIVATE_SLOT(void _q_addDefaultMenuItems()) diff --git a/src/widgets/dabstractdialog.cpp b/src/widgets/dabstractdialog.cpp index 4a5c5e1c5..d698d77fd 100644 --- a/src/widgets/dabstractdialog.cpp +++ b/src/widgets/dabstractdialog.cpp @@ -40,11 +40,6 @@ void DAbstractDialogPrivate::init(bool blurIfPossible) // TODO: 这里对dialog特殊处理,dialog不需要设置固定的位置,否则里面的坐标会发生偏移导致点击偏移 // 但是这不是问题的根本原因,还需要进一步分析。该属性在插件中做了特殊处理 q->QDialog::setProperty("DAbstractDialog", true); - auto noTitlebarEnabled = []{ - QFunctionPointer enableNoTitlebar = qApp->platformFunction("_d_isEnableNoTitlebar"); - bool enabled = qApp->platformName() == "dwayland" || qApp->property("_d_isDwayland").toBool(); - return enabled && enableNoTitlebar != nullptr; - }; if (qApp->isDXcbPlatform()) { handle = new DPlatformWindowHandle(q, q); @@ -66,7 +61,7 @@ void DAbstractDialogPrivate::init(bool blurIfPossible) bgBlurWidget->setBlurEnabled(blurIfPossible); q->setAttribute(Qt::WA_TranslucentBackground, blurIfPossible); - } else if (noTitlebarEnabled()) { + } else if (DWindowManagerHelper::instance()->hasNoTitlebar()) { handle = new DPlatformWindowHandle(q, q); if (!handle->enableBlurWindow()) { diff --git a/src/widgets/dfloatingmessage.cpp b/src/widgets/dfloatingmessage.cpp index fd3aaa48d..f6d653406 100644 --- a/src/widgets/dfloatingmessage.cpp +++ b/src/widgets/dfloatingmessage.cpp @@ -12,6 +12,7 @@ #include #include #include +#include class MessageLabel : public QLabel { @@ -79,15 +80,16 @@ void DFloatingMessagePrivate::init() closeButton->setIconSize(DSizeModeHelper::element(QSize(20, 20), QSize(32, 32))); hBoxLayout->addWidget(closeButton); - q->connect(closeButton, &DIconButton::clicked, q, &DFloatingMessage::closeButtonClicked); - if(ENABLE_ANIMATIONS && ENABLE_ANIMATION_MESSAGE) - q->connect(closeButton, &DIconButton::clicked, q, [q]() { - q->close(); + q->connect(closeButton, &DIconButton::clicked, q, [q]() { + if (q->windowHandle()) { + q->windowHandle()->close(); + } + if(ENABLE_ANIMATIONS && ENABLE_ANIMATION_MESSAGE) { Q_EMIT q->messageClosed(); - }); - else - q->connect(closeButton, &DIconButton::clicked, q, &DFloatingMessage::close); + } + Q_EMIT q->closeButtonClicked(); + }); } if (!ENABLE_ANIMATIONS || !ENABLE_ANIMATION_MESSAGE) diff --git a/src/widgets/dmainwindow.cpp b/src/widgets/dmainwindow.cpp index 8682ba2a0..a739d66fc 100644 --- a/src/widgets/dmainwindow.cpp +++ b/src/widgets/dmainwindow.cpp @@ -24,6 +24,7 @@ #include #include +#include #include #include @@ -42,15 +43,8 @@ DMainWindowPrivate::DMainWindowPrivate(DMainWindow *qq) { titlebar = new DTitlebar(qq); titlebar->setAccessibleName("DMainWindowTitlebar"); - auto noTitlebarEnabled = []{ - if (DGuiApplicationHelper::testAttribute(DGuiApplicationHelper::IsWaylandPlatform)) { - return true; - } - QFunctionPointer enableNoTitlebar = qApp->platformFunction("_d_isEnableNoTitlebar"); - bool enabled = qApp->platformName() == "dwayland" || qApp->property("_d_isDwayland").toBool(); - return enabled && enableNoTitlebar != nullptr; - }; - if (DApplication::isDXcbPlatform() || noTitlebarEnabled()) { + + if (DApplication::isDXcbPlatform() || DWindowManagerHelper::instance()->hasNoTitlebar()) { handle = new DPlatformWindowHandle(qq, qq); qq->setMenuWidget(titlebar); } else { diff --git a/src/widgets/dtitlebar.cpp b/src/widgets/dtitlebar.cpp index c3a23a700..9108ac0d9 100644 --- a/src/widgets/dtitlebar.cpp +++ b/src/widgets/dtitlebar.cpp @@ -79,6 +79,7 @@ class DTitlebarPrivate : public DTK_CORE_NAMESPACE::DObjectPrivate void _q_toggleWindowState(); void _q_showMinimized(); void _q_onTopWindowMotifHintsChanged(quint32 winId); + void _q_closeWindow(); #ifndef QT_NO_MENU void _q_addDefaultMenuItems(); @@ -572,6 +573,13 @@ void DTitlebarPrivate::_q_toggleWindowState() } } +void DTitlebarPrivate::_q_closeWindow() +{ + if (targetWindow()->windowHandle()) { + targetWindow()->windowHandle()->close(); + } +} + void DTitlebarPrivate::_q_showMinimized() { targetWindow()->showMinimized(); @@ -1533,7 +1541,7 @@ void DTitlebar::setVisible(bool visible) connect(d->maxButton, SIGNAL(clicked()), this, SLOT(_q_toggleWindowState()), Qt::UniqueConnection); connect(this, SIGNAL(doubleClicked()), this, SLOT(_q_toggleWindowState()), Qt::UniqueConnection); connect(d->minButton, SIGNAL(clicked()), this, SLOT(_q_showMinimized()), Qt::UniqueConnection); - connect(d->closeButton, &DWindowCloseButton::clicked, d->targetWindow(), &QWidget::close, Qt::UniqueConnection); + connect(d->closeButton, SIGNAL(clicked()), this, SLOT(_q_closeWindow()), Qt::UniqueConnection); d->updateButtonsState(d->targetWindow()->windowFlags()); } else {