X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=src%2Fmain-x11.c;h=ea659a44c1db4931782b714a36c9df5050ef00e9;hb=357c73fbdec3518936f1f350a9126082a0a89519;hp=6552be09bcd29a270aac395af28d09ae74572bb2;hpb=dc0e2ded77c7cdd3d6ff0d40b05b61efed3ef17c;p=hengband%2Fhengband.git diff --git a/src/main-x11.c b/src/main-x11.c index 6552be09b..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 @@ -9,17 +9,17 @@ */ -#ifdef _JP +#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. */ @@ -456,7 +456,7 @@ static infowin *Infowin = (infowin*)(NULL); static infowin *Focuswin = (infowin*)(NULL); #endif static infoclr *Infoclr = (infoclr*)(NULL); -#ifdef _JP +#ifdef USE_JP_FONTSTRUCT static infofnt *Infofnt = (infofnt*)(NULL); static infofnt *Infokfnt = (infofnt*)(NULL); #else @@ -469,7 +469,7 @@ static infofnt *Infofnt = (infofnt*)(NULL); /**** Generic code ****/ -#ifdef _JP +#ifdef USE_JP_FONTSTRUCT #define Infokfnt_set(I) \ (Infokfnt = (I)) #endif @@ -1228,7 +1228,7 @@ static errr Infofnt_nuke(void) { infofnt *ifnt = Infofnt; -#ifdef _JP +#ifdef USE_JP_FONTSTRUCT infofnt *ikfnt = Infokfnt; #endif /* Deal with 'name' */ @@ -1238,21 +1238,26 @@ static errr Infofnt_nuke(void) string_free(ifnt->name); } -#ifdef _JP +#ifdef USE_JP_FONTSTRUCT if (ikfnt->name) { /* Free the name */ string_free(ikfnt->name); } #endif + /* Nuke info if needed */ if (ifnt->nuke) { /* Free the font */ +#ifdef USE_FONTSET + XFreeFontSet(Metadpy->dpy, ifnt->info); +#else XFreeFont(Metadpy->dpy, ifnt->info); +#endif } -#ifdef _JP +#ifdef USE_JP_FONTSTRUCT if (ikfnt->nuke) { /* Free the font */ @@ -1269,7 +1274,7 @@ static errr Infofnt_nuke(void) /* * Prepare a new 'infofnt' */ -#ifdef _JP +#ifdef USE_JP_FONTSTRUCT static errr Infofnt_prepare(XFontStruct *info, XFontStruct *kinfo) #else #ifdef USE_FONTSET @@ -1282,7 +1287,7 @@ static errr Infofnt_prepare(XFontStruct *info) { infofnt *ifnt = Infofnt; -#ifdef _JP +#ifdef USE_JP_FONTSTRUCT infofnt *ikfnt = Infokfnt; #endif XCharStruct *cs; @@ -1305,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; @@ -1331,7 +1336,7 @@ static errr Infofnt_prepare(XFontStruct *info) else ifnt->twid = ifnt->wid; -#ifdef _JP +#ifdef USE_JP_FONTSTRUCT /* Assign the struct */ ikfnt->info = kinfo; @@ -1362,7 +1367,7 @@ static errr Infofnt_prepare(XFontStruct *info) /* * Initialize a new 'infofnt'. */ -#ifdef _JP +#ifdef USE_JP_FONTSTRUCT static errr Infofnt_init_real(XFontStruct *info, XFontStruct *kinfo) #else #ifdef USE_FONTSET @@ -1376,17 +1381,17 @@ static errr Infofnt_init_real(XFontStruct *info) /* Wipe the thing */ (void)WIPE(Infofnt, infofnt); -#ifdef _JP +#ifdef USE_JP_FONTSTRUCT WIPE(Infokfnt, infofnt); #endif /* No nuking */ Infofnt->nuke = 0; -#ifdef _JP +#ifdef USE_JP_FONTSTRUCT Infokfnt->nuke = 0; #endif /* Attempt to prepare it */ -#ifdef _JP +#ifdef USE_JP_FONTSTRUCT return (Infofnt_prepare (info, kinfo)); #else return (Infofnt_prepare(info)); @@ -1403,7 +1408,7 @@ static errr Infofnt_init_real(XFontStruct *info) * Inputs: * name: The name of the requested Font */ -#ifdef _JP +#ifdef USE_JP_FONTSTRUCT static void Infofnt_init_data(cptr name, cptr kname) #else static void Infofnt_init_data(cptr name) @@ -1420,7 +1425,7 @@ static void Infofnt_init_data(cptr name) #endif -#ifdef _JP +#ifdef USE_JP_FONTSTRUCT XFontStruct *kinfo; #endif /*** Load the info Fresh, using the name ***/ @@ -1428,7 +1433,7 @@ static void Infofnt_init_data(cptr name) /* If the name is not given, report an error */ if (!name || !*name) quit("Missing font!"); -#ifdef _JP +#ifdef USE_JP_FONTSTRUCT if (!kname || !*kname) quit("Missing kanji font!"); #endif /* Attempt to load the font */ @@ -1443,7 +1448,7 @@ static void Infofnt_init_data(cptr name) } #else info = XLoadQueryFont(Metadpy->dpy, name); -#ifdef _JP +#ifdef USE_JP_FONTSTRUCT kinfo = XLoadQueryFont(Metadpy->dpy, kname); #endif #endif @@ -1451,7 +1456,7 @@ static void Infofnt_init_data(cptr name) /* The load failed, try to recover */ if (!info) quit_fmt("Failed to find font:\"%s\"", name); -#ifdef _JP +#ifdef USE_JP_FONTSTRUCT if (!kinfo) quit_fmt("Failed to find font:\"%s\"", kname); #endif @@ -1462,11 +1467,11 @@ static void Infofnt_init_data(cptr name) /* Wipe the thing */ (void)WIPE(Infofnt, infofnt); -#ifdef _JP +#ifdef USE_JP_FONTSTRUCT WIPE(Infokfnt, infofnt); #endif /* Attempt to prepare it */ -#ifdef _JP +#ifdef USE_JP_FONTSTRUCT if (Infofnt_prepare(info, kinfo)) #else if (Infofnt_prepare(info)) @@ -1478,7 +1483,7 @@ static void Infofnt_init_data(cptr name) XFreeFontSet(Metadpy->dpy, info); #else XFreeFont(Metadpy->dpy, info); -#ifdef _JP +#ifdef USE_JP_FONTSTRUCT XFreeFont(Metadpy->dpy, kinfo); #endif #endif @@ -1488,21 +1493,21 @@ static void Infofnt_init_data(cptr name) /* Save a copy of the font name */ Infofnt->name = string_make(name); -#ifdef _JP +#ifdef USE_JP_FONTSTRUCT Infokfnt->name = string_make(kname); #endif /* Mark it as nukable */ Infofnt->nuke = 1; -#ifdef _JP +#ifdef USE_JP_FONTSTRUCT Infokfnt->nuke = 1; #endif } -#ifdef _JP +#ifdef USE_JP_FONTSTRUCT /* - * EUCÆüËܸ쥳¡¼¥É¤ò´Þ¤àʸ»úÎó¤òɽ¼¨¤¹¤ë (Xlib) + * EUC日本語コードを含む文字列を表示する (Xlib) */ static void XDrawMultiString(display,d,gc, x, y, string, len, afont, @@ -1531,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) ) { @@ -1583,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; } } @@ -1624,19 +1629,17 @@ static errr Infofnt_text_std(int x, int y, cptr str, int len) /*** Actually draw 'str' onto the infowin ***/ -#if 1 -#ifndef JP +#ifndef USE_FONTSET /* Be sure the correct font is ready */ XSetFont(Metadpy->dpy, Infoclr->gc, Infofnt->info->fid); #endif -#endif /*** Handle the fake mono we can enforce on fonts ***/ /* Monotize the font */ if (Infofnt->mono) { -#ifdef _JP +#ifdef USE_JP_FONTSTRUCT /* Be sure the correct font is ready */ XSetFont(Metadpy->dpy, Infoclr->gc, Infofnt->info->fid); #endif @@ -1653,8 +1656,8 @@ static errr Infofnt_text_std(int x, int y, cptr str, int len) else { /* Note that the Infoclr is set up to contain the Infofnt */ -#ifdef _JP - /* ´Á»ú¥Õ¥©¥ó¥È¤Îɽ¼¨Éý¤Ï ASCII¥Õ¥©¥ó¥È¤Î2Çܤ˸ÇÄê */ +#ifdef USE_JP_FONTSTRUCT + /* 漢字フォントの表示幅は ASCIIフォントの2倍に固定 */ XDrawMultiString(Metadpy->dpy, Infowin->win, Infoclr->gc, x, y, str, len, Infofnt->info, Infofnt->wid, Infofnt->hgt, @@ -1662,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); @@ -1757,7 +1773,7 @@ struct term_data term t; infofnt *fnt; -#ifdef _JP +#ifdef USE_JP_FONTSTRUCT infofnt *kfnt; #endif @@ -1768,15 +1784,11 @@ struct term_data XImage *tiles; -#ifdef USE_TRANSPARENCY - /* Tempory storage for overlaying tiles. */ XImage *TmpImage; #endif -#endif - }; @@ -1831,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; @@ -1889,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]); @@ -1939,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); } @@ -2878,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 */ @@ -2901,7 +2913,7 @@ static errr Term_xtra_x11_level(int v) /* Activate the font */ Infofnt_set(td->fnt); -#ifdef _JP +#ifdef USE_JP_FONTSTRUCT Infokfnt_set(td->kfnt); #endif } @@ -3104,18 +3116,13 @@ static errr Term_text_x11(int x, int y, int n, byte a, cptr s) /* * Draw some graphical characters. */ -# ifdef USE_TRANSPARENCY static errr Term_pict_x11(int x, int y, int n, const byte *ap, const char *cp, const byte *tap, const char *tcp) -# else /* USE_TRANSPARENCY */ -static errr Term_pict_x11(int x, int y, int n, const byte *ap, const char *cp) -# endif /* USE_TRANSPARENCY */ { int i, x1, y1; byte a; char c; -#ifdef USE_TRANSPARENCY byte ta; char tc; @@ -3123,7 +3130,6 @@ static errr Term_pict_x11(int x, int y, int n, const byte *ap, const char *cp) int k,l; unsigned long pixel, blank; -#endif /* USE_TRANSPARENCY */ term_data *td = (term_data*)(Term->data); @@ -3156,8 +3162,6 @@ static errr Term_pict_x11(int x, int y, int n, const byte *ap, const char *cp) continue; } -#ifdef USE_TRANSPARENCY - ta = *tap++; tc = *tcp++; @@ -3210,18 +3214,6 @@ static errr Term_pict_x11(int x, int y, int n, const byte *ap, const char *cp) 0, 0, x, y, td->fnt->twid, td->fnt->hgt); } - -#else /* USE_TRANSPARENCY */ - - /* Draw object / terrain */ - XPutImage(Metadpy->dpy, td->win->win, - clr[0]->gc, - td->tiles, - x1, y1, - x, y, - td->fnt->twid, td->fnt->hgt); - -#endif /* USE_TRANSPARENCY */ } /* Redraw the selection if any, as it may have been obscured. (later) */ @@ -3329,7 +3321,7 @@ static errr term_data_init(term_data *td, int i) cptr name = angband_term_name[i]; cptr font; -#ifdef _JP +#ifdef USE_JP_FONTSTRUCT cptr kfont; #endif @@ -3422,7 +3414,7 @@ static errr term_data_init(term_data *td, int i) } } -#ifdef _JP +#ifdef USE_JP_FONTSTRUCT /* Window specific font name */ sprintf(buf, "ANGBAND_X11_KFONT_%d", i); @@ -3528,7 +3520,7 @@ static errr term_data_init(term_data *td, int i) /* Prepare the standard font */ -#ifdef _JP +#ifdef USE_JP_FONTSTRUCT MAKE(td->fnt, infofnt); Infofnt_set(td->fnt); MAKE(td->kfnt, infofnt); @@ -3685,11 +3677,7 @@ errr init_x11(int argc, char *argv[]) int pict_wid = 0; int pict_hgt = 0; -#ifdef USE_TRANSPARENCY - char *TmpData; -#endif /* USE_TRANSPARENCY */ - #endif /* USE_GRAPHICS */ @@ -3746,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 */ @@ -3921,7 +3916,6 @@ errr init_x11(int argc, char *argv[]) td->fnt->twid, td->fnt->hgt); } -#ifdef USE_TRANSPARENCY /* Initialize the transparency masks */ for (i = 0; i < num_term; i++) { @@ -3946,8 +3940,6 @@ errr init_x11(int argc, char *argv[]) td->fnt->twid, td->fnt->hgt, 8, 0); } -#endif /* USE_TRANSPARENCY */ - /* Free tiles_raw? XXX XXX */ }