import subprocess
import re


def get_gnome_scale() -> float:
    """
    优先通过 GNOME gsettings 获取缩放比例
    返回值例如：1.0, 2.0
    """
    try:
        result = subprocess.check_output(
            ["gsettings", "get", "org.gnome.desktop.interface", "scaling-factor"],
            universal_newlines=True
        ).strip()
        if result.startswith("uint32"):
            val = int(result.split()[-1])
            return float(val)
    except Exception:
        pass
    return 1.0


def get_xrandr_scale() -> float:
    """
    在 X11 环境下（非 GNOME）通过 xrandr 推算缩放比
    计算逻辑：实际DPI / 标准96dpi
    """
    try:
        output = subprocess.check_output(['xrandr'], universal_newlines=True)
        match_res = re.search(r'current (\d+) x (\d+)', output)
        match_phys = re.search(r'(\d+)mm x (\d+)mm', output)
        if match_res and match_phys:
            px_w, px_h = map(int, match_res.groups())
            mm_w, mm_h = map(int, match_phys.groups())
            dpi_x = px_w / (mm_w / 25.4)
            scale = round(dpi_x / 96, 2)
            return scale
    except Exception:
        pass
    return 1.0


def get_display_scale() -> float:
    """
    自动检测 Ubuntu 桌面显示缩放比例（支持 GNOME、X11）
    """
    scale = get_gnome_scale()
    if scale == 1.0:
        scale = get_xrandr_scale()
    return scale


if __name__ == "__main__":
    scale = get_display_scale()
    print(f"检测到系统显示缩放比例：{scale}x")


# export DISPLAY=:0
# Environment=DISPLAY=:0
# Environment=DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus