Skip to content

Commit d5a38cb

Browse files
committed
ABC 입력기 제한 기능 추가
암호 입력 필드에 포커스될 때 입력기가 ABC로 변경되는 문제 대응 (#20)
1 parent 9f124da commit d5a38cb

File tree

3 files changed

+79
-5
lines changed

3 files changed

+79
-5
lines changed

SokIM/AppDelegate.swift

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,14 @@ class AppDelegate: NSObject, NSApplicationDelegate {
5151
var eventSpec = EventTypeSpec(eventClass: OSType(kEventClassKeyboard), eventKind: UInt32(kEventHotKeyPressed))
5252
InstallEventHandler(GetApplicationEventTarget(), eventHotKeyHandler, 1, &eventSpec, nil, &eventHandlerRef)
5353
registerEventHotKey(Preferences.rotateShortcut)
54+
55+
// 입력기가 변경되는 시점에 ABC 입력기 제한 로직 실행
56+
NotificationCenter.default.addObserver(
57+
self,
58+
selector: #selector(suppressABC),
59+
name: NSTextInputContext.keyboardSelectionDidChangeNotification,
60+
object: nil
61+
)
5462
}
5563

5664
func applicationWillTerminate(_ aNotification: Notification) {
@@ -274,5 +282,54 @@ class AppDelegate: NSObject, NSApplicationDelegate {
274282
break
275283
}
276284
}
285+
286+
@objc private func suppressABC(_ aNotification: Notification) {
287+
debug("\(String(describing: aNotification))")
288+
289+
guard Preferences.suppressABC == true else { return }
290+
291+
let current = TISCopyCurrentKeyboardInputSource()?.takeRetainedValue()
292+
guard let current = current else {
293+
warning("TISCopyCurrentKeyboardInputSource 실패")
294+
return
295+
}
296+
297+
let currentIDOpaque = TISGetInputSourceProperty(current, kTISPropertyInputSourceID)
298+
guard let currentIDOpaque = currentIDOpaque else {
299+
warning("TISGetInputSourceProperty 실패")
300+
return
301+
}
302+
let currentID = Unmanaged<CFString>.fromOpaque(currentIDOpaque).takeUnretainedValue() as String
303+
304+
if currentID != "com.apple.keylayout.ABC" {
305+
debug("현재 입력기 ABC 아님: \(currentID)")
306+
return
307+
}
308+
309+
let sokArray = TISCreateInputSourceList([
310+
kTISPropertyInputSourceType: kTISTypeKeyboardInputMode,
311+
kTISPropertyInputModeID: "com.kiding.inputmethod.sok.mode" as CFString
312+
] as CFDictionary, false)?.takeRetainedValue() as? [TISInputSource]
313+
guard let sokArray = sokArray else {
314+
warning("TISCreateInputSourceList 실패")
315+
return
316+
}
317+
318+
let sok = sokArray.first
319+
guard let sok = sok else {
320+
warning("sokArray.first 실패")
321+
return
322+
}
323+
324+
// "시스템 설정 > 암호" 필드에서는 무한 루프에 빠질 수 있음
325+
DispatchQueue.main.asyncAfter(deadline: .now() + .milliseconds(100)) {
326+
guard TISSelectInputSource(sok) == 0 else {
327+
warning("TISSelectInputSource 실패")
328+
return
329+
}
330+
331+
debug("ABC 입력기 제한 성공")
332+
}
333+
}
277334
}
278335
// swiftlint:enable function_body_length

SokIM/Preferences.swift

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,11 @@ struct Preferences {
2727
set(new) { UserDefaults.standard.set(new, forKey: "GraveOverWon") }
2828
}
2929

30+
static var suppressABC: Bool {
31+
get { UserDefaults.standard.bool(forKey: "SuppressABC") }
32+
set(new) { UserDefaults.standard.set(new, forKey: "SuppressABC") }
33+
}
34+
3035
static var debug: Bool {
3136
get { UserDefaults.standard.bool(forKey: "Debug") }
3237
set(new) { UserDefaults.standard.set(new, forKey: "Debug") }

SokIM/StatusBar.swift

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,13 @@ class StatusBar {
110110
graveItem.action = #selector(toggleGraveOverWon)
111111
menu.addItem(graveItem)
112112

113+
let abcItem = NSMenuItem()
114+
abcItem.title = "ABC 입력기 제한"
115+
abcItem.state = Preferences.suppressABC ? .on : .off
116+
abcItem.target = self
117+
abcItem.action = #selector(toggleSuppressABC)
118+
menu.addItem(abcItem)
119+
113120
let debugItem = NSMenuItem()
114121
debugItem.title = "디버그 모드"
115122
debugItem.state = Preferences.debug ? .on : .off
@@ -222,13 +229,18 @@ class StatusBar {
222229

223230
/** 기타 설정 */
224231

225-
@objc func toggleDebug(sender: NSMenuItem) {
226-
Preferences.debug = sender.state == .on ? false : true
227-
sender.state = Preferences.debug ? .on : .off
228-
}
229-
230232
@objc func toggleGraveOverWon(sender: NSMenuItem) {
231233
Preferences.graveOverWon = sender.state == .on ? false : true
232234
sender.state = Preferences.graveOverWon ? .on : .off
233235
}
236+
237+
@objc func toggleSuppressABC(sender: NSMenuItem) {
238+
Preferences.suppressABC = sender.state == .on ? false : true
239+
sender.state = Preferences.suppressABC ? .on : .off
240+
}
241+
242+
@objc func toggleDebug(sender: NSMenuItem) {
243+
Preferences.debug = sender.state == .on ? false : true
244+
sender.state = Preferences.debug ? .on : .off
245+
}
234246
}

0 commit comments

Comments
 (0)