--- rxvt-unicode/src/defaultfont.C 2004/03/03 00:20:33 1.27 +++ rxvt-unicode/src/defaultfont.C 2004/03/05 05:52:02 1.37 @@ -74,7 +74,9 @@ { CS_GB2312_1980_0, "xft:AR PL KaitiM GB" }, { CS_GB2312_1980_0, "xft:AR PL SungtiL GB" }, # endif - { CS_BIG5_EXT, "-*-*-*-*-*-*-*-*-*-*-c-*-big5*-0" }, + { CS_BIG5, "-*-*-*-*-*-*-*-*-*-*-c-*-big5-0" }, + { CS_BIG5_PLUS, "-*-*-*-*-*-*-*-*-*-*-c-*-big5p-0" }, + { CS_BIG5_EXT, "-*-*-*-*-*-*-*-*-*-*-c-*-big5.eten-0" }, { CS_CNS11643_1992_1, "-*-*-*-*-*-*-*-*-*-*-c-*-gb2312*-0" }, { CS_CNS11643_1992_1, "-*-*-*-*-*-*-*-*-*-*-c-*-cns11643*-1" }, { CS_CNS11643_1992_2, "-*-*-*-*-*-*-*-*-*-*-c-*-cns11643*-2" }, @@ -96,6 +98,10 @@ { CS_UNICODE, "-*-*-*-r-*-*-*-*-*-*-c-*-iso10646-1" }, { CS_UNICODE, "-*-*-*-r-*-*-*-*-*-*-m-*-iso10646-1" }, +#if UNICODE_3 && XFT + { CS_UNICODE, "xft:Code2001" }, // contains many plane-1 characters +#endif + { CS_UNKNOWN, 0 } }; @@ -271,6 +277,7 @@ { if (unicode <= 0x001f) return true; + if (unicode >= 0x0080 && unicode <= 0x009f) return true; @@ -278,6 +285,9 @@ && linedraw_cmds[unicode - 0x2500]) return true; + if (IS_COMPOSE (unicode)) + return true; + switch (unicode) { case ZERO_WIDTH_CHAR: @@ -303,6 +313,7 @@ while (len--) { + compose_char *cc; text_t t = *text++; // is it in our linedrawing table? @@ -310,8 +321,8 @@ { const char *p = linedraw_cmds[t - 0x2500]; - int x0 = x, x1 = x + r->TermWin.fwidth / 2, x2 = x + r->TermWin.fwidth - 1; - int y0 = y, y1 = y + r->TermWin.fheight / 2, y2 = y + r->TermWin.fheight - 1; + int x0 = x, x1 = x + (r->TermWin.fwidth - 1) / 2, x2 = x + r->TermWin.fwidth - 1; + int y0 = y, y1 = y + (r->TermWin.fheight - 1) / 2, y2 = y + r->TermWin.fheight - 1; XGCValues gcv; @@ -341,6 +352,20 @@ gcv.line_width = 0; XChangeGC (d.display->display, GC, GCLineWidth, &gcv); } + else if (IS_COMPOSE (t) && (cc = rxvt_composite[t])) + { + rxvt_font *f1 = (*fs)[fs->find_font (cc->c1)]; + f1->draw (d, x, y, &(t = cc->c1), 1, fg, bg); + if (cc->c2 != NOCHAR) + { + // prefer font of first character, for no good reasons + rxvt_font *f2 = f1->has_codepoint (cc->c2) + ? f1 + : (*fs)[fs->find_font (cc->c2)]; + + f2->draw (d, x, y, &(t = cc->c2), 1, fg, -1); + } + } else switch (t) { @@ -442,7 +467,7 @@ rxvt_font_x11::set_properties (rxvt_fontprop &p, const char *name) { int slashes = 0; - const char *comp[12]; + const char *comp[13]; for (const char *c = name; *c; c++) if (*c == '-') @@ -1013,6 +1038,7 @@ else f = new rxvt_font_x11; + f->fs = this; f->set_term (r); f->set_name (strdup (name));