From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with archive (Exim 4.33) id 1CF1gD-0006eO-GI for mharc-grub-devel@gnu.org; Tue, 05 Oct 2004 22:37:25 -0400 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.33) id 1CF1gB-0006d6-UU for grub-devel@gnu.org; Tue, 05 Oct 2004 22:37:24 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.33) id 1CF1gB-0006cQ-7J for grub-devel@gnu.org; Tue, 05 Oct 2004 22:37:23 -0400 Received: from [199.232.76.173] (helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.33) id 1CF1gB-0006cH-3w for grub-devel@gnu.org; Tue, 05 Oct 2004 22:37:23 -0400 Received: from [194.106.33.237] (helo=outmail.freedom2surf.net) by monty-python.gnu.org with esmtp (TLSv1:DES-CBC3-SHA:168) (Exim 4.34) id 1CF1Yx-0007JP-9H for grub-devel@gnu.org; Tue, 05 Oct 2004 22:29:55 -0400 Received: from bfg.majoroak.f2s.com (i-195-137-1-136.freedom2surf.net [195.137.1.136]) by outmail.freedom2surf.net (8.12.10/8.12.10) with ESMTP id i962TjnG029638 (version=TLSv1/SSLv3 cipher=RC4-MD5 bits=128 verify=NO) for ; Wed, 6 Oct 2004 03:29:52 +0100 From: Timothy Baldwin To: The development of GRUB 2 User-Agent: KMail/1.7 MIME-Version: 1.0 Date: Wed, 6 Oct 2004 03:29:29 +0100 Content-Type: multipart/signed; boundary="nextPart1476375.i40UuYLd7i"; protocol="application/pgp-signature"; micalg=pgp-sha1 Content-Transfer-Encoding: 7bit Message-Id: <200410060329.44046.tim.lists@majoroak.f2s.com> Subject: [patch] Widening terminal coordinates, and reading terminal size. X-BeenThere: grub-devel@gnu.org X-Mailman-Version: 2.1.5 Precedence: list Reply-To: The development of GRUB 2 List-Id: The development of GRUB 2 List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 06 Oct 2004 02:37:24 -0000 --nextPart1476375.i40UuYLd7i Content-Type: multipart/mixed; boundary="Boundary-01=_Ji1YBkGj7ufEXCa" Content-Transfer-Encoding: 7bit Content-Disposition: inline --Boundary-01=_Ji1YBkGj7ufEXCa Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable Content-Disposition: inline Here is a patch to widen terminal coordinates from grub_uint8_t to unsigned= ,=20 change grub_getxy to return values via pointers. I have also added=20 grub_getsizexy to read the terminal size. The PPC implementation is a dummy= =20 function, an the PC version assumes a height of 25. Improvements would be=20 welcome. 2004-10-03 Timothy Baldwin * include/grub/term.h=20 (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 =20 include/grub/i386/pc/console.h (grub_console_getsizexy): New function * term/powerpc/ieee1275/ofconsole.c (grub_ofconsole_getsizexy): New functi= on, needs implementing. * util/console.c (grub_ncurses_getsizexy): New function =2D-=20 Member AFFS, WYLUG, SWP (UK), ANL, RESPECT, Leeds SA, Leeds Anti-war coalit= ion No to software patents! No to DRM/EUCD - hands off our computers! --Boundary-01=_Ji1YBkGj7ufEXCa Content-Type: text/x-diff; charset="us-ascii"; name="term.diff" Content-Transfer-Encoding: quoted-printable Content-Disposition: attachment; filename="term.diff" Index: include/grub/term.h =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D RCS file: /cvsroot/grub/grub2/include/grub/term.h,v retrieving revision 1.6 diff -u -r1.6 term.h =2D-- 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); =20 =2D /* Get the cursor position. The return value is ((X << 8) | Y). */ =2D grub_uint16_t (*getxy) (void); + /* Get the window size. */ + void (*getsizexy) (unsigned *x, unsigned *y); + =20 + /* Get the cursor position. */ + void (*getxy) (unsigned *x, unsigned *y); =20 /* Go to the position (X, Y). */ =2D void (*gotoxy) (grub_uint8_t x, grub_uint8_t y); + void (*gotoxy) (unsigned x, unsigned y); =20 /* 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); =2Dgrub_uint16_t EXPORT_FUNC(grub_getxy) (void); =2Dvoid 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 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D RCS file: /cvsroot/grub/grub2/include/grub/i386/pc/console.h,v retrieving revision 1.4 diff -u -r1.4 console.h =2D-- 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); =2Dgrub_uint16_t grub_console_getxy (void); =2Dvoid 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); =20 Index: kern/term.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D RCS file: /cvsroot/grub/grub2/kern/term.c,v retrieving revision 1.7 diff -u -r1.7 term.c =2D-- 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 =3D=3D '\t' && grub_cur_term->getxy) { =2D int n; + unsigned n; =20 =2D n =3D 8 - ((grub_getxy () >> 8) & 7); + grub_getxy(&n, 0); + n =3D 8 - (n & 7); while (n--) grub_putcode (' '); =20 @@ -112,7 +113,8 @@ if (grub_more && grub_more_lines =3D=3D 24 - 1) { char key; =2D int pos =3D grub_getxy (); + unsigned x, y; + grub_getxy (&x, &y); =20 /* 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 (" "); =2D grub_gotoxy (pos >> 8, pos & 0xFF); + grub_gotoxy (x, y); =20 /* Scroll one lines or an entire page, depending on the key. */ if (key =3D=3D '\r' || key =3D=3D'\n') @@ -212,14 +214,20 @@ return (grub_cur_term->checkkey) (); } =20 =2Dgrub_uint16_t =2Dgrub_getxy (void) +void +grub_getsizexy (unsigned *x, unsigned *y) +{ + (grub_cur_term->getxy) (x, y); +} + +void +grub_getxy (unsigned *x, unsigned *y) { =2D return (grub_cur_term->getxy) (); + (grub_cur_term->getxy) (x, y); } =20 void =2Dgrub_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 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D RCS file: /cvsroot/grub/grub2/kern/i386/pc/startup.S,v retrieving revision 1.13 diff -u -r1.13 startup.S =2D-- 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 @@ =20 =09 /* =2D * 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 =3D 0x0F + * Returns %al =3D video mode + * %ah =3D number of columns + * %bh =3D 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 */ +=09 +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 =3D 0x03 * %bh =3D page @@ -1324,6 +1363,8 @@ FUNCTION(grub_console_getxy) pushl %ebp pushl %ebx /* save EBX */ + pushl %edx + pushl %eax =20 call prot_to_real .code16 @@ -1335,16 +1376,25 @@ DATA32 call real_to_prot .code32 =20 =2D movb %dl, %ah =2D movb %dh, %al =2D =2D 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) +=09 +1: popl %ebx popl %ebp ret =20 =20 /* =2D * 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 =3D 0x02 * %bh =3D page Index: normal/cmdline.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D RCS file: /cvsroot/grub/grub2/normal/cmdline.c,v retrieving revision 1.8 diff -u -r1.8 cmdline.c =2D-- 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'); =20 xpos =3D 1; =2D if (ypos =3D=3D (unsigned) (grub_getxy () & 0xFF)) + grub_getxy(0, &ytemp); + if (ypos =3D=3D ytemp) ystart--; else ypos++; @@ -546,13 +548,15 @@ lpos =3D llen =3D 0; buf[0] =3D '\0'; =20 =2D if ((grub_getxy () >> 8) !=3D 0) + grub_getxy (&xpos, 0); + if (xpos !=3D 0) grub_putchar ('\n'); =20 grub_printf (prompt); =20 xpos =3D plen; =2D ystart =3D ypos =3D (grub_getxy () & 0xFF); + grub_getxy (0, &ypos); + ystart =3D ypos; =20 cl_insert (cmdline); =20 @@ -610,7 +614,8 @@ /* Restore the prompt. */ grub_printf ("\n%s%s", prompt, buf); xpos =3D plen; =2D ystart =3D ypos =3D (grub_getxy () & 0xFF); + grub_getxy (0, &ypos); + ystart =3D ypos; } =20 if (insert) Index: normal/menu.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D RCS file: /cvsroot/grub/grub2/normal/menu.c,v retrieving revision 1.8 diff -u -r1.8 menu.c =2D-- 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 =20 =2D/* FIXME: These should be dynamically obtained from a terminal. */ =2D#define TERM_WIDTH (80 - 1) =2D#define TERM_HEIGHT 25 +static unsigned TERM_WIDTH =3D (80 - 1); +static unsigned TERM_HEIGHT =3D 25; =20 /* 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 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D RCS file: /cvsroot/grub/grub2/term/i386/pc/console.c,v retrieving revision 1.4 diff -u -r1.4 console.c =2D-- 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 =3D grub_console_putchar, .checkkey =3D grub_console_checkkey, .getkey =3D grub_console_getkey, + .getsizexy =3D grub_console_getsizexy, .getxy =3D grub_console_getxy, .gotoxy =3D grub_console_gotoxy, .cls =3D grub_console_cls, Index: term/powerpc/ieee1275/ofconsole.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D RCS file: /cvsroot/grub/grub2/term/powerpc/ieee1275/ofconsole.c,v retrieving revision 1.3 diff -u -r1.3 ofconsole.c =2D-- 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; } =20 =2Dstatic grub_uint16_t =2Dgrub_ofconsole_getxy (void) +static void +grub_ofconsole_getsizexy (unsigned *x, unsigned *y) +{ + if (x) + *x =3D 80; + if (y) + *y =3D 25; +} + +static void +grub_ofconsole_getxy (unsigned *x, unsigned *y) { =2D return ((grub_curr_x - 1) << 8) | grub_curr_y; + if (x) + *x =3D grub_curr_x - 1; + if (y) + *y =3D grub_curr_y; } =20 static void =2Dgrub_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 =3D x; @@ -289,6 +301,7 @@ .putchar =3D grub_ofconsole_putchar, .checkkey =3D grub_ofconsole_checkkey, .getkey =3D grub_ofconsole_getkey, + .getsizexy =3D grub_ofconsole_getsizexy, .getxy =3D grub_ofconsole_getxy, .gotoxy =3D grub_ofconsole_gotoxy, .cls =3D grub_ofconsole_cls, Index: util/console.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D RCS file: /cvsroot/grub/grub2/util/console.c,v retrieving revision 1.5 diff -u -r1.5 console.c =2D-- 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; } =20 =2Dstatic grub_uint16_t =2Dgrub_ncurses_getxy (void) +static void +grub_ncurses_getsizexy (unsigned *x, unsigned *y) { =2D int x; =2D int y; =2D =2D getyx (stdscr, y, x); + unsigned p, q; + =20 + if (!x) + x =3D &p; + if (!y) + y =3D &q; + getmaxyx (stdscr, *y, *x); +} =20 =2D return (x << 8) | y; +static void +grub_ncurses_getxy (unsigned *x, unsigned *y) +{ + unsigned p, q; + =20 + if (!x) + x =3D &p; + if (!y) + y =3D &q; + getyx (stdscr, *y, *x); } =20 static void =2Dgrub_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 =3D grub_ncurses_putchar, .checkkey =3D grub_ncurses_checkkey, .getkey =3D grub_ncurses_getkey, + .getsizexy =3D grub_ncurses_getsizexy, .getxy =3D grub_ncurses_getxy, .gotoxy =3D grub_ncurses_gotoxy, .cls =3D grub_ncurses_cls, --Boundary-01=_Ji1YBkGj7ufEXCa-- --nextPart1476375.i40UuYLd7i Content-Type: application/pgp-signature -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.2.5 (GNU/Linux) iD8DBQBBY1iYjXSPyZ9/z+QRAkyfAKCnHjFTvgkQPNEIyjYRMTFTOsy8AwCgyu66 bIXHUIiFwRg+o4yyDjiqCOg= =gdLq -----END PGP SIGNATURE----- --nextPart1476375.i40UuYLd7i--