날개셋 한글 입력기 9.5, 그리고 타자연습 3.81이 나왔다. 9.3 이후 반 년을 넘어 거의 200일 만이다.
지금으로부터 두 달쯤 전의 개발 근황글에서 예고한 바와 같이, 이번 9.5는 '파이널' 버전이다. 수 년치 분량의 TODO 리스트를 갖고 작정하고 새 아이디어, 새 기능을 구현하고 리모델링 리팩터링을 하던 것은 여기까지이다.
그 과업이 다 이뤄졌다! 내 인생에 이런 날이 오다니 감개무량하면서도 한편으로는 그저 담담하다. 9.5 이후부터는 장기 계획 없이 소규모 유지보수만 소규모로 진행될 것이다.
작년 여름에는 나라 사정 때문에 슬럼프에 빠졌던 게 많았던 반면, 올해 여름은 그런 외부 요인이 개발 컨디션에 심하게 영향을 끼친 건 없었다. 그래도 폭염이 너무 심하긴 했다..;;
또 이 정도면 정말 '완결 파이널'이라고 내 양심과 역사와 국가와 민족 앞에서 정말 단언할 수 있을지 확신이 서지 않아서 테스트만 하다가 긴 시간을 그냥 보내 버리기도 했다. 그래도 올여름은 넘기지 않고 끝을 보게 됐다.
1. 동시치기
이번 9.5 버전에서 제일 핵심적인 새 기능은 초보적인 수준의 동시치기이다.
지금까지 날개셋 한글 입력기가 세벌식 자판의 고급 응용 기능 명목으로 제공해 온 것은 오토마타를 통한 모아치기나 무한 낱자 수정 정도였다. 이건 일면 편리하지만 현재 글자를 최대한 붙이고 유지시켜 주는 것에만 최적화돼 있다. 다음 글자로 분리되어야 하는 상황의 대비가 미흡한 반쪽짜리이다.
그래서 새 버전에서는 한글 입력 중에 일정 간격을 두고 마지막 두 타가 이전 타보다 충분히 빠르게 입력됐다면, 이건 다음 글자에 대한 동시입력으로 간주하고 그 두 타를 뒤로 같이 보내는 로직을 구현했다.
마지막 두 타를 한꺼번에 다음 글자로 보내는 동작 자체는 이전 버전에서부터 구현돼 있었다. 그걸 후대 버전에서 드디어 본격적으로 활용하게 된 것이다.
이 기능을 사용하면 세벌식 자판에서도 명목상 도깨비불 현상 같은 동작이 발생할 수 있다. 물론 그래도 종성이 초성으로 바뀐다거나 하지는 않고 그냥 위치만 이동한다.
동시치기는 시간 주기부터 시작해서 세밀한 동작 옵션이 존재할 여지가 많은 기능이고 이것만 전담하는 빠른설정이 존재해도 이상할 게 없다. 본인도 그걸 의도하기도 했다. 동시치기는 특정 입력 방식이 아니라 안 마태건 공 병우건 세벌식 입력 방식에 적용 가능한 일종의 범용적인 패러다임이니까 말이다.
하지만 9.5 버전은 그 정도까지 구현하지는 못하고, 그냥 '동시치기 테스트.ist'라는 예제 파일만 넣어서 공 병우 세벌식 글자판을 기준으로 이런 기능도 구현 가능하다는 맛보기를 시연하는 선에서 그쳤다.
해당 파일을 열어 보면 설명문에 오토마타 로직이 세밀하게 설명돼 있는데, 핵심은 이렇다.
고급 입력 스키마의 옵션을 바꾸서 동시치기 타이밍 변수를 제공하게 한다(고급 스키마 옵션 - 한글 동시치기 타이밍을 오토마타 Q 변수에 전달).
그 뒤, 실제로 두 타를 옮기는 것은 두 타가 가리키는 (1) 한글의 성분이 서로 다르고(초성+중성, 중성+종성 등..), (2) 두 타를 떼어내더라도 앞 글자가 최소한 초성과 중성을 갖추고 있을 때에만 떼어낸다.
이 두 조건을 체크하기 위해서 오토마타에 s, r, u, v 같은 복잡한 변수와 수식들이 있는 것이다. 별로 어려울 것 없다.
이 입력 방식에서는 '아'를 친 뒤에 'ㅣ+ㄱ'을 빠르게 입력하자 글자가 처음에는 무한 낱자 수정 때문에 '이'가 됐다가 다시 '아'로 바뀌면서 '아기'가 입력되는 것을 볼 수 있다. 물론 그냥 단순히 순차적으로 빠르게 칠 때 예기치 않은 부작용도 발생하지 않게 타협점을 찾으려 했다.
이 정도는 돼야 두벌식이나 세벌식이나 컴퓨터에서는 성능과 편의성 차이가 별로 없다는 말을 완전히 반박할 수 있지 않을까? 세벌식은 타자기에서 이미 기본적인 온전한 입력이 되고 컴퓨터로 가면 오타 수정이 더 편하게 되고 타이밍 오차 보정까지 되는 입력 방식을 구현할 수 있으니 말이다. 그것도 언어 데이터 없이 그냥 원초적인 수준에서 말이다.
지난번 개발 근황에서 먼저 소개되었던 한글 조합 유지 기능은 한글과 비한글끼리의 순서를 보정하는 기능이고, 이번에 완결된 기능은 한글과 한글끼리의 순서 내지 음절 경계를 보정하는 기능이다. 이런 기능이 타자에 실질적으로 얼마나 도움이 되었는지를 입증하는 실험 데이터가 좀 있으면 좋겠다.
참고로 지금으로부터 10여 년 전, 4.x 버전 시절에 '고급 스키마'의 전신격인 동시입력 스키마라는 게 날개셋 한글 입력기에 이미 도입된 적이 있었다. 옛날 자료를 찾아보니 2개 이상의 한글 글쇠가 동시에 눌렸을 때 '중간 상태'로 진입하고, 모든 글쇠가 떼어지면 '종결 상태'로 넘어갔다. 종결 상태에서는 '고+ㅏ'나 '고+ㄴ'처럼 평소에 조합 가능한 입력이라도 더 결합을 거부하고 다음 글자로 가게 해서 음절을 구분했었다.
동시치기의 원론적인 동작에 정말 충실하게 로직을 구현하긴 했지만, 이 상태로 실제로 쳐 보면 생각보다 불편하다.
특히 기존의 이어치기 방식으로 타자를 빠르게 하면 오동작도 많이 겪게 된다. 동시치기 내지 동시치기에 준하는 빠른 타자가 행해지는 동안에는 음절 경계의 타이밍의 차이로 물리적인 음절 경계를 구분하는 게 더 낫다.
옛날 '동시입력 스키마' 시절에도 'ㅇ.ㅏ' 오타를 보정하고, keyup 타이밍 때 비한글 문자를 뱉는 옵션은 구현돼 있었다. 비록 한글 조합 중에 그 비한글 문자가 같이 보이지는 않지만 말이다.
2. 입력 도구들의 개선
9.3은 참신한 입력 도구들이 대거 추가된 버전이었다. 그리고 지난번에 다음 버전 개발 근황을 전한 뒤에도 입력 도구에 대한 개선 작업이 더 진행되었다. 구체적인 변화 내역은 다음과 같다.
'조합 안에 조합 생성' 입력 도구가 제공하는 변환 기능 중, '새김을 한자로'도 한번에 여러 한자의 훈을 한꺼번에 입력해서 여러 개의 한자로 순차적으로 변환할 수 있게 했다. 더구나 새김을 끝까지 다 입력하지 않아도 된다.
가령, "땅불바람물마음"이라고 한꺼번에 친 뒤에 한자를 하나씩 골라서 "地火風水心"을 곧장 입력할 수 있다. 이전 9.3에서는 이런 게 가능하지 않았으며, '땅'까지만 치고 나서 변환을 직접 한 뒤에 다음 글자를 입력해야 했다.
그리고 '조합과 후보 자동 완성' 입력 도구도 여러가지가 개선됐다.
(1) 먼저, 목록에서 오른쪽에 작게 표시되는 보조 문자열(조합 목록에서 글쇠 문자, 후보 목록에서 설명문)이 한 줄에 가지런히 맞춰서 출력되게 해서 미관을 개선했다.
(2) 조합이나 후보가 출력될 게 아무것도 없는 상황에서는 해당 목록이 작게만 공간을 차지하는 게 아니라 아예 화면에서 사라지게 했다. 좌측 상단에 있던 자그마한 기본 버튼들만 남아있다.
(3) 다른 프로그램에서는 별 문제가 없는데 MS Word에서는 이 입력 도구가 cursor 주변에 표시되지 않고 화면의 좌측 상단에 잘못 표시되는 문제가 있었다. 쟤만 유독 까탈스럽게 동작하는 게 있어서 문제를 꽤 번거로운 방법으로 우회해야 했지만.. 어쨌든 버그를 고치긴 했다.
(4) 이 도구를 띄워 놓은 상태에서 운영체제의 테마나 색깔 배색을 변경하고 나면 보조 문자열의 글꼴이 깨져서 굴림체로 바뀌어 버리던 문제를 해결했다. 그 이벤트가 발생했을 때의 처리 절차에 논리적으로 구멍이 있기 때문이었는데, 이를 총체적으로 싹 손 봤다. 공통으로 사용하는 글꼴 같은 리소스를 반드시 초기화부터 한 뒤에 입력 도구들이 이벤트를 받게 했으며, 이 순서가 꼬이는 일이 없게 했다. 심지어 날개셋 편집기와 외부 모듈을 동시에 구동했을 때에도 말이다.
(5) 이 외에도.. 프로그램을 이 정도로 변태같이 사용하는 경우는 현실적으로 극히 드물겠지만,
날개셋 편집기에서 또 외부 모듈을 구동하고, 두 구현체가 제각각 '조합과 후보 자동 완성' 도구를 구동했을 때.. 그리고 TSF가 아니라 이제는 사실상 사용되지 않는 9x~XP까지의 구형 IME 프로토콜로 동작할 때, 여러 오동작이 발생하던 문제들을 해결했다.
과거의 9.3을 개발하던 당시에 시간에 쫓기느라 이런 극한이나 레거시 환경에서까지 꼼꼼히 테스트를 하지 못해서 문제가 남아 있었다. 단지 그게 크게 부각되는 주요 문제가 아니었을 뿐이다.
3. 그 밖의 UI 개선
(1) 날개셋 제어판에서 '분야'를 선택하는 트리 컨트롤을 키보드로(주로 상하 화살표) 조종하면.. 그 분야에 해당하는 제어판 페이지가 곧장 뜨는 게 아니라, 중간에 0.2초 정도 지연을 넣었다.
키 입력이 일정 시간 이상 안 들어올 때에만 화면을 갱신하는 것이다. 화살표 키를 빠르게 연타하거나 꾹 누르고 있을 때, 일일이 제어판 페이지를 준비하느라 프로그램의 반응성을 떨어뜨리지 않기 위해서이다.
사실, Windows의 제어판은 오래 전부터 이미 이렇게 동작하고 있다.
디렉터리를 표시하는 트리는 마우스 클릭에는 즉각 반응하지만 키보드의 화살표 키에는 그렇게 하지 않는다. 잠시 뜸을 들이고 있다가 사용자가 키보드에서 손을 완전히 뗀 뒤에 그 디렉터리의 내용을 옆의 리스트 컨트롤에다가 표시해 준다. 매번 한 디렉터리의 파일 목록을 얻는 건 힘들고 시간이 많이 걸리기 때문이다.
트리 컨트롤이 이렇게 키보드에 대해서 지연 인식을 하는 건.. 정형화된 동작이고 여러 곳에서 쓰일 만한 기능인데, 어째 운영체제 공용 컨트롤 차원에서 제공되는 건 없는지 궁금하다(스타일, 플래그 형태로). 그런 게 있다는 소식을 들은 적이 없기 때문에 본인은 해당 동작을 수동으로 직접 구현했다.
(2) 그리고 또 사소한 것..
날개셋 한글 입력기의 대화상자 UI 중에는 파란색 밑줄이 쳐진 하이퍼링크가 있다. 가령, About 대화상자에 있는 홈페이지 주소라든가 '후원 안내' 말이다.
이전 버전까지는 마우스로 클릭한 것만 인식됐지만, 이제는 거기에 포커스를 옮기고 space를 누른 것도 인식되게 동작을 개선했다. 마우스 없이도 링크 클릭 명령을 내릴 수 있다. 원래 이렇게 되는 게 맞다.
4. 타자연습
끝으로, 타자연습은 딱히 새로운 기능이 추가되거나 동작이 바뀐 것은 없다. 하지만 API 호환이 깨졌기 때문에 입력기 9.5 엔진에 맞춰 다시 빌드되었으며, high DPI에서 실행되었을 때 발생하던 각종 glitch들을 잡았다. 이것 분량이 버전을 0.01 정도는 올릴 수준이 된다고 여겨지기 때문에 버전을 올리게 되었다.
- 프로그램의 시작 화면에 나타나 있는 탭(시작, 글쇠 익힘, ... 통계)들이 지금보다 더 큼직하고 시원스럽게 배치되게 했으며, high DPI에서 한글의 아랫부분이 보기 흉하게 짤리던 문제를 해결했다.
- DPI가 200%인가 225%를 넘어간 상태에서 샌드위치 내지 상하 대조 방식으로 긴글 연습을 하면 줄 전체에 꽉 차는 긴 문장이 제대로 찍히지 않고 뒷부분이 씹혔다. 새 버전에서는 이 문제를 해결했다. 물론 날개셋 한글 입력기의 비트맵 글꼴은 150% 배율까지만 크기가 보장되기 때문에 확대 배율을 너무 높게 잡으면 프로그램을 제대로 사용하기 곤란해지긴 한다..;;
- '글쇠 익힘'과 '낱말 연습'에서 쓰이는 손가락 위치 선택 리스트 박스가 high DPI에서도 너무 작게 찍히던 문제를 해결했다.
- '긴글 연습' 화면의 아래에 나타나 있는 도구모음줄(앞/뒤쪽..)도 high DPI에서 버튼들이 너무 비좁고 조밀하게 찍히던 것을 개선했다.
위의 그림에 묘사된 before/after에서 보다시피, 타자연습뿐만 아니라 편집기도 high DPI 환경에서 도구모음줄 아이콘들이 전반적으로 더 큼직하게 찍히게 했다. 편집기의 경우, 계산기 대화상자의 계산 결과 리스트가 high DPI의 글자 크기보다 너무 좁은 줄 간격으로 찍히던 문제도 있어서 이를 해결했다.
한편, 다시 타자연습으로 돌아오면.. 고대비 검정 모드에서 긴글 연습을 하면 disable된 도구모음줄 버튼들이 자기 고유한 형체가 없이 이렇게 사각형으로 뭉개져서 찍히곤 했다. 이를 정상적인 형태로 개선했다(위 vs 아래). 도구모음줄이 상시 표시되어 있는 날개셋 편집기에서는 진작부터 이런 처리를 하고 있었는데 타자연습에서는 지금까지 그 생각을 못 했었다.
이 정도..
이번 새 버전은 이제 정말로 더 고칠 것 없이 오랫동안 잘 쓰였으면 좋겠다.
Posted by 사무엘