diff --git a/scanslicer/main.py b/scanslicer/main.py index e3c2889..391a082 100644 --- a/scanslicer/main.py +++ b/scanslicer/main.py @@ -43,3 +43,52 @@ def _unwrap_qvariant(value): continue break return unwrapped + + +# _read_portal_dark_preference: function definition for ScanSlicer behavior. +def _read_portal_dark_preference(): + try: + from PySide6.QtDBus import QDBusConnection, QDBusInterface, QDBusMessage + except Exception: + return None + + bus = QDBusConnection.sessionBus() + if not bus.isConnected(): + return None + + iface = QDBusInterface( + "org.freedesktop.portal.Desktop", + "/org/freedesktop/portal/desktop", + "org.freedesktop.portal.Settings", + bus, + ) + if not iface.isValid(): + return None + + for method in ("ReadOne", "Read"): + reply = iface.call(method, "org.freedesktop.appearance", "color-scheme") + if reply.type() == QDBusMessage.MessageType.ErrorMessage: + continue + + args = reply.arguments() + if not args: + continue + + raw_value = _unwrap_qvariant(args[0]) + if isinstance(raw_value, dict) and "color-scheme" in raw_value: + raw_value = _unwrap_qvariant(raw_value["color-scheme"]) + if isinstance(raw_value, (list, tuple)) and raw_value: + raw_value = _unwrap_qvariant(raw_value[0]) + + try: + color_scheme = int(raw_value) + except Exception: + continue + + # XDG portal color-scheme values: + # 0 = no preference, 1 = prefer dark, 2 = prefer light + if color_scheme == 1: + return True + if color_scheme == 2: + return False + return None