2016年4月4日星期一

Linux 設定螢幕光度

螢幕光度通常會直接在螢幕的按鍵上設定,系統上亦可以調整螢幕光度
但具備 GUI 的 Linux 好似只有安裝在手提電腦的 Linux 發佈版才能設定螢幕光度
莫非一般桌面 Linux 不能螢幕光度 ?

Linux 本身其實都能夠設定螢幕光度,需要透過 xrandr 指令進行
輸入
xrandr
會顯示閣下電腦中能連接的螢幕,例如:VGA, DVI, HDMI, LVDS (通常為 一體機 或 手提電腦 螢幕)
已連接的螢幕會顯示為 connected
輸入
xrandr | grep -o '.\+ connected'
便可只顯示已連接的螢幕

例如閣下使用 VGA-0 要設定光度為 90%
輸入
xrandr --output VGA-0 --brightness 0.90
xrandr 設定光度基本數值為 0.00 ~ 1.00
但數值降至 0.10 實際上已經接近不能觀察
若不小心降至 0.10 以下看不到畫面,便需要按 Alt + Ctrl + F1 ~ F6 進入 tty 操作
但由於 tty 沒有 GUI ,使用 xrandr 後顯示 Can't not open display
輸入
export DISPLAY=:0.0
才能設定
xrandr --output VGA-0 --brightness 1.00
完成後按 Alt + Ctrl + F7 / F8 回到 GUI 顯示

xrandr 還能夠設定超越 100% 螢幕光度
即輸入
xrandr --output VGA-0 --brightness 1.20
亦是許可,同樣過量光度會將畫圖設定為白色,一樣不能觀察

不過每次設定光度都要輸入指令顯示有點麻煩
在下借用 zenity 來進行互動操作方便調整光度
while read b; do
    B=`echo "${b}" 100 | awk '{print $1/$2}'`
    B=`printf '%01.2f' "${B}"`
    xrandr --output VGA-0 --brightness "${B}"
done < <(zenity --scale --title="Brightness Scaler" --text='' --value=100 --step=1 --min-value=10 --max-value=100 --print-partial)
zenity 設定 Linux 光度圖示
另一個版本可以自動檢查電腦連接的螢幕數量,可以個別或所有同時設定
#!/bin/bash

MIN_VALUE='10'
MAX_VALUE='100'
AWK="{print ((\$1 < ${MIN_VALUE}) ? ${MIN_VALUE} : ((\$1 > ${MAX_VALUE}) ? ${MAX_VALUE} : \$1))}"
ALL_DISPLAYS='All Displays'
display_string=""

xrandr=`xrandr --verbose`
ds=($(echo "${xrandr}" | grep -o '.\+ connected' | sed -r 's/(.+) connected/\1/g'))
bs=($(echo "${xrandr}" | grep -o 'Brightness: [0-9]\+\.[0-9]\+' | sed -r 's/Brightness: ([0-9]+\.[0-9]+)/\1/g'))

i=0
while [ "${i}" -lt "${#ds[@]}" ]; do
    b=`echo "${bs[$i]}" "${MAX_VALUE}" | awk '{print $1*$2}'`
    b=`echo "${b}" | awk "${AWK}"`
    bs["${i}"]="${b}"
    d="${ds[$i]}"
    display_string="${display_string} false ${d}"
    i=$(($i+1))
done

while [ 1 ]; do
    d=`zenity --list --title='Select a Display' --text='' --radiolist --column '' --column 'Display' true "${ALL_DISPLAYS}" $display_string`
    if [ "$?" -eq '0' ]; then
        b="${bs[0]}"
        if [ "${d}" = "${ALL_DISPLAYS}" ]; then
            while read b; do
                bs["${i}"]="${b}"
                B=`echo "${b}" "${MAX_VALUE}" | awk '{print $1/$2}'`
                B=`printf '%01.2f' "${B}"`
                i=0
                while [ "${i}" -lt "${#ds[@]}" ]; do
                    bs["${i}"]="${b}"
                    d="${ds[$i]}"
                    xrandr --output "${d}" --brightness "${B}"
                    i=$(($i+1))
                done
            done < <(zenity --scale --title="${d} Brightness" --text='' --value="${b}" --step=1 --min-value="${MIN_VALUE}" --max-value="${MAX_VALUE}" --print-partial)
        else
            i=0
            while [ "${i}" -lt "${#ds[@]}" ]; do
                D="${ds[$i]}"
                if [ "${d}" = "${D}" ]; then
                    break
                fi
                i=$(($i+1))
            done
            b="${bs[$i]}"
            while read b; do
                bs["${i}"]="${b}"
                B=`echo "${b}" "${MAX_VALUE}" | awk '{print $1/$2}'`
                B=`printf '%01.2f' "${B}"`
                xrandr --output "${d}" --brightness "${B}"
            done < <(zenity --scale --title="${d} Brightness" --text='' --value="${b}" --step=1 --min-value="${MIN_VALUE}" --max-value="${MAX_VALUE}" --print-partial)
        fi
    else
        break
    fi
done

沒有留言 :

發佈留言