diff --git a/dtkwidget.cmake b/dtkwidget.cmake index 40bee3cb2..2568898ef 100644 --- a/dtkwidget.cmake +++ b/dtkwidget.cmake @@ -8,6 +8,11 @@ set(CMAKE_AUTOMOC ON) set(CMAKE_AUTORCC ON) set(CMAKE_INCLUDE_CURRENT_DIR ON) +# Export all symbols on Windows +if(WIN32 AND NOT MSVC) + set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--export-all-symbols") +endif() + message(STATUS "Current Qt Version: ${QT_VERSION_MAJOR}") message(STATUS "Current Dtk Version: ${DTK_VERSION_MAJOR}") @@ -44,7 +49,8 @@ find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Core Widgets PrintSupport LinguistTools - DBus) + DBus + Svg) find_package(PkgConfig REQUIRED) if("${QT_VERSION_MAJOR}" STREQUAL "5") diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index e1c087824..784464533 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,11 +1,13 @@ if("${QT_VERSION_MAJOR}" STREQUAL "5") pkg_check_modules(QGSettings REQUIRED IMPORTED_TARGET gsettings-qt) #Dtk6 removed. endif() -pkg_check_modules(XcbUtil REQUIRED IMPORTED_TARGET xcb-util) -pkg_check_modules(StartupNotification REQUIRED IMPORTED_TARGET libstartup-notification-1.0) -pkg_check_modules(Xext REQUIRED IMPORTED_TARGET xext) -pkg_check_modules(Xi REQUIRED IMPORTED_TARGET xi) -pkg_check_modules(X11 REQUIRED IMPORTED_TARGET x11) +if(LINUX) + pkg_check_modules(XcbUtil REQUIRED IMPORTED_TARGET xcb-util) + pkg_check_modules(StartupNotification REQUIRED IMPORTED_TARGET libstartup-notification-1.0) + pkg_check_modules(Xext REQUIRED IMPORTED_TARGET xext) + pkg_check_modules(Xi REQUIRED IMPORTED_TARGET xi) + pkg_check_modules(X11 REQUIRED IMPORTED_TARGET x11) +endif() include(util/util.cmake) include(widgets/widgets.cmake) @@ -69,6 +71,7 @@ PUBLIC Qt${QT_VERSION_MAJOR}::Core Qt${QT_VERSION_MAJOR}::DBus Qt${QT_VERSION_MAJOR}::PrintSupport + Qt${QT_VERSION_MAJOR}::Svg Dtk${DTK_NAME_SUFFIX}::Gui Dtk${DTK_NAME_SUFFIX}::Core PRIVATE @@ -76,12 +79,17 @@ PRIVATE Qt${QT_VERSION_MAJOR}::GuiPrivate Qt${QT_VERSION_MAJOR}::WidgetsPrivate Qt${QT_VERSION_MAJOR}::PrintSupportPrivate - PkgConfig::StartupNotification - PkgConfig::Xext - PkgConfig::Xi - PkgConfig::X11 - PkgConfig::XcbUtil ) +if(LINUX) + target_link_libraries(${LIB_NAME} + PRIVATE + PkgConfig::StartupNotification + PkgConfig::Xext + PkgConfig::Xi + PkgConfig::X11 + PkgConfig::XcbUtil + ) +endif() if("${QT_VERSION_MAJOR}" STREQUAL "5") target_link_libraries(${LIB_NAME} PRIVATE diff --git a/src/widgets/dimageviewer.cpp b/src/widgets/dimageviewer.cpp index 4137c4e8d..56aded2ea 100644 --- a/src/widgets/dimageviewer.cpp +++ b/src/widgets/dimageviewer.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. +// SPDX-FileCopyrightText: 2022 - 2026 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later @@ -175,7 +175,17 @@ QImage DImageViewerPrivate::loadImage(const QString &fileName, ImageType type) c case ImageTypeSvg: { DSvgRenderer render(fileName); if (render.isValid()) { +#ifdef Q_OS_LINUX image = render.toImage(render.defaultSize()); +#else + QSize sz = render.defaultSize(); + if (!sz.isEmpty()) { + image = QImage(sz, QImage::Format_ARGB32); + image.fill(Qt::transparent); + QPainter painter(&image); + render.render(&painter); + } +#endif } break; } @@ -224,7 +234,7 @@ qreal DImageViewerPrivate::validRotateAngle(qreal angle) const { // From Qt help doc: A rotation transformation of 180 degrees // and/or 360 degrees is treated as a scaling transformation. - if (qFuzzyCompare(abs(angle), 180)) { + if (qFuzzyCompare(qreal(abs(angle)), qreal(180))) { // 180 degrees needs adjustment to avoid transformation errors. return angle + (angle < 0 ? -0.00001 : 0.0001); } else { diff --git a/src/widgets/dprintpreviewdialog.cpp b/src/widgets/dprintpreviewdialog.cpp index dc5b0bffa..840bc60c4 100644 --- a/src/widgets/dprintpreviewdialog.cpp +++ b/src/widgets/dprintpreviewdialog.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2022 - 2023 UnionTech Software Technology Co., Ltd. +// SPDX-FileCopyrightText: 2022 - 2026 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later @@ -49,7 +49,9 @@ #include #include #include +#ifdef Q_OS_LINUX #include +#endif #include #include #include @@ -1350,10 +1352,18 @@ void DPrintPreviewDialogPrivate::setupPrinter() } //设置色彩打印 if (supportedColorMode) { +#ifdef Q_OS_LINUX QByteArray currentColorModel = pview->printerColorModel().isEmpty() ? QByteArrayLiteral("RGB") : pview->printerColorModel(); QCUPSSupport::setCupsOption(printer, "ColorModel", currentColorModel); +#else + Q_UNUSED(pview) +#endif } else { +#ifdef Q_OS_LINUX QCUPSSupport::setCupsOption(printer, "ColorModel", "Gray"); +#else + Q_UNUSED(printer) +#endif } //设置纸张打印边距 printer->setPageMargins(QMarginsF(marginLeftSpin->value(), marginTopSpin->value(), marginRightSpin->value(), marginBottomSpin->value()), QPageLayout::Millimeter); diff --git a/src/widgets/dprintpreviewwidget.cpp b/src/widgets/dprintpreviewwidget.cpp index b41e70b52..a9860e4ba 100644 --- a/src/widgets/dprintpreviewwidget.cpp +++ b/src/widgets/dprintpreviewwidget.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. +// SPDX-FileCopyrightText: 2022 - 2026 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later @@ -13,8 +13,10 @@ #include #include +#ifdef Q_OS_LINUX #include #include +#endif #define FIRST_PAGE 1 @@ -798,6 +800,7 @@ PrintOptions DPrintPreviewWidgetPrivate::printerOptions() void DPrintPreviewWidgetPrivate::printByCups() { +#ifdef Q_OS_LINUX // libcups2-dev libcups2 QLibrary cupsLibrary("cups", "2"); if (!cupsLibrary.isLoaded()) { @@ -834,6 +837,9 @@ void DPrintPreviewWidgetPrivate::printByCups() cupsPrintFile(printerName.toLocal8Bit().constData(), printFromPath.toLocal8Bit().constData(), previewPrinter->docName().toLocal8Bit().constData(), numOptions, optPtr); +#else + qWarning() << "CUPS printing not supported on this platform"; +#endif } void DPrintPreviewWidgetPrivate::generatePreviewPicture() @@ -965,6 +971,7 @@ void DPrintPreviewWidgetPrivate::calculateCurrentNumberPage() QByteArray DPrintPreviewWidgetPrivate::foundColorModelByCups() const { +#ifdef Q_OS_LINUX const auto parts = previewPrinter->printerName().split(QLatin1Char('/')); const auto printerOriginalName = parts.at(0); @@ -1072,6 +1079,8 @@ QByteArray DPrintPreviewWidgetPrivate::foundColorModelByCups() const } } + return {}; +#endif return {}; } diff --git a/src/widgets/private/keyboardmonitor/dkeyboardmonitor.cpp b/src/widgets/private/keyboardmonitor/dkeyboardmonitor.cpp index bc497ff64..54fbf47a3 100644 --- a/src/widgets/private/keyboardmonitor/dkeyboardmonitor.cpp +++ b/src/widgets/private/keyboardmonitor/dkeyboardmonitor.cpp @@ -1,9 +1,10 @@ -// SPDX-FileCopyrightText: 2011 - 2022 UnionTech Software Technology Co., Ltd. +// SPDX-FileCopyrightText: 2011 - 2026 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include "dkeyboardmonitor.h" +#ifdef Q_OS_LINUX #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) #include #else @@ -206,3 +207,48 @@ void DKeyboardMonitor::run() } DWIDGET_END_NAMESPACE + +#else + +// Stub implementation for non-Linux platforms +DWIDGET_BEGIN_NAMESPACE + +DKeyboardMonitor::DKeyboardMonitor() : + QThread() +{ +} + +DKeyboardMonitor *DKeyboardMonitor::instance() +{ + static DKeyboardMonitor *KeyboardMonitorInstance = nullptr; + + if (!KeyboardMonitorInstance) { + KeyboardMonitorInstance = new DKeyboardMonitor; + } + + return KeyboardMonitorInstance; +} + +bool DKeyboardMonitor::isCapslockOn() +{ + return false; +} + +bool DKeyboardMonitor::isNumlockOn() +{ + return false; +} + +bool DKeyboardMonitor::setNumlockStatus(const bool &on) +{ + Q_UNUSED(on) + return false; +} + +void DKeyboardMonitor::run() +{ +} + +DWIDGET_END_NAMESPACE + +#endif diff --git a/src/widgets/private/keyboardmonitor/dkeyboardmonitor.h b/src/widgets/private/keyboardmonitor/dkeyboardmonitor.h index acb0b72fb..2327ed887 100644 --- a/src/widgets/private/keyboardmonitor/dkeyboardmonitor.h +++ b/src/widgets/private/keyboardmonitor/dkeyboardmonitor.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2011 - 2022 UnionTech Software Technology Co., Ltd. +// SPDX-FileCopyrightText: 2011 - 2026 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later @@ -6,11 +6,13 @@ #define KEYBOARDMONITOR_H #include +#ifdef Q_OS_LINUX #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) #include #else #include #endif +#endif #include DWIDGET_BEGIN_NAMESPACE @@ -35,8 +37,9 @@ class DKeyboardMonitor : public QThread private: DKeyboardMonitor(); - +#ifdef Q_OS_LINUX int listen(Display *display); +#endif }; DWIDGET_END_NAMESPACE diff --git a/src/widgets/private/startupnotifications/startupnotificationmonitor.cpp b/src/widgets/private/startupnotifications/startupnotificationmonitor.cpp index 2b5829193..f5e09cb08 100644 --- a/src/widgets/private/startupnotifications/startupnotificationmonitor.cpp +++ b/src/widgets/private/startupnotifications/startupnotificationmonitor.cpp @@ -1,7 +1,41 @@ -// SPDX-FileCopyrightText: 2017 - 2022 UnionTech Software Technology Co., Ltd. +// SPDX-FileCopyrightText: 2017 - 2026 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later +#ifdef _WIN32 + +// Stub implementation for Windows +#include "startupnotificationmonitor.h" + +class StartupNotificationMonitorSub : public StartupNotificationMonitor +{ +}; + +Q_GLOBAL_STATIC(StartupNotificationMonitorSub, StartupNotificationMonitorInstance) + +StartupNotificationMonitor::StartupNotificationMonitor() : + QObject() +{ +} + +StartupNotificationMonitor* StartupNotificationMonitor::instance() +{ + return StartupNotificationMonitorInstance; +} + +StartupNotificationMonitor::~StartupNotificationMonitor() +{ +} + +bool StartupNotificationMonitor::nativeEventFilter(const QByteArray &eventType, void *message, qintptr *) +{ + Q_UNUSED(eventType) + Q_UNUSED(message) + return false; +} + +#else // !_WIN32 — Linux/X11 implementation + #include #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) #include @@ -129,3 +163,5 @@ bool StartupNotificationMonitor::nativeEventFilter(const QByteArray &eventType, return false; } + +#endif // !_WIN32