Skip to content

Commit beeaf1f

Browse files
committed
fix(touchpad): 适配ps/2鼠标视为触控板时全局禁用失效的问题
添加规则识别出出ps/2设备, 禁用触控板时可以禁用 Log: PMS: BUG-352421
1 parent 3e433e7 commit beeaf1f

1 file changed

Lines changed: 52 additions & 7 deletions

File tree

system/inputdevices1/touchpad.go

Lines changed: 52 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
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+
# 标准触控板设备
2833
SUBSYSTEM=="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

3248
type 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+
202247
func setDsgConf(enable bool) error {
203248
sysBus, err := dbus.SystemBus()
204249
if err != nil {

0 commit comments

Comments
 (0)