diff --git a/frame/util/dockapplication.cpp b/frame/util/dockapplication.cpp index ffd45b6b6..67e7f4759 100644 --- a/frame/util/dockapplication.cpp +++ b/frame/util/dockapplication.cpp @@ -4,7 +4,8 @@ #include #include -DockApplication::DockApplication(int &argc, char **argv) : DApplication (argc, argv) +DockApplication::DockApplication(int &argc, char **argv) + : DApplication (argc, argv) { } diff --git a/frame/util/menuworker.cpp b/frame/util/menuworker.cpp index a6ea6d229..5c0593a39 100644 --- a/frame/util/menuworker.cpp +++ b/frame/util/menuworker.cpp @@ -220,10 +220,8 @@ QMenu *MenuWorker::createMenu() void MenuWorker::showDockSettingsMenu() { // 菜单功能被禁用 - const QGSettings *setting = Utils::SettingsPtr("menu"); + static const QGSettings *setting = Utils::SettingsPtr("menu", this); if (setting && setting->keys().contains("enable") && !setting->get("enable").toBool()) { - delete setting; - setting = nullptr; return; } diff --git a/frame/util/multiscreenworker.cpp b/frame/util/multiscreenworker.cpp index ea8e51c9b..c60f0d2bf 100644 --- a/frame/util/multiscreenworker.cpp +++ b/frame/util/multiscreenworker.cpp @@ -28,7 +28,7 @@ #include #include #include - +#include #include const QString MonitorsSwitchTime = "monitorsSwitchTime"; @@ -231,7 +231,7 @@ void MultiScreenWorker::onExtralRegionMonitorChanged(int x, int y, const QString m_delayTimer->stop(); if (m_hideMode == HideMode::KeepShowing - || ((m_hideMode == HideMode::KeepHidden || m_hideMode == HideMode::SmartHide) && m_hideState == HideState::Show)) { + || ((m_hideMode == HideMode::KeepHidden || m_hideMode == HideMode::SmartHide) && m_hideState == HideState::Show)) { displayAnimation(m_ds.current(), AniAction::Show); } else if ((m_hideMode == HideMode::KeepHidden || m_hideMode == HideMode::SmartHide) && m_hideState == HideState::Hide) { displayAnimation(m_ds.current(), AniAction::Hide); @@ -384,16 +384,16 @@ void MultiScreenWorker::updateParentGeometry(const QVariant &value, const Positi case Position::Top: { parent()->panel()->move(0, rect.height() - panelSize); } - break; + break; case Position::Left: { parent()->panel()->move(rect.width() - panelSize, 0); } - break; + break; case Position::Bottom: case Position::Right: { parent()->panel()->move(0, 0); } - break; + break; } } @@ -490,7 +490,7 @@ void MultiScreenWorker::onHideModeChanged() m_hideMode = hideMode; if (m_hideMode == HideMode::KeepShowing - || ((m_hideMode == HideMode::KeepHidden || m_hideMode == HideMode::SmartHide) && m_hideState == HideState::Show)) { + || ((m_hideMode == HideMode::KeepHidden || m_hideMode == HideMode::SmartHide) && m_hideState == HideState::Show)) { displayAnimation(m_ds.current(), AniAction::Show); } else if ((m_hideMode == HideMode::KeepHidden || m_hideMode == HideMode::SmartHide) && m_hideState == HideState::Hide) { displayAnimation(m_ds.current(), AniAction::Hide); @@ -526,7 +526,7 @@ void MultiScreenWorker::onHideStateChanged() qInfo() << "hidestate change:" << m_hideMode << m_hideState; if (m_hideMode == HideMode::KeepShowing - || ((m_hideMode == HideMode::KeepHidden || m_hideMode == HideMode::SmartHide) && m_hideState == HideState::Show)) { + || ((m_hideMode == HideMode::KeepHidden || m_hideMode == HideMode::SmartHide) && m_hideState == HideState::Show)) { displayAnimation(m_ds.current(), AniAction::Show); } else if ((m_hideMode == HideMode::KeepHidden || m_hideMode == HideMode::SmartHide) && m_hideState == HideState::Hide) { displayAnimation(m_ds.current(), AniAction::Hide); @@ -591,28 +591,28 @@ void MultiScreenWorker::onRequestUpdateRegionMonitor() rect.x2 = inter->x() + inter->w(); rect.y2 = inter->y() + monitorHeight; } - break; + break; case Bottom: { rect.x1 = inter->x(); rect.y1 = inter->y() + inter->h() - monitorHeight; rect.x2 = inter->x() + inter->w(); rect.y2 = inter->y() + inter->h(); } - break; + break; case Left: { rect.x1 = inter->x(); rect.y1 = inter->y(); rect.x2 = inter->x() + monitorHeight; rect.y2 = inter->y() + inter->h(); } - break; + break; case Right: { rect.x1 = inter->x() + inter->w() - monitorHeight; rect.y1 = inter->y(); rect.x2 = inter->x() + inter->w(); rect.y2 = inter->y() + inter->h(); } - break; + break; } if (!m_monitorRectList.contains(rect)) { @@ -637,28 +637,28 @@ void MultiScreenWorker::onRequestUpdateRegionMonitor() rect.x2 = inter->x() + inter->w(); rect.y2 = inter->y() + inter->h(); } - break; + break; case Bottom: { rect.x1 = inter->x(); rect.y1 = inter->y(); rect.x2 = inter->x() + inter->w(); rect.y2 = inter->y() + inter->h() - realDockSize; } - break; + break; case Left: { rect.x1 = inter->x() + realDockSize; rect.y1 = inter->y(); rect.x2 = inter->x() + inter->w(); rect.y2 = inter->y() + inter->h(); } - break; + break; case Right: { rect.x1 = inter->x(); rect.y1 = inter->y(); rect.x2 = inter->x() + inter->w() - realDockSize; rect.y2 = inter->y() + inter->h(); } - break; + break; } if (!m_extralRectList.contains(rect)) { @@ -686,28 +686,28 @@ void MultiScreenWorker::onRequestUpdateRegionMonitor() touchRect.x2 = inter->x() + inter->w(); touchRect.y2 = inter->y() + monitHeight; } - break; + break; case Bottom: { touchRect.x1 = inter->x(); touchRect.y1 = inter->y() + inter->h() - monitHeight; touchRect.x2 = inter->x() + inter->w(); touchRect.y2 = inter->y() + inter->h(); } - break; + break; case Left: { touchRect.x1 = inter->x(); touchRect.y1 = inter->y(); touchRect.x2 = inter->x() + monitHeight; touchRect.y2 = inter->y() + inter->h(); } - break; + break; case Right: { touchRect.x1 = inter->x() + inter->w() - monitHeight; touchRect.y1 = inter->y(); touchRect.x2 = inter->x() + inter->w(); touchRect.y2 = inter->y() + inter->h(); } - break; + break; } if (!m_touchRectList.contains(touchRect)) { @@ -749,6 +749,13 @@ void MultiScreenWorker::onRequestNotifyWindowManager() /* 在非主屏或非一直显示状态时,清除任务栏区域,不挤占应用 */ if (m_ds.current() != m_ds.primary() || m_hideMode != HideMode::KeepShowing) { lastRect = QRect(); + + const auto display = QX11Info::display(); + if (!display) { + qWarning() << "QX11Info::display() is " << display; + return; + } + XcbMisc::instance()->clear_strut_partial(xcb_window_t(parent()->winId())); return; } @@ -798,6 +805,13 @@ void MultiScreenWorker::onRequestNotifyWindowManager() } qDebug() << "set reserved area to xcb:" << strut << strutStart << strutEnd; + + const auto display = QX11Info::display(); + if (!display) { + qWarning() << "QX11Info::display() is " << display; + return; + } + XcbMisc::instance()->set_strut_partial(static_cast(parent()->winId()), orientation, static_cast(strut + WINDOWMARGIN * ratio), // 设置窗口与屏幕边缘距离,需要乘缩放 static_cast(strutStart), // 设置任务栏起点坐标(上下为x,左右为y) @@ -1139,13 +1153,13 @@ void MultiScreenWorker::displayAnimation(const QString &screen, const Position & case AniAction::Show: if (pos == Position::Top || pos == Position::Bottom) { if (dockShowRect.height() > mainwindowRect.height() - 2 - && dockShowRect.height() < mainwindowRect.height() + 2) { + && dockShowRect.height() < mainwindowRect.height() + 2) { emit requestNotifyWindowManager(); return; } } else if (pos == Position::Left || pos == Position::Right) { if (dockShowRect.width() > mainwindowRect.width() - 2 - && dockShowRect.width() < mainwindowRect.width() + 2) { + && dockShowRect.width() < mainwindowRect.width() + 2) { emit requestNotifyWindowManager(); return; } @@ -1320,13 +1334,17 @@ void MultiScreenWorker::changeDockPosition(QString fromScreen, QString toScreen, // 如果更改了显示位置,在显示之前应该更新一下界面布局方向 if (fromPos != toPos) connect(ani1, &QVariantAnimation::finished, this, [ = ] { + const auto display = QX11Info::display(); + if (!display) { + qWarning() << "QX11Info::display() is " << display; + } else { + // 先清除原先的窗管任务栏区域 + XcbMisc::instance()->clear_strut_partial(xcb_window_t(parent()->winId())); + } - // 先清除原先的窗管任务栏区域 - XcbMisc::instance()->clear_strut_partial(xcb_window_t(parent()->winId())); - - // 隐藏后需要通知界面更新布局方向 - emit requestUpdateLayout(); - }); + // 隐藏后需要通知界面更新布局方向 + emit requestUpdateLayout(); + }); connect(group, &QVariantAnimation::finished, this, [ = ] { m_aniStart = false; @@ -1715,9 +1733,9 @@ const QPoint MultiScreenWorker::rawXPosition(const QPoint &scaledPos) QScreen const *screen = Utils::screenAtByScaled(scaledPos); return screen ? screen->geometry().topLeft() + - (scaledPos - screen->geometry().topLeft()) * - screen->devicePixelRatio() - : scaledPos; + (scaledPos - screen->geometry().topLeft()) * + screen->devicePixelRatio() + : scaledPos; } /** diff --git a/frame/window/mainwindow.cpp b/frame/window/mainwindow.cpp index 2ad56b709..60f7b4d80 100755 --- a/frame/window/mainwindow.cpp +++ b/frame/window/mainwindow.cpp @@ -56,26 +56,6 @@ using org::kde::StatusNotifierWatcher; using DBusDock = com::deepin::dde::daemon::Dock; -const QPoint rawXPosition(const QPoint &scaledPos) -{ - QScreen const *screen = Utils::screenAtByScaled(scaledPos); - - return screen ? screen->geometry().topLeft() + - (scaledPos - screen->geometry().topLeft()) * - screen->devicePixelRatio() - : scaledPos; -} - -const QPoint scaledPos(const QPoint &rawXPos) -{ - QScreen const *screen = Utils::screenAt(rawXPos); - - return screen - ? screen->geometry().topLeft() + - (rawXPos - screen->geometry().topLeft()) / screen->devicePixelRatio() - : rawXPos; -} - // let startdde know that we've already started. void RegisterDdeSession() { @@ -110,14 +90,19 @@ MainWindow::MainWindow(QWidget *parent) , m_dragWidget(new DragWidget(this)) , m_launched(false) { - setAccessibleName("mainwindow"); - m_mainPanel->setAccessibleName("mainpanel"); setAttribute(Qt::WA_TranslucentBackground); setAttribute(Qt::WA_X11DoNotAcceptFocus); - // 确保下面两行代码的先后顺序,否则会导致任务栏界面不再置顶 + //1 确保这两行代码的先后顺序,否则会导致任务栏界面不再置顶 setWindowFlags(Qt::WindowDoesNotAcceptFocus); - XcbMisc::instance()->set_window_type(xcb_window_t(this->winId()), XcbMisc::Dock); + + 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); + } setMouseTracking(true); setAcceptDrops(true); diff --git a/plugins/tray/xembedtraywidget.cpp b/plugins/tray/xembedtraywidget.cpp index 9c0700bd3..d1da0e480 100644 --- a/plugins/tray/xembedtraywidget.cpp +++ b/plugins/tray/xembedtraywidget.cpp @@ -153,6 +153,10 @@ void XEmbedTrayWidget::mouseMoveEvent(QMouseEvent *e) void XEmbedTrayWidget::configContainerPosition() { auto c = QX11Info::connection(); + if (!c) { + qWarning() << "QX11Info::connection() is " << c; + return; + } const QPoint p(rawXPosition(QCursor::pos())); @@ -173,6 +177,10 @@ void XEmbedTrayWidget::configContainerPosition() void XEmbedTrayWidget::wrapWindow() { auto c = QX11Info::connection(); + if (!c) { + qWarning() << "QX11Info::connection() is " << c; + return; + } auto cookie = xcb_get_geometry(c, m_windowId); QScopedPointer clientGeom(xcb_get_geometry_reply(c, cookie, Q_NULLPTR)); @@ -334,6 +342,10 @@ void XEmbedTrayWidget::sendClick(uint8_t mouseButton, int x, int y) QString XEmbedTrayWidget::getWindowProperty(quint32 winId, QString propName) { const auto display = QX11Info::display(); + if (!display) { + qWarning() << "QX11Info::display() is " << display; + return QString(); + } Atom atom_prop = XInternAtom(display, propName.toLocal8Bit(), true); if (!atom_prop) { @@ -383,6 +395,11 @@ void XEmbedTrayWidget::refershIconImage() { const auto ratio = devicePixelRatioF(); auto c = QX11Info::connection(); + if (!c) { + qWarning() << "QX11Info::connection() is " << c; + return; + } + auto cookie = xcb_get_geometry(c, m_windowId); QScopedPointer geom(xcb_get_geometry_reply(c, cookie, Q_NULLPTR)); if (geom.isNull()) @@ -504,6 +521,10 @@ void XEmbedTrayWidget::setX11PassMouseEvent(const bool pass) void XEmbedTrayWidget::setWindowOnTop(const bool top) { auto c = QX11Info::connection(); + if (!c) { + qWarning() << "QX11Info::connection() is " << c; + return; + } const uint32_t stackAboveData[] = {top ? XCB_STACK_MODE_ABOVE : XCB_STACK_MODE_BELOW}; xcb_configure_window(c, m_containerWid, XCB_CONFIG_WINDOW_STACK_MODE, stackAboveData); xcb_flush(c); diff --git a/tests/item/ut_appitem.cpp b/tests/item/ut_appitem.cpp index cc25132b5..67881784c 100644 --- a/tests/item/ut_appitem.cpp +++ b/tests/item/ut_appitem.cpp @@ -38,13 +38,10 @@ class Test_AppItem : public ::testing::Test public: virtual void SetUp() override; virtual void TearDown() override; - -public: - AppItem *appItem = nullptr; }; void Test_AppItem::SetUp() -{ +{ } void Test_AppItem::TearDown() @@ -59,7 +56,7 @@ TEST_F(Test_AppItem, coverage_test) ON_CALL(mock, keys()).WillByDefault(Return(QStringList() << "enable" << "control")); ON_CALL(mock, get(_)) .WillByDefault(::testing::Invoke([](const QString& key){return true; })); - appItem = new AppItem(&mock, &mock, &mock, QDBusObjectPath("/com/deepin/dde/daemon/Dock/entries/e0T6045b766")); + AppItem *appItem = new AppItem(&mock, &mock, &mock, QDBusObjectPath("/com/deepin/dde/daemon/Dock/entries/e0T6045b766")); // 触发信号测试 // emit appItem->m_refershIconTimer->start(10); diff --git a/tests/panel/ut_mainpanelcontrol.cpp b/tests/panel/ut_mainpanelcontrol.cpp index 9bb6466c6..4c0adf2b5 100644 --- a/tests/panel/ut_mainpanelcontrol.cpp +++ b/tests/panel/ut_mainpanelcontrol.cpp @@ -25,7 +25,9 @@ #include +#define private public #include "mainpanelcontrol.h" +#undef private using namespace ::testing; @@ -53,4 +55,20 @@ void Test_MainPanelControl::TearDown() TEST_F(Test_MainPanelControl, coverage_test) { ASSERT_TRUE(mainPanel); + + mainPanel->setPositonValue(Dock::Position::Top); + mainPanel->updateMainPanelLayout(); + QTest::qWait(10); + + mainPanel->setPositonValue(Dock::Position::Bottom); + mainPanel->updateMainPanelLayout(); + QTest::qWait(10); + + mainPanel->setPositonValue(Dock::Position::Left); + mainPanel->updateMainPanelLayout(); + QTest::qWait(10); + + mainPanel->setPositonValue(Dock::Position::Right); + mainPanel->updateMainPanelLayout(); + QTest::qWait(10); } diff --git a/tests/ut_main.cpp b/tests/ut_main.cpp index 0fee75106..0b8502afb 100644 --- a/tests/ut_main.cpp +++ b/tests/ut_main.cpp @@ -23,6 +23,8 @@ #include "dockapplication.h" #include +#include +#include #include @@ -34,6 +36,17 @@ int main(int argc, char **argv) qApp->setProperty("CANSHOW", true); + QMouseEvent mouseEvent1(QMouseEvent::MouseButtonPress, QPoint(), QPoint(), QPoint(), Qt::LeftButton, Qt::LeftButton, Qt::NoModifier, Qt::MouseEventSynthesizedByQt); + qApp->sendEvent(&app, &mouseEvent1); + + QMouseEvent mouseEvent2(QMouseEvent::MouseButtonPress, QPoint(), QPoint(), QPoint(), Qt::LeftButton, Qt::LeftButton, Qt::NoModifier, Qt::MouseEventSynthesizedByApplication); + qApp->sendEvent(&app, &mouseEvent2); + + QList list; + list << QTouchEvent::TouchPoint(0) << QTouchEvent::TouchPoint(1) << QTouchEvent::TouchPoint(2); + QTouchEvent touchEven(QEvent::TouchBegin, nullptr, Qt::NoModifier, Qt::TouchPointPressed, list); + qApp->sendEvent(&app, &touchEven); + ::testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS(); diff --git a/tests/window/ut_mainwindow.cpp b/tests/window/ut_mainwindow.cpp new file mode 100644 index 000000000..2cc6f2b9f --- /dev/null +++ b/tests/window/ut_mainwindow.cpp @@ -0,0 +1,91 @@ +/* + * Copyright (C) 2018 ~ 2028 Uniontech Technology Co., Ltd. + * + * Author: fanpengcheng + * + * Maintainer: fanpengcheng + * + * 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 . + */ + +#include +#include +#include + +#include + +#define private public +#include "mainwindow.h" +#undef private + +using namespace ::testing; + +class Test_MainWindow : public ::testing::Test +{ +public: + virtual void SetUp() override; + virtual void TearDown() override; + +public: + MainWindow *m_window = nullptr; +}; + +void Test_MainWindow::SetUp() +{ + m_window = new MainWindow; +} + +void Test_MainWindow::TearDown() +{ + delete m_window; + m_window = nullptr; +} + +TEST_F(Test_MainWindow, coverage_test) +{ + ASSERT_TRUE(m_window); + + m_window->getTrayVisableItemCount(); + m_window->adjustShadowMask(); + m_window->resetDragWindow(); + m_window->onMainWindowSizeChanged(QPoint(10, 10)); + m_window->touchRequestResizeDock(); + m_window->sendNotifications(); + + m_window->callShow(); + QTest::qWait(450); + + m_window->relaodPlugins(); + QTest::qWait(100); + + QEvent enterEvent(QEvent::Enter); + qApp->sendEvent(m_window, &enterEvent); + QTest::qWait(10); + + QEvent dragEnterEvent(QEvent::Enter); + qApp->sendEvent(m_window->m_dragWidget, &dragEnterEvent); + QTest::qWait(10); + ASSERT_EQ(QApplication::overrideCursor()->shape(), m_window->m_dragWidget->cursor().shape()); + + QEvent dragLeaveEvent(QEvent::Leave); + qApp->sendEvent(m_window->m_dragWidget, &dragLeaveEvent); + QTest::qWait(10); + ASSERT_EQ(QApplication::overrideCursor()->shape(), Qt::ArrowCursor); + +// QTest::mouseClick(m_window, Qt::RightButton, Qt::NoModifier, QPoint(100 ,10)); +// QTest::qWait(10); + +// QTest::mouseClick(m_window, Qt::LeftButton, Qt::NoModifier, QPoint(0 ,0)); +// QTest::qWait(10); +}