Skip to content

Commit 9c723ee

Browse files
wjyrichBLumia
authored andcommitted
feat: add smart hide when hide desktop.
as title. PMS-BUG-309173
1 parent cac106e commit 9c723ee

File tree

2 files changed

+38
-0
lines changed

2 files changed

+38
-0
lines changed

panels/dock/x11dockhelper.cpp

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
#include <QAbstractNativeEventFilter>
1616
#include <QGuiApplication>
1717
#include <QPointer>
18+
#include <QDBusConnection>
1819

1920
namespace dock {
2021
Q_LOGGING_CATEGORY(dockX11Log, "dde.shell.dock.x11")
@@ -319,6 +320,7 @@ X11DockHelper::X11DockHelper(DockPanel *panel)
319320
: DockHelper(panel)
320321
, m_xcbHelper(new XcbEventFilter(this))
321322
, m_updateDockAreaTimer(new QTimer(this))
323+
, m_showingDesktop(false)
322324
{
323325
m_updateDockAreaTimer->setSingleShot(true);
324326
m_updateDockAreaTimer->setInterval(100);
@@ -333,6 +335,7 @@ X11DockHelper::X11DockHelper(DockPanel *panel)
333335
connect(panel, &DockPanel::dockScreenChanged, m_updateDockAreaTimer, static_cast<void (QTimer::*)()>(&QTimer::start));
334336

335337
qGuiApp->installNativeEventFilter(m_xcbHelper);
338+
setupKWinDBusConnection();
336339
onHideModeChanged(panel->hideMode());
337340
}
338341

@@ -462,6 +465,9 @@ void X11DockHelper::updateWindowHideState(xcb_window_t window)
462465
bool oldOverlap = data->overlap;
463466
if (!data->isMinimized) {
464467
data->overlap = data->rect.intersects(m_dockArea);
468+
} else {
469+
// 最小化的窗口不会与任务栏重叠
470+
data->overlap = false;
465471
}
466472

467473
if (oldOverlap != data->overlap) {
@@ -522,6 +528,11 @@ bool X11DockHelper::currentActiveWindowFullscreened()
522528

523529
bool X11DockHelper::isWindowOverlap()
524530
{
531+
// 如果当前处于显示桌面状态,则认为没有窗口重叠
532+
if (m_showingDesktop) {
533+
return false;
534+
}
535+
525536
// any widnow overlap
526537
bool overlap = false;
527538
std::for_each(m_windows.begin(), m_windows.end(), [&overlap](const auto &window) {
@@ -614,4 +625,26 @@ void X11DockWakeUpArea::updateDockWakeArea(Position pos)
614625
xcb_configure_window(m_connection, m_triggerWindow, XCB_CONFIG_WINDOW_X | XCB_CONFIG_WINDOW_Y | XCB_CONFIG_WINDOW_WIDTH | XCB_CONFIG_WINDOW_HEIGHT, values);
615626
xcb_flush(m_connection);
616627
}
628+
629+
void X11DockHelper::setupKWinDBusConnection()
630+
{
631+
// 连接到 KWin 的 D-Bus 接口监听 showingDesktopChanged 信号
632+
QDBusConnection::sessionBus().connect(
633+
"org.kde.KWin",
634+
"/KWin",
635+
"org.kde.KWin",
636+
"showingDesktopChanged",
637+
this,
638+
SLOT(onShowingDesktopChanged(bool))
639+
);
640+
}
641+
642+
void X11DockHelper::onShowingDesktopChanged(bool showing)
643+
{
644+
// 更新显示桌面状态
645+
m_showingDesktop = showing;
646+
// 触发窗口重叠状态变化检查
647+
Q_EMIT isWindowOverlapChanged(isWindowOverlap());
648+
}
649+
617650
} // namespace dock

panels/dock/x11dockhelper.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,15 +80,20 @@ private Q_SLOTS:
8080

8181
void updateDockArea();
8282

83+
// KWin D-Bus signal handler
84+
void onShowingDesktopChanged(bool showing);
85+
8386
private:
8487
friend class XcbEventFilter;
88+
void setupKWinDBusConnection();
8589

8690
private:
8791
QHash<xcb_window_t, X11DockWakeUpArea *> m_areas;
8892
QRect m_dockArea;
8993
QHash<xcb_window_t, WindowData*> m_windows;
9094
XcbEventFilter *m_xcbHelper;
9195
QTimer *m_updateDockAreaTimer;
96+
bool m_showingDesktop;
9297
};
9398

9499
class X11DockWakeUpArea : public QObject, public DockWakeUpArea

0 commit comments

Comments
 (0)