From 8c307da285ad1cc5b3e900dc2f0ae11faf1fa6ac Mon Sep 17 00:00:00 2001 From: Matt Wilson Date: Wed, 11 Dec 2002 23:54:47 +0000 Subject: first pass at using unicode in text mode --- fonts/Makefile | 2 +- fonts/screenfont-i386.gz | Bin 0 -> 4156 bytes fonts/updfonts | 34 +++------------------------------- isys/isys.c | 2 +- isys/lang.c | 33 ++++++++++++++++++--------------- isys/lang.h | 2 +- lang-table | 38 +++++++++++++++++++------------------- loader2/Makefile | 16 ++++++++-------- loader2/dietstubs.c | 27 +++++++++++++++++++++++++++ loader2/init.c | 2 ++ loader2/lang.c | 5 ++--- loader2/simplemot | 4 ++++ scripts/mk-images | 4 ++-- utils/snarffont.c | 20 +++++++++++++++----- 14 files changed, 103 insertions(+), 86 deletions(-) create mode 100644 fonts/screenfont-i386.gz diff --git a/fonts/Makefile b/fonts/Makefile index 2fb0ffa8d..55d411d84 100644 --- a/fonts/Makefile +++ b/fonts/Makefile @@ -5,7 +5,7 @@ all: depend: install: - install -m 644 fonts-$(ARCH) $(DESTDIR)/$(RUNTIMEDIR) + install -m 644 screenfont-$(ARCH).gz $(DESTDIR)/$(RUNTIMEDIR) clean: diff --git a/fonts/screenfont-i386.gz b/fonts/screenfont-i386.gz new file mode 100644 index 000000000..d1f8e8567 Binary files /dev/null and b/fonts/screenfont-i386.gz differ diff --git a/fonts/updfonts b/fonts/updfonts index 89cbf4aa3..fbb46009d 100755 --- a/fonts/updfonts +++ b/fonts/updfonts @@ -1,39 +1,11 @@ #!/bin/sh -LANGTABLE=../lang-table - ARCH=$1 if [ -z "$ARCH" ]; then echo "usage: $0 " exit 1 fi -fontlist=`awk '{ print $4 }' < $LANGTABLE | egrep -v "(None|Kon)" | sort -u` - -echo $fontlist - -TMPDIR=/tmp/fontdir.$$ -rm -rf $TMPDIR - -rm -rf $TMPDIR -mkdir -p $TMPDIR - -OLDFONT=/tmp/consolefont.$$ -setfont -om $OLDFONT -for n in $fontlist; do - echo -n $n - map=$(grep $n $LANGTABLE | head -1 | awk '{ print $3 }') - - echo -n " map " - echo $map - - setfont v $n -m $map - ../utils/snarffont > $TMPDIR/$n -done - -setfont $OLDFONT -rm -f $OLDFONT - -(cd $TMPDIR > /dev/null; ls * | cpio -o -H crc) | gzip -9 > fonts-$ARCH - -rm -rf $TMPDIR +setfont latarcyrheb-sun16 +../utils/snarffont > screenfont-$ARCH +gzip -9 screenfont-$ARCH diff --git a/isys/isys.c b/isys/isys.c index f2ba163b0..10b0d61f1 100644 --- a/isys/isys.c +++ b/isys/isys.c @@ -1032,7 +1032,7 @@ static PyObject * doLoadFont (PyObject * s, PyObject * args) { if (!PyArg_ParseTuple(args, "s", &font)) return NULL; - ret = isysLoadFont (font); + ret = isysLoadFont (); if (ret) { errno = -ret; PyErr_SetFromErrno(PyExc_SystemError); diff --git a/isys/lang.c b/isys/lang.c index 20780e44c..3f95ca0af 100644 --- a/isys/lang.c +++ b/isys/lang.c @@ -14,33 +14,32 @@ #include "lang.h" #include "stubs.h" -int isysLoadFont(char * fontFile) { - char font[8192]; +int isysLoadFont(void) { + char font[65536]; + struct console_font_op cfo; unsigned short map[E_TABSZ]; struct unimapdesc d; struct unimapinit u; struct unipair desc[2048]; - int fd; gzFile stream; int rc; - stream = gunzip_open("/etc/fonts.cgz"); + stream = gunzip_open("/etc/screenfont.gz"); if (!stream) return -EACCES; - rc = installCpioFile(stream, fontFile, "/tmp/font", 1); + gunzip_read(stream, &cfo, sizeof(cfo)); + gunzip_read(stream, font, sizeof(font)); + gunzip_read(stream, map, sizeof(map)); + gunzip_read(stream, &d.entry_ct, sizeof(d.entry_ct)); + d.entries = desc; + gunzip_read(stream, desc, d.entry_ct * sizeof(desc[0])); gunzip_close(stream); - if (rc || access("/tmp/font", R_OK)) - return -EACCES; - fd = open("/tmp/font", O_RDONLY); - read(fd, font, sizeof(font)); - read(fd, map, sizeof(map)); - read(fd, &d.entry_ct, sizeof(d.entry_ct)); - d.entries = desc; - read(fd, desc, d.entry_ct * sizeof(desc[0])); - close(fd); - rc = ioctl(1, PIO_FONT, font); + cfo.data = font; + cfo.op = KD_FONT_OP_SET; + + rc = ioctl(1, KDFONTOP, &cfo); if (rc) return rc; rc = ioctl(1, PIO_UNIMAPCLR, &u); if (rc) return rc; @@ -48,6 +47,7 @@ int isysLoadFont(char * fontFile) { if (rc) return rc; rc = ioctl(1, PIO_UNISCRNMAP, map); if (rc) return rc; + /* activate the font map */ fprintf(stderr, "\033(K"); return 0; } @@ -74,6 +74,9 @@ int loadKeymap(gzFile stream) { if (console < 0) return -EACCES; + /* place keyboard in unicode mode */ + ioctl(console, KDSKBMODE, K_UNICODE); + for (kmap = 0; kmap < MAX_NR_KEYMAPS; kmap++) { if (!keymaps[kmap]) continue; diff --git a/isys/lang.h b/isys/lang.h index 2aa1d5605..f73183a74 100644 --- a/isys/lang.h +++ b/isys/lang.h @@ -18,7 +18,7 @@ struct kmapInfo { }; int loadKeymap(gzFile stream); -int isysLoadFont(char * fontFile); +int isysLoadFont(void); int isysLoadKeymap(char * keymap); #endif diff --git a/lang-table b/lang-table index 8f885305d..6a5d38156 100644 --- a/lang-table +++ b/lang-table @@ -1,19 +1,19 @@ -Chinese(Simplified) zh_CN None None zh_CN.GB18030 us Asia/Shanghai -Chinese(Traditional) zh_TW None None zh_TW.Big5 us Asia/Taipei -Czech cs lat2-sun16 iso02 cs_CZ cz-lat2 Europe/Prague -Danish da lat0-sun16 iso15 da_DK us Europe/Copenhagen -English en default8x16 iso01 en_US us America/New_York -French fr lat0-sun16 iso15 fr_FR fr-latin1 Europe/Paris -German de lat0-16 iso09 de_DE de-latin1-nodeadkeys Europe/Berlin -Icelandic is lat0-sun16 iso15 is_IS is-latin1 Atlantic/Reykjavik -Italian it lat0-sun16 iso15 it_IT it Europe/Rome -Japanese ja Kon None ja_JP.eucJP jp106 Asia/Tokyo -Korean ko None None ko_KR.eucKR us Asia/Seoul -Dutch nl lat0-sun16 iso15 nl_NL us Europe/Amsterdam -Norwegian no lat0-sun16 iso15 no_NO no-latin1 Europe/Oslo -Portuguese pt lat0-sun16 iso15 pt_PT@euro pt-latin1 Europe/Lisbon -Russian ru cyr-sun16 koi8-r ru_RU.koi8r ru Europe/Moscow -Slovenian sl lat2-sun16 iso02 sl_SI slovene Europe/Ljubljana -Spanish es lat0-sun16 iso15 es_ES es Europe/Madrid -Swedish sv lat0-sun16 iso15 sv_SE se-latin1 Europe/Stockholm -Ukrainian uk cyr-sun16 koi8-u uk_UA ua Europe/Kiev +Chinese(Simplified) zh_CN Bterm None zh_CN.GB18030 us Asia/Shanghai +Chinese(Traditional) zh_TW Bterm None zh_TW.Big5 us Asia/Taipei +Czech cs latarcyrheb-sun16 iso02 cs_CZ cz-lat2 Europe/Prague +Danish da latarcyrheb-sun16 iso15 da_DK us Europe/Copenhagen +English en latarcyrheb-sun16 iso01 en_US us America/New_York +French fr latarcyrheb-sun16 iso15 fr_FR fr-latin1 Europe/Paris +German de latarcyrheb-sun16 iso09 de_DE de-latin1-nodeadkeys Europe/Berlin +Icelandic is latarcyrheb-sun16 iso15 is_IS is-latin1 Atlantic/Reykjavik +Italian it latarcyrheb-sun16 iso15 it_IT it Europe/Rome +Japanese ja Bterm None ja_JP.eucJP jp106 Asia/Tokyo +Korean ko Bterm None ko_KR.eucKR us Asia/Seoul +Dutch nl latarcyrheb-sun16 iso15 nl_NL us Europe/Amsterdam +Norwegian no latarcyrheb-sun16 iso15 no_NO no-latin1 Europe/Oslo +Portuguese pt latarcyrheb-sun16 iso15 pt_PT@euro pt-latin1 Europe/Lisbon +Russian ru latarcyrheb-sun16 koi8-r ru_RU.koi8r ru Europe/Moscow +Slovenian sl latarcyrheb-sun16 iso02 sl_SI slovene Europe/Ljubljana +Spanish es latarcyrheb-sun16 iso15 es_ES es Europe/Madrid +Swedish sv latarcyrheb-sun16 iso15 sv_SE se-latin1 Europe/Stockholm +Ukrainian uk latarcyrheb-sun16 koi8-u uk_UA ua Europe/Kiev diff --git a/loader2/Makefile b/loader2/Makefile index 4f9803faf..abc4dc26c 100644 --- a/loader2/Makefile +++ b/loader2/Makefile @@ -16,9 +16,10 @@ else TARGET=depend $(PROGS) endif -# JKFIXME: switch to use system libslang and libnewt with msw's wcwidth() -SLANGLIB = ../minislang/libslang.a -NEWTLIB = ../mininewt/libnewt.a +SLANGLIB = -lslang +NEWTLIB = -lnewt +BTERMLIB = -lbterm -lbogl +WLITELIB = -lwlite ISYSLIB = ../isys/libisys.a GUNZIP = -lz MODULELINKAGE :=-lmodutils -lmodutilutil -lmodutilobj @@ -49,9 +50,8 @@ CFLAGS += -DGZLIB=1 DIET=diet REALCC=gcc CC=$(DIET) $(REALCC) -# JKFIXME: this also goes away when we go to system {newt,slang} -SLANGLIB = ../minislang/libslang-diet.a -NEWTLIB = ../mininewt/libnewt-diet.a +BTERMLIB = -lbtermdiet -lbogldiet +WLITELIB = -lwlite ISYSLIB = ../isys/libisys-diet.a GUNZIP = ../isys/gzlib/libgunzip-diet.a endif @@ -75,7 +75,7 @@ loader.tr: $(TR) ../lang-table (cd tr; ls $(TRFILES) | cpio --quiet -Hcrc -o |gzip -9) > $@ tr/%.tr: ../po/%.po loader.po - msgmerge $< loader.po | ./simplemot > $@ + msgmerge $< loader.po | msgconv -t utf-8 | ./simplemot > $@ loader.po: $(wildcard *.c) xgettext --default-domain=loader --add-comments \ @@ -106,7 +106,7 @@ loader: loader.o $(OBJS) $(NETOBJS) $(CC) -g $(STATIC) -o $@ $^ -lpopt \ $(HWLIBS) $(ISYSLIB) \ $(MODULELINKAGE) $(GUNZIP) \ - -lpump $(NEWTLIB) $(SLANGLIB) $(KONOBJS) + -lpump $(NEWTLIB) $(SLANGLIB) $(BTERMLIB) $(WLITELIB) clean: rm -f *.o *~ .depend init ctype.c mkctype \ diff --git a/loader2/dietstubs.c b/loader2/dietstubs.c index dab88965f..90b2af092 100644 --- a/loader2/dietstubs.c +++ b/loader2/dietstubs.c @@ -6,6 +6,10 @@ #include #include +#define WLITE_REDEF_STDC 0 +#include +#include + struct glibc_stat { long long st_dev; unsigned short int __pad1; @@ -164,3 +168,26 @@ void * __rawmemchr (void* s, int c) { char * dcgettext (const char *domainname, const char *msgid, int category) { return msgid; } + +int wcwidth (wchar_t c) { + return wlite_wcwidth(c); +} + +size_t mbrtowc (wchar_t *pwc, const char *s, size_t n, void *ps) { + return wlite_mbrtowc (pwc, s, n, ps); +} + +int iswspace (wchar_t c) { + return wlite_iswctype((c), wlite_space_); +} + +size_t wcrtomb(char *s, wchar_t wc, void *ps) { + return wlite_wcrtomb (s, wc, ps); +} + +/* lie to slang to trick it into using unicode chars for linedrawing */ +char *setlocale (int category, const char *locale) { + if (locale == NULL || *locale == '\0') + return "en_US.UTF-8"; + return 0; +} diff --git a/loader2/init.c b/loader2/init.c index d31e9742f..4566e32ec 100644 --- a/loader2/init.c +++ b/loader2/init.c @@ -583,6 +583,8 @@ int main(int argc, char **argv) { /* turn off screen blanking */ printstr("\033[9;0]"); printstr("\033[8]"); + /* enable UTF-8 console */ + printstr("\033%G"); } else { printstr("(running in test mode).\n"); } diff --git a/loader2/lang.c b/loader2/lang.c index 3291f69dc..9c78bca9a 100644 --- a/loader2/lang.c +++ b/loader2/lang.c @@ -75,7 +75,6 @@ char * translateString(char * str) { } key.hash = (sum << 16) | ((xor & 0xFF) << 8) | (len & 0xFF); - match = bsearch(&key, strings, numStrings, sizeof(*strings), aStringCmp); if (!match) return str; @@ -213,7 +212,7 @@ void setLanguage (char * key, int flags) { setenv("LINGUAS", languages[i].lc_all, 1); loadLanguage (NULL, flags); if (languages[i].map) - isysLoadFont(languages[i].map); + isysLoadFont(); break; } } @@ -315,7 +314,7 @@ int chooseLanguage(char ** lang, int flags) { } if (languages[choice].map) - isysLoadFont(languages[choice].map); + isysLoadFont(); buf = sdupprintf(_(topLineWelcome), PRODUCTNAME); diff --git a/loader2/simplemot b/loader2/simplemot index 467020be0..abf09694d 100755 --- a/loader2/simplemot +++ b/loader2/simplemot @@ -3,6 +3,10 @@ $inone = 0; $intran = 0; $total = 0; + +binmode(STDIN, ":raw"); +binmode(STDOUT, ":raw"); + while (<>) { if (!$inone && /^msgid/) { chop; diff --git a/scripts/mk-images b/scripts/mk-images index 00ea51c31..8e4c418af 100755 --- a/scripts/mk-images +++ b/scripts/mk-images @@ -60,7 +60,7 @@ TOPDIR=$(cd $TOPDIR; pwd) TRIMPCITABLE=$IMGPATH/usr/lib/anaconda-runtime/trimpcitable GETKEYMAPS=$IMGPATH/usr/lib/anaconda-runtime/getkeymaps KEYMAPS=/tmp/keymaps-$BUILDARCH.$$ - FONTS=$IMGPATH/usr/lib/anaconda-runtime/fonts-${BASEARCH} + SCREENFONT=$IMGPATH/usr/lib/anaconda-runtime/screenfont-${BASEARCH}.gz GETMODDEPS=$IMGPATH/usr/lib/anaconda-runtime/moddeps MODLIST=$IMGPATH/usr/lib/anaconda-runtime/modlist MODINFO=$IMGPATH/usr/lib/anaconda-runtime/loader/module-info @@ -416,7 +416,7 @@ EOF install -s -m 755 $LOADERBINDIR/$LOADERBIN $MBD_DIR/sbin/loader install -s -m 755 $LOADERBINDIR/$INITBIN $MBD_DIR/sbin install -m 644 $KEYMAPS $MBD_DIR/etc/keymaps.gz - install -m 644 $FONTS $MBD_DIR/etc/fonts.cgz + install -m 644 $SCREENFONT $MBD_DIR/etc/screenfont.cgz install -m 644 $MYLANGTABLE $MBD_DIR/etc/lang-table install -m 644 $LOADERBINDIR/$MYLOADERTR $MBD_DIR/etc/loader.tr diff --git a/utils/snarffont.c b/utils/snarffont.c index efb35ade6..7793ff653 100644 --- a/utils/snarffont.c +++ b/utils/snarffont.c @@ -11,18 +11,27 @@ void die(char * mess) { exit(1); } +#define MAXFONTSIZE 65536 + int main(void) { - char font[8192]; + char buf[MAXFONTSIZE]; + struct console_font_op cfo; unsigned short map[E_TABSZ]; struct unipair descs[2048]; struct unimapdesc d; int fd; - if ((fd = open("/dev/tty1", O_RDONLY)) < 0) + if ((fd = open("/dev/tty", O_RDONLY)) < 0) die("open"); - if (ioctl(fd, GIO_FONT, font)) - die("GIO_FONT"); + cfo.op = KD_FONT_OP_GET; + cfo.flags = 0; + cfo.width = 8; + cfo.height = 16; + cfo.charcount = 512; + cfo.data = buf; + if (ioctl(fd, KDFONTOP, &cfo)) + die("KDFONTOP KD_FONT_OP_GET"); if (ioctl(fd, GIO_UNISCRNMAP, map)) die("GIO_UNISCRNMAP"); @@ -32,7 +41,8 @@ int main(void) { if (ioctl(fd, GIO_UNIMAP, &d)) die("GIO_UNIMAP"); - write(1, font, sizeof(font)); + write(1, &cfo, sizeof(cfo)); + write(1, buf, sizeof(buf)); write(1, map, sizeof(map)); write(1, &d.entry_ct, sizeof(d.entry_ct)); write(1, descs, d.entry_ct * sizeof(descs[0])); -- cgit