[education/rkward] rkward: Very basic dark mode support for rkward help and output pages.

Thomas Friedrichsmeier null at kde.org
Wed Mar 30 21:31:24 BST 2022


Git commit 838353888be91b70945e9b3d13f6c5e9aa336e37 by Thomas Friedrichsmeier.
Committed on 30/03/2022 at 20:30.
Pushed by tfry into branch 'master'.

Very basic dark mode support for rkward help and output pages.

This could certainly do with some further tweaking.

M  +32   -6    rkward/pages/rkward_help.css
M  +25   -0    rkward/pages/rkward_output.css
M  +23   -2    rkward/windows/rkhtmlwindow.cpp

https://invent.kde.org/education/rkward/commit/838353888be91b70945e9b3d13f6c5e9aa336e37

diff --git a/rkward/pages/rkward_help.css b/rkward/pages/rkward_help.css
index e19000ea..f7a21ed5 100644
--- a/rkward/pages/rkward_help.css
+++ b/rkward/pages/rkward_help.css
@@ -1,10 +1,35 @@
+:root {
+  --regular-text-color: black;
+  --background-color: white;
+  --header-color: darkgray;
+  --anchor-color: #0022cc;
+}
+
+ at media (prefers-color-scheme: dark) {
+  :root {
+    --regular-text-color: white;
+    --background-color: black;
+    --header-color: darkgray;
+    --anchor-color: #3366ff;
+  }
+}
+
+body {
+	background: var(--background-color);
+	color: var(--regular-text-color);
+}
+
+a:link {
+	color: var(--anchor-color);
+}
+
 #main {
 	margin-right: 11em;
 }
 
 #main h1 {
 	font-size: 1.5em;
-	color: gray;
+	color: var(--header-color);
 	text-align: center;
 	margin-top: 1em;
 	margin-bottom: 1em;
@@ -13,7 +38,7 @@
 
 #main h2 {
 	font-size: 1.2em;
-	color: gray;
+	color: var(--header-color);
 	margin-top: 1em;
 	margin-bottom: 0.5em;
 	padding: 0;
@@ -21,7 +46,7 @@
 
 #main h3 {
 	font-size: 1.1em;
-	color: gray;
+	color: var(--header-color);
 	margin-top: 1em;
 	margin-bottom: 0em;
 	padding: 0;
@@ -30,7 +55,7 @@
 #main h4 {
 	font-size: 1em;
 	font-weight: bold;
-	color: gray;
+	color: var(--header-color);
 	margin-top: 0.5em;
 	margin-bottom: 0em;
 	padding: 0;
@@ -39,6 +64,7 @@
 #main p {
 	margin-top: 0em;
 	margin-bottom: 0.5em;
+	color: var(--text-color);
 	padding: 0;
 }
 
@@ -52,7 +78,7 @@
 
 #navigation h1 {
 	font-size: 1em;
-	color: gray;
+	color: var(--header-color);
 	margin-top: 0em;
 	margin-bottom: 0.5em;
 }
@@ -64,4 +90,4 @@
 	text-indent: -1em;
 	margin-left: 1.5em;
 	margin-right: 0.2em;
-}
\ No newline at end of file
+}
diff --git a/rkward/pages/rkward_output.css b/rkward/pages/rkward_output.css
index 086cacaa..2a113d03 100644
--- a/rkward/pages/rkward_output.css
+++ b/rkward/pages/rkward_output.css
@@ -1,3 +1,28 @@
+:root {
+  --regular-text-color: black;
+  --background-color: white;
+  --header-color: darkgray;
+  --anchor-color: #0022cc;
+}
+
+ at media (prefers-color-scheme: dark) {
+  :root {
+    --regular-text-color: white;
+    --background-color: black;
+    --header-color: darkgray;
+    --anchor-color: #3366ff;
+  }
+}
+
+body {
+	color: var(--regular-text-color);
+	background: var(--background-color);
+}
+
+a:link {
+	color: var(--anchor-color);
+}
+
 pre.code {
 	margin-left: 2em;
 }
diff --git a/rkward/windows/rkhtmlwindow.cpp b/rkward/windows/rkhtmlwindow.cpp
index d6f9d9ec..f920c86e 100644
--- a/rkward/windows/rkhtmlwindow.cpp
+++ b/rkward/windows/rkhtmlwindow.cpp
@@ -286,12 +286,13 @@ private:
 
 
 RKWebPage* RKHTMLWindow::new_window = nullptr;
-
+#include <QWebEngineScript>
+#include <QWebEngineScriptCollection>
+#include <KColorScheme>
 RKHTMLWindow::RKHTMLWindow (QWidget *parent, WindowMode mode) : RKMDIWindow (parent, RKMDIWindow::HelpWindow) {
 	RK_TRACE (APP);
 
 	current_cache_file = 0;
-
 	QVBoxLayout* layout = new QVBoxLayout (this);
 	layout->setContentsMargins (0, 0, 0, 0);
 	view = new RKWebView (this);
@@ -313,6 +314,26 @@ RKHTMLWindow::RKHTMLWindow (QWidget *parent, WindowMode mode) : RKMDIWindow (par
 	if (!QWebEngineProfile::defaultProfile ()->urlSchemeHandler ("help")) {
 		QWebEngineProfile::defaultProfile ()->installUrlSchemeHandler ("help", new RKWebEngineKIOForwarder (RKWardMainWindow::getMain()));
 	}
+	// See https://bugreports.qt.io/browse/QTBUG-89753
+	// Our CSS files try to support dark mode, automatically, but important versions of QWebEnginePage fail to honor the prefers-color-scheme selector
+	// To help those, apply the corresponding color values via javascript.
+	bool is_dark = (KColorScheme().background().color().lightnessF() < .5);
+	if (is_dark) {
+		auto p = QWebEngineProfile::defaultProfile();
+		QWebEngineScript fix_color_scheme;
+		QString id = QStringLiteral("fix_color_scheme");
+		if (p->scripts()->findScript(id).isNull()) {
+			fix_color_scheme.setName(id);
+			fix_color_scheme.setInjectionPoint(QWebEngineScript::DocumentReady);
+			fix_color_scheme.setSourceCode(QStringLiteral("function rksetcolor(name, value) { document.querySelector(':root').style.setProperty(name, value); }\n"
+									"rksetcolor('--regular-text-color', 'white');\n"
+									"rksetcolor('--background-color', 'black');\n"
+									"rksetcolor('--header-color', 'darkgray');\n"
+									"rksetcolor('--anchor-color', '#3366ff');"));
+			p->scripts()->insert(fix_color_scheme);
+		}
+		//page->setBackgroundColor(Qt::black);  // avoids brief white blink while loading, but is too risky on pages that are not dark scheme aware.
+	}
 #endif
 	layout->addWidget (findbar);
 	findbar->hide ();


More information about the rkward-tracker mailing list