]> git.proxmox.com Git - grub2.git/commitdiff
2005-08-04 Marco Gerards <metgerards@student.han.nl>
authormarco_g <marco_g@localhost>
Thu, 4 Aug 2005 18:10:51 +0000 (18:10 +0000)
committermarco_g <marco_g@localhost>
Thu, 4 Aug 2005 18:10:51 +0000 (18:10 +0000)
* kern/term.c (grub_putcode): Use `grub_getwh' instead of
hardcoded value.

From Vincent Pelletier  <subdino2004@yahoo.fr>
* include/grub/term.h (GRUB_TERM_WIDTH, GRUB_TERM_HEIGHT):
Redefined to use grub_getwh.
(grub_term): New member named getwh.
(grub_getwh): New prototype.
* kern/term.c (grub_getwh): New function.
* term/i386/pc/console.c (grub_console_getwh): New function.
(grub_console_term): New member `getwh'.
* term/i386/pc/vga.c (grub_vga_getwh): New function.
(grub_vga_term): New member `getwh'.
* term/sparc64/ofconsole.c (grub_ofconsole_readkey): Use
grub_ssize_t.
(grub_ofconsole_getw): New function.
(grub_ofconsole_init): Use grub_ssize_t and unsigned char.
(grub_ofconsole_term): New field named getwh and new initial
value.

ChangeLog
include/grub/term.h
kern/term.c
term/i386/pc/console.c
term/i386/pc/vga.c
term/ieee1275/ofconsole.c

index c0a5b86810b71238d651668fd4cd9abb9d142c05..25c29bda1e80d06b0261b1b1b928a864787835d2 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,25 @@
+2005-08-04  Marco Gerards  <metgerards@student.han.nl>
+
+       * kern/term.c (grub_putcode): Use `grub_getwh' instead of
+       hardcoded value.
+               
+       From Vincent Pelletier  <subdino2004@yahoo.fr>
+       * include/grub/term.h (GRUB_TERM_WIDTH, GRUB_TERM_HEIGHT):
+       Redefined to use grub_getwh.
+       (grub_term): New member named getwh.
+       (grub_getwh): New prototype.
+       * kern/term.c (grub_getwh): New function.
+       * term/i386/pc/console.c (grub_console_getwh): New function.
+       (grub_console_term): New member `getwh'.
+       * term/i386/pc/vga.c (grub_vga_getwh): New function.
+       (grub_vga_term): New member `getwh'.
+       * term/sparc64/ofconsole.c (grub_ofconsole_readkey): Use
+       grub_ssize_t.
+       (grub_ofconsole_getw): New function.
+       (grub_ofconsole_init): Use grub_ssize_t and unsigned char.
+       (grub_ofconsole_term): New field named getwh and new initial
+       value.
+
 2005-08-03  Hollis Blanchard  <hollis@penguinppc.org>
 
        * include/grub/powerpc/ieee1275/ieee1275.h: Move ...
index 8612272a1ea6160bf812b6ffcf5e8a630ae21e73..17ccc005372fdfac470114051f8631c75ff9c174 100644 (file)
@@ -71,9 +71,9 @@ grub_term_color_state;
 
 /* Menu-related geometrical constants.  */
 
-/* FIXME: These should be dynamically obtained from a terminal.  */
-#define GRUB_TERM_WIDTH                80
-#define GRUB_TERM_HEIGHT       25
+/* FIXME: Ugly way to get them form terminal.  */
+#define GRUB_TERM_WIDTH         ((grub_getwh()&0xFF00)>>8)
+#define GRUB_TERM_HEIGHT        (grub_getwh()&0xFF)
 
 /* The number of lines of "GRUB version..." at the top.  */
 #define GRUB_TERM_INFO_HEIGHT  1
@@ -142,6 +142,9 @@ struct grub_term
   /* Get a character.  */
   int (*getkey) (void);
   
+  /* Get the screen size. The return value is ((Width << 8) | Height).  */
+  grub_uint16_t (*getwh) (void);
+
   /* Get the cursor position. The return value is ((X << 8) | Y).  */
   grub_uint16_t (*getxy) (void);
   
@@ -183,6 +186,7 @@ void EXPORT_FUNC(grub_putchar) (int c);
 void EXPORT_FUNC(grub_putcode) (grub_uint32_t code);
 int EXPORT_FUNC(grub_getkey) (void);
 int EXPORT_FUNC(grub_checkkey) (void);
+grub_uint16_t EXPORT_FUNC(grub_getwh) (void);
 grub_uint16_t EXPORT_FUNC(grub_getxy) (void);
 void EXPORT_FUNC(grub_gotoxy) (grub_uint8_t x, grub_uint8_t y);
 void EXPORT_FUNC(grub_cls) (void);
index 08be7a1ea5fd8d48d8bd40eee23f058fd83224e0..c5ce2c33e9843e18963e2ab7d59ad6e68454930c 100644 (file)
@@ -1,6 +1,6 @@
 /*
  *  GRUB  --  GRand Unified Bootloader
- *  Copyright (C) 2002,2003  Free Software Foundation, Inc.
+ *  Copyright (C) 2002,2003,2005  Free Software Foundation, Inc.
  *
  *  GRUB is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
@@ -90,6 +90,8 @@ grub_term_get_current (void)
 void
 grub_putcode (grub_uint32_t code)
 {
+  int height = grub_getwh () & 255;
+
   if (code == '\t' && grub_cur_term->getxy)
     {
       int n;
@@ -108,14 +110,14 @@ grub_putcode (grub_uint32_t code)
       grub_putcode ('\r');
 
       grub_more_lines++;
-      /* XXX: Don't use a fixed height!  */
-      if (grub_more && grub_more_lines == 24 - 1)
+
+      if (grub_more && grub_more_lines == height - 1)
        {
          char key;
          int pos = grub_getxy ();
 
          /* Show --MORE-- on the lower left side of the screen.  */
-         grub_gotoxy (1, 24 - 1);
+         grub_gotoxy (1, height - 1);
          grub_setcolorstate (GRUB_TERM_COLOR_HIGHLIGHT);
          grub_printf ("--MORE--");
          grub_setcolorstate (GRUB_TERM_COLOR_STANDARD);
@@ -123,7 +125,7 @@ grub_putcode (grub_uint32_t code)
          key = grub_getkey ();
          
          /* Remove the message.  */
-         grub_gotoxy (1, 24 -1);
+         grub_gotoxy (1, height - 1);
          grub_printf ("        ");
          grub_gotoxy (pos >> 8, pos & 0xFF);
          
@@ -218,6 +220,12 @@ grub_getxy (void)
   return (grub_cur_term->getxy) ();
 }
 
+grub_uint16_t
+grub_getwh (void)
+{
+  return (grub_cur_term->getwh) ();
+}
+
 void
 grub_gotoxy (grub_uint8_t x, grub_uint8_t y)
 {
index 9b225945a83513c14f65ad86d17dbe4fb2159d6e..c0f2f71445674dd9aaa58a660bfe867171607b06 100644 (file)
@@ -74,6 +74,12 @@ grub_console_putchar (grub_uint32_t c)
   grub_console_real_putchar (c);
 }
 
+static grub_uint16_t
+grub_console_getwh (void)
+{
+  return (80 << 8) | 25;
+}
+
 static void
 grub_console_setcolorstate (grub_term_color_state state)
 {
@@ -107,6 +113,7 @@ static struct grub_term grub_console_term =
     .putchar = grub_console_putchar,
     .checkkey = grub_console_checkkey,
     .getkey = grub_console_getkey,
+    .getwh = grub_console_getwh,
     .getxy = grub_console_getxy,
     .gotoxy = grub_console_gotoxy,
     .cls = grub_console_cls,
index 7aedab09bb9048f0f1b7610878198c7ae4134edb..058468dc1e274903e733493cb3614d03c85d9da8 100644 (file)
@@ -1,6 +1,6 @@
 /*
  *  GRUB  --  GRand Unified Bootloader
- *  Copyright (C) 2000,2001,2002,2003,2004  Free Software Foundation, Inc.
+ *  Copyright (C) 2000,2001,2002,2003,2004,2005  Free Software Foundation, Inc.
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
@@ -472,6 +472,12 @@ grub_vga_putchar (grub_uint32_t c)
 #endif
 }
 
+static grub_uint16_t
+grub_vga_getwh (void)
+{
+  return (TEXT_WIDTH << 8) | TEXT_HEIGHT;
+}
+
 static grub_uint16_t
 grub_vga_getxy (void)
 {
@@ -566,6 +572,7 @@ static struct grub_term grub_vga_term =
     .putchar = grub_vga_putchar,
     .checkkey = grub_console_checkkey,
     .getkey = grub_console_getkey,
+    .getwh = grub_vga_getwh,
     .getxy = grub_vga_getxy,
     .gotoxy = grub_vga_gotoxy,
     .cls = grub_vga_cls,
index b7515b3b8de96b9a8b7f8e7b39f42ab6016dda3e..b027fb25cf4db3fb60760aafd1c7e53e7c75e532 100644 (file)
@@ -1,7 +1,7 @@
 /*  ofconsole.c -- Open Firmware console for GRUB.  */
 /*
  *  GRUB  --  GRand Unified Bootloader
- *  Copyright (C) 2003, 2004 Free Software Foundation, Inc.
+ *  Copyright (C) 2003, 2004, 2005 Free Software Foundation, Inc.
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
@@ -120,7 +120,7 @@ static int
 grub_ofconsole_readkey (int *key)
 {
   char c;
-  int actual = 0;
+  grub_ssize_t actual = 0;
 
   grub_ieee1275_read (stdin_ihandle, &c, 1, &actual);
 
@@ -207,6 +207,58 @@ grub_ofconsole_getxy (void)
   return ((grub_curr_x - 1) << 8) | grub_curr_y;
 }
 
+static grub_uint16_t
+grub_ofconsole_getwh (void)
+{
+  grub_ieee1275_ihandle_t options;
+  char *val;
+  grub_ssize_t lval;
+  static grub_uint8_t w, h;
+
+  /* Once we have them, don't ask them again.  */
+  if (!w || !h)
+    {
+      if (! grub_ieee1275_finddevice ("/options", &options)
+         && options != -1)
+        {
+          if (! grub_ieee1275_get_property_length (options, "screen-#columns",
+                                                   &lval) && lval != -1)
+            {
+             val = grub_malloc (lval);
+             if (val)
+                {
+                  if (! grub_ieee1275_get_property (options, "screen-#columns",
+                                                    val, lval, 0))
+                    w = (grub_uint8_t) grub_strtoul (val, val + lval, 10);
+
+                  grub_free (val);
+                }
+            }
+          if (! grub_ieee1275_get_property_length (options, "screen-#rows",
+                                                   &lval) && lval != -1)
+            {
+             val = grub_malloc (lval);
+             if (val)
+                {
+                  if (! grub_ieee1275_get_property (options, "screen-#rows",
+                                                    val, lval, 0))
+                    h = (grub_uint8_t) grub_strtoul (val, val + lval, 10);
+
+                  grub_free (val);
+                }
+            }
+       }
+    }
+
+  /* Use a small console by default.  */
+  if (! w)
+    w = 80;
+  if (! h)
+    h = 24;
+
+  return (w << 8) | h;
+}
+
 static void
 grub_ofconsole_gotoxy (grub_uint8_t x, grub_uint8_t y)
 {
@@ -241,8 +293,8 @@ grub_ofconsole_refresh (void)
 static grub_err_t
 grub_ofconsole_init (void)
 {
-  char data[4];
-  grub_size_t actual;
+  unsigned char data[4];
+  grub_ssize_t actual;
   int col;
 
   if (grub_ieee1275_get_property (grub_ieee1275_chosen, "stdout", data,
@@ -287,6 +339,7 @@ static struct grub_term grub_ofconsole_term =
     .checkkey = grub_ofconsole_checkkey,
     .getkey = grub_ofconsole_getkey,
     .getxy = grub_ofconsole_getxy,
+    .getwh = grub_ofconsole_getwh,
     .gotoxy = grub_ofconsole_gotoxy,
     .cls = grub_ofconsole_cls,
     .setcolorstate = grub_ofconsole_setcolorstate,