[console] Hook up new input system

This has smashed the keydest handling for many things, and bindings, but
seems to be a good start with the new input system: the console in
qw-client-x11 is usable (keyboard-only).

The button and axis values have been removed from the knum_t enum as
mouse events are separate from key events, and other button and axis
inputs will be handled separately.

keys.c has been disabled in the build as it is obsolute (thus much of
the breakage).
This commit is contained in:
Bill Currie 2021-11-08 11:20:04 +09:00
parent 6dc90c5497
commit 4898a44263
28 changed files with 459 additions and 323 deletions

View file

@ -60,6 +60,12 @@ typedef struct {
int cur_line; // current line
} con_buffer_t;
typedef enum {
con_inactive,
con_active,
con_fullscreen,
} con_state_t;
extern int con_linewidth;
extern struct plugin_s *con_module;
extern struct console_data_s con_data;
@ -73,7 +79,7 @@ void Con_DrawConsole (void);
void Con_Printf (const char *fmt, ...) __attribute__((format(PRINTF, 1, 2)));
void Con_Print (const char *fmt, va_list args) __attribute__((format(PRINTF, 1, 0)));
void Con_ToggleConsole_f (void);
void Con_SetState (con_state_t state);
struct inputline_s;
// wrapper function to attempt to either complete the command line

View file

@ -88,6 +88,8 @@ typedef enum {
ie_key,
ie_axis,
ie_button,
ie_event_count
} IE_event_type;
#define IE_broadcast_events (0 \
@ -113,5 +115,6 @@ int IE_Send_Event (const IE_event_t *event);
int IE_Add_Handler (ie_handler_t *event_handler, void *data);
void IE_Remove_Handler (int handle);
void IE_Set_Focus (int handle);
int IE_Get_Focus (void);
#endif//__QF_in_event_h

View file

@ -32,6 +32,7 @@
#ifndef __QFCC__
#include "QF/darray.h"
#include "QF/qtypes.h"
#include "QF/input/binding.h"
@ -71,16 +72,20 @@ typedef struct in_context_s {
imt_t **imt_tail;
imt_t *active_imt;
imt_t *default_imt;
struct cbuf_s *cbuf;
} in_context_t;
int IMT_GetAxisBlock (const char *device, int num_axes);
int IMT_GetButtonBlock (const char *device, int num_buttons);
int IMT_CreateContext (void);
int IMT_GetContext (void);
void IMT_SetContext (int ctx);
void IMT_SetContextCbuf (int ctx, struct cbuf_s *cbuf);
imt_t *IMT_FindIMT (const char *name);
int IMT_CreateIMT (int context, const char *imt_name,
const char *chain_imt_name);
void IMT_ProcessAxis (int axis, int value);
void IMT_ProcessButton (int button, int state);
qboolean IMT_ProcessAxis (int axis, int value);
qboolean IMT_ProcessButton (int button, int state);
#endif

View file

@ -42,6 +42,7 @@
///@{
/// these are the key numbers that should be passed to Key_Event
/// FIXME clashes with actual inicode and OS keys
typedef enum {
/* The keyboard syms have been cleverly chosen to map to ASCII */
QFK_UNKNOWN = 0,
@ -375,148 +376,6 @@ typedef enum {
QFK_BACK,
QFK_FORWARD,
/* Add any other keys here */
//
// mouse buttons generate virtual keys
//
QFM_BUTTON1,
QFM_BUTTON2,
QFM_BUTTON3,
QFM_WHEEL_UP,
QFM_WHEEL_DOWN,
QFM_BUTTON6,
QFM_BUTTON7,
QFM_BUTTON8,
QFM_BUTTON9,
QFM_BUTTON10,
QFM_BUTTON11,
QFM_BUTTON12,
QFM_BUTTON13,
QFM_BUTTON14,
QFM_BUTTON15,
QFM_BUTTON16,
QFM_BUTTON17,
QFM_BUTTON18,
QFM_BUTTON19,
QFM_BUTTON20,
QFM_BUTTON21,
QFM_BUTTON22,
QFM_BUTTON23,
QFM_BUTTON24,
QFM_BUTTON25,
QFM_BUTTON26,
QFM_BUTTON27,
QFM_BUTTON28,
QFM_BUTTON29,
QFM_BUTTON30,
QFM_BUTTON31,
QFM_BUTTON32,
//
// joystick buttons
//
QFJ_BUTTON1,
QFJ_BUTTON2,
QFJ_BUTTON3,
QFJ_BUTTON4,
QFJ_BUTTON5,
QFJ_BUTTON6,
QFJ_BUTTON7,
QFJ_BUTTON8,
QFJ_BUTTON9,
QFJ_BUTTON10,
QFJ_BUTTON11,
QFJ_BUTTON12,
QFJ_BUTTON13,
QFJ_BUTTON14,
QFJ_BUTTON15,
QFJ_BUTTON16,
QFJ_BUTTON17,
QFJ_BUTTON18,
QFJ_BUTTON19,
QFJ_BUTTON20,
QFJ_BUTTON21,
QFJ_BUTTON22,
QFJ_BUTTON23,
QFJ_BUTTON24,
QFJ_BUTTON25,
QFJ_BUTTON26,
QFJ_BUTTON27,
QFJ_BUTTON28,
QFJ_BUTTON29,
QFJ_BUTTON30,
QFJ_BUTTON31,
QFJ_BUTTON32,
QFJ_BUTTON33,
QFJ_BUTTON34,
QFJ_BUTTON35,
QFJ_BUTTON36,
QFJ_BUTTON37,
QFJ_BUTTON38,
QFJ_BUTTON39,
QFJ_BUTTON40,
QFJ_BUTTON41,
QFJ_BUTTON42,
QFJ_BUTTON43,
QFJ_BUTTON44,
QFJ_BUTTON45,
QFJ_BUTTON46,
QFJ_BUTTON47,
QFJ_BUTTON48,
QFJ_BUTTON49,
QFJ_BUTTON50,
QFJ_BUTTON51,
QFJ_BUTTON52,
QFJ_BUTTON53,
QFJ_BUTTON54,
QFJ_BUTTON55,
QFJ_BUTTON56,
QFJ_BUTTON57,
QFJ_BUTTON58,
QFJ_BUTTON59,
QFJ_BUTTON60,
QFJ_BUTTON61,
QFJ_BUTTON62,
QFJ_BUTTON63,
QFJ_BUTTON64,
//
// joystick axes (for button emulation without consuming buttons)
//
QFJ_AXIS1,
QFJ_AXIS2,
QFJ_AXIS3,
QFJ_AXIS4,
QFJ_AXIS5,
QFJ_AXIS6,
QFJ_AXIS7,
QFJ_AXIS8,
QFJ_AXIS9,
QFJ_AXIS10,
QFJ_AXIS11,
QFJ_AXIS12,
QFJ_AXIS13,
QFJ_AXIS14,
QFJ_AXIS15,
QFJ_AXIS16,
QFJ_AXIS17,
QFJ_AXIS18,
QFJ_AXIS19,
QFJ_AXIS20,
QFJ_AXIS21,
QFJ_AXIS22,
QFJ_AXIS23,
QFJ_AXIS24,
QFJ_AXIS25,
QFJ_AXIS26,
QFJ_AXIS27,
QFJ_AXIS28,
QFJ_AXIS29,
QFJ_AXIS30,
QFJ_AXIS31,
QFJ_AXIS32,
QFK_LAST
} knum_t;

View file

@ -30,8 +30,8 @@
#include <stdarg.h>
#include <QF/console.h>
#include <QF/plugin.h>
#include <QF/qtypes.h>
typedef struct console_funcs_s {
void (*init) (void);
@ -40,6 +40,7 @@ typedef struct console_funcs_s {
void (*draw_console) (void);
void (*check_resize) (void);
void (*new_map) (void);
void (*set_state) (con_state_t state);
} console_funcs_t;
typedef struct console_data_s {

View file

@ -59,6 +59,8 @@
#include "QF/va.h"
#include "QF/vid.h"
#include "QF/input/event.h"
#include "QF/plugin/general.h"
#include "QF/plugin/console.h"
#include "QF/plugin/vid_render.h"
@ -89,6 +91,9 @@ static float con_times[NUM_CON_TIMES]; // realtime time the line was generated
// for transparent notify lines
static int con_totallines; // total lines in console scrollback
static con_state_t con_state;
static int con_event_id;
static int con_saved_focos;
static qboolean con_debuglog;
static qboolean chat_team;
@ -107,7 +112,7 @@ static view_t *hud_view;
static qboolean con_initialized;
static keydest_t con_curr_keydest;
static keydest_t con_prev_keydest;
//static keydest_t con_prev_keydest;
static void
ClearNotify (void)
@ -118,19 +123,33 @@ ClearNotify (void)
con_times[i] = 0;
}
static void
C_SetState (con_state_t state)
{
con_state = state;
if (con_state == con_inactive) {
IE_Set_Focus (con_saved_focos);
} else {
con_saved_focos = IE_Get_Focus ();
IE_Set_Focus (con_event_id);
}
}
static void
ToggleConsole_f (void)
{
Con_ClearTyping (input_line, 0);
if (con_curr_keydest == key_console && !con_data.force_commandline) {
Key_SetKeyDest (con_prev_keydest);
} else {
con_prev_keydest = Key_GetKeyDest ();
Key_SetKeyDest (key_console);
switch (con_state) {
case con_inactive:
C_SetState (con_active);
break;
case con_active:
C_SetState (con_inactive);
break;
case con_fullscreen:
break;
}
ClearNotify ();
}
@ -140,9 +159,9 @@ ToggleChat_f (void)
Con_ClearTyping (input_line, 0);
if (con_curr_keydest == key_console && !con_data.force_commandline) {
Key_SetKeyDest (key_game);
//Key_SetKeyDest (key_game);
} else {
Key_SetKeyDest (key_console);
//Key_SetKeyDest (key_console);
}
ClearNotify ();
@ -164,7 +183,7 @@ MessageMode_f (void)
if (con_data.force_commandline)
return;
chat_team = false;
Key_SetKeyDest (key_message);
//Key_SetKeyDest (key_message);
}
static void
@ -173,7 +192,7 @@ MessageMode2_f (void)
if (con_data.force_commandline)
return;
chat_team = true;
Key_SetKeyDest (key_message);
//Key_SetKeyDest (key_message);
}
static void
@ -330,7 +349,7 @@ C_Say (inputline_t *il)
Cbuf_AddText (con_data.cbuf, "say \"");
Cbuf_AddText (con_data.cbuf, line);
Cbuf_AddText (con_data.cbuf, "\"\n");
Key_SetKeyDest (key_game);
//Key_SetKeyDest (key_game);
}
static void
@ -343,7 +362,7 @@ C_SayTeam (inputline_t *il)
Cbuf_AddText (con_data.cbuf, "say_team \"");
Cbuf_AddText (con_data.cbuf, line);
Cbuf_AddText (con_data.cbuf, "\"\n");
Key_SetKeyDest (key_game);
//Key_SetKeyDest (key_game);
}
static void
@ -447,79 +466,6 @@ C_Print (const char *fmt, va_list args)
fputs (buffer->str + 1, stdout);
}
static void
C_KeyEvent (knum_t key, short unicode, qboolean down, void *data)
{
inputline_t *il;
if (!down)
return;
if (con_curr_keydest == key_menu) {
Menu_KeyEvent (key, unicode, down);
return;
}
if (down) {
if (key == key_toggleconsole) {
ToggleConsole_f ();
return;
}
}
if (con_curr_keydest == key_message) {
if (chat_team) {
il = say_team_line;
} else {
il = say_line;
}
} else {
switch (key) {
case QFK_PAGEUP:
if (keydown[QFK_RCTRL] || keydown[QFK_LCTRL])
con->display = 0;
else
con->display -= 10;
if (con->display < con->current - con->numlines)
con->display = con->current - con->numlines;
return;
case QFK_PAGEDOWN:
if (keydown[QFK_RCTRL] || keydown[QFK_LCTRL])
con->display = con->current;
else
con->display += 10;
if (con->display > con->current)
con->display = con->current;
return;
case QFM_WHEEL_UP:
con->display -= 3;
if (con->display < con->current - con->numlines)
con->display = con->current - con->numlines;
return;
case QFM_WHEEL_DOWN:
con->display += 3;
if (con->display > con->current)
con->display = con->current;
return;
default:
break;
}
il = input_line;
}
//FIXME should this translation be here?
if ((unicode==0x0A) && (key==QFK_RETURN)) {
Con_ProcessInputLine (il, key);
}
if ((unicode==0x7F) && (key==QFK_BACKSPACE)) {
Con_ProcessInputLine (il, key);
}
if (unicode!=0) {
Con_ProcessInputLine (il, key >= 256 ? (int) key : unicode);
} else {
Con_ProcessInputLine (il, key);
}
}
/* DRAWING */
static void
@ -551,8 +497,8 @@ C_DrawInputLine (inputline_t *il)
static void
draw_input (view_t *view)
{
if (con_curr_keydest != key_console)// && !con_data.force_commandline)
return; // don't draw anything (always draw if not active)
if (con_state == con_inactive)// && !con_data.force_commandline)
return;
DrawInputLine (view->xabs + 8, view->yabs, 1, input_line);
}
@ -641,7 +587,7 @@ draw_console (view_t *view)
{
byte alpha;
if (con_data.force_commandline) {
if (con_state == con_fullscreen) {
alpha = 255;
} else {
float y = r_data->vid->conview->ylen * con_size->value;
@ -704,12 +650,17 @@ setup_console (void)
{
float lines;
if (con_data.force_commandline) {
lines = con_data.lines = r_data->vid->conview->ylen;
} else if (con_curr_keydest == key_console) {
lines = r_data->vid->conview->ylen * bound (0.2, con_size->value, 1);
} else {
lines = 0;
switch (con_state) {
case con_inactive:
lines = 0;
break;
case con_active:
lines = r_data->vid->conview->ylen * bound (0.2, con_size->value,
1);
break;
case con_fullscreen:
lines = con_data.lines = r_data->vid->conview->ylen;
break;
}
if (con_speed->value) {
@ -776,13 +727,13 @@ exec_line (inputline_t *il)
{
Con_ExecLine (il->line);
}
#if 0
static void
con_end_message (void *line)
{
Key_PopEscape ();
//Key_PopEscape ();
Con_ClearTyping (line, 1);
Key_SetKeyDest (key_game);
//Key_SetKeyDest (key_game);
}
static void
@ -798,7 +749,7 @@ con_keydest_callback (keydest_t kd, void *data)
return;
}
if (kd != key_console && con_curr_keydest == key_console) {
Key_PopEscape ();
//Key_PopEscape ();
}
switch (kd) {
case key_last:
@ -808,11 +759,11 @@ con_keydest_callback (keydest_t kd, void *data)
case key_menu:
break;
case key_message:
Key_PushEscape (con_end_message,
chat_team ? say_team_line : say_line);
//Key_PushEscape (con_end_message,
// chat_team ? say_team_line : say_line);
break;
case key_console:
Key_PushEscape (con_leave_console, 0);
//Key_PushEscape (con_leave_console, 0);
break;
}
con_curr_keydest = kd;
@ -823,6 +774,108 @@ con_enter_menu (void *data)
{
Menu_Enter ();
}
#endif
static void
con_key_event (const IE_event_t *event)
{
inputline_t *il;
__auto_type key = &event->key;
#if 0
if (con_curr_keydest == key_menu) {
Menu_KeyEvent (key, unicode, down);
return;
}
if (down) {
if (key == key_toggleconsole) {
ToggleConsole_f ();
return;
}
}
#endif
#if 0
if (con_curr_keydest == key_message) {
if (chat_team) {
il = say_team_line;
} else {
il = say_line;
}
} else {
#endif
switch (key->code) {
case QFK_PAGEUP:
if (key->shift & ies_control)
con->display = 0;
else
con->display -= 10;
if (con->display < con->current - con->numlines)
con->display = con->current - con->numlines;
return;
case QFK_PAGEDOWN:
if (key->shift & ies_control)
con->display = con->current;
else
con->display += 10;
if (con->display > con->current)
con->display = con->current;
return;
#if 0
case QFM_WHEEL_UP:
con->display -= 3;
if (con->display < con->current - con->numlines)
con->display = con->current - con->numlines;
return;
case QFM_WHEEL_DOWN:
con->display += 3;
if (con->display > con->current)
con->display = con->current;
return;
#endif
default:
break;
}
il = input_line;
#if 0
}
#endif
#if 0
//FIXME should this translation be here?
if ((unicode==0x0A) && (key==QFK_RETURN)) {
Con_ProcessInputLine (il, key);
}
if ((unicode==0x7F) && (key==QFK_BACKSPACE)) {
Con_ProcessInputLine (il, key);
}
#endif
if (key->unicode) {
Con_ProcessInputLine (il, key->code >= 256 ? (int) key->code
: key->unicode);
} else {
Con_ProcessInputLine (il, key->code);
}
}
static void
con_mouse_event (const IE_event_t *event)
{
}
static int
con_event_handler (const IE_event_t *ie_event, void *data)
{
static void (*handlers[ie_event_count]) (const IE_event_t *ie_event) = {
[ie_key] = con_key_event,
[ie_mouse] = con_mouse_event,
};
if (ie_event->type < 0 || ie_event->type >= ie_event_count
|| !handlers[ie_event->type]) {
return 0;
}
handlers[ie_event->type] (ie_event);
return 1;
}
static void
C_Init (void)
@ -833,11 +886,13 @@ C_Init (void)
setlocale (LC_ALL, "C-TRADITIONAL");
#endif
Key_PushEscape (con_enter_menu, 0);
Key_KeydestCallback (con_keydest_callback, 0);
Key_SetKeyEvent (key_message, C_KeyEvent, 0);
Key_SetKeyEvent (key_menu, C_KeyEvent, 0);
Key_SetKeyEvent (key_console, C_KeyEvent, 0);
con_event_id = IE_Add_Handler (con_event_handler, 0);
//Key_PushEscape (con_enter_menu, 0);
//Key_KeydestCallback (con_keydest_callback, 0);
//Key_SetKeyEvent (key_message, C_KeyEvent, 0);
//Key_SetKeyEvent (key_menu, C_KeyEvent, 0);
//Key_SetKeyEvent (key_console, C_KeyEvent, 0);
Menu_Init ();
con_notifytime = Cvar_Get ("con_notifytime", "3", CVAR_NONE, NULL,
@ -966,6 +1021,7 @@ static console_funcs_t plugin_info_console_funcs = {
.draw_console = C_DrawConsole,
.check_resize = C_CheckResize,
.new_map = C_NewMap,
.set_state = C_SetState,
};
static plugin_funcs_t plugin_info_funcs = {

View file

@ -157,6 +157,14 @@ Con_Print (const char *fmt, va_list args)
vfprintf (stdout, fmt, args);
}
VISIBLE void
Con_SetState (con_state_t state)
{
if (con_module) {
con_module->functions->console->set_state (state);
}
}
VISIBLE void
Con_ProcessInput (void)
{

View file

@ -82,7 +82,7 @@ static cvar_t *confirm_quit;
static progs_t menu_pr_state;
static menu_item_t *menu;
static keydest_t menu_keydest;
//static keydest_t menu_keydest;
static hashtab_t *menu_hash;
static func_t menu_init;
static func_t menu_quit;
@ -358,13 +358,13 @@ bi_Menu_TopMenu (progs_t *pr)
free ((char *) top_menu);
top_menu = strdup (name);
}
/*
static void
menu_leave (void *data)
{
Menu_Leave ();
}
*/
static void
bi_Menu_SelectMenu (progs_t *pr)
{
@ -374,11 +374,11 @@ bi_Menu_SelectMenu (progs_t *pr)
if (name && *name)
menu = Hash_Find (menu_hash, name);
if (menu) {
if (Key_GetKeyDest () != key_menu) {
/*if (Key_GetKeyDest () != key_menu) {
menu_keydest = Key_GetKeyDest ();
Key_PushEscape (menu_leave, 0);
Key_SetKeyDest (key_menu);
}
}*/
if (menu->enter_hook) {
run_menu_pre ();
PR_ExecuteProgram (&menu_pr_state, menu->enter_hook);
@ -387,8 +387,8 @@ bi_Menu_SelectMenu (progs_t *pr)
} else {
if (name && *name)
Sys_Printf ("no menu \"%s\"\n", name);
Key_PopEscape ();
Key_SetKeyDest (menu_keydest);
//Key_PopEscape ();
//Key_SetKeyDest (menu_keydest);
}
}
@ -473,8 +473,8 @@ bi_Menu_Leave (progs_t *pr)
}
menu = menu->parent;
if (!menu) {
Key_PopEscape ();
Key_SetKeyDest (menu_keydest);
//Key_PopEscape ();
//Key_SetKeyDest (menu_keydest);
}
}
}
@ -775,15 +775,15 @@ Menu_KeyEvent (knum_t key, short unicode, qboolean down)
return 0;
switch (key) {
case QFK_DOWN:
case QFM_WHEEL_DOWN:
// case QFM_WHEEL_DOWN:
bi_Menu_Next (&menu_pr_state);
return 1;
case QFK_UP:
case QFM_WHEEL_UP:
// case QFM_WHEEL_UP:
bi_Menu_Prev (&menu_pr_state);
return 1;
case QFK_RETURN:
case QFM_BUTTON1:
// case QFM_BUTTON1:
bi_Menu_Enter (&menu_pr_state);
return 1;
default:
@ -795,14 +795,14 @@ void
Menu_Enter ()
{
if (!top_menu) {
Key_SetKeyDest (key_console);
//Key_SetKeyDest (key_console);
return;
}
menu = Hash_Find (menu_hash, top_menu);
if (menu) {
menu_keydest = Key_GetKeyDest ();
Key_PushEscape (menu_leave, 0);
Key_SetKeyDest (key_menu);
//menu_keydest = Key_GetKeyDest ();
//Key_PushEscape (menu_leave, 0);
//Key_SetKeyDest (key_menu);
if (menu->enter_hook) {
run_menu_pre ();
PR_ExecuteProgram (&menu_pr_state, menu->enter_hook);
@ -822,8 +822,8 @@ Menu_Leave ()
}
menu = menu->parent;
if (!menu) {
Key_PopEscape ();
Key_SetKeyDest (menu_keydest);
//Key_PopEscape ();
//Key_SetKeyDest (menu_keydest);
}
}
r_data->vid->recalc_refdef = true;

View file

@ -47,6 +47,7 @@
static void
Key_GIB_Bind_Get_f (void)
{
#if 0
const char *key, *cmd;
imt_t *imt;
int k;
@ -68,6 +69,7 @@ Key_GIB_Bind_Get_f (void)
GIB_Return ("");
else
GIB_Return (cmd);
#endif
}
void

View file

@ -18,7 +18,6 @@ libs_input_libQFinput_la_LDFLAGS= $(lib_ldflags)
libs_input_libQFinput_la_LIBADD= $(input_deps)
libs_input_libQFinput_la_DEPENDENCIES= $(input_deps)
libs_input_libQFinput_la_SOURCES= \
libs/input/keys.c \
libs/input/old_keys.c \
libs/input/in_axis.c \
libs/input/in_binding.c \

View file

@ -52,6 +52,7 @@
typedef struct DARRAY_TYPE (in_devbindings_t) in_devbindingset_t;
static in_devbindingset_t devbindings = DARRAY_STATIC_INIT (8);
static int in_binding_handler;
static void
in_binding_add_device (const IE_event_t *ie_event)
@ -133,13 +134,13 @@ in_binding_button (const IE_event_t *ie_event)
static int
in_binding_event_handler (const IE_event_t *ie_event, void *unused)
{
static void (*handlers[]) (const IE_event_t *ie_event) = {
static void (*handlers[ie_event_count]) (const IE_event_t *ie_event) = {
[ie_add_device] = in_binding_add_device,
[ie_remove_device] = in_binding_remove_device,
[ie_axis] = in_binding_axis,
[ie_button] = in_binding_button,
};
if (ie_event->type < 0 || ie_event->type > ie_button
if (ie_event->type < 0 || ie_event->type >= ie_event_count
|| !handlers[ie_event->type]) {
return 0;
}
@ -147,8 +148,105 @@ in_binding_event_handler (const IE_event_t *ie_event, void *unused)
return 1;
}
static void
in_bind_f (void)
{
}
static void
in_unbind_f (void)
{
}
static void
in_clear_f (void)
{
}
static void
in_devices_f (void)
{
}
static void
keyhelp_f (void)
{
}
typedef struct {
const char *name;
xcommand_t func;
const char *desc;
} bindcmd_t;
static bindcmd_t in_binding_commands[] = {
{ "in_bind", in_bind_f,
"Assign a command or a set of commands to a key.\n"
"Note: To bind multiple commands to a key, enclose the "
"commands in quotes and separate with semi-colons."
},
{ "in_unbind", in_unbind_f,
"Remove the bind from the the selected key"
},
{ "in_clear", in_clear_f,
"Remove all binds from the specified imts"
},
{ "in_devices", in_devices_f,
"List the known devices and their status."
},
{ "keyhelp", keyhelp_f,
"Identify the next active input axis or button.\n"
"The identification includes the device binding name, axis or button "
"number, and (if known) the name of the axis or button. Axes and "
"buttons can always be bound by number, so even those for which a "
"name is not known, but" PACKAGE_NAME " sees, can be bound."
},
{ }
#if 0
{ "bindlist", Key_Bindlist_f,
"list all of the key bindings"
},
{ "unbindall", Key_Unbindall_f,
"Remove all binds (USE CAUTIOUSLY!!!"
},
{ "unbind", Key_Unbind_f,
"wrapper for in_unbind that uses in_bind_imt for the imt "
"parameter"
},
{ "bind", Key_Bind_f,
"wrapper for in_bind that uses "
"in_bind_imt for the imt parameter"
},
{ "imt", Key_InputMappingTable_f,
""
},
{ "imt_keydest", Key_IMT_Keydest_f,
""
},
{ "imt_create", Key_IMT_Create_f,
"create a new imt table:\n"
" imt_create <keydest> <imt_name> [chain_name]\n"
"\n"
"The new table will be attached to the specified keydest\n"
"imt_name must not already exist.\n"
"If given, chain_name must already exist and be on "
"keydest.\n"
},
{ "imt_drop_all", Key_IMT_Drop_All_f,
"delete all imt tables\n"
},
{ "in_type", Key_In_Type_f,
"Send the given string as simulated key presses."
},
#endif
};
void
IN_Binding_Init (void)
{
IE_Add_Handler (in_binding_event_handler, 0);
in_binding_handler = IE_Add_Handler (in_binding_event_handler, 0);
for (bindcmd_t *cmd = in_binding_commands; cmd->name; cmd++) {
Cmd_AddCommand (cmd->name, cmd->func, cmd->desc);
}
}

View file

@ -108,3 +108,9 @@ IE_Set_Focus (int handle)
IE_Send_Event (&event);
}
}
int
IE_Get_Focus (void)
{
return focus;
}

View file

@ -42,6 +42,7 @@
#include "QF/cmd.h"
#include "QF/hash.h"
#include "QF/sys.h"
#include "QF/va.h"
#include "QF/input/imt.h"
@ -56,6 +57,7 @@ static imt_blockset_t axis_blocks = DARRAY_STATIC_INIT (8);
static imt_blockset_t button_blocks = DARRAY_STATIC_INIT (8);
static in_contextset_t in_contexts = DARRAY_STATIC_INIT (8);
static size_t imt_current_context;
static imt_block_t * __attribute__((pure))
imt_find_block (imt_blockset_t *blockset, const char *device)
@ -149,6 +151,30 @@ IMT_CreateContext (void)
return ctx - in_contexts.a;
}
int
IMT_GetContext (void)
{
return imt_current_context;
}
void
IMT_SetContext (int ctx)
{
if ((size_t) ctx >= in_contexts.size) {
Sys_Error ("IMT_SetContext: invalid context %d", ctx);
}
imt_current_context = ctx;
}
void
IMT_SetContextCbuf (int ctx, cbuf_t *cbuf)
{
if ((size_t) ctx >= in_contexts.size) {
Sys_Error ("IMT_SetContextCbuf: invalid context %d", ctx);
}
in_contexts.a[imt_current_context].cbuf = cbuf;
}
static imt_t * __attribute__ ((pure))
imt_find_imt (in_context_t *ctx, const char *name)
{
@ -227,12 +253,64 @@ IMT_CreateIMT (int context, const char *imt_name, const char *chain_imt_name)
return 1;
}
void
qboolean
IMT_ProcessAxis (int axis, int value)
{
imt_t *imt = in_contexts.a[imt_current_context].active_imt;
while (imt) {
in_axisbinding_t *a = imt->axis_bindings.a[axis];
if (a) {
return true;
}
imt = imt->chain;
}
return false;
}
void
static void
process_binding (int button, int state, const char *cmd)
{
cbuf_t *cbuf = in_contexts.a[imt_current_context].cbuf;
if (!cbuf) {
return;
}
if (cmd[0] == '+') {
if (state) {
Cbuf_AddText (cbuf, va (0, "%s %d\n", cmd, button));
} else {
Cbuf_AddText (cbuf, va (0, "-%s %d\n", cmd + 1, button));
}
} else {
if (state) {
Cbuf_AddText (cbuf, va (0, "%s\n", cmd));
}
}
}
qboolean
IMT_ProcessButton (int button, int state)
{
imt_t *imt = in_contexts.a[imt_current_context].active_imt;
Sys_Printf ("IMT_ProcessButton: %d %d\n", button, state);
while (imt) {
in_buttonbinding_t *b = imt->button_bindings.a[button];
if (b) {
switch (b->type) {
case inb_button:
IN_ButtonAction (b->button, button, state);
break;
case inb_command:
//FIXME avoid repeat
process_binding (button, state, b->command);
break;
}
return true;
}
imt = imt->chain;
}
return false;
}

View file

@ -43,8 +43,10 @@
static void
bi_Key_keydown (progs_t *pr)
{
#if 0
int keynum = P_INT (pr, 0);
R_INT (pr) = keydown[keynum];
#endif
}
/*
@ -55,6 +57,7 @@ bi_Key_keydown (progs_t *pr)
static void
bi_Key_SetBinding (progs_t *pr)
{
#if 0
const char *imt_name = P_GSTRING (pr, 0);
int keynum = P_INT (pr, 1);
const char *binding = P_GSTRING (pr, 2);
@ -68,6 +71,7 @@ bi_Key_SetBinding (progs_t *pr)
if (imt) {
Key_SetBinding (imt, keynum, binding);
}
#endif
}
/*
@ -78,6 +82,7 @@ bi_Key_SetBinding (progs_t *pr)
static void
bi_Key_LookupBinding (progs_t *pr)
{
#if 0
const char *imt_name = P_GSTRING (pr, 0);
int bindnum = P_INT (pr, 1);
const char *binding = P_GSTRING (pr, 2);
@ -89,7 +94,7 @@ bi_Key_LookupBinding (progs_t *pr)
imt = Key_FindIMT (imt_name);
if (imt) {
for (i = 0; i < QFK_LAST; i++) {
//XXX keybind = imt->button_bindings.a[i].str;
keybind = imt->button_bindings.a[i].str;
if (keybind == NULL) {
continue;
}
@ -104,7 +109,8 @@ bi_Key_LookupBinding (progs_t *pr)
}
R_INT (pr) = keynum;
};
#endif
}
/*
bi_Key_CountBinding
@ -114,6 +120,7 @@ bi_Key_LookupBinding (progs_t *pr)
static void
bi_Key_CountBinding (progs_t *pr)
{
#if 0
const char *imt_name = P_GSTRING (pr, 0);
const char *binding = P_GSTRING (pr, 1);
int i, res = 0;
@ -123,7 +130,7 @@ bi_Key_CountBinding (progs_t *pr)
imt = Key_FindIMT (imt_name);
if (imt) {
for (i = 0; i < QFK_LAST; i++) {
//XXX keybind = imt->button_bindings.a[i].str;
keybind = imt->button_bindings.a[i].str;
if (keybind == NULL) {
continue;
}
@ -134,7 +141,8 @@ bi_Key_CountBinding (progs_t *pr)
}
R_INT (pr) = res;
};
#endif
}
/*
@ -145,16 +153,20 @@ bi_Key_CountBinding (progs_t *pr)
static void
bi_Key_KeynumToString (progs_t *pr)
{
#if 0
int keynum = P_INT (pr, 0);
RETURN_STRING (pr, Key_KeynumToString (keynum));
};
#endif
}
static void
bi_Key_StringToKeynum (progs_t *pr)
{
#if 0
const char *keyname = P_GSTRING (pr, 0);
R_INT (pr) = Key_StringToKeynum (keyname);
#endif
}
static builtin_t builtins[] = {

View file

@ -807,7 +807,9 @@ event_key (XEvent *event)
x11_key.shift = event->xmotion.state & 0xff;
XLateKey (&event->xkey, &x11_key.code, &x11_key.unicode);
in_x11_send_key_event ();
if (event->type == KeyPress) {
in_x11_send_key_event ();
}
}
static void

View file

@ -114,7 +114,7 @@ CL_WriteConfiguration (void)
return;
}
Key_WriteBindings (f);
//Key_WriteBindings (f);
Cvar_WriteVariables (f);
Qclose (f);
@ -321,7 +321,7 @@ CL_EstablishConnection (const char *host)
cls.demonum = -1; // not in the demo loop now
CL_SetState (ca_connected);
Key_SetKeyDest (cls.key_dest);
//Key_SetKeyDest (cls.key_dest);
}
/*
@ -497,7 +497,7 @@ CL_SetState (cactive_t state)
if (old_state != state) {
if (old_state == ca_active) {
// leaving active state
Key_SetKeyDest (key_console);
//Key_SetKeyDest (key_console);
S_AmbientOff ();
}
switch (state) {
@ -512,14 +512,14 @@ CL_SetState (cactive_t state)
cls.signon = so_none; // need all the signon messages
// before playing
cl.loading = true;
Key_SetKeyDest (cls.key_dest);
//Key_SetKeyDest (cls.key_dest);
IN_ClearStates ();
VID_SetCaption ("Connected");
break;
case ca_active:
// entering active state
cl.loading = false;
Key_SetKeyDest (cls.key_dest);
//Key_SetKeyDest (cls.key_dest);
IN_ClearStates ();
VID_SetCaption ("");
S_AmbientOn ();

View file

@ -847,13 +847,13 @@ Host_Init_Memory (void)
Sys_Printf ("%4.1f megabyte heap\n", host_mem_size->value);
}
#if 0
static void
host_keydest_callback (keydest_t kd, void *data)
{
host_in_game = kd == key_game;
}
#endif
void
Host_Init (void)
{
@ -888,7 +888,7 @@ Host_Init (void)
Mod_Init ();
Key_KeydestCallback (host_keydest_callback, 0);
//Key_KeydestCallback (host_keydest_callback, 0);
SV_Init ();

View file

@ -1642,13 +1642,13 @@ Sbar_GIB_Print_Center_f (void)
} else
Sbar_CenterPrint (GIB_Argv(1));
}
#if 0
static void
sbar_keydest_callback (keydest_t kd, void *data)
{
overlay_view->visible = kd == key_game;
}
#endif
void
Sbar_Init (void)
{
@ -1656,7 +1656,7 @@ Sbar_Init (void)
init_views ();
Key_KeydestCallback (sbar_keydest_callback, 0);
//Key_KeydestCallback (sbar_keydest_callback, 0);
for (i = 0; i < 10; i++) {
sb_nums[0][i] = r_funcs->Draw_PicFromWad (va (0, "num_%i", i));

View file

@ -237,7 +237,7 @@ CL_Chat_Flush_Ignores (void)
{
llist_flush (ignore_list);
}
#if 0
static void
CL_ChatInfo (int val)
{
@ -268,6 +268,7 @@ cl_chat_keydest (keydest_t keydest, void *data)
break;
}
}
#endif
void
CL_Chat_Init (void)
@ -277,5 +278,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);
//Key_KeydestCallback (cl_chat_keydest, 0);
}

View file

@ -1014,7 +1014,7 @@ CL_StartDemo (void)
Sys_Printf ("Playing demo from %s.\n", name->str);
cls.demoplayback = true;
Key_SetKeyDest (key_demo);
//Key_SetKeyDest (key_demo);
net_blocksend = 1;
if (type == 2) {
cls.demoplayback2 = true;

View file

@ -1146,7 +1146,7 @@ CL_SetState (cactive_t state)
if (old_state == ca_active) {
// leaving active state
IN_ClearStates ();
Key_SetKeyDest (key_console);
//Key_SetKeyDest (key_console);
// Auto demo recorder stops here
if (cl_autorecord->int_val && cls.demorecording)
@ -1155,7 +1155,7 @@ CL_SetState (cactive_t state)
// entering active state
VID_SetCaption (cls.servername->str);
IN_ClearStates ();
Key_SetKeyDest (key_game);
//Key_SetKeyDest (key_game);
// Auto demo recorder starts here
if (cl_autorecord->int_val && !cls.demoplayback
@ -1163,8 +1163,7 @@ CL_SetState (cactive_t state)
CL_Record (0, -1);
}
}
if (con_module)
con_module->data->console->force_commandline = (state != ca_active);
Con_SetState (state == ca_active ? con_inactive : con_fullscreen);
}
void
@ -1512,7 +1511,7 @@ Host_WriteConfiguration (void)
return;
}
Key_WriteBindings (f);
//Key_WriteBindings (f);
Cvar_WriteVariables (f);
Qclose (f);

View file

@ -1939,13 +1939,13 @@ Sbar_GIB_Print_Center_f (void)
} else
Sbar_CenterPrint (GIB_Argv(1));
}
#if 0
static void
sbar_keydest_callback (keydest_t kd, void *data)
{
overlay_view->visible = kd == key_game;
}
#endif
void
Sbar_Init (void)
{
@ -1953,7 +1953,7 @@ Sbar_Init (void)
init_views ();
Key_KeydestCallback (sbar_keydest_callback, 0);
//Key_KeydestCallback (sbar_keydest_callback, 0);
for (i = 0; i < 10; i++) {
sb_nums[0][i] = r_funcs->Draw_PicFromWad (va (0, "num_%i", i));

View file

@ -32,7 +32,7 @@
{
switch (key) {
case QFK_RETURN:
case QFM_BUTTON1:
//case QFM_BUTTON1:
[self next];
return 1;
default:

View file

@ -47,7 +47,7 @@
{
switch (key) {
case QFK_RETURN:
case QFM_BUTTON1:
//case QFM_BUTTON1:
[self toggle];
return 1;
default:

View file

@ -30,11 +30,11 @@
if (!ret) {
switch (key) {
case QFK_DOWN:
case QFM_WHEEL_DOWN:
//case QFM_WHEEL_DOWN:
[self next];
return 1;
case QFK_UP:
case QFM_WHEEL_UP:
//case QFM_WHEEL_UP:
[self prev];
return 1;
}

View file

@ -47,11 +47,11 @@ menu_key_sound =
{
switch (key) {
case QFK_DOWN:
case QFM_WHEEL_DOWN:
//case QFM_WHEEL_DOWN:
S_LocalSound ("misc/menu1.wav");
break;
case QFK_UP:
case QFM_WHEEL_UP:
//case QFM_WHEEL_UP:
S_LocalSound ("misc/menu1.wav");
break;
}
@ -231,19 +231,19 @@ int (int key, int unicode, int down) load_quickbup_keyevent =
{
switch (key) {
case QFK_DOWN:
case QFM_WHEEL_DOWN:
//case QFM_WHEEL_DOWN:
S_LocalSound ("misc/menu1.wav");
load_cursor++;
load_cursor %= MAX_QUICK;
return 1;
case QFK_UP:
case QFM_WHEEL_UP:
//case QFM_WHEEL_UP:
S_LocalSound ("misc/menu1.wav");
load_cursor += MAX_QUICK - 1;
load_cursor %= MAX_QUICK;
return 1;
case QFK_RETURN:
case QFM_BUTTON1:
//case QFM_BUTTON1:
if (loadable[load_cursor]) {
S_LocalSound ("misc/menu2.wav");
Menu_SelectMenu (nil);
@ -259,19 +259,19 @@ int (int key, int unicode, int down) load_keyevent =
{
switch (key) {
case QFK_DOWN:
case QFM_WHEEL_DOWN:
//case QFM_WHEEL_DOWN:
S_LocalSound ("misc/menu1.wav");
load_cursor++;
load_cursor %= MAX_SAVEGAMES + 1;
return 1;
case QFK_UP:
case QFM_WHEEL_UP:
//case QFM_WHEEL_UP:
S_LocalSound ("misc/menu1.wav");
load_cursor += MAX_SAVEGAMES;
load_cursor %= MAX_SAVEGAMES + 1;
return 1;
case QFK_RETURN:
case QFM_BUTTON1:
//case QFM_BUTTON1:
if (load_cursor == MAX_SAVEGAMES) {
load_cursor = 0;
scan_saves (1);
@ -290,19 +290,19 @@ int (int key, int unicode, int down) save_keyevent =
{
switch (key) {
case QFK_DOWN:
case QFM_WHEEL_DOWN:
//case QFM_WHEEL_DOWN:
S_LocalSound ("misc/menu1.wav");
save_cursor++;
save_cursor %= MAX_SAVEGAMES;
return 1;
case QFK_UP:
case QFM_WHEEL_UP:
//case QFM_WHEEL_UP:
S_LocalSound ("misc/menu1.wav");
save_cursor += MAX_SAVEGAMES - 1;
save_cursor %= MAX_SAVEGAMES;
return 1;
case QFK_RETURN:
case QFM_BUTTON1:
//case QFM_BUTTON1:
Menu_SelectMenu (nil);
Cbuf_AddText (sprintf ("save s%i.sav\n", save_cursor));
return 1;
@ -494,7 +494,7 @@ int (int key, int unicode, int down) lanconfig_keyevent =
[input_active processInput:(key >= 256 ? key : unicode)];
switch (key) {
case QFK_DOWN:
case QFM_WHEEL_DOWN:
//case QFM_WHEEL_DOWN:
if (!input_active) {
S_LocalSound ("misc/menu2.wav");
lanConfig_cursor ++;
@ -502,7 +502,7 @@ int (int key, int unicode, int down) lanconfig_keyevent =
}
return 1;
case QFK_UP:
case QFM_WHEEL_UP:
//case QFM_WHEEL_UP:
if (!input_active) {
S_LocalSound ("misc/menu2.wav");
lanConfig_cursor += NUM_LANCONFIG_CMDS - 1;

View file

@ -526,6 +526,7 @@ qwaq_input_event_handler (const IE_event_t *ie_event, void *_res)
event.when = ie_event->when * 1e-6 + Sys_DoubleTimeBase ();
switch (ie_event->type) {
case ie_event_count:
case ie_none:
case ie_gain_focus:
case ie_lose_focus:

View file

@ -205,7 +205,7 @@ BI_Init (progs_t *pr)
con_module->data->console->quit = quit_f;
con_module->data->console->cbuf = qwaq_cbuf;
}
Key_SetKeyDest (key_game);
//Key_SetKeyDest (key_game);
S_Init (0, &con_frametime);
//CDAudio_Init ();