summaryrefslogtreecommitdiff
path: root/qutebrowser/browser/webengine/darkmode.py
diff options
context:
space:
mode:
Diffstat (limited to 'qutebrowser/browser/webengine/darkmode.py')
-rw-r--r--qutebrowser/browser/webengine/darkmode.py115
1 files changed, 79 insertions, 36 deletions
diff --git a/qutebrowser/browser/webengine/darkmode.py b/qutebrowser/browser/webengine/darkmode.py
index d67aa1d29..b1b81c61e 100644
--- a/qutebrowser/browser/webengine/darkmode.py
+++ b/qutebrowser/browser/webengine/darkmode.py
@@ -1,19 +1,6 @@
-# Copyright 2020-2021 Florian Bruhin (The Compiler) <mail@qutebrowser.org>
+# SPDX-FileCopyrightText: Florian Bruhin (The Compiler) <mail@qutebrowser.org>
#
-# This file is part of qutebrowser.
-#
-# qutebrowser 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
-# (at your option) any later version.
-#
-# qutebrowser 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 qutebrowser. If not, see <https://www.gnu.org/licenses/>.
+# SPDX-License-Identifier: GPL-3.0-or-later
"""Get darkmode arguments to pass to Qt.
@@ -98,7 +85,34 @@ Qt 6.3
------
- New IncreaseTextContrast:
-https://chromium-review.googlesource.com/c/chromium/src/+/2893236
+ https://chromium-review.googlesource.com/c/chromium/src/+/2893236
+ (UNSUPPORTED because dropped in 6.5)
+
+Qt 6.4
+------
+
+- Renamed TextBrightnessThreshold to ForegroundBrightnessThreshold
+
+ "Correct brightness threshold of darkmode color classifier"
+ https://chromium-review.googlesource.com/c/chromium/src/+/3344100
+
+ "Rename text_classifier to foreground_classifier"
+ https://chromium-review.googlesource.com/c/chromium/src/+/3226389
+
+- Grayscale darkmode support removed:
+ https://chromium-review.googlesource.com/c/chromium/src/+/3238985
+
+Qt 6.5
+------
+
+- IncreaseTextContrast removed:
+ https://chromium-review.googlesource.com/c/chromium/src/+/3821841
+
+Qt 6.6
+------
+
+- New alternative image classifier:
+ https://chromium-review.googlesource.com/c/chromium/src/+/3987823
"""
import os
@@ -122,7 +136,8 @@ class Variant(enum.Enum):
qt_515_2 = enum.auto()
qt_515_3 = enum.auto()
- qt_63 = enum.auto()
+ qt_64 = enum.auto()
+ qt_66 = enum.auto()
# Mapping from a colors.webpage.darkmode.algorithm setting value to
@@ -149,6 +164,15 @@ _IMAGE_POLICIES = {
'always': 0, # kFilterAll
'never': 1, # kFilterNone
'smart': 2, # kFilterSmart
+ 'smart-simple': 2, # kFilterSmart
+}
+
+# Using the colors.webpage.darkmode.policy.images setting, shared with _IMAGE_POLICIES
+_IMAGE_CLASSIFIERS = {
+ 'always': None,
+ 'never': None,
+ 'smart': 0, # kNumColorsWithMlFallback
+ 'smart-simple': 1, # kTransparencyAndNumColors
}
# Mapping from a colors.webpage.darkmode.policy.page setting value to
@@ -176,14 +200,17 @@ class _Setting:
option: str
chromium_key: str
- mapping: Optional[Mapping[Any, Union[str, int]]] = None
+ mapping: Optional[Mapping[Any, Union[str, int, None]]] = None
def _value_str(self, value: Any) -> str:
if self.mapping is None:
return str(value)
return str(self.mapping[value])
- def chromium_tuple(self, value: Any) -> Tuple[str, str]:
+ def chromium_tuple(self, value: Any) -> Optional[Tuple[str, str]]:
+ """Get the Chromium key and value, or None if no value should be set."""
+ if self.mapping is not None and self.mapping[value] is None:
+ return None
return self.chromium_key, self._value_str(value)
def with_prefix(self, prefix: str) -> '_Setting':
@@ -249,6 +276,20 @@ class _Definition:
new._settings = self._settings + (setting,) # pylint: disable=protected-access
return new
+ def copy_replace_setting(self, option: str, chromium_key: str) -> '_Definition':
+ """Get a new _Definition object with `old` replaced by `new`.
+
+ If `old` is not in the settings list, return the old _Definition object.
+ """
+ new = copy.deepcopy(self)
+
+ for setting in new._settings: # pylint: disable=protected-access
+ if setting.option == option:
+ setting.chromium_key = chromium_key
+ return new
+
+ raise ValueError(f"Setting {option} not found in {self}")
+
# Our defaults for policy.images are different from Chromium's, so we mark it as
# mandatory setting.
@@ -260,12 +301,10 @@ _DEFINITIONS: MutableMapping[Variant, _Definition] = {
_Setting('policy.images', 'ImagePolicy', _IMAGE_POLICIES),
_Setting('contrast', 'Contrast'),
- _Setting('grayscale.all', 'Grayscale', _BOOLS),
_Setting('policy.page', 'PagePolicy', _PAGE_POLICIES),
- _Setting('threshold.text', 'TextBrightnessThreshold'),
+ _Setting('threshold.foreground', 'TextBrightnessThreshold'),
_Setting('threshold.background', 'BackgroundBrightnessThreshold'),
- _Setting('grayscale.images', 'ImageGrayscale'),
mandatory={'enabled', 'policy.images'},
prefix='forceDarkMode',
@@ -278,24 +317,25 @@ _DEFINITIONS: MutableMapping[Variant, _Definition] = {
_Setting('policy.images', 'ImagePolicy', _IMAGE_POLICIES),
_Setting('contrast', 'ContrastPercent'),
- _Setting('grayscale.all', 'IsGrayScale', _BOOLS),
- _Setting('threshold.text', 'TextBrightnessThreshold'),
+ _Setting('threshold.foreground', 'TextBrightnessThreshold'),
_Setting('threshold.background', 'BackgroundBrightnessThreshold'),
- _Setting('grayscale.images', 'ImageGrayScalePercent'),
mandatory={'enabled', 'policy.images'},
prefix='',
switch_names={'enabled': _BLINK_SETTINGS, None: 'dark-mode-settings'},
),
}
-_DEFINITIONS[Variant.qt_63] = _DEFINITIONS[Variant.qt_515_3].copy_add_setting(
- _Setting('increase_text_contrast', 'IncreaseTextContrast', _INT_BOOLS),
+_DEFINITIONS[Variant.qt_64] = _DEFINITIONS[Variant.qt_515_3].copy_replace_setting(
+ 'threshold.foreground', 'ForegroundBrightnessThreshold',
+)
+_DEFINITIONS[Variant.qt_66] = _DEFINITIONS[Variant.qt_64].copy_add_setting(
+ _Setting('policy.images', 'ImageClassifierPolicy', _IMAGE_CLASSIFIERS),
)
_SettingValType = Union[str, usertypes.Unset]
-_PREFERRED_COLOR_SCHEME_DEFINITIONS: Mapping[Variant, Mapping[_SettingValType, str]] = {
+_PREFERRED_COLOR_SCHEME_DEFINITIONS: MutableMapping[Variant, Mapping[_SettingValType, str]] = {
Variant.qt_515_2: {
# 0: no-preference (not exposed)
"dark": "1",
@@ -311,12 +351,11 @@ _PREFERRED_COLOR_SCHEME_DEFINITIONS: Mapping[Variant, Mapping[_SettingValType, s
"dark": "0",
"light": "1",
},
-
- Variant.qt_63: {
- "dark": "0",
- "light": "1",
- }
}
+for darkmode_variant in Variant:
+ if darkmode_variant not in _PREFERRED_COLOR_SCHEME_DEFINITIONS:
+ _PREFERRED_COLOR_SCHEME_DEFINITIONS[darkmode_variant] = \
+ _PREFERRED_COLOR_SCHEME_DEFINITIONS[Variant.qt_515_3]
def _variant(versions: version.WebEngineVersions) -> Variant:
@@ -328,8 +367,10 @@ def _variant(versions: version.WebEngineVersions) -> Variant:
except KeyError:
log.init.warning(f"Ignoring invalid QUTE_DARKMODE_VARIANT={env_var}")
- if versions.webengine >= utils.VersionNumber(6, 3):
- return Variant.qt_63
+ if versions.webengine >= utils.VersionNumber(6, 6):
+ return Variant.qt_66
+ elif versions.webengine >= utils.VersionNumber(6, 4):
+ return Variant.qt_64
elif (versions.webengine == utils.VersionNumber(5, 15, 2) and
versions.chromium_major == 87):
# WORKAROUND for Gentoo packaging something newer as 5.15.2...
@@ -391,6 +432,8 @@ def settings(
if isinstance(value, usertypes.Unset):
continue
- result[switch_name].append(setting.chromium_tuple(value))
+ chromium_tuple = setting.chromium_tuple(value)
+ if chromium_tuple is not None:
+ result[switch_name].append(chromium_tuple)
return result