you can now open/close the console independently of menu and messagemode
authorhavoc <havoc@d7cf8633-e32d-0410-b094-e92efae38249>
Mon, 2 Sep 2002 10:44:25 +0000 (10:44 +0000)
committerhavoc <havoc@d7cf8633-e32d-0410-b094-e92efae38249>
Mon, 2 Sep 2002 10:44:25 +0000 (10:44 +0000)
console catchs input before anything else
console appears ontop of anything else
console is no longer forced fullscreen when there is nothing else to show
shuffled around the 2D drawing calls in CL_UpdateScreen
now only console pauses singleplayer, instead of console/menu/messagemode
simplified console singleplayer pausing code a bit
mouse grabbing is now only forced off when console is down, not when menu or messagemode is shown

git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@2327 d7cf8633-e32d-0410-b094-e92efae38249

12 files changed:
cl_demo.c
cl_screen.c
console.c
console.h
host.c
keys.c
keys.h
menu.c
sbar.c
sv_user.c
vid_glx.c
vid_wgl.c

index 551b7cd..c0af979 100644 (file)
--- a/cl_demo.c
+++ b/cl_demo.c
@@ -399,6 +399,7 @@ void CL_TimeDemo_f (void)
 
        // instantly hide console and deactivate it
        key_dest = key_game;
+       key_consoleactive = false;
        scr_conlines = 0;
        scr_con_current = 0;
 
index c29c7ca..deceed2 100644 (file)
@@ -237,32 +237,33 @@ void SCR_SetUpToDrawConsole (void)
 {
        Con_CheckResize ();
 
-// decide on the height of the console
-       con_forcedup = !cl.worldmodel || cls.signon != SIGNONS;
+       //if (key_dest == key_game && (!cl.worldmodel || cls.signon != SIGNONS))
+       //      key_dest = key_console;
 
-       if (con_forcedup)
-       {
-               scr_conlines = vid.conheight;           // full screen
-               scr_con_current = scr_conlines;
-       }
-       else if (key_dest == key_console)
+// decide on the height of the console
+       if (key_consoleactive)
                scr_conlines = vid.conheight/2; // half screen
        else
                scr_conlines = 0;                               // none visible
 
-       if (scr_conlines < scr_con_current)
+       if (scr_conspeed.value)
        {
-               scr_con_current -= scr_conspeed.value*host_realframetime;
-               if (scr_conlines > scr_con_current)
-                       scr_con_current = scr_conlines;
-
-       }
-       else if (scr_conlines > scr_con_current)
-       {
-               scr_con_current += scr_conspeed.value*host_realframetime;
                if (scr_conlines < scr_con_current)
-                       scr_con_current = scr_conlines;
+               {
+                       scr_con_current -= scr_conspeed.value*host_realframetime;
+                       if (scr_conlines > scr_con_current)
+                               scr_con_current = scr_conlines;
+
+               }
+               else if (scr_conlines > scr_con_current)
+               {
+                       scr_con_current += scr_conspeed.value*host_realframetime;
+                       if (scr_conlines < scr_con_current)
+                               scr_con_current = scr_conlines;
+               }
        }
+       else
+               scr_con_current = scr_conlines;
 }
 
 /*
@@ -938,7 +939,8 @@ void CL_UpdateScreen(void)
        else
                cl_avidemo_frame = 0;
 
-       R_TimeReport("other");
+       if (cl.worldmodel)
+               R_TimeReport("other");
 
        CL_SetupScreenSize();
 
@@ -947,39 +949,39 @@ void CL_UpdateScreen(void)
        V_UpdateBlends();
        V_CalcRefdef ();
 
-       R_TimeReport("setup");
-
-       SCR_DrawNet ();
-       SCR_DrawTurtle ();
-       SCR_DrawPause ();
-
-       Sbar_Draw();
-
-       SCR_CheckDrawCenterString();
-       SHOWLMP_drawall();
-
-       SCR_DrawConsole();
+       if (cl.worldmodel)
+               R_TimeReport("setup");
 
-       ui_draw();
+       //FIXME: force menu if nothing else to look at?
+       //if (key_dest == key_game && !cl.worldmodel && cls.state == ca_disconnected)
 
        if (scr_drawloading)
        {
                scr_drawloading = false;
                SCR_DrawLoading();
        }
-
-       CL_DrawVideo();
-
-       R_TimeReport("2d");
-
-       // add r_speeds text to queue
-       R_TimeReport_End();
-
-       // start a new timing run
-       R_TimeReport_Start();
-
-       // make menu fade everything else on the screen
-       M_Draw();
+       else
+       {
+               if (cl.worldmodel)
+               {
+                       SCR_DrawNet ();
+                       SCR_DrawTurtle ();
+                       SCR_DrawPause ();
+                       Sbar_Draw();
+               }
+               SCR_CheckDrawCenterString();
+               SHOWLMP_drawall();
+               ui_draw();
+               CL_DrawVideo();
+               M_Draw();
+               if (cl.worldmodel)
+               {
+                       R_TimeReport("2d");
+                       R_TimeReport_End();
+                       R_TimeReport_Start();
+               }
+       }
+       SCR_DrawConsole();
 
        SCR_UpdateScreen();
 }
index 9466571..6600491 100644 (file)
--- a/console.c
+++ b/console.c
@@ -39,8 +39,6 @@ float         con_cursorspeed = 4;
 
 #define                CON_TEXTSIZE    16384
 
-qboolean       con_forcedup;           // because no entities to refresh
-
 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
@@ -80,16 +78,7 @@ Con_ToggleConsole_f
 */
 void Con_ToggleConsole_f (void)
 {
-       if (key_dest == key_console)
-       {
-               if (cls.state == ca_connected)
-                       key_dest = key_game;
-               else
-                       M_Menu_Main_f ();
-       }
-       else
-               key_dest = key_console;
-
+       key_consoleactive = !key_consoleactive;
        memset (con_times, 0, sizeof(con_times));
 }
 
@@ -473,7 +462,7 @@ void Con_DrawInput (void)
 {
        char editlinecopy[256], *text;
 
-       if (key_dest != key_console && !con_forcedup)
+       if (!key_consoleactive)
                return;         // don't draw anything
 
        text = strcpy(editlinecopy, key_lines[edit_line]);
index 83149f2..6f3a9f3 100644 (file)
--- a/console.h
+++ b/console.h
@@ -26,7 +26,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 //
 extern int con_totallines;
 extern int con_backscroll;
-extern qboolean con_forcedup;  // because no entities to refresh
 extern qboolean con_initialized;
 extern qbyte *con_chars;
 extern int con_notifylines;            // scan lines to clear for notify lines
diff --git a/host.c b/host.c
index c0741a6..ef40212 100644 (file)
--- a/host.c
+++ b/host.c
@@ -625,7 +625,7 @@ void Host_ServerFrame (void)
        if (cls.state != ca_dedicated && svs.maxclients > 1 && ((realtime - lastservertime) < sys_ticrate.value))
                return;
 // run the world state
-       if (!sv.paused && (svs.maxclients > 1 || key_dest == key_game) )
+       if (!sv.paused && (svs.maxclients > 1 || (key_dest == key_game && !key_consoleactive)))
                sv.frametime = pr_global_struct->frametime = frametimetotal;
        else
                sv.frametime = 0;
@@ -643,7 +643,7 @@ void Host_ServerFrame (void)
 
 // move things around and think
 // always pause in single player if in console or menus
-       if (!sv.paused && (svs.maxclients > 1 || key_dest == key_game) )
+       if (sv.frametime)
                SV_Physics ();
 
 // send all messages to the clients
diff --git a/keys.c b/keys.c
index f44a468..ff098d5 100644 (file)
--- a/keys.c
+++ b/keys.c
@@ -26,31 +26,32 @@ key up events are sent even if in console mode
 */
 
 
-#define                MAXCMDLINE      256
-char   key_lines[32][MAXCMDLINE];
-int            key_linepos;
-int            shift_down = false;
-int            key_lastpress;
-int            key_insert;     // insert key toggle (for editing)
+#define MAXCMDLINE 256
+char key_lines[32][MAXCMDLINE];
+int key_linepos;
+int shift_down = false;
+int key_lastpress;
+int key_insert;        // insert key toggle (for editing)
 
-int            edit_line = 0;
-int            history_line = 0;
+int edit_line = 0;
+int history_line = 0;
 
-keydest_t      key_dest;
+int key_consoleactive;
+keydest_t key_dest;
 
-int            key_count;                      // incremented every key event
+int key_count;                 // incremented every key event
 
-char   *keybindings[256];
-qboolean       consolekeys[256];       // if true, can't be rebound while in console
-qboolean       menubound[256]; // if true, can't be rebound while in menu
-int            keyshift[256];          // key to map to if shift held down in console
-int            key_repeats[256];       // if > 1, it is autorepeating
-qboolean       keydown[256];
+char *keybindings[256];
+qboolean consolekeys[256];     // if true, can't be rebound while in console
+qboolean menubound[256];       // if true, can't be rebound while in menu
+int keyshift[256];             // key to map to if shift held down in console
+int key_repeats[256];  // if > 1, it is autorepeating
+qboolean keydown[256];
 
 typedef struct
 {
-       char    *name;
-       int             keynum;
+       char *name;
+       int keynum;
 } keyname_t;
 
 keyname_t keynames[] =
@@ -306,10 +307,10 @@ void Key_Console (int key)
                con_backscroll = 0;
                return;
        }
-       
+
        if (key < 32 || key > 127)
                return; // non printable
-               
+
 
 
        if (key_linepos < MAXCMDLINE-1)
@@ -687,7 +688,7 @@ void Key_Event (int key, qboolean down)
                key_repeats[key]++;
                if (key != K_BACKSPACE && key != K_PAUSE && key_repeats[key] > 1)
                        return; // ignore most autorepeats
-                       
+
                if (key >= 200 && !keybindings[key])
                        Con_Printf ("%s is unbound, hit F4 to set.\n", Key_KeynumToString (key) );
        }
@@ -702,107 +703,139 @@ void Key_Event (int key, qboolean down)
        {
                if (!down)
                        return;
-               switch (key_dest)
-               {
-               case key_message:
-                       Key_Message (key);
-                       break;
-               case key_menu:
-                       M_Keydown (key);
-                       break;
-               case key_game:
-               case key_console:
+               if (key_consoleactive)
                        M_ToggleMenu_f ();
-                       break;
-               default:
-                       Sys_Error ("Bad key_dest");
+               else
+               {
+                       switch (key_dest)
+                       {
+                       case key_message:
+                               Key_Message (key);
+                               break;
+                       case key_menu:
+                               M_Keydown (key);
+                               break;
+                       case key_game:
+                       //case key_console:
+                               M_ToggleMenu_f ();
+                               break;
+                       default:
+                               Sys_Error ("Bad key_dest");
+                       }
                }
                return;
        }
 
-//
-// key up events only generate commands if the game key binding is
-// a button command (leading + sign).  These will occur even in console mode,
-// to keep the character from continuing an action started before a console
-// switch.  Button commands include the keynum as a parameter, so multiple
-// downs can be matched with ups
-//
-       if (!down)
+       // LordHavoc: hack to make toggleconsole always work
+       if (down)
        {
                kb = keybindings[key];
-               if (kb && kb[0] == '+')
+               if (kb && !strncmp(kb, "toggleconsole", strlen("toggleconsole")))
                {
-                       sprintf (cmd, "-%s %i\n", kb+1, key);
-                       Cbuf_AddText (cmd);
+                       Cbuf_AddText (kb);
+                       Cbuf_AddText ("\n");
+                       return;
                }
-               if (keyshift[key] != key)
+       }
+
+       if (key_consoleactive && consolekeys[key])
+       {
+               // console only wants key down events
+               if (!down)
+                       return;
+
+               // FIXME: this does not support non-QWERTY keyboards
+               if (shift_down)
+                       key = keyshift[key];
+
+               Key_Console (key);
+       }
+       else
+       {
+               //
+               // key up events only generate commands if the game key binding is
+               // a button command (leading + sign).  These will occur even in console mode,
+               // to keep the character from continuing an action started before a console
+               // switch.  Button commands include the keynum as a parameter, so multiple
+               // downs can be matched with ups
+               //
+               if (!down)
                {
-                       kb = keybindings[keyshift[key]];
+                       kb = keybindings[key];
                        if (kb && kb[0] == '+')
                        {
                                sprintf (cmd, "-%s %i\n", kb+1, key);
                                Cbuf_AddText (cmd);
                        }
+                       if (keyshift[key] != key)
+                       {
+                               kb = keybindings[keyshift[key]];
+                               if (kb && kb[0] == '+')
+                               {
+                                       sprintf (cmd, "-%s %i\n", kb+1, key);
+                                       Cbuf_AddText (cmd);
+                               }
+                       }
+                       return;
                }
-               return;
-       }
 
-//
-// during demo playback, most keys bring up the main menu
-//
-       if (cls.demoplayback && down && consolekeys[key] && key_dest == key_game)
-       {
-               M_ToggleMenu_f ();
-               return;
-       }
+               //
+               // during demo playback, most keys bring up the main menu
+               //
+               if (cls.demoplayback && down && consolekeys[key] && key_dest == key_game)
+               {
+                       M_ToggleMenu_f ();
+                       return;
+               }
 
-//
-// if not a consolekey, send to the interpreter no matter what mode is
-//
-       if ( (key_dest == key_menu && menubound[key])
-       || (key_dest == key_console && !consolekeys[key])
-       || (key_dest == key_game && ( !con_forcedup || !consolekeys[key] ) ) )
-       {
-               kb = keybindings[key];
-               if (kb)
+               //
+               // if not a consolekey, send to the interpreter no matter what mode is
+               //
+               //if ((key_dest == key_console && !consolekeys[key])
+               if ((key_consoleactive && !consolekeys[key])
+                || (key_dest == key_menu && menubound[key])
+                || key_dest == key_game)
                {
-                       if (kb[0] == '+')
-                       {       // button commands add keynum as a parm
-                               sprintf (cmd, "%s %i\n", kb, key);
-                               Cbuf_AddText (cmd);
-                       }
-                       else
+                       kb = keybindings[key];
+                       if (kb)
                        {
-                               Cbuf_AddText (kb);
-                               Cbuf_AddText ("\n");
+                               if (kb[0] == '+')
+                               {       // button commands add keynum as a parm
+                                       sprintf (cmd, "%s %i\n", kb, key);
+                                       Cbuf_AddText (cmd);
+                               }
+                               else
+                               {
+                                       Cbuf_AddText (kb);
+                                       Cbuf_AddText ("\n");
+                               }
                        }
+                       return;
                }
-               return;
-       }
 
-       if (!down)
-               return;         // other systems only care about key down events
+               if (!down)
+                       return;         // other systems only care about key down events
 
-       if (shift_down)
-       {
-               key = keyshift[key];
-       }
+               // FIXME: this does not support non-QWERTY keyboards
+               if (shift_down)
+                       key = keyshift[key];
 
-       switch (key_dest)
-       {
-       case key_message:
-               Key_Message (key);
-               break;
-       case key_menu:
-               M_Keydown (key);
-               break;
+               switch (key_dest)
+               {
+               case key_message:
+                       Key_Message (key);
+                       break;
+               case key_menu:
+                       M_Keydown (key);
+                       break;
 
-       case key_game:
-       case key_console:
-               Key_Console (key);
-               break;
-       default:
-               Sys_Error ("Bad key_dest");
+               case key_game:
+               //case key_console:
+                       Key_Console (key);
+                       break;
+               default:
+                       Sys_Error ("Bad key_dest");
+               }
        }
 }
 
@@ -814,9 +847,9 @@ Key_ClearStates
 */
 void Key_ClearStates (void)
 {
-       int             i;
+       int i;
 
-       for (i=0 ; i<256 ; i++)
+       for (i = 0;i < 256;i++)
        {
                keydown[i] = false;
                key_repeats[i] = 0;
diff --git a/keys.h b/keys.h
index 7e9b9dd..4447faf 100644 (file)
--- a/keys.h
+++ b/keys.h
@@ -147,13 +147,14 @@ typedef enum {
 } keynum_t;
 
 
-typedef enum {key_game, key_console, key_message, key_menu} keydest_t;
+typedef enum {key_game, key_message, key_menu} keydest_t;
 
-extern keydest_t       key_dest;
+extern int key_consoleactive;
+extern keydest_t key_dest;
 extern char *keybindings[256];
-extern int             key_repeats[256];
-extern int             key_count;                      // incremented every key event
-extern int             key_lastpress;
+extern int key_repeats[256];
+extern int key_count;                  // incremented every key event
+extern int key_lastpress;
 
 void Key_Event (int key, qboolean down);
 void Key_Init (void);
diff --git a/menu.c b/menu.c
index f17c79f..157d3cc 100644 (file)
--- a/menu.c
+++ b/menu.c
@@ -275,7 +275,7 @@ void M_DrawTextBox (float x, float y, float width, float height)
 
 //=============================================================================
 
-int m_save_demonum;
+//int m_save_demonum;
 
 /*
 ================
@@ -297,14 +297,10 @@ void M_ToggleMenu_f (void)
                m_state = m_none;
                return;
        }
-       if (key_dest == key_console)
-       {
-               Con_ToggleConsole_f ();
-       }
-       else
-       {
+       //if (key_dest == key_console)
+       //      Con_ToggleConsole_f ();
+       //else
                M_Menu_Main_f ();
-       }
 }
 
 
@@ -382,11 +378,13 @@ void M_Menu_Main_f (void)
        else
                MAIN_ITEMS = 5;
 
+       /*
        if (key_dest != key_menu)
        {
                m_save_demonum = cls.demonum;
                cls.demonum = -1;
        }
+       */
        key_dest = key_menu;
        m_state = m_main;
        m_entersound = true;
@@ -427,9 +425,9 @@ void M_Main_Key (int key)
        case K_ESCAPE:
                key_dest = key_game;
                m_state = m_none;
-               cls.demonum = m_save_demonum;
-               if (cls.demonum != -1 && !cls.demoplayback && cls.state != ca_connected)
-                       CL_NextDemo ();
+               //cls.demonum = m_save_demonum;
+               //if (cls.demonum != -1 && !cls.demoplayback && cls.state != ca_connected)
+               //      CL_NextDemo ();
                break;
 
        case K_DOWNARROW:
@@ -2131,7 +2129,6 @@ void M_Quit_Key (int key)
 
        case 'Y':
        case 'y':
-               key_dest = key_console;
                Host_Quit_f ();
                break;
 
diff --git a/sbar.c b/sbar.c
index 52bb7da..e14b58d 100644 (file)
--- a/sbar.c
+++ b/sbar.c
@@ -787,6 +787,17 @@ void Sbar_Draw (void)
        if (scr_con_current == vid.conheight)
                return;         // console is full screen
 
+       if (cl.intermission == 1)
+       {
+               Sbar_IntermissionOverlay();
+               return;
+       }
+       else if (cl.intermission == 2)
+       {
+               Sbar_FinaleOverlay();
+               return;
+       }
+
        sbar_y = vid.conheight - SBAR_HEIGHT;
        if (cl.gametype == GAME_DEATHMATCH)
                sbar_x = 0;
@@ -890,15 +901,10 @@ void Sbar_Draw (void)
        if (vid.conwidth > 320 && cl.gametype == GAME_DEATHMATCH)
                Sbar_MiniDeathmatchOverlay ();
 
+       Sbar_ShowFPS();
+
 //     if (crosshair.integer >= 1)
 //             DrawCrosshair(crosshair.integer - 1);
-
-       if (cl.intermission == 1)
-               Sbar_IntermissionOverlay();
-       else if (cl.intermission == 2)
-               Sbar_FinaleOverlay();
-
-       Sbar_ShowFPS();
 }
 
 //=============================================================================
index 41fae36..1213e6f 100644 (file)
--- a/sv_user.c
+++ b/sv_user.c
@@ -654,8 +654,7 @@ void SV_RunClients (void)
                        continue;
                }
 
-               // always pause in single player if in console or menus
-               if (!sv.paused && (svs.maxclients > 1 || key_dest == key_game) )
+               if (sv.frametime)
                {
                        // LordHavoc: QuakeC replacement for SV_ClientThink (player movement)
                        if (SV_PlayerPhysicsQC)
index 07104c1..1021ff3 100644 (file)
--- a/vid_glx.c
+++ b/vid_glx.c
@@ -515,7 +515,7 @@ void VID_Finish (void)
 
 // handle the mouse state when windowed if that's changed
        usemouse = false;
-       if (vid_mouse.integer && key_dest == key_game)
+       if (vid_mouse.integer && !key_consoleactive)
                usemouse = true;
        if (vidmode_active)
                usemouse = true;
index b9a0027..578b94a 100644 (file)
--- a/vid_wgl.c
+++ b/vid_wgl.c
@@ -345,7 +345,7 @@ void VID_Finish (void)
 
 // handle the mouse state when windowed if that's changed
        vid_usemouse = false;
-       if (vid_mouse.integer && key_dest == key_game)
+       if (vid_mouse.integer && !key_consoleactive)
                vid_usemouse = true;
        if (modestate == MS_FULLDIB)
                vid_usemouse = true;