"긁어놓은 걸 못 읽겠으면 앱한테 복사를 시켜. 그리고 클립보드는 찾은 그대로 돌려놓고."
클립보드를 빌렸다가 돌려주기
AX 가 긁어놓은 걸 못 볼 때, 모든 앱이 알아듣는 게 하나 있어. Cmd+C. Flint 가 복사를 흉내 내면 불투명한 앱도 긁어놓은 글을 클립보드에 올려주고, Flint 는 거기서 읽으면 돼. 문제는 뻔하지. 사용자가 복사해둔 게 날아가잖아. 그래서 이 찔러보기는 되돌려놓게 만들어져 있어. 클립보드를 통째로 떠놓고, 복사 한 번만 빌리고, 결과를 읽고, 원래 있던 걸 도로 넣어. 제대로 하면 사용자 클립보드는 그대로고, 빌렸다는 것도 몰라.
Cmd+C 흉내 내기
복사 자체는 가짜 키 입력이야. C 키에 Command 를 얹은 눌림과 뗌 이벤트를 만들어 이벤트 흐름에 밀어 넣어. 사용자가 진짜로 Cmd+C 를 누른 것처럼. 앞의 앱은 그걸 받고 늘 하던 대로 복사하지. Flint 가 남의 앱 속을 뜯어보는 게 아니야. 그 앱이 이미 갖고 있는 보편적인 동작 하나를 쓰고, 결과가 떨어지는 표준 자리를 읽는 거야.
NSPasteboard 를 읽으면 옛날 내용을 읽고는 찔러보기가 실패했다고 착각하게 돼. 맞는 방법은 페이스트보드의 changeCount 를 미리 적어두고 그게 올라갈 때까지 짧게 기다리는 거야. 그 숫자가 올라간 게 복사가 진짜로 일어났다는 증거니까.되돌려놓는다는 건 진짜로 돌려놓는 것
이 찔러보기가 받아들여지는 이유 전부가 마지막 되돌려놓기에 있어. 복사하기 전에 Flint 가 지금 클립보드를 통째로 떠. 읽고 나면 떠뒀던 걸 도로 써넣고. 복사가 아무것도 안 만들어냈어도, 그러니까 changeCount 가 안 움직였어도 어쨌든 되돌려놓고 긁힌 게 없다고 보고해. 성공이든 실패든 클립보드를 빌린 채로 두는 법이 없어. 다음 레슨은 그 떠놓기와 되돌리기를 제대로 하는 얘기야. '클립보드 되돌려놓기' 가 생각보다 어렵거든.