Post by Anders Storsveenhttp://cure.gamepoint.net/q2_enhanced_engine_wishlist.html
Got bored today. Implemented one of his suggested fixes because it
sounded easy.
The following patch:
makes HOME clear the current line, going to the 1st char
makes CTRL-HOME and CTRL-END goto the start and end of the current
scrollback buffer.
additionally makes CTRL-U clear the line, a la the shell
has framework for END to goto EOL
fixes minor code formatting things i noticed (but not all of them)
In the current setup, HOME and END cannot be made to goto the beginning
of a line. This is because of how the scrollback buffer is
stored/accessed; being at a certain position within a line means
anything after that position is 'invalid'.
Someone can, of course, modify how the data is stored/accessed, but I
wasn't that ambitious for this patch. If they do, to make it work with
end they should see the code around the line with the comment:
/* how can I get end of line? */
-tom
####
the patch:
####
--- /home/tom/src/quake2/src/client/keys.c 2002-04-02 20:08:23.000000000 -0500
+++ keys.c 2005-03-26 15:09:00.000000000 -0500
@@ -19,12 +19,7 @@
*/
#include "client.h"
-/*
-
-key up events are sent even if in console mode
-
-*/
-
+/* key up events are sent even if in console mode */
#define MAXCMDLINE 256
char key_lines[32][MAXCMDLINE];
@@ -43,10 +38,9 @@
int key_repeats[K_LAST]; // if > 1, it is autorepeating
qboolean keydown[K_LAST];
-typedef struct
-{
- char *name;
- int keynum;
+typedef struct {
+ char *name;
+ int keynum;
} keyname_t;
keyname_t keynames[] =
@@ -158,9 +152,7 @@
/*
==============================================================================
-
LINE TYPING INTO THE CONSOLE
-
==============================================================================
*/
@@ -196,7 +188,6 @@
*/
void Key_Console (int key)
{
-
switch ( key )
{
case K_KP_SLASH:
@@ -272,13 +263,9 @@
return;
}
- if ( key == 'l' )
- {
- if ( keydown[K_CTRL] )
- {
- Cbuf_AddText ("clear\n");
- return;
- }
+ if(key == 'l' && keydown[K_CTRL]) {
+ Cbuf_AddText ("clear\n");
+ return;
}
if ( key == K_ENTER || key == K_KP_ENTER )
@@ -351,8 +338,7 @@
return;
}
- if (key == K_PGUP || key == K_KP_PGUP )
- {
+ if(key == K_PGUP || key == K_KP_PGUP) {
con.display -= 2;
return;
}
@@ -365,28 +351,42 @@
return;
}
- if (key == K_HOME || key == K_KP_HOME )
- {
- con.display = con.current - con.totallines + 10;
+ /* HOME goes to beginning of the line or top of scroll buffer with CTRL */
+ if(key == K_HOME || key == K_KP_HOME) {
+ if(keydown[K_CTRL]) {
+ con.display = con.current - con.totallines + 10;
+ } else {
+ con.x = key_linepos = 1;
+ }
return;
}
- if (key == K_END || key == K_KP_END )
- {
- con.display = con.current;
+ /* similarly, CTRL-U clears the current line */
+ if(key == 'u' && keydown[K_CTRL]) {
+ con.x = key_linepos = 1;
+ return;
+ }
+
+ /* END goes to end of line or bottom of scrollbuffer w/ CTRL */
+ if(key == K_END || key == K_KP_END) {
+ if(keydown[K_CTRL]) {
+ con.current = con.display = con.totallines;
+ } else {
+ /* how can I get end of line? */
+ con.x = con.linewidth;
+ key_linepos = con.linewidth;
+ }
return;
}
if (key < 32 || key > 127)
return; // non printable
- if (key_linepos < MAXCMDLINE-1)
- {
+ if (key_linepos < MAXCMDLINE-1) {
key_lines[edit_line][key_linepos] = key;
key_linepos++;
key_lines[edit_line][key_linepos] = 0;
}
-
}
//============================================================================