diff options
Diffstat (limited to 'qutebrowser/browser/webengine/darkmode.py')
-rw-r--r-- | qutebrowser/browser/webengine/darkmode.py | 115 |
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 |