--- ../Cache/cvs/grub2/term/ieee1275/ofconsole.c 2007-07-22 11:05:11.000000000 +0200 +++ grub2/term/ieee1275/ofconsole.c 2007-10-01 12:12:47.075370575 +0200 @@ -63,29 +63,81 @@ static void grub_ofconsole_writeesc (const char *str) { - while (*str) - { - char chr = *(str++); - grub_ieee1275_write (stdout_ihandle, &chr, 1, 0); - } - + int len = grub_strlen(str); + grub_ieee1275_write (stdout_ihandle, str, len, 0); } 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; + } + + switch(c) + { + case '\a': + break; + case '\n': + grub_putcode ('\r'); grub_curr_y++; + + if(grub_curr_y > (grub_ofconsole_height - 1)) + grub_curr_y -= 4; /* Is this realy correct for all OF versions around ? */ + break; + case '\r': grub_curr_x = 0; - } - else - { + break; + case '\b': + if(grub_curr_x > 0) + grub_curr_x--; + break; + + default: + + if (grub_curr_x >= (grub_ofconsole_width - 1)) + grub_putcode ('\n'); + grub_curr_x++; - if (grub_curr_x > grub_ofconsole_width) - grub_putcode ('\n'); - } + break; + } + + chr = c; grub_ieee1275_write (stdout_ihandle, &chr, 1, 0); } @@ -137,43 +189,56 @@ grub_ieee1275_read (stdin_ihandle, &c, 1, &actual); - if (actual > 0 && c == '\e') + if (actual > 0) { - grub_ieee1275_read (stdin_ihandle, &c, 1, &actual); - if (actual <= 0) - { - *key = '\e'; - return 1; - } + if (c != '\e') + { + switch(c) + { + case 127: + /* Backspace */ + c = '\b'; + break; + } + } + else + { + grub_ieee1275_read (stdin_ihandle, &c, 1, &actual); + if (actual <= 0) + { + *key = '\e'; + return 1; + } - if (c != 91) - return 0; + if (c != 91) + return 0; - grub_ieee1275_read (stdin_ihandle, &c, 1, &actual); - if (actual <= 0) - return 0; + grub_ieee1275_read (stdin_ihandle, &c, 1, &actual); + if (actual <= 0) + return 0; - switch (c) - { - case 65: - /* Up: Ctrl-p. */ - c = 16; - break; - case 66: - /* Down: Ctrl-n. */ - c = 14; - break; - case 67: - /* Right: Ctrl-f. */ - c = 6; - break; - case 68: - /* Left: Ctrl-b. */ - c = 2; - break; - } + switch (c) + { + case 65: + /* Up: Ctrl-p. */ + c = 16; + break; + case 66: + /* Down: Ctrl-n. */ + c = 14; + break; + case 67: + /* Right: Ctrl-f. */ + c = 6; + break; + case 68: + /* Left: Ctrl-b. */ + c = 2; + break; + } + } } - + *key = c; return actual > 0; } @@ -217,7 +282,7 @@ static grub_uint16_t grub_ofconsole_getxy (void) { - return ((grub_curr_x - 1) << 8) | grub_curr_y; + return (grub_curr_x << 8) | grub_curr_y; } static grub_uint16_t