mirror of
https://github.com/ddnet/ddnet.git
synced 2024-11-13 11:38:19 +00:00
182 lines
3.4 KiB
C++
182 lines
3.4 KiB
C++
|
extern "C" {
|
||
|
#include <engine/e_console.h>
|
||
|
}
|
||
|
|
||
|
#include "binds.hpp"
|
||
|
|
||
|
BINDS::BINDS()
|
||
|
{
|
||
|
mem_zero(keybindings, sizeof(keybindings));
|
||
|
}
|
||
|
|
||
|
void BINDS::bind(int keyid, const char *str)
|
||
|
{
|
||
|
if(keyid < 0 && keyid >= KEY_LAST)
|
||
|
return;
|
||
|
|
||
|
str_copy(keybindings[keyid], str, sizeof(keybindings[keyid]));
|
||
|
if(!keybindings[keyid][0])
|
||
|
dbg_msg("binds", "unbound %s (%d)", inp_key_name(keyid), keyid);
|
||
|
else
|
||
|
dbg_msg("binds", "bound %s (%d) = %s", inp_key_name(keyid), keyid, keybindings[keyid]);
|
||
|
}
|
||
|
|
||
|
|
||
|
bool BINDS::on_input(INPUT_EVENT e)
|
||
|
{
|
||
|
// don't handle invalid events and keys that arn't set to anything
|
||
|
if(e.key <= 0 || e.key >= KEY_LAST || keybindings[e.key][0] == 0)
|
||
|
return false;
|
||
|
|
||
|
int stroke = 0;
|
||
|
if(e.flags&INPFLAG_PRESS)
|
||
|
stroke = 1;
|
||
|
console_execute_line_stroked(stroke, keybindings[e.key]);
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
void BINDS::unbindall()
|
||
|
{
|
||
|
for(int i = 0; i < KEY_LAST; i++)
|
||
|
keybindings[i][0] = 0;
|
||
|
}
|
||
|
|
||
|
const char *BINDS::get(int keyid)
|
||
|
{
|
||
|
if(keyid > 0 && keyid < KEY_LAST)
|
||
|
return keybindings[keyid];
|
||
|
return "";
|
||
|
}
|
||
|
|
||
|
void BINDS::set_defaults()
|
||
|
{
|
||
|
unbindall();
|
||
|
|
||
|
// set default key bindings
|
||
|
bind(KEY_F1, "toggle_local_console");
|
||
|
bind(KEY_F2, "toggle_remote_console");
|
||
|
bind(KEY_TAB, "+scoreboard");
|
||
|
bind(KEY_F10, "screenshot");
|
||
|
|
||
|
bind('A', "+left");
|
||
|
bind('D', "+right");
|
||
|
bind(KEY_SPACE, "+jump");
|
||
|
bind(KEY_MOUSE_1, "+fire");
|
||
|
bind(KEY_MOUSE_2, "+hook");
|
||
|
bind(KEY_LSHIFT, "+emote");
|
||
|
|
||
|
bind('1', "+weapon1");
|
||
|
bind('2', "+weapon2");
|
||
|
bind('3', "+weapon3");
|
||
|
bind('4', "+weapon4");
|
||
|
bind('5', "+weapon5");
|
||
|
|
||
|
bind(KEY_MOUSE_WHEEL_UP, "+prevweapon");
|
||
|
bind(KEY_MOUSE_WHEEL_DOWN, "+nextweapon");
|
||
|
|
||
|
bind('T', "chat all");
|
||
|
bind('Y', "chat team");
|
||
|
}
|
||
|
|
||
|
void BINDS::on_init()
|
||
|
{
|
||
|
set_defaults();
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
static int get_key_id(const char *key_name)
|
||
|
{
|
||
|
// check for numeric
|
||
|
if(key_name[0] == '#')
|
||
|
{
|
||
|
int i = atoi(key_name+1);
|
||
|
if(i > 0 && i < KEY_LAST)
|
||
|
return i; // numeric
|
||
|
}
|
||
|
|
||
|
// search for key
|
||
|
for(int i = 0; i < KEY_LAST; i++)
|
||
|
{
|
||
|
if(strcmp(key_name, inp_key_name(i)) == 0)
|
||
|
return i;
|
||
|
}
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
static void con_bind(void *result, void *user_data)
|
||
|
{
|
||
|
const char *key_name = console_arg_string(result, 0);
|
||
|
int id = get_key_id(key_name);
|
||
|
|
||
|
if(!id)
|
||
|
{
|
||
|
dbg_msg("binds", "key %s not found", key_name);
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
binds_set(id, console_arg_string(result, 1));
|
||
|
}
|
||
|
|
||
|
|
||
|
static void con_unbind(void *result, void *user_data)
|
||
|
{
|
||
|
const char *key_name = console_arg_string(result, 0);
|
||
|
int id = get_key_id(key_name);
|
||
|
|
||
|
if(!id)
|
||
|
{
|
||
|
dbg_msg("binds", "key %s not found", key_name);
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
binds_set(id, "");
|
||
|
}
|
||
|
|
||
|
|
||
|
static void con_unbindall(void *result, void *user_data)
|
||
|
{
|
||
|
binds_unbindall();
|
||
|
}
|
||
|
|
||
|
|
||
|
static void con_dump_binds(void *result, void *user_data)
|
||
|
{
|
||
|
for(int i = 0; i < KEY_LAST; i++)
|
||
|
{
|
||
|
if(keybindings[i][0] == 0)
|
||
|
continue;
|
||
|
dbg_msg("binds", "%s (%d) = %s", inp_key_name(i), i, keybindings[i]);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void binds_save()
|
||
|
{
|
||
|
char buffer[256];
|
||
|
char *end = buffer+sizeof(buffer)-8;
|
||
|
client_save_line("unbindall");
|
||
|
for(int i = 0; i < KEY_LAST; i++)
|
||
|
{
|
||
|
if(keybindings[i][0] == 0)
|
||
|
continue;
|
||
|
str_format(buffer, sizeof(buffer), "bind %s ", inp_key_name(i));
|
||
|
|
||
|
// process the string. we need to escape some characters
|
||
|
const char *src = keybindings[i];
|
||
|
char *dst = buffer + strlen(buffer);
|
||
|
*dst++ = '"';
|
||
|
while(*src && dst < end)
|
||
|
{
|
||
|
if(*src == '"' || *src == '\\') // escape \ and "
|
||
|
*dst++ = '\\';
|
||
|
*dst++ = *src++;
|
||
|
}
|
||
|
*dst++ = '"';
|
||
|
*dst++ = 0;
|
||
|
|
||
|
client_save_line(buffer);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
*/
|