A Swift input method switcher works only after changing focus to another window

-1

I am trying to write a MacOS app which switch input methods by previously assigned shortcut(command+space in here). Switching input methods preoperly works so that the language icon at the status bar(top right) immediately changes as I put the shortcut. The problem I got in here is that the actual input method does not change. For example, if I run my app when the selected input method is Korean, then although the status bar is showing the selected input method is Japanese after command+space, what I can only type is Korean characters. However, after I change focus to another text app(e.g. from sublime text to xcode), only then the selected input method is reflected well. I am using MacOS Monterey 12.6 and Xcode 13.1.

My project contains two source files. The code in the file AppDelegate.swift is as follows:

import Cocoa

@NSApplicationMain class AppDelegate: NSObject, NSApplicationDelegate { var switcher = Switcher() } And the code in the file Switcher.swift is as follows:

import Cocoa import MASShortcut

class Switcher{ var lang: Int = 0

var kr: TISInputSource?
var jp: TISInputSource?
var en: TISInputSource?

init(){
    let inputSourceNSArray = TISCreateInputSourceList(nil, false).takeRetainedValue() as NSArray
    let inputSourceList = inputSourceNSArray as! [TISInputSource]
    for inputSource in inputSourceList {
        if inputSource.id == "com.apple.inputmethod.Korean.2SetKorean" {
            self.kr = inputSource
        }
        if inputSource.id == "com.apple.inputmethod.Kotoeri.RomajiTyping.Japanese" {
            self.jp = inputSource
        }
        if inputSource.id == "com.apple.keylayout.ABC" {
            self.en = inputSource
        }
    }
    self.register()
}

func switchLang(){
    self.lang = (self.lang + 1) % 3
    switch lang {
    case 0:
        TISSelectInputSource(self.kr)
    case 1:
        TISSelectInputSource(self.jp)
    case 2:
        TISSelectInputSource(self.en)
    default:
        print("error")
    }
}

func register() {
    let langShortcut = MASShortcut(keyCode: kVK_Space, modifierFlags: [.command])
    MASShortcutMonitor.shared()?.register(langShortcut, withAction: {
        self.switchLang()
    })
}

} I wrote these codes by referring KAWA, but KAWA does not make this issue. I have analyzed all codes of KAWA several times, I couldn't find out why the same problem does not occur in KAWA. I am quite new to Swift, and I have no idea to approach. Could you help me....? Thank you.

A Swift input method switcher works only after changing focus to another window
 
 
Q