[quake2] quake2 improvements and problem

Thomas J Fogal tfogal at pascal.unh.edu
Sat Mar 26 15:20:12 EST 2005


 <op.sn8a44gohksc6a at mail.generation.no>"Anders Storsveen" writes:
> here are some other ideas:
> 
> http://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;
 	}
-
 }
 
 //============================================================================



More information about the quake2 mailing list