X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=src%2Fmain-x11.c;h=ea659a44c1db4931782b714a36c9df5050ef00e9;hb=57f8ef6e42a487dc2af160c8f28a9caf956b223c;hp=9703fe0c14d4214f57a0e46c683c6438ae092e26;hpb=1ae8d9e1e28a9f6206f142b2074e192d007c3553;p=hengband%2Fhengband.git diff --git a/src/main-x11.c b/src/main-x11.c index 9703fe0c1..ea659a44c 100644 --- a/src/main-x11.c +++ b/src/main-x11.c @@ -1,4 +1,4 @@ -/* File: main-x11.c */ +/* File: main-x11.c */ /* * Copyright (c) 1997 Ben Harrison, and others @@ -11,15 +11,15 @@ #ifdef USE_JP_FONTSTRUCT /* - * ÆüËܸì(EUC-JAPAN)Âбþ (-DJP) - * ¡¦´Á»ú¥Õ¥©¥ó¥È¤Î°·¤¤¤òÄɲà - * ¡¦ÆüËܸì¤ò´Þ¤àʸ»úÎó¤Îɽ¼¨¥ë¡¼¥Á¥ó XDrawMultiString() ¤ÎÄɲà - * ¡¦ÆüËܸì¤Îɽ¼¨Éý¤Ï¡¤¥Õ¥©¥ó¥È¤Î¾ðÊó¤Ë¤è¤é¤¹ASCII¥Õ¥©¥ó¥È¤Î2Çܤ˸ÇÄê + * 日本語(EUC-JAPAN)対応 (-DJP) + * ・漢字フォントの扱いを追加 + * ・日本語を含む文字列の表示ルーチン XDrawMultiString() の追加 + * ・日本語の表示幅は,フォントの情報によらすASCIIフォントの2倍に固定 * - * ̤Âбþ - * EUCȾ³Ñ¤Î°·¤¤ + * 未対応 + * EUC半角の扱い * - * 1996/6/7 Íû ¹¸¿­ (ri@kuis.kyoto-u.ac.jp) + * 1996/6/7 李 晃伸 (ri@kuis.kyoto-u.ac.jp) */ #endif /* @@ -126,7 +126,7 @@ char *XSetIMValues(XIM, ...); /* Hack for XFree86 4.0 */ #include #endif /* __MAKEDEPEND__ */ - +#include /* * Include some helpful X11 code. */ @@ -1310,7 +1310,7 @@ static errr Infofnt_prepare(XFontStruct *info) if(ascent < (*fontinfo)->ascent) ascent = (*fontinfo)->ascent; if(descent < (*fontinfo)->descent) descent = (*fontinfo)->descent; if(((*fontinfo)->max_byte1) > 0){ - /* ¿¥Ð¥¤¥Èʸ»ú¤Î¾ì¹ç¤ÏÉýȾʬ(ü¿ôÀÚ¤ê¾å¤²)¤Çɾ²Á¤¹¤ë */ + /* 多バイト文字の場合は幅半分(端数切り上げ)で評価する */ if(width < (cs->width+1)/2) width = (cs->width+1)/2; }else{ if(width < cs->width) width = cs->width; @@ -1507,7 +1507,7 @@ static void Infofnt_init_data(cptr name) #ifdef USE_JP_FONTSTRUCT /* - * EUCÆüËܸ쥳¡¼¥É¤ò´Þ¤àʸ»úÎó¤òɽ¼¨¤¹¤ë (Xlib) + * EUC日本語コードを含む文字列を表示する (Xlib) */ static void XDrawMultiString(display,d,gc, x, y, string, len, afont, @@ -1536,48 +1536,48 @@ XDrawMultiString(display,d,gc, x, y, string, len, afont, #ifdef TOFU if ( (*str) == 0x7f ) { - /* 0x7F¤Ï¢£¤Ç·è¤áÂǤÁ */ + /* 0x7Fは■で決め打ち */ - /* Ϣ³¤¹¤ë0x7F¤ÎŤµ¤ò¸¡½Ð */ + /* 連続する0x7Fの長さを検出 */ slen = 0; while ( str < endp && (*str) == 0x7f ) { slen++; str++; } - /* ÉÁ²è */ + /* 描画 */ XFillRectangle( display, d, gc, x, y-afont_ascent, slen * afont_width, afont_height); - /* ¥Ý¥¤¥ó¥¿¤ò¿Ê¤á¤ë */ + /* ポインタを進める */ x += afont_width * slen; } else #endif if ( iskanji(*str) ) { - /* UJIS¤Î»Ï¤Þ¤ê */ + /* UJISの始まり */ - /* Ϣ³¤¹¤ëUJISʸ»ú¤ÎŤµ¤ò¸¡½Ð */ + /* 連続するUJIS文字の長さを検出 */ slen = 0; while ( str < endp && *str && iskanji(*str) ) { kanji[slen].byte1 = *str++ & 0x7f; kanji[slen++].byte2 = *str++ & 0x7f; } - /* ÉÁ²è */ + /* 描画 */ XSetFont( display, gc, kfont->fid ); XDrawImageString16( display, d, gc, x, y, kanji, slen ); - /* ¥Ý¥¤¥ó¥¿¤ò¿Ê¤á¤ë */ + /* ポインタを進める */ x += kfont_width * slen; } else { - /* Èó´Á»ú(=ASCII¤È²¾Äê)¤Î»Ï¤Þ¤ê */ + /* 非漢字(=ASCIIと仮定)の始まり */ - /* Ϣ³¤¹¤ëASCIIʸ»ú¤ò¸¡½Ð */ + /* 連続するASCII文字を検出 */ p = str; slen = 0; while ( str < endp && *str && !iskanji(*str) ) { @@ -1588,11 +1588,11 @@ XDrawMultiString(display,d,gc, x, y, string, len, afont, slen++; } - /* ÉÁ²è */ + /* 描画 */ XSetFont( display, gc, afont->fid ); XDrawImageString( display, d, gc, x, y, p, slen ); - /* ¥Ý¥¤¥ó¥¿¤ò¿Ê¤á¤ë */ + /* ポインタを進める */ x += afont_width * slen; } } @@ -1657,7 +1657,7 @@ static errr Infofnt_text_std(int x, int y, cptr str, int len) { /* Note that the Infoclr is set up to contain the Infofnt */ #ifdef USE_JP_FONTSTRUCT - /* ´Á»ú¥Õ¥©¥ó¥È¤Îɽ¼¨Éý¤Ï ASCII¥Õ¥©¥ó¥È¤Î2Çܤ˸ÇÄê */ + /* 漢字フォントの表示幅は ASCIIフォントの2倍に固定 */ XDrawMultiString(Metadpy->dpy, Infowin->win, Infoclr->gc, x, y, str, len, Infofnt->info, Infofnt->wid, Infofnt->hgt, @@ -1665,8 +1665,21 @@ static errr Infofnt_text_std(int x, int y, cptr str, int len) Infokfnt->info, Infofnt->wid * 2); #else #ifdef USE_FONTSET + + iconv_t cd = iconv_open("UTF-8", "EUC-JP"); + size_t inlen = len; + size_t outlen = len * 2; + char *kanji = malloc(outlen); + char *sp; char *kp = kanji; + char sbuf[1024]; + my_strcpy(sbuf, str, sizeof(sbuf)); + sp = sbuf; + iconv(cd, &sp, &inlen, &kp, &outlen); + iconv_close(cd); + XmbDrawImageString(Metadpy->dpy, Infowin->win, Infofnt->info, - Infoclr->gc, x, y, str, len); + Infoclr->gc, x, y, kanji, kp-kanji); + free(kanji); #else XDrawImageString(Metadpy->dpy, Infowin->win, Infoclr->gc, x, y, str, len); @@ -1830,7 +1843,7 @@ static x11_selection_type s_ptr[1]; */ static void react_keypress(XKeyEvent *xev) { - int i, n, mc, ms, mo; + int i, n, mc, ms, mo, mx; uint ks1; @@ -1888,10 +1901,11 @@ static void react_keypress(XKeyEvent *xev) mc = (ev->state & ControlMask) ? TRUE : FALSE; ms = (ev->state & ShiftMask) ? TRUE : FALSE; mo = (ev->state & Mod1Mask) ? TRUE : FALSE; + mx = (ev->state & Mod2Mask) ? TRUE : FALSE; /* Normal keys with no modifiers */ - if (n && !mo && !IsSpecialKey(ks)) + if (n && !mo && !mx && !IsSpecialKey(ks)) { /* Enqueue the normal key(s) */ for (i = 0; buf[i]; i++) Term_keypress(buf[i]); @@ -1938,18 +1952,18 @@ static void react_keypress(XKeyEvent *xev) /* Hack -- Use the KeySym */ if (ks) { - sprintf(msg, "%c%s%s%s_%lX%c", 31, + sprintf(msg, "%c%s%s%s%s_%lX%c", 31, mc ? "N" : "", ms ? "S" : "", - mo ? "O" : "", + mo ? "O" : "", mx ? "M" : "", (unsigned long)(ks), 13); } /* Hack -- Use the Keycode */ else { - sprintf(msg, "%c%s%s%sK_%X%c", 31, + sprintf(msg, "%c%s%s%s%sK_%X%c", 31, mc ? "N" : "", ms ? "S" : "", - mo ? "O" : "", + mo ? "O" : "", mx ? "M" : "", ev->keycode, 13); } @@ -2877,9 +2891,8 @@ static errr Term_xtra_x11_sound(int v) if (!sound_file[v]) return (1); sprintf(buf,"./playwave.sh %s\n", sound_file[v]); - system(buf); - return (0); + return (system(buf) < 0); } #endif /* USE_SOUND */ @@ -3721,25 +3734,32 @@ errr init_x11(int argc, char *argv[]) } #ifdef USE_LOCALE + +#ifdef JP + /* Get locale information from environment variables */ setlocale(LC_ALL, ""); + #ifdef DEFAULT_LOCALE if(!strcmp(setlocale(LC_ALL, NULL), "C")){ printf("try default locale \"%s\"\n", DEFAULT_LOCALE); setlocale(LC_ALL, DEFAULT_LOCALE); } #endif + + if(!strcmp(setlocale(LC_ALL, NULL), "C")) { - char *current_locale = setlocale(LC_ALL, NULL); -/* printf("set locale to \"%s\"\n", current_locale); */ - if(!strcmp(current_locale, "C")){ - printf("WARNING: Locale is not supported. Non-english font may be displayed incorrectly.\n"); - } + printf("WARNING: Locale is not supported. Non-english font may be displayed incorrectly.\n"); } if(!XSupportsLocale()){ printf("can't support locale in X\n"); setlocale(LC_ALL, "C"); } +#else + /* Set locale to "C" without using environment variables */ + setlocale(LC_ALL, "C"); +#endif /* JP */ + #endif /* USE_LOCALE */