grub-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCHv2] FIXME: These should be dynamically obtained from a terminal.


From: Vincent Pelletier
Subject: [PATCHv2] FIXME: These should be dynamically obtained from a terminal.
Date: Wed, 13 Jul 2005 10:40:07 +0200
User-agent: Debian Thunderbird 1.0.2 (X11/20050602)

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Vincent Pelletier wrote:
> Warning : terms other than console.c & vga.c will be broken by this
> patch, as long as they don't have the function.

It's fixed in this patch for sparc64 port (see sparc_getwh.diff, which
is a diff between term/powerpc and term/sparc64). I think the same code
can be used for ppc.

It also contains the grub_getwh function I forgot in the previous patch.

2005-07-13  Vincent Pelletier  <address@hidden>

        * include/grub/term.h: (GRUB_TERM_WIDTH, GRUB_TERM_HEIGHT):
        Redefined to use grub_getwh.
        (struct grub_term): New field named getwh.
        (grub_getwh): New exported prototype.
        * kern/term.c : (grub_getwh): New function.
        * term/i386/pc/console.c: (grub_console_getwh): New function.
        (grub_console_term): New field and new initial value.
        * term/i386/pc/vga.c: (grub_vga_getwh): New function.
        (grub_vga_term): New field and new initial value.

Vincent Pelletier
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.1 (GNU/Linux)

iD8DBQFC1NNnFEQoKRQyjtURAtibAJoDv9ya6nHL1JHkyIxLfWOeC8paaQCfcO9K
fRM2BWoPzNOCr2NMZ+P3z9I=
=g1su
-----END PGP SIGNATURE-----
diff -rupN powerpc/ieee1275/ofconsole.c sparc64/ieee1275/ofconsole.c
--- powerpc/ieee1275/ofconsole.c        2005-06-21 04:33:52.000000000 +0200
+++ sparc64/ieee1275/ofconsole.c        2005-07-13 10:18:46.000000000 +0200
@@ -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,49 @@ 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 config;
+  char *val;
+  grub_ssize_t lval;
+  static grub_uint8_t w, h;
+
+  if (w && h) /* Once we have them, don't ask them again.  */
+    {
+      if (! grub_ieee1275_open ("/config", &config) &&
+          config != -1)
+        {
+          if (! grub_ieee1275_get_property_length (config, "screen-#columns",
+                                                   &lval) && lval != -1)
+            {
+              val = grub_malloc (lval);
+              if (! grub_ieee1275_get_property (config, "screen-#columns",
+                                            val, lval, 0))
+                w = (grub_uint8_t) grub_strtoul (val, val + lval, 10);
+              grub_free (val);
+            }
+          if (! grub_ieee1275_get_property_length (config, "screen-#rows",
+                                                   &lval) && lval != -1)
+            {
+              val = grub_malloc (lval);
+              if (! grub_ieee1275_get_property (config, "screen-#rows",
+                                                val, lval, 0))
+                h = (grub_uint8_t) grub_strtoul (val, val + lval, 10);
+              grub_free (val);
+            }
+        }
+    }
+
+  /* XXX: Default values from OpenBoot on my U10.  */
+  if (! w)
+    w = 80;
+  if (! h)
+    h = 34;
+
+  return (w << 8) | h;
+}
+
 static void
 grub_ofconsole_gotoxy (grub_uint8_t x, grub_uint8_t y)
 {
@@ -222,6 +265,8 @@ static void
 grub_ofconsole_cls (void)
 {
   /* Clear the screen.  */
+  if (grub_env_get ("nocls"))
+    return;
   grub_ofconsole_writeesc ("\e[2J");
   grub_gotoxy (0, 0);
 }
@@ -241,8 +286,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 +332,7 @@ static struct grub_term grub_ofconsole_t
     .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,
Index: include/grub/term.h
===================================================================
RCS file: /cvsroot/grub/grub2/include/grub/term.h,v
retrieving revision 1.7
diff -u -p -r1.7 term.h
--- include/grub/term.h 19 Feb 2005 20:56:07 -0000      1.7
+++ include/grub/term.h 12 Jul 2005 19:55:33 -0000
@@ -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: kern/term.c
===================================================================
RCS file: /cvsroot/grub/grub2/kern/term.c,v
retrieving revision 1.7
diff -u -p -r1.7 term.c
--- kern/term.c 4 Apr 2004 13:46:02 -0000       1.7
+++ kern/term.c 13 Jul 2005 08:27:22 -0000
@@ -218,6 +218,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: term/i386/pc/console.c
===================================================================
RCS file: /cvsroot/grub/grub2/term/i386/pc/console.c,v
retrieving revision 1.5
diff -u -p -r1.5 console.c
--- term/i386/pc/console.c      15 Feb 2005 00:07:01 -0000      1.5
+++ term/i386/pc/console.c      13 Jul 2005 08:27:22 -0000
@@ -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; /* FIXME: Always true ?  */
+}
+
 static void
 grub_console_setcolorstate (grub_term_color_state state)
 {
@@ -107,6 +113,7 @@ static struct grub_term grub_console_ter
     .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: term/i386/pc/vga.c
===================================================================
RCS file: /cvsroot/grub/grub2/term/i386/pc/vga.c,v
retrieving revision 1.7
diff -u -p -r1.7 vga.c
--- term/i386/pc/vga.c  2 Mar 2005 20:12:46 -0000       1.7
+++ term/i386/pc/vga.c  13 Jul 2005 08:27:22 -0000
@@ -473,6 +473,12 @@ grub_vga_putchar (grub_uint32_t c)
 }
 
 static grub_uint16_t
+grub_vga_getwh (void)
+{
+  return (TEXT_WIDTH << 8) | TEXT_HEIGHT;
+}
+
+static grub_uint16_t
 grub_vga_getxy (void)
 {
   return ((xpos << 8) | ypos);
@@ -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,

reply via email to

[Prev in Thread] Current Thread [Next in Thread]