From e89c2d48a991590c18c28ac867ccda67d4425187 Mon Sep 17 00:00:00 2001 From: Vladimir 'phcoder' Serbinenko Date: Sat, 19 Oct 2013 23:59:32 +0200 Subject: [PATCH] Lift 255x255 erminal sie restriction to 65535x65535. Also change from bitmasks to small structures of size chosen to fit in registers. --- ChangeLog | 5 ++ grub-core/commands/sleep.c | 2 +- grub-core/kern/term.c | 2 +- grub-core/loader/i386/linux.c | 6 +- grub-core/normal/cmdline.c | 27 ++++----- grub-core/normal/main.c | 2 +- grub-core/normal/menu_entry.c | 68 ++++++++++++----------- grub-core/normal/menu_text.c | 80 +++++++++++++++++---------- grub-core/normal/term.c | 39 ++++++------- grub-core/osdep/unix/emuconsole.c | 11 ++-- grub-core/osdep/windows/emuconsole.c | 16 +++--- grub-core/term/arc/console.c | 11 ++-- grub-core/term/efi/console.c | 14 ++--- grub-core/term/gfxterm.c | 22 ++++---- grub-core/term/i386/coreboot/cbmemc.c | 3 +- grub-core/term/i386/pc/console.c | 25 +++++---- grub-core/term/i386/pc/vga_text.c | 37 ++++++------- grub-core/term/ieee1275/console.c | 27 +++++---- grub-core/term/serial.c | 3 +- grub-core/term/spkmodem.c | 3 +- grub-core/term/terminfo.c | 51 +++++++++-------- grub-core/term/uboot/console.c | 16 +----- include/grub/term.h | 29 ++++++---- include/grub/terminfo.h | 11 ++-- 24 files changed, 266 insertions(+), 244 deletions(-) diff --git a/ChangeLog b/ChangeLog index 3ba286a4a..ef694e687 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2013-10-19 Vladimir Serbinenko + + Lift 255x255 erminal sie restriction to 65535x65535. Also change from + bitmasks to small structures of size chosen to fit in registers. + 2013-10-19 Vladimir Serbinenko * conf/Makefile.common: Use -freg-struct-return on i386. This diff --git a/grub-core/commands/sleep.c b/grub-core/commands/sleep.c index c0989bcb8..e77e7900f 100644 --- a/grub-core/commands/sleep.c +++ b/grub-core/commands/sleep.c @@ -34,7 +34,7 @@ static const struct grub_arg_option options[] = {0, 0, 0, 0, 0, 0} }; -static grub_uint16_t *pos; +static struct grub_term_coordinate *pos; static void do_print (int n) diff --git a/grub-core/kern/term.c b/grub-core/kern/term.c index 6eca68b72..07720ee67 100644 --- a/grub-core/kern/term.c +++ b/grub-core/kern/term.c @@ -53,7 +53,7 @@ grub_putcode_dumb (grub_uint32_t code, { int n; - n = GRUB_TERM_TAB_WIDTH - ((term->getxy (term) >> 8) + n = GRUB_TERM_TAB_WIDTH - ((term->getxy (term).x) % GRUB_TERM_TAB_WIDTH); while (n--) grub_putcode_dumb (' ', term); diff --git a/grub-core/loader/i386/linux.c b/grub-core/loader/i386/linux.c index 4e6a38898..18b7b0fa1 100644 --- a/grub-core/loader/i386/linux.c +++ b/grub-core/loader/i386/linux.c @@ -530,9 +530,9 @@ grub_linux_boot (void) || grub_strcmp (term->name, "console") == 0 || grub_strcmp (term->name, "ofconsole") == 0) { - grub_uint16_t pos = grub_term_getxy (term); - linux_params.video_cursor_x = pos >> 8; - linux_params.video_cursor_y = pos & 0xff; + struct grub_term_coordinate pos = grub_term_getxy (term); + linux_params.video_cursor_x = pos.x; + linux_params.video_cursor_y = pos.y; linux_params.video_width = grub_term_width (term); linux_params.video_height = grub_term_height (term); found = 1; diff --git a/grub-core/normal/cmdline.c b/grub-core/normal/cmdline.c index eb974efee..03e84d5d4 100644 --- a/grub-core/normal/cmdline.c +++ b/grub-core/normal/cmdline.c @@ -206,7 +206,8 @@ print_completion (const char *item, grub_completion_type_t type, int count) struct cmdline_term { - unsigned xpos, ypos, ystart, width, height; + struct grub_term_coordinate pos; + unsigned ystart, width, height; unsigned prompt_len; struct grub_term_output *term; }; @@ -237,10 +238,10 @@ grub_cmdline_get (const char *prompt_translated) void cl_set_pos (struct cmdline_term *cl_term) { - cl_term->xpos = (cl_term->prompt_len + lpos) % cl_term->width; - cl_term->ypos = cl_term->ystart + cl_term->pos.x = (cl_term->prompt_len + lpos) % cl_term->width; + cl_term->pos.y = cl_term->ystart + (cl_term->prompt_len + lpos) / cl_term->width; - grub_term_gotoxy (cl_term->term, cl_term->xpos, cl_term->ypos); + grub_term_gotoxy (cl_term->term, cl_term->pos); } void cl_set_pos_all (void) @@ -260,14 +261,14 @@ grub_cmdline_get (const char *prompt_translated) grub_putcode (c, cl_term->term); else grub_putcode (*p, cl_term->term); - cl_term->xpos++; - if (cl_term->xpos >= cl_term->width - 1) + cl_term->pos.x++; + if (cl_term->pos.x >= cl_term->width - 1) { - cl_term->xpos = 0; - if (cl_term->ypos >= (unsigned) (cl_term->height - 1)) + cl_term->pos.x = 0; + if (cl_term->pos.y >= (unsigned) (cl_term->height - 1)) cl_term->ystart--; else - cl_term->ypos++; + cl_term->pos.y++; grub_putcode ('\n', cl_term->term); } } @@ -335,9 +336,9 @@ grub_cmdline_get (const char *prompt_translated) void init_clterm (struct cmdline_term *cl_term_cur) { - cl_term_cur->xpos = cl_term_cur->prompt_len; - cl_term_cur->ypos = (grub_term_getxy (cl_term_cur->term) & 0xFF); - cl_term_cur->ystart = cl_term_cur->ypos; + cl_term_cur->pos.x = cl_term_cur->prompt_len; + cl_term_cur->pos.y = grub_term_getxy (cl_term_cur->term).y; + cl_term_cur->ystart = cl_term_cur->pos.y; cl_term_cur->width = grub_term_width (cl_term_cur->term); cl_term_cur->height = grub_term_height (cl_term_cur->term); } @@ -360,7 +361,7 @@ grub_cmdline_get (const char *prompt_translated) grub_term_output_t term; FOR_ACTIVE_TERM_OUTPUTS(term) - if ((grub_term_getxy (term) >> 8) != 0) + if ((grub_term_getxy (term).x) != 0) grub_putcode ('\n', term); } grub_xputs (prompt_translated); diff --git a/grub-core/normal/main.c b/grub-core/normal/main.c index 259c0aa4f..ad3627351 100644 --- a/grub-core/normal/main.c +++ b/grub-core/normal/main.c @@ -264,7 +264,7 @@ grub_normal_init_page (struct grub_term_output *term, posx = ((int) grub_term_width (term) - posx) / 2; if (posx < 0) posx = 0; - grub_term_gotoxy (term, posx, y); + grub_term_gotoxy (term, (struct grub_term_coordinate) { posx, y }); grub_print_ucs4 (unicode_msg, last_position, 0, 0, term); grub_putcode ('\n', term); diff --git a/grub-core/normal/menu_entry.c b/grub-core/normal/menu_entry.c index 6aa33071c..e67e25424 100644 --- a/grub-core/normal/menu_entry.c +++ b/grub-core/normal/menu_entry.c @@ -146,8 +146,8 @@ print_empty_line (int y, struct per_term_screen *term_screen) int i; grub_term_gotoxy (term_screen->term, - term_screen->geo.first_entry_x, - y + term_screen->geo.first_entry_y); + (struct grub_term_coordinate) { term_screen->geo.first_entry_x, + y + term_screen->geo.first_entry_y }); for (i = 0; i < term_screen->geo.entry_width + 1; i++) grub_putcode (' ', term_screen->term); @@ -156,10 +156,11 @@ print_empty_line (int y, struct per_term_screen *term_screen) static void print_updown (int upflag, int downflag, struct per_term_screen *term_screen) { - grub_term_gotoxy (term_screen->term, term_screen->geo.first_entry_x - + term_screen->geo.entry_width + 1 - + term_screen->geo.border, - term_screen->geo.first_entry_y); + grub_term_gotoxy (term_screen->term, + (struct grub_term_coordinate) { term_screen->geo.first_entry_x + + term_screen->geo.entry_width + 1 + + term_screen->geo.border, + term_screen->geo.first_entry_y }); if (upflag && downflag) grub_putcode (GRUB_UNICODE_UPDOWNARROW, term_screen->term); @@ -175,10 +176,11 @@ print_updown (int upflag, int downflag, struct per_term_screen *term_screen) static void print_up (int flag, struct per_term_screen *term_screen) { - grub_term_gotoxy (term_screen->term, term_screen->geo.first_entry_x - + term_screen->geo.entry_width + 1 - + term_screen->geo.border, - term_screen->geo.first_entry_y); + grub_term_gotoxy (term_screen->term, + (struct grub_term_coordinate) { term_screen->geo.first_entry_x + + term_screen->geo.entry_width + 1 + + term_screen->geo.border, + term_screen->geo.first_entry_y }); if (flag) grub_putcode (GRUB_UNICODE_UPARROW, term_screen->term); @@ -190,11 +192,12 @@ print_up (int flag, struct per_term_screen *term_screen) static void print_down (int flag, struct per_term_screen *term_screen) { - grub_term_gotoxy (term_screen->term, term_screen->geo.first_entry_x - + term_screen->geo.entry_width + 1 - + term_screen->geo.border, - term_screen->geo.first_entry_y - + term_screen->geo.num_entries - 1); + grub_term_gotoxy (term_screen->term, + (struct grub_term_coordinate) { term_screen->geo.first_entry_x + + term_screen->geo.entry_width + 1 + + term_screen->geo.border, + term_screen->geo.first_entry_y + + term_screen->geo.num_entries - 1 }); if (flag) grub_putcode (GRUB_UNICODE_DOWNARROW, term_screen->term); @@ -278,9 +281,10 @@ update_screen (struct screen *screen, struct per_term_screen *term_screen, if (i == region_start || linep == screen->lines + screen->line || (i > region_start && mode == ALL_LINES)) { - grub_term_gotoxy (term_screen->term, term_screen->geo.first_entry_x, - (y < 0 ? 0 : y) - + term_screen->geo.first_entry_y); + grub_term_gotoxy (term_screen->term, + (struct grub_term_coordinate) { term_screen->geo.first_entry_x, + (y < 0 ? 0 : y) + + term_screen->geo.first_entry_y }); grub_print_ucs4_menu (linep->buf, linep->buf + linep->len, @@ -338,13 +342,13 @@ update_screen (struct screen *screen, struct per_term_screen *term_screen, y += get_logical_num_lines (screen->lines + i, term_screen); if (cpos >= &(screen->lines[screen->line].pos[term_screen - screen->terms])[0]) grub_term_gotoxy (term_screen->term, - cpos->x + term_screen->geo.first_entry_x, - cpos->y + y - + term_screen->geo.first_entry_y); + (struct grub_term_coordinate) { cpos->x + term_screen->geo.first_entry_x, + cpos->y + y + + term_screen->geo.first_entry_y }); else grub_term_gotoxy (term_screen->term, - term_screen->geo.first_entry_x, - y + term_screen->geo.first_entry_y); + (struct grub_term_coordinate) { term_screen->geo.first_entry_x, + y + term_screen->geo.first_entry_y }); } @@ -1028,15 +1032,16 @@ complete (struct screen *screen, int continuous, int update) + width - 1) / width); grub_uint32_t *endp; - grub_uint16_t pos; + struct grub_term_coordinate pos; grub_uint32_t *p = ucs4; pos = grub_term_getxy (screen->terms[i].term); screen->completion_shown = 1; - grub_term_gotoxy (screen->terms[i].term, 0, - screen->terms[i].geo.timeout_y); + grub_term_gotoxy (screen->terms[i].term, + (struct grub_term_coordinate) { 0, + screen->terms[i].geo.timeout_y }); if (screen->terms[i].geo.timeout_lines >= 2) { grub_puts_terminal (" ", screen->terms[i].term); @@ -1084,7 +1089,7 @@ complete (struct screen *screen, int continuous, int update) if (ucs4 + ucs4len > endp) grub_putcode (GRUB_UNICODE_RIGHTARROW, screen->terms[i].term); - grub_term_gotoxy (screen->terms[i].term, pos >> 8, pos & 0xFF); + grub_term_gotoxy (screen->terms[i].term, pos); } } @@ -1105,13 +1110,14 @@ complete (struct screen *screen, int continuous, int update) static void clear_completions (struct per_term_screen *term_screen) { - grub_uint16_t pos; + struct grub_term_coordinate pos; unsigned j; int i; pos = grub_term_getxy (term_screen->term); - grub_term_gotoxy (term_screen->term, 0, - term_screen->geo.timeout_y); + grub_term_gotoxy (term_screen->term, + (struct grub_term_coordinate) { 0, + term_screen->geo.timeout_y }); for (i = 0; i < term_screen->geo.timeout_lines; i++) { @@ -1121,7 +1127,7 @@ clear_completions (struct per_term_screen *term_screen) grub_putcode ('\n', term_screen->term); } - grub_term_gotoxy (term_screen->term, pos >> 8, pos & 0xFF); + grub_term_gotoxy (term_screen->term, pos); grub_term_refresh (term_screen->term); } diff --git a/grub-core/normal/menu_text.c b/grub-core/normal/menu_text.c index b6ec32ae5..450fb508b 100644 --- a/grub-core/normal/menu_text.c +++ b/grub-core/normal/menu_text.c @@ -115,7 +115,8 @@ draw_border (struct grub_term_output *term, const struct grub_term_screen_geomet grub_term_setcolorstate (term, GRUB_TERM_COLOR_NORMAL); - grub_term_gotoxy (term, geo->first_entry_x - 1, geo->first_entry_y - 1); + grub_term_gotoxy (term, (struct grub_term_coordinate) { geo->first_entry_x - 1, + geo->first_entry_y - 1 }); grub_putcode (GRUB_UNICODE_CORNER_UL, term); for (i = 0; i < geo->entry_width + 1; i++) grub_putcode (GRUB_UNICODE_HLINE, term); @@ -123,15 +124,18 @@ draw_border (struct grub_term_output *term, const struct grub_term_screen_geomet for (i = 0; i < geo->num_entries; i++) { - grub_term_gotoxy (term, geo->first_entry_x - 1, geo->first_entry_y + i); + grub_term_gotoxy (term, (struct grub_term_coordinate) { geo->first_entry_x - 1, + geo->first_entry_y + i }); grub_putcode (GRUB_UNICODE_VLINE, term); - grub_term_gotoxy (term, geo->first_entry_x + geo->entry_width + 1, - geo->first_entry_y + i); + grub_term_gotoxy (term, + (struct grub_term_coordinate) { geo->first_entry_x + geo->entry_width + 1, + geo->first_entry_y + i }); grub_putcode (GRUB_UNICODE_VLINE, term); } - grub_term_gotoxy (term, geo->first_entry_x - 1, - geo->first_entry_y - 1 + geo->num_entries + 1); + grub_term_gotoxy (term, + (struct grub_term_coordinate) { geo->first_entry_x - 1, + geo->first_entry_y - 1 + geo->num_entries + 1 }); grub_putcode (GRUB_UNICODE_CORNER_LL, term); for (i = 0; i < geo->entry_width + 1; i++) grub_putcode (GRUB_UNICODE_HLINE, term); @@ -139,9 +143,10 @@ draw_border (struct grub_term_output *term, const struct grub_term_screen_geomet grub_term_setcolorstate (term, GRUB_TERM_COLOR_NORMAL); - grub_term_gotoxy (term, geo->first_entry_x - 1, - (geo->first_entry_y - 1 + geo->num_entries - + GRUB_TERM_MARGIN + 1)); + grub_term_gotoxy (term, + (struct grub_term_coordinate) { geo->first_entry_x - 1, + (geo->first_entry_y - 1 + geo->num_entries + + GRUB_TERM_MARGIN + 1) }); } static int @@ -228,7 +233,8 @@ print_entry (int y, int highlight, grub_menu_entry_t entry, ? GRUB_TERM_COLOR_HIGHLIGHT : GRUB_TERM_COLOR_NORMAL); - grub_term_gotoxy (data->term, data->geo.first_entry_x, y); + grub_term_gotoxy (data->term, (struct grub_term_coordinate) { + data->geo.first_entry_x, y }); for (i = 0; i < len; i++) if (unicode_title[i] == '\n' || unicode_title[i] == '\b' @@ -246,7 +252,9 @@ print_entry (int y, int highlight, grub_menu_entry_t entry, GRUB_UNICODE_RIGHTARROW, 0); grub_term_setcolorstate (data->term, GRUB_TERM_COLOR_NORMAL); - grub_term_gotoxy (data->term, grub_term_cursor_x (&data->geo), y); + grub_term_gotoxy (data->term, + (struct grub_term_coordinate) { + grub_term_cursor_x (&data->geo), y }); grub_term_normal_color = old_color_normal; grub_term_highlight_color = old_color_highlight; @@ -262,9 +270,10 @@ print_entries (grub_menu_t menu, const struct menu_viewer_data *data) int i; grub_term_gotoxy (data->term, - data->geo.first_entry_x + data->geo.entry_width - + data->geo.border + 1, - data->geo.first_entry_y); + (struct grub_term_coordinate) { + data->geo.first_entry_x + data->geo.entry_width + + data->geo.border + 1, + data->geo.first_entry_y }); if (data->geo.num_entries != 1) { @@ -283,9 +292,10 @@ print_entries (grub_menu_t menu, const struct menu_viewer_data *data) e = e->next; } - grub_term_gotoxy (data->term, data->geo.first_entry_x + data->geo.entry_width - + data->geo.border + 1, - data->geo.first_entry_y + data->geo.num_entries - 1); + grub_term_gotoxy (data->term, + (struct grub_term_coordinate) { data->geo.first_entry_x + data->geo.entry_width + + data->geo.border + 1, + data->geo.first_entry_y + data->geo.num_entries - 1 }); if (data->geo.num_entries == 1) { if (data->first && e) @@ -305,8 +315,9 @@ print_entries (grub_menu_t menu, const struct menu_viewer_data *data) grub_putcode (' ', data->term); } - grub_term_gotoxy (data->term, grub_term_cursor_x (&data->geo), - data->geo.first_entry_y + data->offset); + grub_term_gotoxy (data->term, + (struct grub_term_coordinate) { grub_term_cursor_x (&data->geo), + data->geo.first_entry_y + data->offset }); } /* Initialize the screen. If NESTED is non-zero, assume that this menu @@ -404,8 +415,9 @@ grub_menu_init_page (int nested, int edit, + geo->border + empty_lines; if (bottom_message) { - grub_term_gotoxy (term, GRUB_TERM_MARGIN, - geo->timeout_y); + grub_term_gotoxy (term, + (struct grub_term_coordinate) { GRUB_TERM_MARGIN, + geo->timeout_y }); print_message (nested, edit, term, 0); geo->timeout_y += msg_num_lines; @@ -424,7 +436,8 @@ menu_text_print_timeout (int timeout, void *dataptr) struct menu_viewer_data *data = dataptr; char *msg_translated = 0; - grub_term_gotoxy (data->term, 0, data->geo.timeout_y); + grub_term_gotoxy (data->term, + (struct grub_term_coordinate) { 0, data->geo.timeout_y }); if (data->timeout_msg == TIMEOUT_TERSE || data->timeout_msg == TIMEOUT_TERSE_NO_MARGIN) @@ -459,8 +472,9 @@ menu_text_print_timeout (int timeout, void *dataptr) grub_free (msg_translated); grub_term_gotoxy (data->term, - grub_term_cursor_x (&data->geo), - data->geo.first_entry_y + data->offset); + (struct grub_term_coordinate) { + grub_term_cursor_x (&data->geo), + data->geo.first_entry_y + data->offset }); grub_term_refresh (data->term); } @@ -516,22 +530,28 @@ menu_text_clear_timeout (void *dataptr) for (i = 0; i < data->geo.timeout_lines;i++) { - grub_term_gotoxy (data->term, 0, data->geo.timeout_y + i); + grub_term_gotoxy (data->term, (struct grub_term_coordinate) { + 0, data->geo.timeout_y + i }); grub_print_spaces (data->term, grub_term_width (data->term) - 1); } if (data->geo.num_entries <= 5 && !data->geo.border) { - grub_term_gotoxy (data->term, data->geo.first_entry_x + data->geo.entry_width - + data->geo.border + 1, - data->geo.first_entry_y + data->geo.num_entries - 1); + grub_term_gotoxy (data->term, + (struct grub_term_coordinate) { + data->geo.first_entry_x + data->geo.entry_width + + data->geo.border + 1, + data->geo.first_entry_y + data->geo.num_entries - 1 + }); grub_putcode (' ', data->term); data->geo.timeout_lines = 0; data->geo.num_entries++; print_entries (data->menu, data); } - grub_term_gotoxy (data->term, grub_term_cursor_x (&data->geo), - data->geo.first_entry_y + data->offset); + grub_term_gotoxy (data->term, + (struct grub_term_coordinate) { + grub_term_cursor_x (&data->geo), + data->geo.first_entry_y + data->offset }); grub_term_refresh (data->term); } diff --git a/grub-core/normal/term.c b/grub-core/normal/term.c index aba1a7336..bf970e91c 100644 --- a/grub-core/normal/term.c +++ b/grub-core/normal/term.c @@ -73,7 +73,7 @@ static void print_more (void) { char key; - grub_uint16_t *pos; + struct grub_term_coordinate *pos; grub_term_output_t term; grub_uint32_t *unicode_str, *unicode_last_position; @@ -257,12 +257,12 @@ grub_puts_terminal (const char *str, struct grub_term_output *term) grub_free (unicode_str); } -grub_uint16_t * +struct grub_term_coordinate * grub_term_save_pos (void) { struct grub_term_output *cur; unsigned cnt = 0; - grub_uint16_t *ret, *ptr; + struct grub_term_coordinate *ret, *ptr; FOR_ACTIVE_TERM_OUTPUTS(cur) cnt++; @@ -279,17 +279,17 @@ grub_term_save_pos (void) } void -grub_term_restore_pos (grub_uint16_t *pos) +grub_term_restore_pos (struct grub_term_coordinate *pos) { struct grub_term_output *cur; - grub_uint16_t *ptr = pos; + struct grub_term_coordinate *ptr = pos; if (!pos) return; FOR_ACTIVE_TERM_OUTPUTS(cur) { - grub_term_gotoxy (cur, (*ptr & 0xff00) >> 8, *ptr & 0xff); + grub_term_gotoxy (cur, *ptr); ptr++; } } @@ -444,7 +444,7 @@ putglyph (const struct grub_unicode_glyph *c, struct grub_term_output *term, { int n; - n = GRUB_TERM_TAB_WIDTH - ((term->getxy (term) >> 8) + n = GRUB_TERM_TAB_WIDTH - ((term->getxy (term).x) % GRUB_TERM_TAB_WIDTH); c2.base = ' '; while (n--) @@ -545,14 +545,14 @@ static grub_ssize_t get_startwidth (struct grub_term_output *term, int margin_left) { - return ((term->getxy (term) >> 8) & 0xff) - margin_left; + return (term->getxy (term).x) - margin_left; } static void fill_margin (struct grub_term_output *term, int r) { - int sp = (term->getwh (term) >> 8) - - (term->getxy (term) >> 8) - r; + int sp = (term->getwh (term).x) + - (term->getxy (term).x) - r; if (sp > 0) grub_print_spaces (term, sp); } @@ -713,8 +713,8 @@ print_ucs4_terminal (const grub_uint32_t * str, if (!contchar) grub_print_spaces (term, margin_left); else - grub_term_gotoxy (term, margin_left, - grub_term_getxy (term) & 0xff); + grub_term_gotoxy (term, (struct grub_term_coordinate) + { margin_left, grub_term_getxy (term).y }); for (i = 0; i < state->bidi_stack_depth; i++) putcode_real (state->bidi_stack[i] | (GRUB_UNICODE_LRE & ~0xff), term, fixed_tab); @@ -807,8 +807,9 @@ put_glyphs_terminal (struct grub_unicode_glyph *visual, if (!contchar) grub_print_spaces (term, margin_left); else - grub_term_gotoxy (term, margin_left, - grub_term_getxy (term) & 0xff); + grub_term_gotoxy (term, + (struct grub_term_coordinate) + { margin_left, grub_term_getxy (term).y }); } grub_unicode_destroy_glyph (visual_ptr); } @@ -885,19 +886,19 @@ print_ucs4_real (const grub_uint32_t * str, if (!dry_run) { - int xy; + struct grub_term_coordinate xy; if (backlog) state = find_term_state (term); xy = term->getxy (term); - if (((xy >> 8) & 0xff) < margin_left) + if (xy.x < margin_left) { if (!contchar) - grub_print_spaces (term, margin_left - ((xy >> 8) & 0xff)); + grub_print_spaces (term, margin_left - xy.x); else - grub_term_gotoxy (term, margin_left, - xy & 0xff); + grub_term_gotoxy (term, (struct grub_term_coordinate) {margin_left, + xy.y}); } } diff --git a/grub-core/osdep/unix/emuconsole.c b/grub-core/osdep/unix/emuconsole.c index d61ade167..53aa28500 100644 --- a/grub-core/osdep/unix/emuconsole.c +++ b/grub-core/osdep/unix/emuconsole.c @@ -101,13 +101,13 @@ grub_console_init_output (struct grub_term_output *term) struct winsize size; if (ioctl (STDOUT_FILENO, TIOCGWINSZ, &size) >= 0) { - grub_console_terminfo_output.width = size.ws_col; - grub_console_terminfo_output.height = size.ws_row; + grub_console_terminfo_output.size.x = size.ws_col; + grub_console_terminfo_output.size.y = size.ws_row; } else { - grub_console_terminfo_output.width = 80; - grub_console_terminfo_output.height = 24; + grub_console_terminfo_output.size.x = 80; + grub_console_terminfo_output.size.y = 24; } grub_terminfo_output_init (term); @@ -125,8 +125,7 @@ struct grub_terminfo_input_state grub_console_terminfo_input = struct grub_terminfo_output_state grub_console_terminfo_output = { .put = put, - .width = 80, - .height = 24 + .size = { 80, 24 } }; static struct grub_term_input grub_console_term_input = diff --git a/grub-core/osdep/windows/emuconsole.c b/grub-core/osdep/windows/emuconsole.c index cfd584ebf..f3414eff7 100644 --- a/grub-core/osdep/windows/emuconsole.c +++ b/grub-core/osdep/windows/emuconsole.c @@ -129,7 +129,7 @@ grub_console_getkey (struct grub_term_input *term __attribute__ ((unused))) } } -static grub_uint16_t +static struct grub_term_coordinate grub_console_getwh (struct grub_term_output *term __attribute__ ((unused))) { CONSOLE_SCREEN_BUFFER_INFO csbi; @@ -139,24 +139,24 @@ grub_console_getwh (struct grub_term_output *term __attribute__ ((unused))) GetConsoleScreenBufferInfo (hStdout, &csbi); - return ((csbi.dwSize.X << 8) | csbi.dwSize.Y); + return (struct grub_term_coordinate) { csbi.dwSize.X, csbi.dwSize.Y }; } -static grub_uint16_t +static struct grub_term_coordinate grub_console_getxy (struct grub_term_output *term __attribute__ ((unused))) { CONSOLE_SCREEN_BUFFER_INFO csbi; GetConsoleScreenBufferInfo (hStdout, &csbi); - return ((csbi.dwCursorPosition.X << 8) | csbi.dwCursorPosition.Y); + return (struct grub_term_coordinate) { csbi.dwCursorPosition.X, csbi.dwCursorPosition.Y }; } static void grub_console_gotoxy (struct grub_term_output *term __attribute__ ((unused)), - grub_uint8_t x, grub_uint8_t y) + struct grub_term_coordinate pos) { - COORD coord = { x, y }; + COORD coord = { pos.x, pos.y }; SetConsoleCursorPosition (hStdout, coord); } @@ -179,13 +179,13 @@ grub_console_cls (struct grub_term_output *term) GetConsoleScreenBufferInfo (hStdout, &csbi); SetConsoleTextAttribute (hStdout, 0); - grub_console_gotoxy (term, 0, 0); + grub_console_gotoxy (term, (struct grub_term_coordinate) { 0, 0 }); tsz = csbi.dwSize.X * csbi.dwSize.Y; while (tsz--) grub_console_putchar (term, &c); - grub_console_gotoxy (term, 0, 0); + grub_console_gotoxy (term, (struct grub_term_coordinate) { 0, 0 }); SetConsoleTextAttribute (hStdout, csbi.wAttributes); } diff --git a/grub-core/term/arc/console.c b/grub-core/term/arc/console.c index df099f05a..87a65cc16 100644 --- a/grub-core/term/arc/console.c +++ b/grub-core/term/arc/console.c @@ -130,8 +130,8 @@ set_console_dimensions (void) if (check_is_serial ()) { - grub_console_terminfo_output.width = 80; - grub_console_terminfo_output.height = 24; + grub_console_terminfo_output.size.x = 80; + grub_console_terminfo_output.size.y = 24; return; } @@ -142,8 +142,8 @@ set_console_dimensions (void) info = GRUB_ARC_FIRMWARE_VECTOR->getdisplaystatus (GRUB_ARC_STDOUT); if (info) { - grub_console_terminfo_output.width = info->w + 1; - grub_console_terminfo_output.height = info->h + 1; + grub_console_terminfo_output.size.x = info->w + 1; + grub_console_terminfo_output.size.y = info->h + 1; } } @@ -164,8 +164,7 @@ static struct grub_terminfo_input_state grub_console_terminfo_input = static struct grub_terminfo_output_state grub_console_terminfo_output = { .put = put, - .width = 80, - .height = 20 + .size = { 80, 20 } }; static struct grub_term_input grub_console_term_input = diff --git a/grub-core/term/efi/console.c b/grub-core/term/efi/console.c index fad23d2d4..e6bb50d65 100644 --- a/grub-core/term/efi/console.c +++ b/grub-core/term/efi/console.c @@ -142,7 +142,7 @@ grub_console_getkey (struct grub_term_input *term __attribute__ ((unused))) return GRUB_TERM_NO_KEY; } -static grub_uint16_t +static struct grub_term_coordinate grub_console_getwh (struct grub_term_output *term __attribute__ ((unused))) { grub_efi_simple_text_output_interface_t *o; @@ -157,24 +157,24 @@ grub_console_getwh (struct grub_term_output *term __attribute__ ((unused))) rows = 25; } - return ((columns << 8) | rows); + return (struct grub_term_coordinate) { columns, rows }; } -static grub_uint16_t +static struct grub_term_coordinate grub_console_getxy (struct grub_term_output *term __attribute__ ((unused))) { grub_efi_simple_text_output_interface_t *o; if (grub_efi_is_finished) - return 0; + return (struct grub_term_coordinate) { 0, 0 }; o = grub_efi_system_table->con_out; - return ((o->mode->cursor_column << 8) | o->mode->cursor_row); + return (struct grub_term_coordinate) { o->mode->cursor_column, o->mode->cursor_row }; } static void grub_console_gotoxy (struct grub_term_output *term __attribute__ ((unused)), - grub_uint8_t x, grub_uint8_t y) + struct grub_term_coordinate pos) { grub_efi_simple_text_output_interface_t *o; @@ -182,7 +182,7 @@ grub_console_gotoxy (struct grub_term_output *term __attribute__ ((unused)), return; o = grub_efi_system_table->con_out; - efi_call_3 (o->set_cursor_position, o, x, y); + efi_call_3 (o->set_cursor_position, o, pos.x, pos.y); } static void diff --git a/grub-core/term/gfxterm.c b/grub-core/term/gfxterm.c index e7d5af4e8..83b42cf50 100644 --- a/grub-core/term/gfxterm.c +++ b/grub-core/term/gfxterm.c @@ -970,34 +970,34 @@ grub_gfxterm_getcharwidth (struct grub_term_output *term __attribute__ ((unused) / virtual_screen.normal_char_width; } -static grub_uint16_t +static struct grub_term_coordinate grub_virtual_screen_getwh (struct grub_term_output *term __attribute__ ((unused))) { - return (virtual_screen.columns << 8) | virtual_screen.rows; + return (struct grub_term_coordinate) { virtual_screen.columns, virtual_screen.rows }; } -static grub_uint16_t +static struct grub_term_coordinate grub_virtual_screen_getxy (struct grub_term_output *term __attribute__ ((unused))) { - return ((virtual_screen.cursor_x << 8) | virtual_screen.cursor_y); + return (struct grub_term_coordinate) { virtual_screen.cursor_x, virtual_screen.cursor_y }; } static void grub_gfxterm_gotoxy (struct grub_term_output *term __attribute__ ((unused)), - grub_uint8_t x, grub_uint8_t y) + struct grub_term_coordinate pos) { - if (x >= virtual_screen.columns) - x = virtual_screen.columns - 1; + if (pos.x >= virtual_screen.columns) + pos.x = virtual_screen.columns - 1; - if (y >= virtual_screen.rows) - y = virtual_screen.rows - 1; + if (pos.y >= virtual_screen.rows) + pos.y = virtual_screen.rows - 1; /* Erase current cursor, if any. */ if (virtual_screen.cursor_state) draw_cursor (0); - virtual_screen.cursor_x = x; - virtual_screen.cursor_y = y; + virtual_screen.cursor_x = pos.x; + virtual_screen.cursor_y = pos.y; /* Draw cursor if visible. */ if (virtual_screen.cursor_state) diff --git a/grub-core/term/i386/coreboot/cbmemc.c b/grub-core/term/i386/coreboot/cbmemc.c index f9f7ed9ef..2a0877ce0 100644 --- a/grub-core/term/i386/coreboot/cbmemc.c +++ b/grub-core/term/i386/coreboot/cbmemc.c @@ -51,8 +51,7 @@ put (struct grub_term_output *term __attribute__ ((unused)), const int c) struct grub_terminfo_output_state grub_cbmemc_terminfo_output = { .put = put, - .width = 80, - .height = 24 + .size = { 80, 24 } }; static struct grub_term_output grub_cbmemc_term_output = diff --git a/grub-core/term/i386/pc/console.c b/grub-core/term/i386/pc/console.c index 358611a65..a727653d7 100644 --- a/grub-core/term/i386/pc/console.c +++ b/grub-core/term/i386/pc/console.c @@ -47,7 +47,7 @@ int10_9 (grub_uint8_t ch, grub_uint16_t n) */ -static grub_uint16_t +static struct grub_term_coordinate grub_console_getxy (struct grub_term_output *term __attribute__ ((unused))) { struct grub_bios_int_registers regs; @@ -57,7 +57,8 @@ grub_console_getxy (struct grub_term_output *term __attribute__ ((unused))) regs.flags = GRUB_CPU_INT_FLAGS_DEFAULT; grub_bios_interrupt (0x10, ®s); - return ((regs.edx & 0xff) << 8) | ((regs.edx & 0xff00) >> 8); + return (struct grub_term_coordinate) { + (regs.edx & 0xff), ((regs.edx & 0xff00) >> 8) }; } /* @@ -69,14 +70,14 @@ grub_console_getxy (struct grub_term_output *term __attribute__ ((unused))) */ static void grub_console_gotoxy (struct grub_term_output *term __attribute__ ((unused)), - grub_uint8_t x, grub_uint8_t y) + struct grub_term_coordinate pos) { struct grub_bios_int_registers regs; /* set page to 0 */ regs.ebx = 0; regs.eax = 0x0200; - regs.edx = (y << 8) | x; + regs.edx = (pos.y << 8) | pos.x; regs.flags = GRUB_CPU_INT_FLAGS_DEFAULT; grub_bios_interrupt (0x10, ®s); } @@ -94,7 +95,7 @@ static void grub_console_putchar_real (grub_uint8_t c) { struct grub_bios_int_registers regs; - grub_uint16_t pos; + struct grub_term_coordinate pos; if (c == 7 || c == 8 || c == 0xa || c == 0xd) { @@ -112,14 +113,14 @@ grub_console_putchar_real (grub_uint8_t c) int10_9 (c, 1); /* check the column with the width */ - if ((pos & 0xff00) >= (79 << 8)) + if (pos.x >= 79) { grub_console_putchar_real (0x0d); grub_console_putchar_real (0x0a); } else - grub_console_gotoxy (NULL, ((pos & 0xff00) >> 8) + 1, (pos & 0xff)); - + grub_console_gotoxy (NULL, (struct grub_term_coordinate) { pos.x + 1, + pos.y }); } static void @@ -141,13 +142,13 @@ static void grub_console_cls (struct grub_term_output *term) { /* move the cursor to the beginning */ - grub_console_gotoxy (term, 0, 0); + grub_console_gotoxy (term, (struct grub_term_coordinate) { 0, 0 }); /* write spaces to the entire screen */ int10_9 (' ', 80 * 25); /* move back the cursor */ - grub_console_gotoxy (term, 0, 0); + grub_console_gotoxy (term, (struct grub_term_coordinate) { 0, 0 }); } /* @@ -247,10 +248,10 @@ grub_console_getkeystatus (struct grub_term_input *term __attribute__ ((unused)) return bios_data_area->keyboard_flag_lower & ~0x80; } -static grub_uint16_t +static struct grub_term_coordinate grub_console_getwh (struct grub_term_output *term __attribute__ ((unused))) { - return (80 << 8) | 25; + return (struct grub_term_coordinate) { 80, 25 }; } static void diff --git a/grub-core/term/i386/pc/vga_text.c b/grub-core/term/i386/pc/vga_text.c index bee30766b..33834bf74 100644 --- a/grub-core/term/i386/pc/vga_text.c +++ b/grub-core/term/i386/pc/vga_text.c @@ -42,7 +42,7 @@ GRUB_MOD_LICENSE ("GPLv3+"); #define COLS 80 #define ROWS 25 -static int grub_curr_x, grub_curr_y; +static struct grub_term_coordinate grub_curr_pos; #ifdef __mips__ #define VGA_TEXT_SCREEN ((grub_uint16_t *) 0xb00b8000) @@ -75,7 +75,7 @@ screen_read_char (int x, int y) static void update_cursor (void) { - unsigned int pos = grub_curr_y * COLS + grub_curr_x; + unsigned int pos = grub_curr_pos.y * COLS + grub_curr_pos.x; cr_write (pos >> 8, GRUB_VGA_CR_CURSOR_ADDR_HIGH); cr_write (pos & 0xFF, GRUB_VGA_CR_CURSOR_ADDR_LOW); } @@ -83,9 +83,9 @@ update_cursor (void) static void inc_y (void) { - grub_curr_x = 0; - if (grub_curr_y < ROWS - 1) - grub_curr_y++; + grub_curr_pos.x = 0; + if (grub_curr_pos.y < ROWS - 1) + grub_curr_pos.y++; else { int x, y; @@ -100,10 +100,10 @@ inc_y (void) static void inc_x (void) { - if (grub_curr_x >= COLS - 1) + if (grub_curr_pos.x >= COLS - 1) inc_y (); else - grub_curr_x++; + grub_curr_pos.x++; } static void @@ -113,17 +113,17 @@ grub_vga_text_putchar (struct grub_term_output *term __attribute__ ((unused)), switch (c->base) { case '\b': - if (grub_curr_x != 0) - screen_write_char (grub_curr_x--, grub_curr_y, ' '); + if (grub_curr_pos.x != 0) + screen_write_char (grub_curr_pos.x--, grub_curr_pos.y, ' '); break; case '\n': inc_y (); break; case '\r': - grub_curr_x = 0; + grub_curr_pos.x = 0; break; default: - screen_write_char (grub_curr_x, grub_curr_y, + screen_write_char (grub_curr_pos.x, grub_curr_pos.y, c->base | (cur_color << 8)); inc_x (); } @@ -131,18 +131,17 @@ grub_vga_text_putchar (struct grub_term_output *term __attribute__ ((unused)), update_cursor (); } -static grub_uint16_t +static struct grub_term_coordinate grub_vga_text_getxy (struct grub_term_output *term __attribute__ ((unused))) { - return (grub_curr_x << 8) | grub_curr_y; + return grub_curr_pos; } static void grub_vga_text_gotoxy (struct grub_term_output *term __attribute__ ((unused)), - grub_uint8_t x, grub_uint8_t y) + struct grub_term_coordinate pos) { - grub_curr_x = x; - grub_curr_y = y; + grub_curr_pos = pos; update_cursor (); } @@ -152,7 +151,7 @@ grub_vga_text_cls (struct grub_term_output *term) int i; for (i = 0; i < ROWS * COLS; i++) VGA_TEXT_SCREEN[i] = grub_cpu_to_le16 (' ' | (cur_color << 8)); - grub_vga_text_gotoxy (term, 0, 0); + grub_vga_text_gotoxy (term, (struct grub_term_coordinate) { 0, 0 }); } static void @@ -203,10 +202,10 @@ grub_vga_text_fini_real (struct grub_term_output *term) return 0; } -static grub_uint16_t +static struct grub_term_coordinate grub_vga_text_getwh (struct grub_term_output *term __attribute__ ((unused))) { - return (80 << 8) | 25; + return (struct grub_term_coordinate) { 80, 25 }; } #ifndef MODE_MDA diff --git a/grub-core/term/ieee1275/console.c b/grub-core/term/ieee1275/console.c index 6bcee5863..17010e744 100644 --- a/grub-core/term/ieee1275/console.c +++ b/grub-core/term/ieee1275/console.c @@ -97,8 +97,8 @@ grub_console_dimensions (void) val[sizeof (val) - 1] = 0; if (grub_strcmp (val, "serial") == 0) { - grub_console_terminfo_output.width = 80; - grub_console_terminfo_output.height = 24; + grub_console_terminfo_output.size.x = 80; + grub_console_terminfo_output.size.y = 24; return; } } @@ -111,31 +111,31 @@ grub_console_dimensions (void) val, sizeof (val) - 1, 0)) { val[sizeof (val) - 1] = 0; - grub_console_terminfo_output.width + grub_console_terminfo_output.size.x = (grub_uint8_t) grub_strtoul (val, 0, 10); } if (! grub_ieee1275_get_property (options, "screen-#rows", val, sizeof (val) - 1, 0)) { val[sizeof (val) - 1] = 0; - grub_console_terminfo_output.height + grub_console_terminfo_output.size.y = (grub_uint8_t) grub_strtoul (val, 0, 10); } } /* Bogus default value on SLOF in QEMU. */ - if (grub_console_terminfo_output.width == 200 - && grub_console_terminfo_output.height == 200) + if (grub_console_terminfo_output.size.x == 200 + && grub_console_terminfo_output.size.y == 200) { - grub_console_terminfo_output.width = 80; - grub_console_terminfo_output.height = 24; + grub_console_terminfo_output.size.x = 80; + grub_console_terminfo_output.size.y = 24; } /* Use a small console by default. */ - if (! grub_console_terminfo_output.width) - grub_console_terminfo_output.width = 80; - if (! grub_console_terminfo_output.height) - grub_console_terminfo_output.height = 24; + if (! grub_console_terminfo_output.size.x) + grub_console_terminfo_output.size.x = 80; + if (! grub_console_terminfo_output.size.y) + grub_console_terminfo_output.size.y = 24; } static void @@ -212,8 +212,7 @@ struct grub_terminfo_input_state grub_console_terminfo_input = struct grub_terminfo_output_state grub_console_terminfo_output = { .put = put, - .width = 80, - .height = 24 + .size = { 80, 24 } }; static struct grub_term_input grub_console_term_input = diff --git a/grub-core/term/serial.c b/grub-core/term/serial.c index 61cd80a9c..ac1fb8394 100644 --- a/grub-core/term/serial.c +++ b/grub-core/term/serial.c @@ -92,8 +92,7 @@ static const struct grub_serial_output_state grub_serial_terminfo_output_templat .tinfo = { .put = serial_put, - .width = 80, - .height = 24 + .size = { 80, 24 } } }; diff --git a/grub-core/term/spkmodem.c b/grub-core/term/spkmodem.c index f20a27d2a..7d4ead356 100644 --- a/grub-core/term/spkmodem.c +++ b/grub-core/term/spkmodem.c @@ -109,8 +109,7 @@ grub_spkmodem_fini_output (struct grub_term_output *term __attribute__ ((unused) struct grub_terminfo_output_state grub_spkmodem_terminfo_output = { .put = put, - .width = 80, - .height = 24 + .size = { 80, 24 } }; static struct grub_term_output grub_spkmodem_term_output = diff --git a/grub-core/term/terminfo.c b/grub-core/term/terminfo.c index e0146cbed..001f24008 100644 --- a/grub-core/term/terminfo.c +++ b/grub-core/term/terminfo.c @@ -230,38 +230,37 @@ putstr (struct grub_term_output *term, const char *str) data->put (term, *str++); } -grub_uint16_t +struct grub_term_coordinate grub_terminfo_getxy (struct grub_term_output *term) { struct grub_terminfo_output_state *data = (struct grub_terminfo_output_state *) term->data; - return ((data->xpos << 8) | data->ypos); + return data->pos; } void grub_terminfo_gotoxy (struct grub_term_output *term, - grub_uint8_t x, grub_uint8_t y) + struct grub_term_coordinate pos) { struct grub_terminfo_output_state *data = (struct grub_terminfo_output_state *) term->data; - if (x > grub_term_width (term) || y > grub_term_height (term)) + if (pos.x > grub_term_width (term) || pos.y > grub_term_height (term)) { - grub_error (GRUB_ERR_BUG, "invalid point (%u,%u)", x, y); + grub_error (GRUB_ERR_BUG, "invalid point (%u,%u)", pos.x, pos.y); return; } if (data->gotoxy) - putstr (term, grub_terminfo_tparm (data->gotoxy, y, x)); + putstr (term, grub_terminfo_tparm (data->gotoxy, pos.y, pos.x)); else { - if ((y == data->ypos) && (x == data->xpos - 1)) + if ((pos.y == data->pos.y) && (pos.x == data->pos.x - 1)) data->put (term, '\b'); } - data->xpos = x; - data->ypos = y; + data->pos = pos; } /* Clear the screen. */ @@ -272,7 +271,7 @@ grub_terminfo_cls (struct grub_term_output *term) = (struct grub_terminfo_output_state *) term->data; putstr (term, grub_terminfo_tparm (data->cls)); - grub_terminfo_gotoxy (term, 0, 0); + grub_terminfo_gotoxy (term, (struct grub_term_coordinate) { 0, 0 }); } void @@ -360,42 +359,42 @@ grub_terminfo_putchar (struct grub_term_output *term, case '\b': case 127: - if (data->xpos > 0) - data->xpos--; + if (data->pos.x > 0) + data->pos.x--; break; case '\n': - if (data->ypos < grub_term_height (term) - 1) - data->ypos++; + if (data->pos.y < grub_term_height (term) - 1) + data->pos.y++; break; case '\r': - data->xpos = 0; + data->pos.x = 0; break; default: - if (data->xpos + c->estimated_width >= grub_term_width (term) + 1) + if ((int) data->pos.x + c->estimated_width >= (int) grub_term_width (term) + 1) { - data->xpos = 0; - if (data->ypos < grub_term_height (term) - 1) - data->ypos++; + data->pos.x = 0; + if (data->pos.y < grub_term_height (term) - 1) + data->pos.y++; data->put (term, '\r'); data->put (term, '\n'); } - data->xpos += c->estimated_width; + data->pos.x += c->estimated_width; break; } data->put (term, c->base); } -grub_uint16_t +struct grub_term_coordinate grub_terminfo_getwh (struct grub_term_output *term) { struct grub_terminfo_output_state *data = (struct grub_terminfo_output_state *) term->data; - return (data->width << 8) | data->height; + return data->size; } static void @@ -673,8 +672,8 @@ print_terminfo (void) grub_terminfo_get_current(cur), encoding_names[(cur->flags & GRUB_TERM_CODE_TYPE_MASK) >> GRUB_TERM_CODE_TYPE_SHIFT], - ((struct grub_terminfo_output_state *) cur->data)->width, - ((struct grub_terminfo_output_state *) cur->data)->height); + ((struct grub_terminfo_output_state *) cur->data)->pos.x, + ((struct grub_terminfo_output_state *) cur->data)->pos.y); return GRUB_ERR_NONE; } @@ -747,8 +746,8 @@ grub_cmd_terminfo (grub_extcmd_context_t ctxt, int argc, char **args) { struct grub_terminfo_output_state *data = (struct grub_terminfo_output_state *) cur->data; - data->width = w; - data->height = h; + data->pos.x = w; + data->pos.y = h; } if (argc == 1) diff --git a/grub-core/term/uboot/console.c b/grub-core/term/uboot/console.c index 51defee6e..8bf1b3cee 100644 --- a/grub-core/term/uboot/console.c +++ b/grub-core/term/uboot/console.c @@ -56,21 +56,10 @@ uboot_console_init_input (struct grub_term_input *term) extern struct grub_terminfo_output_state uboot_console_terminfo_output; -static void -uboot_console_dimensions (void) -{ - /* Use a small console by default. */ - if (!uboot_console_terminfo_output.width) - uboot_console_terminfo_output.width = 80; - if (!uboot_console_terminfo_output.height) - uboot_console_terminfo_output.height = 24; -} static grub_err_t uboot_console_init_output (struct grub_term_output *term) { - uboot_console_dimensions (); - grub_terminfo_output_init (term); return 0; @@ -82,8 +71,9 @@ struct grub_terminfo_input_state uboot_console_terminfo_input = { struct grub_terminfo_output_state uboot_console_terminfo_output = { .put = put, - .width = 80, - .height = 24 + /* FIXME: In rare cases when console isn't serial, + determine real width. */ + .size = { 80, 24 } }; static struct grub_term_input uboot_console_term_input = { diff --git a/include/grub/term.h b/include/grub/term.h index 9ba33f2ec..9ca0c57a9 100644 --- a/include/grub/term.h +++ b/include/grub/term.h @@ -155,6 +155,13 @@ struct grub_term_input }; typedef struct grub_term_input *grub_term_input_t; +/* Made in a way to fit into uint32_t and so be passed in a register. */ +struct grub_term_coordinate +{ + grub_uint8_t x; + grub_uint8_t y; +}; + struct grub_term_output { /* The next terminal. */ @@ -179,15 +186,15 @@ struct grub_term_output grub_ssize_t (*getcharwidth) (struct grub_term_output *term, const struct grub_unicode_glyph *c); - /* Get the screen size. The return value is ((Width << 8) | Height). */ - grub_uint16_t (*getwh) (struct grub_term_output *term); + /* Get the screen size. */ + struct grub_term_coordinate (*getwh) (struct grub_term_output *term); /* Get the cursor position. The return value is ((X << 8) | Y). */ - grub_uint16_t (*getxy) (struct grub_term_output *term); + struct grub_term_coordinate (*getxy) (struct grub_term_output *term); /* Go to the position (X, Y). */ void (*gotoxy) (struct grub_term_output *term, - grub_uint8_t x, grub_uint8_t y); + struct grub_term_coordinate pos); /* Clear the screen. */ void (*cls) (struct grub_term_output *term); @@ -314,20 +321,20 @@ int EXPORT_FUNC(grub_getkey_noblock) (void); void grub_cls (void); void EXPORT_FUNC(grub_refresh) (void); void grub_puts_terminal (const char *str, struct grub_term_output *term); -grub_uint16_t *grub_term_save_pos (void); -void grub_term_restore_pos (grub_uint16_t *pos); +struct grub_term_coordinate *grub_term_save_pos (void); +void grub_term_restore_pos (struct grub_term_coordinate *pos); static inline unsigned grub_term_width (struct grub_term_output *term) { - return ((term->getwh(term)&0xFF00)>>8); + return term->getwh(term).x; } static inline unsigned grub_term_height (struct grub_term_output *term) { - return (term->getwh(term)&0xFF); + return term->getwh(term).y; } -static inline grub_uint16_t +static inline struct grub_term_coordinate grub_term_getxy (struct grub_term_output *term) { return term->getxy (term); @@ -341,9 +348,9 @@ grub_term_refresh (struct grub_term_output *term) } static inline void -grub_term_gotoxy (struct grub_term_output *term, grub_uint8_t x, grub_uint8_t y) +grub_term_gotoxy (struct grub_term_output *term, struct grub_term_coordinate pos) { - term->gotoxy (term, x, y); + term->gotoxy (term, pos); } static inline void diff --git a/include/grub/terminfo.h b/include/grub/terminfo.h index 2bbae1fa3..8a109ecfd 100644 --- a/include/grub/terminfo.h +++ b/include/grub/terminfo.h @@ -53,18 +53,17 @@ struct grub_terminfo_output_state char *cursor_off; char *setcolor; - unsigned int width, height; - - unsigned int xpos, ypos; + struct grub_term_coordinate size; + struct grub_term_coordinate pos; void (*put) (struct grub_term_output *term, const int c); }; grub_err_t EXPORT_FUNC(grub_terminfo_output_init) (struct grub_term_output *term); void EXPORT_FUNC(grub_terminfo_gotoxy) (grub_term_output_t term, - grub_uint8_t x, grub_uint8_t y); + struct grub_term_coordinate pos); void EXPORT_FUNC(grub_terminfo_cls) (grub_term_output_t term); -grub_uint16_t EXPORT_FUNC (grub_terminfo_getxy) (struct grub_term_output *term); +struct grub_term_coordinate EXPORT_FUNC (grub_terminfo_getxy) (struct grub_term_output *term); void EXPORT_FUNC (grub_terminfo_setcursor) (struct grub_term_output *term, const int on); void EXPORT_FUNC (grub_terminfo_setcolorstate) (struct grub_term_output *term, @@ -75,7 +74,7 @@ grub_err_t EXPORT_FUNC (grub_terminfo_input_init) (struct grub_term_input *term) int EXPORT_FUNC (grub_terminfo_getkey) (struct grub_term_input *term); void EXPORT_FUNC (grub_terminfo_putchar) (struct grub_term_output *term, const struct grub_unicode_glyph *c); -grub_uint16_t EXPORT_FUNC (grub_terminfo_getwh) (struct grub_term_output *term); +struct grub_term_coordinate EXPORT_FUNC (grub_terminfo_getwh) (struct grub_term_output *term); grub_err_t EXPORT_FUNC (grub_terminfo_output_register) (struct grub_term_output *term,