본문 바로가기

장난감들

PuTTY 한글/영문 글꼴 분리하기

오늘도 삽질 하나. 날씨도 너무 덥고 텍스트큐브 코딩도 안 되고(?) 해서 PuTTY를 뜯었다.;; 그동안 오랜 숙원사업(?)이었던 한글/영문 글꼴의 완전한 분리에 성공했다.

PuTTY 소스코드가 생각보다 난잡(...)해서 찾는 데 좀 시간이 걸렸지만 더위는 이열치열(?)이라는 생각으로 삽질을 해주니 마침내 어디를 고쳐야 하는지 찾을 수 있었다.

방법은 간단히 다음과 같이 window.c를 패치해주고 컴파일하면 끝.;; 보다시피 급조한 거라 글꼴 설정은 소스코드에 하드코딩되어 있다; 기준 소스는 0.60 최신 버전. 아참, 생성만 하고 소멸시키지 않는 것처럼 보이나 다른 부분에 보면 FONT_MAXNO까지 배열을 순회하며 DeleteObject를 호출해주는 부분이 있으므로 걱정 안 해도 된다.

//...
#define FONT_OEMBOLDUND 0x23
#define FONT_NONLATIN 0x30
#define FONT_MAXNO 	0x30 //0x2F

//...

static void init_fonts(int pick_width, int pick_height)
{
//...
    f(FONT_NORMAL, cfg.font.charset, fw_dontcare, FALSE);
    fonts[FONT_NONLATIN] = CreateFont (font_height, font_width, 0, 0, fw_dontcare, FALSE, FALSE, FALSE, \
        cfg.font.charset, OUT_DEFAULT_PRECIS, \
        CLIP_DEFAULT_PRECIS, FONT_QUALITY(cfg.font_quality), \
        FIXED_PITCH | FF_DONTCARE, "Dotum");

    SelectObject(hdc, fonts[FONT_NORMAL]);
    GetTextMetrics(hdc, &tm);
//...
}

void do_text_internal(Context ctx, int x, int y, wchar_t *text, int len,
              unsigned long attr, int lattr)
{
//...
    } else {
    /* And 'normal' unicode characters */
    static WCHAR *wbuf = NULL;
    static int wlen = 0;
    int i;

    if (wlen < len) {
        sfree(wbuf);
        wlen = len;
        wbuf = snewn(wlen, WCHAR);
    }

    for (i = 0; i < len; i++)
        wbuf[i] = text[i];

    /* EXTRA PATCH for non-latin font replacing... */
    SelectObject(hdc, fonts[FONT_NONLATIN]);
    text_adjust = 1;

    /* print Glyphs as they are, without Windows' Shaping*/
    general_textout(hdc, x, y - font_height * (lattr == LATTR_BOT) + text_adjust,
                &line_box, wbuf, len, IpDx, !(attr & TATTR_COMBINING));
//...
}

유니코드 렌더링 부분을 바꾼 것이기 때문에 CP949나 윈도98과 같은 환경에서는 어떻게 나오는지 모르겠지만 일단 나는 유니코드 터미널만 쓰고 있으므로 패스; =3

내가 VS2005로 컴파일한 바이너리는 KLDP를 참조하기 바란다.

추가: 앞으로 원활한 개발을 위해 공개 subversion 저장소를 생성하였다. ViewVC를 통해 살펴보려면 이 링크를 참조하기 바란다. SVN 프로토콜로 접근하려면 경로에서 view를 빼면 된다.

  • PuTTY 2008.07.09 23:46

    ^^ 이번에 무료화된 Xshell 3.0도 좋더군요.

  • 맛있는점심 2008.07.22 22:13

    explorer 재시작시에 트레이 아이콘이 재등록되지 않는 것 같습니다.
    TaskbarCreated 메시지가 왔을 때 아이콘을 재등록해야 explorer 재시작시에 아이콘이 재등록됩니다.

    • daybreaker 2008.07.28 00:33 신고

      아, 그런 문제가 있군요. 저도 예전에 tray 사용하는 윈도우 프로그램 만들 때 겪었던 문제지요; PuTTY tray 패치 자체는 제가 작업한 게 아니라서 자세히 들여다보지 않았기 때문에 미처 몰랐습니다.
      다음 번 작업 때 반영하겠습니다. :)

    • daybreaker 2008.07.31 12:26 신고

      해당 기능이 r29에서 추가되었습니다.
      http://svn.daybreaker.info/dputty/trunk/ 여기서 subversion으로 받아서 컴파일하시면 됩니다; 그외 몇 가지 기능들도 추가되었는데 아직 불완전한 면이 있어서 정식으로 exe로 컴파일하여 배포하는 것은 좀더 나중에 할 생각입니다.

  • nike 2013.07.23 11:29

    좋으면 좋고 싫으면 싫은 거지, 뭐가 이렇게 어렵고 복잡하냐구

  • Michael Kors outlet 2013.07.25 16:53

    태양이 바다에 미광을 비추면,나는 너를 생각한다.