Skip to content

Instantly share code, notes, and snippets.

@ITJesse
Last active February 28, 2025 07:34
Show Gist options
  • Save ITJesse/44d01860ae3547e54a37d2b7795ea9a6 to your computer and use it in GitHub Desktop.
Save ITJesse/44d01860ae3547e54a37d2b7795ea9a6 to your computer and use it in GitHub Desktop.
一些 Linux 环境的自适应脚本

使用 Linux 需要很多自适应技巧,这里是我的一些日常脚本

fix-dpi.sh

修复 KDE 桌面在切换内置和外置显示器的时候应用缩放错误的问题

其实就是随便改一下缩放再改回来

罗技鼠标 Hi-res Scroll 去抖动

mouse_smoother

# 修复 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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment