diff --git a/include/QF/keys.h b/include/QF/keys.h index 449872ad9..caf8f55de 100644 --- a/include/QF/keys.h +++ b/include/QF/keys.h @@ -379,154 +379,7 @@ typedef enum { QFK_LAST } knum_t; -typedef enum { - key_unfocused, ///< engine has lost input focus - key_game, ///< Normal in-game key bindings - key_demo, ///< Demo playback key bindings - key_console, ///< Command console key bindings - key_message, ///< Message input line key bindings - key_menu, ///< Menu key bindings. - - key_last ///< enum size -} keydest_t; - #ifndef __QFCC__ -extern knum_t key_toggleconsole; - -/** Chain of input mapping tables ascociated with a keydest sub-system (game, - menu, etc). -*/ -typedef struct keytarget_s { - struct imt_s *imts; ///< list of tables attached to this target - struct imt_s *active; ///< currently active table in this target -} keytarget_t; - -extern int keydown[QFK_LAST]; - -/** Callback for handling key events based on keydest. - - \param key The key that was pressed or released for this event. - \param unicode The unicode value of the key. - \param down True if a press event, false if a release event. - \param data Callback specific data pointer as passed to Key_SetKeyDest -*/ -typedef void key_event_t (knum_t key, short unicode, qboolean down, - void *data); - -/** Set the fallback key event handler callback for the specified keydest. - - The fallback is for handling keys that have not been bound, thus allowing - the callback to handle large numbers of keys without having to create many - explicit bindings (eg, console input). - - If no callback has been set for a specific keydest, then the key event - is simply ignored. - - \param keydest The keydest for which the callback will be set. - \param callback The function to be called when an event occurs. - \param data Opaque data pointer passed to the callback. -*/ -void Key_SetKeyEvent (keydest_t keydest, key_event_t *callback, void *data); - -/** Callback for handling the escape key. - \param data Callback specific data pointer as passed to Key_PushEscape -*/ -typedef void key_escape_t (void *data); - -/** Push an escape key event handler callback. - - \param callback The function to be called when the escape key is pressed. - \param data Opaque data pointer passed to the callback. -*/ -void Key_PushEscape (key_escape_t *callback, void *data); - -/** Push an escape key event handler callback. -*/ -void Key_PopEscape (void); - -struct cbuf_s; - -void Key_Init (struct cbuf_s *cb); -void Key_Init_Cvars (void); -struct imt_s *Key_FindIMT (const char *imt_name) __attribute__((pure)); -void Key_CreateIMT (keydest_t kd, const char *imt_name, - const char *chain_imt_name); - -/** Handle a key press/release event. - - \param key The key that was pressed or released for this event. - \param unicode The unicode value of the key. - \param down True if a press event, false if a release event. -*/ -void Key_Event (knum_t key, short unicode, qboolean down); - -/** Handle loss or gain of input focus (usually in windowed enviroments). - - Sets the keydest target to key_unfocuses when input focus is lost. - - Triggers keydest callbacks. - - \bug Always sets the target to key_game when focus is gained. - - \param gain True if focus is gained, false if focus is lost. -*/ -void Key_FocusEvent (int gain); - -void Key_WriteBindings (QFile *f); - -/** Force all key states to unpressed. - - Sends a key release event for any keys that are seen as down. -*/ -void Key_ClearStates (void); - -/** Return a key binding in the specified input mapping table. - - \param imt The input mapping table from which to get the binding. - \param key The key for which to get the binding. - \return The command string bound to the key, or null if unbound. -*/ -const char *Key_GetBinding (struct imt_s *imt, knum_t key) __attribute__((pure)); - -/** Bind a command string to a key in the specified input mapping table. - - Only one command string can be bound to a key, but the command string may - contain multiple commands. - - \param imt The input mapping table in which the key will be bound. - \param keynum The key to which the command string will be bound. - \param binding The command string that will be bound. -*/ -void Key_SetBinding (struct imt_s *imt, knum_t keynum, const char *binding); - -/** Set the current keydest target. - - Triggers keydest callbacks. - - \param kd The keydest target to make current. -*/ -void Key_SetKeyDest(keydest_t kd); - -/** Get the current keydest target. - - \return The current keydest target. -*/ -keydest_t Key_GetKeyDest(void) __attribute__((pure)); - -/** keydest callback signature. - - \param kd The new current keydest target. - \param data Callback specific data pointer as passed to - Key_KeydestCallback -*/ -typedef void keydest_callback_t (keydest_t kd, void *data); - -/** Add a callback for when the keydest target changes. - - \param callback The callback to be added. - \param data Opaque data pointer passed to the callback. -*/ -void Key_KeydestCallback (keydest_callback_t *callback, void *data); /** Get the string representation of a key. diff --git a/libs/console/client.c b/libs/console/client.c index 06f740a20..ce4413efc 100644 --- a/libs/console/client.c +++ b/libs/console/client.c @@ -111,9 +111,6 @@ static view_t *hud_view; static qboolean con_initialized; -static keydest_t con_curr_keydest; -//static keydest_t con_prev_keydest; - static void ClearNotify (void) { @@ -158,11 +155,11 @@ ToggleChat_f (void) { Con_ClearTyping (input_line, 0); - if (con_curr_keydest == key_console && !con_data.force_commandline) { + //if (con_curr_keydest == key_console && !con_data.force_commandline) { //Key_SetKeyDest (key_game); - } else { + //} else { //Key_SetKeyDest (key_console); - } + //} ClearNotify (); } @@ -686,9 +683,9 @@ C_DrawConsole (void) if (console_view->ylen != con_data.lines) view_resize (console_view, console_view->xlen, con_data.lines); - say_view->visible = con_curr_keydest == key_message; + say_view->visible = 0;//FIXME console_view->visible = con_data.lines != 0; - menu_view->visible = con_curr_keydest == key_menu; + menu_view->visible = 0;//FIXME con_data.view->draw (con_data.view); } diff --git a/libs/input/Makemodule.am b/libs/input/Makemodule.am index 6bda3f0f3..79d0f851e 100644 --- a/libs/input/Makemodule.am +++ b/libs/input/Makemodule.am @@ -22,7 +22,8 @@ libs_input_libQFinput_la_SOURCES= \ libs/input/in_button.c \ libs/input/in_common.c \ libs/input/in_event.c \ - libs/input/in_imt.c + libs/input/in_imt.c \ + libs/input/keys.c EXTRA_LTLIBRARIES += \ libs/input/libinput_evdev.la diff --git a/libs/input/keys.c b/libs/input/keys.c index 87fc283f5..d519c3fb8 100644 --- a/libs/input/keys.c +++ b/libs/input/keys.c @@ -53,72 +53,6 @@ #include "compat.h" #include "old_keys.h" -static memsuper_t *binding_mem; -/* -static in_axisbinding_t * -alloc_axis_binding (void) -{ - return cmemalloc (binding_mem, sizeof (in_axisbinding_t)); -} -*/ -static void -free_axis_binding (in_axisbinding_t *binding) -{ - cmemfree (binding_mem, binding); -} - -static in_buttonbinding_t * -alloc_button_binding (void) -{ - return cmemalloc (binding_mem, sizeof (in_buttonbinding_t)); -} - -static void -free_button_binding (in_buttonbinding_t *binding) -{ - cmemfree (binding_mem, binding); -} - -/* key up events are sent even if in console mode */ - -static keydest_t key_dest = key_console; -static keytarget_t key_targets[key_last]; -VISIBLE knum_t key_toggleconsole = QFK_BACKQUOTE; - -typedef struct { - keydest_callback_t *func; - void *data; -} keydest_callback_item_t; - -typedef struct { - key_escape_t *func; - void *data; -} key_escape_item_t; - -#define CALLBACK_CHUNK 16 -static struct DARRAY_TYPE(keydest_callback_item_t) keydest_callbacks = { - .grow = CALLBACK_CHUNK -}; -static struct DARRAY_TYPE(key_escape_item_t) key_escape_callbacks = { - .grow = CALLBACK_CHUNK -}; - -VISIBLE int keydown[QFK_LAST]; - -static int keyhelp; -static cbuf_t *cbuf; - -static const char *keydest_names[] = { - "key_unfocused", - "key_game", - "key_demo", - "key_console", - "key_message", - "key_menu", - - "key_last" -}; - typedef struct { const char *name; knum_t keynum; @@ -438,287 +372,9 @@ keyname_t keynames[] = { { "K_BACK", QFK_BACK }, { "K_FORWARD", QFK_FORWARD }, - { "M_BUTTON1", QFM_BUTTON1 }, - { "M_BUTTON2", QFM_BUTTON2 }, - { "M_BUTTON3", QFM_BUTTON3 }, - { "M_WHEEL_UP", QFM_WHEEL_UP }, - { "M_WHEEL_DOWN", QFM_WHEEL_DOWN }, - { "M_BUTTON6", QFM_BUTTON6 }, - { "M_BUTTON7", QFM_BUTTON7 }, - { "M_BUTTON8", QFM_BUTTON8 }, - { "M_BUTTON9", QFM_BUTTON9 }, - { "M_BUTTON10", QFM_BUTTON10 }, - { "M_BUTTON11", QFM_BUTTON11 }, - { "M_BUTTON12", QFM_BUTTON12 }, - { "M_BUTTON13", QFM_BUTTON13 }, - { "M_BUTTON14", QFM_BUTTON14 }, - { "M_BUTTON15", QFM_BUTTON15 }, - { "M_BUTTON16", QFM_BUTTON16 }, - { "M_BUTTON17", QFM_BUTTON17 }, - { "M_BUTTON18", QFM_BUTTON18 }, - { "M_BUTTON19", QFM_BUTTON19 }, - { "M_BUTTON20", QFM_BUTTON20 }, - { "M_BUTTON21", QFM_BUTTON21 }, - { "M_BUTTON22", QFM_BUTTON22 }, - { "M_BUTTON23", QFM_BUTTON23 }, - { "M_BUTTON24", QFM_BUTTON24 }, - { "M_BUTTON25", QFM_BUTTON25 }, - { "M_BUTTON26", QFM_BUTTON26 }, - { "M_BUTTON27", QFM_BUTTON27 }, - { "M_BUTTON28", QFM_BUTTON28 }, - { "M_BUTTON29", QFM_BUTTON29 }, - { "M_BUTTON30", QFM_BUTTON30 }, - { "M_BUTTON31", QFM_BUTTON31 }, - { "M_BUTTON32", QFM_BUTTON32 }, - - { "J_BUTTON1", QFJ_BUTTON1 }, - { "J_BUTTON2", QFJ_BUTTON2 }, - { "J_BUTTON3", QFJ_BUTTON3 }, - { "J_BUTTON4", QFJ_BUTTON4 }, - { "J_BUTTON5", QFJ_BUTTON5 }, - { "J_BUTTON6", QFJ_BUTTON6 }, - { "J_BUTTON7", QFJ_BUTTON7 }, - { "J_BUTTON8", QFJ_BUTTON8 }, - { "J_BUTTON9", QFJ_BUTTON9 }, - { "J_BUTTON10", QFJ_BUTTON10 }, - { "J_BUTTON11", QFJ_BUTTON11 }, - { "J_BUTTON12", QFJ_BUTTON12 }, - { "J_BUTTON13", QFJ_BUTTON13 }, - { "J_BUTTON14", QFJ_BUTTON14 }, - { "J_BUTTON15", QFJ_BUTTON15 }, - { "J_BUTTON16", QFJ_BUTTON16 }, - { "J_BUTTON17", QFJ_BUTTON17 }, - { "J_BUTTON18", QFJ_BUTTON18 }, - { "J_BUTTON19", QFJ_BUTTON19 }, - { "J_BUTTON20", QFJ_BUTTON20 }, - { "J_BUTTON21", QFJ_BUTTON21 }, - { "J_BUTTON22", QFJ_BUTTON22 }, - { "J_BUTTON23", QFJ_BUTTON23 }, - { "J_BUTTON24", QFJ_BUTTON24 }, - { "J_BUTTON25", QFJ_BUTTON25 }, - { "J_BUTTON26", QFJ_BUTTON26 }, - { "J_BUTTON27", QFJ_BUTTON27 }, - { "J_BUTTON28", QFJ_BUTTON28 }, - { "J_BUTTON29", QFJ_BUTTON29 }, - { "J_BUTTON30", QFJ_BUTTON30 }, - { "J_BUTTON31", QFJ_BUTTON31 }, - { "J_BUTTON32", QFJ_BUTTON32 }, - { "J_BUTTON33", QFJ_BUTTON33 }, - { "J_BUTTON34", QFJ_BUTTON34 }, - { "J_BUTTON35", QFJ_BUTTON35 }, - { "J_BUTTON36", QFJ_BUTTON36 }, - { "J_BUTTON37", QFJ_BUTTON37 }, - { "J_BUTTON38", QFJ_BUTTON38 }, - { "J_BUTTON39", QFJ_BUTTON39 }, - { "J_BUTTON40", QFJ_BUTTON40 }, - { "J_BUTTON41", QFJ_BUTTON41 }, - { "J_BUTTON42", QFJ_BUTTON42 }, - { "J_BUTTON43", QFJ_BUTTON43 }, - { "J_BUTTON44", QFJ_BUTTON44 }, - { "J_BUTTON45", QFJ_BUTTON45 }, - { "J_BUTTON46", QFJ_BUTTON46 }, - { "J_BUTTON47", QFJ_BUTTON47 }, - { "J_BUTTON48", QFJ_BUTTON48 }, - { "J_BUTTON49", QFJ_BUTTON49 }, - { "J_BUTTON50", QFJ_BUTTON50 }, - { "J_BUTTON51", QFJ_BUTTON51 }, - { "J_BUTTON52", QFJ_BUTTON52 }, - { "J_BUTTON53", QFJ_BUTTON53 }, - { "J_BUTTON54", QFJ_BUTTON54 }, - { "J_BUTTON55", QFJ_BUTTON55 }, - { "J_BUTTON56", QFJ_BUTTON56 }, - { "J_BUTTON57", QFJ_BUTTON57 }, - { "J_BUTTON58", QFJ_BUTTON58 }, - { "J_BUTTON59", QFJ_BUTTON59 }, - { "J_BUTTON60", QFJ_BUTTON60 }, - { "J_BUTTON61", QFJ_BUTTON61 }, - { "J_BUTTON62", QFJ_BUTTON62 }, - { "J_BUTTON63", QFJ_BUTTON63 }, - { "J_BUTTON64", QFJ_BUTTON64 }, - - { "J_AXIS1", QFJ_AXIS1 }, - { "J_AXIS2", QFJ_AXIS2 }, - { "J_AXIS3", QFJ_AXIS3 }, - { "J_AXIS4", QFJ_AXIS4 }, - { "J_AXIS5", QFJ_AXIS5 }, - { "J_AXIS6", QFJ_AXIS6 }, - { "J_AXIS7", QFJ_AXIS7 }, - { "J_AXIS8", QFJ_AXIS8 }, - { "J_AXIS9", QFJ_AXIS9 }, - { "J_AXIS10", QFJ_AXIS10 }, - { "J_AXIS11", QFJ_AXIS11 }, - { "J_AXIS12", QFJ_AXIS12 }, - { "J_AXIS13", QFJ_AXIS13 }, - { "J_AXIS14", QFJ_AXIS14 }, - { "J_AXIS15", QFJ_AXIS15 }, - { "J_AXIS16", QFJ_AXIS16 }, - { "J_AXIS17", QFJ_AXIS17 }, - { "J_AXIS18", QFJ_AXIS18 }, - { "J_AXIS19", QFJ_AXIS19 }, - { "J_AXIS20", QFJ_AXIS20 }, - { "J_AXIS21", QFJ_AXIS21 }, - { "J_AXIS22", QFJ_AXIS22 }, - { "J_AXIS23", QFJ_AXIS23 }, - { "J_AXIS24", QFJ_AXIS24 }, - { "J_AXIS25", QFJ_AXIS25 }, - { "J_AXIS26", QFJ_AXIS26 }, - { "J_AXIS27", QFJ_AXIS27 }, - { "J_AXIS28", QFJ_AXIS28 }, - { "J_AXIS29", QFJ_AXIS29 }, - { "J_AXIS30", QFJ_AXIS30 }, - { "J_AXIS31", QFJ_AXIS31 }, - { "J_AXIS32", QFJ_AXIS32 }, - {NULL, 0} }; -static __attribute__((pure)) imt_t * -key_target_find_imt (keytarget_t *kt, const char *imt_name) -{ - imt_t *imt; - for (imt = kt->imts; imt; imt = imt->next) { - if (!strcasecmp (imt->name, imt_name)) { - return imt; - } - } - return 0; -} - -VISIBLE imt_t * -Key_FindIMT (const char *imt_name) -{ - keydest_t kd; - imt_t *imt = 0; - - for (kd = key_unfocused; !imt && kd < key_last; kd++) { - imt = key_target_find_imt (&key_targets[kd], imt_name); - } - return imt; -} - -void -Key_CreateIMT (keydest_t kd, const char *imt_name, const char *chain_imt_name) -{ - imt_t *imt; - imt_t *chain_imt = 0; - keytarget_t *kt = &key_targets[kd]; - - imt = Key_FindIMT (imt_name); - if (imt) { - Sys_Printf ("imt error: imt %s already exists\n", imt_name); - return; - } - if (chain_imt_name) { - chain_imt = Key_FindIMT (chain_imt_name); - if (!chain_imt) { - Sys_Printf ("imt error: chain imt %s does not exist\n", - chain_imt_name); - return; - } - imt = key_target_find_imt (kt, chain_imt_name); - if (!imt) { - Sys_Printf ("imt error: chain imt %s not on target key " - "destination\n", chain_imt_name); - return; - } - } - imt = calloc (1, sizeof (imt_t)); - imt->name = strdup (imt_name); - imt->chain = chain_imt; - imt->next = kt->imts; - kt->imts = imt; - if (!kt->active) { - kt->active = imt; - } -} - -VISIBLE void -Key_SetBinding (imt_t *imt, knum_t keynum, const char *binding) -{ - if (keynum == (knum_t) -1) - return; - - if (imt->button_bindings.a[keynum]) { - if (imt->button_bindings.a[keynum]->type == inb_command) { - free (imt->button_bindings.a[keynum]->command); - } - free_button_binding (imt->button_bindings.a[keynum]); - imt->button_bindings.a[keynum] = 0; - } - if (binding) { - in_buttonbinding_t *b = alloc_button_binding (); - imt->button_bindings.a[keynum] = b; - in_button_t *button; - if (binding[0] == '+' && (button = IN_FindButton (binding + 1))) { - b->type = inb_button; - b->bind_id = keynum; //FIXME alloc? - b->button = button; - } else { - b->type = inb_command; - b->command = strdup(binding); - } - } -} - -static void -Key_CallDestCallbacks (keydest_t kd) -{ - for (size_t i = 0; i < keydest_callbacks.size; i++) { - keydest_callback_item_t *cb = &keydest_callbacks.a[i]; - cb->func (kd, cb->data); - } -} - -static void -process_binding (knum_t key, const char *kb) -{ - char cmd[1024]; - - if (kb[0] == '+') { - if (keydown[key]) - snprintf (cmd, sizeof (cmd), "%s %d\n", kb, key); - else - snprintf (cmd, sizeof (cmd), "-%s %d\n", kb + 1, key); - } else { - if (!keydown[key]) - return; - snprintf (cmd, sizeof (cmd), "%s\n", kb); - } - Cbuf_AddText (cbuf, cmd); -} - -/* - Key_Game - - Game key handling. -*/ -static qboolean -Key_Game (knum_t key, short unicode) -{ - imt_t *imt = key_targets[key_dest].active; - - while (imt) { - in_buttonbinding_t *b = imt->button_bindings.a[key]; - if (b) { - switch (b->type) { - case inb_button: - if (keydown[key] <= 1) { - IN_ButtonAction (b->button, key, keydown[key]); - } - break; - case inb_command: - if (keydown[key] <= 1) { - process_binding (key, b->command); - } - break; - } - return true; - } - imt = imt->chain; - } - return false; -} - VISIBLE int Key_StringToKeynum (const char *str) { @@ -748,708 +404,3 @@ Key_KeynumToString (knum_t keynum) return ""; } - -static void -Key_In_Unbind (const char *imt_name, const char *key_name) -{ - imt_t *imt; - int key; - - imt = Key_FindIMT (imt_name); - if (!imt) { - Sys_Printf ("\"%s\" is not a valid imt\n", imt_name); - return; - } - - key = Key_StringToKeynum (key_name); - if (key == -1) { - Sys_Printf ("\"%s\" is not a valid key\n", key_name); - return; - } - - Key_SetBinding (imt, key, NULL); -} - -static void -Key_In_Unbind_f (void) -{ - if (Cmd_Argc () != 3) { - Sys_Printf ("in_unbind : remove commands from a key\n"); - return; - } - Key_In_Unbind (Cmd_Argv (1), Cmd_Argv (2)); -} - -static void -Key_Unbindall_f (void) -{ - imt_t *imt; - int i; - - imt = Key_FindIMT ("imt_mod"); - if (imt) { - for (i = 0; i < QFK_LAST; i++) { - Key_SetBinding (imt, i, 0); - } - } -} - -static void -Key_In_Type_f (void) -{ - const char *str, *p; - if (Cmd_Argc () != 2) { - Sys_Printf ("in_type \n"); - Sys_Printf (" Send the given string as simulated key presses.\n"); - return; - } - str = Cmd_Argv (1); - for (p = str; *p; p++) { - Key_Event (QFK_UNKNOWN, *p, 1); - Key_Event (QFK_UNKNOWN, 0, 0); - } -} - -static void -Key_In_Clear (void) -{ - int err = 0; - imt_t *imt; - int i, j; - - if (Cmd_Argc () == 1) { - Sys_Printf ("in_clear ...\n"); - return; - } - for (i = 1; i < Cmd_Argc (); i++) { - if (!Key_FindIMT (Cmd_Argv (i))) { - Sys_Printf ("\"%s\" is not a valid imt\n", Cmd_Argv (i)); - err = 1; - } - } - if (err) - return; - for (i = 1; i < Cmd_Argc (); i++) { - imt = Key_FindIMT (Cmd_Argv (i)); - for (j = 0; j < QFK_LAST; j++) - Key_SetBinding (imt, j, NULL); - } -} - -static void -Key_IMT_Create_f (void) -{ - const char *keydest; - const char *imt_name; - const char *chain_imt_name = 0; - keydest_t kd; - - if (Cmd_Argc () < 3 || Cmd_Argc () > 4) { - Sys_Printf ("see help imt_create\n"); - return; - } - keydest = Cmd_Argv (1); - imt_name = Cmd_Argv (2); - if (Cmd_Argc () == 4) { - chain_imt_name = Cmd_Argv (3); - } - for (kd = key_game; kd < key_last; kd++) { - if (!strcasecmp (keydest_names[kd], keydest)) { - break; - } - } - if (kd == key_last) { - Sys_Printf ("imt error: invalid keydest: %s\n", keydest); - return; - } - Key_CreateIMT (kd, imt_name, chain_imt_name); -} - -static void -Key_IMT_Drop_All_f (void) -{ - keydest_t kd; - imt_t *imt; - - for (kd = key_unfocused; kd < key_last; kd++) { - while (key_targets[kd].imts) { - imt = key_targets[kd].imts; - key_targets[kd].imts = imt->next; - for (size_t i = 0; i < imt->axis_bindings.size; i++) { - free_axis_binding (imt->axis_bindings.a[i]); - } - for (size_t i = 0; i < imt->button_bindings.size; i++) { - in_buttonbinding_t *b = imt->button_bindings.a[i]; - if (b) { - switch (b->type) { - case inb_button: - break; - case inb_command: - free (b->command); - break; - } - free_button_binding (b); - } - } - free ((char *) imt->name); - free (imt); - } - key_targets[kd].active = 0; - } -} - -static void -Key_In_BindButton (const char *imt_name, const char *key_name, const char *cmd) -{ - imt_t *imt; - int key; - - imt = Key_FindIMT (imt_name); - if (!imt) { - Sys_Printf ("\"%s\" is not a valid imt\n", imt_name); - return; - } - - key = Key_StringToKeynum (key_name); - if (key == -1) { - Sys_Printf ("\"%s\" is not a valid key\n", key_name); - return; - } - - if (!cmd) { - in_buttonbinding_t *b = imt->button_bindings.a[key]; - if (b) { - switch (b->type) { - case inb_button: - Sys_Printf ("%s %s \"+%s\"\n", imt_name, key_name, - b->button->name); - break; - case inb_command: - Sys_Printf ("%s %s \"%s\"\n", imt_name, key_name, - b->command); - break; - } - } else { - Sys_Printf ("%s %s is not bound\n", imt_name, key_name); - } - return; - } - Key_SetBinding (imt, key, cmd); -} - -static void -Key_In_Bind_f (void) -{ - int c, i; - const char *imt, *key, *cmd = 0; - dstring_t *cmd_buf = 0; - - c = Cmd_Argc (); - - if (c < 4 || strcmp (Cmd_Argv (2), "button") != 0) { - Sys_Printf ("in_bind button [command]\n" - " attach a command to a key\n"); - return; - } - - imt = Cmd_Argv (1); - - key = Cmd_Argv (3); - - if (c >= 5) { - cmd_buf = dstring_newstr (); - for (i = 4; i < c; i++) { - dasprintf (cmd_buf, "%s%s", i > 3 ? " " : "", Cmd_Argv (i)); - } - cmd = cmd_buf->str; - } - - Key_In_BindButton (imt, key, cmd); - if (cmd_buf) { - dstring_delete (cmd_buf); - } -} - -static void -Key_Unbind_f (void) -{ - const char *key; - - if (Cmd_Argc () != 2) { - Sys_Printf ("unbind : remove commands from a key\n"); - return; - } - key = OK_TranslateKeyName (Cmd_Argv (1)); - Key_In_Unbind ("imt_mod", key); -} - -static void -Key_Bind_f (void) -{ - int c, i; - const char *key, *cmd = 0; - dstring_t *cmd_buf = 0; - - c = Cmd_Argc (); - - if (c < 2) { - Sys_Printf ("bind [command] : attach a command to a key\n"); - return; - } - - key = OK_TranslateKeyName (Cmd_Argv (1)); - - if (c >= 3) { - cmd_buf = dstring_newstr (); - for (i = 2; i < c; i++) { - dasprintf (cmd_buf, "%s%s", i > 2 ? " " : "", Cmd_Argv (i)); - } - cmd = cmd_buf->str; - } - - Key_In_BindButton ("imt_mod", key, cmd); - if (cmd_buf) { - dstring_delete (cmd_buf); - } -} - -static void -in_key_toggleconsole_f (cvar_t *var) -{ - int k; - - if (!*var->string) { - key_toggleconsole = -1; - return; - } - if ((k = Key_StringToKeynum (var->string)) == -1) { - Sys_Printf ("\"%s\" is not a valid key. not setting\n", - var->string); - return; - } - key_toggleconsole = k; -} - -static void -Key_InputMappingTable_f (void) -{ - int c; - imt_t *imt; - - c = Cmd_Argc (); - - if (c != 2) { - Sys_Printf ("Current imt is %s\n", key_targets[key_game].active->name); - Sys_Printf ("imt : set to a specific input mapping table\n"); - return; - } - - imt = Key_FindIMT (Cmd_Argv (1)); - if (!imt) { - Sys_Printf ("\"%s\" is not a valid imt\n", Cmd_Argv (1)); - return; - } - - key_targets[key_game].active = imt; -} - -static void -Key_IMT_Keydest_f (void) -{ - int c; - imt_t *imt; - const char *imt_name = 0; - const char *keydest; - keydest_t kd; - - c = Cmd_Argc (); - switch (c) { - case 3: - imt_name = Cmd_Argv (2); - case 2: - keydest = Cmd_Argv (1); - break; - default: - return; - } - for (kd = key_game; kd < key_last; kd++) { - if (!strcasecmp (keydest_names[kd], keydest)) { - break; - } - } - if (kd == key_last) { - Sys_Printf ("imt error: invalid keydest: %s\n", keydest); - return; - } - - if (!imt_name) { - Sys_Printf ("Current imt is %s\n", key_targets[key_game].active->name); - Sys_Printf ("imt : set to a specific input mapping table\n"); - return; - } - - imt = key_target_find_imt (&key_targets[kd], imt_name); - if (!imt) { - Sys_Printf ("\"%s\" is not an imt on %s\n", imt_name, keydest); - return; - } - - key_targets[kd].active = imt; -} - -static void __attribute__((format(PRINTF,2,3))) -key_printf (QFile *f, const char *fmt, ...) -{ - va_list args; - static dstring_t *string; - - if (!string) { - string = dstring_new (); - } - va_start (args, fmt); - dvsprintf (string, fmt, args); - va_end (args); - - if (f) { - Qprintf (f, "%s", string->str); - } else { - Sys_Printf ("%s", string->str); - } -} - -static void -key_write_imt (QFile *f, keydest_t kd, imt_t *imt) -{ - if (!imt || imt->written) { - return; - } - imt->written = 1; - key_write_imt (f, kd, imt->chain); - if (imt->chain) { - key_printf (f, "imt_create %s %s %s\n", keydest_names[kd], - imt->name, imt->chain->name); - } else { - key_printf (f, "imt_create %s %s\n", keydest_names[kd], imt->name); - } - for (size_t i = 0; i < imt->button_bindings.size; i++) { - in_buttonbinding_t *b = imt->button_bindings.a[i]; - if (b) { - switch (b->type) { - case inb_button: - key_printf (f, "in_bind %s button %s \"+%s\"\n", imt->name, - Key_KeynumToString (i), b->button->name); - break; - case inb_command: - key_printf (f, "in_bind %s button %s \"%s\"\n", imt->name, - Key_KeynumToString (i), b->command); - break; - } - } - } -} - -void -Key_WriteBindings (QFile *f) -{ - keydest_t kd; - imt_t *imt; - - for (kd = key_unfocused; kd < key_last; kd++) { - for (imt = key_targets[kd].imts; imt; imt = imt->next) { - imt->written = 0; - } - } - key_printf (f, "imt_drop_all\n"); - for (kd = key_unfocused; kd < key_last; kd++) { - if (key_targets[kd].imts) { - for (imt = key_targets[kd].imts; imt; imt = imt->next) { - key_write_imt (f, kd, imt); - } - key_printf (f, "imt_keydest %s %s\n", keydest_names[kd], - key_targets[kd].active->name); - } - } -} - -static void -Key_Bindlist_f (void) -{ - Key_WriteBindings (0); -} - -static void -keyhelp_f (void) -{ - keyhelp = 1; -} - -static key_event_t *key_event_handlers[key_last] = { }; -static void *key_event_data[key_last] = { }; - -VISIBLE void -Key_SetKeyEvent (keydest_t keydest, key_event_t *callback, void *data) -{ - if (keydest < 0 || keydest >= key_last) { - Sys_Error ("Key_SetKeyEvent: invalid keydest: %d", keydest); - } - key_event_handlers[keydest] = callback; - key_event_data[keydest] = data; -} - -/* - Key_Event - - Called by the system between frames for both key up and key down events - Should NOT be called during an interrupt! -*/ -VISIBLE void -Key_Event (knum_t key, short unicode, qboolean down) -{ -// Sys_Printf ("%d %d %d : %d\n", key_target, key_dest, key, down); //@@@ - - if (down) { - keydown[key]++; - if (keyhelp) { - Sys_Printf ("Key name for that key is \"%s\"\n", - Key_KeynumToString (key)); - keyhelp = 0; - return; // gobble the key - } - } else { - keydown[key] = 0; - } - - // handle the escape key specially so it can never be overridden or - // unbound - if (key == QFK_ESCAPE && keydown[key] == 1) { - if (key_escape_callbacks.size) { - int ind = key_escape_callbacks.size - 1; - key_escape_item_t cb = key_escape_callbacks.a[ind]; - cb.func (cb.data); - } - return; - } - //FIXME maybe still a tad over-coupled. Use callbacks for menu and console - //toggles? Should keys know anything about menu and console? - if (key_dest != key_console && key == key_toggleconsole - && keydown[key] == 1) { - Cbuf_AddText (cbuf, "toggleconsole"); - return; - } - - if (key_dest < 0 || key_dest >= key_last) { - Sys_Error ("Bad key_dest"); - } - - if (!Key_Game (key, unicode)) { - if (key_event_handlers[key_dest]) { - key_event_handlers[key_dest] (key, unicode, down, - key_event_data[key_dest]); - } - } -} - -VISIBLE void -Key_FocusEvent (int gain) -{ - if (gain) { - Key_CallDestCallbacks (key_dest); - } else { - Key_CallDestCallbacks (key_unfocused); - } -} - -void -Key_ClearStates (void) -{ - int i; - - for (i = 0; i < QFK_LAST; i++) { - if (keydown[i]) - Key_Event (i, 0, false); - keydown[i] = false; - } -} - -static struct { - keydest_t kd; - const char *imt_name; - const char *chain_imt_name; -} default_imts[] = { - {key_game, "imt_mod", 0}, - {key_game, "imt_0", "imt_mod"}, - {key_game, "imt_1", "imt_0"}, - {key_game, "imt_2", "imt_0"}, - {key_game, "imt_3", "imt_0"}, - {key_game, "imt_4", "imt_0"}, - {key_game, "imt_5", "imt_0"}, - {key_game, "imt_6", "imt_0"}, - {key_game, "imt_7", "imt_0"}, - {key_game, "imt_8", "imt_0"}, - {key_game, "imt_9", "imt_0"}, - {key_game, "imt_10", "imt_0"}, - {key_game, "imt_11", "imt_0"}, - {key_game, "imt_12", "imt_0"}, - {key_game, "imt_13", "imt_0"}, - {key_game, "imt_14", "imt_0"}, - {key_game, "imt_15", "imt_0"}, - {key_game, "imt_16", "imt_0"}, - {key_demo, "imt_demo", 0}, - {key_console, "imt_console", 0}, - {key_message, "imt_message", 0}, - {key_menu, "imt_menu", 0}, - {key_last, 0, 0}, -}; - -static struct { - const char *imt; - const char *key; - const char *command; -} default_bindings[] = { - {"imt_mod", "K_F10", "quit"}, - {"imt_mod", "K_BACKQUOTE", "toggleconsole"}, - {"imt_0", "K_F10", "quit"}, - {"imt_0", "K_BACKQUOTE", "toggleconsole"}, - {"imt_demo", "K_F10", "quit"}, - {"imt_demo", "K_BACKQUOTE", "toggleconsole"}, - {"imt_console", "K_F10", "quit"}, - {"imt_console", "K_BACKQUOTE", "toggleconsole"}, - {"imt_menu", "K_F10", "quit"}, - {"imt_console", "K_BACKQUOTE", "toggleconsole"}, - { } -}; - -static void -Key_CreateDefaultIMTs (void) -{ - int i; - - for (i = 0; default_imts[i].kd != key_last; i++) { - Key_CreateIMT (default_imts[i].kd, default_imts[i].imt_name, - default_imts[i].chain_imt_name); - } - for (i = 0; default_bindings[i].imt; i++) { - Key_In_BindButton (default_bindings[i].imt, default_bindings[i].key, - default_bindings[i].command); - } -} - -void -Key_Init (cbuf_t *cb) -{ - cbuf = cb; - - Key_CreateDefaultIMTs (); - - OK_Init (); - - // register our functions - Cmd_AddCommand ("in_bind", Key_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."); - Cmd_AddCommand ("in_unbind", Key_In_Unbind_f, - "Remove the bind from the the selected key"); - Cmd_AddCommand ("unbindall", Key_Unbindall_f, - "Remove all binds (USE CAUTIOUSLY!!!)"); - Cmd_AddCommand ("in_clear", Key_In_Clear, - "Remove all binds from the specified imts"); - Cmd_AddCommand ("in_type", Key_In_Type_f, - "Send the given string as simulated key presses."); - Cmd_AddCommand ("imt", Key_InputMappingTable_f, ""); - Cmd_AddCommand ("imt_keydest", Key_IMT_Keydest_f, ""); - Cmd_AddCommand ("imt_create", Key_IMT_Create_f, - "create a new imt table:\n" - " imt_create [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"); - Cmd_AddCommand ("imt_drop_all", Key_IMT_Drop_All_f, - "delete all imt tables\n"); - Cmd_AddCommand ("bind", Key_Bind_f, "wrapper for in_bind that uses " - "in_bind_imt for the imt parameter"); - Cmd_AddCommand ("unbind", Key_Unbind_f, - "wrapper for in_unbind that uses in_bind_imt for the imt " - "parameter"); - Cmd_AddCommand ("bindlist", Key_Bindlist_f, "list all of the key bindings"); - Cmd_AddCommand ("keyhelp", keyhelp_f, "display the keyname for the next " - "RECOGNIZED key-press. If the key pressed produces no " - "output, " PACKAGE_NAME " does not recognise that key."); -} - -void -Key_Init_Cvars (void) -{ - Cvar_Get ("in_key_toggleconsole", "K_BACKQUOTE", CVAR_NONE, - in_key_toggleconsole_f, - "Key for toggling the console."); -} - -const char * -Key_GetBinding (imt_t *imt, knum_t key) -{ - if (imt) { - in_buttonbinding_t *b = imt->button_bindings.a[key]; - if (b) { - switch (b->type) { - case inb_button: - return va (0, "+%s", b->button->name); - case inb_command: - return b->command; - } - } - } - return 0; -} - -VISIBLE void -Key_SetKeyDest(keydest_t kd) -{ - if (kd < 0 || kd >= key_last) { - Sys_Error ("Bad key_dest: %d", kd); - } - Sys_MaskPrintf (SYS_input, "Key_SetKeyDest: %s\n", keydest_names[kd]); - if (key_dest != kd) { - key_dest = kd; - Key_CallDestCallbacks (key_dest); - } -} - -VISIBLE keydest_t -Key_GetKeyDest (void) -{ - return key_dest; -} - -VISIBLE void -Key_KeydestCallback (keydest_callback_t *callback, void *data) -{ - if (!callback) { - Sys_Error ("null keydest callback"); - } - - keydest_callback_item_t cb = { callback, data }; - DARRAY_APPEND (&keydest_callbacks, cb); -} - -VISIBLE void -Key_PushEscape (key_escape_t *callback, void *data) -{ - if (!callback) { - Sys_Error ("null escape callback"); - } - - key_escape_item_t cb = { callback, data }; - DARRAY_APPEND (&key_escape_callbacks, cb); -} - -VISIBLE void -Key_PopEscape (void) -{ - if (!key_escape_callbacks.size) { - Sys_Error ("no escape callback to pop"); - } - DARRAY_REMOVE (&key_escape_callbacks); -} diff --git a/libs/ruamoko/rua_keys.c b/libs/ruamoko/rua_keys.c index 32229a4c4..11747304e 100644 --- a/libs/ruamoko/rua_keys.c +++ b/libs/ruamoko/rua_keys.c @@ -153,20 +153,16 @@ 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[] = { diff --git a/nq/include/client.h b/nq/include/client.h index 4a35a3770..4702aa44a 100644 --- a/nq/include/client.h +++ b/nq/include/client.h @@ -91,7 +91,6 @@ typedef struct { // connection information cactive_t state; signon_t signon; - keydest_t key_dest; // network stuff struct qsocket_s *netcon;