AutoKeyboard라는 프로그램이 있습니다. 특정 어플리케이션 창이 활성화되면 미리 설정해 둔 키보드 레이아웃으로 자동으로 변경하도록 해주는 프로그램인데 10.13 올라오면서 이 어플리케이션이 작동을 안 하더군요.

그래서 대용품을 만들어야 했습니다.

1. 창이 전환되는 것을 감지하고 최상위 창에 위치하는 어플리케이션이 어느 어플리케이션인지 확인하는 부분

2. 키보드의 레이아웃을 변경하는 부분

크게 두 부분으로 나눌 수 있는데, 아래 부분은 Lutzifer의 keyboardSwitcher로 어떻게 타협을 보더라도 윗 부분은 꼼짝없이 만들어야 했습니다.

사실 뭔가 관련된 함수라든가 훅이 있길 바랬는데(어쩌면 있는데 제가 못 찾은 걸지도 모르겠습니다만) 그런 게 있는 것 같지는 않고 idle 핸들러를 사용해서 주기적으로 감시하는 수 밖에는 없다는 듯 합니다. [Apple Discussion]

그랬더니 이번에는 문제의 어플리케이션이 최상단에 떠 있기만 하면 키보드 레이아웃을 계속 돌려놓는 겁니다. 다른 레이아웃이 필요한 경우에도 말이죠. 때문에 이전 어플리케이션 창과 변화를 감지하는 코드가 1. 에 추가되어야 했습니다.

끝으로 1. 의 작업을 하나의 핸들러로 묶어서 구동하는 것에 문제가 있었는데 이건 전역변수를 잘못 사용하고 있었던 걸로 확인이 되었습니다.

문제점

한가지 문제점이라면 어찌됐든 idle 핸들러 역시 동일한 동작을 반복적으로 하는 것이다 보니 그 인터벌을 짧게 가져갈수록 자원 사용량이 많아진다는 점입니다. 1초 간격을 주었을 때 약 10%, 0.1초로 주었을 때 50%까지도 먹더군요. 1초 간격을 주면 어플리케이션 전환하고 입력기가 맞춰지기까지 최대 1초가 걸린다는 건데 실사용에는 확실히 무리가 있는 수준입니다. 기본적인 뼈대가 작동하는 건 확인했으니 이제 최대한 간격을 좁히면서 리소스 점유율을 낮추는 방법을 고민할 차례네요.


글을 적다가 생각이 났는데 키 입력(커맨드+탭 키 인풋이랑 클릭)을 기준으로 감지하는 것도 방법일 수 있을 것 같습니다.


  • 이상의 작업물은 Github에 올려두었습니다.