* [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
* Re: [patch] Widening terminal coordinates, and reading terminal size.
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
0 siblings, 1 reply; 10+ messages in thread
From: Yoshinori K. Okuji @ 2004-10-06 8:55 UTC (permalink / raw)
To: The development of GRUB 2
On Wednesday 06 October 2004 04:29, Timothy Baldwin wrote:
> 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.
I agree with your idea, but the name `getsizexy' is not very good, since
the return values are not coordinates. getsize or getgeometry might be
better. What do you think?
> * include/grub/term.h
> (grub_getsizexy, grub_term::grub_getsizexy): New prototypes.
This does not follow the convention. First, you should not specify
multiple functions in an entry. Please split it.
Also, grub_term::grub_getsizexy is not good. It should be:
(struct grub_term): Added a new member `grub_getsizexy'.
> (grub_getxy, grub_term::grub_getxy): Returns via pointers to
> unsigned, instead of packed into a 16-bit value, all callers
> and implementations updated.
Likewise.
> (grub_gotoxy, grub_term::grub_gotoxy): Arguements are now unsigned.
Likewise.
> * term/i386/pc/console.c kern/i386/pc/startup.S
> include/grub/i386/pc/console.h (grub_console_getsizexy): New
> function
You should not mention multiple files at a time. Please split it.
And, you don't describe your change of grub_console_getxy.
> * util/console.c (grub_ncurses_getsizexy): New function
Please append a period.
Okuji
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [patch] Widening terminal coordinates, and reading terminal size.
2004-10-06 8:55 ` Yoshinori K. Okuji
@ 2004-10-06 15:18 ` Timothy Baldwin
2004-10-06 15:41 ` Marco Gerards
0 siblings, 1 reply; 10+ messages in thread
From: Timothy Baldwin @ 2004-10-06 15:18 UTC (permalink / raw)
To: The development of GRUB 2
[-- Attachment #1: Type: text/plain, Size: 2288 bytes --]
On Wednesday 06 Oct 2004 09:55, Yoshinori K. Okuji wrote:
> On Wednesday 06 October 2004 04:29, Timothy Baldwin wrote:
> > 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.
>
> I agree with your idea, but the name `getsizexy' is not very good, since
> the return values are not coordinates. getsize or getgeometry might be
> better. What do you think?
grub_getsize is ambiguous (size of what?) and grub_getgeometry suggests a
function to get the geometry of a GUI window, grub_get_term_size is better.
What do you think?
Would it be better for grub_getxy and grub_getsizexy (or whatever it is
called) to handle the case of null pointers, rather than the terminal
drivers?
I also noticed I omitted to change term/i386/pc/vga.c. I will fix this.
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): Added a new member `grub_getsizexy', arguments
to `grub_gotoxy' changed to unsigned, `grub_getxy' returns values
via pointers to unsigned as above.
* 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.
[-- Attachment #2: Type: application/pgp-signature, Size: 189 bytes --]
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [patch] Widening terminal coordinates, and reading terminal size.
2004-10-06 15:18 ` Timothy Baldwin
@ 2004-10-06 15:41 ` Marco Gerards
2004-10-06 21:50 ` Timothy Baldwin
2004-10-07 9:22 ` Yoshinori K. Okuji
0 siblings, 2 replies; 10+ messages in thread
From: Marco Gerards @ 2004-10-06 15:41 UTC (permalink / raw)
To: The development of GRUB 2
Timothy Baldwin <tim.lists@majoroak.f2s.com> writes:
>> I agree with your idea, but the name `getsizexy' is not very good, since
>> the return values are not coordinates. getsize or getgeometry might be
>> better. What do you think?
>
> grub_getsize is ambiguous (size of what?) and grub_getgeometry suggests a
> function to get the geometry of a GUI window, grub_get_term_size is better.
> What do you think?
How about getdimensions? That is the term that is used in the Hurd.
> Would it be better for grub_getxy and grub_getsizexy (or whatever it is
> called) to handle the case of null pointers, rather than the terminal
> drivers?
The case of null pointers? I think when you have a nullpointer this
is a bug, no?
> (grub_getxy): Returns via pointers to unsigned, instead of packed
> into a 16-bit value, all callers updated.
> (struct grub_term): Added a new member `grub_getsizexy', arguments
> to `grub_gotoxy' changed to unsigned, `grub_getxy' returns values
> via pointers to unsigned as above.
As above is very confusing. In that case I would do:
(grub_getxy): Returns via pointers to unsigned, instead of packed
into a 16-bit value, all callers updated.
(grub_getxy): Likewise.
(struct grub_term): Likewise for `grub_getxy'. Added a new member
`grub_getsizexy', arguments to `grub_gotoxy' changed to unsigned,
`grub_getxy'.
So you can better reorder things or duplicate the text IMHO.
--
Marco
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [patch] Widening terminal coordinates, and reading terminal size.
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
1 sibling, 1 reply; 10+ messages in thread
From: Timothy Baldwin @ 2004-10-06 21:50 UTC (permalink / raw)
To: The development of GRUB 2
[-- Attachment #1: Type: text/plain, Size: 810 bytes --]
On Wednesday 06 Oct 2004 16:41, Marco Gerards wrote:
> How about getdimensions? That is the term that is used in the Hurd.
Perfect.
>
> > Would it be better for grub_getxy and grub_getsizexy (or whatever it is
> > called) to handle the case of null pointers, rather than the terminal
> > drivers?
>
> The case of null pointers? I think when you have a nullpointer this
> is a bug, no?
As it stands, when a result is not wanted, a null pointer may be passed and
will not be dereferneced. In light of you comments the feture will be
removed.
[snip]
> As above is very confusing. In that case I would do:
I will change it.
--
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 #2: Type: application/pgp-signature, Size: 189 bytes --]
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [patch] Widening terminal coordinates, and reading terminal size.
2004-10-06 21:50 ` Timothy Baldwin
@ 2004-10-06 22:38 ` Marco Gerards
0 siblings, 0 replies; 10+ messages in thread
From: Marco Gerards @ 2004-10-06 22:38 UTC (permalink / raw)
To: The development of GRUB 2
Timothy Baldwin <tim.lists@majoroak.f2s.com> writes:
>> > Would it be better for grub_getxy and grub_getsizexy (or whatever it is
>> > called) to handle the case of null pointers, rather than the terminal
>> > drivers?
>>
>> The case of null pointers? I think when you have a nullpointer this
>> is a bug, no?
>
> As it stands, when a result is not wanted, a null pointer may be passed and
> will not be dereferneced. In light of you comments the feture will be
> removed.
It might be useful. Do you think it is useful? Don't remove it just
because I am asking for it. ;)
Thanks,
Marco
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [patch] Widening terminal coordinates, and reading terminal size.
2004-10-06 15:41 ` Marco Gerards
2004-10-06 21:50 ` Timothy Baldwin
@ 2004-10-07 9:22 ` Yoshinori K. Okuji
2004-10-09 11:03 ` Timothy Baldwin
1 sibling, 1 reply; 10+ messages in thread
From: Yoshinori K. Okuji @ 2004-10-07 9:22 UTC (permalink / raw)
To: The development of GRUB 2
On Wednesday 06 October 2004 17:41, Marco Gerards wrote:
> > grub_getsize is ambiguous (size of what?) and grub_getgeometry
> > suggests a function to get the geometry of a GUI window,
> > grub_get_term_size is better. What do you think?
>
> How about getdimensions? That is the term that is used in the Hurd.
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.
Okuji
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [patch] Widening terminal coordinates, and reading terminal size.
2004-10-07 9:22 ` Yoshinori K. Okuji
@ 2004-10-09 11:03 ` Timothy Baldwin
2004-10-09 18:21 ` Yoshinori K. Okuji
0 siblings, 1 reply; 10+ messages in thread
From: Timothy Baldwin @ 2004-10-09 11:03 UTC (permalink / raw)
To: The development of GRUB 2
[-- 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 --]
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [patch] Widening terminal coordinates, and reading terminal size.
2004-10-09 11:03 ` Timothy Baldwin
@ 2004-10-09 18:21 ` Yoshinori K. Okuji
2005-01-08 13:07 ` Marco Gerards
0 siblings, 1 reply; 10+ messages in thread
From: Yoshinori K. Okuji @ 2004-10-09 18:21 UTC (permalink / raw)
To: The development of GRUB 2
On Saturday 09 October 2004 13:03, Timothy Baldwin wrote:
> (grub_getxy): Returns via pointers to unsigned, instead of packed
> into a 16-bit value, all callers updated.
Although you say unsigned here, you use int in your patch.
> PS. I haven't signed any copyright forms.
Oh, I forgot it! Thank you for pointing it out. I'll send a template of
the request form later.
Okuji
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [patch] Widening terminal coordinates, and reading terminal size.
2004-10-09 18:21 ` Yoshinori K. Okuji
@ 2005-01-08 13:07 ` Marco Gerards
0 siblings, 0 replies; 10+ messages in thread
From: Marco Gerards @ 2005-01-08 13:07 UTC (permalink / raw)
To: The development of GRUB 2
"Yoshinori K. Okuji" <okuji@enbug.org> writes:
>> PS. I haven't signed any copyright forms.
>
> Oh, I forgot it! Thank you for pointing it out. I'll send a template of
> the request form later.
Are the copyrights assigned now? I would like to integrate this patch
in CVS after I read it one more time.
Thanks,
Marco
^ 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.