fix: 解决桌面无窗口,切换为智能隐藏模式后任务栏隐藏问题

智能模式下为显示状态时,切换模式,不做隐藏操作

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: <mailman@uniontech.com>
Reviewed-by: fanpengcheng <fanpengcheng@uniontech.com>
Tested-by: <mailman@uniontech.com>
Tested-by: fanpengcheng <fanpengcheng@uniontech.com>
This commit is contained in:
Fan PengCheng 2020-08-07 23:03:41 +08:00 committed by fanpengcheng
parent f2e5b92096
commit cfe77faff2
4 changed files with 92 additions and 61 deletions

View File

@ -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<QDBusObjectPath> &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);

View File

@ -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<QDBusObjectPath> &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<MonitRect> m_monitorRectList; // 监听唤起任务栏区域
QList<MonitRect> m_extralRectList; // 任务栏外部区域,随m_monitorRectList一起更新
/*****************************************************************/
};

View File

@ -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);

View File

@ -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;