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: [patch] Widening terminal coordinates, and reading terminal size.
Date: Wed, 6 Oct 2004 03:29:29 +0100	[thread overview]
Message-ID: <200410060329.44046.tim.lists@majoroak.f2s.com> (raw)


[-- 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 --]

             reply	other threads:[~2004-10-06  2:37 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2004-10-06  2:29 Timothy Baldwin [this message]
2004-10-06  8:55 ` [patch] Widening terminal coordinates, and reading terminal size 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

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=200410060329.44046.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.