diff options
Diffstat (limited to 'qutebrowser/browser/webengine/darkmode.py')
-rw-r--r-- | qutebrowser/browser/webengine/darkmode.py | 188 |
1 files changed, 81 insertions, 107 deletions
diff --git a/qutebrowser/browser/webengine/darkmode.py b/qutebrowser/browser/webengine/darkmode.py index 1c6530b49..4bf6990a0 100644 --- a/qutebrowser/browser/webengine/darkmode.py +++ b/qutebrowser/browser/webengine/darkmode.py @@ -21,8 +21,8 @@ Overview of blink setting names based on the Qt version: -Qt 5.10 -------- +Qt 5.10 (UNSUPPORTED) +--------------------- First implementation, called "high contrast mode". @@ -31,16 +31,16 @@ First implementation, called "high contrast mode". - highContrastContrast (float) - highContractImagePolicy (kFilterAll/kFilterNone) -Qt 5.11, 5.12, 5.13 -------------------- +Qt 5.11, 5.12, 5.13 (UNSUPPORTED) +--------------------------------- New "smart" image policy. - Mode/Grayscale/Contrast as above - highContractImagePolicy (kFilterAll/kFilterNone/kFilterSmart [new!]) -Qt 5.14 -------- +Qt 5.14 (UNSUPPORTED) +--------------------- Renamed to "darkMode". @@ -54,8 +54,8 @@ Renamed to "darkMode". - darkModeBackgroundBrightnessThreshold (int) [new!] - darkModeImageGrayscale (float) [new!] -Qt 5.15.0 and 5.15.1 --------------------- +Qt 5.15.0 and 5.15.1 (UNSUPPORTED) +---------------------------------- "darkMode" split into "darkModeEnabled" and "darkModeInversionAlgorithm". @@ -90,6 +90,17 @@ https://chromium-review.googlesource.com/c/chromium/src/+/2232922 - Now needs to be 0 for dark and 1 for light (before: 0 no preference / 1 dark / 2 light) + +Qt 6.2 +------ + +No significant changes over 5.15.3 + +Qt 6.3 +------ + +- New IncreaseTextContrast: +https://chromium-review.googlesource.com/c/chromium/src/+/2893236 """ import os @@ -111,12 +122,9 @@ class Variant(enum.Enum): """A dark mode variant.""" - qt_511_to_513 = enum.auto() - qt_514 = enum.auto() - qt_515_0 = enum.auto() - qt_515_1 = enum.auto() qt_515_2 = enum.auto() qt_515_3 = enum.auto() + qt_63 = enum.auto() # Mapping from a colors.webpage.darkmode.algorithm setting value to @@ -128,9 +136,6 @@ _ALGORITHMS = { 'lightness-hsl': 3, # kInvertLightness 'lightness-cielab': 4, # kInvertLightnessLAB } -# kInvertLightnessLAB is not available with Qt < 5.14 -_ALGORITHMS_BEFORE_QT_514 = _ALGORITHMS.copy() -_ALGORITHMS_BEFORE_QT_514['lightness-cielab'] = _ALGORITHMS['lightness-hsl'] # Qt >= 5.15.3, based on dark_mode_settings.h _ALGORITHMS_NEW = { # 0: kSimpleInvertForTesting (not exposed) @@ -160,6 +165,11 @@ _BOOLS = { False: 'false', } +_INT_BOOLS = { + True: '1', + False: '0', +} + @dataclasses.dataclass class _Setting: @@ -229,40 +239,24 @@ class _Definition: """Get a new _Definition object with a changed attribute. NOTE: This does *not* copy the settings list. Both objects will reference the - same list. + same (immutable) tuple. """ new = copy.copy(self) setattr(new, attr, value) return new + def copy_add_setting(self, setting: _Setting) -> '_Definition': + """Get a new _Definition object with an additional setting.""" + new = copy.copy(self) + new._settings = self._settings + (setting,) # pylint: disable=protected-access + return new + # Our defaults for policy.images are different from Chromium's, so we mark it as -# mandatory setting - except on Qt 5.15.0 where we don't, so we don't get the -# workaround warning below if the setting wasn't explicitly customized. +# mandatory setting. _DEFINITIONS: MutableMapping[Variant, _Definition] = { - Variant.qt_515_3: _Definition( - # Different switch for settings - _Setting('enabled', 'forceDarkModeEnabled', _BOOLS), - _Setting('algorithm', 'InversionAlgorithm', _ALGORITHMS_NEW), - - _Setting('policy.images', 'ImagePolicy', _IMAGE_POLICIES), - _Setting('contrast', 'ContrastPercent'), - _Setting('grayscale.all', 'IsGrayScale', _BOOLS), - - _Setting('threshold.text', 'TextBrightnessThreshold'), - _Setting('threshold.background', 'BackgroundBrightnessThreshold'), - _Setting('grayscale.images', 'ImageGrayScalePercent'), - - mandatory={'enabled', 'policy.images'}, - prefix='', - switch_names={'enabled': _BLINK_SETTINGS, None: 'dark-mode-settings'}, - ), - - # Qt 5.15.1 and 5.15.2 get added below, since there are only minor differences. - - Variant.qt_515_0: _Definition( - # 'policy.images' not mandatory because it's broken + Variant.qt_515_2: _Definition( _Setting('enabled', 'Enabled', _BOOLS), _Setting('algorithm', 'InversionAlgorithm', _ALGORITHMS), @@ -275,60 +269,55 @@ _DEFINITIONS: MutableMapping[Variant, _Definition] = { _Setting('threshold.background', 'BackgroundBrightnessThreshold'), _Setting('grayscale.images', 'ImageGrayscale'), - mandatory={'enabled'}, - prefix='darkMode', + mandatory={'enabled', 'policy.images'}, + prefix='forceDarkMode', ), - Variant.qt_514: _Definition( - _Setting('algorithm', '', _ALGORITHMS), # new: kInvertLightnessLAB + Variant.qt_515_3: _Definition( + # Different switch for settings + _Setting('enabled', 'forceDarkModeEnabled', _BOOLS), + _Setting('algorithm', 'InversionAlgorithm', _ALGORITHMS_NEW), _Setting('policy.images', 'ImagePolicy', _IMAGE_POLICIES), - _Setting('contrast', 'Contrast'), - _Setting('grayscale.all', 'Grayscale', _BOOLS), + _Setting('contrast', 'ContrastPercent'), + _Setting('grayscale.all', 'IsGrayScale', _BOOLS), - _Setting('policy.page', 'PagePolicy', _PAGE_POLICIES), _Setting('threshold.text', 'TextBrightnessThreshold'), _Setting('threshold.background', 'BackgroundBrightnessThreshold'), - _Setting('grayscale.images', 'ImageGrayscale'), - - mandatory={'algorithm', 'policy.images'}, - prefix='darkMode', - ), - - Variant.qt_511_to_513: _Definition( - _Setting('algorithm', 'Mode', _ALGORITHMS_BEFORE_QT_514), - - _Setting('policy.images', 'ImagePolicy', _IMAGE_POLICIES), - _Setting('contrast', 'Contrast'), - _Setting('grayscale.all', 'Grayscale', _BOOLS), + _Setting('grayscale.images', 'ImageGrayScalePercent'), - mandatory={'algorithm', 'policy.images'}, - prefix='highContrast', + mandatory={'enabled', 'policy.images'}, + prefix='', + switch_names={'enabled': _BLINK_SETTINGS, None: 'dark-mode-settings'}, ), } -_DEFINITIONS[Variant.qt_515_1] = ( - _DEFINITIONS[Variant.qt_515_0].copy_with('mandatory', {'enabled', 'policy.images'})) -_DEFINITIONS[Variant.qt_515_2] = ( - _DEFINITIONS[Variant.qt_515_1].copy_with('prefix', 'forceDarkMode')) - - -_PREFERRED_COLOR_SCHEME_DEFINITIONS = { - # With older Qt versions, this is passed in qtargs.py as --force-dark-mode - # instead. - - ## Qt 5.15.2 - # 0: no-preference (not exposed) - (Variant.qt_515_2, "dark"): "1", - (Variant.qt_515_2, "light"): "2", - # WORKAROUND for https://bugreports.qt.io/browse/QTBUG-89753 - # Fall back to "light" instead of "no preference" (which was removed from the - # standard) - (Variant.qt_515_2, "auto"): "2", - (Variant.qt_515_2, usertypes.UNSET): "2", - - ## Qt >= 5.15.3 - (Variant.qt_515_3, "dark"): "0", - (Variant.qt_515_3, "light"): "1", +_DEFINITIONS[Variant.qt_63] = _DEFINITIONS[Variant.qt_515_3].copy_add_setting( + _Setting('increase_text_contrast', 'IncreaseTextContrast', _INT_BOOLS), +) + + +_SettingValType = Union[str, usertypes.Unset] +_PREFERRED_COLOR_SCHEME_DEFINITIONS: Mapping[Variant, Mapping[_SettingValType, str]] = { + Variant.qt_515_2: { + # 0: no-preference (not exposed) + "dark": "1", + "light": "2", + # WORKAROUND for https://bugreports.qt.io/browse/QTBUG-89753 + # Fall back to "light" instead of "no preference" (which was removed from the + # standard) + "auto": "2", + usertypes.UNSET: "2", + }, + + Variant.qt_515_3: { + "dark": "0", + "light": "1", + }, + + Variant.qt_63: { + "dark": "0", + "light": "1", + } } @@ -341,7 +330,9 @@ def _variant(versions: version.WebEngineVersions) -> Variant: except KeyError: log.init.warning(f"Ignoring invalid QUTE_DARKMODE_VARIANT={env_var}") - if (versions.webengine == utils.VersionNumber(5, 15, 2) and + if versions.webengine >= utils.VersionNumber(6, 3): + return Variant.qt_63 + elif (versions.webengine == utils.VersionNumber(5, 15, 2) and versions.chromium_major == 87): # WORKAROUND for Gentoo packaging something newer as 5.15.2... return Variant.qt_515_3 @@ -349,14 +340,6 @@ def _variant(versions: version.WebEngineVersions) -> Variant: return Variant.qt_515_3 elif versions.webengine >= utils.VersionNumber(5, 15, 2): return Variant.qt_515_2 - elif versions.webengine == utils.VersionNumber(5, 15, 1): - return Variant.qt_515_1 - elif versions.webengine == utils.VersionNumber(5, 15): - return Variant.qt_515_0 - elif versions.webengine >= utils.VersionNumber(5, 14): - return Variant.qt_514 - elif versions.webengine >= utils.VersionNumber(5, 11): - return Variant.qt_511_to_513 raise utils.Unreachable(versions.webengine) @@ -387,12 +370,11 @@ def settings( key, val = pair.split('=', maxsplit=1) result[_BLINK_SETTINGS].append((key, val)) - preferred_color_scheme_key = ( - variant, - config.instance.get("colors.webpage.preferred_color_scheme", fallback=False), - ) - if preferred_color_scheme_key in _PREFERRED_COLOR_SCHEME_DEFINITIONS: - value = _PREFERRED_COLOR_SCHEME_DEFINITIONS[preferred_color_scheme_key] + preferred_color_scheme_key = config.instance.get( + "colors.webpage.preferred_color_scheme", fallback=False) + preferred_color_scheme_defs = _PREFERRED_COLOR_SCHEME_DEFINITIONS[variant] + if preferred_color_scheme_key in preferred_color_scheme_defs: + value = preferred_color_scheme_defs[preferred_color_scheme_key] result[_BLINK_SETTINGS].append(("preferredColorScheme", value)) if not config.val.colors.webpage.darkmode.enabled: @@ -411,14 +393,6 @@ def settings( if isinstance(value, usertypes.Unset): continue - if (setting.option == 'policy.images' and value == 'smart' and - variant == Variant.qt_515_0): - # WORKAROUND for - # https://codereview.qt-project.org/c/qt/qtwebengine-chromium/+/304211 - log.init.warning("Ignoring colors.webpage.darkmode.policy.images = smart " - "because of Qt 5.15.0 bug") - continue - result[switch_name].append(setting.chromium_tuple(value)) return result |