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를 사용해서 그리기 때문에 굳이 필요가 없습니다. 적당한 전처리기를 사용해서 윈도우일때만 안그리도록 해주면 되겠습니다.


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


스폰서
글타래

  • 2주간 인기 글
  • 2주간 인기글이 없습니다.
Trackback Address :: http://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을 쓰면 되는줄 몰랐습니다. 헐... ^^

  • Gravatar Image.
    리얼토토 | 2009/04/17 14:48 | PERMALINK | EDIT/DEL | REPLY

    지금 하고있는 프로젝트에 적용할만한 괜찮은 edtior를 찾다가
    다음사이트에서 (http://www.codeproject.com/KB/edit/scintillawnd.aspx)
    scintilla를 알게되어 테스트를 해봤는데 한글입력 문제와
    테스트 프로그램을 Unicode로 빌드시 몇가지 문제점 때문에 적용여부를 고민중입니다.
    1. folding 마크(+, -)가 보이지 않는점
    2. syntex coloring 이 MBCS로 빌드시와 다르게 나옴(오작동으로 보입니다)
    이는 SciLexer.dll를 Unicode로 빌드해도 마찬가지네요...

    Unicode로 프로젝트를 진행하고있는데 scintilla가 Unicode에서 제대로 작동하지 않아서
    혹시 이문제를 아시는지 아신다면 해결하셨는지 궁금하여 질문드립니다.
    늦게라도 이글을 보신다면 죄송하지만 댓글이나
    realtoto2001@activeintra.com으로 답장을 좀 부탁드려도 될까요?
    항상 행복하시기 바랍니다. ^^

    한글입력 문제를 이렇게 패치해주신분이 계셨군요.


Name
Password
Homepage
Secret