]> git.ipfire.org Git - thirdparty/grub.git/commitdiff
Lift 255x255 erminal sie restriction to 65535x65535. Also change from
authorVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Sat, 19 Oct 2013 21:59:32 +0000 (23:59 +0200)
committerVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Sat, 19 Oct 2013 21:59:32 +0000 (23:59 +0200)
bitmasks to small structures of size chosen to fit in registers.

24 files changed:
ChangeLog
grub-core/commands/sleep.c
grub-core/kern/term.c
grub-core/loader/i386/linux.c
grub-core/normal/cmdline.c
grub-core/normal/main.c
grub-core/normal/menu_entry.c
grub-core/normal/menu_text.c
grub-core/normal/term.c
grub-core/osdep/unix/emuconsole.c
grub-core/osdep/windows/emuconsole.c
grub-core/term/arc/console.c
grub-core/term/efi/console.c
grub-core/term/gfxterm.c
grub-core/term/i386/coreboot/cbmemc.c
grub-core/term/i386/pc/console.c
grub-core/term/i386/pc/vga_text.c
grub-core/term/ieee1275/console.c
grub-core/term/serial.c
grub-core/term/spkmodem.c
grub-core/term/terminfo.c
grub-core/term/uboot/console.c
include/grub/term.h
include/grub/terminfo.h

index 3ba286a4a9ae961d528661450f7d0430594d9800..ef694e68756a7f76f89d66e06ebf94a81a158f52 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2013-10-19  Vladimir Serbinenko  <phcoder@gmail.com>
+
+       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  <phcoder@gmail.com>
 
        * conf/Makefile.common: Use -freg-struct-return on i386. This
index c0989bcb83f89750a99a32cdc054754759a56390..e77e7900facd33316a386a268f39f0affbd1ee47 100644 (file)
@@ -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)
index 6eca68b72d8086a6f239a0f958d98167fe31c94d..07720ee67463547c2a5b33cf0334277965c9a0fd 100644 (file)
@@ -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);
index 4e6a38898f84cd538305998d87658d23f4b3d81c..18b7b0fa1286df783e326657aae9c553c451eceb 100644 (file)
@@ -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;
index eb974efee95d759533bb889ba553c01195d39471..03e84d5d46ba236efdd6d1a355cbdedda74af66c 100644 (file)
@@ -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);
index 259c0aa4faac39595196262f4bfded77d53df9cd..ad3627351f8f7acd7cc1c28dcfb5951127460e60 100644 (file)
@@ -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);
index 6aa33071c6172b75d2fc8d14a163a58e09c6621b..e67e254246ae29515a072bce254956188b156047 100644 (file)
@@ -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);
 }
 
index b6ec32ae5f1f042c3cd5704569f14f882bd3b0d5..450fb508b814160404e443a9f0ba6abcb165794a 100644 (file)
@@ -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);
 }
 
index aba1a7336bee5a543d85d9f24afd9ecc43bdcbb0..bf970e91cc5aae3027ace33185392c9d5d9d8d1f 100644 (file)
@@ -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});
        }
     }
 
index d61ade16726a5d553097ec3bb55d5dfd048053ba..53aa28500efec0fd260f7cc352f983dc619a65e6 100644 (file)
@@ -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 =
index cfd584ebf53b2782b6375fd9eeb0aecabf4daffa..f3414eff7e07d2ba103c1190451d867c5dc81bf1 100644 (file)
@@ -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);
 }
 
index df099f05ae8b22cc95c245f7fa207a15df3395cc..87a65cc169f5818a11e7cd6aa56544433068d1d9 100644 (file)
@@ -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 =
index fad23d2d4b7ec0dbcccea2f7417538be37d06315..e6bb50d6574fadbe313ad8d3510dc937c19a02ed 100644 (file)
@@ -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
index e7d5af4e8d29a4f905d8a98f4f34bcf79b2f3a35..83b42cf504d69fcb7e64ec6afb4c4ef36c5fc085 100644 (file)
@@ -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)
index f9f7ed9ef934308820840e624e7da6e3fef3ae48..2a0877ce016820c2b5a92e1aaf7a32eef5522ae5 100644 (file)
@@ -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 =
index 358611a655ce08838d7e86bd31645f2abb983977..a727653d709a1360773e99102e316cba8d05be5b 100644 (file)
@@ -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, &regs);
 
-  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, &regs);
 }
@@ -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
index bee30766b2fe1f21a62b9236e6b1fa885cd7d4ce..33834bf74d3042fe95b4050511d8684715c9119d 100644 (file)
@@ -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
index 6bcee586356e3fb74beec51f83b2b738de2d55e0..17010e744694cbaae5138772b3bf8a6c7b716a70 100644 (file)
@@ -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 =
index 61cd80a9c9c97afc0e0b6a4b251e77d170ee1c43..ac1fb8394be9fd917f9461f4786a5062a4546978 100644 (file)
@@ -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 }
     }
   };
 
index f20a27d2a4c3dc1582364c1776bc325ab20857ec..7d4ead356752a5ba2d49edc17a5c47120c08a7ab 100644 (file)
@@ -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 =
index e0146cbed9a9d98f9ed885a1bba1b2eed122b3c0..001f2400821cec5ab55c0d44820cc85b56d75baa 100644 (file)
@@ -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)
index 51defee6eec67c6780912fe76edccab99f023b49..8bf1b3cee01ccd3c94ef1a8acd6a9ed127379387 100644 (file)
@@ -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 = {
index 9ba33f2eca38ee4b4f75253bdecf6a070029b759..9ca0c57a971ae4f39863b8f1036473e620f578da 100644 (file)
@@ -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 
index 2bbae1fa30070cb8c46f88b657c817d72d115732..8a109ecfdf67c26176813d5ad6b36b63f6b3baef 100644 (file)
@@ -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,