[qw] Get chat info flag mostly working again

Currently does only chat (not afk), but the whole thing needs work
anyway (billboarded world-space canvas or similar).
This commit is contained in:
Bill Currie 2021-11-29 00:01:57 +09:00
parent f36fa23666
commit ca23065b90
3 changed files with 52 additions and 25 deletions

View file

@ -32,6 +32,8 @@
#include "qw/protocol.h"
void CL_OnFocusChange (void (*func) (int game));
void CL_Input_Activate (void);
void CL_Input_Init (void);
void CL_Input_Init_Cvars (void);

View file

@ -46,6 +46,7 @@
#include "qw/include/client.h"
#include "qw/include/cl_chat.h"
#include "qw/include/cl_input.h"
llist_t *ignore_list, *dead_ignore_list;
@ -237,7 +238,7 @@ CL_Chat_Flush_Ignores (void)
{
llist_flush (ignore_list);
}
#if 0
static void
CL_ChatInfo (int val)
{
@ -250,25 +251,12 @@ CL_ChatInfo (int val)
}
static void
cl_chat_keydest (keydest_t keydest, void *data)
cl_chat_on_focus_change (int game)
{
switch (keydest) {
case key_game:
case key_demo:
CL_ChatInfo (0);
break;
case key_message:
CL_ChatInfo (1);
break;
case key_console:
case key_menu:
case key_unfocused:
case key_last: // should not happen
CL_ChatInfo (2);
break;
}
//FIXME afk mode
CL_ChatInfo (!!game);
}
#endif
void
CL_Chat_Init (void)
@ -278,5 +266,5 @@ CL_Chat_Init (void)
Cmd_AddCommand ("ignore", CL_Ignore_f, "Ignores chat and name-change messages from a user.");
Cmd_AddCommand ("unignore", CL_Unignore_f, "Removes a previously ignored user from the ignore list.");
//Key_KeydestCallback (cl_chat_keydest, 0);
CL_OnFocusChange (cl_chat_on_focus_change);
}

View file

@ -41,6 +41,7 @@
#include "QF/cvar.h"
#include "QF/input.h"
#include "QF/keys.h"
#include "QF/listener.h"
#include "QF/msg.h"
#include "QF/sys.h"
#include "QF/teamplay.h"
@ -66,6 +67,8 @@
int cl_game_context;
int cl_demo_context;
static int cl_event_id;
static struct LISTENER_SET_TYPE(int) cl_on_focus_change
= LISTENER_SET_STATIC_INIT(4);
cvar_t *cl_nodelta;
cvar_t *cl_maxnetfps;
@ -562,15 +565,49 @@ CL_SendCmd (void)
}
static int
cl_event_handler (const IE_event_t *ie_event, void *unused)
cl_key_event (const IE_event_t *ie_event)
{
if (ie_event->type == ie_key) {
if (ie_event->key.code == QFK_ESCAPE) {
Con_SetState (con_menu);
return 1;
}
}
return 0;
}
static void
cl_on_focus_change_redirect (void *_func, const int *game)
{
void (*func) (int game) = _func;
func (*game);
}
void
CL_OnFocusChange (void (*func) (int game))
{
LISTENER_ADD (&cl_on_focus_change, cl_on_focus_change_redirect, func);
}
static int
cl_focus_event (const IE_event_t *ie_event)
{
int game = ie_event->type == ie_gain_focus;
LISTENER_INVOKE (&cl_on_focus_change, &game);
return 1;
}
static int
cl_event_handler (const IE_event_t *ie_event, void *unused)
{
static int (*handlers[ie_event_count]) (const IE_event_t *ie_event) = {
[ie_key] = cl_key_event,
[ie_gain_focus] = cl_focus_event,
[ie_lose_focus] = cl_focus_event,
};
if (ie_event->type < 0 || ie_event->type >= ie_event_count
|| !handlers[ie_event->type]) {
return IN_Binding_HandleEvent (ie_event);
}
return handlers[ie_event->type] (ie_event);
}
void