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:
// instantly hide console and deactivate it
key_dest = key_game;
// instantly hide console and deactivate it
key_dest = key_game;
+ key_consoleactive = false;
scr_conlines = 0;
scr_con_current = 0;
scr_conlines = 0;
scr_con_current = 0;
-// 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
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)
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;
else
cl_avidemo_frame = 0;
else
cl_avidemo_frame = 0;
+ if (cl.worldmodel)
+ R_TimeReport("other");
V_UpdateBlends();
V_CalcRefdef ();
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");
+ //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();
}
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();
#define CON_TEXTSIZE 16384
#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
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
*/
void Con_ToggleConsole_f (void)
{
*/
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));
}
memset (con_times, 0, sizeof(con_times));
}
{
char editlinecopy[256], *text;
{
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]);
return; // don't draw anything
text = strcpy(editlinecopy, key_lines[edit_line]);
//
extern int con_totallines;
extern int con_backscroll;
//
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
extern qboolean con_initialized;
extern qbyte *con_chars;
extern int con_notifylines; // scan lines to clear for notify lines
if (cls.state != ca_dedicated && svs.maxclients > 1 && ((realtime - lastservertime) < sys_ticrate.value))
return;
// run the world state
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;
sv.frametime = pr_global_struct->frametime = frametimetotal;
else
sv.frametime = 0;
// move things around and think
// always pause in single player if in console or menus
// 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) )
SV_Physics ();
// send all messages to the clients
SV_Physics ();
// send all messages to the clients
-#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;
+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];
- char *name;
- int keynum;
+ char *name;
+ int keynum;
} keyname_t;
keyname_t keynames[] =
} keyname_t;
keyname_t keynames[] =
con_backscroll = 0;
return;
}
con_backscroll = 0;
return;
}
if (key < 32 || key > 127)
return; // non printable
if (key < 32 || key > 127)
return; // non printable
if (key_linepos < MAXCMDLINE-1)
if (key_linepos < MAXCMDLINE-1)
key_repeats[key]++;
if (key != K_BACKSPACE && key != K_PAUSE && key_repeats[key] > 1)
return; // ignore most autorepeats
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) );
}
if (key >= 200 && !keybindings[key])
Con_Printf ("%s is unbound, hit F4 to set.\n", Key_KeynumToString (key) );
}
- switch (key_dest)
- {
- case key_message:
- Key_Message (key);
- break;
- case key_menu:
- M_Keydown (key);
- break;
- case key_game:
- case key_console:
- 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");
+ }
-//
-// 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)
- 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]];
if (kb && kb[0] == '+')
{
sprintf (cmd, "-%s %i\n", kb+1, key);
Cbuf_AddText (cmd);
}
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;
-//
-// 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");
+ }
- 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");
+ }
*/
void Key_ClearStates (void)
{
*/
void Key_ClearStates (void)
{
- for (i=0 ; i<256 ; i++)
+ for (i = 0;i < 256;i++)
{
keydown[i] = false;
key_repeats[i] = 0;
{
keydown[i] = false;
key_repeats[i] = 0;
-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 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);
void Key_Event (int key, qboolean down);
void Key_Init (void);
//=============================================================================
//=============================================================================
m_state = m_none;
return;
}
m_state = m_none;
return;
}
- if (key_dest == key_console)
- {
- Con_ToggleConsole_f ();
- }
- else
- {
+ //if (key_dest == key_console)
+ // Con_ToggleConsole_f ();
+ //else
if (key_dest != key_menu)
{
m_save_demonum = cls.demonum;
cls.demonum = -1;
}
if (key_dest != key_menu)
{
m_save_demonum = cls.demonum;
cls.demonum = -1;
}
key_dest = key_menu;
m_state = m_main;
m_entersound = true;
key_dest = key_menu;
m_state = m_main;
m_entersound = true;
case K_ESCAPE:
key_dest = key_game;
m_state = m_none;
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 ();
- key_dest = key_console;
if (scr_con_current == vid.conheight)
return; // console is full screen
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;
sbar_y = vid.conheight - SBAR_HEIGHT;
if (cl.gametype == GAME_DEATHMATCH)
sbar_x = 0;
if (vid.conwidth > 320 && cl.gametype == GAME_DEATHMATCH)
Sbar_MiniDeathmatchOverlay ();
if (vid.conwidth > 320 && cl.gametype == GAME_DEATHMATCH)
Sbar_MiniDeathmatchOverlay ();
// if (crosshair.integer >= 1)
// DrawCrosshair(crosshair.integer - 1);
// if (crosshair.integer >= 1)
// DrawCrosshair(crosshair.integer - 1);
-
- if (cl.intermission == 1)
- Sbar_IntermissionOverlay();
- else if (cl.intermission == 2)
- Sbar_FinaleOverlay();
-
- Sbar_ShowFPS();
}
//=============================================================================
}
//=============================================================================
- // always pause in single player if in console or menus
- if (!sv.paused && (svs.maxclients > 1 || key_dest == key_game) )
{
// LordHavoc: QuakeC replacement for SV_ClientThink (player movement)
if (SV_PlayerPhysicsQC)
{
// LordHavoc: QuakeC replacement for SV_ClientThink (player movement)
if (SV_PlayerPhysicsQC)
// handle the mouse state when windowed if that's changed
usemouse = false;
// 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;
usemouse = true;
if (vidmode_active)
usemouse = true;
// handle the mouse state when windowed if that's changed
vid_usemouse = false;
// 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;
vid_usemouse = true;
if (modestate == MS_FULLDIB)
vid_usemouse = true;