diff --git a/spark-webapp-runtime/main.cpp b/spark-webapp-runtime/main.cpp index 4eba78b..8f9ca87 100644 --- a/spark-webapp-runtime/main.cpp +++ b/spark-webapp-runtime/main.cpp @@ -4,10 +4,11 @@ */ #include "application.h" #include "mainwindow.h" -#include "globaldefine.h" +#include "webengineview.h" #include "httpd.h" #include <DSysInfo> +#include <DApplicationSettings> #include <QCommandLineParser> #include <QCommandLineOption> @@ -50,6 +51,9 @@ int main(int argc, char *argv[]) } Application a(fakeArgc, fakeArgv.data()); + // 保存 DTK 主题 + DApplicationSettings settings; + // 解析命令行启动参数 QCommandLineParser parser; @@ -255,12 +259,14 @@ int main(int argc, char *argv[]) toUseGPU = parser.value(useGPU).toUInt(); } if (toUseGPU == true) { - qputenv("QTWEBENGINE_CHROMIUM_FLAGS", "--ignore-gpu-blocklist --enable-gpu-rasterization --enable-native-gpu-memory-buffers --enable-accelerated-video-decode --blink-settings=darkMode=4,darkModeImagePolicy=2"); + qputenv("QTWEBENGINE_CHROMIUM_FLAGS", "--ignore-gpu-blocklist --enable-gpu-rasterization --enable-native-gpu-memory-buffers --enable-accelerated-video-decode"); #ifdef __sw_64__ - qputenv("QTWEBENGINE_CHROMIUM_FLAGS", "--ignore-gpu-blocklist --enable-gpu-rasterization --enable-native-gpu-memory-buffers --enable-accelerated-video-decode --blink-settings=darkMode=4,darkModeImagePolicy=2 --no-sandbox"); + qputenv("QTWEBENGINE_CHROMIUM_FLAGS", "--ignore-gpu-blocklist --enable-gpu-rasterization --enable-native-gpu-memory-buffers --enable-accelerated-video-decode --no-sandbox"); #endif qDebug() << "Setting GPU to True."; } + // 初始化 QtWebEngine 深色模式环境变量 + WebEngineView::handleChromiumFlags(); #if SSL_SERVER if (parser.isSet(optSSLPort)) { diff --git a/spark-webapp-runtime/webengineview.cpp b/spark-webapp-runtime/webengineview.cpp index dc25354..6fa3ed8 100644 --- a/spark-webapp-runtime/webengineview.cpp +++ b/spark-webapp-runtime/webengineview.cpp @@ -1,20 +1,53 @@ #include "webengineview.h" //#include "webengineurlrequestinterceptor.h" +#include <DGuiApplicationHelper> + #include <QWebEngineSettings> #include <QWebEngineProfile> #include <QLocale> +DGUI_USE_NAMESPACE + WebEngineView::WebEngineView(QWidget *parent) : QWebEngineView(parent) // , interceptor(new WebEngineUrlRequestInterceptor(this)) { - // page()->profile()->setHttpUserAgent(page()->profile()->httpUserAgent() + " MediaFeature/prefers-color-scheme:dark"); - connect(this, &WebEngineView::urlChanged, this, [=]() { // page()->setUrlRequestInterceptor(interceptor); // page()->settings()->setAttribute(QWebEngineSettings::WebAttribute::LocalContentCanAccessRemoteUrls, true); page()->profile()->setHttpAcceptLanguage(QLocale::system().name()); - // qInfo() << "User Agent:" << page()->profile()->httpUserAgent(); }); } + +void WebEngineView::handleChromiumFlags() +{ + DGuiApplicationHelper::ColorType themeType = DGuiApplicationHelper::instance()->themeType(); + + QString env = qgetenv("QTWEBENGINE_CHROMIUM_FLAGS"); + QStringList flags = env.split(" ", QString::SkipEmptyParts); + + /** + * --blink-settings=preferredColorScheme=0 强制 prefers-color-scheme=dark (>= 5.14) + * --blink-settings=darkModeEnabled=true,darkModeInversionAlgorithm=4 强制反转网页颜色 (>= 5.14 && < 5.15) + * --blink-settings=forceDarkModeEnabled=true,darkModeInversionAlgorithm=4 强制反转网页颜色 (>= 5.15) + * --force-dark-mode 强制 prefers-color-scheme=dark (>= 5.14) + */ + foreach (const QString &flag, flags) { + if (flag == "--force-dark-mode") { + flags.removeAll(flag); + } + if (flag.startsWith("--blink-settings")) { + flags.removeAll(flag); + } + } + + if (themeType == DGuiApplicationHelper::DarkType) { + flags.append("--blink-settings=preferredColorScheme=0"); + } else { + flags.append("--blink-settings=preferredColorScheme=1"); + } + qputenv("QTWEBENGINE_CHROMIUM_FLAGS", flags.join(" ").toUtf8()); + + qDebug() << Q_FUNC_INFO << "QTWEBENGINE_CHROMIUM_FLAGS=" + qgetenv("QTWEBENGINE_CHROMIUM_FLAGS"); +} diff --git a/spark-webapp-runtime/webengineview.h b/spark-webapp-runtime/webengineview.h index 4ca48b2..b688fd6 100644 --- a/spark-webapp-runtime/webengineview.h +++ b/spark-webapp-runtime/webengineview.h @@ -11,6 +11,8 @@ class WebEngineView : public QWebEngineView public: explicit WebEngineView(QWidget *parent = nullptr); + static void handleChromiumFlags(); + private: // WebEngineUrlRequestInterceptor *interceptor = nullptr; }; diff --git a/spark-webapp-runtime/widget.cpp b/spark-webapp-runtime/widget.cpp index 482d457..afff924 100644 --- a/spark-webapp-runtime/widget.cpp +++ b/spark-webapp-runtime/widget.cpp @@ -13,37 +13,8 @@ Widget::Widget(QString szUrl, QWidget *parent) , mainLayout(new QStackedLayout(this)) , m_szUrl(szUrl) { - m_spinner->setFixedSize(96, 96); - - m_webEngineView->setObjectName(QStringLiteral("webEngineView")); - m_webEngineView->setEnabled(true); - m_webEngineView->setAutoFillBackground(false); - - DApplication *dApp = qobject_cast<DApplication *>(qApp); - m_webEngineView->setZoomFactor(dApp->devicePixelRatio()); - - WebEnginePage *page = new WebEnginePage(m_webEngineView); - m_webEngineView->setPage(page); - - page->setUrl(QUrl()); - if (!m_szUrl.isEmpty()) { - page->setUrl(QUrl(m_szUrl)); - } - - QWidget *spinnerWidget = new QWidget(this); - QHBoxLayout *spinnerLayout = new QHBoxLayout(spinnerWidget); - spinnerLayout->setMargin(0); - spinnerLayout->setSpacing(0); - spinnerLayout->setAlignment(Qt::AlignCenter); - spinnerLayout->addStretch(); - spinnerLayout->addWidget(m_spinner); - spinnerLayout->addStretch(); - - mainLayout->addWidget(spinnerWidget); - mainLayout->addWidget(m_webEngineView); - - connect(m_webEngineView, &QWebEngineView::loadStarted, this, &Widget::on_loadStarted); - connect(m_webEngineView, &QWebEngineView::loadFinished, this, &Widget::on_loadFinished); + initUI(); + initConnections(); } Widget::~Widget() @@ -70,6 +41,63 @@ void Widget::refresh() m_webEngineView->reload(); } +void Widget::initUI() +{ + m_spinner->setFixedSize(96, 96); + + DApplication *dApp = qobject_cast<DApplication *>(qApp); + m_webEngineView->setZoomFactor(dApp->devicePixelRatio()); + + WebEnginePage *page = new WebEnginePage(m_webEngineView); + m_webEngineView->setPage(page); + + page->setUrl(QUrl()); + if (!m_szUrl.isEmpty()) { + page->setUrl(QUrl(m_szUrl)); + } + + QWidget *spinnerWidget = new QWidget(this); + QHBoxLayout *spinnerLayout = new QHBoxLayout(spinnerWidget); + spinnerLayout->setMargin(0); + spinnerLayout->setSpacing(0); + spinnerLayout->setAlignment(Qt::AlignCenter); + spinnerLayout->addStretch(); + spinnerLayout->addWidget(m_spinner); + spinnerLayout->addStretch(); + + mainLayout->addWidget(spinnerWidget); + mainLayout->addWidget(m_webEngineView); +} + +void Widget::initConnections() +{ + connect(m_webEngineView, &QWebEngineView::loadStarted, this, &Widget::on_loadStarted, Qt::UniqueConnection); + connect(m_webEngineView, &QWebEngineView::loadFinished, this, &Widget::on_loadFinished, Qt::UniqueConnection); + + // FIXME: DTK 主题切换时,动态修改 QtWebEngine prefers-color-scheme + // connect(DGuiApplicationHelper::instance(), &DGuiApplicationHelper::paletteTypeChanged, this, &Widget::slotPaletteTypeChanged, Qt::UniqueConnection); +} + +void Widget::updateLayout() +{ + on_loadStarted(); + + mainLayout->removeWidget(m_webEngineView); + QUrl url = m_webEngineView->url(); + m_webEngineView->deleteLater(); + + m_webEngineView = new WebEngineView(this); + mainLayout->addWidget(m_webEngineView); + initConnections(); + + DApplication *dApp = qobject_cast<DApplication *>(qApp); + m_webEngineView->setZoomFactor(dApp->devicePixelRatio()); + + WebEnginePage *page = new WebEnginePage(m_webEngineView); + m_webEngineView->setPage(page); + page->setUrl(url); +} + void Widget::on_loadStarted() { mainLayout->setCurrentIndex(0); @@ -81,3 +109,13 @@ void Widget::on_loadFinished() m_spinner->stop(); mainLayout->setCurrentIndex(1); } + +void Widget::slotPaletteTypeChanged(DGuiApplicationHelper::ColorType paletteType) +{ + Q_UNUSED(paletteType) + + WebEngineView::handleChromiumFlags(); + if (m_webEngineView) { + updateLayout(); + } +} diff --git a/spark-webapp-runtime/widget.h b/spark-webapp-runtime/widget.h index c128dbc..2ed7ee2 100644 --- a/spark-webapp-runtime/widget.h +++ b/spark-webapp-runtime/widget.h @@ -2,12 +2,14 @@ #define WIDGET_H #include <DSpinner> +#include <DGuiApplicationHelper> #include <QWidget> #include <QWebEnginePage> #include <QStackedLayout> DWIDGET_USE_NAMESPACE +DGUI_USE_NAMESPACE class WebEngineView; class Widget : public QWidget @@ -23,10 +25,17 @@ public: void goForward(); void refresh(); +private: + void initUI(); + void initConnections(); + void updateLayout(); + private slots: void on_loadStarted(); void on_loadFinished(); + void slotPaletteTypeChanged(DGuiApplicationHelper::ColorType paletteType); + private: WebEngineView *m_webEngineView = nullptr; DSpinner *m_spinner = nullptr;