Hi,

From: Tomohiro KUBOTA <[EMAIL PROTECTED]>
Subject: Locale Patch Improvement
Date: Wed, 28 Mar 2001 20:50:19 +0900

> I will write a patch to do this soon.

I wrote the patch.

diff -ruN cvs-2001-03-29/src/defaultfont.c locale3/src/defaultfont.c
--- cvs-2001-03-29/src/defaultfont.c    Fri Mar 23 15:15:37 2001
+++ locale3/src/defaultfont.c   Wed Mar 28 22:48:16 2001
@@ -142,20 +142,29 @@
 
 const struct defaultfont defaultfont[] = {
 #ifdef MULTICHAR_SET
-    { ENC_EUCJ,                "eucj",  {NFONT_LIST_EUCJ}, {MFONT_LIST_EUCJ} },
-    { ENC_SJIS,                "sjis",  {NFONT_LIST_EUCJ}, {MFONT_LIST_EUCJ} },
-    { ENC_GB,          "gb",    {NFONT_LIST_GB}, {MFONT_LIST_GB} },
-    { ENC_BIG5,                "big5",  {NFONT_LIST_BIG5}, {MFONT_LIST_BIG5} },
-    { ENC_EUCKR,       "euckr", {NFONT_LIST_EUCKR}, {MFONT_LIST_EUCKR} },
+    { ENC_EUCJ,                "eucj",     EUCJ_NFONTS,      EUCJ_FONT0,
+       {NFONT_LIST_EUCJ},  {MFONT_LIST_EUCJ} },
+    { ENC_SJIS,                "sjis",     EUCJ_NFONTS,      EUCJ_FONT0,
+       {NFONT_LIST_EUCJ},  {MFONT_LIST_EUCJ} },
+    { ENC_GB,          "gb",       GB_NFONTS,        GB_FONT0,
+       {NFONT_LIST_GB},    {MFONT_LIST_GB} },
+    { ENC_BIG5,                "big5",     BIG5_NFONTS,      BIG5_FONT0,
+       {NFONT_LIST_BIG5},  {MFONT_LIST_BIG5} },
+    { ENC_EUCKR,       "euckr",    EUCKR_NFONTS,     EUCKR_FONT0,
+       {NFONT_LIST_EUCKR}, {MFONT_LIST_EUCKR} },
 #endif                         /* MULTICHAR_SET */
 #if 0
 /* sample for font specification when common rule for ISO-8859-x
  * is not satisfying */
-    { ENC_ISO8859_1,   "noenc", {NFONT_LIST_1}, {MFONT_LIST_NULL} },
+    { ENC_ISO8859_1,   "noenc",    ISO88591_NFONTS,  ISO88591_FONT0,
+       {NFONT_LIST_1},     {MFONT_LIST_NULL} },
 #endif
-    { ENC_KOI8R,       "noenc", {NFONT_LIST_KOI8R}, {MFONT_LIST_NULL} },
-    { ENC_KOI8U,       "noenc", {NFONT_LIST_KOI8U}, {MFONT_LIST_NULL} },
-    { ENC_DUMMY,       "noenc", {MFONT_LIST_NULL}, {MFONT_LIST_NULL} }
+    { ENC_KOI8R,       "noenc",    KOI8R_NFONTS,     KOI8R_FONT0,
+       {NFONT_LIST_KOI8R}, {MFONT_LIST_NULL} },
+    { ENC_KOI8U,       "noenc",    KOI8U_NFONTS,     KOI8U_FONT0,
+       {NFONT_LIST_KOI8U}, {MFONT_LIST_NULL} },
+    { ENC_DUMMY,       "noenc",    0,                0,
+       {MFONT_LIST_NULL},  {MFONT_LIST_NULL} }
 };
 
 /* special common rule for ISO-8859-x */
@@ -258,7 +267,9 @@
 #ifdef MULTICHAR_SET
            rxvt_set_multichar_encoding(r, defaultfont[j].encoding_method);
 #endif
-           for (k = 0; k < NFONTS; k++) {
+           r->h->nfonts = defaultfont[j].nfonts;
+           r->h->fnum = r->h->font0_idx = defaultfont[j].font0_idx;
+           for (k = 0; k < MAX_NFONTS; k++) {
                if (rs[Rs_font + k] == NULL)
                    rs[Rs_font + k] = defaultfont[j].font[k];
 #ifdef MULTICHAR_SET
@@ -282,11 +293,16 @@
     /* fallback for ISO-8859-* encodings */
        k = encoding - ENC_ISO8859_1 + 1;
        MIN_IT(k, 99999);
-    } else
+       r->h->nfonts = ISO8859X_NFONTS;
+       r->h->fnum = r->h->font0_idx = ISO8859X_FONT0;
+    } else {
     /* fallback for "C", "POSIX", and invalid locales */
        k = 0;
+       r->h->nfonts = DEFAULT_NFONTS;
+       r->h->fnum = r->h->font0_idx = DEFAULT_FONT0;
+    }
 
-    for (j = 0; j < NFONTS; j++) {
+    for (j = 0; j < MAX_NFONTS; j++) {
        if (rs[Rs_font + j] == NULL) {
            if (k == 0)
                rs[Rs_font + j] = def_fontName[j];
diff -ruN cvs-2001-03-29/src/defaultfont.h locale3/src/defaultfont.h
--- cvs-2001-03-29/src/defaultfont.h    Fri Mar 23 15:15:37 2001
+++ locale3/src/defaultfont.h   Thu Mar 29 22:00:59 2001
@@ -58,13 +58,17 @@
 
 /*
  * Used for tables of encoding labels -> Rxvt internal informations.
+ *
+ * font0_idx is the default font in the list (starting at 0)
  */
 
 struct defaultfont {
     const enum enc_label enc_label;
     const char     *encoding_method;
-    const char     *font[7];
-    const char     *mfont[7];
+    const int       nfonts;
+    const int       font0_idx;
+    const char     *font[MAX_NFONTS];
+    const char     *mfont[MAX_NFONTS];
 };
 
 
@@ -78,6 +82,8 @@
  * Default fonts when encoding is not valid or not specified.
  */
 
+#define DEFAULT_NFONTS 7
+#define DEFAULT_FONT0  2
 #define NFONT_LIST \
   "7x14", "6x10", "6x13", "8x13", "8x16", "10x20", "12x24"
 #ifdef MULTICHAR_SET           /* multichar glyph language support */
@@ -117,49 +123,51 @@
  * These definitions should be brushed up by native speakers.
  */
 
+#define EUCJ_NFONTS    6
+#define EUCJ_FONT0     2
 #define NFONT_LIST_EUCJ \
   A_14, \
   "-misc-fixed-medium-r-normal--10-90-75-75-c-50-iso8859-1",/*na*/\
-  A_12, A_14, A_16, A_18, A_24
+  A_12, A_16, A_18, A_24, NULL
 #define MFONT_LIST_EUCJ \
   "-misc-fixed-medium-r-normal--14-130-75-75-c-140-jisx0208.1983-0",/*xf*/\
   "-misc-fixed-medium-r-normal--10-90-75-75-c-100-jisx0208.1983-0",/*na*/\
   "-misc-fixed-medium-r-normal--12-110-75-75-c-120-jisx0208.1983-0",/*ak*/\
-  "-misc-fixed-medium-r-normal--14-130-75-75-c-140-jisx0208.1983-0",/*xf*/\
   "-jis-fixed-medium-r-normal--16-150-75-75-c-160-jisx0208.1983-0",/*xf*/\
   "-jis-gothic-medium-r-normal--18-170-75-75-c-180-jisx0208.1983-0",/*pd*/\
-  "-jis-fixed-medium-r-normal--24-230-75-75-c-240-jisx0208.1983-0" /*xf*/
+  "-jis-fixed-medium-r-normal--24-230-75-75-c-240-jisx0208.1983-0",/*xf*/\
+  NULL
 
-#define NFONT_LIST_GB A_16, A_16, A_16, A_16, A_24, A_24, A_24
+#define GB_NFONTS      2
+#define GB_FONT0       0
+#define NFONT_LIST_GB A_16, A_24, NULL, NULL, NULL, NULL, NULL
 #define MFONT_LIST_GB \
   "-isas-song ti-medium-r-normal--16-160-72-72-c-160-gb2312.1980-0",/*xf*/\
-  "-isas-song ti-medium-r-normal--16-160-72-72-c-160-gb2312.1980-0",/*xf*/\
-  "-isas-song ti-medium-r-normal--16-160-72-72-c-160-gb2312.1980-0",/*xf*/\
-  "-isas-song ti-medium-r-normal--16-160-72-72-c-160-gb2312.1980-0",/*xf*/\
-  "-isas-song ti-medium-r-normal--24-240-72-72-c-240-gb2312.1980-0",/*xf*/\
   "-isas-song ti-medium-r-normal--24-240-72-72-c-240-gb2312.1980-0",/*xf*/\
-  "-isas-song ti-medium-r-normal--24-240-72-72-c-240-gb2312.1980-0" /*xf*/
+  NULL, NULL, NULL, NULL, NULL
 
-#define NFONT_LIST_BIG5 A_16, A_16, A_16, A_16, A_24, A_24, A_24
+#define BIG5_NFONTS    2
+#define BIG5_FONT0     0
+#define NFONT_LIST_BIG5 A_16, A_24, NULL, NULL, NULL, NULL, NULL
 #define MFONT_LIST_BIG5 \
   "-eten-fixed-medium-r-normal--16-150-75-75-c-160-big5-0",/*pd*/\
-  "-eten-fixed-medium-r-normal--16-150-75-75-c-160-big5-0",/*pd*/\
-  "-eten-fixed-medium-r-normal--16-150-75-75-c-160-big5-0",/*pd*/\
-  "-eten-fixed-medium-r-normal--16-150-75-75-c-160-big5-0",/*pd*/\
   "-eten-fixed-medium-r-normal--24-230-75-75-c-240-big5-0",/*pd*/\
-  "-eten-fixed-medium-r-normal--24-230-75-75-c-240-big5-0",/*pd*/\
-  "-eten-fixed-medium-r-normal--24-230-75-75-c-240-big5-0" /*pd*/
+  NULL, NULL, NULL, NULL, NULL
 
-#define NFONT_LIST_EUCKR A_16, A_12, A_14, A_16, A_18, A_20, A_24
+#define EUCKR_NFONTS   6
+#define EUCKR_FONT0    2
+#define NFONT_LIST_EUCKR A_16, A_12, A_14, A_18, A_20, A_24, NULL
 #define MFONT_LIST_EUCKR \
   "-daewoo-mincho-medium-r-normal--16-120-100-100-c-160-ksc5601.1987-0",/*xf*/\
   "-baekmuk-batang-medium-r-normal--12-120-75-75-m-120-ksc5601.1987-0",/*ba*/\
   "-baekmuk-batang-medium-r-normal--14-140-75-75-m-140-ksc5601.1987-0",/*ba*/\
-  "-daewoo-mincho-medium-r-normal--16-120-100-100-c-160-ksc5601.1987-0",/*xf*/\
   "-baekmuk-batang-medium-r-normal--18-180-75-75-m-180-ksc5601.1987-0",/*ba*/\
   "-baekmuk-batang-medium-r-normal--20-200-75-75-m-200-ksc5601.1987-0",/*ba*/\
   "-daewoo-mincho-medium-r-normal--24-170-100-100-c-240-ksc5601.1987-0",/*xf*/\
+  NULL
 
+#define KOI8R_NFONTS   7
+#define KOI8R_FONT0    2
 #define NFONT_LIST_KOI8R \
   "-misc-fixed-medium-r-normal--14-130-75-75-c-70-koi8-r",/*xf*/\
   "-misc-fixed-medium-r-normal--10-100-75-75-c-60-koi8-r",/*xf*/\
@@ -168,6 +176,9 @@
   "-misc-fixed-medium-r-normal--15-140-75-75-c-90-koi8-r",/*xf*/\
   "-misc-fixed-medium-r-normal--18-120-100-100-c-90-koi8-r",/*xf*/\
   "-misc-fixed-medium-r-normal--20-200-75-75-c-100-koi8-r" /*xf*/
+
+#define KOI8U_NFONTS   7
+#define KOI8U_FONT0    2
 #define NFONT_LIST_KOI8U \
   "-cronyx-fixed-medium-r-normal--14-130-75-75-c-70-koi8-u",/*cr*/\
   "-cronyx-fixed-medium-r-normal--10-100-75-75-c-60-koi8-u",/*cr*/\
@@ -179,6 +190,8 @@
 
 /* special common rule for ISO-8859-* */
 
+#define ISO8859X_NFONTS        7
+#define ISO8859X_FONT0 2
 #define NFONT_LIST_ISO8859X \
   "-misc-fixed-medium-r-normal--14-130-75-75-c-70-iso8859-%d",       /*xf*/ \
   "-misc-fixed-medium-r-normal--10-100-75-75-c-60-iso8859-%d",       /*xf*/ \
diff -ruN cvs-2001-03-29/src/feature.h locale3/src/feature.h
--- cvs-2001-03-29/src/feature.h        Thu Mar 29 22:32:53 2001
+++ locale3/src/feature.h       Wed Mar 28 22:28:03 2001
@@ -423,13 +423,8 @@
 #define SUPPORT_BROKEN_APPS_WHICH_RELY_ON_UNDEFINED_BW_BEHAVIOUR_AS_XTERM
 
 /*
- * List of default fonts available
- * NFONTS is the number of fonts in the list
- * FONT0_IDX is the default font in the list (starting at 0)
- * Sizes between multi-char fonts sets (MFONT_LIST) and single-char font
- * sets (NFONT_LIST) have been matched up
+ * MAX_NFONTS is the maximum allowed number of fonts in the list
  */
-#define NFONTS         7
-#define FONT0_IDX      2
+#define MAX_NFONTS     7
 
 #endif
diff -ruN cvs-2001-03-29/src/init.c locale3/src/init.c
--- cvs-2001-03-29/src/init.c   Thu Mar 29 22:32:54 2001
+++ locale3/src/init.c  Wed Mar 28 22:44:38 2001
@@ -158,7 +158,6 @@
     h->cmd_pid = -1;
     r->cmd_fd = r->tty_fd = r->Xfd = -1;
     h->PrivateModes = h->SavedModes = PrivMode_Default;
-    h->fnum = FONT0_IDX;       /* logical font number */
     r->TermWin.focus = 1;
     r->TermWin.ncol = 80;
     r->TermWin.nrow = 24;
diff -ruN cvs-2001-03-29/src/main.c locale3/src/main.c
--- cvs-2001-03-29/src/main.c   Thu Mar 29 22:32:54 2001
+++ locale3/src/main.c  Wed Mar 28 22:42:13 2001
@@ -469,20 +469,15 @@
     char            tmpbuf[64];
 #endif
 
-#if (FONT0_IDX == 0)
-# define IDX2FNUM(i)   (i)
-# define FNUM2IDX(f)   (f)
-#else
-# define IDX2FNUM(i)   ((i) == 0 ? FONT0_IDX : ((i) <= FONT0_IDX ? ((i)-1) : (i)))
-# define FNUM2IDX(f)   ((f) == FONT0_IDX ? 0 : ((f) < FONT0_IDX ? ((f)+1) : (f)))
-#endif
-#define FNUM_RANGE(i)  ((i) <= 0 ? 0 : ((i) >= NFONTS ? (NFONTS-1) : (i)))
+#define IDX2FNUM(i)    ((i) == 0 ? r->h->font0_idx : ((i) <= r->h->font0_idx ? 
+((i)-1) : (i)))
+#define FNUM2IDX(f)    ((f) == r->h->font0_idx ? 0 : ((f) < r->h->font0_idx ? ((f)+1) 
+: (f)))
+#define FNUM_RANGE(i)  ((i) <= 0 ? 0 : ((i) >= r->h->nfonts ? (r->h->nfonts-1) : (i)))
 
     if (!init) {
        pf = r->h->fnum;
        switch (fontname[0]) {
        case '\0':
-           r->h->fnum = FONT0_IDX;
+           r->h->fnum = r->h->font0_idx;
            fontname = NULL;
            break;
 
@@ -503,7 +498,7 @@
            default:
                if (fontname[1] != '\0' && !isdigit(fontname[1]))
                    return;
-               if (idx < 0 || idx >= (NFONTS))
+               if (idx < 0 || idx >= (r->h->nfonts))
                    return;
                r->h->fnum = IDX2FNUM(idx);
                break;
@@ -516,7 +511,7 @@
                return;
            else
                /* search for existing fontname */
-               for (idx = 0; idx < NFONTS; idx++)
+               for (idx = 0; idx < r->h->nfonts; idx++)
                    if (!STRCMP(r->h->rs[Rs_font + idx], fontname)) {
                        r->h->fnum = IDX2FNUM(idx);
                        fontname = NULL;
@@ -1098,7 +1093,7 @@
     XFontSet        prev_fontset;
     int             success = 0;
 
-    if (idx < 0 || idx >= NFONTS)
+    if (idx < 0 || idx >= r->h->nfonts)
        return;
     D_MAIN((stderr, "rxvt_setTermFontSet()"));
     prev_fontset = r->TermWin.fontset;
diff -ruN cvs-2001-03-29/src/rxvt.h locale3/src/rxvt.h
--- cvs-2001-03-29/src/rxvt.h   Thu Mar 29 22:32:55 2001
+++ locale3/src/rxvt.h  Wed Mar 28 22:43:14 2001
@@ -599,10 +599,10 @@
     Rs_color,
     _Rs_color = Rs_color + NRS_COLORS - 1,
     Rs_font,
-    _Rs_font = Rs_font + NFONTS - 1,
+    _Rs_font = Rs_font + MAX_NFONTS - 1,
 #ifdef MULTICHAR_SET
     Rs_mfont,
-    _Rs_mfont = Rs_mfont + NFONTS - 1,
+    _Rs_mfont = Rs_mfont + MAX_NFONTS - 1,
     Rs_multichar_encoding,
     Rs_mc_hack,
 #endif
@@ -1000,6 +1000,8 @@
                     refresh_count,
                     refresh_limit,
                     fnum,      /* logical font number                       */
+                    font0_idx,  /* logical font number for default font      */
+                    nfonts,     /* num of fonts available in current locale  */
                     last_bot,  /* scrollbar last bottom position            */
                     last_top,  /* scrollbar last top position               */
                     last_state,        /* scrollbar last state                      */
@@ -1143,7 +1145,7 @@
     char           *v_bufstr;  /* beginning of area to write */
     char           *v_bufptr;  /* end of area to write */
     char           *v_bufend;  /* end of physical buffer */
-    char           *newfont[NFONTS];
+    char           *newfont[MAX_NFONTS];
 /* command input buffering */
     unsigned char  *cmdbuf_ptr, *cmdbuf_endp;
     unsigned char   cmdbuf_base[BUFSIZ];
diff -ruN cvs-2001-03-29/src/xdefaults.c locale3/src/xdefaults.c
--- cvs-2001-03-29/src/xdefaults.c      Thu Mar 29 22:32:57 2001
+++ locale3/src/xdefaults.c     Wed Mar 28 22:42:38 2001
@@ -170,49 +170,49 @@
 #endif
     STRG(Rs_font + 0, "font", "fn", "fontname", "normal text font"),
 /* fonts: command-line option = resource name */
-#if NFONTS > 1
+#if MAX_NFONTS > 1
     RSTRG(Rs_font + 1, "font1", "fontname"),
 #endif
-#if NFONTS > 2
+#if MAX_NFONTS > 2
     RSTRG(Rs_font + 2, "font2", "fontname"),
 #endif
-#if NFONTS > 3
+#if MAX_NFONTS > 3
     RSTRG(Rs_font + 3, "font3", "fontname"),
 #endif
-#if NFONTS > 4
+#if MAX_NFONTS > 4
     RSTRG(Rs_font + 4, "font4", "fontname"),
 #endif
-#if NFONTS > 5
+#if MAX_NFONTS > 5
     RSTRG(Rs_font + 5, "font5", "fontname"),
 #endif
-#if NFONTS > 6
+#if MAX_NFONTS > 6
     RSTRG(Rs_font + 6, "font6", "fontname"),
 #endif
-#if NFONTS > 7
+#if MAX_NFONTS > 7
     RSTRG(Rs_font + 7, "font7", "fontname"),
 #endif
 #ifdef MULTICHAR_SET
     STRG(Rs_mfont + 0, "mfont", "fm", "fontname", "multichar font"),
 /* fonts: command-line option = resource name */
-# if NFONTS > 1
+# if MAX_NFONTS > 1
     RSTRG(Rs_mfont + 1, "mfont1", "fontname"),
 # endif
-# if NFONTS > 2
+# if MAX_NFONTS > 2
     RSTRG(Rs_mfont + 2, "mfont2", "fontname"),
 # endif
-# if NFONTS > 3
+# if MAX_NFONTS > 3
     RSTRG(Rs_mfont + 3, "mfont3", "fontname"),
 # endif
-# if NFONTS > 4
+# if MAX_NFONTS > 4
     RSTRG(Rs_mfont + 4, "mfont4", "fontname"),
 # endif
-# if NFONTS > 5
+# if MAX_NFONTS > 5
     RSTRG(Rs_mfont + 5, "mfont5", "fontname"),
 # endif
-# if NFONTS > 6
+# if MAX_NFONTS > 6
     RSTRG(Rs_mfont + 6, "mfont6", "fontname"),
 # endif
-# if NFONTS > 7
+# if MAX_NFONTS > 7
     RSTRG(Rs_mfont + 7, "mfont7", "fontname"),
 # endif
 #endif                         /* MULTICHAR_SET */

Reply via email to