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 --]
next 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.