From 6c62c64bcc6d70c4f5cf1ee5cb66d7480df13942 Mon Sep 17 00:00:00 2001 From: zhangkun2 Date: Wed, 16 Sep 2026 13:14:41 +0800 Subject: [PATCH] feat: adapt keyboard layout for Treeland MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 适配 Treeland 键盘布局 1. 新增 treeland user seat DConfig 常量(treelandAppID/treelandSeatName/treelandKeyXkbLayout/treelandKeyXkbVariant) 2. Keyboard 结构体新增 treelandSeatConfig 字段,newKeyboard 中 hasTreeLand 分支初始化 3. applyLayout() 方法新增 hasTreeLand 分流,调用 applyLayoutTreeLand 4. 新增 applyLayoutTreeLand 方法:通过 dconfig 写入 xkbLayout/xkbVariant,复用 layout/variant 拆分与 ,us 兜底逻辑 5. applyOptions() 添加 hasTreeLand guard,避免 treeland 下执行 setxkbmap 产生噪音日志 6. applyLayoutTreeLand 中两次 SetValue 添加已知行为注释 PMS: BUG-377251 Log: 适配 Treeland 键盘布局,通过 dconfig 写入 treeland user seat 的 xkbLayout/xkbVariant 配置 Influence: inputdevices1 键盘布局设置在 Treeland 环境下走 dconfig 路径,X11 路径不受影响 --- inputdevices1/keyboard.go | 56 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) diff --git a/inputdevices1/keyboard.go b/inputdevices1/keyboard.go index 9587cee9e..0039fa026 100644 --- a/inputdevices1/keyboard.go +++ b/inputdevices1/keyboard.go @@ -56,6 +56,12 @@ const ( kbdSystemConfig = "/etc/default/keyboard" qtDefaultConfig = ".config/Trolltech.conf" cmdSetKbd = "/usr/bin/setxkbmap" + + // Treeland keyboard layout DConfig + treelandAppID = "org.deepin.dde.treeland" + treelandSeatName = "org.deepin.dde.treeland.user.seat" + treelandKeyXkbLayout = "xkbLayout" + treelandKeyXkbVariant = "xkbVariant" ) type Keyboard struct { @@ -89,6 +95,9 @@ type Keyboard struct { devNumber int devInfos Keyboards dsgInputConfig *dconfig.DConfig + + // treelandSeatConfig 用于在 Treeland 环境下跨 app 写入 user seat DConfig + treelandSeatConfig *dconfig.DConfig } func newKeyboard(service *dbusutil.Service) *Keyboard { @@ -117,6 +126,11 @@ func newKeyboard(service *dbusutil.Service) *Keyboard { logger.Error("failed to get X conn:", err) return nil } + } else { + kbd.treelandSeatConfig, err = dconfig.NewDConfig(treelandAppID, treelandSeatName, "") + if err != nil { + logger.Warning("failed to init treeland seat dconfig:", err) + } } kbd.layoutMap, err = getLayoutsFromFile(kbdLayoutsXml) @@ -288,6 +302,11 @@ func (kbd *Keyboard) applyLayout() { currentLayout := kbd.CurrentLayout.Get() kbd.PropsMu.RUnlock() + if hasTreeLand { + kbd.applyLayoutTreeLand(currentLayout) + return + } + err := applyLayout(currentLayout) if err != nil { logger.Warningf("failed to set layout to %q: %v", currentLayout, err) @@ -301,6 +320,10 @@ func (kbd *Keyboard) applyLayout() { } func (kbd *Keyboard) applyOptions() { + if hasTreeLand { + return + } + options := kbd.UserOptionList.Get() if len(options) == 0 { return @@ -560,6 +583,39 @@ func applyLayout(value string) error { return cmd.Run() } +func (kbd *Keyboard) applyLayoutTreeLand(value string) { + if kbd.treelandSeatConfig == nil { + logger.Warning("treeland seat dconfig is nil, skip applying layout") + return + } + + array := strings.Split(value, layoutDelim) + if len(array) != 2 { + logger.Warningf("invalid layout: %s", value) + return + } + + layout, variant := array[0], array[1] + if layout != "us" { + layout += ",us" + + if variant != "" { + variant += "," + } + } + + err := kbd.treelandSeatConfig.SetValue(treelandKeyXkbLayout, layout) + if err != nil { + logger.Warning("failed to set treeland xkbLayout:", err) + return + } + + err = kbd.treelandSeatConfig.SetValue(treelandKeyXkbVariant, variant) + if err != nil { + logger.Warning("failed to set treeland xkbVariant:", err) + } +} + func setQtCursorBlink(rate int32, file string) error { ok := dutils.WriteKeyToKeyFile(file, "Qt", "cursorFlashTime", rate) if !ok {