-/* File: main-x11.c */
+/* File: main-x11.c */
/*
* Copyright (c) 1997 Ben Harrison, and others
#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
/*
#include <X11/Xatom.h>
#endif /* __MAKEDEPEND__ */
-
+#include <iconv.h>
/*
* Include some helpful X11 code.
*/
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;
#ifdef USE_JP_FONTSTRUCT
/*
- * EUCÆüËܸ쥳¡¼¥É¤ò´Þ¤àʸ»úÎó¤òɽ¼¨¤¹¤ë (Xlib)
+ * EUC日本語コードを含む文字列を表示する (Xlib)
*/
static void
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) ) {
slen++;
}
- /* ÉÁ²è */
+ /* 描画 */
XSetFont( display, gc, afont->fid );
XDrawImageString( display, d, gc, x, y, p, slen );
- /* ¥Ý¥¤¥ó¥¿¤ò¿Ê¤á¤ë */
+ /* ポインタを進める */
x += afont_width * slen;
}
}
{
/* 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,
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);
*/
static void react_keypress(XKeyEvent *xev)
{
- int i, n, mc, ms, mo;
+ int i, n, mc, ms, mo, mx;
uint ks1;
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]);
/* 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);
}
char buf[1024];
char *list[1000];
co_ord max, min;
- int x,y,l,n;
- byte a;
+ TERM_LEN x,y;
+ int l,n;
+ TERM_COLOR a;
char c;
/* Too old, or incorrect call. */
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 */
/*
* Draw some textual characters.
*/
-static errr Term_text_x11(int x, int y, int n, byte a, cptr s)
+static errr Term_text_x11(TERM_LEN x, TERM_LEN y, int n, TERM_COLOR a, cptr s)
{
/* Draw the text */
Infoclr_set(clr[a]);
/*
* Draw some graphical characters.
*/
-static errr Term_pict_x11(int x, int y, int n, const byte *ap, const char *cp, const byte *tap, const char *tcp)
+static errr Term_pict_x11(TERM_LEN x, TERM_LEN y, int n, const TERM_COLOR *ap, const char *cp, const TERM_COLOR *tap, const char *tcp)
{
int i, x1, y1;
- byte a;
+ TERM_COLOR a;
char c;
- byte ta;
+ TERM_COLOR ta;
char tc;
int x2, y2;