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"
|
2020-12-16 17:38:41 +08:00
|
|
|
|
#include "mainpanelcontrol.h"
|
|
|
|
|
#include "dockitemmanager.h"
|
|
|
|
|
#include "menuworker.h"
|
2022-06-10 16:18:15 +00:00
|
|
|
|
#include "proxyplugincontroller.h"
|
2016-06-02 09:46:43 +08:00
|
|
|
|
|
2020-05-28 20:45:02 +08:00
|
|
|
|
#include <DStyle>
|
|
|
|
|
#include <DPlatformWindowHandle>
|
2020-10-15 15:32:40 +08:00
|
|
|
|
#include <DSysInfo>
|
|
|
|
|
#include <DPlatformTheme>
|
2020-11-02 12:12:26 +08:00
|
|
|
|
#include <DDBusSender>
|
2020-05-28 20:45:02 +08:00
|
|
|
|
|
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>
|
2021-06-15 18:04:05 +08:00
|
|
|
|
#include <QtConcurrent>
|
2017-11-13 21:17:56 +08:00
|
|
|
|
#include <qpa/qplatformwindow.h>
|
2022-06-29 15:57:04 +00:00
|
|
|
|
#include <QMenu>
|
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
|
|
|
|
|
2021-04-12 16:53:03 +08:00
|
|
|
|
#define DRAG_STATE_PROP "DRAG_STATE"
|
|
|
|
|
|
2019-01-15 19:54:13 +08:00
|
|
|
|
using org::kde::StatusNotifierWatcher;
|
2019-09-05 11:19:11 +08:00
|
|
|
|
|
2020-11-02 12:12:26 +08:00
|
|
|
|
// let startdde know that we've already started.
|
2021-08-25 21:03:30 +08:00
|
|
|
|
void MainWindow::RegisterDdeSession()
|
2020-11-02 12:12:26 +08:00
|
|
|
|
{
|
|
|
|
|
QString envName("DDE_SESSION_PROCESS_COOKIE_ID");
|
|
|
|
|
|
|
|
|
|
QByteArray cookie = qgetenv(envName.toUtf8().data());
|
|
|
|
|
qunsetenv(envName.toUtf8().data());
|
|
|
|
|
|
|
|
|
|
if (!cookie.isEmpty()) {
|
|
|
|
|
QDBusPendingReply<bool> r = DDBusSender()
|
|
|
|
|
.interface("com.deepin.SessionManager")
|
|
|
|
|
.path("/com/deepin/SessionManager")
|
|
|
|
|
.service("com.deepin.SessionManager")
|
|
|
|
|
.method("Register")
|
|
|
|
|
.arg(QString(cookie))
|
|
|
|
|
.call();
|
|
|
|
|
|
|
|
|
|
qDebug() << Q_FUNC_INFO << r.value();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2016-06-02 09:46:43 +08:00
|
|
|
|
MainWindow::MainWindow(QWidget *parent)
|
2020-05-28 20:45:02 +08:00
|
|
|
|
: DBlurEffectWidget(parent)
|
|
|
|
|
, m_mainPanel(new MainPanelControl(this))
|
|
|
|
|
, m_platformWindowHandle(this)
|
|
|
|
|
, m_wmHelper(DWindowManagerHelper::instance())
|
2020-08-05 19:46:15 +08:00
|
|
|
|
, m_multiScreenWorker(new MultiScreenWorker(this, m_wmHelper))
|
|
|
|
|
, m_menuWorker(new MenuWorker(m_multiScreenWorker->dockInter(), this))
|
2020-05-28 20:45:02 +08:00
|
|
|
|
, m_shadowMaskOptimizeTimer(new QTimer(this))
|
|
|
|
|
, m_dbusDaemonInterface(QDBusConnection::sessionBus().interface())
|
|
|
|
|
, m_sniWatcher(new StatusNotifierWatcher(SNI_WATCHER_SERVICE, SNI_WATCHER_PATH, QDBusConnection::sessionBus(), this))
|
|
|
|
|
, m_dragWidget(new DragWidget(this))
|
2020-08-05 19:46:15 +08:00
|
|
|
|
, m_launched(false)
|
2021-04-12 16:53:03 +08:00
|
|
|
|
, m_updateDragAreaTimer(new QTimer(this))
|
2016-06-02 09:46:43 +08:00
|
|
|
|
{
|
2016-06-03 16:06:11 +08:00
|
|
|
|
setAttribute(Qt::WA_TranslucentBackground);
|
2020-10-28 16:06:01 +08:00
|
|
|
|
setAttribute(Qt::WA_X11DoNotAcceptFocus);
|
2020-10-30 14:37:40 +08:00
|
|
|
|
|
2021-11-05 21:29:32 +08:00
|
|
|
|
Qt::WindowFlags flags = Qt::WindowStaysOnTopHint | Qt::FramelessWindowHint | Qt::Window;
|
2021-03-18 11:19:07 +08:00
|
|
|
|
//1 确保这两行代码的先后顺序,否则会导致任务栏界面不再置顶
|
2021-11-05 21:29:32 +08:00
|
|
|
|
setWindowFlags(windowFlags() | flags | Qt::WindowDoesNotAcceptFocus);
|
|
|
|
|
|
2022-01-08 15:29:02 +08:00
|
|
|
|
if (Utils::IS_WAYLAND_DISPLAY)
|
|
|
|
|
setWindowFlag(Qt::FramelessWindowHint, false); // 会导致设置圆角为0时无效
|
|
|
|
|
|
2021-11-05 21:29:32 +08:00
|
|
|
|
if (DGuiApplicationHelper::isXWindowPlatform()) {
|
|
|
|
|
const auto display = QX11Info::display();
|
|
|
|
|
if (!display) {
|
|
|
|
|
qWarning() << "QX11Info::display() is " << display;
|
|
|
|
|
} else {
|
|
|
|
|
//2 确保这两行代码的先后顺序,否则会导致任务栏界面不再置顶
|
|
|
|
|
XcbMisc::instance()->set_window_type(xcb_window_t(this->winId()), XcbMisc::Dock);
|
|
|
|
|
}
|
2021-03-18 11:19:07 +08:00
|
|
|
|
}
|
2020-10-28 16:06:01 +08:00
|
|
|
|
|
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);
|
2022-06-01 15:11:45 +08:00
|
|
|
|
m_platformWindowHandle.setShadowOffset(QPoint(0, 0));
|
|
|
|
|
m_platformWindowHandle.setShadowColor(Qt::transparent);
|
2017-03-21 15:40:52 +08:00
|
|
|
|
|
2020-08-05 19:46:15 +08:00
|
|
|
|
m_mainPanel->setDisplayMode(m_multiScreenWorker->displayMode());
|
|
|
|
|
|
2021-04-12 16:53:03 +08:00
|
|
|
|
initMember();
|
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
|
|
|
|
|
2020-08-05 19:46:15 +08:00
|
|
|
|
resetDragWindow();
|
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);
|
|
|
|
|
|
2021-11-05 21:29:32 +08:00
|
|
|
|
if (!Utils::IS_WAYLAND_DISPLAY) {
|
|
|
|
|
if ((Top == m_multiScreenWorker->position()) || (Bottom == m_multiScreenWorker->position())) {
|
|
|
|
|
m_dragWidget->setCursor(Qt::SizeVerCursor);
|
|
|
|
|
} else {
|
|
|
|
|
m_dragWidget->setCursor(Qt::SizeHorCursor);
|
|
|
|
|
}
|
2019-09-05 11:19:11 +08:00
|
|
|
|
}
|
2016-06-02 09:46:43 +08:00
|
|
|
|
}
|
2016-06-02 15:43:57 +08:00
|
|
|
|
|
2021-04-13 15:02:45 +08:00
|
|
|
|
/**
|
|
|
|
|
* @brief MainWindow::launch
|
|
|
|
|
* 任务栏初次启动时调用此方法,里面是做了一些初始化操作
|
|
|
|
|
*/
|
2017-12-05 13:08:17 +08:00
|
|
|
|
void MainWindow::launch()
|
|
|
|
|
{
|
2020-10-13 15:35:11 +08:00
|
|
|
|
if (!qApp->property("CANSHOW").toBool())
|
|
|
|
|
return;
|
|
|
|
|
|
2020-08-06 20:34:02 +08:00
|
|
|
|
m_launched = true;
|
|
|
|
|
m_multiScreenWorker->initShow();
|
|
|
|
|
m_shadowMaskOptimizeTimer->start();
|
2021-12-31 17:27:09 +08:00
|
|
|
|
QTimer::singleShot(0, this, [ this ] { this->setVisible(true); });
|
2017-12-05 13:08:17 +08:00
|
|
|
|
}
|
|
|
|
|
|
2021-04-13 15:02:45 +08:00
|
|
|
|
/**
|
|
|
|
|
* @brief MainWindow::callShow
|
|
|
|
|
* 此方法是被外部进程通过DBus调用的。
|
|
|
|
|
* @note 当任务栏以-r参数启动时,其不会显示界面,需要在外部通过DBus调用此接口之后才会显示界面,
|
|
|
|
|
* 这里是以前为了优化任务栏的启动速度做的处理,当任务栏启动时,此时窗管进程可能还未启动完全,
|
|
|
|
|
* 部分设置未初始化完等,导致任务栏显示的界面异常,所以留下此接口,被startdde延后调用
|
|
|
|
|
*/
|
2020-10-13 15:35:11 +08:00
|
|
|
|
void MainWindow::callShow()
|
|
|
|
|
{
|
|
|
|
|
static bool flag = false;
|
|
|
|
|
if (flag) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
flag = true;
|
|
|
|
|
|
|
|
|
|
qApp->setProperty("CANSHOW", true);
|
|
|
|
|
|
|
|
|
|
launch();
|
2020-11-02 12:12:26 +08:00
|
|
|
|
|
|
|
|
|
// 预留200ms提供给窗口初始化再通知startdde,不影响启动速度
|
2021-08-25 21:03:30 +08:00
|
|
|
|
QTimer::singleShot(200, this, &MainWindow::RegisterDdeSession);
|
2020-10-13 15:35:11 +08:00
|
|
|
|
}
|
|
|
|
|
|
2021-04-13 15:02:45 +08:00
|
|
|
|
/**
|
|
|
|
|
* @brief MainWindow::relaodPlugins
|
|
|
|
|
* 需要重新加载插件时,此接口会被调用,目前是用于任务栏的安全模式退出时调用
|
|
|
|
|
*/
|
2022-06-10 16:18:15 +00:00
|
|
|
|
void MainWindow::reloadPlugins()
|
2021-01-21 15:31:25 +08:00
|
|
|
|
{
|
|
|
|
|
if (qApp->property("PLUGINSLOADED").toBool()) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
2022-06-10 16:18:15 +00:00
|
|
|
|
// 发送事件,通知代理来加载插件
|
|
|
|
|
PluginLoadEvent event;
|
|
|
|
|
QCoreApplication::sendEvent(qApp, &event);
|
|
|
|
|
|
2021-01-21 15:31:25 +08:00
|
|
|
|
qApp->setProperty("PLUGINSLOADED", true);
|
2022-06-10 16:18:15 +00:00
|
|
|
|
// 退出安全模式
|
|
|
|
|
qApp->setProperty("safeMode", false);
|
2021-01-21 15:31:25 +08:00
|
|
|
|
}
|
|
|
|
|
|
2021-05-13 11:39:46 +08:00
|
|
|
|
/**
|
|
|
|
|
* @brief MainWindow::mousePressEvent
|
|
|
|
|
* @param e
|
|
|
|
|
* @note 右键显示任务栏的菜单
|
|
|
|
|
*/
|
2016-06-21 14:02:51 +08:00
|
|
|
|
void MainWindow::mousePressEvent(QMouseEvent *e)
|
|
|
|
|
{
|
|
|
|
|
e->ignore();
|
2022-08-01 14:44:03 +08:00
|
|
|
|
if (e->button() == Qt::RightButton && this->geometry().contains(QCursor::pos())) {
|
2021-11-15 21:54:35 +08:00
|
|
|
|
QTimer::singleShot(10, this, [this]{
|
2022-01-06 10:53:18 +08:00
|
|
|
|
QMenu *menu = new QMenu(this);
|
|
|
|
|
m_menuWorker->showDockSettingsMenu(menu);
|
2021-11-15 21:54:35 +08:00
|
|
|
|
});
|
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)
|
|
|
|
|
{
|
2020-08-05 19:46:15 +08:00
|
|
|
|
Q_UNUSED(e);
|
2020-01-21 15:17:38 +08:00
|
|
|
|
//重写mouseMoveEvent 解决bug12866 leaveEvent事件失效
|
|
|
|
|
}
|
|
|
|
|
|
2020-08-05 19:46:15 +08:00
|
|
|
|
void MainWindow::moveEvent(QMoveEvent *event)
|
|
|
|
|
{
|
|
|
|
|
Q_UNUSED(event);
|
2021-04-12 16:53:03 +08:00
|
|
|
|
|
|
|
|
|
if (!qApp->property(DRAG_STATE_PROP).toBool())
|
|
|
|
|
m_updateDragAreaTimer->start();
|
2020-08-05 19:46:15 +08:00
|
|
|
|
}
|
|
|
|
|
|
2020-08-07 23:03:54 +08:00
|
|
|
|
void MainWindow::resizeEvent(QResizeEvent *event)
|
|
|
|
|
{
|
2021-04-12 16:53:03 +08:00
|
|
|
|
if (!qApp->property(DRAG_STATE_PROP).toBool())
|
|
|
|
|
m_updateDragAreaTimer->start();
|
|
|
|
|
|
2020-09-22 18:20:51 +08:00
|
|
|
|
// 任务栏大小、位置、模式改变都会触发resize,发射大小改变信号,供依赖项目更新位置
|
|
|
|
|
Q_EMIT panelGeometryChanged();
|
|
|
|
|
|
2022-06-15 15:16:14 +00:00
|
|
|
|
updateMaskArea();
|
2021-01-07 21:56:53 +08:00
|
|
|
|
m_mainPanel->updatePluginsLayout();
|
2020-12-18 14:07:27 +08:00
|
|
|
|
m_shadowMaskOptimizeTimer->start();
|
2020-08-07 23:03:54 +08:00
|
|
|
|
|
|
|
|
|
return DBlurEffectWidget::resizeEvent(event);
|
|
|
|
|
}
|
|
|
|
|
|
2021-04-12 16:53:03 +08:00
|
|
|
|
void MainWindow::initMember()
|
|
|
|
|
{
|
2021-04-13 17:41:41 +08:00
|
|
|
|
//INFO 这里要大于动画的300ms,否则可能动画过程中这个定时器就被触发了
|
|
|
|
|
m_updateDragAreaTimer->setInterval(500);
|
2021-04-12 16:53:03 +08:00
|
|
|
|
m_updateDragAreaTimer->setSingleShot(true);
|
|
|
|
|
}
|
|
|
|
|
|
2021-05-13 11:39:46 +08:00
|
|
|
|
/**
|
|
|
|
|
* @brief MainWindow::initSNIHost
|
|
|
|
|
* @note 将Dock注册到StatusNotifierWatcher服务上
|
|
|
|
|
*/
|
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()
|
|
|
|
|
{
|
2017-12-05 13:08:17 +08:00
|
|
|
|
m_shadowMaskOptimizeTimer->setSingleShot(true);
|
|
|
|
|
m_shadowMaskOptimizeTimer->setInterval(100);
|
|
|
|
|
|
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
|
|
|
|
|
2018-01-12 14:32:57 +08:00
|
|
|
|
m_shadowMaskOptimizeTimer->start();
|
2016-06-06 10:59:29 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void MainWindow::initConnections()
|
|
|
|
|
{
|
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
|
|
|
|
|
2020-12-18 14:07:27 +08:00
|
|
|
|
connect(m_wmHelper, &DWindowManagerHelper::hasCompositeChanged, m_shadowMaskOptimizeTimer, static_cast<void (QTimer::*)()>(&QTimer::start));
|
2017-12-14 15:25:54 +08:00
|
|
|
|
connect(&m_platformWindowHandle, &DPlatformWindowHandle::frameMarginsChanged, m_shadowMaskOptimizeTimer, static_cast<void (QTimer::*)()>(&QTimer::start));
|
2020-12-18 14:07:27 +08:00
|
|
|
|
connect(&m_platformWindowHandle, &DPlatformWindowHandle::windowRadiusChanged, m_shadowMaskOptimizeTimer, static_cast<void (QTimer::*)()>(&QTimer::start));
|
2022-06-20 15:03:35 +08:00
|
|
|
|
connect(m_mainPanel, &MainPanelControl::requestUpdate, m_shadowMaskOptimizeTimer, static_cast<void (QTimer::*)()>(&QTimer::start));
|
2019-01-15 19:54:13 +08:00
|
|
|
|
|
2020-08-05 19:46:15 +08:00
|
|
|
|
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);
|
2021-09-22 13:12:27 +08:00
|
|
|
|
connect(DockItemManager::instance(), &DockItemManager::trayVisableCountChanged, this, &MainWindow::resizeDockIcon, Qt::QueuedConnection);
|
2020-08-05 19:46:15 +08:00
|
|
|
|
connect(DockItemManager::instance(), &DockItemManager::requestWindowAutoHide, m_menuWorker, &MenuWorker::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);
|
2020-08-05 19:46:15 +08:00
|
|
|
|
|
2021-04-12 16:53:03 +08:00
|
|
|
|
// -拖拽任务栏改变高度或宽度-------------------------------------------------------------------------------
|
|
|
|
|
connect(m_updateDragAreaTimer, &QTimer::timeout, this, &MainWindow::resetDragWindow);
|
2021-04-13 19:01:41 +08:00
|
|
|
|
//TODO 后端考虑删除这块,目前还不能删除,调整任务栏高度的时候,任务栏外部区域有变化
|
2021-04-12 16:53:03 +08:00
|
|
|
|
connect(m_updateDragAreaTimer, &QTimer::timeout, m_multiScreenWorker, &MultiScreenWorker::onRequestUpdateRegionMonitor);
|
|
|
|
|
|
|
|
|
|
connect(m_dragWidget, &DragWidget::dragPointOffset, this, [ = ] { qApp->setProperty(DRAG_STATE_PROP, true); });
|
2022-05-12 16:24:54 +08:00
|
|
|
|
connect(m_dragWidget, &DragWidget::dragFinished, this, [ = ] {
|
|
|
|
|
m_multiScreenWorker->setStates(MultiScreenWorker::DockIsDraging, false);
|
|
|
|
|
qApp->setProperty(DRAG_STATE_PROP, false);
|
|
|
|
|
});
|
2020-08-06 21:42:27 +08:00
|
|
|
|
|
2019-09-05 11:19:11 +08:00
|
|
|
|
connect(m_dragWidget, &DragWidget::dragPointOffset, this, &MainWindow::onMainWindowSizeChanged);
|
2021-04-12 16:53:03 +08:00
|
|
|
|
connect(m_dragWidget, &DragWidget::dragFinished, this, &MainWindow::resetDragWindow); // 更新拖拽区域
|
|
|
|
|
// ----------------------------------------------------------------------------------------------------
|
2017-06-08 15:38:11 +08:00
|
|
|
|
|
2020-08-05 19:46:15 +08:00
|
|
|
|
connect(DGuiApplicationHelper::instance(), &DGuiApplicationHelper::themeTypeChanged, this, &MainWindow::themeTypeChanged);
|
2017-12-11 12:02:54 +08:00
|
|
|
|
|
2020-08-05 19:46:15 +08:00
|
|
|
|
connect(m_menuWorker, &MenuWorker::autoHideChanged, m_multiScreenWorker, &MultiScreenWorker::onAutoHideChanged);
|
2017-11-13 21:17:56 +08:00
|
|
|
|
|
2020-08-05 19:46:15 +08:00
|
|
|
|
connect(m_multiScreenWorker, &MultiScreenWorker::opacityChanged, this, &MainWindow::setMaskAlpha, Qt::QueuedConnection);
|
2020-08-06 20:26:41 +08:00
|
|
|
|
connect(m_multiScreenWorker, &MultiScreenWorker::displayModeChanegd, this, &MainWindow::adjustShadowMask, Qt::QueuedConnection);
|
2019-08-30 10:41:39 +08:00
|
|
|
|
|
2020-10-29 18:08:30 +08:00
|
|
|
|
connect(m_multiScreenWorker, &MultiScreenWorker::requestUpdateDockEntry, DockItemManager::instance(), &DockItemManager::requestUpdateDockItem);
|
|
|
|
|
|
2020-08-18 10:41:14 +08:00
|
|
|
|
// 响应后端触控屏拖拽任务栏高度长按信号
|
|
|
|
|
connect(TouchSignalManager::instance(), &TouchSignalManager::middleTouchPress, this, &MainWindow::touchRequestResizeDock);
|
2021-08-25 21:03:30 +08:00
|
|
|
|
connect(TouchSignalManager::instance(), &TouchSignalManager::touchMove, m_dragWidget, &DragWidget::onTouchMove);
|
2020-02-12 17:32:46 +08:00
|
|
|
|
}
|
|
|
|
|
|
2021-04-13 15:02:45 +08:00
|
|
|
|
/**
|
|
|
|
|
* @brief MainWindow::getTrayVisableItemCount
|
|
|
|
|
* 重新获取以下当前托盘区域有多少个可见的图标,并更新图标的大小
|
|
|
|
|
*/
|
2021-09-22 13:12:27 +08:00
|
|
|
|
void MainWindow::resizeDockIcon()
|
2020-02-12 17:32:46 +08:00
|
|
|
|
{
|
2021-09-22 13:12:27 +08:00
|
|
|
|
m_mainPanel->resizeDockIcon();
|
2016-06-15 11:09:34 +08:00
|
|
|
|
}
|
|
|
|
|
|
2022-06-15 15:16:14 +00:00
|
|
|
|
void MainWindow::updateMaskArea()
|
|
|
|
|
{
|
|
|
|
|
QPainterPath path = m_mainPanel->areaPath();
|
|
|
|
|
QPolygon polgon = path.toFillPolygon().toPolygon();
|
|
|
|
|
setMask(polgon);
|
|
|
|
|
}
|
|
|
|
|
|
2021-04-13 15:02:45 +08:00
|
|
|
|
/**
|
|
|
|
|
* @brief MainWindow::adjustShadowMask 更新任务栏的圆角大小(时尚模式下才有圆角效果)
|
|
|
|
|
*/
|
2017-03-21 15:40:52 +08:00
|
|
|
|
void MainWindow::adjustShadowMask()
|
|
|
|
|
{
|
2020-12-29 10:06:10 +08:00
|
|
|
|
if (!m_launched || m_shadowMaskOptimizeTimer->isActive())
|
2017-12-05 13:08:17 +08:00
|
|
|
|
return;
|
|
|
|
|
|
2019-09-03 09:36:33 +08:00
|
|
|
|
DStyleHelper dstyle(style());
|
2020-12-29 10:06:10 +08:00
|
|
|
|
int radius = 0;
|
|
|
|
|
if (m_wmHelper->hasComposite() && m_multiScreenWorker->displayMode() == DisplayMode::Fashion) {
|
|
|
|
|
if (Dtk::Core::DSysInfo::isCommunityEdition()) { // 社区版圆角与专业版不同
|
|
|
|
|
DPlatformTheme *theme = DGuiApplicationHelper::instance()->systemTheme();
|
|
|
|
|
radius = theme->windowRadius(radius);
|
|
|
|
|
} else {
|
2022-05-25 09:42:01 +08:00
|
|
|
|
QVariant vRadius = qApp->property("EffectBorderRadius");
|
|
|
|
|
if (vRadius.isNull())
|
|
|
|
|
radius = dstyle.pixelMetric(DStyle::PM_TopLevelWindowRadius);
|
|
|
|
|
else
|
|
|
|
|
radius = vRadius.toInt();
|
2020-12-29 10:06:10 +08:00
|
|
|
|
}
|
2020-10-15 15:32:40 +08:00
|
|
|
|
}
|
2017-12-11 12:02:54 +08:00
|
|
|
|
|
2020-12-29 10:06:10 +08:00
|
|
|
|
m_platformWindowHandle.setWindowRadius(radius);
|
2021-01-15 11:10:30 +08:00
|
|
|
|
m_mainPanel->updatePluginsLayout();
|
2022-05-12 16:24:54 +08:00
|
|
|
|
|
2022-06-15 15:16:14 +00:00
|
|
|
|
updateMaskArea();
|
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
|
|
|
|
|
2021-04-13 15:02:45 +08:00
|
|
|
|
/**
|
|
|
|
|
* @brief MainWindow::setEffectEnabled
|
|
|
|
|
* @param enabled 根据当前系统是否enabled特效来更新任务栏的外观样式
|
|
|
|
|
*/
|
2019-08-22 13:52:02 +08:00
|
|
|
|
void MainWindow::setEffectEnabled(const bool enabled)
|
|
|
|
|
{
|
2022-06-01 15:11:45 +08:00
|
|
|
|
Q_UNUSED(enabled);
|
|
|
|
|
|
2019-09-17 13:15:53 +08:00
|
|
|
|
setMaskColor(AutoColor);
|
2019-08-22 13:52:02 +08:00
|
|
|
|
|
2020-08-05 19:46:15 +08:00
|
|
|
|
setMaskAlpha(m_multiScreenWorker->opacity());
|
2022-06-01 15:11:45 +08:00
|
|
|
|
m_platformWindowHandle.setBorderWidth(0);
|
2019-08-22 13:52:02 +08:00
|
|
|
|
}
|
|
|
|
|
|
2021-04-13 15:02:45 +08:00
|
|
|
|
/**
|
|
|
|
|
* @brief MainWindow::setComposite
|
|
|
|
|
* @param hasComposite 系统是否支持混成(也就是特效)
|
|
|
|
|
*/
|
2019-08-22 13:52:02 +08:00
|
|
|
|
void MainWindow::setComposite(const bool hasComposite)
|
|
|
|
|
{
|
|
|
|
|
setEffectEnabled(hasComposite);
|
|
|
|
|
}
|
2019-08-26 16:15:50 +08:00
|
|
|
|
|
2021-04-13 15:02:45 +08:00
|
|
|
|
/**
|
|
|
|
|
* @brief MainWindow::resetDragWindow 更新任务栏的拖拽区域
|
|
|
|
|
* @note 任务栏远离屏幕的一边是支持拖拽的,由一个不可见的widget提拽支持,当任务栏的geometry发生变化的时候,此拖拽区域也需要更新其自身的geometry
|
|
|
|
|
*/
|
2020-08-05 19:46:15 +08:00
|
|
|
|
void MainWindow::resetDragWindow()
|
2019-08-26 16:15:50 +08:00
|
|
|
|
{
|
2020-08-05 19:46:15 +08:00
|
|
|
|
switch (m_multiScreenWorker->position()) {
|
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-08-05 19:46:15 +08:00
|
|
|
|
}
|
|
|
|
|
|
2020-09-25 14:13:30 +08:00
|
|
|
|
QRect rect = m_multiScreenWorker->dockRect(m_multiScreenWorker->deskScreen()
|
2020-10-13 15:35:11 +08:00
|
|
|
|
, m_multiScreenWorker->position()
|
|
|
|
|
, HideMode::KeepShowing
|
|
|
|
|
, m_multiScreenWorker->displayMode());
|
2020-09-25 14:13:30 +08:00
|
|
|
|
|
|
|
|
|
// 这个时候屏幕有可能是隐藏的,不能直接使用this->width()这种去设置任务栏的高度,而应该保证原值
|
|
|
|
|
int dockSize = 0;
|
2020-08-08 00:55:02 +08:00
|
|
|
|
if (m_multiScreenWorker->position() == Position::Left
|
|
|
|
|
|| m_multiScreenWorker->position() == Position::Right) {
|
2020-09-25 14:13:30 +08:00
|
|
|
|
dockSize = this->width() == 0 ? rect.width() : this->width();
|
2020-08-08 00:55:02 +08:00
|
|
|
|
} else {
|
2020-09-25 14:13:30 +08:00
|
|
|
|
dockSize = this->height() == 0 ? rect.height() : this->height();
|
2020-08-08 00:55:02 +08:00
|
|
|
|
}
|
2020-08-05 19:46:15 +08:00
|
|
|
|
|
2020-09-09 11:47:54 +08:00
|
|
|
|
/** FIX ME
|
|
|
|
|
* 作用:限制dockSize的值在40~100之间。
|
|
|
|
|
* 问题1:如果dockSize为39,会导致dock的mainwindow高度变成99,显示的内容高度却是39。
|
|
|
|
|
* 问题2:dockSize的值在这里不应该为39,但在高分屏上开启缩放后,拉高任务栏操作会概率出现。
|
|
|
|
|
* 暂时未分析出原因,后面再修改。
|
|
|
|
|
*/
|
|
|
|
|
dockSize = qBound(MAINWINDOW_MIN_SIZE, dockSize, MAINWINDOW_MAX_SIZE);
|
|
|
|
|
|
2020-08-05 19:46:15 +08:00
|
|
|
|
// 通知窗管和后端更新数据
|
2020-09-24 11:13:58 +08:00
|
|
|
|
m_multiScreenWorker->updateDaemonDockSize(dockSize); // 1.先更新任务栏高度
|
2020-08-10 21:54:17 +08:00
|
|
|
|
m_multiScreenWorker->requestUpdateFrontendGeometry(); // 2.再更新任务栏位置,保证先1再2
|
2020-08-05 19:46:15 +08:00
|
|
|
|
m_multiScreenWorker->requestNotifyWindowManager();
|
2020-09-24 11:13:58 +08:00
|
|
|
|
m_multiScreenWorker->requestUpdateRegionMonitor(); // 界面发生变化,应更新监控区域
|
2020-08-05 19:46:15 +08:00
|
|
|
|
|
|
|
|
|
if ((Top == m_multiScreenWorker->position()) || (Bottom == m_multiScreenWorker->position())) {
|
|
|
|
|
m_dragWidget->setCursor(Qt::SizeVerCursor);
|
|
|
|
|
} else {
|
|
|
|
|
m_dragWidget->setCursor(Qt::SizeHorCursor);
|
2019-08-26 16:15:50 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
2019-08-28 11:37:19 +08:00
|
|
|
|
|
2021-11-05 13:10:09 +08:00
|
|
|
|
void MainWindow::resizeDock(int offset, bool dragging)
|
2021-10-13 11:27:50 +08:00
|
|
|
|
{
|
2021-11-05 13:10:09 +08:00
|
|
|
|
qApp->setProperty(DRAG_STATE_PROP, dragging);
|
|
|
|
|
|
2021-10-27 17:15:24 +08:00
|
|
|
|
const QRect &rect = m_multiScreenWorker->getDockShowMinGeometry(m_multiScreenWorker->deskScreen());
|
2021-10-13 11:27:50 +08:00
|
|
|
|
QRect newRect;
|
|
|
|
|
switch (m_multiScreenWorker->position()) {
|
2021-10-27 17:15:24 +08:00
|
|
|
|
case Top: {
|
|
|
|
|
newRect.setX(rect.x());
|
|
|
|
|
newRect.setY(rect.y());
|
|
|
|
|
newRect.setWidth(rect.width());
|
|
|
|
|
newRect.setHeight(qBound(MAINWINDOW_MIN_SIZE, offset, MAINWINDOW_MAX_SIZE));
|
|
|
|
|
}
|
|
|
|
|
break;
|
2021-10-13 11:27:50 +08:00
|
|
|
|
case Bottom: {
|
|
|
|
|
newRect.setX(rect.x());
|
2021-10-27 17:15:24 +08:00
|
|
|
|
newRect.setY(rect.y() + rect.height() - qBound(MAINWINDOW_MIN_SIZE, offset, MAINWINDOW_MAX_SIZE));
|
2021-10-13 11:27:50 +08:00
|
|
|
|
newRect.setWidth(rect.width());
|
2021-10-27 17:15:24 +08:00
|
|
|
|
newRect.setHeight(qBound(MAINWINDOW_MIN_SIZE, offset, MAINWINDOW_MAX_SIZE));
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case Left: {
|
|
|
|
|
newRect.setX(rect.x());
|
|
|
|
|
newRect.setY(rect.y());
|
|
|
|
|
newRect.setWidth(qBound(MAINWINDOW_MIN_SIZE, offset, MAINWINDOW_MAX_SIZE));
|
|
|
|
|
newRect.setHeight(rect.height());
|
2021-10-13 11:27:50 +08:00
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case Right: {
|
2021-10-27 17:15:24 +08:00
|
|
|
|
newRect.setX(rect.x() + rect.width() - qBound(MAINWINDOW_MIN_SIZE, offset, MAINWINDOW_MAX_SIZE));
|
2021-10-13 11:27:50 +08:00
|
|
|
|
newRect.setY(rect.y());
|
2021-10-27 17:15:24 +08:00
|
|
|
|
newRect.setWidth(qBound(MAINWINDOW_MIN_SIZE, offset, MAINWINDOW_MAX_SIZE));
|
2021-10-13 11:27:50 +08:00
|
|
|
|
newRect.setHeight(rect.height());
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 更新界面大小
|
|
|
|
|
m_mainPanel->setFixedSize(newRect.size());
|
|
|
|
|
setFixedSize(newRect.size());
|
|
|
|
|
move(newRect.topLeft());
|
2021-11-01 16:59:14 +08:00
|
|
|
|
|
2021-11-05 13:10:09 +08:00
|
|
|
|
if (!dragging)
|
|
|
|
|
resetDragWindow();
|
2021-10-13 11:27:50 +08:00
|
|
|
|
}
|
|
|
|
|
|
2021-04-13 15:02:45 +08:00
|
|
|
|
/**
|
|
|
|
|
* @brief MainWindow::onMainWindowSizeChanged 任务栏拖拽过程中会不听调用此方法更新自身大小
|
|
|
|
|
* @param offset 拖拽时的坐标偏移量
|
|
|
|
|
*/
|
2019-09-05 11:19:11 +08:00
|
|
|
|
void MainWindow::onMainWindowSizeChanged(QPoint offset)
|
|
|
|
|
{
|
2020-08-07 23:03:02 +08:00
|
|
|
|
const QRect &rect = m_multiScreenWorker->dockRect(m_multiScreenWorker->deskScreen()
|
|
|
|
|
, m_multiScreenWorker->position()
|
|
|
|
|
, HideMode::KeepShowing,
|
2020-08-07 23:03:54 +08:00
|
|
|
|
m_multiScreenWorker->displayMode());
|
2020-08-05 19:46:15 +08:00
|
|
|
|
QRect newRect;
|
|
|
|
|
switch (m_multiScreenWorker->position()) {
|
|
|
|
|
case Top: {
|
|
|
|
|
newRect.setX(rect.x());
|
|
|
|
|
newRect.setY(rect.y());
|
|
|
|
|
newRect.setWidth(rect.width());
|
2020-09-02 13:11:23 +08:00
|
|
|
|
newRect.setHeight(qBound(MAINWINDOW_MIN_SIZE, rect.height() + offset.y(), MAINWINDOW_MAX_SIZE));
|
2020-08-05 19:46:15 +08:00
|
|
|
|
}
|
2021-04-12 16:53:03 +08:00
|
|
|
|
break;
|
2020-08-05 19:46:15 +08:00
|
|
|
|
case Bottom: {
|
|
|
|
|
newRect.setX(rect.x());
|
2020-09-02 13:11:23 +08:00
|
|
|
|
newRect.setY(rect.y() + rect.height() - qBound(MAINWINDOW_MIN_SIZE, rect.height() - offset.y(), MAINWINDOW_MAX_SIZE));
|
2020-08-05 19:46:15 +08:00
|
|
|
|
newRect.setWidth(rect.width());
|
2020-10-13 15:35:11 +08:00
|
|
|
|
newRect.setHeight(qBound(MAINWINDOW_MIN_SIZE, rect.height() - offset.y(), MAINWINDOW_MAX_SIZE));
|
2020-08-05 19:46:15 +08:00
|
|
|
|
}
|
2021-04-12 16:53:03 +08:00
|
|
|
|
break;
|
2020-08-05 19:46:15 +08:00
|
|
|
|
case Left: {
|
|
|
|
|
newRect.setX(rect.x());
|
|
|
|
|
newRect.setY(rect.y());
|
2020-09-02 13:11:23 +08:00
|
|
|
|
newRect.setWidth(qBound(MAINWINDOW_MIN_SIZE, rect.width() + offset.x(), MAINWINDOW_MAX_SIZE));
|
2020-08-05 19:46:15 +08:00
|
|
|
|
newRect.setHeight(rect.height());
|
2019-09-05 11:19:11 +08:00
|
|
|
|
}
|
2021-04-12 16:53:03 +08:00
|
|
|
|
break;
|
2020-08-05 19:46:15 +08:00
|
|
|
|
case Right: {
|
2020-09-02 13:11:23 +08:00
|
|
|
|
newRect.setX(rect.x() + rect.width() - qBound(MAINWINDOW_MIN_SIZE, rect.width() - offset.x(), MAINWINDOW_MAX_SIZE));
|
2020-08-05 19:46:15 +08:00
|
|
|
|
newRect.setY(rect.y());
|
2020-09-02 13:11:23 +08:00
|
|
|
|
newRect.setWidth(qBound(MAINWINDOW_MIN_SIZE, rect.width() - offset.x(), MAINWINDOW_MAX_SIZE));
|
2020-08-05 19:46:15 +08:00
|
|
|
|
newRect.setHeight(rect.height());
|
|
|
|
|
}
|
2021-04-12 16:53:03 +08:00
|
|
|
|
break;
|
2020-08-05 19:46:15 +08:00
|
|
|
|
}
|
2019-11-15 13:39:50 +08:00
|
|
|
|
|
2022-05-12 16:24:54 +08:00
|
|
|
|
m_multiScreenWorker->setStates(MultiScreenWorker::DockIsDraging, true);
|
2020-08-05 19:46:15 +08:00
|
|
|
|
// 更新界面大小
|
|
|
|
|
m_mainPanel->setFixedSize(newRect.size());
|
|
|
|
|
setFixedSize(newRect.size());
|
|
|
|
|
move(newRect.topLeft());
|
|
|
|
|
}
|
|
|
|
|
|
2021-04-13 15:02:45 +08:00
|
|
|
|
/**
|
|
|
|
|
* @brief MainWindow::themeTypeChanged 系统主题发生变化时,此方法被调用
|
|
|
|
|
* @param themeType 当前系统主题
|
|
|
|
|
*/
|
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));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2021-04-13 15:02:45 +08:00
|
|
|
|
/**
|
|
|
|
|
* @brief MainWindow::touchRequestResizeDock 触屏情况用手指调整任务栏高度或宽度
|
|
|
|
|
*/
|
2020-08-18 10:41:14 +08:00
|
|
|
|
void MainWindow::touchRequestResizeDock()
|
|
|
|
|
{
|
|
|
|
|
const QPoint touchPos(QCursor::pos());
|
|
|
|
|
QRect dockRect = m_multiScreenWorker->dockRect(m_multiScreenWorker->deskScreen()
|
2020-10-13 15:35:11 +08:00
|
|
|
|
, m_multiScreenWorker->position()
|
|
|
|
|
, HideMode::KeepShowing
|
|
|
|
|
, m_multiScreenWorker->displayMode());
|
2020-08-18 10:41:14 +08:00
|
|
|
|
|
|
|
|
|
// 隐藏状态返回
|
|
|
|
|
if (width() == 0 || height() == 0) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
2021-03-20 12:10:45 +08:00
|
|
|
|
int resizeHeight = Utils::SettingValue("com.deepin.dde.dock.touch", QByteArray(), "resizeHeight", 7).toInt();
|
2020-08-18 10:41:14 +08:00
|
|
|
|
|
|
|
|
|
QRect touchRect;
|
|
|
|
|
// 任务栏屏幕 内侧边线 内外resizeHeight距离矩形区域内长按可拖动任务栏高度
|
|
|
|
|
switch (m_multiScreenWorker->position()) {
|
|
|
|
|
case Position::Top:
|
|
|
|
|
touchRect = QRect(dockRect.x(), dockRect.y() + dockRect.height() - resizeHeight, dockRect.width(), resizeHeight * 2);
|
|
|
|
|
break;
|
|
|
|
|
case Position::Bottom:
|
|
|
|
|
touchRect = QRect(dockRect.x(), dockRect.y() - resizeHeight, dockRect.width(), resizeHeight * 2);
|
|
|
|
|
break;
|
|
|
|
|
case Position::Left:
|
|
|
|
|
touchRect = QRect(dockRect.x() + dockRect.width() - resizeHeight, dockRect.y(), resizeHeight * 2, dockRect.height());
|
|
|
|
|
break;
|
|
|
|
|
case Position::Right:
|
|
|
|
|
touchRect = QRect(dockRect.x() - resizeHeight, dockRect.y(), resizeHeight * 2, dockRect.height());
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!touchRect.contains(touchPos)) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
2020-09-07 16:09:40 +08:00
|
|
|
|
qApp->postEvent(m_dragWidget, new QMouseEvent(QEvent::MouseButtonPress, m_dragWidget->mapFromGlobal(touchPos)
|
2020-09-15 15:47:43 +08:00
|
|
|
|
, QPoint(), touchPos, Qt::LeftButton, Qt::NoButton
|
|
|
|
|
, Qt::NoModifier, Qt::MouseEventSynthesizedByApplication));
|
2020-08-18 10:41:14 +08:00
|
|
|
|
}
|
|
|
|
|
|
2021-04-13 15:02:45 +08:00
|
|
|
|
/**
|
|
|
|
|
* @brief MainWindow::setGeometry
|
|
|
|
|
* @param rect 设置任务栏的位置和大小,重写此函数时为了及时发出panelGeometryChanged信号,最终供外部DBus调用方使用
|
|
|
|
|
*/
|
2020-09-25 21:24:00 +08:00
|
|
|
|
void MainWindow::setGeometry(const QRect &rect)
|
|
|
|
|
{
|
2021-02-20 14:22:00 +08:00
|
|
|
|
if (rect == this->geometry()) {
|
2020-09-25 21:24:00 +08:00
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
DBlurEffectWidget::setGeometry(rect);
|
|
|
|
|
emit panelGeometryChanged();
|
|
|
|
|
}
|
|
|
|
|
|
2021-01-21 15:31:25 +08:00
|
|
|
|
/**
|
|
|
|
|
* @brief 当进入安全模式时,通过此方法发送通知告知用户
|
|
|
|
|
*/
|
|
|
|
|
void MainWindow::sendNotifications()
|
|
|
|
|
{
|
|
|
|
|
QStringList actionButton;
|
|
|
|
|
actionButton << "reload" << tr("Exit Safe Mode");
|
|
|
|
|
QVariantMap hints;
|
|
|
|
|
hints["x-deepin-action-reload"] = QString("dbus-send,--session,--dest=com.deepin.dde.Dock,--print-reply,/com/deepin/dde/Dock,com.deepin.dde.Dock.ReloadPlugins");
|
2021-06-15 18:04:05 +08:00
|
|
|
|
// 在进入安全模式时,执行此DBUS耗时25S左右,导致任务栏显示阻塞,所以使用线程调用
|
|
|
|
|
QtConcurrent::run(QThreadPool::globalInstance(), [=] {
|
2021-01-21 15:31:25 +08:00
|
|
|
|
DDBusSender()
|
2021-04-12 16:53:03 +08:00
|
|
|
|
.service("com.deepin.dde.Notification")
|
|
|
|
|
.path("/com/deepin/dde/Notification")
|
|
|
|
|
.interface("com.deepin.dde.Notification")
|
|
|
|
|
.method(QString("Notify"))
|
|
|
|
|
.arg(QString("dde-control-center")) // appname
|
|
|
|
|
.arg(static_cast<uint>(0)) // id
|
|
|
|
|
.arg(QString("preferences-system")) // icon
|
|
|
|
|
.arg(QString(tr("Dock - Safe Mode"))) // summary
|
|
|
|
|
.arg(QString(tr("The Dock is in safe mode, please exit to show it properly"))) // content
|
|
|
|
|
.arg(actionButton) // actions
|
|
|
|
|
.arg(hints) // hints
|
|
|
|
|
.arg(15000) // timeout
|
|
|
|
|
.call();
|
2021-01-21 15:31:25 +08:00
|
|
|
|
});
|
|
|
|
|
}
|