Skip to content

Commit bea9bdd

Browse files
committed
fix: support dual key bindings for Ctrl+Shift layout switching
Return two key combinations for Ctrl+Shift shortcut instead of single value. Ctrl+Shift快捷键返回两组按键组合,支持多组快捷键写入配置。 Log: 修复Ctrl+Shift切换快捷键支持双按键组合 PMS: BUG-357563 Influence: Ctrl+Shift布局切换快捷键现在支持两组按键绑定,切换行为更准确。
1 parent c633531 commit bea9bdd

1 file changed

Lines changed: 48 additions & 35 deletions

File tree

src/dcc-fcitx5configtool/qml/ShortcutsModule.qml

Lines changed: 48 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,23 @@ import org.deepin.dcc 1.0
99

1010
DccObject {
1111
id: root
12+
13+
// Config path constants
14+
readonly property string cfgGroup: "Hotkey"
15+
readonly property string cfgEnumKey: "EnumerateForwardKeys"
16+
readonly property string cfgTriggerKey: "TriggerKeys"
17+
readonly property string cfgEnum0: cfgGroup + "/" + cfgEnumKey + "/0"
18+
readonly property string cfgEnum1: cfgGroup + "/" + cfgEnumKey + "/1"
19+
readonly property string cfgTrigger0: cfgGroup + "/" + cfgTriggerKey + "/0"
20+
readonly property string cfgTrigger1: cfgGroup + "/" + cfgTriggerKey + "/1"
21+
1222
readonly property var enumKeys: ["Ctrl+Shift", "Alt+Shift", "None"]
1323
readonly property var enumKeysI18n: ["Ctrl+Shift", "Alt+Shift", qsTr("None")]
1424
readonly property var triggerEnumKeys: ["Shift", "Ctrl+Space", "None"]
1525
readonly property var triggerEnumKeysI18n: ["Shift", "Ctrl+Space", qsTr("None")]
1626

1727
property var triggerKeys: dccData.fcitx5ConfigProxy.globalConfigOption(
18-
"Hotkey", "TriggerKeys")
28+
cfgGroup, cfgTriggerKey)
1929
// 改为受控属性,避免等值赋值不触发刷新
2030
property int enumerateForwardKeys: -1
2131
property int currentTriggerKeys: -1
@@ -39,11 +49,11 @@ DccObject {
3949

4050
function calculateTriggerKeys(value) {
4151
// 获取完整的TriggerKeys配置
42-
let triggerKeys0 = dccData.fcitx5ConfigProxy.globalConfigOption("Hotkey", "TriggerKeys").value
52+
let triggerKeys0 = dccData.fcitx5ConfigProxy.globalConfigOption(cfgGroup, cfgTriggerKey).value
4353
let triggerKeys1 = []
4454
try {
4555
// 尝试获取第二个TriggerKey
46-
let triggerKeysObj = dccData.fcitx5ConfigProxy.globalConfigOption("Hotkey", "TriggerKeys")
56+
let triggerKeysObj = dccData.fcitx5ConfigProxy.globalConfigOption(cfgGroup, cfgTriggerKey)
4757
if (triggerKeysObj && triggerKeysObj.hasOwnProperty("1")) {
4858
triggerKeys1 = triggerKeysObj["1"] || []
4959
}
@@ -134,7 +144,7 @@ DccObject {
134144
}
135145
font.pixelSize: D.DTK.fontManager.t8.pixelSize
136146
onClicked: {
137-
dccData.fcitx5ConfigProxy.restoreDefault("Hotkey")
147+
dccData.fcitx5ConfigProxy.restoreDefault(cfgGroup)
138148
console.log("Restore Defaults button clicked")
139149
}
140150
}
@@ -146,10 +156,10 @@ DccObject {
146156
enumKeysDisplay = ["Ctrl+Shift", "Alt+Shift", qsTr("None")]
147157
triggerEnumKeysDisplay = ["Shift", "Ctrl+Space", qsTr("None")]
148158

149-
let enumInitOpt = dccData.fcitx5ConfigProxy.globalConfigOption("Hotkey", "EnumerateForwardKeys")
159+
let enumInitOpt = dccData.fcitx5ConfigProxy.globalConfigOption(cfgGroup, cfgEnumKey)
150160
let enumInitVal = enumInitOpt && enumInitOpt.value ? enumInitOpt.value : []
151161
let enumInitIdx = calculateEnumerateForwardKeys(enumInitVal)
152-
let triggerInitOpt = dccData.fcitx5ConfigProxy.globalConfigOption("Hotkey", "TriggerKeys")
162+
let triggerInitOpt = dccData.fcitx5ConfigProxy.globalConfigOption(cfgGroup, cfgTriggerKey)
153163
let triggerInitVal = triggerInitOpt && triggerInitOpt.value ? triggerInitOpt.value : []
154164
let triggerInitIdx = calculateTriggerKeys(triggerInitVal)
155165
currentTriggerKeys = triggerInitIdx
@@ -159,8 +169,8 @@ DccObject {
159169
Connections {
160170
target: dccData.fcitx5ConfigProxy
161171
function onRequestConfigFinished() {
162-
let fullTriggerKeys = dccData.fcitx5ConfigProxy.globalConfigOption("Hotkey", "TriggerKeys")
163-
let enumValue = dccData.fcitx5ConfigProxy.globalConfigOption("Hotkey", "EnumerateForwardKeys").value
172+
let fullTriggerKeys = dccData.fcitx5ConfigProxy.globalConfigOption(cfgGroup, cfgTriggerKey)
173+
let enumValue = dccData.fcitx5ConfigProxy.globalConfigOption(cfgGroup, cfgEnumKey).value
164174

165175

166176
let newTriggerIdx = calculateTriggerKeys(fullTriggerKeys.value)
@@ -186,31 +196,30 @@ DccObject {
186196
}
187197
}
188198

199+
// Always returns [binding0, binding1] where each binding is an array.
200+
// binding1 is [""] when no second binding is needed.
189201
function reverseEnumerateForwardKeys(index) {
190202
if (index < 0 || index >= enumKeys.length) {
191-
return ""
203+
return [[""], [""]]
192204
}
193205
let value = enumKeys[index]
194-
195-
if (value === "Ctrl+Shift") value = "CTRL_SHIFT"
196-
if (value === "Alt+Shift") value = "ALT_SHIFT"
197-
198-
if (value === "None") {
199-
return ""
206+
207+
// Ctrl+Shift needs two key bindings to cover both press orders:
208+
// Binding 0: press Ctrl then Shift_L triggers forward switch
209+
// Binding 1: press Ctrl+Shift then Ctrl_L triggers forward switch
210+
// Without both bindings, only one press order works.
211+
if (value === "Ctrl+Shift") {
212+
return [["Control", "Shift_L"], ["Control", "Shift", "Control_L"]]
200213
}
201-
let parts = value.split("_")
202-
for (var i = 0; i < parts.length; i++) {
203-
if (parts.length > 0) {
204-
parts[i] = parts[i].charAt(0).toUpperCase() + parts[i].slice(
205-
1).toLowerCase()
206-
}
207-
if (parts[i] === "Super") {
208-
parts[i] = "Meta"
209-
} else if (parts[i] === "Shift") {
210-
parts[i] = "Shift_L"
211-
}
214+
if (value === "Alt+Shift") {
215+
return [["Alt", "Shift_L"], [""]]
216+
}
217+
218+
if (value === "None") {
219+
return [[""], [""]]
212220
}
213-
return parts
221+
// Fallback for unknown enum values
222+
return [[value], [""]]
214223
}
215224

216225
// Shortcut of scroll IM
@@ -236,7 +245,7 @@ DccObject {
236245
Component.onCompleted: {
237246
if (root.enumerateForwardKeys === -1) {
238247
try {
239-
let ev = dccData.fcitx5ConfigProxy.globalConfigOption("Hotkey", "EnumerateForwardKeys").value || []
248+
let ev = dccData.fcitx5ConfigProxy.globalConfigOption(cfgGroup, cfgEnumKey).value || []
240249
let eidx = calculateEnumerateForwardKeys(ev)
241250
console.warn("[QML][page] init enum from backend idx=", eidx)
242251
root.enumerateForwardKeys = eidx
@@ -248,9 +257,13 @@ DccObject {
248257

249258
// 只在用户激活选择时写回,避免程序化更新触发写回
250259
onActivated: {
260+
let reversed = reverseEnumerateForwardKeys(currentIndex)
261+
dccData.fcitx5ConfigProxy.setValue(
262+
cfgEnum0,
263+
reversed[0], true)
251264
dccData.fcitx5ConfigProxy.setValue(
252-
"Hotkey/EnumerateForwardKeys/0",
253-
reverseEnumerateForwardKeys(currentIndex), true)
265+
cfgEnum1,
266+
reversed[1], true)
254267
}
255268
}
256269
}
@@ -287,7 +300,7 @@ DccObject {
287300
" root.trigger=", root.currentTriggerKeys)
288301
if (root.currentTriggerKeys === -1) {
289302
try {
290-
let tv = dccData.fcitx5ConfigProxy.globalConfigOption("Hotkey", "TriggerKeys").value || []
303+
let tv = dccData.fcitx5ConfigProxy.globalConfigOption(cfgGroup, cfgTriggerKey).value || []
291304
let tidx = calculateTriggerKeys(tv)
292305
console.warn("[QML][page] init trigger from backend idx=", tidx)
293306
root.currentTriggerKeys = tidx
@@ -302,13 +315,13 @@ DccObject {
302315
isUserChanging = true
303316
if (currentIndex === 0) {
304317
console.warn("[QML] write TriggerKeys -> Shift_L + Shift_R")
305-
dccData.fcitx5ConfigProxy.setValue("Hotkey/TriggerKeys/0", ["Shift_L"], true)
306-
dccData.fcitx5ConfigProxy.setValue("Hotkey/TriggerKeys/1", ["Shift_R"], true)
318+
dccData.fcitx5ConfigProxy.setValue(cfgTrigger0, ["Shift_L"], true)
319+
dccData.fcitx5ConfigProxy.setValue(cfgTrigger1, ["Shift_R"], true)
307320
} else {
308321
let newKeys = reverseTriggerKeys(currentIndex)
309322
console.warn("[QML] write TriggerKeys ->", JSON.stringify(newKeys))
310-
dccData.fcitx5ConfigProxy.setValue("Hotkey/TriggerKeys/0", newKeys, true)
311-
dccData.fcitx5ConfigProxy.setValue("Hotkey/TriggerKeys/1", [""], true)
323+
dccData.fcitx5ConfigProxy.setValue(cfgTrigger0, newKeys, true)
324+
dccData.fcitx5ConfigProxy.setValue(cfgTrigger1, [""], true)
312325
}
313326
Qt.callLater(() => { isUserChanging = false })
314327
}

0 commit comments

Comments
 (0)