Notepad2 4.2.25를 컴파일하기 전 준비사항

1. 컴파일 환경 구축

이전 버전과 달리 Notepad2 4.2.x는 Visual C++ v6.0으로는 컴파일되지 않는다.
Florian Balmer 님의 말씀에 의하면 VC6은 새로운 STL 라이브러리를 사용할 수 없기 때문이라고 한다.

새로운 STL 라이브러리 덕분에 일부 상황에서 엄청나게 느려지는 문제가 해결되었다.
(엔터 없는 엄청나게 긴 문장을 기존 버전의 Notepad2로 읽으면 이 문제를 경험할 수 있음)

대신 컴파일러로 WDK(Windows Driver Kit)를 사용해야 한다.
MS 홈페이지에서 다운받아 설치한다.


2. 버그 수정 #1 Edit.c (src\)


아래와 같은 행을 찾아서

if (!bAlphaNumeric && (!StrChr(L"'??,pszTextW[i]) || bWordEnd)) {

아래와 같이 수정한다.
(이 부분은 예전 패치와 약간 다름. 이렇게 패치해야 순정 Notepad2[각주:1]와 완벽히 동일해짐)

 static unsigned char ucQuotes[] = {0x27, 0x00, 0x19, 0x20, 0x60, 0x00, 0xB4, 0x00, 0x00, 0x00};
if (!bAlphaNumeric && (!StrChr((const wchar_t*)ucQuotes,pszTextW[i]) || bWordEnd)) {


3. 버그 수정 #2 Styles.c (src\)

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

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

BOOL Style_SelectFont() 메쏘드의 두 군데를 수정하면 된다.
우선, 아래와 같은 내용을 찾아서

if (bDefaultStyle &&
    lf.lfCharSet != DEFAULT_CHARSET &&
    lf.lfCharSet != ANSI_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 != ANSI_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);
}


4. Catalogue.cxx (scintilla\src)

Notepad2는 Scintilla의 모든 lexer를 사용하지는 않는다.
따라서, 사용하는 lexer 외엔 막아두어야 한다.

Catalogue.cxx의 마지막 부분은 LINK_LEXER(...)가 97개나 등장한다.
여기를 몽땅 지우고, 다음 내용으로 대체한다.

LINK_LEXER(lmAsm);
LINK_LEXER(lmBatch);
LINK_LEXER(lmConf);
LINK_LEXER(lmCPP);
LINK_LEXER(lmCss);
LINK_LEXER(lmDiff);
LINK_LEXER(lmHTML);
LINK_LEXER(lmMake);
LINK_LEXER(lmNull);
LINK_LEXER(lmPascal);
LINK_LEXER(lmPerl);
LINK_LEXER(lmPowerShell);
LINK_LEXER(lmProps);
LINK_LEXER(lmPython);
LINK_LEXER(lmSQL);
LINK_LEXER(lmVB);
LINK_LEXER(lmVBScript);
LINK_LEXER(lmXML);


5. 문자열 수정 version.h (src\)

기능과는 별 관계가 없지만, 2번과 유사한 이유로 가 제대로 표시되지 않고 ?로 표시되는 문제가 있다.
이 문제를 해결하려면 아래와 같은 내용을 찾아서

#define VERSION_LEGALCOPYRIGHT_SHORT L"Copyright ?2004-2011"
#define VERSION_LEGALCOPYRIGHT_LONG L"?Florian Balmer 2004-2011"

아래와 같이 수정한다.

#define VERSION_LEGALCOPYRIGHT_SHORT L"Copyright ⓒ2004-2011"
#define VERSION_LEGALCOPYRIGHT_LONG L"\0251Florian Balmer 2004-2011"

참고로, 해당 문자들은 문자 인코딩을 Windows-1252로 변경하면 제대로 볼 수 있다.


이것으로 컴파일 준비는 거의 끝났다.
마지막으로 wdkbuild\make.cmdWDKBASEDIR의 위치를 정확히 지정한 뒤 make.cmd i386만 입력하면 된다.

  1. Florian Balmer는 스위스인인데, 아마도 스위스어(독일어)에서는 조금 다른 따옴표도 쓰이는 것 같다. 순정 Notepad2는 4가지의 따옴표를 인식한다 [본문으로]