<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<atom:link href="http://gentoo-zh.org/extern.php?action=feed&amp;tid=589&amp;type=rss" rel="self" type="application/rss+xml" />
		<title><![CDATA[Gentoo中文社区 / 解决swaywm 环境下的USB键盘灯(Scroll Lock) 无法正常使用的问题]]></title>
		<link>http://www.gentoo-zh.org/viewtopic.php?id=589</link>
		<description><![CDATA[解决swaywm 环境下的USB键盘灯(Scroll Lock) 无法正常使用的问题 最近发表的帖子。]]></description>
		<lastBuildDate>Sat, 19 Nov 2022 05:58:38 +0000</lastBuildDate>
		<generator>FluxBB</generator>
		<item>
			<title><![CDATA[解决swaywm 环境下的USB键盘灯(Scroll Lock) 无法正常使用的问题]]></title>
			<link>http://www.gentoo-zh.org/viewtopic.php?pid=629#p629</link>
			<description><![CDATA[<p>运行环境: archlinux wayland(swaywm). <br />经过测试通过执行:</p><p>brightnessctl --device=&#039;input3::scrolllock&#039; set 1</p><p>但是 由于sway 的某些问题导致亮了之后直接关闭. 经过查找issues 得到最终回答 sway/issues/5342</p><p>但是经过粗读 wlroot 只能解决灯不灭</p><p>故而通过另一个issues sway/issues/6987 获得了基于sway 1.7分支的 PR. 经过测试不符合预期效果</p><p>于是接着修改wlroot. 当修改wlroot 后,可以正常使用键盘灯. 解决方案如下:</p><p>&#160; &#160; 1. 通过使用脚本   凑合</p><p>&#160; &#160; 安装python-libinput 项目的examples/led-toggle.py ,实现了led 切换. 通过以下patch:</p><p>&#160; &#160; diff --git a/examples/led-toggle.py b/examples/led-toggle.py<br />&#160; &#160; index da81f0f..db51a3a 100755<br />&#160; &#160; --- a/examples/led-toggle.py<br />&#160; &#160; +++ b/examples/led-toggle.py<br />&#160; &#160; @@ -2,7 +2,7 @@</p><p>&#160; &#160; &#160;import libevdev<br />&#160; &#160; &#160;import sys<br />&#160; &#160; -<br />&#160; &#160; +import time</p><p>&#160; &#160; &#160;def toggle(path, ledstr):<br />&#160; &#160; &#160; &#160; &#160;ledmap = {<br />&#160; &#160; @@ -31,18 +31,10 @@ def toggle(path, ledstr):<br />&#160; &#160; &#160; &#160; &#160; &#160; &#160;print(&#039;{} {}&#039;.format(ledstr, &#039;on&#039; if state else &#039;off&#039;))</p><p>&#160; &#160; &#160; &#160; &#160; &#160; &#160;while True:<br />&#160; &#160; -&#160; &#160; &#160; &#160; &#160; &#160; for e in d.events():<br />&#160; &#160; -&#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; if not e.matches(key):<br />&#160; &#160; -&#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; continue<br />&#160; &#160; -<br />&#160; &#160; -&#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; if not e.value:<br />&#160; &#160; -&#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; continue<br />&#160; &#160; -<br />&#160; &#160; -&#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; state = not state<br />&#160; &#160; -&#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; d.set_leds([(led, state)])<br />&#160; &#160; -&#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; print(&#039;{} {}&#039;.format(ledstr, &#039;on&#039; if state else &#039;off&#039;))<br />&#160; &#160; -<br />&#160; &#160; -<br />&#160; &#160; +&#160; &#160; &#160; &#160; &#160; &#160; state = 1<br />&#160; &#160; +&#160; &#160; &#160; &#160; &#160; &#160; d.set_leds([(led, state)])<br />&#160; &#160; +&#160; &#160; &#160; &#160; &#160; &#160; time.sleep(1)<br />&#160; &#160; +&#160; &#160; &#160; &#160; &#160; &#160; <br />&#160; &#160; &#160;if __name__ == &quot;__main__&quot;:<br />&#160; &#160; &#160; &#160; &#160;if len(sys.argv) &lt; 3:<br />&#160; &#160; &#160; &#160; &#160; &#160; &#160;print(&quot;Usage: {} /dev/input/eventX {{numlock|capslock|scrolllock}}&quot;.format(sys.argv[0]))</p><p>&#160; &#160; 获得一个: 每输入一次按键便会闪烁一次的程序. 如果要求不是很高 可以日常使用了</p><p>&#160; &#160; 2. 修改wlroot   极品</p><p>&#160; &#160; 经过编译</p><p>&#160; &#160; git clone <a href="https://gitlab.freedesktop.org/wlroots/wlroots.git" rel="nofollow">https://gitlab.freedesktop.org/wlroots/wlroots.git</a><br />&#160; &#160; git checkout 0.15.1<br />&#160; &#160; arch-meson -D examples=false build<br />&#160; &#160; ninja -C build/</p><p>&#160; &#160; 通过在keyboardledupdate()中加入代码: leds |= 4; 可以获得一个永远常亮,无法正常关闭的键盘 并不是很好用, 弃用.</p><p>&#160; &#160; 经过了粗读代码,发现可以通过:加一个变量(ledsstate)进行判定leds, 是否改变再执行刷新led. 通过以下patch:</p><p>&#160; &#160; diff --git a/types/wlr_keyboard.c b/types/wlr_keyboard.c<br />&#160; &#160; index c54e33c..b941399 100644<br />&#160; &#160; --- a/types/wlr_keyboard.c<br />&#160; &#160; +++ b/types/wlr_keyboard.c<br />&#160; &#160; @@ -11,7 +11,7 @@<br />&#160; &#160; &#160;#include &quot;util/array.h&quot;<br />&#160; &#160; &#160;#include &quot;util/shm.h&quot;<br />&#160; &#160; &#160;#include &quot;util/signal.h&quot;<br />&#160; &#160; -<br />&#160; &#160; +uint32_t leds_state=0;<br />&#160; &#160; &#160;void keyboard_led_update(struct wlr_keyboard *keyboard) {<br />&#160; &#160; &#160; &#160; &#160; &#160; if (keyboard-&gt;xkb_state == NULL) {<br />&#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; return;<br />&#160; &#160; @@ -24,6 +24,11 @@ void keyboard_led_update(struct wlr_keyboard *keyboard) {<br />&#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; leds |= (1 &lt;&lt; i);<br />&#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; }<br />&#160; &#160; &#160; &#160; &#160; &#160; }<br />&#160; &#160; +<br />&#160; &#160; +&#160; &#160; &#160; &#160;if (leds_state == leds) {<br />&#160; &#160; +&#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160;return;<br />&#160; &#160; +&#160; &#160; &#160; &#160;}<br />&#160; &#160; +&#160; &#160; leds_state = leds;<br />&#160; &#160; &#160; &#160; &#160; &#160; wlr_keyboard_led_update(keyboard, leds);<br />&#160; &#160; &#160;}</p><p>&#160; &#160; 通过git apply led.patch 应用补丁. 将编译好的so 放入系统内:</p><p>&#160; &#160; #将so 脱光<br />&#160; &#160; strip build/libwlroots.so.10<br />&#160; &#160; #放入/usr/lib/ (如果你不知道是做什么,请不要随意操作)<br />&#160; &#160; sudo cp -i build/libwlroots.so.10&#160; /usr/lib/libwlroots.so.10</p><p>&#160; &#160; 然后重新执行:sway 命令 进入sway.</p><p>&#160; &#160; 接下来就可以通过:</p><p>&#160; &#160; #开启 input 可以手动指定&#039;*::scrollloc&#039;代表所有键盘的&quot;scrolllock led&quot; 都会设置<br />&#160; &#160; brightnessctl --device=&#039;*::scrolllock&#039; set 1<br />&#160; &#160; #关闭<br />&#160; &#160; brightnessctl --device=&#039;*::scrolllock&#039; set 0</p><p>&#160; &#160; 在.config/sway/config 配置文件中加入键绑定:</p><p>&#160; &#160; bindsym $mod+F9 exec brightnessctl --device=&#039;*::scrolllock&#039; set 1<br />&#160; &#160; bindsym $mod+F10 exec brightnessctl --device=&#039;*::scrolllock&#039; set 0</p><p>&#160; &#160; &#160; &#160; </p><p>&#160; &#160; 3. 修改sway (无效方法)   糟糕</p><p>&#160; &#160; 获取 sway-scroll-lock 源码 为了与官方包一致,查看并应用仓库内的patch</p><p>&#160; &#160; sed -i &quot;s/branch \\\&#039;@1@\\\&#039;/Arch Linux/g&quot; meson.build<br />&#160; &#160; patch -p1 &lt; ../1c368fbb5fcd8fb67040bcc12bd71c7fbf119e97.diff<br />&#160; &#160; arch-meson build -D sd-bus-provider=libsystemd -D werror=false -D b_ndebug=true<br />&#160; &#160; ninja -C build<br />&#160; &#160; sudo mv -i /usr/bin/sway sway222 #如果不知道在做什么.那么就不要操作<br />&#160; &#160; sudo cp build/sway/sway /usr/bin/sway</p><p>&#160; &#160; 替换系统内的sway<br />&#160; &#160; 测试无效</p>]]></description>
			<author><![CDATA[dummy@example.com (xiliuya)]]></author>
			<pubDate>Sat, 19 Nov 2022 05:58:38 +0000</pubDate>
			<guid>http://www.gentoo-zh.org/viewtopic.php?pid=629#p629</guid>
		</item>
	</channel>
</rss>
