#!/bin/bash

# 定义 DPI 值数组和 get_trackbar_pos 函数
dpi_values=(96 120 144 168 192 216 240 288 336 384 432 480)

get_trackbar_pos() {
    local dpi=$1
    local len=${#dpi_values[@]}

    for (( i=0; i<len-1; i++ )); do
        local mid=$(( (dpi_values[i] + dpi_values[i+1]) / 2 ))
        if [ $mid -ge $dpi ]; then
            echo $i
            return
        fi
    done

    # 如果 DPI 大于或等于最后一个区间的起始 DPI，则返回最后一个索引
    echo $((len - 1))
}

# 尝试从 xrandr 获取屏幕尺寸
output=$(xrandr --query | grep " connected" | head -n 1)

# 提取宽度和高度（毫米）
width_mm=$(echo "$output" | grep -oP '\d+(?=mm x)' | head -n 1)
height_mm=$(echo "$output" | grep -oP '(\d+)mm' | tail -n 1 | grep -oP '^\d+')

echo "xrandr --query result: $output"

# 检查是否成功获取宽度和高度
if [[ -z "$width_mm" || -z "$height_mm" || $width_mm -eq 0 || $height_mm -eq 0 ]]; then
    # 如果 xrandr 获取失败，尝试从 xdpyinfo 获取屏幕尺寸
    echo "xrandr 获取失败，尝试从 xdpyinfo 获取屏幕尺寸"
    # 获取 xdpyinfo 输出并过滤出 dimensions 相关行
    dimensions_output=$(xdpyinfo 2>/dev/null | grep "dimensions")
    echo "$dimensions_output"

    # 检查是否成功获取到 dimensions 信息
    if [ -n "$dimensions_output" ]; then
        # 使用 awk 提取毫米宽度和高度，并去掉单位字符串
        width_mm=$(echo "$dimensions_output" | awk -F '[()]' '{split($2,a,"x"); gsub(/[^0-9]/, "", a[1]); print a[1]}')
        height_mm=$(echo "$dimensions_output" | awk -F '[()]' '{split($2,a,"x"); gsub(/[^0-9]/, "", a[2]); print a[2]}')

        if [ -n "$width_mm" ] && [ -n "$height_mm" ]; then
            # 输出提取的信息
            echo "屏幕尺寸（毫米）: ${width_mm}x${height_mm}"
        else
            echo "未能从输出中提取到有效的屏幕尺寸数据。"
            width_mm=0
            height_mm=0
        fi
    else
        echo "未能获取到 dimensions 信息，请检查 xdpyinfo 命令是否正常工作。"
        width_mm=0
        height_mm=0        
    fi
fi

# 如果成功获取了屏幕尺寸，计算 DPI
if [[ $width_mm -ne 0 && $height_mm -ne 0 ]]; then
    diagonal_mm=$(echo "sqrt($width_mm * $width_mm + $height_mm * $height_mm)" | bc -l)

    diagonal_inches=$(echo "scale=2; $diagonal_mm / 25.4" | bc)

    resolution=$(echo $output | grep -oP '\d{3,4}x\d{3,4}') # 修改正则表达式以匹配更多分辨率格式
    width_pixels=$(echo $resolution | cut -d 'x' -f 1)
    height_pixels=$(echo $resolution | cut -d 'x' -f 2)

    dpi=$(echo "scale=2; sqrt($width_pixels * $width_pixels + $height_pixels * $height_pixels) / $diagonal_inches" | bc)

    # 输出 DPI 值
    echo "DPI: $dpi"

    # 根据缩放调整DPI值
    # 尝试读取 dconf 值
    scale_factor=$(dconf read /org/ukui/settings-daemon/plugins/xsettings/scaling-factor 2>/dev/null)

    # 检查 scale_factor 是否非空且不为 0
    if [[ -n $scale_factor ]]; then
        # 使用 awk 判断浮点数是否为 0
        if awk -v sf="$scale_factor" 'BEGIN {exit !(sf != 0)}'; then
            echo "读取到的缩放因子为: $scale_factor"
            # 使用 awk 计算 DPI 除以 scale_factor
            dpi=$(awk -v dpi="$dpi" -v sf="$scale_factor" 'BEGIN {printf "%.2f", dpi / sf}')
            echo "根据缩放因子调整的DPI: $dpi"
        else
            echo "缩放因子为 0，请检查配置路径或权限。"
        fi
    else
        # 如果未读取到值，输出提示信息
        echo "缩放因子无效或为空，请检查配置路径或权限。"
    fi
else
    # 如果屏幕尺寸未正确获取，使用默认 DPI
    dpi=96
    echo "默认 DPI: $dpi"
fi

min_dpi=20
max_dpi=500

if [ $(echo "$dpi < $min_dpi" | bc) -eq 1 ]; then
    limited_dpi=$min_dpi
elif [ $(echo "$dpi > $max_dpi" | bc) -eq 1 ]; then
    limited_dpi=$max_dpi
else
    limited_dpi=$dpi
fi

rounded_dpi=$(echo "scale=0; ($limited_dpi+0.5)/1" | bc) # 四舍五入

# 使用 get_trackbar_pos 更新 rounded_dpi
pos=$(get_trackbar_pos $rounded_dpi)
rounded_dpi=${dpi_values[$pos]}
#echo "当前DPI对应的 trackbar 位置是: $pos, 对应的 DPI 值是: $rounded_dpi"

SELF=$(readlink -f "$0")
$(dirname "$SELF")/kylin-wine-internal reg add "HKEY_CURRENT_USER\\Control Panel\\Desktop" /v "LogPixels" /t REG_DWORD /d "$rounded_dpi" /f

#echo $width_pixels $height_pixels $rounded_dpi
