AutoKeyboard의 대용품 만들기

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

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

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

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

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

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

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

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

문제점

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


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


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

이미지 파일 클립보드에 붙여넣기

일전에 Typinator를 번들로 구매해서 쓰다가 알프레드 스니펫 기능이 추가된 뒤로 알프레드로 완전히 옮겨왔습니다.

다만 한 가지 알프레드 스니펫 기능이 아쉬웠던 건 이미지를 처리하지 못한다는 거였죠.

물론 알프레드는 스니펫 기능 자체 외에도 스니펫을 트리거로 해서 스크립트를 실행할 수 있게 해놨기 때문에 뭔가 우회 방법이 있을 거라고 생각했고, 잠시 짬을 내서 찾아보니 Copy image file to clipboard « Alec’s Web Log 라는 글에 이미지 파일을 클립보드로 붙여넣는 코드가 있었습니다.

글에 있는 코드를 저장하고 적당히 컴파일해서 워크플로우에 끼워맞추면 됩니다. 기왕이면 이미지 파일도 같이 넣어두면 동기화해도 그대로 꺼내쓸 수 있죠.


[Alfred]자동으로 메뉴 막대 가리기 및 보기

오래 전에 받았던 자동으로 메뉴 막대 가리기와 보기 알프레드 워크플로우가 작동하지 않는 것 같아서 나름대로 뜯어고쳐 봤습니다만, 알고보니 10.12.6과 10.13.4에서도 모두 정상작동하더군요. 둘 다 GUI 스크립팅이지만 원본은 순서 기반으로 하고 저는 텍스트 기반으로 했으니 범용성도 아직은 원본이 더 뛰어나구요. 뜯어고친 워크플로우는 깃헙에 올려두었습니다만, 10.13까지는 원본1이 나을 것으로 생각됩니다.

배운 점

기존에는 GUI 스크립팅을 위해서는 무조건 창을 가장 앞으로 가져와야 한다고 생각을 했습니다만 반드시 그런 건 아니었습니다. set the current pane to pane id를 통해서 백그라운드에서도 설정 앱을 Navigating 하는 게 가능하더군요.

set menuStatus to (do shell script "defaults read \"Apple Global Domain\" _HIHideMenuBar")

tell application "System Preferences"
   set the current pane to pane id "com.apple.preference.general"
end tell

tell application "System Events"
	tell first window of process "System Preferences"
		delay 0.5
		click checkBox 4
	end tell
end tell

delay 0.5
tell application "System Preferences" to quit
  1. 사파리에서는 한글이 URL 인코딩되면서 다운로드가 불가능해지기 때문에 다른 브라우저로 받으시는 게 좋겠더군요. 


Minimal-Status-Bar

image

macOS에서는 Safari를 기본 브라우저로 탑재하고 있습니다. 비교적 가볍고 경쾌하게 쓸 수 있는 브라우저죠.

한 가지 단점이라면 가볍다보니 이런저런 편의사양이 부족하다는 점입니다. 이를 보충하기 위해서 익스텐션이 있습니다.

BTM의 글을 참조해서 익스텐션을 설치해서 쓰곤 했는데 이번에 맥북에 10.13을 클린설치하고 사파리 익스텐션을 설치하려고 보니까1 잘 쓰던 Ultimate Status Bar의 페이지가 사라져버렸더랍니다.

그래서 대안을 찾아보니 Minimal-Status-Bar라는게 있어서 설치를 해봤습니다. Ultimate Status Bar가 상당한 수준의 커스터마이징을 지원했다면2 이건 그냥 아주 기본적인 부분만 크롬 스타일로 보여주는 게 목적이라고 합니다.

일단 집에와서 맥미니에 설치되어 있던 Ultimate Status Bar를 꺼내긴 했는데 이걸 맥북 에어에 붙일지는 조금 더 고민을 해봐야 할 것 같습니다. 일단 아쉬운대로 UBS 익스텐션 파일 첨부

  1. 덤으로 사파리 주소창이 자꾸 글자를 잡아먹는 문제도 원인을 파악하기 위해서 일부러 사파리 익스텐션은 천천히 설치하고 있습니다. 

  2. 사실 이게 한 번 세팅을 해놓으면 만족스럽긴 합니다만 세팅하기까지 꽤 귀찮은 수준이라 오히려 이런 단순한 구성도 괜찮더군요. 


사파리 익스텐션 추출하기

맥북 에어에 10.13을 클린설치하고 Safari를 다시 설치하는 와중에 Ultimate Status Bar의 페이지가 없어져버려서(보기) 맥미니의 USB1룰 추출할 필요성이 생겼다.

해결

사실 별 거 없는데 ~/Library/Safari/Extensions/ 경로로 가보면 익스텐션 파일들이 .safariextz의 형식으로 남아있다. 그거 꺼내서 쓰면 된다.


  1. Universal Serial Bus 아님