清明假期没有安排,想到折腾一下我的系统,让它使用更顺手。今天的主题是屏幕背光,因为它对电池使用时间有很大影响,而我又不想每次都手工调整。如果能像在Windows下一样拔掉电源的时候自动降低背光就好了。这个问题对于使用Fedora或Ubuntu的用户来说可能不是一个问题,但对于我们万事靠自己的Archer来说,勤劳的双手才是解决问题的唯一办法。好在前人教导我们:Where there's a wish, there's a way!下面开始正题。

我们知道电源的插入/拔出会导致ACPI事件。事实上很多其他动作也会导致ACPI事件,比如音量变化,睡眠,静音等。可以说一切与电源消耗相关的动作都会导致ACPI事件。有了这个基础,我们只需要监听ACPI事件,并在事件中进行相关操作,就可以达到目的。

古人云授人以鱼不如授人以渔,所以在此多花篇幅说说我自己是怎么寻找解决问题的办法的,而不单单是记录怎么做,希望对像我一样的新手有所启发。

首先从AUR安装acpid包,它是我们监听ACPI事件的基础(别问我是怎么知道这个的,知识靠积累)。

1 yaourt -S acpid

虽然yaourt应该是Archer必须了解的基础,但还是多嘴一句,如果还不知道yaourt是什么,请参考Arch Wiki

安装后设置为随系统启动,并马上开启它:

sudo systemctl enable acpid.service
sudo systemctl start acpid.service

下面来看看acpid的基本工作方式。完整的acpid说明可以从这里看到,简要说明一下我们需要使用的部分。

从/etc/acpi/handler.sh中可以看到这样的代码

   ac_adapter)
        case "$2" in
            AC|ACAD|ADP0)
                case "$4" in
                    00000000)
                        logger 'AC unpluged'
                        ;;
                    00000001)
                        logger 'AC pluged'
                        ;;
                esac
                ;;
            *)
                logger "ACPI action undefined: $2"
                ;;
        esac
        ;;

我很天真地期待它可以直接解决我的问题,但可惜不能。因为不同型号的电脑产生的事件并不完全一样,我的是Thinkpad T420s。让我们看看日志中到底发生了什么。

tail -f /var/log/messages.log

Apr 4 21:39:24 LARRY logger: ACPI action undefined: ACPI0003:00
Apr 4 21:39:24 LARRY logger: ACPI group/action undefined: ibm/hotkey / LEN0068:00 / 00000080 / 00006040
Apr 4 21:39:24 LARRY logger: ACPI group/action undefined: ibm/hotkey / LEN0068:00 / 00000080 / 00006030
Apr 4 21:39:24 LARRY logger: ACPI group/action undefined: thermal_zone / LNXTHERM:00 / 00000081 / 00000000
Apr 4 21:39:24 LARRY logger: ACPI action undefined: PNP0C0A:01
Apr 4 21:39:26 LARRY logger: ACPI action undefined: ACPI0003:00
Apr 4 21:39:26 LARRY logger: ACPI group/action undefined: ibm/hotkey / LEN0068:00 / 00000080 / 00006040
Apr 4 21:39:26 LARRY logger: ACPI group/action undefined: ibm/hotkey / LEN0068:00 / 00000080 / 00006030
Apr 4 21:39:26 LARRY logger: ACPI group/action undefined: thermal_zone / LNXTHERM:00 / 00000081 / 00000000
Apr 4 21:39:26 LARRY logger: ACPI action undefined: PNP0C0A:01

注意其中这句

Apr 4 21:39:24 LARRY logger: ACPI action undefined: ACPI0003:00

它对应了我们在上面handler.sh中看到的

logger "ACPI action undefined: $2"

当然其他每节中都有出现这句话,所以我们还不能肯定那一堆case是否真的走进了我们的ac_adapter里面。所以我们需要看看每次事件到底都发生了些什么。在handler.sh文件尾加上日志:

logger "acpi event: $1 / $2 / $3 /$4"

保存后再次插入/拔下电源,这会产生几个不同的ACPI事件,用你精细的双眼可以找到

Apr  4 21:48:26 LARRY logger: acpi event: ac_adapter / ACPI0003:00 / 00000080 /00000001

可见$1是正确的ac_adapter,但$2却是ACPI0003:00,这就是没有走进正确分支的原凶。了解了这些,解决就简单了。把原来的这部分稍做修改

        case "$2" in
            #AC|ACAD|ADP0)
            AC|ACAD|ADP0|ACPI0003:00)

成功走进正确的分支。如果再次监控事件,应该可以看到

Apr  4 21:46:36 LARRY logger: AC unpluged
Apr  4 21:46:38 LARRY logger: AC pluged

下面就简单了,参考Arch Wiki关于背光的部分,我们可以对handler.sh稍做修改:

    ac_adapter)
        case "$2" in
            AC|ACAD|ADP0|ACPI0003:00)
                case "$4" in
                    00000000)
                        echo 5 > /sys/class/backlight/acpi_video0/brightness
                        logger 'AC unpluged'
                        ;;
                    00000001)
                        echo 10 > /sys/class/backlight/acpi_video0/brightness
                        logger 'AC pluged'
                        ;;
                esac
                ;;
            *)
                logger "ACPI action undefined: $2"
                ;;
        esac

其中echo部分是修改屏幕背光的语句。背光从0-15可调,请根据自己喜好设置。

保存后再拔下/插入电源试试,目的达到,问题完美解决。

通过这种方式,我们还可以达成其他一些目的,比如为Thinkpad的蓝键自定义一个功能(它也会产生ACPI事件)。留给读者自由发挥,在此不再赘述。

相关文章:

  • 2021-07-17
  • 2021-07-28
  • 2022-01-21
  • 2021-11-30
  • 2022-12-23
  • 2021-04-02
  • 2022-12-23
猜你喜欢
  • 2022-12-23
  • 2021-11-21
  • 2021-09-10
  • 2021-10-18
  • 2021-09-07
  • 2021-12-31
  • 2021-09-29
相关资源
相似解决方案