1515#include < QAbstractNativeEventFilter>
1616#include < QGuiApplication>
1717#include < QPointer>
18+ #include < QDBusConnection>
1819
1920namespace dock {
2021Q_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
523529bool 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
0 commit comments