]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - console.c
added support for transparent model skins
[xonotic/darkplaces.git] / console.c
index be48c8df52e558fbec75ae141ea9286a3e231a80..218ea632fbb918b3c78d0c9ac73d8f68dcf6d221 100644 (file)
--- a/console.c
+++ b/console.c
@@ -23,8 +23,10 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 #include <libc.h>
 #endif
 #ifndef _MSC_VER
+#ifndef __BORLANDC__
 #include <unistd.h>
 #endif
+#endif
 #ifdef WIN32
 #include <io.h>
 #endif
@@ -43,28 +45,29 @@ 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
+int            con_notifylines;                // scan lines to clear for notify lines
 
 extern void M_Menu_Main_f (void);
 
@@ -78,20 +81,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));
 }
 
@@ -385,14 +386,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)
@@ -408,6 +409,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 )
@@ -421,6 +424,7 @@ void Con_Printf (char *fmt, ...)
                        inupdate = false;
                }
        }
+       */
 }
 
 /*
@@ -484,39 +488,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;
 }
 
@@ -551,7 +569,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]);
@@ -565,7 +582,6 @@ void Con_DrawNotify (void)
        if (key_dest == key_message)
        {
                clearnotify = 0;
-               scr_copytop = 1;
        
                x = 0;
                
@@ -644,38 +660,145 @@ 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;
 
-// 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");
+       while (*list) {
+               len = strlen(*list);
+               if (pos + maxlen >= width) {
+                       Con_Printf("\n");
+                       pos = 0;
+               }
 
-       Con_Printf (text);
+               Con_Printf("%s", *list);
+               for (i = 0; i < (maxlen - len); i++)
+                       Con_Printf(" ");
 
-       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");
+               pos += maxlen;
+               list++;
+       }
 
-       key_count = -2;         // wait for a key down and up
-       key_dest = key_console;
+       if (pos)
+               Con_Printf("\n\n");
+}
 
-       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
+/*
+       Con_CompleteCommandLine
+
+       New function for tab-completion system
+       Added by EvilTypeGuy
+       Thanks to Fett erich@heintz.com
+       Thanks to taniwha
+
+*/
+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]);
+               }
+               return;
+       }
+       
+       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])
+                       qfree (list[i]);
 }