All of lore.kernel.org
 help / color / mirror / Atom feed
From: Timothy Baldwin <tim.lists@majoroak.f2s.com>
To: The development of GRUB 2 <grub-devel@gnu.org>
Subject: Re: [patch] Widening terminal coordinates, and reading terminal size.
Date: Sat, 9 Oct 2004 12:03:31 +0100	[thread overview]
Message-ID: <200410091203.39901.tim.lists@majoroak.f2s.com> (raw)
In-Reply-To: <200410071122.21554.okuji@enbug.org>


[-- Attachment #1.1: Type: text/plain, Size: 1926 bytes --]

On Thursday 07 Oct 2004 10:22, Yoshinori K. Okuji wrote:

> I don't like getdimensions, since dimensions can be read as the number
> of axes. I vote for grub_getgeometry. Since GRUB does not have a window
> system, I don't think it is ambiguous.

I've changed it to grub_getgeometry. A new patch is attached, and here is the 
changelog:

2004-10-03  Timothy Baldwin  <T.E.Baldwin99@members.leeds.ac.uk>

 * include/grub/term.h 
 (grub_getsizexy): New prototype.
 (grub_gotoxy): Arguments changed to unsigned.
 (grub_getxy): Returns via pointers to unsigned, instead of packed
 into a 16-bit value, all callers updated.
 (struct grub_term): Likewise for `grub_getxy'.  Added a new member
 `grub_getsizexy', arguments to `grub_gotoxy' changed to unsigned,
 `grub_getxy'.
 * kern/term.c (grub_getsizexy): New function.
 (grub_getxy): Changed arguments as above.
 * kern/i386/pc/startup.S (grub_console_getsizexy): New function.
 (grub_console_getxy): Changed arguments as above.
 * include/grub/i386/pc/console.h (grub_console_getsizexy): New prototype
 (grub_console_getxy): Changed arguments as above.
 * term/i386/pc/console.c (grub_console_term): Added grub_console_getsizexy.
 * term/powerpc/ieee1275/ofconsole.c (grub_ofconsole_getsizexy): New function.
 (grub_ofconsole_getxy): Changed arguments as above.
 (grub_ofconsole_term): Added grub_ofconsole_getsizexy.  
 * util/console.c (grub_ncurses_getsizexy): New function.
 (grub_ncurses_getxy): Changed arguments as above.
 (grub_ncurses_term): Added grub_ncurses_getsizexy.
 * term/i386/pc/console.c (grub_vga_getsizexy): New function.
 (grub_vga_getxy): Changed arguments as above.
 (grub_vga_term): Added grub_ncurses_getsizexy.
  
PS. I haven't signed any copyright forms. 

-- 
Member AFFS, WYLUG, SWP (UK), ANL, RESPECT, Leeds SA, Leeds Anti-war coalition
No to software patents!    No to DRM/EUCD - hands off our computers!

[-- Attachment #1.2: term.diff --]
[-- Type: text/x-diff, Size: 12343 bytes --]

Index: include/grub/term.h
===================================================================
RCS file: /cvsroot/grub/grub2/include/grub/term.h,v
retrieving revision 1.6
diff -u -r1.6 term.h
--- include/grub/term.h	4 Apr 2004 13:46:00 -0000	1.6
+++ include/grub/term.h	8 Oct 2004 18:07:42 -0000
@@ -75,11 +75,14 @@
   /* Get a character.  */
   int (*getkey) (void);
   
-  /* Get the cursor position. The return value is ((X << 8) | Y).  */
-  grub_uint16_t (*getxy) (void);
+  /* Get the window size. */
+  void (*getgeometry) (int *x, int *y);
+  
+  /* Get the cursor position. */
+  void (*getxy) (int *x, int *y);
   
   /* Go to the position (X, Y).  */
-  void (*gotoxy) (grub_uint8_t x, grub_uint8_t y);
+  void (*gotoxy) (int x, int y);
   
   /* Clear the screen.  */
   void (*cls) (void);
@@ -116,8 +119,9 @@
 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_getxy) (void);
-void EXPORT_FUNC(grub_gotoxy) (grub_uint8_t x, grub_uint8_t y);
+void EXPORT_FUNC(grub_getgeometry) (int *x, int *y);
+void EXPORT_FUNC(grub_getxy) (int *x, int *y);
+void EXPORT_FUNC(grub_gotoxy) (int x, int y);
 void EXPORT_FUNC(grub_cls) (void);
 void EXPORT_FUNC(grub_setcolorstate) (grub_term_color_state state);
 void EXPORT_FUNC(grub_setcolor) (grub_uint8_t normal_color,
Index: include/grub/i386/pc/console.h
===================================================================
RCS file: /cvsroot/grub/grub2/include/grub/i386/pc/console.h,v
retrieving revision 1.4
diff -u -r1.4 console.h
--- include/grub/i386/pc/console.h	4 Apr 2004 13:46:01 -0000	1.4
+++ include/grub/i386/pc/console.h	8 Oct 2004 18:07:42 -0000
@@ -43,8 +43,9 @@
 void grub_console_real_putchar (int c);
 int EXPORT_FUNC(grub_console_checkkey) (void);
 int EXPORT_FUNC(grub_console_getkey) (void);
-grub_uint16_t grub_console_getxy (void);
-void grub_console_gotoxy (grub_uint8_t x, grub_uint8_t y);
+void grub_console_getgeometry (int *x, int *y);
+void grub_console_getxy (int *x, int *y);
+void grub_console_gotoxy (int x, int y);
 void grub_console_cls (void);
 void grub_console_setcursor (int on);
 
Index: kern/term.c
===================================================================
RCS file: /cvsroot/grub/grub2/kern/term.c,v
retrieving revision 1.7
diff -u -r1.7 term.c
--- kern/term.c	4 Apr 2004 13:46:02 -0000	1.7
+++ kern/term.c	8 Oct 2004 18:07:42 -0000
@@ -92,9 +92,10 @@
 {
   if (code == '\t' && grub_cur_term->getxy)
     {
-      int n;
+      int n, dummy;
       
-      n = 8 - ((grub_getxy () >> 8) & 7);
+      grub_getxy(&n, &dummy);
+      n = 8 - (n & 7);
       while (n--)
 	grub_putcode (' ');
 
@@ -112,7 +113,8 @@
       if (grub_more && grub_more_lines == 24 - 1)
 	{
 	  char key;
-	  int pos = grub_getxy ();
+	  int x, y;
+	  grub_getxy (&x, &y);
 
 	  /* Show --MORE-- on the lower left side of the screen.  */
 	  grub_gotoxy (1, 24 - 1);
@@ -125,7 +127,7 @@
 	  /* Remove the message.  */
 	  grub_gotoxy (1, 24 -1);
 	  grub_printf ("        ");
-	  grub_gotoxy (pos >> 8, pos & 0xFF);
+	  grub_gotoxy (x, y);
 	  
 	  /* Scroll one lines or an entire page, depending on the key.  */
 	  if (key == '\r' || key =='\n')
@@ -212,14 +214,20 @@
   return (grub_cur_term->checkkey) ();
 }
 
-grub_uint16_t
-grub_getxy (void)
+void
+grub_getgeometry (int *x, int *y)
+{
+  (grub_cur_term->getgeometry) (x, y);
+}
+
+void
+grub_getxy (int *x, int *y)
 {
-  return (grub_cur_term->getxy) ();
+  (grub_cur_term->getxy) (x, y);
 }
 
 void
-grub_gotoxy (grub_uint8_t x, grub_uint8_t y)
+grub_gotoxy (int x, int y)
 {
   (grub_cur_term->gotoxy) (x, y);
 }
Index: kern/i386/pc/startup.S
===================================================================
RCS file: /cvsroot/grub/grub2/kern/i386/pc/startup.S,v
retrieving revision 1.13
diff -u -r1.13 startup.S
--- kern/i386/pc/startup.S	4 Apr 2004 13:46:02 -0000	1.13
+++ kern/i386/pc/startup.S	8 Oct 2004 18:07:42 -0000
@@ -1310,7 +1310,41 @@
 
 	
 /*
- * grub_uint16_t grub_console_getxy (void)
+ * grub_console_getgeometry (int *x, int *y)
+ * BIOS call "INT 10H Function 0Fh" to get video parameters
+ *	Call with	%ah = 0x0F
+ *      Returns         %al = video mode
+ *                      %ah = number of columns
+ *                      %bh = active page
+ */
+
+
+FUNCTION(grub_console_getgeometry)
+	pushl	%ebp
+	pushl	%edx
+	pushl	%eax
+
+	call	prot_to_real
+	.code16
+
+	movb	$0xF, %ah
+	int	$0x10			/* get video parameters */
+
+	DATA32	call	real_to_prot
+	.code32
+
+	popl	%eax
+	movzbl	%ah, %ecx
+	movl	%ecx, (%eax)
+	popl	%eax
+	movl	$25, (%eax)		/* FIXME: Don't assume width */
+	
+1:	popl	%ebp
+	ret
+
+
+/*
+ * grub_uint16_t grub_console_getxy (int *x, int *y)
  * BIOS call "INT 10H Function 03h" to get cursor position
  *	Call with	%ah = 0x03
  *			%bh = page
@@ -1324,6 +1358,8 @@
 FUNCTION(grub_console_getxy)
 	pushl	%ebp
 	pushl	%ebx                    /* save EBX */
+	pushl	%edx
+	pushl	%eax
 
 	call	prot_to_real
 	.code16
@@ -1335,16 +1371,21 @@
 	DATA32	call	real_to_prot
 	.code32
 
-	movb	%dl, %ah
-	movb	%dh, %al
+	popl	%eax
+	movzbl	%dl, %ecx
+	movl	%ecx, (%eax)
 
+	popl	%eax
+	movzbl	%dh, %ecx
+	movl	%ecx, (%eax)
+	
 	popl	%ebx
 	popl	%ebp
 	ret
 
 
 /*
- * void grub_console_gotoxy(grub_uint8_t x, grub_uint8_t y)
+ * void grub_console_gotoxy (int x, int y)
  * BIOS call "INT 10H Function 02h" to set cursor position
  *	Call with	%ah = 0x02
  *			%bh = page
Index: normal/cmdline.c
===================================================================
RCS file: /cvsroot/grub/grub2/normal/cmdline.c,v
retrieving revision 1.8
diff -u -r1.8 cmdline.c
--- normal/cmdline.c	27 Jun 2004 11:03:24 -0000	1.8
+++ normal/cmdline.c	8 Oct 2004 18:07:42 -0000
@@ -465,7 +465,7 @@
 grub_cmdline_get (const char *prompt, char cmdline[], unsigned max_len,
 		  int echo_char, int readline)
 {
-  unsigned xpos, ypos, ystart;
+  unsigned xpos, ypos, ystart, dummy;
   grub_size_t lpos, llen;
   grub_size_t plen;
   char buf[max_len];
@@ -491,10 +491,12 @@
 	{
 	  if (xpos++ > 78)
 	    {
+	      int xtemp, ytemp;
 	      grub_putchar ('\n');
 	      
 	      xpos = 1;
-	      if (ypos == (unsigned) (grub_getxy () & 0xFF))
+	      grub_getxy(&xtemp, &ytemp);
+	      if (ypos == ytemp)
 		ystart--;
 	      else
 		ypos++;
@@ -546,13 +548,15 @@
   lpos = llen = 0;
   buf[0] = '\0';
 
-  if ((grub_getxy () >> 8) != 0)
+  grub_getxy (&xpos, &dummy);
+  if (xpos != 0)
     grub_putchar ('\n');
   
   grub_printf (prompt);
   
   xpos = plen;
-  ystart = ypos = (grub_getxy () & 0xFF);
+  grub_getxy (&dummy, &ypos);
+  ystart = ypos;
   
   cl_insert (cmdline);
 
@@ -610,7 +614,8 @@
 		    /* Restore the prompt.  */
 		    grub_printf ("\n%s%s", prompt, buf);
 		    xpos = plen;
-		    ystart = ypos = (grub_getxy () & 0xFF);
+		    grub_getxy (&dummy, &ypos);
+		    ystart = ypos;
 		  }
 
 		if (insert)
Index: normal/menu.c
===================================================================
RCS file: /cvsroot/grub/grub2/normal/menu.c,v
retrieving revision 1.8
diff -u -r1.8 menu.c
--- normal/menu.c	18 Sep 2004 13:42:05 -0000	1.8
+++ normal/menu.c	8 Oct 2004 18:07:42 -0000
@@ -37,9 +37,8 @@
 #define DISP_LL		0x2517
 #define DISP_LR		0x251B
 
-/* FIXME: These should be dynamically obtained from a terminal.  */
-#define TERM_WIDTH	(80 - 1)
-#define TERM_HEIGHT	25
+static int TERM_WIDTH =	(80 - 1);
+static int TERM_HEIGHT =	25;
 
 /* The number of lines of "GRUB version..." at the top.  */
 #define TERM_INFO_HEIGHT	1
@@ -228,6 +227,7 @@
 init_page (int nested, int edit)
 {
   grub_normal_init_page ();
+  grub_getgeometry(&TERM_WIDTH, &TERM_HEIGHT);
   draw_border ();
   print_message (nested, edit);
 }
Index: term/i386/pc/console.c
===================================================================
RCS file: /cvsroot/grub/grub2/term/i386/pc/console.c,v
retrieving revision 1.4
diff -u -r1.4 console.c
--- term/i386/pc/console.c	4 Apr 2004 13:46:03 -0000	1.4
+++ term/i386/pc/console.c	8 Oct 2004 18:07:42 -0000
@@ -107,6 +107,7 @@
     .putchar = grub_console_putchar,
     .checkkey = grub_console_checkkey,
     .getkey = grub_console_getkey,
+    .getgeometry = grub_console_getgeometry,
     .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.5
diff -u -r1.5 vga.c
--- term/i386/pc/vga.c	4 Apr 2004 13:46:03 -0000	1.5
+++ term/i386/pc/vga.c	8 Oct 2004 18:07:42 -0000
@@ -396,25 +396,34 @@
 #if DEBUG_VGA
   if (show)
     {
-      grub_uint16_t pos = grub_getxy ();
+      int xpos, ypos;
+      grub_getxy (&xpos, &ypos);
 
       show = 0;
       grub_gotoxy (0, 0);
-      grub_printf ("[%u:%u]", (unsigned) (pos >> 8), (unsigned) (pos & 0xff));
-      grub_gotoxy (pos >> 8, pos & 0xff);
+      grub_printf ("[%u:%u]", (unsigned) xpos, (unsigned) ypos);
+      grub_gotoxy (xpos, ypos);
       show = 1;
     }
 #endif
 }
 
-static grub_uint16_t
-grub_vga_getxy (void)
+static void
+grub_vga_getgeometry (int *x, int *y)
+{
+  *x = TEXT_WIDTH;
+  *y = TEXT_HEIGHT;
+}
+
+static void
+grub_vga_getxy (int *x, int *y)
 {
-  return ((xpos << 8) | ypos);
+  *x = xpos;
+  *y = ypos;
 }
 
 static void
-grub_vga_gotoxy (grub_uint8_t x, grub_uint8_t y)
+grub_vga_gotoxy (int x, int y)
 {
   if (x >= TEXT_WIDTH || y >= TEXT_HEIGHT)
     {
@@ -500,6 +509,7 @@
     .putchar = grub_vga_putchar,
     .checkkey = grub_console_checkkey,
     .getkey = grub_console_getkey,
+    .getgeometry = grub_vga_getgeometry,
     .getxy = grub_vga_getxy,
     .gotoxy = grub_vga_gotoxy,
     .cls = grub_vga_cls,
Index: term/powerpc/ieee1275/ofconsole.c
===================================================================
RCS file: /cvsroot/grub/grub2/term/powerpc/ieee1275/ofconsole.c,v
retrieving revision 1.3
diff -u -r1.3 ofconsole.c
--- term/powerpc/ieee1275/ofconsole.c	14 Sep 2004 21:21:12 -0000	1.3
+++ term/powerpc/ieee1275/ofconsole.c	8 Oct 2004 18:07:42 -0000
@@ -201,14 +201,22 @@
   return key;
 }
 
-static grub_uint16_t
-grub_ofconsole_getxy (void)
+static void
+grub_ofconsole_getgeometry (int *x, int *y)
+{
+  *x = 80;
+  *y = 25;
+}
+
+static void
+grub_ofconsole_getxy (int *x, int *y)
 {
-  return ((grub_curr_x - 1) << 8) | grub_curr_y;
+  *x = grub_curr_x - 1;
+  *y = grub_curr_y;
 }
 
 static void
-grub_ofconsole_gotoxy (grub_uint8_t x, grub_uint8_t y)
+grub_ofconsole_gotoxy (int x, int y)
 {
   char s[11]; /* 5 + 3 + 3.  */
   grub_curr_x = x;
@@ -289,6 +297,7 @@
     .putchar = grub_ofconsole_putchar,
     .checkkey = grub_ofconsole_checkkey,
     .getkey = grub_ofconsole_getkey,
+    .getgeometry = grub_ofconsole_getgeometry,
     .getxy = grub_ofconsole_getxy,
     .gotoxy = grub_ofconsole_gotoxy,
     .cls = grub_ofconsole_cls,
Index: util/console.c
===================================================================
RCS file: /cvsroot/grub/grub2/util/console.c,v
retrieving revision 1.5
diff -u -r1.5 console.c
--- util/console.c	4 Apr 2004 13:46:03 -0000	1.5
+++ util/console.c	8 Oct 2004 18:07:42 -0000
@@ -121,19 +121,20 @@
   return c;
 }
 
-static grub_uint16_t
-grub_ncurses_getxy (void)
+static void
+grub_ncurses_getgeometry (int *x, int *y)
 {
-  int x;
-  int y;
-
-  getyx (stdscr, y, x);
+  getmaxyx (stdscr, *y, *x);
+}
 
-  return (x << 8) | y;
+static void
+grub_ncurses_getxy (int *x, int *y)
+{
+  getyx (stdscr, *y, *x);
 }
 
 static void
-grub_ncurses_gotoxy (grub_uint8_t x, grub_uint8_t y)
+grub_ncurses_gotoxy (int x, int y)
 {
   move (y, x);
 }
@@ -189,6 +190,7 @@
     .putchar = grub_ncurses_putchar,
     .checkkey = grub_ncurses_checkkey,
     .getkey = grub_ncurses_getkey,
+    .getgeometry = grub_ncurses_getgeometry,
     .getxy = grub_ncurses_getxy,
     .gotoxy = grub_ncurses_gotoxy,
     .cls = grub_ncurses_cls,

[-- Attachment #2: Type: application/pgp-signature, Size: 189 bytes --]

  reply	other threads:[~2004-10-09 11:11 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2004-10-06  2:29 [patch] Widening terminal coordinates, and reading terminal size Timothy Baldwin
2004-10-06  8:55 ` Yoshinori K. Okuji
2004-10-06 15:18   ` Timothy Baldwin
2004-10-06 15:41     ` Marco Gerards
2004-10-06 21:50       ` Timothy Baldwin
2004-10-06 22:38         ` Marco Gerards
2004-10-07  9:22       ` Yoshinori K. Okuji
2004-10-09 11:03         ` Timothy Baldwin [this message]
2004-10-09 18:21           ` Yoshinori K. Okuji
2005-01-08 13:07             ` Marco Gerards

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=200410091203.39901.tim.lists@majoroak.f2s.com \
    --to=tim.lists@majoroak.f2s.com \
    --cc=grub-devel@gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.