All of lore.kernel.org
 help / color / mirror / Atom feed
* [patch] Widening terminal coordinates, and reading terminal size.
@ 2004-10-06  2:29 Timothy Baldwin
  2004-10-06  8:55 ` Yoshinori K. Okuji
  0 siblings, 1 reply; 10+ messages in thread
From: Timothy Baldwin @ 2004-10-06  2:29 UTC (permalink / raw)
  To: The development of GRUB 2


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

Here is a patch to widen terminal coordinates from grub_uint8_t to unsigned, 
change grub_getxy to return values via pointers. I have also added 
grub_getsizexy to read the terminal size. The PPC implementation is a dummy 
function, an the PC version assumes a height of 25. Improvements would be 
welcome.


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

 * include/grub/term.h 
 (grub_getsizexy, grub_term::grub_getsizexy): New prototypes.
 (grub_getxy, grub_term::grub_getxy): Returns via pointers to
 unsigned, instead of packed into a 16-bit value, all callers
 and implementations updated.
 (grub_gotoxy, grub_term::grub_gotoxy): Arguements are now unsigned.
 * term/i386/pc/console.c kern/i386/pc/startup.S           
 include/grub/i386/pc/console.h (grub_console_getsizexy): New function
 * term/powerpc/ieee1275/ofconsole.c (grub_ofconsole_getsizexy): New function,
 needs implementing.
 * util/console.c (grub_ncurses_getsizexy): New function

-- 
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: 11078 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	5 Oct 2004 19:11:05 -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 (*getsizexy) (unsigned *x, unsigned *y);
+  
+  /* Get the cursor position. */
+  void (*getxy) (unsigned *x, unsigned *y);
   
   /* Go to the position (X, Y).  */
-  void (*gotoxy) (grub_uint8_t x, grub_uint8_t y);
+  void (*gotoxy) (unsigned x, unsigned 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_getsizexy) (unsigned *x, unsigned *y);
+void EXPORT_FUNC(grub_getxy) (unsigned *x, unsigned *y);
+void EXPORT_FUNC(grub_gotoxy) (unsigned x, unsigned 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	5 Oct 2004 19:11:05 -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_getsizexy (unsigned *x, unsigned *y);
+void grub_console_getxy (unsigned *x, unsigned *y);
+void grub_console_gotoxy (unsigned x, unsigned 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	5 Oct 2004 19:11:05 -0000
@@ -92,9 +92,10 @@
 {
   if (code == '\t' && grub_cur_term->getxy)
     {
-      int n;
+      unsigned n;
       
-      n = 8 - ((grub_getxy () >> 8) & 7);
+      grub_getxy(&n, 0);
+      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 ();
+	  unsigned 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_getsizexy (unsigned *x, unsigned *y)
+{
+  (grub_cur_term->getxy) (x, y);
+}
+
+void
+grub_getxy (unsigned *x, unsigned *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 (unsigned x, unsigned 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	5 Oct 2004 19:11:05 -0000
@@ -1310,7 +1310,46 @@
 
 	
 /*
- * grub_uint16_t grub_console_getxy (void)
+ * grub_console_getsizexy (unsigned *x, unsigned *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_getsizexy)
+	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	%ebx
+	or	%ebx, %ebx
+	jz	1f
+	movzbl	%ah, %ecx
+	movl	%ecx, (%eax)
+
+1:	popl	%eax
+	or	%eax, %eax
+	jz	1f
+	movl	$25, (%eax)		/* FIXME: Don't assume width */
+	
+1:	popl	%ebp
+	ret
+
+
+/*
+ * grub_uint16_t grub_console_getxy (unsigned *x, unsigned *y)
  * BIOS call "INT 10H Function 03h" to get cursor position
  *	Call with	%ah = 0x03
  *			%bh = page
@@ -1324,6 +1363,8 @@
 FUNCTION(grub_console_getxy)
 	pushl	%ebp
 	pushl	%ebx                    /* save EBX */
+	pushl	%edx
+	pushl	%eax
 
 	call	prot_to_real
 	.code16
@@ -1335,16 +1376,25 @@
 	DATA32	call	real_to_prot
 	.code32
 
-	movb	%dl, %ah
-	movb	%dh, %al
-
-	popl	%ebx
+	popl	%eax
+	or	%eax, %eax
+	jz	1f
+	movzbl	%dl, %ecx
+	movl	%ecx, (%eax)
+
+1:	popl	%eax
+	or	%eax, %eax
+	jz	1f
+	movzbl	%dh, %ecx
+	movl	%ecx, (%eax)
+	
+1:	popl	%ebx
 	popl	%ebp
 	ret
 
 
 /*
- * void grub_console_gotoxy(grub_uint8_t x, grub_uint8_t y)
+ * void grub_console_gotoxy (unsigned x, unsigned 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	5 Oct 2004 19:11:06 -0000
@@ -491,10 +491,12 @@
 	{
 	  if (xpos++ > 78)
 	    {
+	      unsigned ytemp;
 	      grub_putchar ('\n');
 	      
 	      xpos = 1;
-	      if (ypos == (unsigned) (grub_getxy () & 0xFF))
+	      grub_getxy(0, &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, 0);
+  if (xpos != 0)
     grub_putchar ('\n');
   
   grub_printf (prompt);
   
   xpos = plen;
-  ystart = ypos = (grub_getxy () & 0xFF);
+  grub_getxy (0, &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 (0, &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	5 Oct 2004 19:11:06 -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 unsigned TERM_WIDTH =	(80 - 1);
+static unsigned 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_getsizexy(&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	5 Oct 2004 19:11:06 -0000
@@ -107,6 +107,7 @@
     .putchar = grub_console_putchar,
     .checkkey = grub_console_checkkey,
     .getkey = grub_console_getkey,
+    .getsizexy = grub_console_getsizexy,
     .getxy = grub_console_getxy,
     .gotoxy = grub_console_gotoxy,
     .cls = grub_console_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	5 Oct 2004 19:11:06 -0000
@@ -201,14 +201,26 @@
   return key;
 }
 
-static grub_uint16_t
-grub_ofconsole_getxy (void)
+static void
+grub_ofconsole_getsizexy (unsigned *x, unsigned *y)
+{
+  if (x)
+    *x = 80;
+  if (y)
+    *y = 25;
+}
+
+static void
+grub_ofconsole_getxy (unsigned *x, unsigned *y)
 {
-  return ((grub_curr_x - 1) << 8) | grub_curr_y;
+  if (x)
+    *x = grub_curr_x - 1;
+  if (y)
+    *y = grub_curr_y;
 }
 
 static void
-grub_ofconsole_gotoxy (grub_uint8_t x, grub_uint8_t y)
+grub_ofconsole_gotoxy (unsigned x, unsigned y)
 {
   char s[11]; /* 5 + 3 + 3.  */
   grub_curr_x = x;
@@ -289,6 +301,7 @@
     .putchar = grub_ofconsole_putchar,
     .checkkey = grub_ofconsole_checkkey,
     .getkey = grub_ofconsole_getkey,
+    .getsizexy = grub_ofconsole_getsizexy,
     .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	5 Oct 2004 19:11:06 -0000
@@ -121,19 +121,32 @@
   return c;
 }
 
-static grub_uint16_t
-grub_ncurses_getxy (void)
+static void
+grub_ncurses_getsizexy (unsigned *x, unsigned *y)
 {
-  int x;
-  int y;
-
-  getyx (stdscr, y, x);
+  unsigned p, q;
+  
+  if (!x)
+    x = &p;
+  if (!y)
+    y = &q;
+  getmaxyx (stdscr, *y, *x);
+}
 
-  return (x << 8) | y;
+static void
+grub_ncurses_getxy (unsigned *x, unsigned *y)
+{
+  unsigned p, q;
+  
+  if (!x)
+    x = &p;
+  if (!y)
+    y = &q;
+  getyx (stdscr, *y, *x);
 }
 
 static void
-grub_ncurses_gotoxy (grub_uint8_t x, grub_uint8_t y)
+grub_ncurses_gotoxy (unsigned x, unsigned y)
 {
   move (y, x);
 }
@@ -189,6 +202,7 @@
     .putchar = grub_ncurses_putchar,
     .checkkey = grub_ncurses_checkkey,
     .getkey = grub_ncurses_getkey,
+    .getsizexy = grub_ncurses_getsizexy,
     .getxy = grub_ncurses_getxy,
     .gotoxy = grub_ncurses_gotoxy,
     .cls = grub_ncurses_cls,

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

^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2005-01-08 13:23 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
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
2004-10-09 18:21           ` Yoshinori K. Okuji
2005-01-08 13:07             ` Marco Gerards

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.