2017-09-18 14:33:44 +08:00
|
|
|
|
/*
|
2018-02-07 11:52:47 +08:00
|
|
|
|
* Copyright (C) 2011 ~ 2018 Deepin Technology Co., Ltd.
|
2017-09-18 14:33:44 +08:00
|
|
|
|
*
|
|
|
|
|
* Author: sbw <sbw@sbw.so>
|
|
|
|
|
*
|
|
|
|
|
* Maintainer: sbw <sbw@sbw.so>
|
2020-05-28 20:45:02 +08:00
|
|
|
|
* zhaolong <zhaolong@uniontech.com>
|
2017-09-18 14:33:44 +08:00
|
|
|
|
*
|
|
|
|
|
* This program is free software: you can redistribute it and/or modify
|
|
|
|
|
* it under the terms of the GNU General Public License as published by
|
|
|
|
|
* the Free Software Foundation, either version 3 of the License, or
|
|
|
|
|
* any later version.
|
|
|
|
|
*
|
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
|
*
|
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
|
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
|
*/
|
|
|
|
|
|
2016-06-02 09:46:43 +08:00
|
|
|
|
#include "mainwindow.h"
|
2019-08-16 17:44:57 +08:00
|
|
|
|
#include "panel/mainpanelcontrol.h"
|
2019-08-19 13:40:06 +08:00
|
|
|
|
#include "controller/dockitemmanager.h"
|
2019-04-23 14:28:09 +08:00
|
|
|
|
#include "util/utils.h"
|
2020-06-05 16:16:59 +08:00
|
|
|
|
#include "util/docksettings.h"
|
2016-06-02 09:46:43 +08:00
|
|
|
|
|
2020-05-28 20:45:02 +08:00
|
|
|
|
#include <DStyle>
|
|
|
|
|
#include <DPlatformWindowHandle>
|
|
|
|
|
|
2016-06-02 09:46:43 +08:00
|
|
|
|
#include <QDebug>
|
2017-12-11 12:02:54 +08:00
|
|
|
|
#include <QEvent>
|
2016-06-02 15:43:57 +08:00
|
|
|
|
#include <QResizeEvent>
|
2017-02-28 11:31:48 +08:00
|
|
|
|
#include <QScreen>
|
|
|
|
|
#include <QGuiApplication>
|
2018-02-22 11:44:57 +08:00
|
|
|
|
#include <QX11Info>
|
2017-11-13 21:17:56 +08:00
|
|
|
|
#include <qpa/qplatformwindow.h>
|
2016-06-02 09:46:43 +08:00
|
|
|
|
|
2017-06-08 15:38:11 +08:00
|
|
|
|
#include <X11/X.h>
|
|
|
|
|
#include <X11/Xutil.h>
|
|
|
|
|
|
2019-01-15 19:54:13 +08:00
|
|
|
|
#define SNI_WATCHER_SERVICE "org.kde.StatusNotifierWatcher"
|
|
|
|
|
#define SNI_WATCHER_PATH "/StatusNotifierWatcher"
|
|
|
|
|
|
2019-09-06 14:44:07 +08:00
|
|
|
|
#define MAINWINDOW_MAX_SIZE DOCK_MAX_SIZE
|
2019-08-26 16:15:50 +08:00
|
|
|
|
#define MAINWINDOW_MIN_SIZE (40)
|
2019-09-05 11:19:11 +08:00
|
|
|
|
#define DRAG_AREA_SIZE (5)
|
2019-08-26 16:15:50 +08:00
|
|
|
|
|
2019-01-15 19:54:13 +08:00
|
|
|
|
using org::kde::StatusNotifierWatcher;
|
|
|
|
|
|
2019-09-05 11:19:11 +08:00
|
|
|
|
class DragWidget : public QWidget
|
|
|
|
|
{
|
|
|
|
|
Q_OBJECT
|
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
bool m_dragStatus;
|
|
|
|
|
QPoint m_resizePoint;
|
|
|
|
|
|
|
|
|
|
public:
|
2020-06-13 19:19:30 +08:00
|
|
|
|
explicit DragWidget(QWidget *parent) : QWidget(parent)
|
2019-09-05 11:19:11 +08:00
|
|
|
|
{
|
2020-06-04 14:37:33 +08:00
|
|
|
|
setObjectName("DragWidget");
|
2019-09-05 11:19:11 +08:00
|
|
|
|
m_dragStatus = false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
signals:
|
|
|
|
|
void dragPointOffset(QPoint);
|
|
|
|
|
void dragFinished();
|
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
void mousePressEvent(QMouseEvent *event) override
|
|
|
|
|
{
|
|
|
|
|
if (event->button() == Qt::LeftButton) {
|
|
|
|
|
m_resizePoint = event->globalPos();
|
|
|
|
|
m_dragStatus = true;
|
|
|
|
|
this->grabMouse();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void mouseMoveEvent(QMouseEvent *event) override
|
|
|
|
|
{
|
|
|
|
|
if (m_dragStatus) {
|
|
|
|
|
QPoint offset = QPoint(QCursor::pos() - m_resizePoint);
|
|
|
|
|
emit dragPointOffset(offset);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void mouseReleaseEvent(QMouseEvent *event) override
|
|
|
|
|
{
|
|
|
|
|
if (!m_dragStatus)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
m_dragStatus = false;
|
|
|
|
|
releaseMouse();
|
|
|
|
|
emit dragFinished();
|
|
|
|
|
}
|
2019-09-27 11:18:32 +08:00
|
|
|
|
|
|
|
|
|
void enterEvent(QEvent *) override
|
|
|
|
|
{
|
2019-10-25 11:12:27 +08:00
|
|
|
|
if (QApplication::overrideCursor() && QApplication::overrideCursor()->shape() != cursor()) {
|
|
|
|
|
QApplication::setOverrideCursor(cursor());
|
|
|
|
|
}
|
2019-09-27 11:18:32 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void leaveEvent(QEvent *) override
|
|
|
|
|
{
|
|
|
|
|
QApplication::restoreOverrideCursor();
|
|
|
|
|
}
|
2019-09-05 11:19:11 +08:00
|
|
|
|
};
|
|
|
|
|
|
2017-11-14 14:20:04 +08:00
|
|
|
|
const QPoint rawXPosition(const QPoint &scaledPos)
|
|
|
|
|
{
|
2019-08-19 13:40:06 +08:00
|
|
|
|
QScreen const *screen = Utils::screenAtByScaled(scaledPos);
|
2019-04-23 14:28:09 +08:00
|
|
|
|
|
|
|
|
|
return screen ? screen->geometry().topLeft() +
|
2019-08-19 13:40:06 +08:00
|
|
|
|
(scaledPos - screen->geometry().topLeft()) *
|
|
|
|
|
screen->devicePixelRatio()
|
|
|
|
|
: scaledPos;
|
2017-11-14 14:20:04 +08:00
|
|
|
|
}
|
|
|
|
|
|
2017-12-29 15:54:46 +08:00
|
|
|
|
const QPoint scaledPos(const QPoint &rawXPos)
|
|
|
|
|
{
|
2019-08-19 13:40:06 +08:00
|
|
|
|
QScreen const *screen = Utils::screenAt(rawXPos);
|
2019-04-23 14:28:09 +08:00
|
|
|
|
|
|
|
|
|
return screen
|
2019-08-19 13:40:06 +08:00
|
|
|
|
? screen->geometry().topLeft() +
|
|
|
|
|
(rawXPos - screen->geometry().topLeft()) / screen->devicePixelRatio()
|
|
|
|
|
: rawXPos;
|
2017-12-29 15:54:46 +08:00
|
|
|
|
}
|
|
|
|
|
|
2016-06-02 09:46:43 +08:00
|
|
|
|
MainWindow::MainWindow(QWidget *parent)
|
2020-05-28 20:45:02 +08:00
|
|
|
|
: DBlurEffectWidget(parent)
|
|
|
|
|
, m_launched(false)
|
|
|
|
|
, m_mainPanel(new MainPanelControl(this))
|
|
|
|
|
, m_platformWindowHandle(this)
|
|
|
|
|
, m_wmHelper(DWindowManagerHelper::instance())
|
2020-06-05 16:16:59 +08:00
|
|
|
|
, m_eventInter(new XEventMonitor("com.deepin.api.XEventMonitor", "/com/deepin/api/XEventMonitor", QDBusConnection::sessionBus()))
|
2020-07-27 13:50:49 +08:00
|
|
|
|
, m_launcherInter(new DBusLuncher("com.deepin.dde.Launcher","/com/deepin/dde/Launcher",QDBusConnection::sessionBus()))
|
2020-05-28 20:45:02 +08:00
|
|
|
|
, m_positionUpdateTimer(new QTimer(this))
|
|
|
|
|
, m_expandDelayTimer(new QTimer(this))
|
|
|
|
|
, m_leaveDelayTimer(new QTimer(this))
|
|
|
|
|
, m_shadowMaskOptimizeTimer(new QTimer(this))
|
|
|
|
|
, m_panelShowAni(new QVariantAnimation(this))
|
|
|
|
|
, m_panelHideAni(new QVariantAnimation(this))
|
|
|
|
|
, m_xcbMisc(XcbMisc::instance())
|
|
|
|
|
, m_dbusDaemonInterface(QDBusConnection::sessionBus().interface())
|
|
|
|
|
, m_sniWatcher(new StatusNotifierWatcher(SNI_WATCHER_SERVICE, SNI_WATCHER_PATH, QDBusConnection::sessionBus(), this))
|
|
|
|
|
, m_dragWidget(new DragWidget(this))
|
2020-06-18 21:12:01 +08:00
|
|
|
|
, m_primaryScreenChanged(false)
|
2016-06-02 09:46:43 +08:00
|
|
|
|
{
|
2020-05-06 17:28:16 +08:00
|
|
|
|
setAccessibleName("mainwindow");
|
2020-03-13 12:59:02 +08:00
|
|
|
|
m_mainPanel->setAccessibleName("mainpanel");
|
2016-06-03 16:06:11 +08:00
|
|
|
|
setAttribute(Qt::WA_TranslucentBackground);
|
2018-10-31 11:34:25 +08:00
|
|
|
|
setMouseTracking(true);
|
2017-07-04 14:34:38 +08:00
|
|
|
|
setAcceptDrops(true);
|
2016-06-03 16:06:11 +08:00
|
|
|
|
|
2018-03-15 11:14:24 +08:00
|
|
|
|
DPlatformWindowHandle::enableDXcbForWindow(this, true);
|
2019-08-23 16:18:21 +08:00
|
|
|
|
m_platformWindowHandle.setEnableBlurWindow(true);
|
2017-03-27 15:36:37 +08:00
|
|
|
|
m_platformWindowHandle.setTranslucentBackground(true);
|
|
|
|
|
m_platformWindowHandle.setWindowRadius(0);
|
2019-09-12 19:14:31 +08:00
|
|
|
|
m_platformWindowHandle.setShadowOffset(QPoint(0, 5));
|
|
|
|
|
m_platformWindowHandle.setShadowColor(QColor(0, 0, 0, 0.3 * 255));
|
2017-03-21 15:40:52 +08:00
|
|
|
|
|
2018-07-30 15:12:51 +08:00
|
|
|
|
m_settings = &DockSettings::Instance();
|
2016-06-15 11:09:34 +08:00
|
|
|
|
m_xcbMisc->set_window_type(winId(), XcbMisc::Dock);
|
2019-08-26 16:15:50 +08:00
|
|
|
|
m_size = m_settings->m_mainWindowSize;
|
2019-08-30 11:41:52 +08:00
|
|
|
|
m_mainPanel->setDisplayMode(m_settings->displayMode());
|
2019-01-15 19:54:13 +08:00
|
|
|
|
initSNIHost();
|
2016-06-06 10:59:29 +08:00
|
|
|
|
initComponents();
|
|
|
|
|
initConnections();
|
2016-06-23 10:24:51 +08:00
|
|
|
|
|
2019-08-26 16:15:50 +08:00
|
|
|
|
resizeMainPanelWindow();
|
2019-08-19 13:40:06 +08:00
|
|
|
|
|
2019-08-29 20:21:36 +08:00
|
|
|
|
m_mainPanel->setDelegate(this);
|
2019-08-19 13:40:06 +08:00
|
|
|
|
for (auto item : DockItemManager::instance()->itemList())
|
2019-08-19 15:17:56 +08:00
|
|
|
|
m_mainPanel->insertItem(-1, item);
|
2019-09-05 11:19:11 +08:00
|
|
|
|
|
|
|
|
|
m_dragWidget->setMouseTracking(true);
|
|
|
|
|
m_dragWidget->setFocusPolicy(Qt::NoFocus);
|
|
|
|
|
|
2020-06-10 21:24:38 +08:00
|
|
|
|
m_dockPosition = m_settings->position();
|
2019-09-25 14:09:02 +08:00
|
|
|
|
|
2020-06-10 21:24:38 +08:00
|
|
|
|
if ((Top == m_dockPosition) || (Bottom == m_dockPosition)) {
|
2019-09-05 11:19:11 +08:00
|
|
|
|
m_dragWidget->setCursor(Qt::SizeVerCursor);
|
|
|
|
|
} else {
|
|
|
|
|
m_dragWidget->setCursor(Qt::SizeHorCursor);
|
|
|
|
|
}
|
2019-09-25 14:09:02 +08:00
|
|
|
|
|
|
|
|
|
connect(m_panelShowAni, &QVariantAnimation::valueChanged, [ this ](const QVariant & value) {
|
2019-10-12 10:38:54 +08:00
|
|
|
|
if (m_panelShowAni->state() != QPropertyAnimation::Running)
|
|
|
|
|
return;
|
2019-09-25 14:09:02 +08:00
|
|
|
|
// dock的宽度或高度值
|
|
|
|
|
int val = value.toInt();
|
|
|
|
|
// 当前dock尺寸
|
2020-06-10 21:24:38 +08:00
|
|
|
|
const QRect windowRect = m_settings->windowRect(m_dockPosition, false);
|
2019-09-25 14:09:02 +08:00
|
|
|
|
|
2020-06-10 21:24:38 +08:00
|
|
|
|
switch (m_dockPosition) {
|
2020-07-28 13:46:30 +08:00
|
|
|
|
case Dock::Top:
|
|
|
|
|
m_mainPanel->move(0, val - windowRect.height());
|
|
|
|
|
QWidget::move(windowRect.topLeft());
|
|
|
|
|
break;
|
|
|
|
|
case Dock::Bottom:
|
|
|
|
|
m_mainPanel->move(0, 0);
|
|
|
|
|
QWidget::move(windowRect.left(), windowRect.bottom() - val);
|
|
|
|
|
break;
|
|
|
|
|
case Dock::Left:
|
|
|
|
|
m_mainPanel->move(val - windowRect.width(), 0);
|
|
|
|
|
QWidget::move(windowRect.topLeft());
|
|
|
|
|
break;
|
|
|
|
|
case Dock::Right:
|
|
|
|
|
m_mainPanel->move(0, 0);
|
|
|
|
|
QWidget::move(windowRect.right() - val, windowRect.top());
|
|
|
|
|
break;
|
2019-09-25 14:09:02 +08:00
|
|
|
|
}
|
|
|
|
|
|
2020-06-10 21:24:38 +08:00
|
|
|
|
if (m_dockPosition == Dock::Top || m_dockPosition == Dock::Bottom) {
|
2019-09-25 14:09:02 +08:00
|
|
|
|
QWidget::setFixedHeight(val);
|
|
|
|
|
} else {
|
|
|
|
|
QWidget::setFixedWidth(val);
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
connect(m_panelHideAni, &QVariantAnimation::valueChanged, [ this ](const QVariant & value) {
|
2019-10-12 10:38:54 +08:00
|
|
|
|
if (m_panelHideAni->state() != QPropertyAnimation::Running)
|
|
|
|
|
return;
|
|
|
|
|
|
2019-09-25 14:09:02 +08:00
|
|
|
|
// dock的宽度或高度
|
|
|
|
|
int val = value.toInt();
|
|
|
|
|
// dock隐藏后的rect
|
2020-06-16 17:55:02 +08:00
|
|
|
|
const QRect windowRect = m_settings->windowRect(m_dockPosition, false, true);
|
2020-01-02 13:42:22 +08:00
|
|
|
|
const int margin = m_settings->dockMargin();
|
2020-06-18 21:12:01 +08:00
|
|
|
|
switch (m_dockPosition) {
|
2020-07-28 13:46:30 +08:00
|
|
|
|
case Dock::Top:
|
|
|
|
|
m_mainPanel->move(0, val - windowRect.height());
|
|
|
|
|
QWidget::move(windowRect.left(), windowRect.top() - margin);
|
|
|
|
|
break;
|
|
|
|
|
case Dock::Bottom:
|
|
|
|
|
m_mainPanel->move(0, 0);
|
|
|
|
|
QWidget::move(windowRect.left(), windowRect.bottom() - val + margin);
|
|
|
|
|
break;
|
|
|
|
|
case Dock::Left:
|
|
|
|
|
m_mainPanel->move(val - windowRect.width(), 0);
|
|
|
|
|
QWidget::move(windowRect.left() - margin, windowRect.top());
|
|
|
|
|
break;
|
|
|
|
|
case Dock::Right:
|
|
|
|
|
m_mainPanel->move(0, 0);
|
|
|
|
|
QWidget::move(windowRect.right() - val + margin, windowRect.top());
|
|
|
|
|
break;
|
2019-09-25 14:09:02 +08:00
|
|
|
|
}
|
2020-06-22 18:15:39 +08:00
|
|
|
|
|
2020-06-10 21:24:38 +08:00
|
|
|
|
if (m_dockPosition == Dock::Top || m_dockPosition == Dock::Bottom) {
|
2019-09-25 14:09:02 +08:00
|
|
|
|
QWidget::setFixedHeight(val);
|
|
|
|
|
} else {
|
|
|
|
|
QWidget::setFixedWidth(val);
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
2020-06-18 21:12:01 +08:00
|
|
|
|
connect(m_panelShowAni, &QVariantAnimation::finished, [ this ]() {
|
|
|
|
|
const QRect windowRect = m_settings->windowRect(m_dockPosition);
|
|
|
|
|
QWidget::setFixedSize(windowRect.size());
|
2020-06-22 18:15:39 +08:00
|
|
|
|
QWidget::move(windowRect.topLeft());
|
2020-06-18 21:12:01 +08:00
|
|
|
|
m_mainPanel->move(QPoint(0, 0));
|
|
|
|
|
qDebug() << "Show animation finished:" << frameGeometry();
|
|
|
|
|
qDebug() << "Show animation finished not frame:" << geometry();
|
2020-06-26 12:06:04 +08:00
|
|
|
|
QWidget::update();
|
2020-06-18 21:12:01 +08:00
|
|
|
|
});
|
2019-09-25 14:09:02 +08:00
|
|
|
|
|
|
|
|
|
connect(m_panelHideAni, &QVariantAnimation::finished, [ this ]() {
|
2020-06-18 21:12:01 +08:00
|
|
|
|
// 动画完成更新dock位置
|
|
|
|
|
m_dockPosition = m_settings->position();
|
|
|
|
|
// 动画完成更新dock设置
|
|
|
|
|
m_settings->posChangedUpdateSettings();
|
2020-06-15 16:38:30 +08:00
|
|
|
|
|
|
|
|
|
const QRect windowRect = m_settings->windowRect(m_dockPosition, true);
|
|
|
|
|
QWidget::setFixedSize(windowRect.size());
|
2020-06-22 18:15:39 +08:00
|
|
|
|
QWidget::move(windowRect.topLeft());
|
2020-06-18 21:12:01 +08:00
|
|
|
|
m_mainPanel->move(QPoint(0, 0));
|
|
|
|
|
|
|
|
|
|
qDebug() << "Hide animation finished" << frameGeometry();
|
2020-06-22 18:15:39 +08:00
|
|
|
|
qDebug() << "Hide animation finished not frame:" << geometry();
|
2020-06-26 12:06:04 +08:00
|
|
|
|
QWidget::update();
|
2019-09-25 14:09:02 +08:00
|
|
|
|
});
|
2020-02-12 17:32:46 +08:00
|
|
|
|
|
|
|
|
|
updateRegionMonitorWatch();
|
2016-06-02 09:46:43 +08:00
|
|
|
|
}
|
2016-06-02 15:43:57 +08:00
|
|
|
|
|
2016-06-15 11:09:34 +08:00
|
|
|
|
MainWindow::~MainWindow()
|
|
|
|
|
{
|
|
|
|
|
delete m_xcbMisc;
|
|
|
|
|
}
|
|
|
|
|
|
2017-12-05 13:08:17 +08:00
|
|
|
|
void MainWindow::launch()
|
|
|
|
|
{
|
2020-07-28 13:46:30 +08:00
|
|
|
|
m_launched = true;
|
|
|
|
|
qApp->processEvents();
|
|
|
|
|
QWidget::move(m_settings->windowRect(m_dockPosition).topLeft());
|
|
|
|
|
setVisible(true);
|
|
|
|
|
updatePanelVisible();
|
|
|
|
|
resetPanelEnvironment();
|
|
|
|
|
// 用于更新mainwindow圆角
|
|
|
|
|
m_shadowMaskOptimizeTimer->start();
|
2017-12-05 13:08:17 +08:00
|
|
|
|
}
|
|
|
|
|
|
2017-12-11 12:02:54 +08:00
|
|
|
|
bool MainWindow::event(QEvent *e)
|
|
|
|
|
{
|
2020-06-22 18:15:39 +08:00
|
|
|
|
// switch (e->type()) {
|
|
|
|
|
// case QEvent::Move:
|
|
|
|
|
// if (!e->spontaneous())
|
|
|
|
|
// QTimer::singleShot(100, this, &MainWindow::positionCheck);
|
|
|
|
|
// break;
|
|
|
|
|
// default:;
|
|
|
|
|
// }
|
2017-12-11 12:02:54 +08:00
|
|
|
|
|
|
|
|
|
return QWidget::event(e);
|
|
|
|
|
}
|
|
|
|
|
|
2018-02-01 14:23:53 +08:00
|
|
|
|
void MainWindow::showEvent(QShowEvent *e)
|
|
|
|
|
{
|
|
|
|
|
QWidget::showEvent(e);
|
|
|
|
|
|
2020-06-22 18:15:39 +08:00
|
|
|
|
// connect(qGuiApp, &QGuiApplication::primaryScreenChanged,
|
|
|
|
|
// windowHandle(), [this](QScreen * new_screen) {
|
|
|
|
|
// QScreen *old_screen = windowHandle()->screen();
|
|
|
|
|
// windowHandle()->setScreen(new_screen);
|
|
|
|
|
// // 屏幕变化后可能导致控件缩放比变化,此时应该重设控件位置大小
|
|
|
|
|
// // 比如:窗口大小为 100 x 100, 显示在缩放比为 1.0 的屏幕上,此时窗口的真实大小 = 100x100
|
|
|
|
|
// // 随后窗口被移动到了缩放比为 2.0 的屏幕上,应该将真实大小改为 200x200。另外,只能使用
|
|
|
|
|
// // QPlatformWindow直接设置大小来绕过QWidget和QWindow对新旧geometry的比较。
|
|
|
|
|
// const qreal scale = devicePixelRatioF();
|
|
|
|
|
// const QPoint screenPos = new_screen->geometry().topLeft();
|
|
|
|
|
// const QPoint posInScreen = this->pos() - old_screen->geometry().topLeft();
|
|
|
|
|
// const QPoint pos = screenPos + posInScreen * scale;
|
|
|
|
|
// const QSize size = this->size() * scale;
|
|
|
|
|
// windowHandle()->handle()->setGeometry(QRect(pos, size));
|
|
|
|
|
// }, Qt::UniqueConnection);
|
|
|
|
|
|
|
|
|
|
// windowHandle()->setScreen(qGuiApp->primaryScreen());
|
2018-02-01 14:23:53 +08:00
|
|
|
|
}
|
|
|
|
|
|
2016-06-21 14:02:51 +08:00
|
|
|
|
void MainWindow::mousePressEvent(QMouseEvent *e)
|
|
|
|
|
{
|
|
|
|
|
e->ignore();
|
2020-01-19 18:21:26 +08:00
|
|
|
|
if (e->button() == Qt::RightButton && m_settings->m_menuVisible) {
|
2016-06-21 14:02:51 +08:00
|
|
|
|
m_settings->showDockSettingsMenu();
|
2019-08-30 15:54:19 +08:00
|
|
|
|
return;
|
|
|
|
|
}
|
2016-06-21 14:02:51 +08:00
|
|
|
|
}
|
|
|
|
|
|
2016-06-03 16:06:11 +08:00
|
|
|
|
void MainWindow::keyPressEvent(QKeyEvent *e)
|
|
|
|
|
{
|
2019-08-19 13:40:06 +08:00
|
|
|
|
switch (e->key()) {
|
2016-06-03 16:06:11 +08:00
|
|
|
|
#ifdef QT_DEBUG
|
|
|
|
|
case Qt::Key_Escape: qApp->quit(); break;
|
|
|
|
|
#endif
|
|
|
|
|
default:;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2016-06-29 16:53:37 +08:00
|
|
|
|
void MainWindow::enterEvent(QEvent *e)
|
|
|
|
|
{
|
|
|
|
|
QWidget::enterEvent(e);
|
|
|
|
|
|
2019-10-25 11:12:27 +08:00
|
|
|
|
if (QApplication::overrideCursor() && QApplication::overrideCursor()->shape() != Qt::ArrowCursor)
|
|
|
|
|
QApplication::restoreOverrideCursor();
|
2016-06-29 16:53:37 +08:00
|
|
|
|
}
|
|
|
|
|
|
2020-01-21 15:17:38 +08:00
|
|
|
|
void MainWindow::mouseMoveEvent(QMouseEvent *e)
|
|
|
|
|
{
|
|
|
|
|
//重写mouseMoveEvent 解决bug12866 leaveEvent事件失效
|
|
|
|
|
}
|
|
|
|
|
|
2016-06-29 16:53:37 +08:00
|
|
|
|
void MainWindow::leaveEvent(QEvent *e)
|
|
|
|
|
{
|
|
|
|
|
QWidget::leaveEvent(e);
|
2019-09-16 09:21:48 +08:00
|
|
|
|
if (m_panelHideAni->state() == QPropertyAnimation::Running)
|
|
|
|
|
return;
|
|
|
|
|
|
2016-08-18 16:06:40 +08:00
|
|
|
|
m_expandDelayTimer->stop();
|
2018-01-02 16:48:01 +08:00
|
|
|
|
m_leaveDelayTimer->start();
|
2016-06-29 16:53:37 +08:00
|
|
|
|
}
|
|
|
|
|
|
2017-07-04 14:34:38 +08:00
|
|
|
|
void MainWindow::dragEnterEvent(QDragEnterEvent *e)
|
|
|
|
|
{
|
|
|
|
|
QWidget::dragEnterEvent(e);
|
|
|
|
|
|
2018-11-05 11:26:20 +08:00
|
|
|
|
if (m_settings->hideState() != Show) {
|
2017-07-04 14:34:38 +08:00
|
|
|
|
m_expandDelayTimer->start();
|
2018-11-05 11:26:20 +08:00
|
|
|
|
}
|
2017-07-04 14:34:38 +08:00
|
|
|
|
}
|
|
|
|
|
|
2019-01-15 19:54:13 +08:00
|
|
|
|
void MainWindow::initSNIHost()
|
|
|
|
|
{
|
|
|
|
|
// registor dock as SNI Host on dbus
|
|
|
|
|
QDBusConnection dbusConn = QDBusConnection::sessionBus();
|
|
|
|
|
m_sniHostService = QString("org.kde.StatusNotifierHost-") + QString::number(qApp->applicationPid());
|
|
|
|
|
dbusConn.registerService(m_sniHostService);
|
|
|
|
|
dbusConn.registerObject("/StatusNotifierHost", this);
|
|
|
|
|
|
|
|
|
|
if (m_sniWatcher->isValid()) {
|
|
|
|
|
m_sniWatcher->RegisterStatusNotifierHost(m_sniHostService);
|
|
|
|
|
} else {
|
|
|
|
|
qDebug() << SNI_WATCHER_SERVICE << "SNI watcher daemon is not exist for now!";
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2016-06-06 10:59:29 +08:00
|
|
|
|
void MainWindow::initComponents()
|
|
|
|
|
{
|
|
|
|
|
m_positionUpdateTimer->setSingleShot(true);
|
2016-06-30 18:02:09 +08:00
|
|
|
|
m_positionUpdateTimer->setInterval(20);
|
2016-06-06 10:59:29 +08:00
|
|
|
|
m_positionUpdateTimer->start();
|
2016-06-23 20:05:03 +08:00
|
|
|
|
|
2016-08-18 16:06:40 +08:00
|
|
|
|
m_expandDelayTimer->setSingleShot(true);
|
2016-09-06 11:31:03 +08:00
|
|
|
|
m_expandDelayTimer->setInterval(m_settings->expandTimeout());
|
2016-08-18 16:06:40 +08:00
|
|
|
|
|
2018-01-02 16:48:01 +08:00
|
|
|
|
m_leaveDelayTimer->setSingleShot(true);
|
|
|
|
|
m_leaveDelayTimer->setInterval(m_settings->narrowTimeout());
|
|
|
|
|
|
2017-12-05 13:08:17 +08:00
|
|
|
|
m_shadowMaskOptimizeTimer->setSingleShot(true);
|
|
|
|
|
m_shadowMaskOptimizeTimer->setInterval(100);
|
|
|
|
|
|
2016-06-30 19:32:52 +08:00
|
|
|
|
m_panelShowAni->setEasingCurve(QEasingCurve::InOutCubic);
|
|
|
|
|
m_panelHideAni->setEasingCurve(QEasingCurve::InOutCubic);
|
2017-05-22 10:38:49 +08:00
|
|
|
|
|
|
|
|
|
QTimer::singleShot(1, this, &MainWindow::compositeChanged);
|
2019-10-10 17:21:04 +08:00
|
|
|
|
|
|
|
|
|
themeTypeChanged(DGuiApplicationHelper::instance()->themeType());
|
2017-05-22 10:38:49 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void MainWindow::compositeChanged()
|
|
|
|
|
{
|
2018-01-12 14:32:57 +08:00
|
|
|
|
const bool composite = m_wmHelper->hasComposite();
|
2019-09-16 09:21:48 +08:00
|
|
|
|
setComposite(composite);
|
2019-06-25 15:13:44 +08:00
|
|
|
|
|
2020-06-21 17:51:23 +08:00
|
|
|
|
// NOTE(justforlxz): On the sw platform, there is an unstable
|
|
|
|
|
// display position error, disable animation solution
|
2019-06-25 15:13:44 +08:00
|
|
|
|
#ifndef DISABLE_SHOW_ANIMATION
|
2018-01-12 14:32:57 +08:00
|
|
|
|
const int duration = composite ? 300 : 0;
|
2019-06-25 15:13:44 +08:00
|
|
|
|
#else
|
|
|
|
|
const int duration = 0;
|
|
|
|
|
#endif
|
2017-05-22 10:38:49 +08:00
|
|
|
|
|
2020-06-22 18:15:39 +08:00
|
|
|
|
m_panelHideAni->setDuration(duration);
|
2019-09-25 14:09:02 +08:00
|
|
|
|
m_panelShowAni->setDuration(duration);
|
2018-11-15 17:06:51 +08:00
|
|
|
|
|
2018-01-12 14:32:57 +08:00
|
|
|
|
m_shadowMaskOptimizeTimer->start();
|
2016-06-06 10:59:29 +08:00
|
|
|
|
}
|
|
|
|
|
|
2017-11-23 12:21:00 +08:00
|
|
|
|
void MainWindow::internalMove(const QPoint &p)
|
2017-11-13 21:17:56 +08:00
|
|
|
|
{
|
2018-10-31 11:34:25 +08:00
|
|
|
|
const bool isHide = m_settings->hideState() == HideState::Hide && !testAttribute(Qt::WA_UnderMouse);
|
2017-11-23 17:49:37 +08:00
|
|
|
|
const bool pos_adjust = m_settings->hideMode() != HideMode::KeepShowing &&
|
2019-08-19 13:40:06 +08:00
|
|
|
|
isHide &&
|
2019-09-16 09:21:48 +08:00
|
|
|
|
m_panelShowAni->state() == QVariantAnimation::Stopped;
|
|
|
|
|
if (!pos_adjust) {
|
2019-09-25 14:09:02 +08:00
|
|
|
|
m_mainPanel->move(0, 0);
|
2017-11-23 17:49:37 +08:00
|
|
|
|
return QWidget::move(p);
|
2019-09-16 09:21:48 +08:00
|
|
|
|
}
|
2017-11-13 21:17:56 +08:00
|
|
|
|
}
|
|
|
|
|
|
2016-06-06 10:59:29 +08:00
|
|
|
|
void MainWindow::initConnections()
|
|
|
|
|
{
|
2020-06-21 17:51:23 +08:00
|
|
|
|
connect(m_settings, &DockSettings::primaryScreenChanged, [&]() {
|
2020-06-18 21:12:01 +08:00
|
|
|
|
m_primaryScreenChanged = true;
|
|
|
|
|
updatePosition();
|
|
|
|
|
m_primaryScreenChanged = false;
|
|
|
|
|
});
|
2017-12-11 12:02:54 +08:00
|
|
|
|
connect(m_settings, &DockSettings::positionChanged, this, &MainWindow::positionChanged);
|
2018-11-09 14:45:57 +08:00
|
|
|
|
connect(m_settings, &DockSettings::autoHideChanged, m_leaveDelayTimer, static_cast<void (QTimer::*)()>(&QTimer::start));
|
2018-11-22 16:50:22 +08:00
|
|
|
|
connect(m_settings, &DockSettings::windowGeometryChanged, this, &MainWindow::updateGeometry, Qt::DirectConnection);
|
2020-02-12 17:32:46 +08:00
|
|
|
|
connect(m_settings, &DockSettings::trayCountChanged, this, &MainWindow::getTrayVisableItemCount, Qt::DirectConnection);
|
2016-06-29 18:30:25 +08:00
|
|
|
|
connect(m_settings, &DockSettings::windowHideModeChanged, this, &MainWindow::setStrutPartial, Qt::QueuedConnection);
|
2020-06-10 21:24:38 +08:00
|
|
|
|
connect(m_settings, &DockSettings::windowHideModeChanged, [this] { resetPanelEnvironment(); });
|
2018-11-09 14:45:57 +08:00
|
|
|
|
connect(m_settings, &DockSettings::windowHideModeChanged, m_leaveDelayTimer, static_cast<void (QTimer::*)()>(&QTimer::start));
|
2017-02-07 00:18:00 +08:00
|
|
|
|
connect(m_settings, &DockSettings::windowVisibleChanged, this, &MainWindow::updatePanelVisible, Qt::QueuedConnection);
|
2018-03-06 14:30:23 +08:00
|
|
|
|
connect(m_settings, &DockSettings::displayModeChanegd, m_positionUpdateTimer, static_cast<void (QTimer::*)()>(&QTimer::start));
|
2019-08-22 13:52:02 +08:00
|
|
|
|
connect(&DockSettings::Instance(), &DockSettings::opacityChanged, this, &MainWindow::setMaskAlpha);
|
2019-08-28 11:37:19 +08:00
|
|
|
|
connect(m_settings, &DockSettings::displayModeChanegd, this, &MainWindow::updateDisplayMode, Qt::QueuedConnection);
|
2016-06-30 15:32:18 +08:00
|
|
|
|
|
2016-06-29 18:30:25 +08:00
|
|
|
|
connect(m_positionUpdateTimer, &QTimer::timeout, this, &MainWindow::updatePosition, Qt::QueuedConnection);
|
2016-08-18 16:06:40 +08:00
|
|
|
|
connect(m_expandDelayTimer, &QTimer::timeout, this, &MainWindow::expand, Qt::QueuedConnection);
|
2018-01-02 16:48:01 +08:00
|
|
|
|
connect(m_leaveDelayTimer, &QTimer::timeout, this, &MainWindow::updatePanelVisible, Qt::QueuedConnection);
|
2017-12-14 15:25:54 +08:00
|
|
|
|
connect(m_shadowMaskOptimizeTimer, &QTimer::timeout, this, &MainWindow::adjustShadowMask, Qt::QueuedConnection);
|
2016-06-30 09:37:13 +08:00
|
|
|
|
|
2017-12-14 15:25:54 +08:00
|
|
|
|
connect(m_panelHideAni, &QPropertyAnimation::finished, m_shadowMaskOptimizeTimer, static_cast<void (QTimer::*)()>(&QTimer::start));
|
|
|
|
|
connect(m_panelShowAni, &QPropertyAnimation::finished, m_shadowMaskOptimizeTimer, static_cast<void (QTimer::*)()>(&QTimer::start));
|
2020-06-16 17:22:13 +08:00
|
|
|
|
connect(m_panelHideAni, &QPropertyAnimation::finished, this, &MainWindow::panelGeometryChanged);
|
|
|
|
|
connect(m_panelShowAni, &QPropertyAnimation::finished, this, &MainWindow::panelGeometryChanged);
|
2016-10-14 15:47:43 +08:00
|
|
|
|
|
2017-11-13 21:17:56 +08:00
|
|
|
|
connect(m_wmHelper, &DWindowManagerHelper::hasCompositeChanged, this, &MainWindow::compositeChanged, Qt::QueuedConnection);
|
2017-12-14 15:25:54 +08:00
|
|
|
|
connect(&m_platformWindowHandle, &DPlatformWindowHandle::frameMarginsChanged, m_shadowMaskOptimizeTimer, static_cast<void (QTimer::*)()>(&QTimer::start));
|
2019-01-15 19:54:13 +08:00
|
|
|
|
|
2020-06-29 14:25:59 +08:00
|
|
|
|
if (m_dbusDaemonInterface && m_dbusDaemonInterface->isValid())
|
|
|
|
|
connect(m_dbusDaemonInterface, &QDBusConnectionInterface::serviceOwnerChanged, this, &MainWindow::onDbusNameOwnerChanged);
|
2019-08-19 13:40:06 +08:00
|
|
|
|
|
2019-08-19 15:17:56 +08:00
|
|
|
|
connect(DockItemManager::instance(), &DockItemManager::itemInserted, m_mainPanel, &MainPanelControl::insertItem, Qt::DirectConnection);
|
|
|
|
|
connect(DockItemManager::instance(), &DockItemManager::itemRemoved, m_mainPanel, &MainPanelControl::removeItem, Qt::DirectConnection);
|
2019-09-06 14:44:07 +08:00
|
|
|
|
connect(DockItemManager::instance(), &DockItemManager::itemUpdated, m_mainPanel, &MainPanelControl::itemUpdated, Qt::DirectConnection);
|
2019-08-21 14:07:24 +08:00
|
|
|
|
connect(DockItemManager::instance(), &DockItemManager::requestRefershWindowVisible, this, &MainWindow::updatePanelVisible, Qt::QueuedConnection);
|
|
|
|
|
connect(DockItemManager::instance(), &DockItemManager::requestWindowAutoHide, m_settings, &DockSettings::setAutoHide);
|
2019-08-21 12:52:53 +08:00
|
|
|
|
connect(m_mainPanel, &MainPanelControl::itemMoved, DockItemManager::instance(), &DockItemManager::itemMoved, Qt::DirectConnection);
|
2019-08-29 20:21:36 +08:00
|
|
|
|
connect(m_mainPanel, &MainPanelControl::itemAdded, DockItemManager::instance(), &DockItemManager::itemAdded, Qt::DirectConnection);
|
2019-09-05 11:19:11 +08:00
|
|
|
|
connect(m_dragWidget, &DragWidget::dragPointOffset, this, &MainWindow::onMainWindowSizeChanged);
|
|
|
|
|
connect(m_dragWidget, &DragWidget::dragFinished, this, &MainWindow::onDragFinished);
|
2019-10-10 17:21:04 +08:00
|
|
|
|
connect(DGuiApplicationHelper::instance(), &DGuiApplicationHelper::themeTypeChanged, this, &MainWindow::themeTypeChanged);
|
2020-06-05 16:16:59 +08:00
|
|
|
|
connect(m_eventInter, &XEventMonitor::CursorMove, this, &MainWindow::onRegionMonitorChanged);
|
2020-06-21 17:51:23 +08:00
|
|
|
|
connect(m_settings, &DockSettings::requestUpdateRegionWatch, this, &MainWindow::updateRegionMonitorWatch);
|
2017-06-08 15:38:11 +08:00
|
|
|
|
}
|
|
|
|
|
|
2020-06-13 19:19:30 +08:00
|
|
|
|
//const QPoint MainWindow::x11GetWindowPos()
|
|
|
|
|
//{
|
|
|
|
|
// const auto disp = QX11Info::display();
|
2017-06-08 15:38:11 +08:00
|
|
|
|
|
2020-06-13 19:19:30 +08:00
|
|
|
|
// unsigned int unused;
|
|
|
|
|
// int x;
|
|
|
|
|
// int y;
|
|
|
|
|
// Window unused_window;
|
2017-06-08 15:38:11 +08:00
|
|
|
|
|
2020-06-13 19:19:30 +08:00
|
|
|
|
// XGetGeometry(disp, winId(), &unused_window, &x, &y, &unused, &unused, &unused, &unused);
|
|
|
|
|
// XFlush(disp);
|
2017-06-08 15:38:11 +08:00
|
|
|
|
|
2020-06-13 19:19:30 +08:00
|
|
|
|
// return QPoint(x, y);
|
|
|
|
|
//}
|
2017-06-08 15:38:11 +08:00
|
|
|
|
|
2020-06-13 19:19:30 +08:00
|
|
|
|
//void MainWindow::x11MoveWindow(const int x, const int y)
|
|
|
|
|
//{
|
|
|
|
|
// const auto disp = QX11Info::display();
|
2017-06-08 15:38:11 +08:00
|
|
|
|
|
2020-06-13 19:19:30 +08:00
|
|
|
|
// XMoveWindow(disp, winId(), x, y);
|
|
|
|
|
// XFlush(disp);
|
|
|
|
|
//}
|
2017-06-08 15:38:11 +08:00
|
|
|
|
|
2020-06-13 19:19:30 +08:00
|
|
|
|
//void MainWindow::x11MoveResizeWindow(const int x, const int y, const int w, const int h)
|
|
|
|
|
//{
|
|
|
|
|
// const auto disp = QX11Info::display();
|
2016-10-14 15:47:43 +08:00
|
|
|
|
|
2020-06-13 19:19:30 +08:00
|
|
|
|
// XMoveResizeWindow(disp, winId(), x, y, w, h);
|
|
|
|
|
// XFlush(disp);
|
|
|
|
|
//}
|
2016-06-06 10:59:29 +08:00
|
|
|
|
|
2020-06-10 21:24:38 +08:00
|
|
|
|
void MainWindow::positionChanged()
|
2016-08-12 14:28:35 +08:00
|
|
|
|
{
|
|
|
|
|
// paly hide animation and disable other animation
|
2020-06-18 21:12:01 +08:00
|
|
|
|
qDebug() << "start positionChange:" << frameGeometry();
|
2016-08-12 14:28:35 +08:00
|
|
|
|
clearStrutPartial();
|
|
|
|
|
|
2020-06-20 01:03:26 +08:00
|
|
|
|
// 需要在narrow之前执行,保证动画结束后能后更新界面布局的方向
|
2020-06-10 21:24:38 +08:00
|
|
|
|
connect(m_panelHideAni, &QVariantAnimation::finished, this, &MainWindow::newPositionExpand);
|
2020-06-20 01:03:26 +08:00
|
|
|
|
|
2020-06-21 17:51:23 +08:00
|
|
|
|
narrow();
|
2016-08-12 14:28:35 +08:00
|
|
|
|
}
|
|
|
|
|
|
2016-06-03 16:06:11 +08:00
|
|
|
|
void MainWindow::updatePosition()
|
|
|
|
|
{
|
2016-06-22 10:28:47 +08:00
|
|
|
|
// all update operation need pass by timer
|
2020-06-21 17:51:23 +08:00
|
|
|
|
// Q_ASSERT(sender() == m_positionUpdateTimer);
|
2016-06-16 16:56:21 +08:00
|
|
|
|
|
2019-09-16 09:21:48 +08:00
|
|
|
|
//clearStrutPartial();
|
2016-06-22 10:28:47 +08:00
|
|
|
|
updateGeometry();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void MainWindow::updateGeometry()
|
|
|
|
|
{
|
2018-11-19 17:40:29 +08:00
|
|
|
|
// DockDisplayMode and DockPosition MUST be set before invoke setFixedSize method of MainPanel
|
2020-04-30 15:12:25 +08:00
|
|
|
|
|
|
|
|
|
//为了防止当后端发送错误值,然后发送正确值时,任务栏没有移动在相应的位置
|
|
|
|
|
//当qt没有获取到屏幕资源时候,move函数会失效。可以直接return
|
2020-06-05 16:16:59 +08:00
|
|
|
|
if (m_settings->primaryRect().width() == 0 || m_settings->primaryRect().height() == 0) {
|
2020-04-30 15:12:25 +08:00
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
2019-09-25 14:09:02 +08:00
|
|
|
|
setStrutPartial();
|
|
|
|
|
|
2019-09-10 15:58:41 +08:00
|
|
|
|
m_mainPanel->setDisplayMode(m_settings->displayMode());
|
2020-06-10 21:24:38 +08:00
|
|
|
|
m_mainPanel->setPositonValue(m_dockPosition);
|
2019-09-25 14:09:02 +08:00
|
|
|
|
|
|
|
|
|
bool isHide = m_settings->hideState() == Hide && !testAttribute(Qt::WA_UnderMouse);
|
2018-10-31 18:03:56 +08:00
|
|
|
|
|
2020-06-10 21:24:38 +08:00
|
|
|
|
const QRect windowRect = m_settings->windowRect(m_dockPosition, isHide);
|
2017-12-11 12:02:54 +08:00
|
|
|
|
|
2019-09-16 09:21:48 +08:00
|
|
|
|
internalMove(windowRect.topLeft());
|
2017-11-13 21:17:56 +08:00
|
|
|
|
|
2020-06-18 21:12:01 +08:00
|
|
|
|
if (!m_primaryScreenChanged || m_settings->hideState() != Hide) {
|
|
|
|
|
QWidget::move(windowRect.topLeft());
|
|
|
|
|
QWidget::setFixedSize(m_settings->m_mainWindowSize);
|
|
|
|
|
}
|
2019-08-30 10:41:39 +08:00
|
|
|
|
|
2019-09-25 14:09:02 +08:00
|
|
|
|
resizeMainPanelWindow();
|
2019-09-19 14:43:08 +08:00
|
|
|
|
|
2016-06-30 09:37:13 +08:00
|
|
|
|
m_mainPanel->update();
|
2020-02-12 17:32:46 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void MainWindow::getTrayVisableItemCount()
|
|
|
|
|
{
|
2020-06-05 16:16:59 +08:00
|
|
|
|
m_mainPanel->getTrayVisableItemCount();
|
2016-06-15 11:09:34 +08:00
|
|
|
|
}
|
|
|
|
|
|
2020-06-10 21:24:38 +08:00
|
|
|
|
void MainWindow::newPositionExpand()
|
|
|
|
|
{
|
|
|
|
|
// set strut
|
|
|
|
|
setStrutPartial();
|
|
|
|
|
|
|
|
|
|
// reset to right environment when animation finished
|
|
|
|
|
m_mainPanel->setPositonValue(m_dockPosition);
|
|
|
|
|
resetPanelEnvironment();
|
|
|
|
|
|
|
|
|
|
if ((Top == m_dockPosition) || (Bottom == m_dockPosition)) {
|
|
|
|
|
m_dragWidget->setCursor(Qt::SizeVerCursor);
|
|
|
|
|
} else {
|
|
|
|
|
m_dragWidget->setCursor(Qt::SizeHorCursor);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
disconnect(m_panelHideAni, &QVariantAnimation::finished, this, &MainWindow::newPositionExpand);
|
2020-06-20 00:06:01 +08:00
|
|
|
|
|
|
|
|
|
updatePanelVisible();
|
2020-06-10 21:24:38 +08:00
|
|
|
|
}
|
|
|
|
|
|
2016-06-15 11:09:34 +08:00
|
|
|
|
void MainWindow::clearStrutPartial()
|
|
|
|
|
{
|
|
|
|
|
m_xcbMisc->clear_strut_partial(winId());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void MainWindow::setStrutPartial()
|
|
|
|
|
{
|
2016-06-15 11:20:05 +08:00
|
|
|
|
// first, clear old strut partial
|
|
|
|
|
clearStrutPartial();
|
|
|
|
|
|
2017-07-14 14:05:35 +08:00
|
|
|
|
// reset env
|
2019-09-16 09:21:48 +08:00
|
|
|
|
//resetPanelEnvironment(true);
|
2017-07-14 14:05:35 +08:00
|
|
|
|
|
2016-06-29 16:53:37 +08:00
|
|
|
|
if (m_settings->hideMode() != Dock::KeepShowing)
|
|
|
|
|
return;
|
|
|
|
|
|
2017-11-14 14:20:04 +08:00
|
|
|
|
const auto ratio = devicePixelRatioF();
|
|
|
|
|
const int maxScreenHeight = m_settings->screenRawHeight();
|
|
|
|
|
const int maxScreenWidth = m_settings->screenRawWidth();
|
2020-06-10 21:24:38 +08:00
|
|
|
|
const QPoint &p = rawXPosition(m_settings->windowRect(m_dockPosition).topLeft());
|
2017-11-28 14:27:16 +08:00
|
|
|
|
const QSize &s = m_settings->windowSize();
|
2020-06-05 16:16:59 +08:00
|
|
|
|
const QRect &primaryRawRect = m_settings->currentRawRect();
|
2016-06-15 11:09:34 +08:00
|
|
|
|
|
2016-06-29 16:53:37 +08:00
|
|
|
|
XcbMisc::Orientation orientation = XcbMisc::OrientationTop;
|
|
|
|
|
uint strut = 0;
|
|
|
|
|
uint strutStart = 0;
|
|
|
|
|
uint strutEnd = 0;
|
2016-06-15 11:09:34 +08:00
|
|
|
|
|
2017-02-28 11:31:48 +08:00
|
|
|
|
QRect strutArea(0, 0, maxScreenWidth, maxScreenHeight);
|
2020-06-10 21:24:38 +08:00
|
|
|
|
switch (m_dockPosition) {
|
2016-06-21 10:12:43 +08:00
|
|
|
|
case Position::Top:
|
2016-06-15 11:09:34 +08:00
|
|
|
|
orientation = XcbMisc::OrientationTop;
|
2017-11-14 14:20:04 +08:00
|
|
|
|
strut = p.y() + s.height() * ratio;
|
|
|
|
|
strutStart = p.x();
|
2017-11-28 14:27:16 +08:00
|
|
|
|
strutEnd = qMin(qRound(p.x() + s.width() * ratio), primaryRawRect.right());
|
2017-02-28 11:31:48 +08:00
|
|
|
|
strutArea.setLeft(strutStart);
|
|
|
|
|
strutArea.setRight(strutEnd);
|
2017-11-14 14:20:04 +08:00
|
|
|
|
strutArea.setBottom(strut);
|
2016-06-15 11:09:34 +08:00
|
|
|
|
break;
|
2016-06-21 10:12:43 +08:00
|
|
|
|
case Position::Bottom:
|
2016-06-15 11:09:34 +08:00
|
|
|
|
orientation = XcbMisc::OrientationBottom;
|
|
|
|
|
strut = maxScreenHeight - p.y();
|
2017-11-14 14:20:04 +08:00
|
|
|
|
strutStart = p.x();
|
2017-11-28 14:27:16 +08:00
|
|
|
|
strutEnd = qMin(qRound(p.x() + s.width() * ratio), primaryRawRect.right());
|
2017-02-28 11:31:48 +08:00
|
|
|
|
strutArea.setLeft(strutStart);
|
|
|
|
|
strutArea.setRight(strutEnd);
|
|
|
|
|
strutArea.setTop(p.y());
|
2016-06-15 11:09:34 +08:00
|
|
|
|
break;
|
2016-06-21 10:12:43 +08:00
|
|
|
|
case Position::Left:
|
2016-06-15 11:09:34 +08:00
|
|
|
|
orientation = XcbMisc::OrientationLeft;
|
2017-11-14 14:20:04 +08:00
|
|
|
|
strut = p.x() + s.width() * ratio;
|
|
|
|
|
strutStart = p.y();
|
2017-11-28 14:27:16 +08:00
|
|
|
|
strutEnd = qMin(qRound(p.y() + s.height() * ratio), primaryRawRect.bottom());
|
2017-11-14 14:20:04 +08:00
|
|
|
|
strutArea.setTop(strutStart);
|
|
|
|
|
strutArea.setBottom(strutEnd);
|
|
|
|
|
strutArea.setRight(strut);
|
2016-06-15 11:09:34 +08:00
|
|
|
|
break;
|
2016-06-21 10:12:43 +08:00
|
|
|
|
case Position::Right:
|
2016-06-15 11:09:34 +08:00
|
|
|
|
orientation = XcbMisc::OrientationRight;
|
2017-11-14 14:20:04 +08:00
|
|
|
|
strut = maxScreenWidth - p.x();
|
|
|
|
|
strutStart = p.y();
|
2017-11-28 14:27:16 +08:00
|
|
|
|
strutEnd = qMin(qRound(p.y() + s.height() * ratio), primaryRawRect.bottom());
|
2017-11-14 14:20:04 +08:00
|
|
|
|
strutArea.setTop(strutStart);
|
|
|
|
|
strutArea.setBottom(strutEnd);
|
|
|
|
|
strutArea.setLeft(p.x());
|
2016-06-15 11:09:34 +08:00
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
Q_ASSERT(false);
|
|
|
|
|
}
|
2017-02-28 11:31:48 +08:00
|
|
|
|
|
|
|
|
|
// pass if strut area is intersect with other screen
|
2020-05-14 13:16:37 +08:00
|
|
|
|
//优化了文件管理的代码 会导致bug 15351 需要注释一下代码
|
|
|
|
|
// int count = 0;
|
2020-05-21 17:20:39 +08:00
|
|
|
|
// const QRect pr = m_settings->currentRawRect();
|
2020-05-14 13:16:37 +08:00
|
|
|
|
// for (auto *screen : qApp->screens()) {
|
|
|
|
|
// const QRect sr = screen->geometry();
|
|
|
|
|
// if (sr == pr)
|
|
|
|
|
// continue;
|
|
|
|
|
|
|
|
|
|
// if (sr.intersects(strutArea))
|
|
|
|
|
// ++count;
|
|
|
|
|
// }
|
|
|
|
|
// if (count > 0) {
|
|
|
|
|
// qWarning() << "strutArea is intersects with another screen.";
|
2020-06-10 21:24:38 +08:00
|
|
|
|
// qWarning() << maxScreenHeight << maxScreenWidth << m_dockPosition << p << s;
|
2020-05-14 13:16:37 +08:00
|
|
|
|
// return;
|
|
|
|
|
// }
|
2017-02-28 11:31:48 +08:00
|
|
|
|
|
2019-09-15 14:59:14 +08:00
|
|
|
|
m_xcbMisc->set_strut_partial(winId(), orientation, strut + m_settings->dockMargin() * ratio, strutStart, strutEnd);
|
2016-06-03 16:06:11 +08:00
|
|
|
|
}
|
2016-06-29 16:53:37 +08:00
|
|
|
|
|
|
|
|
|
void MainWindow::expand()
|
|
|
|
|
{
|
2020-06-22 18:15:39 +08:00
|
|
|
|
qDebug() << "expand started";
|
2020-06-05 16:16:59 +08:00
|
|
|
|
if (m_panelHideAni->state() == QPropertyAnimation::Running) {
|
2020-05-09 10:06:58 +08:00
|
|
|
|
m_panelHideAni->stop();
|
2020-05-10 00:07:03 +08:00
|
|
|
|
emit m_panelHideAni->finished();
|
2020-05-10 00:04:38 +08:00
|
|
|
|
}
|
2019-09-16 09:21:48 +08:00
|
|
|
|
|
2018-01-02 16:48:01 +08:00
|
|
|
|
const auto showAniState = m_panelShowAni->state();
|
|
|
|
|
|
2020-06-10 21:24:38 +08:00
|
|
|
|
int startValue = 0;
|
|
|
|
|
int endValue = 0;
|
2016-06-29 18:30:25 +08:00
|
|
|
|
|
2020-06-10 21:24:38 +08:00
|
|
|
|
resetPanelEnvironment();
|
|
|
|
|
if (showAniState != QPropertyAnimation::Running && pos() != m_panelShowAni->currentValue()) {
|
|
|
|
|
const QRect windowRect = m_settings->windowRect(m_dockPosition);
|
2020-06-13 19:19:30 +08:00
|
|
|
|
|
|
|
|
|
startValue = (m_dockPosition == Top || m_dockPosition == Bottom) ? height() : width();
|
|
|
|
|
endValue = (m_dockPosition == Top || m_dockPosition == Bottom) ? windowRect.height() : windowRect.width();
|
2017-11-13 21:17:56 +08:00
|
|
|
|
|
2020-06-18 21:12:01 +08:00
|
|
|
|
qDebug() << "expand " << "start value:" << startValue
|
|
|
|
|
<< "end value:" << endValue;
|
|
|
|
|
|
2019-09-25 14:09:02 +08:00
|
|
|
|
if (startValue > DOCK_MAX_SIZE || endValue > DOCK_MAX_SIZE) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
2020-06-21 17:51:23 +08:00
|
|
|
|
if (startValue > endValue)
|
2019-09-25 14:09:02 +08:00
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
m_panelShowAni->setStartValue(startValue);
|
|
|
|
|
m_panelShowAni->setEndValue(endValue);
|
2018-01-02 16:48:01 +08:00
|
|
|
|
m_panelShowAni->start();
|
2020-06-22 18:15:39 +08:00
|
|
|
|
qDebug() << "show ani start";
|
2018-01-04 16:56:25 +08:00
|
|
|
|
m_shadowMaskOptimizeTimer->start();
|
2020-06-18 21:12:01 +08:00
|
|
|
|
m_settings->posChangedUpdateSettings();
|
2016-06-29 16:53:37 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2020-06-10 21:24:38 +08:00
|
|
|
|
void MainWindow::narrow()
|
2016-06-29 16:53:37 +08:00
|
|
|
|
{
|
2020-06-22 18:15:39 +08:00
|
|
|
|
qDebug() << "narrow started";
|
2020-06-21 17:51:23 +08:00
|
|
|
|
int startValue = (m_dockPosition == Top || m_dockPosition == Bottom) ? height() : width();
|
2016-06-29 16:53:37 +08:00
|
|
|
|
|
2020-06-18 21:12:01 +08:00
|
|
|
|
qDebug() << "narrow " << "start value:" << startValue;
|
2016-06-29 16:53:37 +08:00
|
|
|
|
m_panelShowAni->stop();
|
2019-09-25 14:09:02 +08:00
|
|
|
|
m_panelHideAni->setStartValue(startValue);
|
2020-06-13 19:19:30 +08:00
|
|
|
|
m_panelHideAni->setEndValue(0);
|
2016-06-29 16:53:37 +08:00
|
|
|
|
m_panelHideAni->start();
|
|
|
|
|
}
|
|
|
|
|
|
2020-06-10 21:24:38 +08:00
|
|
|
|
void MainWindow::resetPanelEnvironment()
|
2016-06-30 18:02:09 +08:00
|
|
|
|
{
|
2017-12-05 13:08:17 +08:00
|
|
|
|
if (!m_launched)
|
|
|
|
|
return;
|
|
|
|
|
|
2019-08-26 16:15:50 +08:00
|
|
|
|
resizeMainPanelWindow();
|
2020-02-12 17:32:46 +08:00
|
|
|
|
updateRegionMonitorWatch();
|
2019-12-02 10:17:21 +08:00
|
|
|
|
if (m_size != m_settings->m_mainWindowSize) {
|
|
|
|
|
m_size = m_settings->m_mainWindowSize;
|
|
|
|
|
setStrutPartial();
|
|
|
|
|
}
|
2016-06-30 18:02:09 +08:00
|
|
|
|
}
|
|
|
|
|
|
2016-06-29 16:53:37 +08:00
|
|
|
|
void MainWindow::updatePanelVisible()
|
|
|
|
|
{
|
2019-08-23 16:18:21 +08:00
|
|
|
|
if (m_settings->hideMode() == KeepShowing) {
|
2020-06-05 16:16:59 +08:00
|
|
|
|
if (!m_registerKey.isEmpty()) {
|
|
|
|
|
m_eventInter->UnregisterArea(m_registerKey);
|
2020-06-20 00:06:01 +08:00
|
|
|
|
qDebug() << "register area clear";
|
2020-06-28 14:53:49 +08:00
|
|
|
|
//清空registerKey
|
|
|
|
|
m_registerKey.clear();
|
2020-04-28 09:23:38 +08:00
|
|
|
|
}
|
2017-01-12 18:38:06 +08:00
|
|
|
|
return expand();
|
2019-08-23 16:18:21 +08:00
|
|
|
|
}
|
2016-06-30 11:15:06 +08:00
|
|
|
|
|
2020-06-05 16:16:59 +08:00
|
|
|
|
if (m_registerKey.isEmpty()) {
|
|
|
|
|
updateRegionMonitorWatch();
|
2020-04-28 09:23:38 +08:00
|
|
|
|
}
|
|
|
|
|
|
2016-06-29 16:53:37 +08:00
|
|
|
|
const Dock::HideState state = m_settings->hideState();
|
|
|
|
|
|
2020-06-10 21:24:38 +08:00
|
|
|
|
if (state == Hide && m_settings->autoHide()) {
|
2019-08-23 16:18:21 +08:00
|
|
|
|
QRectF r(pos(), size());
|
2019-08-23 16:58:13 +08:00
|
|
|
|
const int margin = m_settings->dockMargin();
|
2020-06-10 21:24:38 +08:00
|
|
|
|
switch (m_dockPosition) {
|
2019-08-23 16:18:21 +08:00
|
|
|
|
case Dock::Top:
|
|
|
|
|
r.setY(r.y() - margin);
|
|
|
|
|
break;
|
|
|
|
|
case Dock::Bottom:
|
|
|
|
|
r.setHeight(r.height() + margin);
|
|
|
|
|
break;
|
|
|
|
|
case Dock::Left:
|
|
|
|
|
r.setX(r.x() - margin);
|
2016-06-30 14:44:55 +08:00
|
|
|
|
break;
|
2019-08-23 16:18:21 +08:00
|
|
|
|
case Dock::Right:
|
|
|
|
|
r.setWidth(r.width() + margin);
|
2019-09-16 09:21:48 +08:00
|
|
|
|
break;
|
2019-08-23 16:18:21 +08:00
|
|
|
|
}
|
2020-06-10 21:24:38 +08:00
|
|
|
|
if (!r.contains(QCursor::pos())) {
|
2020-06-18 21:12:01 +08:00
|
|
|
|
qDebug() << "hide narrow";
|
2020-06-10 21:24:38 +08:00
|
|
|
|
return narrow();
|
2019-08-23 16:18:21 +08:00
|
|
|
|
}
|
2020-06-10 21:24:38 +08:00
|
|
|
|
}
|
2016-06-30 14:44:55 +08:00
|
|
|
|
|
|
|
|
|
return expand();
|
2016-06-29 16:53:37 +08:00
|
|
|
|
}
|
2017-03-21 15:40:52 +08:00
|
|
|
|
|
|
|
|
|
void MainWindow::adjustShadowMask()
|
|
|
|
|
{
|
2017-12-05 13:08:17 +08:00
|
|
|
|
if (!m_launched)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
if (m_shadowMaskOptimizeTimer->isActive())
|
|
|
|
|
return;
|
|
|
|
|
|
2018-01-04 16:56:25 +08:00
|
|
|
|
const bool composite = m_wmHelper->hasComposite();
|
2018-01-04 17:22:37 +08:00
|
|
|
|
const bool isFasion = m_settings->displayMode() == Fashion;
|
2018-01-04 16:56:25 +08:00
|
|
|
|
|
2019-09-03 09:36:33 +08:00
|
|
|
|
DStyleHelper dstyle(style());
|
|
|
|
|
const int radius = dstyle.pixelMetric(DStyle::PM_TopLevelWindowRadius);
|
|
|
|
|
m_platformWindowHandle.setWindowRadius(composite && isFasion ? radius : 0);
|
2017-03-21 15:40:52 +08:00
|
|
|
|
}
|
2017-12-11 12:02:54 +08:00
|
|
|
|
|
|
|
|
|
void MainWindow::positionCheck()
|
|
|
|
|
{
|
|
|
|
|
if (m_positionUpdateTimer->isActive())
|
|
|
|
|
return;
|
|
|
|
|
|
2017-12-29 15:54:46 +08:00
|
|
|
|
const QPoint scaledFrontPos = scaledPos(m_settings->frontendWindowRect().topLeft());
|
|
|
|
|
|
|
|
|
|
if (QPoint(pos() - scaledFrontPos).manhattanLength() < 2)
|
2017-12-13 13:07:39 +08:00
|
|
|
|
return;
|
|
|
|
|
|
2018-07-23 14:49:01 +08:00
|
|
|
|
// this may cause some position error and animation caton
|
2020-06-22 18:15:39 +08:00
|
|
|
|
// internalMove();
|
2017-12-11 12:02:54 +08:00
|
|
|
|
}
|
2019-01-15 19:54:13 +08:00
|
|
|
|
|
|
|
|
|
void MainWindow::onDbusNameOwnerChanged(const QString &name, const QString &oldOwner, const QString &newOwner)
|
|
|
|
|
{
|
|
|
|
|
Q_UNUSED(oldOwner);
|
|
|
|
|
|
|
|
|
|
if (name == SNI_WATCHER_SERVICE && !newOwner.isEmpty()) {
|
|
|
|
|
qDebug() << SNI_WATCHER_SERVICE << "SNI watcher daemon started, register dock to watcher as SNI Host";
|
|
|
|
|
m_sniWatcher->RegisterStatusNotifierHost(m_sniHostService);
|
|
|
|
|
}
|
|
|
|
|
}
|
2019-08-22 13:52:02 +08:00
|
|
|
|
|
|
|
|
|
void MainWindow::setEffectEnabled(const bool enabled)
|
|
|
|
|
{
|
2019-09-17 13:15:53 +08:00
|
|
|
|
setMaskColor(AutoColor);
|
2019-08-22 13:52:02 +08:00
|
|
|
|
|
|
|
|
|
setMaskAlpha(DockSettings::Instance().Opacity());
|
2019-09-19 19:59:03 +08:00
|
|
|
|
|
|
|
|
|
m_platformWindowHandle.setBorderWidth(enabled ? 1 : 0);
|
2019-08-22 13:52:02 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void MainWindow::setComposite(const bool hasComposite)
|
|
|
|
|
{
|
|
|
|
|
setEffectEnabled(hasComposite);
|
|
|
|
|
}
|
2019-08-26 16:15:50 +08:00
|
|
|
|
|
2019-08-29 20:21:36 +08:00
|
|
|
|
bool MainWindow::appIsOnDock(const QString &appDesktop)
|
|
|
|
|
{
|
|
|
|
|
return DockItemManager::instance()->appIsOnDock(appDesktop);
|
|
|
|
|
}
|
|
|
|
|
|
2019-08-26 16:15:50 +08:00
|
|
|
|
void MainWindow::resizeMainWindow()
|
|
|
|
|
{
|
|
|
|
|
QSize size = m_settings->windowSize();
|
2020-06-10 21:24:38 +08:00
|
|
|
|
const QRect windowRect = m_settings->windowRect(m_dockPosition, false);
|
2019-08-26 16:15:50 +08:00
|
|
|
|
internalMove(windowRect.topLeft());
|
2019-09-05 11:19:11 +08:00
|
|
|
|
resizeMainPanelWindow();
|
2019-08-26 16:15:50 +08:00
|
|
|
|
QWidget::setFixedSize(size);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void MainWindow::resizeMainPanelWindow()
|
|
|
|
|
{
|
2020-02-17 12:52:54 +08:00
|
|
|
|
m_mainPanel->setFixedSize(m_settings->m_mainWindowSize);
|
2019-09-25 14:09:02 +08:00
|
|
|
|
|
2020-06-10 21:24:38 +08:00
|
|
|
|
switch (m_dockPosition) {
|
2019-08-26 16:15:50 +08:00
|
|
|
|
case Dock::Top:
|
2019-09-25 14:09:02 +08:00
|
|
|
|
m_dragWidget->setGeometry(0, height() - DRAG_AREA_SIZE, width(), DRAG_AREA_SIZE);
|
2019-09-05 11:19:11 +08:00
|
|
|
|
break;
|
2019-08-26 16:15:50 +08:00
|
|
|
|
case Dock::Bottom:
|
2019-09-25 14:09:02 +08:00
|
|
|
|
m_dragWidget->setGeometry(0, 0, width(), DRAG_AREA_SIZE);
|
2019-08-26 16:15:50 +08:00
|
|
|
|
break;
|
|
|
|
|
case Dock::Left:
|
2019-09-25 14:09:02 +08:00
|
|
|
|
m_dragWidget->setGeometry(width() - DRAG_AREA_SIZE, 0, DRAG_AREA_SIZE, height());
|
2019-09-05 11:19:11 +08:00
|
|
|
|
break;
|
2019-08-26 16:15:50 +08:00
|
|
|
|
case Dock::Right:
|
2019-09-25 14:09:02 +08:00
|
|
|
|
m_dragWidget->setGeometry(0, 0, DRAG_AREA_SIZE, height());
|
2019-08-26 16:15:50 +08:00
|
|
|
|
break;
|
2020-06-21 17:51:23 +08:00
|
|
|
|
Q_UNREACHABLE();
|
2019-08-26 16:15:50 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
2019-08-28 11:37:19 +08:00
|
|
|
|
|
|
|
|
|
void MainWindow::updateDisplayMode()
|
|
|
|
|
{
|
2019-08-30 11:41:52 +08:00
|
|
|
|
m_mainPanel->setDisplayMode(m_settings->displayMode());
|
2019-09-16 09:21:48 +08:00
|
|
|
|
setStrutPartial();
|
2020-01-02 15:23:45 +08:00
|
|
|
|
adjustShadowMask();
|
2020-02-12 17:32:46 +08:00
|
|
|
|
updateRegionMonitorWatch();
|
2019-08-28 11:37:19 +08:00
|
|
|
|
}
|
2019-09-05 11:19:11 +08:00
|
|
|
|
|
|
|
|
|
void MainWindow::onMainWindowSizeChanged(QPoint offset)
|
|
|
|
|
{
|
2020-06-10 21:24:38 +08:00
|
|
|
|
if (Dock::Top == m_dockPosition) {
|
2019-09-05 11:19:11 +08:00
|
|
|
|
m_settings->m_mainWindowSize.setHeight(qBound(MAINWINDOW_MIN_SIZE, m_size.height() + offset.y(), MAINWINDOW_MAX_SIZE));
|
|
|
|
|
m_settings->m_mainWindowSize.setWidth(width());
|
2020-06-10 21:24:38 +08:00
|
|
|
|
} else if (Dock::Bottom == m_dockPosition) {
|
2019-09-05 11:19:11 +08:00
|
|
|
|
m_settings->m_mainWindowSize.setHeight(qBound(MAINWINDOW_MIN_SIZE, m_size.height() - offset.y(), MAINWINDOW_MAX_SIZE));
|
|
|
|
|
m_settings->m_mainWindowSize.setWidth(width());
|
2020-06-10 21:24:38 +08:00
|
|
|
|
} else if (Dock::Left == m_dockPosition) {
|
2019-09-05 11:19:11 +08:00
|
|
|
|
m_settings->m_mainWindowSize.setHeight(height());
|
|
|
|
|
m_settings->m_mainWindowSize.setWidth(qBound(MAINWINDOW_MIN_SIZE, m_size.width() + offset.x(), MAINWINDOW_MAX_SIZE));
|
|
|
|
|
} else {
|
|
|
|
|
m_settings->m_mainWindowSize.setHeight(height());
|
|
|
|
|
m_settings->m_mainWindowSize.setWidth(qBound(MAINWINDOW_MIN_SIZE, m_size.width() - offset.x(), MAINWINDOW_MAX_SIZE));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
resizeMainWindow();
|
2019-09-20 17:42:02 +08:00
|
|
|
|
m_settings->updateFrontendGeometry();
|
2019-09-05 11:19:11 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void MainWindow::onDragFinished()
|
|
|
|
|
{
|
|
|
|
|
if (m_size == m_settings->m_mainWindowSize)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
m_size = m_settings->m_mainWindowSize;
|
2019-11-15 13:39:50 +08:00
|
|
|
|
|
|
|
|
|
if (m_settings->displayMode() == Fashion) {
|
2020-06-10 21:24:38 +08:00
|
|
|
|
if (Dock::Top == m_dockPosition || Dock::Bottom == m_dockPosition) {
|
2019-11-15 13:39:50 +08:00
|
|
|
|
m_settings->m_dockInter->setWindowSizeFashion(m_settings->m_mainWindowSize.height());
|
2019-11-15 14:18:05 +08:00
|
|
|
|
m_settings->m_dockInter->setWindowSize(m_settings->m_mainWindowSize.height());
|
2019-11-15 13:39:50 +08:00
|
|
|
|
} else {
|
|
|
|
|
m_settings->m_dockInter->setWindowSizeFashion(m_settings->m_mainWindowSize.width());
|
2019-11-15 14:18:05 +08:00
|
|
|
|
m_settings->m_dockInter->setWindowSize(m_settings->m_mainWindowSize.width());
|
2019-11-15 13:39:50 +08:00
|
|
|
|
}
|
2019-09-05 11:19:11 +08:00
|
|
|
|
} else {
|
2020-06-10 21:24:38 +08:00
|
|
|
|
if (Dock::Top == m_dockPosition || Dock::Bottom == m_dockPosition) {
|
2019-11-15 13:39:50 +08:00
|
|
|
|
m_settings->m_dockInter->setWindowSizeEfficient(m_settings->m_mainWindowSize.height());
|
2019-11-15 14:18:05 +08:00
|
|
|
|
m_settings->m_dockInter->setWindowSize(m_settings->m_mainWindowSize.height());
|
2019-11-15 13:39:50 +08:00
|
|
|
|
} else {
|
|
|
|
|
m_settings->m_dockInter->setWindowSizeEfficient(m_settings->m_mainWindowSize.width());
|
2019-11-15 14:18:05 +08:00
|
|
|
|
m_settings->m_dockInter->setWindowSize(m_settings->m_mainWindowSize.width());
|
2019-11-15 13:39:50 +08:00
|
|
|
|
}
|
2019-09-05 11:19:11 +08:00
|
|
|
|
}
|
|
|
|
|
|
2019-11-15 13:39:50 +08:00
|
|
|
|
|
2019-09-05 11:19:11 +08:00
|
|
|
|
setStrutPartial();
|
|
|
|
|
}
|
|
|
|
|
|
2019-10-10 17:21:04 +08:00
|
|
|
|
void MainWindow::themeTypeChanged(DGuiApplicationHelper::ColorType themeType)
|
|
|
|
|
{
|
|
|
|
|
if (m_wmHelper->hasComposite()) {
|
|
|
|
|
|
|
|
|
|
if (themeType == DGuiApplicationHelper::DarkType)
|
|
|
|
|
m_platformWindowHandle.setBorderColor(QColor(0, 0, 0, 255 * 0.3));
|
|
|
|
|
else
|
|
|
|
|
m_platformWindowHandle.setBorderColor(QColor(QColor::Invalid));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2020-06-05 16:16:59 +08:00
|
|
|
|
void MainWindow::onRegionMonitorChanged(int x, int y, const QString &key)
|
2020-02-12 17:32:46 +08:00
|
|
|
|
{
|
2020-05-28 20:45:02 +08:00
|
|
|
|
if (m_registerKey != key)
|
2020-02-12 17:32:46 +08:00
|
|
|
|
return;
|
|
|
|
|
|
2020-06-21 17:51:23 +08:00
|
|
|
|
// 同一个坐标,只响应一次
|
|
|
|
|
static QPoint lastPos(0, 0);
|
|
|
|
|
if (lastPos == QPoint(x, y)) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
lastPos = QPoint(x, y);
|
|
|
|
|
|
2020-06-18 21:12:01 +08:00
|
|
|
|
QScreen *screen = Utils::screenAt(QPoint(x, y));
|
|
|
|
|
if (!screen)
|
|
|
|
|
return;
|
2020-06-05 16:16:59 +08:00
|
|
|
|
|
2020-06-22 18:15:39 +08:00
|
|
|
|
QRect screenRect = screen->geometry();
|
|
|
|
|
qDebug() << y << screenRect.y() << screenRect.y() + screenRect.height() / 2;
|
|
|
|
|
switch (m_dockPosition) {
|
|
|
|
|
case Top:
|
|
|
|
|
if (y > screenRect.y() + screenRect.height() / 2)
|
|
|
|
|
return;
|
|
|
|
|
break;
|
|
|
|
|
case Bottom:
|
|
|
|
|
if (y < screenRect.y() + screenRect.height() / 2)
|
|
|
|
|
return;
|
|
|
|
|
break;
|
|
|
|
|
case Left:
|
|
|
|
|
if (x > screenRect.x() + screenRect.width() / 2)
|
|
|
|
|
return;
|
|
|
|
|
break;
|
|
|
|
|
case Right:
|
|
|
|
|
if (x < screenRect.x() + screenRect.width() / 2)
|
|
|
|
|
return;
|
2020-06-21 17:51:23 +08:00
|
|
|
|
}
|
|
|
|
|
|
2020-05-28 20:45:02 +08:00
|
|
|
|
if (screen->name() == m_settings->currentDockScreen()) {
|
|
|
|
|
if (m_settings->hideMode() == KeepShowing)
|
|
|
|
|
return;
|
|
|
|
|
|
2020-06-10 21:24:38 +08:00
|
|
|
|
if (m_panelShowAni->state() == QPropertyAnimation::Running)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
// 一直隐藏模式不用通过时间延迟的方式调用,影响离开动画的响应
|
|
|
|
|
expand();
|
2020-05-28 20:45:02 +08:00
|
|
|
|
} else {
|
|
|
|
|
// 移动Dock至相应屏相应位置
|
2020-07-27 13:50:49 +08:00
|
|
|
|
if (m_launcherInter->IsVisible())//启动器显示,则dock不显示
|
|
|
|
|
return;
|
|
|
|
|
|
2020-06-20 00:06:01 +08:00
|
|
|
|
if (m_settings->setDockScreen(screen->name())) {
|
2020-06-22 18:15:39 +08:00
|
|
|
|
if (m_settings->hideMode() == KeepShowing || m_settings->hideMode() == SmartHide) {
|
|
|
|
|
narrow();
|
|
|
|
|
newPositionExpand();
|
2020-07-28 13:46:30 +08:00
|
|
|
|
} else {
|
2020-06-20 00:06:01 +08:00
|
|
|
|
int screenWidth = screen->size().width();
|
|
|
|
|
int screenHeight = screen->size().height();
|
|
|
|
|
switch (m_dockPosition) {
|
2020-07-28 13:46:30 +08:00
|
|
|
|
case Dock::Top:
|
|
|
|
|
case Dock::Bottom:
|
|
|
|
|
setFixedWidth(screenWidth);
|
|
|
|
|
break;
|
|
|
|
|
case Dock::Left:
|
|
|
|
|
case Dock::Right:
|
|
|
|
|
setFixedHeight(screenHeight);
|
|
|
|
|
break;
|
2020-06-20 00:06:01 +08:00
|
|
|
|
}
|
2020-06-18 21:12:01 +08:00
|
|
|
|
expand();
|
2020-06-20 00:06:01 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
2020-05-28 20:45:02 +08:00
|
|
|
|
}
|
2020-02-12 17:32:46 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void MainWindow::updateRegionMonitorWatch()
|
|
|
|
|
{
|
2020-05-28 20:45:02 +08:00
|
|
|
|
if (!m_registerKey.isEmpty()) {
|
2020-06-22 11:05:00 +08:00
|
|
|
|
bool ret = m_eventInter->UnregisterArea(m_registerKey);
|
|
|
|
|
qDebug() << "register area clear:" << ret;
|
2020-05-28 20:45:02 +08:00
|
|
|
|
m_registerKey.clear();
|
|
|
|
|
}
|
2020-05-28 20:45:02 +08:00
|
|
|
|
|
2020-06-05 16:16:59 +08:00
|
|
|
|
const int flags = Motion | Button | Key;
|
2020-05-28 20:45:02 +08:00
|
|
|
|
|
|
|
|
|
QList<QRect> screensRect = m_settings->monitorsRect();
|
|
|
|
|
QList<MonitRect> monitorAreas;
|
|
|
|
|
|
|
|
|
|
int val = 3;
|
2020-06-05 16:16:59 +08:00
|
|
|
|
int x, y, w, h;
|
|
|
|
|
|
2020-06-21 17:51:23 +08:00
|
|
|
|
auto func = [&](MonitRect & monitRect) {
|
2020-06-18 21:12:01 +08:00
|
|
|
|
monitRect.x1 = x;
|
|
|
|
|
monitRect.y1 = y;
|
|
|
|
|
monitRect.x2 = x + w;
|
|
|
|
|
monitRect.y2 = y + h;
|
2020-05-28 20:45:02 +08:00
|
|
|
|
monitorAreas << monitRect;
|
|
|
|
|
};
|
2020-06-05 16:16:59 +08:00
|
|
|
|
|
2020-05-28 20:45:02 +08:00
|
|
|
|
if (screensRect.size()) {
|
|
|
|
|
MonitRect monitRect;
|
2020-06-10 21:24:38 +08:00
|
|
|
|
switch (m_dockPosition) {
|
2020-05-28 20:45:02 +08:00
|
|
|
|
case Dock::Top: {
|
|
|
|
|
for (QRect rect : screensRect) {
|
|
|
|
|
x = rect.x();
|
|
|
|
|
y = rect.y();
|
|
|
|
|
w = rect.width();
|
|
|
|
|
h = val;
|
|
|
|
|
func(monitRect);
|
|
|
|
|
}
|
|
|
|
|
}
|
2020-06-21 17:51:23 +08:00
|
|
|
|
break;
|
2020-05-28 20:45:02 +08:00
|
|
|
|
case Dock::Bottom: {
|
|
|
|
|
for (QRect rect : screensRect) {
|
|
|
|
|
x = rect.x();
|
|
|
|
|
y = rect.y() + rect.height() - val;
|
|
|
|
|
w = rect.width();
|
|
|
|
|
h = val;
|
|
|
|
|
func(monitRect);
|
|
|
|
|
}
|
|
|
|
|
}
|
2020-06-21 17:51:23 +08:00
|
|
|
|
break;
|
2020-05-28 20:45:02 +08:00
|
|
|
|
case Dock::Left: {
|
|
|
|
|
for (QRect rect : screensRect) {
|
|
|
|
|
x = rect.x();
|
|
|
|
|
y = rect.y();
|
|
|
|
|
w = val;
|
|
|
|
|
h = rect.height();
|
|
|
|
|
func(monitRect);
|
|
|
|
|
}
|
|
|
|
|
}
|
2020-06-21 17:51:23 +08:00
|
|
|
|
break;
|
2020-05-28 20:45:02 +08:00
|
|
|
|
case Dock::Right: {
|
|
|
|
|
for (QRect rect : screensRect) {
|
|
|
|
|
x = rect.x() + rect.width() - val;
|
|
|
|
|
y = rect.y();
|
|
|
|
|
w = val;
|
|
|
|
|
h = rect.height();
|
|
|
|
|
func(monitRect);
|
|
|
|
|
}
|
|
|
|
|
}
|
2020-06-21 17:51:23 +08:00
|
|
|
|
break;
|
2020-05-28 20:45:02 +08:00
|
|
|
|
}
|
2020-06-21 17:51:23 +08:00
|
|
|
|
m_registerKey = m_eventInter->RegisterAreas(monitorAreas, flags);
|
2020-06-20 00:06:01 +08:00
|
|
|
|
qDebug() << "register key" << m_registerKey;
|
2020-05-28 20:45:02 +08:00
|
|
|
|
} else {
|
|
|
|
|
m_registerKey = m_eventInter->RegisterFullScreen();
|
2020-06-20 00:06:01 +08:00
|
|
|
|
qDebug() << "register full screen" << m_registerKey;
|
2020-05-28 20:45:02 +08:00
|
|
|
|
}
|
2020-02-12 17:32:46 +08:00
|
|
|
|
}
|
|
|
|
|
|
2019-09-05 11:19:11 +08:00
|
|
|
|
#include "mainwindow.moc"
|