On Mon, Oct 01, 2007 at 12:57:35PM +0200, Marcin Kurek wrote: > 2) menu looks ugly like hell as it contains some random characters in > place of borders.
I have a few concerns about this part: > static void > grub_ofconsole_putchar (grub_uint32_t c) > { > - char chr = c; > - if (c == '\n') > - { > + char chr; > + > + switch (c) > + { > + case GRUB_TERM_DISP_LEFT: > + c = '<'; > + break; > + case GRUB_TERM_DISP_UP: > + c = '^'; > + break; > + case GRUB_TERM_DISP_RIGHT: > + c = '>'; > + break; > + case GRUB_TERM_DISP_DOWN: > + c = 'v'; > + break; > + case GRUB_TERM_DISP_HLINE: > + c = '-'; > + break; > + case GRUB_TERM_DISP_VLINE: > + c = '|'; > + break; > + case GRUB_TERM_DISP_UL: > + case GRUB_TERM_DISP_UR: > + case GRUB_TERM_DISP_LL: > + case GRUB_TERM_DISP_LR: > + c = '+'; > + break; > + case '\t': > + c = ' '; > + break; > + > + default: > + /* of does not support Unicode. */ > + if (c > 0x7f) > + c = '?'; > + break; > + } 1- First, you're duplicating code from term/i386/pc/serial.c. I think it should be shared. 2- Do we _always_ want to map to ascii? Of course, mapping to ascii is the best choice when we don't have anything better, but if we can distinguish physical screen (cp437 charset, on PCs and on efika as well) from serial cable (must be ascii?), we could still draw pretty lines instead of -|+ stuff. 3- The cp437 charset in efika is buggy (I don't know about pegasos), as some chars are replaced with portions of the bplan logo (sigh). I gave it a try before, and the only sane way to draw a pretty rectangle seems to be: (warning, utf-8 follows. if you can't read this get a decent MUA ;-)) ╒═╕ │ │ ╘═╛ I had this pending patch liing around. I never got the time to sort out all these problems, but perhaps you can obtain something useful from it. -- Robert Millan <GPLv2> I know my rights; I want my phone call! <DRM> What use is a phone call, if you are unable to speak? (as seen on /.)
Tested on Efika *only* Get rid of the FIXME diff -ur -x i386-pc.mk -x powerpc-ieee1275.mk grub2.old/conf/i386-pc.rmk grub2/conf/i386-pc.rmk --- grub2.old/conf/i386-pc.rmk 2007-06-23 16:40:12.000000000 +0200 +++ grub2/conf/i386-pc.rmk 2007-07-10 21:32:52.000000000 +0200 @@ -28,7 +28,7 @@ kern/misc.c kern/mm.c kern/loader.c kern/rescue.c kern/term.c \ kern/i386/dl.c kern/i386/pc/init.c kern/parser.c kern/partition.c \ kern/env.c disk/i386/pc/biosdisk.c \ - term/i386/pc/console.c \ + term/i386/pc/console.c term/cp437.c \ symlist.c kernel_img_HEADERS = arg.h boot.h cache.h device.h disk.h dl.h elf.h elfload.h \ env.h err.h file.h fs.h kernel.h loader.h misc.h mm.h net.h parser.h \ diff -ur -x i386-pc.mk -x powerpc-ieee1275.mk grub2.old/conf/powerpc-ieee1275.rmk grub2/conf/powerpc-ieee1275.rmk --- grub2.old/conf/powerpc-ieee1275.rmk 2007-07-10 20:40:07.000000000 +0200 +++ grub2/conf/powerpc-ieee1275.rmk 2007-07-10 21:33:19.000000000 +0200 @@ -80,7 +80,8 @@ kern/ieee1275/ieee1275.c kern/main.c kern/device.c \ kern/disk.c kern/dl.c kern/err.c kern/file.c kern/fs.c \ kern/misc.c kern/mm.c kern/loader.c kern/rescue.c kern/term.c \ - kern/powerpc/ieee1275/init.c term/ieee1275/ofconsole.c \ + kern/powerpc/ieee1275/init.c term/ieee1275/ofconsole.c \ + term/cp437.c \ kern/powerpc/ieee1275/openfw.c disk/ieee1275/ofdisk.c \ kern/parser.c kern/partition.c kern/env.c kern/powerpc/dl.c \ kernel_elf_symlist.c kern/powerpc/cache.S diff -ur -x i386-pc.mk -x powerpc-ieee1275.mk grub2.old/include/grub/ieee1275/ieee1275.h grub2/include/grub/ieee1275/ieee1275.h --- grub2.old/include/grub/ieee1275/ieee1275.h 2007-07-09 17:12:15.000000000 +0200 +++ grub2/include/grub/ieee1275/ieee1275.h 2007-07-10 23:29:37.000000000 +0200 @@ -83,6 +83,14 @@ /* CodeGen firmware does not correctly implement "output-device output" */ GRUB_IEEE1275_FLAG_BROKEN_OUTPUT, + + /* On CodeGen firmware (maybe others?), extended chars are assumed to be + cp437-encoded */ + GRUB_IEEE1275_FLAG_CP437_DISPLAY, + + /* On CodeGen firmware, cp437 characters 0xc0 to 0xcb are reserved for the + bplan logo */ + GRUB_IEEE1275_FLAG_BPLAN_LOGO, }; extern int EXPORT_FUNC(grub_ieee1275_test_flag) (enum grub_ieee1275_flag flag); diff -ur -x i386-pc.mk -x powerpc-ieee1275.mk grub2.old/include/grub/term.h grub2/include/grub/term.h --- grub2.old/include/grub/term.h 2005-10-15 11:22:31.000000000 +0200 +++ grub2/include/grub/term.h 2007-07-10 23:31:02.000000000 +0200 @@ -202,6 +202,7 @@ int EXPORT_FUNC(grub_getcursor) (void); void EXPORT_FUNC(grub_refresh) (void); void EXPORT_FUNC(grub_set_more) (int onoff); +grub_uint32_t EXPORT_FUNC(grub_utf8_to_cp437) (grub_uint32_t c); /* For convenience. */ #define GRUB_TERM_ASCII_CHAR(c) ((c) & 0xff) diff -ur -x i386-pc.mk -x powerpc-ieee1275.mk grub2.old/kern/powerpc/ieee1275/cmain.c grub2/kern/powerpc/ieee1275/cmain.c --- grub2.old/kern/powerpc/ieee1275/cmain.c 2007-07-09 17:12:15.000000000 +0200 +++ grub2/kern/powerpc/ieee1275/cmain.c 2007-07-10 23:30:34.000000000 +0200 @@ -66,6 +66,8 @@ { grub_ieee1275_set_flag (GRUB_IEEE1275_FLAG_0_BASED_PARTITIONS); grub_ieee1275_set_flag (GRUB_IEEE1275_FLAG_BROKEN_OUTPUT); + grub_ieee1275_set_flag (GRUB_IEEE1275_FLAG_CP437_DISPLAY); + grub_ieee1275_set_flag (GRUB_IEEE1275_FLAG_BPLAN_LOGO); } } diff -ur -x i386-pc.mk -x powerpc-ieee1275.mk grub2.old/term/i386/pc/console.c grub2/term/i386/pc/console.c --- grub2.old/term/i386/pc/console.c 2007-05-05 00:28:31.000000000 +0200 +++ grub2/term/i386/pc/console.c 2007-07-10 21:30:06.000000000 +0200 @@ -26,58 +26,10 @@ static grub_uint8_t grub_console_normal_color = 0x7; static grub_uint8_t grub_console_highlight_color = 0x70; -static grub_uint32_t -map_char (grub_uint32_t c) -{ - if (c > 0x7f) - { - /* Map some unicode characters to the VGA font, if possible. */ - switch (c) - { - case 0x2190: /* left arrow */ - c = 0x1b; - break; - case 0x2191: /* up arrow */ - c = 0x18; - break; - case 0x2192: /* right arrow */ - c = 0x1a; - break; - case 0x2193: /* down arrow */ - c = 0x19; - break; - case 0x2501: /* horizontal line */ - c = 0xc4; - break; - case 0x2503: /* vertical line */ - c = 0xb3; - break; - case 0x250F: /* upper-left corner */ - c = 0xda; - break; - case 0x2513: /* upper-right corner */ - c = 0xbf; - break; - case 0x2517: /* lower-left corner */ - c = 0xc0; - break; - case 0x251B: /* lower-right corner */ - c = 0xd9; - break; - - default: - c = '?'; - break; - } - } - - return c; -} - static void grub_console_putchar (grub_uint32_t c) { - grub_console_real_putchar (map_char (c)); + grub_console_real_putchar (grub_utf8_to_cp437 (c)); } static grub_ssize_t diff -ur -x i386-pc.mk -x powerpc-ieee1275.mk grub2.old/term/i386/pc/serial.c grub2/term/i386/pc/serial.c --- grub2.old/term/i386/pc/serial.c 2005-11-13 16:47:09.000000000 +0100 +++ grub2/term/i386/pc/serial.c 2007-07-10 23:18:53.000000000 +0200 @@ -328,44 +328,7 @@ /* The serial terminal does not have VGA fonts. */ if (c > 0x7F) { - /* Better than nothing. */ - switch (c) - { - case GRUB_TERM_DISP_LEFT: - c = '<'; - break; - - case GRUB_TERM_DISP_UP: - c = '^'; - break; - - case GRUB_TERM_DISP_RIGHT: - c = '>'; - break; - - case GRUB_TERM_DISP_DOWN: - c = 'v'; - break; - - case GRUB_TERM_DISP_HLINE: - c = '-'; - break; - - case GRUB_TERM_DISP_VLINE: - c = '|'; - break; - - case GRUB_TERM_DISP_UL: - case GRUB_TERM_DISP_UR: - case GRUB_TERM_DISP_LL: - case GRUB_TERM_DISP_LR: - c = '+'; - break; - - default: - c = '?'; - break; - } + / * FIXME */ } switch (c) diff -ur -x i386-pc.mk -x powerpc-ieee1275.mk grub2.old/term/ieee1275/ofconsole.c grub2/term/ieee1275/ofconsole.c --- grub2.old/term/ieee1275/ofconsole.c 2007-07-09 17:12:15.000000000 +0200 +++ grub2/term/ieee1275/ofconsole.c 2007-07-10 23:30:34.000000000 +0200 @@ -75,7 +75,45 @@ static void grub_ofconsole_putchar (grub_uint32_t c) { - char chr = c; + char chr; + + /* cp437 characters 0xc0 to 0xcb are reserved for the bplan logo. Use + this layout to workaround it: + ╒═╕ + │ │ + ╘═╛ + */ + if (c > 0x7F) + if (grub_ieee1275_test_flag (GRUB_IEEE1275_FLAG_CP437_DISPLAY)) + { + if (grub_ieee1275_test_flag (GRUB_IEEE1275_FLAG_BPLAN_LOGO)) + switch (c) + { + case GRUB_TERM_DISP_HLINE: + c = 0xcd; + break; + case GRUB_TERM_DISP_VLINE: + c = 0xb3; + break; + case GRUB_TERM_DISP_UL: + c = 0xd5; + break; + case GRUB_TERM_DISP_UR: + c = 0xb8; + break; + case GRUB_TERM_DISP_LL: + c = 0xd4; + break; + case GRUB_TERM_DISP_LR: + c = 0xbe; + break; + default: + c = grub_utf8_to_cp437 (c); + } + else + c = grub_utf8_to_cp437 (c); + } + if (c == '\n') { grub_curr_y++; @@ -87,6 +125,8 @@ if (grub_curr_x > grub_ofconsole_width) grub_putcode ('\n'); } + + chr = c; grub_ieee1275_write (stdout_ihandle, &chr, 1, 0); }
_______________________________________________ Grub-devel mailing list Grub-devel@gnu.org http://lists.gnu.org/mailman/listinfo/grub-devel