Replace darkmode version by variant

This commit is contained in:
Florian Bruhin 2020-10-19 14:13:27 +02:00
parent 860e36a853
commit 485f67b124
2 changed files with 41 additions and 38 deletions

View File

@ -86,7 +86,9 @@ from qutebrowser.config import config
from qutebrowser.utils import usertypes, qtutils, utils, log
class Version(enum.Enum):
class Variant(enum.Enum):
"""A dark mode variant."""
unavailable = -1
qt_510 = 0
@ -161,9 +163,9 @@ _QT_514_SETTINGS = [
# workaround warning below if the setting wasn't explicitly customized.
_DARK_MODE_DEFINITIONS = {
Version.unavailable: ([], set()),
Variant.unavailable: ([], set()),
Version.qt_515_2: ([
Variant.qt_515_2: ([
# 'darkMode' renamed to 'forceDarkMode'
('enabled', 'forceDarkModeEnabled', _BOOLS),
('algorithm', 'forceDarkModeInversionAlgorithm', _ALGORITHMS),
@ -182,7 +184,7 @@ _DARK_MODE_DEFINITIONS = {
('grayscale.images', 'forceDarkModeImageGrayscale', None),
], {'enabled', 'policy.images'}),
Version.qt_515_1: ([
Variant.qt_515_1: ([
# 'policy.images' mandatory again
('enabled', 'darkModeEnabled', _BOOLS),
('algorithm', 'darkModeInversionAlgorithm', _ALGORITHMS),
@ -197,7 +199,7 @@ _DARK_MODE_DEFINITIONS = {
('grayscale.images', 'darkModeImageGrayscale', None),
], {'enabled', 'policy.images'}),
Version.qt_515_0: ([
Variant.qt_515_0: ([
# 'policy.images' not mandatory because it's broken
('enabled', 'darkModeEnabled', _BOOLS),
('algorithm', 'darkModeInversionAlgorithm', _ALGORITHMS),
@ -212,7 +214,7 @@ _DARK_MODE_DEFINITIONS = {
('grayscale.images', 'darkModeImageGrayscale', None),
], {'enabled'}),
Version.qt_514: ([
Variant.qt_514: ([
('algorithm', 'darkMode', _ALGORITHMS), # new: kInvertLightnessLAB
('policy.images', 'darkModeImagePolicy', _IMAGE_POLICIES),
@ -225,7 +227,7 @@ _DARK_MODE_DEFINITIONS = {
('grayscale.images', 'darkModeImageGrayscale', None),
], {'algorithm', 'policy.images'}),
Version.qt_511_to_513: ([
Variant.qt_511_to_513: ([
('algorithm', 'highContrastMode', _ALGORITHMS_BEFORE_QT_514),
('policy.images', 'highContrastImagePolicy', _IMAGE_POLICIES), # new: smart
@ -233,42 +235,43 @@ _DARK_MODE_DEFINITIONS = {
('grayscale.all', 'highContrastGrayscale', _BOOLS),
], {'algorithm', 'policy.images'}),
Version.qt_510: ([
Variant.qt_510: ([
('algorithm', 'highContrastMode', _ALGORITHMS_BEFORE_QT_514),
('policy.images', 'highContrastImagePolicy', _IMAGE_POLICIES_QT_510),
('contrast', 'highContrastContrast', None),
('grayscale.all', 'highContrastGrayscale', _BOOLS),
], {'algorithm'}),
} # type: typing.Mapping[Version, _DarkModeDefinitionType]
} # type: typing.Mapping[Variant, _DarkModeDefinitionType]
def _version() -> Version:
"""Get the dark mode version based on the underlying Qt version."""
def _variant() -> Variant:
"""Get the dark mode variant based on the underlying Qt version."""
if PYQT_WEBENGINE_VERSION is not None:
# Available with Qt >= 5.13
if PYQT_WEBENGINE_VERSION >= 0x050f02:
return Version.qt_515_2
return Variant.qt_515_2
elif PYQT_WEBENGINE_VERSION == 0x050f01:
return Version.qt_515_1
return Variant.qt_515_1
elif PYQT_WEBENGINE_VERSION == 0x050f00:
return Version.qt_515_0
return Variant.qt_515_0
elif PYQT_WEBENGINE_VERSION >= 0x050e00:
return Version.qt_514
return Variant.qt_514
elif PYQT_WEBENGINE_VERSION >= 0x050d00:
return Version.qt_511_to_513
return Variant.qt_511_to_513
raise utils.Unreachable(hex(PYQT_WEBENGINE_VERSION))
# If we don't have PYQT_WEBENGINE_VERSION, we'll need to assume based on the Qt
# version.
assert not qtutils.version_check('5.13', compiled=False) # type: ignore[unreachable]
assert not qtutils.version_check('5.13',
compiled=False) # type: ignore[unreachable]
if qtutils.version_check('5.11', compiled=False):
return Version.qt_511_to_513
return Variant.qt_511_to_513
elif qtutils.version_check('5.10', compiled=False):
return Version.qt_510
return Variant.qt_510
return Version.unavailable
return Variant.unavailable
def settings() -> typing.Iterator[typing.Tuple[str, str]]:
@ -276,8 +279,8 @@ def settings() -> typing.Iterator[typing.Tuple[str, str]]:
if not config.val.colors.webpage.darkmode.enabled:
return
version = _version()
settings, mandatory_settings = _DARK_MODE_DEFINITIONS[version]
variant = _variant()
settings, mandatory_settings = _DARK_MODE_DEFINITIONS[variant]
for setting, key, mapping in settings:
# To avoid blowing up the commandline length, we only pass modified
@ -291,7 +294,7 @@ def settings() -> typing.Iterator[typing.Tuple[str, str]]:
continue
if (setting == 'policy.images' and value == 'smart' and
version == Version.qt_515_0):
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 "

View File

@ -54,8 +54,8 @@ def patch_backend(monkeypatch):
def test_basics(config_stub, monkeypatch, settings, expected):
for k, v in settings.items():
config_stub.set_obj('colors.webpage.darkmode.' + k, v)
monkeypatch.setattr(darkmode, '_version',
lambda: darkmode.Version.qt_515_2)
monkeypatch.setattr(darkmode, '_variant',
lambda: darkmode.Variant.qt_515_2)
if expected:
expected.append(('forceDarkModeImagePolicy', '2'))
@ -143,7 +143,7 @@ def test_qt_version_differences(config_stub, monkeypatch, qversion, expected):
def test_customization(config_stub, monkeypatch, setting, value, exp_key, exp_val):
config_stub.val.colors.webpage.darkmode.enabled = True
config_stub.set_obj('colors.webpage.darkmode.' + setting, value)
monkeypatch.setattr(darkmode, '_version', lambda: darkmode.Version.qt_515_2)
monkeypatch.setattr(darkmode, '_variant', lambda: darkmode.Variant.qt_515_2)
expected = []
expected.append(('forceDarkModeEnabled', 'true'))
@ -156,23 +156,23 @@ def test_customization(config_stub, monkeypatch, setting, value, exp_key, exp_va
@pytest.mark.parametrize('qversion, webengine_version, expected', [
# Without PYQT_WEBENGINE_VERSION
('5.9.9', None, darkmode.Version.unavailable),
('5.10.1', None, darkmode.Version.qt_510),
('5.11.3', None, darkmode.Version.qt_511_to_513),
('5.12.9', None, darkmode.Version.qt_511_to_513),
('5.9.9', None, darkmode.Variant.unavailable),
('5.10.1', None, darkmode.Variant.qt_510),
('5.11.3', None, darkmode.Variant.qt_511_to_513),
('5.12.9', None, darkmode.Variant.qt_511_to_513),
# With PYQT_WEBENGINE_VERSION
(None, 0x050d00, darkmode.Version.qt_511_to_513),
(None, 0x050e00, darkmode.Version.qt_514),
(None, 0x050f00, darkmode.Version.qt_515_0),
(None, 0x050f01, darkmode.Version.qt_515_1),
(None, 0x050f02, darkmode.Version.qt_515_2),
(None, 0x060000, darkmode.Version.qt_515_2), # Qt 6
(None, 0x050d00, darkmode.Variant.qt_511_to_513),
(None, 0x050e00, darkmode.Variant.qt_514),
(None, 0x050f00, darkmode.Variant.qt_515_0),
(None, 0x050f01, darkmode.Variant.qt_515_1),
(None, 0x050f02, darkmode.Variant.qt_515_2),
(None, 0x060000, darkmode.Variant.qt_515_2), # Qt 6
])
def test_version(monkeypatch, qversion, webengine_version, expected):
def test_variant(monkeypatch, qversion, webengine_version, expected):
monkeypatch.setattr(darkmode.qtutils, 'qVersion', lambda: qversion)
monkeypatch.setattr(darkmode, 'PYQT_WEBENGINE_VERSION', webengine_version)
assert darkmode._version() == expected
assert darkmode._variant() == expected
def test_broken_smart_images_policy(config_stub, monkeypatch, caplog):
config_stub.val.colors.webpage.darkmode.enabled = True