使用 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 |