diff --git a/frame/item/appitem.cpp b/frame/item/appitem.cpp index 5e12a6f8d..e7b561941 100644 --- a/frame/item/appitem.cpp +++ b/frame/item/appitem.cpp @@ -24,7 +24,6 @@ #include "themeappicon.h" #include "xcb_misc.h" #include "appswingeffectbuilder.h" -#include "appspreviewprovider.h" #include "utils.h" #include @@ -333,7 +332,7 @@ void AppItem::mouseReleaseEvent(QMouseEvent *e) m_itemEntryInter->Activate(QX11Info::getTimestamp()); // play launch effect - if (m_windowInfos.isEmpty() && DGuiApplicationHelper::isSpecialEffectsEnvironment()) + if (m_windowInfos.isEmpty() && DGuiApplicationHelper::isSpecialEffectsEnvironment()) playSwingEffect(); } } @@ -640,7 +639,10 @@ void AppItem::onRefreshIcon() void AppItem::onResetPreview() { - m_appPreviewTips = nullptr; + if (m_appPreviewTips != nullptr) { + m_appPreviewTips->deleteLater(); + m_appPreviewTips = nullptr; + } } void AppItem::activeChanged() @@ -653,7 +655,11 @@ void AppItem::showPreview() if (m_windowInfos.isEmpty()) return; - m_appPreviewTips = PreviewWindow(m_windowInfos, m_itemEntryInter->GetAllowedCloseWindows().value(), DockPosition); + m_appPreviewTips = new PreviewContainer; + + m_appPreviewTips->setWindowInfos(m_windowInfos, m_itemEntryInter->GetAllowedCloseWindows().value()); + m_appPreviewTips->updateSnapshots(); + m_appPreviewTips->updateLayoutDirection(DockPosition); connect(m_appPreviewTips, &PreviewContainer::requestActivateWindow, this, &AppItem::requestActivateWindow, Qt::QueuedConnection); connect(m_appPreviewTips, &PreviewContainer::requestPreviewWindow, this, &AppItem::requestPreviewWindow, Qt::QueuedConnection); diff --git a/frame/item/components/appsnapshot.cpp b/frame/item/components/appsnapshot.cpp index cef067b7d..26b2c1e0b 100644 --- a/frame/item/components/appsnapshot.cpp +++ b/frame/item/components/appsnapshot.cpp @@ -206,8 +206,8 @@ void AppSnapshot::fetchSnapshot() uchar *image_data = nullptr; XImage *ximage = nullptr; - // wayland环境下,使用KWin提供的接口 - if (isKWinAvailable() && Utils::IS_WAYLAND_DISPLAY) { + // 优先使用窗管进行窗口截图 + if (isKWinAvailable()) { QDBusInterface interface(QStringLiteral("org.kde.KWin"), QStringLiteral("/Screenshot"), QStringLiteral("org.kde.kwin.Screenshot")); qDebug() << "windowsID:"<< m_wid; @@ -244,6 +244,7 @@ void AppSnapshot::fetchSnapshot() // get window image from XGetImage(a little slow) qDebug() << "get Image from dxcbplugin SHM failed!"; qDebug() << "get Image from Xlib..."; + // guoyao note:这里会造成内存泄漏,而且是通过demo在X环境经过验证,改用xcb库同样会有内存泄漏,这里暂时未找到解决方案,所以优先使用kwin提供的接口 ximage = getImageXlib(); if (!ximage) { qDebug() << "get Image from Xlib failed! giving up..."; @@ -342,13 +343,6 @@ void AppSnapshot::paintEvent(QPaintEvent *e) painter.drawRoundedRect(m_snapshotSrcRect, radius * ratio, radius * ratio); } -void AppSnapshot::resizeEvent(QResizeEvent *e) -{ - QWidget::resizeEvent(e); - - QTimer::singleShot(1, this, &AppSnapshot::fetchSnapshot); -} - void AppSnapshot::mousePressEvent(QMouseEvent *e) { QWidget::mousePressEvent(e); diff --git a/frame/item/components/appsnapshot.h b/frame/item/components/appsnapshot.h index dd1ab6fff..2942b166d 100644 --- a/frame/item/components/appsnapshot.h +++ b/frame/item/components/appsnapshot.h @@ -96,7 +96,6 @@ private: void enterEvent(QEvent *e) override; void leaveEvent(QEvent *e) override; void paintEvent(QPaintEvent *e) override; - void resizeEvent(QResizeEvent *e) override; void mousePressEvent(QMouseEvent *e) override; bool eventFilter(QObject *watched, QEvent *e) override; SHMInfo *getImageDSHM(); diff --git a/frame/item/components/appspreviewprovider.h b/frame/item/components/appspreviewprovider.h deleted file mode 100644 index 6104d825f..000000000 --- a/frame/item/components/appspreviewprovider.h +++ /dev/null @@ -1,22 +0,0 @@ - -#ifndef APPSPREVIEWPROVIDER_H -#define APPSPREVIEWPROVIDER_H - -#include "previewcontainer.h" - -static PreviewContainer *PreviewWindow(const WindowInfoMap &infos, const WindowList &allowClose, const Dock::Position dockPos) -{ - static PreviewContainer *preview; - if (!preview) { - preview = new PreviewContainer; - } - - preview->disconnect(); - preview->setWindowInfos(infos, allowClose); - preview->updateSnapshots(); - preview->updateLayoutDirection(dockPos); - - return preview; -} - -#endif /* APPSPREVIEWPROVIDER_H */ diff --git a/tests/item/components/ut_previewcontainer.cpp b/tests/item/components/ut_previewcontainer.cpp index cb9d48f0a..bf4b40c58 100644 --- a/tests/item/components/ut_previewcontainer.cpp +++ b/tests/item/components/ut_previewcontainer.cpp @@ -26,7 +26,6 @@ #include #include "previewcontainer.h" -#include "appspreviewprovider.h" class Test_PreviewContainer : public ::testing::Test {}; @@ -150,13 +149,3 @@ TEST_F(Test_PreviewContainer, event_test) data->deleteLater(); ASSERT_TRUE(true); } - -TEST_F(Test_PreviewContainer, PreviewWindow) -{ - WindowList list; - PreviewContainer *preview = PreviewWindow(WindowInfoMap(), list, Dock::Position::Top); - - ASSERT_TRUE(preview); - - delete preview; -}