xyzzy-022 / xyzzy

xyzzy 0.2.2 系列。有志により開発が継続中です。
http://xyzzy-022.github.com
MIT License
192 stars 43 forks source link

Wineでの日本語フォント設定 #386

Closed rapidexp closed 11 years ago

rapidexp commented 11 years ago

これはWineのWindows再現力の問題なのでアプリ側に提案するのは筋違いですが、もし心当たりがあることで対応可能ならと思いレポートします。

現象: Wine上でxyzzyでは日本語が文字化けし、アプリケーション起動のたびに毎回フォント設定をし直さなければなりません。 原因: フォント一覧において同名の欧文フォントと日本語フォントが2つ並び欧文フォントが先のため、保存されたフォント名をxyzzyが読み取っただけでは日本語になりません。

xyzzy-font-settings-1

xyzzyでは文字セットの指定をフォント一覧に反映させていない仕様であることが、何か影響しているのではないでしょうか。以下はWindows上でのNotepadとxyzzyです。

xyzzy-font-settings-2

通常アプリケーションでは文字セットの変更がフォント一覧に影響しますが、xyzzyではフォント一覧は日本語フォントに固定、もしくは何も指定されていないように思われます。

x022235 commented 11 years ago

ありがとうございます。 一応直してみました。

x022235 commented 11 years ago

メモ。

原因

修正方針

修正内容

非互換性

x022235 commented 11 years ago

EnumFontFamilies テストプログラム。

#include <stdio.h>
#include <windows.h>

static int CALLBACK
enum_font_proc (ENUMLOGFONT *elf, NEWTEXTMETRIC *, int type, LPARAM lparam)
{
    if (*elf->elfLogFont.lfFaceName == '@'
        || (elf->elfLogFont.lfPitchAndFamily & 3) != FIXED_PITCH)
        return 1;

    char face[256];
    WideCharToMultiByte (CP_OEMCP, 0, elf->elfLogFont.lfFaceName, -1, face, 256, 0, 0);
    printf("%s [%d]\n", face, elf->elfLogFont.lfCharSet);
    (*((int *)lparam))++;

    return 1;
}

static void
print_font_families (HDC hdc)
{
    int n = 0;
    EnumFontFamilies (hdc, 0, FONTENUMPROC (enum_font_proc), LPARAM (&n));
    printf("-------- EnumFontFamilies %d\n\n", n);
}

static void
print_font_families_ex (HDC hdc, BYTE charset, char *charset_name)
{
    int n = 0;
    LOGFONT font;
    memset (&font, 0, sizeof (LOGFONT));
    font.lfCharSet = charset;
    EnumFontFamiliesEx (hdc, &font, FONTENUMPROC (enum_font_proc), LPARAM (&n), 0);
    printf("-------- EnumFontFamiliesEx (%s) %d\n\n", charset_name, n);
}

int main(int argc, char* argv[])
{
    HDC hdc = GetDC (0);

    print_font_families (hdc);
    print_font_families_ex (hdc, SHIFTJIS_CHARSET, "sjis");
    print_font_families_ex (hdc, ANSI_CHARSET, "ansi");
    print_font_families_ex (hdc, DEFAULT_CHARSET, "all");

    ReleaseDC (0, hdc);
    return 0;
}