1- // SPDX-FileCopyrightText: 2018 - 2022 UnionTech Software Technology Co., Ltd.
1+ // SPDX-FileCopyrightText: 2018 - 2026 UnionTech Software Technology Co., Ltd.
22//
33// SPDX-License-Identifier: GPL-3.0-or-later
44
@@ -21,13 +21,29 @@ const (
2121
2222 // udev 规则文件路径
2323 udevRuleFile = "/etc/udev/rules.d/90-dde-touchpad.rules"
24- // udev 规则内容(禁用触控板)
25- // ENV{LIBINPUT_IGNORE_DEVICE}="1": 让 libinput 忽略设备
26- // 注意:这只影响 libinput,evtest 仍能读取内核事件
27- udevRuleContent = `# DDE - Disable touchpad via libinput
24+
25+ // dconfig 配置项
26+ _dsettingsPS2MouseAsTouchpadKey = "ps2MouseAsTouchPadEnabled"
27+ )
28+
29+ // generateUdevRuleContent 根据配置生成 udev 规则内容
30+ func generateUdevRuleContent () string {
31+ baseRule := `# DDE - Disable touchpad via libinput
32+ # 标准触控板设备
2833SUBSYSTEM=="input", KERNEL=="event*", ENV{ID_INPUT_TOUCHPAD}=="1", ENV{LIBINPUT_IGNORE_DEVICE}="1"
2934`
30- )
35+
36+ // 检查是否启用 PS/2 鼠标作为触控板的功能
37+ if getPS2MouseAsTouchpadEnabled () {
38+ baseRule += `# PS/2 接口设备(通常是触控板被误识别为鼠标)- 大写
39+ SUBSYSTEM=="input", KERNEL=="event*", ATTRS{name}=="*PS/2*", ENV{LIBINPUT_IGNORE_DEVICE}="1"
40+ # PS/2 接口设备(通常是触控板被误识别为鼠标)- 小写
41+ SUBSYSTEM=="input", KERNEL=="event*", ATTRS{name}=="*ps/2*", ENV{LIBINPUT_IGNORE_DEVICE}="1"
42+ `
43+ }
44+
45+ return baseRule
46+ }
3147
3248type Touchpad struct {
3349 service * dbusutil.Service
@@ -99,7 +115,10 @@ func (t *Touchpad) setTouchpadEnableViaUdev(enabled bool) error {
99115 }
100116 logger .Info ("removed udev rule file:" , udevRuleFile )
101117 } else {
102- // 禁用:检查文件是否已存在且内容相同
118+ // 禁用:生成动态的 udev 规则内容
119+ udevRuleContent := generateUdevRuleContent ()
120+
121+ // 检查文件是否已存在且内容相同
103122 existingContent , err := os .ReadFile (udevRuleFile )
104123 if err == nil && string (existingContent ) == udevRuleContent {
105124 logger .Debug ("udev rule file already exists with correct content, skip writing" )
@@ -199,6 +218,32 @@ func (t *Touchpad) triggerTouchpadDevices() error {
199218 return nil
200219}
201220
221+ func getPS2MouseAsTouchpadEnabled () bool {
222+ sysBus , err := dbus .SystemBus ()
223+ if err != nil {
224+ logger .Warning ("failed to connect to system bus:" , err )
225+ return true // 默认启用
226+ }
227+ ds := configManager .NewConfigManager (sysBus )
228+ confPath , err := ds .AcquireManager (0 , _dsettingsAppID , _dsettingsInputdevicesName , "" )
229+ if err != nil {
230+ logger .Warning ("failed to acquire config manager:" , err )
231+ return true // 默认启用
232+ }
233+ dsManager , err := configManager .NewManager (sysBus , confPath )
234+ if err != nil {
235+ logger .Warning ("failed to create config manager:" , err )
236+ return true // 默认启用
237+ }
238+ data , err := dsManager .Value (0 , _dsettingsPS2MouseAsTouchpadKey )
239+ if err != nil {
240+ logger .Warning ("failed to get ps2MouseAsTouchPadEnabled config:" , err )
241+ return true // 默认启用
242+ }
243+ v , ok := data .Value ().(bool )
244+ return ! ok || v
245+ }
246+
202247func setDsgConf (enable bool ) error {
203248 sysBus , err := dbus .SystemBus ()
204249 if err != nil {
0 commit comments