2009년 6월 5일 금요일

notepad2 컴파일 삽질기 1++ : 기본적인 오류 수정(3.1.21.5-rc4 용)

사용자 삽입 이미지

Notepad23.1.21.5로 곧 업그레이드 될 예정이다.
현재는 rc4까지 공개되었는데, rc4가 3월 10일에 나왔으니 조만간에 정식버전이 나올 것 같다.

그런데, rc4에서도 IME 입력문제는 해결이 되지 않았기 때문에 한글을 깔끔하게 입력하려면 패치를 해줘야 한다.
(아마도 앞으로도 계속 그럴 것 같다)

notepad2 컴파일 삽질기 1 : 기본적인 오류 수정에서 3.0.20의 소스를 수정하는 방법을 설명했는데, 3.1.21.5에서 환경이 조금 바뀌었다.
3.1.21.5의 소스를 Visual C++ v6.0에서 컴파일할 수 있도록 수정하는 방법을 설명하겠다.

VS2005, VS2008 등의 환경에서 사용할 수 있도록 수정하는 방법들은  notepad2 컴파일 삽질기 1에서 설명했으므로 넘어가겠다.


0. 들어가기 전에

다음과 같은 내용은 모두 준비가 되어있다고 가정하고 설명하겠다.
a. Visual C++ v6.0 및 Service Pack 6 설치
b. Platform SDK 설치 (Windows® Server 2003 R2 Platform SDK ISO Download)
c. Scintilla 1.78 다운로드
d. np2-3.1.21-build_vc6.patch 적용



1. Edit.c 수정(예전 패치 그대로이다)

void EditTitleCase(HWND hwnd) 메쏘드에서
if (!IsCharAlphaNumericW(pszTextW[i]) && !StrChr(L"'?,pszTextW[i])) {
라는 행을 찾아
if (!IsCharAlphaNumericW(pszTextW[i]) && !StrChr(L"'",pszTextW[i])) {
로 바꿔준다.
이건 소스 쪽 오타다. ㅠ.ㅠ



2. Styles.c 수정(이것 역시 예전 패치 그대로다)

Notepad2/Scintilla에는 약간 이상한 버그가 하나 있다.
글꼴을 지정하는 과정에서 charset이 0으로 기록되면 다른 프로그램으로의 복사/붙이기가 정확하게 이루어지지 않는다는 점이다.
(okto님께서 Notepad2 제작자에게 문의를 하셨지만, Scintilla 쪽 버그라 손을 안 대겠단 답을 들었다)

이 문제를 간단히 해결하기 위해 charset이 0인 경우는 기록하지 않도록 수정한다.

BOOL Style_SelectFont(HWND hwnd,LPWSTR lpszStyle,int cchStyle,BOOL bDefaultStyle) 메쏘드의 두 군데를 수정하면 된다.
우선, 아래와 같은 부분을 찾는다.
if (bDefaultStyle &&
    lf.lfCharSet != DEFAULT_CHARSET &&
    lf.lfCharSet != iDefaultCharSet) {
  lstrcat(szNewStyle,L"; charset:");
  wsprintf(tch,L"%i",lf.lfCharSet);
  lstrcat(szNewStyle,tch);
}
이곳을 아래와 같이 고쳐준다.
if (bDefaultStyle &&
    lf.lfCharSet != DEFAULT_CHARSET &&
    lf.lfCharSet != iDefaultCharSet &&
    lf.lfCharSet) {
  lstrcat(szNewStyle,L"; charset:");
  wsprintf(tch,L"%i",lf.lfCharSet);
  lstrcat(szNewStyle,tch);
}


다음으로 이렇게 생긴 부분을 찾는다.
if (Style_StrGetCharSet(lpszStyle,&iValue))
{
  if (lstrlen(szNewStyle))
    lstrcat(szNewStyle,L"; ");
  wsprintf(tch,L"charset:%i",iValue);
  lstrcat(szNewStyle,tch);
}
이곳은 이렇게 고친다.
if (Style_StrGetCharSet(lpszStyle,&iValue) && iValue)
{
  if (lstrlen(szNewStyle))
    lstrcat(szNewStyle,L"; ");
  wsprintf(tch,L"charset:%i",iValue);
  lstrcat(szNewStyle,tch);
}



3. Scintilla 소스에 반영

Scintilla가 최근(4월) 1.78로 업데이트 되면서 PerLine.h, PerLine.cxx라는 파일 2개가 추가되었다.
그런데, 앞에서 언급한 VC6 패치에는 이 두 파일이 포함되어있지 않다.
이 두 파일을 소스에 추가해야 정상적으로 컴파일이 된다.
두 파일을 Scintilla/src 카테고리에 추가한다.
사용자 삽입 이미지

바로 여기다. ^^;




4. IME 패치

 IME 메시지를 처리하도록 수정undo/redo가 정상동작하도록 수정 (버그패치) 등은 3.1.21.5에도 그대로 적용된다.
그 패치를 적용하면 IME를 정상적으로 이용할 수 있다.


댓글 6개:

  1. 개인적으로는 직접 패치 하시는거 보다는, notepad2 프로젝트에 정식으로 커밋해달라고 하는게 편하지 않을까요?

    답글삭제
  2. @구차니 - 2009/06/05 12:53
    일전에 비슷한 내용을 몇몇분들께서 요청하신 적이 있습니다.



    그런데, 문제는 이 패치가 Scintilla의 패치와 엮여있으며, 둘을 동시에 패치하지 않으면 제대로 패치가 되지 않는 구조이기 때문에 Florian Balmer 옹께서 패치 자체를 수용하지 않았습니다.



    Scintilla 입장에선 나름 IME 입력을 받아들이는 구조이나, Notepad2가 순수하게 영문 입력기 기준으로 만들어지다보니, undo가 적절하게 동작지 않는 문제가 발생하는데, 현재까진 이 문제를 깔끔하게 해결할 묘안이 없습니다.



    그러다보니 이런 불편함을 안고 살아야 합니다. [emo=038]

    답글삭제
  3. trackback from: 블로그에 BBcode 3.0 및 삽입 도우미 설치
    BLUEnLIVE님 블로그에 방문했다가, BBcode 삽입 도우미가 수정 업데이트 되었다는 포스트를 보고 바로 따라서 설치하였습니다. 방명록 입력창과 댓글 입력창 위에 BBCode 삽입 도우미가 설치된 모습입니다. BBCode란 무엇일까요? 제가 알기로는 HTML 태그와 유사하면서 웹페이지에서 전체 HTML 태그를 허용했을 때의 위험성을 줄이는 역할을 하는 코드 형식인 것으로 알고 있습니다. 웹페이지에서 전체 또는 특정 HTML 태그를 허용했을 때..

    답글삭제
  4. 음.. 노트 페드2로 넘어갈까.. 라는 생각중이긴하지만.;



    저같이 가끔~~~ 코딩하는 사람으로서는 아무거나 해도.^^..ㅋㅋㅋㅋㅋㅋ



    지금은 노트페드 ++ 사용중이긴합니다^^..ㅋㅋ

    답글삭제
  5. @사진우주 - 2009/06/08 07:51
    Notepad2와 Notepad++는 모두 Scintilla 라이브러리를 사용합니다.

    그런데, 그냥 사용하기엔 Notepad2가 더 빠르고, 외부 프로그램과 연동해서 사용하기엔 Notepad++가 기능이 훨씬 많습니다.

    답글삭제
  6. @BLUEnLIVE - 2009/06/08 12:49
    둘다 써야겠군요..ㅋㅋㅋㅋ..; 처음부터 해야되는건가..OTL....

    답글삭제