swaywm usb键盘灯使用解决
Table of Contents
DONE 查找键盘灯相关内容并正常使用usb 键盘灯 CLOSED:
运行环境: 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 后,可以正常使用键盘灯. 解决方案如下:
DONE 通过使用脚本 :凑合:
安装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 ".format(sys.argv[0]))
获得一个: 每输入一次按键便会闪烁一次的程序. 如果要求不是很高 可以日常使用了
DONE 修改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
CANCELED 使用gdb 调试进程
编译debug 代码 参考链接:gdb调试动态库(so)
arch-meson --debug build
ninja -d stats -C build
#编译测试代码
gcc -g test.c -o test.o ./build/libwlroots.so.10 -DWLR_USE_UNSTABLE -I ./include/
#gdb 调试
LD_LIBRARY_PATH=./build/ gdb ./test.o