mirror of
https://github.com/linuxdeepin/dde-dock.git
synced 2025-06-02 15:45:21 +00:00
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:
parent
f2e5b92096
commit
cfe77faff2
@ -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);
|
||||
|
@ -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一起更新
|
||||
/*****************************************************************/
|
||||
};
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user