From cfe77faff2ca02995b44d7275780072f3850e526 Mon Sep 17 00:00:00 2001 From: Fan PengCheng Date: Fri, 7 Aug 2020 23:03:41 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E8=A7=A3=E5=86=B3=E6=A1=8C=E9=9D=A2?= =?UTF-8?q?=E6=97=A0=E7=AA=97=E5=8F=A3,=E5=88=87=E6=8D=A2=E4=B8=BA?= =?UTF-8?q?=E6=99=BA=E8=83=BD=E9=9A=90=E8=97=8F=E6=A8=A1=E5=BC=8F=E5=90=8E?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E6=A0=8F=E9=9A=90=E8=97=8F=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 智能模式下为显示状态时,切换模式,不做隐藏操作 Log: 解决桌面无窗口,切换为智能隐藏模式后任务栏隐藏问题 Bug: https://pms.uniontech.com/zentao/bug-view-41907.html Change-Id: I29208fc36266cd1f4404c8ac1ad9d5d60b8ebea0 Reviewed-on: http://gerrit.uniontech.com/c/dde-dock/+/1465 Reviewed-by: Reviewed-by: fanpengcheng Tested-by: Tested-by: fanpengcheng --- frame/util/multiscreenworker.cpp | 136 ++++++++++++++++++++----------- frame/util/multiscreenworker.h | 10 +-- frame/window/mainwindow.cpp | 6 -- frame/window/mainwindow.h | 1 - 4 files changed, 92 insertions(+), 61 deletions(-) diff --git a/frame/util/multiscreenworker.cpp b/frame/util/multiscreenworker.cpp index 42de0245c..39fca86f6 100644 --- a/frame/util/multiscreenworker.cpp +++ b/frame/util/multiscreenworker.cpp @@ -40,6 +40,7 @@ MultiScreenWorker::MultiScreenWorker(QWidget *parent, DWindowManagerHelper *help , m_wmHelper(helper) , m_xcbMisc(XcbMisc::instance()) , m_eventInter(new XEventMonitor("com.deepin.api.XEventMonitor", "/com/deepin/api/XEventMonitor", QDBusConnection::sessionBus())) + , m_extralEventInter(new XEventMonitor("com.deepin.api.XEventMonitor", "/com/deepin/api/XEventMonitor", QDBusConnection::sessionBus())) , m_dockInter(new DBusDock("com.deepin.dde.daemon.Dock", "/com/deepin/dde/daemon/Dock", QDBusConnection::sessionBus(), this)) , m_displayInter(new DisplayInter("com.deepin.daemon.Display", "/com/deepin/daemon/Display", QDBusConnection::sessionBus(), this)) , m_launcherInter(new DBusLuncher("com.deepin.dde.Launcher", "/com/deepin/dde/Launcher", QDBusConnection::sessionBus())) @@ -120,36 +121,6 @@ QRect MultiScreenWorker::realDockRect(const QString &screenName, const Position return getDockHideGeometry(screenName, pos, displayMode, true); } -void MultiScreenWorker::handleLeaveEvent(QEvent *event) -{ - Q_UNUSED(event); - - if (m_hideMode == HideMode::KeepShowing) - return; - - if (!m_autoHide) - return; - - // 判断是否还在'离开'监控区域内,是的话不处理,否则按照显示状态来处理 - if (!contains(m_monitorRectList, scaledPos(QCursor::pos()))) { - switch (m_hideMode) { - case HideMode::SmartHide: { - if (m_hideState == HideState::Show) { - showAni(m_ds.current()); - } else { - hideAni(m_ds.current()); - } - } - break; - case HideMode::KeepHidden: - hideAni(m_ds.current()); - break; - default: - return; - } - } -} - void MultiScreenWorker::onAutoHideChanged(bool autoHide) { m_autoHide = autoHide; @@ -221,6 +192,9 @@ void MultiScreenWorker::handleDbusSignal(QDBusMessage msg) void MultiScreenWorker::onRegionMonitorChanged(int x, int y, const QString &key) { + if (m_registerKey != key) + return; + // 鼠标按下状态不响应唤醒 if (m_btnPress) return; @@ -230,21 +204,6 @@ void MultiScreenWorker::onRegionMonitorChanged(int x, int y, const QString &key) return; } - // 这里收到鼠标事件是全局的,不应该仅仅是任务栏唤醒区域之内的,所以要放在判断m_registerKey之前 - if (m_hideMode == HideMode::KeepHidden || m_hideMode == HideMode::SmartHide) { - // 应该隐藏掉 - QRect rect = dockRect(m_ds.current(), m_position, HideMode::KeepShowing, m_displayMode); - QRect realRect { rect.topLeft(), rect.size() *qApp->devicePixelRatio() }; - const QRect boundRect = parent()->visibleRegion().boundingRect(); - if (!realRect.contains(QPoint(x, y)) && !boundRect.size().isEmpty() && !m_launcherInter->IsVisible() && m_autoHide) { - if (m_hideMode == HideMode::KeepHidden || (m_hideMode == HideMode::SmartHide && m_hideState == HideState::Hide)) - hideAni(m_ds.current()); - } - } - - if (m_registerKey != key) - return; - QString toScreen; QScreen *screen = Utils::screenAtByScaled(QPoint(x, y)); if (!screen) { @@ -341,6 +300,20 @@ void MultiScreenWorker::onRegionMonitorChanged(int x, int y, const QString &key) } } +// 鼠标在任务栏之外移动时,任务栏该响应隐藏时需要隐藏 +void MultiScreenWorker::onExtralRegionMonitorChanged(int x, int y, const QString &key) +{ + if (m_extralRegisterKey != key) + return; + + if (m_hideMode == HideMode::KeepHidden || m_hideMode == HideMode::SmartHide) { + if (!m_launcherInter->IsVisible() && m_autoHide && !m_draging && !m_aniStart) { + if (m_hideMode == HideMode::KeepHidden || (m_hideMode == HideMode::SmartHide && m_hideState == HideState::Hide)) + hideAni(m_ds.current()); + } + } +} + void MultiScreenWorker::onMonitorListChanged(const QList &mons) { if (mons.isEmpty()) @@ -509,10 +482,17 @@ void MultiScreenWorker::onDisplayModeChanged() DockItem::setDockDisplayMode(displayMode); qApp->setProperty(PROP_DISPLAY_MODE, QVariant::fromValue(displayMode)); - parent()->setFixedSize(dockRect(m_ds.current()).size()); - parent()->move(dockRect(m_ds.current()).topLeft()); + QRect rect; + if (m_hideMode == HideMode::KeepShowing || (m_hideMode == HideMode::SmartHide && m_hideState == HideState::Show)) { + rect = dockRect(m_ds.current(), m_position, HideMode::KeepShowing, m_displayMode); + } else { + rect = dockRect(m_ds.current(), m_position, HideMode::KeepHidden, m_displayMode); + } - parent()->panel()->setFixedSize(dockRect(m_ds.current()).size()); + parent()->setFixedSize(rect.size()); + parent()->move(rect.topLeft()); + + parent()->panel()->setFixedSize(rect.size()); parent()->panel()->move(0, 0); parent()->panel()->setDisplayMode(m_displayMode); @@ -581,8 +561,19 @@ void MultiScreenWorker::onRequestUpdateRegionMonitor() m_registerKey.clear(); } + if (!m_extralRegisterKey.isEmpty()) { +#ifdef QT_DEBUG + bool ret = m_extralEventInter->UnregisterArea(m_extralRegisterKey); + qDebug() << "取消任务栏外部区域监听:" << ret; +#else + m_extralEventInter->UnregisterArea(m_extralRegisterKey); +#endif + m_extralRegisterKey.clear(); + } + const static int flags = Motion | Button | Key; const static int monitorHeight = 15; + const int dockSize = int(m_displayMode == DisplayMode::Fashion ? m_dockInter->windowSizeFashion() + 2 * 10/*上下的边距各10像素*/ : m_dockInter->windowSizeEfficient()); // 任务栏唤起区域 m_monitorRectList.clear(); @@ -631,7 +622,54 @@ void MultiScreenWorker::onRequestUpdateRegionMonitor() } } + m_extralRectList.clear(); + foreach (Monitor *inter, validMonitorList(m_monitorInfo)) { + // 屏幕不可用或此位置不可停靠时,不用监听这块区域 + if (!inter->enable() || !inter->dockPosition().docked(m_position)) + continue; + + MonitRect rect; + switch (m_position) { + case Top: { + rect.x1 = inter->x(); + rect.y1 = inter->y() + dockSize; + rect.x2 = inter->x() + inter->w(); + rect.y2 = inter->y() + inter->h(); + } + break; + case Bottom: { + rect.x1 = inter->x(); + rect.y1 = inter->y(); + rect.x2 = inter->x() + inter->w(); + rect.y2 = inter->y() + inter->h() - dockSize; + } + break; + case Left: { + rect.x1 = inter->x() + dockSize; + rect.y1 = inter->y(); + rect.x2 = inter->x() + inter->w(); + rect.y2 = inter->y() + inter->h(); + } + break; + case Right: { + rect.x1 = inter->x(); + rect.y1 = inter->y(); + rect.x2 = inter->x() + inter->w() - dockSize; + rect.y2 = inter->y() + inter->h(); + } + break; + } + + if (!m_extralRectList.contains(rect)) { + m_extralRectList << rect; +#ifdef QT_DEBUG + qDebug() << "任务栏外部区域:" << rect.x1 << rect.y1 << rect.x2 << rect.y2; +#endif + } + } + m_registerKey = m_eventInter->RegisterAreas(m_monitorRectList, flags); + m_extralRegisterKey = m_extralEventInter->RegisterAreas(m_extralRectList, flags); } void MultiScreenWorker::onRequestUpdateFrontendGeometry() @@ -946,6 +984,8 @@ void MultiScreenWorker::initConnection() connect(m_eventInter, &XEventMonitor::ButtonPress, this, [ = ] {m_btnPress = true;}); connect(m_eventInter, &XEventMonitor::ButtonRelease, this, [ = ] {m_btnPress = false;}); + connect(m_extralEventInter, &XEventMonitor::CursorMove, this, &MultiScreenWorker::onExtralRegionMonitorChanged); + connect(this, &MultiScreenWorker::requestUpdateRegionMonitor, this, &MultiScreenWorker::onRequestUpdateRegionMonitor); connect(this, &MultiScreenWorker::requestUpdateFrontendGeometry, this, &MultiScreenWorker::onRequestUpdateFrontendGeometry); connect(this, &MultiScreenWorker::requestUpdatePosition, this, &MultiScreenWorker::onRequestUpdatePosition); diff --git a/frame/util/multiscreenworker.h b/frame/util/multiscreenworker.h index 728f628a8..a12c9756b 100644 --- a/frame/util/multiscreenworker.h +++ b/frame/util/multiscreenworker.h @@ -172,12 +172,6 @@ public: */ QRect realDockRect(const QString &screenName, const Position &pos, const HideMode &hideMode, const DisplayMode &displayMode); - /** - * @brief handleLeaveEvent 状态为隐藏时,离开任务栏需要隐藏任务栏 - * @param event 离开事件 - */ - void handleLeaveEvent(QEvent *event); - signals: void opacityChanged(const quint8 value) const; void displayModeChanegd(); @@ -201,6 +195,7 @@ public slots: private slots: // Region Monitor void onRegionMonitorChanged(int x, int y, const QString &key); + void onExtralRegionMonitorChanged(int x, int y, const QString &key); // Display Monitor void onMonitorListChanged(const QList &mons); @@ -309,6 +304,7 @@ private: // monitor screen XEventMonitor *m_eventInter; + XEventMonitor *m_extralEventInter; // DBus interface DBusDock *m_dockInter; @@ -339,12 +335,14 @@ private: int m_screenRawHeight; int m_screenRawWidth; QString m_registerKey; + QString m_extralRegisterKey; QString m_leaveRegisterKey; bool m_aniStart; // changeDockPosition是否正在运行中 bool m_draging; // 鼠标是否正在调整任务栏的宽度或高度 bool m_autoHide; // 和MenuWorker保持一致,为false时表示菜单已经打开 bool m_btnPress; // 鼠标按下时移动到唤醒区域不应该响应唤醒 QList m_monitorRectList; // 监听唤起任务栏区域 + QList m_extralRectList; // 任务栏外部区域,随m_monitorRectList一起更新 /*****************************************************************/ }; diff --git a/frame/window/mainwindow.cpp b/frame/window/mainwindow.cpp index 89cc53b32..860abbde7 100755 --- a/frame/window/mainwindow.cpp +++ b/frame/window/mainwindow.cpp @@ -200,12 +200,6 @@ void MainWindow::moveEvent(QMoveEvent *event) Q_UNUSED(event); } -void MainWindow::leaveEvent(QEvent *e) -{ - QWidget::leaveEvent(e); - return m_multiScreenWorker->handleLeaveEvent(e); -} - void MainWindow::dragEnterEvent(QDragEnterEvent *e) { QWidget::dragEnterEvent(e); diff --git a/frame/window/mainwindow.h b/frame/window/mainwindow.h index 280a7010f..3662163c0 100644 --- a/frame/window/mainwindow.h +++ b/frame/window/mainwindow.h @@ -133,7 +133,6 @@ private: void mousePressEvent(QMouseEvent *e) override; void keyPressEvent(QKeyEvent *e) override; void enterEvent(QEvent *e) override; - void leaveEvent(QEvent *e) override; void dragEnterEvent(QDragEnterEvent *e) override; void mouseMoveEvent(QMouseEvent *e) override; void moveEvent(QMoveEvent *event) override;