summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatt Wilson <msw@redhat.com>2002-12-11 23:54:47 +0000
committerMatt Wilson <msw@redhat.com>2002-12-11 23:54:47 +0000
commit8c307da285ad1cc5b3e900dc2f0ae11faf1fa6ac (patch)
tree633ca11b3cb87503512a77470a1284f4512afde3
parent1c491c9c515c1790e505a4100c46ab46bcc5aefc (diff)
downloadanaconda-8c307da285ad1cc5b3e900dc2f0ae11faf1fa6ac.tar.gz
anaconda-8c307da285ad1cc5b3e900dc2f0ae11faf1fa6ac.tar.xz
anaconda-8c307da285ad1cc5b3e900dc2f0ae11faf1fa6ac.zip
first pass at using unicode in text mode
-rw-r--r--fonts/Makefile2
-rw-r--r--fonts/screenfont-i386.gzbin0 -> 4156 bytes
-rwxr-xr-xfonts/updfonts34
-rw-r--r--isys/isys.c2
-rw-r--r--isys/lang.c33
-rw-r--r--isys/lang.h2
-rw-r--r--lang-table38
-rw-r--r--loader2/Makefile16
-rw-r--r--loader2/dietstubs.c27
-rw-r--r--loader2/init.c2
-rw-r--r--loader2/lang.c5
-rwxr-xr-xloader2/simplemot4
-rwxr-xr-xscripts/mk-images4
-rw-r--r--utils/snarffont.c20
14 files changed, 103 insertions, 86 deletions
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
--- /dev/null
+++ b/fonts/screenfont-i386.gz
Binary files 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 <arch>"
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 <ctype.h>
#include <stdarg.h>
+#define WLITE_REDEF_STDC 0
+#include <wlite_wchar.h>
+#include <wlite_wctype.h>
+
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]));