Scintilla IME 패치 :: 2007/04/25 19:39


IME 패치를할 때 가장 먼저 해야 하는 것은 WM_IME_COMPOSITION 메시지를 처리하는 겁니다. Scintilla의 경우 메시지 핸들러 HandleComposition입니다. 기본적인 처리는 되어 있는데 GCS_COMPSTR을 처리해주지 않아서 조합 과정이 보여지지 않습니다. 간단하게 GCS_COMPSTR을 추가해 주면 됩니다. IME와 관련된 내용은 http://www.winapi.co.kr의 당근 프로젝트 설명 문서를 참고하시면 됩니다. 아래 내용을 Scintilla의 ScintillaWin.cxx 파일에 추가해 줍니다. 일부 추가된 함수들의 원형을 해당 파일의 클래스에 같이 추가해 주셔야 합니다.

소스 보기...

다음으로 할 일은 커서를 조정하는 일 입니다. Scintilla의 경우 자체적으로 커서를 그리는 부분이 있고 Win32 API를 사용하는 부분도 있습니다. 하지만 실제로는 자체 커서만을 사용합니다. Win32 커서를 다루는 부분이 조금 이상하게 되어 있습니다. 위의 함수들과 마찬가지로 아래 함수들도 ScintillaWin.cxx에 추가해 주면 됩니다. 없는 함수들은 마찬가지로 클래스 선언에 추가해 주세요. 같은 파일에 있습니다. 한글일 때 커서 크기를 크게 해주는 것만 신경쓰면 됩니다.

소스 보기...

이제는 자잘한 작업만 남았습니다. Editor.h에 다음 변수를 추가하세요. 이 변수를 ScintillaWIn에 추가하지 않는 이유는 아래 나옵니다.


Editor.cxx의 생성자에 아래 코드를 추가해 주세요.


Editor.cxx의 AddCharUTF 부분의 if문을 아래와 같이 변경해 주세요. !inComposition 조건만 추가해 주면 됩니다. 이건 오버라이트 모드와 관련된 부분입니다. 오버라이트 상태가 되면 기존 글을 지우고 그 위치에 새로 입력한 글을 추가해주죠. 그런데 한글 조합중일때는 여러 글자가 추가되기 때문에 조합 과정에서 글자가 계속 지워지는 현상이 발생합니다. 그래서 조합이 아닌 상태일때만 지워주도록 해주는 겁니다.


이제 마지막 작업만 해주면 됩니다. Editor.cxx에서 Draw the Caret을 찾아서 해당 블록을 주석 처리해 줍니다. 이 부분은 자체적으로 커서를 그리는 부분인데 우리는 API를 사용해서 그리기 때문에 굳이 필요가 없습니다. 적당한 전처리기를 사용해서 윈도우일때만 안그리도록 해주면 되겠습니다.


아래는 수정된 세 개의 파일입니다.


네이버에 북마크 다음에 북마크 마가린 바르기 HanRSS에 북마크하기 이올린에 북마크하기 News2.0에 투고하기 del.icio.us에 북마크하기 Digg에 번역해 투고하기 dzone에 번역해 투고하기 붐바
이올린에 북마크하기(0) 이올린에 추천하기(0)
스폰서
글타래

Trackback Address :: http://www.jiniya.net/tt/trackback/494
  • Gravatar Image.
    sixmen | 2007/11/16 16:58 | PERMALINK | EDIT/DEL | REPLY

    IME 관련 수정을 하고 보니까 이미 하신 분이 계셨네요 ^^
    그런데 저보다 많이 복잡하게 하셨네요..

    patch를 제출한 상태인데 버그가 있으면 곤란한데 혹시 관심있으시면 다음 코드에 문제될 부분 없는지 살펴보실 생각없으신가요?

    http://groups.google.com/group/scintilla-interest/browse_thread/thread/55562e192b8e909b

    • Gravatar Image.
      codewiz | 2007/11/16 17:35 | PERMALINK | EDIT/DEL

      좋은 정보 감사합니다.
      지금 배포하는 패치는 훨씬 더 복잡하답니다. ㅠㅠ
      제가 직접 패치를 테스트 해보진 않았습니다만 아마도 undo 문제가 있을 것 같아 보입니다. 삽입 모드로 두고 한글을 입력하거나, 한글을 입력한 다음 ctrl + z를 눌러보세요.

      패치는 훨씬 깔끔하네요.
      SetSelection을 쓰면 되는줄 몰랐습니다. 헐... ^^

Name
Password

Homepage
Secret