公告

Gentoo群:87709706!欢迎您的加入

#1 2022-11-19 14:58:38

xiliuya
会员
注册时间: 2022-11-06
帖子: 1

解决swaywm 环境下的USB键盘灯(Scroll Lock) 无法正常使用的问题

运行环境: archlinux wayland(swaywm).
经过测试通过执行:

brightnessctl --device='input3::scrolllock' set 1

但是 由于sway 的某些问题导致亮了之后直接关闭. 经过查找issues 得到最终回答 sway/issues/5342

但是经过粗读 wlroot 只能解决灯不灭

故而通过另一个issues sway/issues/6987 获得了基于sway 1.7分支的 PR. 经过测试不符合预期效果

于是接着修改wlroot. 当修改wlroot 后,可以正常使用键盘灯. 解决方案如下:

    1. 通过使用脚本   凑合

    安装python-libinput 项目的examples/led-toggle.py ,实现了led 切换. 通过以下patch:

    diff --git a/examples/led-toggle.py b/examples/led-toggle.py
    index da81f0f..db51a3a 100755
    --- a/examples/led-toggle.py
    +++ b/examples/led-toggle.py
    @@ -2,7 +2,7 @@

     import libevdev
     import sys
    -
    +import time

     def toggle(path, ledstr):
         ledmap = {
    @@ -31,18 +31,10 @@ def toggle(path, ledstr):
             print('{} {}'.format(ledstr, 'on' if state else 'off'))

             while True:
    -            for e in d.events():
    -                if not e.matches(key):
    -                    continue
    -
    -                if not e.value:
    -                    continue
    -
    -                state = not state
    -                d.set_leds([(led, state)])
    -                print('{} {}'.format(ledstr, 'on' if state else 'off'))
    -
    -
    +            state = 1
    +            d.set_leds([(led, state)])
    +            time.sleep(1)
    +           
     if __name__ == "__main__":
         if len(sys.argv) < 3:
             print("Usage: {} /dev/input/eventX {{numlock|capslock|scrolllock}}".format(sys.argv[0]))

    获得一个: 每输入一次按键便会闪烁一次的程序. 如果要求不是很高 可以日常使用了

    2. 修改wlroot   极品

    经过编译

    git clone https://gitlab.freedesktop.org/wlroots/wlroots.git
    git checkout 0.15.1
    arch-meson -D examples=false build
    ninja -C build/

    通过在keyboardledupdate()中加入代码: leds |= 4; 可以获得一个永远常亮,无法正常关闭的键盘 并不是很好用, 弃用.

    经过了粗读代码,发现可以通过:加一个变量(ledsstate)进行判定leds, 是否改变再执行刷新led. 通过以下patch:

    diff --git a/types/wlr_keyboard.c b/types/wlr_keyboard.c
    index c54e33c..b941399 100644
    --- a/types/wlr_keyboard.c
    +++ b/types/wlr_keyboard.c
    @@ -11,7 +11,7 @@
     #include "util/array.h"
     #include "util/shm.h"
     #include "util/signal.h"
    -
    +uint32_t leds_state=0;
     void keyboard_led_update(struct wlr_keyboard *keyboard) {
            if (keyboard->xkb_state == NULL) {
                    return;
    @@ -24,6 +24,11 @@ void keyboard_led_update(struct wlr_keyboard *keyboard) {
                            leds |= (1 << i);
                    }
            }
    +
    +       if (leds_state == leds) {
    +               return;
    +       }
    +    leds_state = leds;
            wlr_keyboard_led_update(keyboard, leds);
     }

    通过git apply led.patch 应用补丁. 将编译好的so 放入系统内:

    #将so 脱光
    strip build/libwlroots.so.10
    #放入/usr/lib/ (如果你不知道是做什么,请不要随意操作)
    sudo cp -i build/libwlroots.so.10  /usr/lib/libwlroots.so.10

    然后重新执行:sway 命令 进入sway.

    接下来就可以通过:

    #开启 input 可以手动指定'*::scrollloc'代表所有键盘的"scrolllock led" 都会设置
    brightnessctl --device='*::scrolllock' set 1
    #关闭
    brightnessctl --device='*::scrolllock' set 0

    在.config/sway/config 配置文件中加入键绑定:

    bindsym $mod+F9 exec brightnessctl --device='*::scrolllock' set 1
    bindsym $mod+F10 exec brightnessctl --device='*::scrolllock' set 0

       

    3. 修改sway (无效方法)   糟糕

    获取 sway-scroll-lock 源码 为了与官方包一致,查看并应用仓库内的patch

    sed -i "s/branch \\\'@1@\\\'/Arch Linux/g" meson.build
    patch -p1 < ../1c368fbb5fcd8fb67040bcc12bd71c7fbf119e97.diff
    arch-meson build -D sd-bus-provider=libsystemd -D werror=false -D b_ndebug=true
    ninja -C build
    sudo mv -i /usr/bin/sway sway222 #如果不知道在做什么.那么就不要操作
    sudo cp build/sway/sway /usr/bin/sway

    替换系统内的sway
    测试无效

离线

页脚