使用 Linux 需要很多自适应技巧,这里是我的一些日常脚本
修复 KDE 桌面在切换内置和外置显示器的时候应用缩放错误的问题
其实就是随便改一下缩放再改回来
使用 Linux 需要很多自适应技巧,这里是我的一些日常脚本
修复 KDE 桌面在切换内置和外置显示器的时候应用缩放错误的问题
其实就是随便改一下缩放再改回来
# 修复 KDE 桌面在切换内置和外置显示器的时候应用缩放错误的问题 | |
# 其实就是随便改一下缩放再改回来 | |
#!/bin/bash | |
# 获取当前显示器信息(JSON格式) | |
get_display_info_json() { | |
kscreen-doctor -j | |
} | |
# 获取所有已连接且已启用的显示器名称 | |
get_active_displays() { | |
# 使用jq解析JSON获取所有已连接且已启用的显示器名称 | |
local displays=$(get_display_info_json | jq -r '.outputs[] | select(.connected == true and .enabled == true) | .name') | |
echo "$displays" | |
} | |
# 获取显示器的当前缩放值 | |
get_display_scale() { | |
local display_name=$1 | |
if [ -z "$display_name" ]; then | |
echo "1.0" # 默认缩放值 | |
return | |
fi | |
# 使用jq获取指定显示器的缩放值 | |
local scale=$(get_display_info_json | jq ".outputs[] | select(.name == \"$display_name\") | .scale") | |
# 如果未找到缩放值,返回默认值 | |
if [ -z "$scale" ]; then | |
echo "1.0" | |
else | |
echo "$scale" | |
fi | |
} | |
# 设置显示器缩放 | |
set_display_scale() { | |
local display_name=$1 | |
local scale=$2 | |
if [ -z "$display_name" ]; then | |
echo "显示器名称为空" | |
return 1 | |
fi | |
echo "设置显示器 $display_name 的缩放为 $scale" | |
kscreen-doctor output.$display_name.scale.$scale | |
sleep 0.5 # 设置间隔为半秒 | |
} | |
# 处理单个显示器 | |
process_display() { | |
local display_name=$1 | |
# 获取当前缩放值 | |
current_scale=$(get_display_scale "$display_name") | |
echo "显示器 $display_name 当前缩放值: $current_scale" | |
# 检查当前缩放值是否有效 | |
if [[ ! "$current_scale" =~ ^[0-9]+(\.[0-9]+)?$ ]]; then | |
echo "获取到的缩放值无效: $current_scale,使用默认值 1.0" | |
current_scale="1.0" | |
fi | |
# 计算临时缩放值 (当前值 - 0.05) | |
temp_scale=$(echo "$current_scale - 0.05" | bc) | |
# 确保临时缩放值不小于 0.5 | |
if (( $(echo "$temp_scale < 0.5" | bc -l) )); then | |
temp_scale="0.5" | |
fi | |
echo "显示器 $display_name 临时缩放值: $temp_scale" | |
# 设置临时缩放 | |
set_display_scale "$display_name" "$temp_scale" | |
# 恢复原始缩放 | |
set_display_scale "$display_name" "$current_scale" | |
echo "显示器 $display_name 缩放重置完成" | |
} | |
# 主函数 | |
main() { | |
# 检查jq是否安装 | |
if ! command -v jq &> /dev/null; then | |
echo "错误: 需要安装jq来解析JSON。请运行 'sudo apt install jq' 或相应的包管理器命令安装。" | |
exit 1 | |
fi | |
# 获取所有活动显示器 | |
active_displays=$(get_active_displays) | |
if [ -z "$active_displays" ]; then | |
echo "未找到已连接且已启用的显示器" | |
exit 1 | |
fi | |
echo "找到以下已连接且已启用的显示器:" | |
echo "$active_displays" | |
# 处理每个显示器 | |
while IFS= read -r display; do | |
if [ -n "$display" ]; then | |
process_display "$display" | |
echo "----------------------------" | |
fi | |
done <<< "$active_displays" | |
echo "所有显示器处理完成" | |
} | |
# 执行主函数 | |
main |