]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - console.c
rewrote memory system entirely (hunk, cache, and zone are gone, memory pools replaced...
[xonotic/darkplaces.git] / console.c
index 297bcb23f43249645a595bb331eb8bd35291e554..d8654f31b4e62e8b3cb5e102a5a890557330e817 100644 (file)
--- a/console.c
+++ b/console.c
@@ -8,7 +8,7 @@ of the License, or (at your option) any later version.
 
 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 
 See the GNU General Public License for more details.
 
@@ -45,28 +45,31 @@ int                 con_totallines;         // total lines in console scrollback
 int                    con_backscroll;         // lines up from bottom to display
 int                    con_current;            // where next message will be printed
 int                    con_x;                          // offset in current line for next print
-char           *con_text=0;
+char           *con_text = 0;
 
-cvar_t         con_notifytime = {"con_notifytime","3"};                //seconds
-cvar_t         logfile = {"logfile","0"};
+cvar_t         con_notifytime = {CVAR_SAVE, "con_notifytime","3"};     //seconds
+cvar_t         logfile = {0, "logfile","0"};
 
 #define        NUM_CON_TIMES 4
 float          con_times[NUM_CON_TIMES];       // realtime time the line was generated
-                                                               // for transparent notify lines
+                                               // for transparent notify lines
 
 int                    con_vislines;
 
 qboolean       con_debuglog;
 
-#define                MAXCMDLINE      256
+#define        MAXCMDLINE      256
 extern char    key_lines[32][MAXCMDLINE];
 extern int             edit_line;
 extern int             key_linepos;
-               
+extern int             key_insert;
+
 
 qboolean       con_initialized;
 
-int                    con_notifylines;                // scan lines to clear for notify lines
+mempool_t      *console_mempool;
+
+int            con_notifylines;                // scan lines to clear for notify lines
 
 extern void M_Menu_Main_f (void);
 
@@ -80,20 +83,18 @@ void Con_ToggleConsole_f (void)
        if (key_dest == key_console)
        {
                if (cls.state == ca_connected)
-               {
+//             {
                        key_dest = key_game;
-                       key_lines[edit_line][1] = 0;    // clear any typing
-                       key_linepos = 1;
-               }
+//                     key_lines[edit_line][1] = 0;    // clear any typing
+//                     key_linepos = 1;
+//             }
                else
-               {
                        M_Menu_Main_f ();
-               }
        }
        else
                key_dest = key_console;
        
-       SCR_EndLoadingPlaque ();
+//     SCR_EndLoadingPlaque ();
        memset (con_times, 0, sizeof(con_times));
 }
 
@@ -161,7 +162,7 @@ void Con_CheckResize (void)
        int             i, j, width, oldwidth, oldtotallines, numlines, numchars;
        char    tbuf[CON_TEXTSIZE];
 
-       width = (vid.width >> 3) - 2;
+       width = (vid.conwidth >> 3) - 2;
 
        if (width == con_linewidth)
                return;
@@ -231,10 +232,11 @@ void Con_Init (void)
                        sprintf (temp, "%s%s", com_gamedir, t2);
                        unlink (temp);
                }
-               logfile.value = 1;
+               logfile.integer = 1;
        }
 
-       con_text = Hunk_AllocName (CON_TEXTSIZE, "context");
+       console_mempool = Mem_AllocPool("console");
+       con_text = Mem_Alloc(console_mempool, CON_TEXTSIZE);
        memset (con_text, ' ', CON_TEXTSIZE);
        con_linewidth = -1;
        Con_CheckResize ();
@@ -387,14 +389,14 @@ void Con_Printf (char *fmt, ...)
 {
        va_list         argptr;
        char            msg[MAXPRINTMSG];
-       static qboolean inupdate;
+//     static qboolean inupdate;
        
        va_start (argptr,fmt);
        vsprintf (msg,fmt,argptr);
        va_end (argptr);
        
 // also echo to debugging console
-       Sys_Printf ("%s", msg); // also echo to debugging console
+       Sys_Printf ("%s", msg);
 
 // log all messages to file
        if (con_debuglog)
@@ -410,6 +412,8 @@ void Con_Printf (char *fmt, ...)
        Con_Print (msg);
        
 // update the screen if the console is displayed
+       // LordHavoc: I don't think there's a real need for this
+       /*
        // LordHavoc: don't print text while loading scripts
        if (cls.state != ca_disconnected)
        if (cls.signon != SIGNONS && !scr_disabled_for_loading )
@@ -423,6 +427,7 @@ void Con_Printf (char *fmt, ...)
                        inupdate = false;
                }
        }
+       */
 }
 
 /*
@@ -437,7 +442,7 @@ void Con_DPrintf (char *fmt, ...)
        va_list         argptr;
        char            msg[MAXPRINTMSG];
                
-       if (!developer.value)
+       if (!developer.integer)
                return;                 // don't confuse non-developers with techie stuff...
 
        va_start (argptr,fmt);
@@ -486,39 +491,53 @@ DRAWING
 Con_DrawInput
 
 The input line scrolls horizontally if typing goes beyond the right edge
+
+Modified by EvilTypeGuy eviltypeguy@qeradiant.com
 ================
 */
 void Con_DrawInput (void)
 {
        int             y;
        char    *text;
+       char    editlinecopy[256];
 
        if (key_dest != key_console && !con_forcedup)
                return;         // don't draw anything
 
-       text = key_lines[edit_line];
+       text = strcpy(editlinecopy, key_lines[edit_line]);
+       y = strlen(text);
+       
+       // Advanced Console Editing by Radix radix@planetquake.com
+       // Added/Modified by EvilTypeGuy eviltypeguy@qeradiant.com
+       // use strlen of edit_line instead of key_linepos to allow editing
+       // of early characters w/o erasing
+
+       // add the cursor frame
+       if ((int)(realtime*con_cursorspeed) & 1)                // cursor is visible
+               text[key_linepos] = 11 + 130 * key_insert;      // either solid or triangle facing right
        
-// add the cursor frame
-       text[key_linepos] = 10+((int)(realtime*con_cursorspeed)&1);
+       text[key_linepos + 1] = 0; // LordHavoc: null terminate, rather than padding with spaces
+       // text[key_linepos] = 10 + ((int)(realtime*con_cursorspeed) & 1);
        
-       text[key_linepos+1] = 0; // LordHavoc: null terminate, rather than padding with spaces
-// fill out remainder with spaces
-//     for (i=key_linepos+1 ; i< con_linewidth ; i++)
-//             text[i] = ' ';
+
+       // fill out remainder with spaces
+       //      for (i=key_linepos+1 ; i< con_linewidth ; i++)
+       //              text[i] = ' ';
                
-//     prestep if horizontally scrolling
+       //      prestep if horizontally scrolling
        if (key_linepos >= con_linewidth)
                text += 1 + key_linepos - con_linewidth;
                
-// draw it
-       y = con_vislines-16;
+       // draw it
+       y = con_vislines - 16;
+
+       //      for (i=0 ; i<con_linewidth ; i++)
+       //              Draw_Character ( (i+1)<<3, con_vislines - 16, text[i]);
 
-//     for (i=0 ; i<con_linewidth ; i++)
-//             Draw_Character ( (i+1)<<3, con_vislines - 16, text[i]);
        // LordHavoc: speedup
        Draw_String(8, con_vislines - 16, text, con_linewidth);
 
-// remove cursor
+       // remove cursor
        key_lines[edit_line][key_linepos] = 0;
 }
 
@@ -553,7 +572,6 @@ void Con_DrawNotify (void)
                text = con_text + (i % con_totallines)*con_linewidth;
                
                clearnotify = 0;
-               scr_copytop = 1;
 
 //             for (x = 0 ; x < con_linewidth ; x++)
 //                     Draw_Character ( (x+1)<<3, v, text[x]);
@@ -567,7 +585,6 @@ void Con_DrawNotify (void)
        if (key_dest == key_message)
        {
                clearnotify = 0;
-               scr_copytop = 1;
        
                x = 0;
                
@@ -646,38 +663,144 @@ void Con_DrawConsole (int lines, qboolean drawinput)
                Con_DrawInput ();
 }
 
-
 /*
-==================
-Con_NotifyBox
-==================
+       Con_DisplayList
+
+       New function for tab-completion system
+       Added by EvilTypeGuy
+       MEGA Thanks to Taniwha
+
 */
-void Con_NotifyBox (char *text)
+void
+Con_DisplayList(char **list)
 {
-       double          t1, t2;
+       int     i = 0;
+       int     pos = 0;
+       int     len = 0;
+       int     maxlen = 0;
+       int     width = (con_linewidth - 4);
+       char    **walk = list;
+
+       while (*walk) {
+               len = strlen(*walk);
+               if (len > maxlen)
+                       maxlen = len;
+               walk++;
+       }
+       maxlen += 1;
+
+       while (*list) {
+               len = strlen(*list);
+               if (pos + maxlen >= width) {
+                       Con_Printf("\n");
+                       pos = 0;
+               }
 
-// during startup for sound / cd warnings
-       Con_Printf("\n\n\35\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\37\n");
+               Con_Printf("%s", *list);
+               for (i = 0; i < (maxlen - len); i++)
+                       Con_Printf(" ");
 
-       Con_Printf (text);
+               pos += maxlen;
+               list++;
+       }
+
+       if (pos)
+               Con_Printf("\n\n");
+}
 
-       Con_Printf ("Press a key.\n");
-       Con_Printf("\35\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\37\n");
+/*
+       Con_CompleteCommandLine
 
-       key_count = -2;         // wait for a key down and up
-       key_dest = key_console;
+       New function for tab-completion system
+       Added by EvilTypeGuy
+       Thanks to Fett erich@heintz.com
+       Thanks to taniwha
 
-       do
-       {
-               t1 = Sys_FloatTime ();
-               SCR_UpdateScreen ();
-               Sys_SendKeyEvents ();
-               t2 = Sys_FloatTime ();
-               realtime += t2-t1;              // make the cursor blink
-       } while (key_count < 0);
-
-       Con_Printf ("\n");
-       key_dest = key_game;
-       realtime = 0;                           // put the cursor back to invisible
+*/
+void
+Con_CompleteCommandLine (void)
+{
+       char    *cmd = "";
+       char    *s;
+       int             c, v, a, i;
+       int             cmd_len;
+       char    **list[3] = {0, 0, 0};
+
+       s = key_lines[edit_line] + 1;
+       // Count number of possible matches
+       c = Cmd_CompleteCountPossible(s);
+       v = Cvar_CompleteCountPossible(s);
+       a = Cmd_CompleteAliasCountPossible(s);
+       
+       if (!(c + v + a))       // No possible matches
+               return;
+       
+       if (c + v + a == 1) {
+               if (c)
+                       list[0] = Cmd_CompleteBuildList(s);
+               else if (v)
+                       list[0] = Cvar_CompleteBuildList(s);
+               else
+                       list[0] = Cmd_CompleteAliasBuildList(s);
+               cmd = *list[0];
+               cmd_len = strlen (cmd);
+       } else {
+               if (c)
+                       cmd = *(list[0] = Cmd_CompleteBuildList(s));
+               if (v)
+                       cmd = *(list[1] = Cvar_CompleteBuildList(s));
+               if (a)
+                       cmd = *(list[2] = Cmd_CompleteAliasBuildList(s));
+
+               cmd_len = strlen (s);
+               do {
+                       for (i = 0; i < 3; i++) {
+                               char ch = cmd[cmd_len];
+                               char **l = list[i];
+                               if (l) {
+                                       while (*l && (*l)[cmd_len] == ch)
+                                               l++;
+                                       if (*l)
+                                               break;
+                               }
+                       }
+                       if (i == 3)
+                               cmd_len++;
+               } while (i == 3);
+               // 'quakebar'
+               Con_Printf("\n\35");
+               for (i = 0; i < con_linewidth - 4; i++)
+                       Con_Printf("\36");
+               Con_Printf("\37\n");
+
+               // Print Possible Commands
+               if (c) {
+                       Con_Printf("%i possible command%s\n", c, (c > 1) ? "s: " : ":");
+                       Con_DisplayList(list[0]);
+               }
+               
+               if (v) {
+                       Con_Printf("%i possible variable%s\n", v, (v > 1) ? "s: " : ":");
+                       Con_DisplayList(list[1]);
+               }
+               
+               if (a) {
+                       Con_Printf("%i possible aliases%s\n", a, (a > 1) ? "s: " : ":");
+                       Con_DisplayList(list[2]);
+               }
+       }
+       
+       if (cmd) {
+               strncpy(key_lines[edit_line] + 1, cmd, cmd_len);
+               key_linepos = cmd_len + 1;
+               if (c + v + a == 1) {
+                       key_lines[edit_line][key_linepos] = ' ';
+                       key_linepos++;
+               }
+               key_lines[edit_line][key_linepos] = 0;
+       }
+       for (i = 0; i < 3; i++)
+               if (list[i])
+                       Mem_Free(list[i]);
 }