/* * TTS - track your time. * Copyright (c) 2012-2014 Felicity Tarnell. * * Permission is granted to anyone to use this software for any purpose, * including commercial applications, and to alter it and redistribute it * freely. This software is provided 'as-is', without any express or implied * warranty. */ #include #include "bindings.h" #include "wide.h" #include "ui.h" binding_list_t bindings = TTS_TAILQ_HEAD_INITIALIZER(bindings); static tkey_t keys[] = { { KEY_BREAK, WIDE("") }, { KEY_DOWN, WIDE("") }, { KEY_UP, WIDE("") }, { KEY_LEFT, WIDE("") }, { KEY_RIGHT, WIDE("") }, { KEY_HOME, WIDE("") }, { KEY_BACKSPACE, WIDE("") }, { 0x7F, WIDE("") }, /* DEL */ { KEY_F(0), WIDE("") }, { KEY_F(1), WIDE("") }, { KEY_F(2), WIDE("") }, { KEY_F(3), WIDE("") }, { KEY_F(4), WIDE("") }, { KEY_F(5), WIDE("") }, { KEY_F(6), WIDE("") }, { KEY_F(7), WIDE("") }, { KEY_F(8), WIDE("") }, { KEY_F(9), WIDE("") }, { KEY_F(10), WIDE("") }, { KEY_F(11), WIDE("") }, { KEY_F(12), WIDE("") }, { KEY_F(13), WIDE("") }, { KEY_F(14), WIDE("") }, { KEY_F(15), WIDE("") }, { KEY_F(16), WIDE("") }, { KEY_F(17), WIDE("") }, { KEY_F(18), WIDE("") }, { KEY_F(19), WIDE("") }, { KEY_F(20), WIDE("") }, { KEY_F(21), WIDE("") }, { KEY_F(22), WIDE("") }, { KEY_F(23), WIDE("") }, { KEY_F(24), WIDE("") }, { KEY_NPAGE, WIDE("") }, { KEY_PPAGE, WIDE("") }, { '\001', WIDE("") }, { '\002', WIDE("") }, { '\003', WIDE("") }, { '\004', WIDE("") }, { '\005', WIDE("") }, { '\006', WIDE("") }, { '\007', WIDE("") }, { '\010', WIDE("") }, { '\011', WIDE("") }, { '\011', WIDE("") }, { '\012', WIDE("") }, { '\013', WIDE("") }, { '\014', WIDE("") }, { '\015', WIDE("") }, { '\016', WIDE("") }, { '\017', WIDE("") }, { '\020', WIDE("") }, { '\021', WIDE("") }, { '\022', WIDE("") }, { '\023', WIDE("") }, { '\024', WIDE("") }, { '\025', WIDE("") }, { '\026', WIDE("") }, { '\027', WIDE("") }, { '\030', WIDE("") }, { '\031', WIDE("") }, { ' ', WIDE("") }, { KEY_ENTER, WIDE("") }, { KEY_BACKSPACE, WIDE("") }, { KEY_DC, WIDE("") } }; /* * Bind .keyname to run the function .funcname. If a binding for .keyname * already exists, overwrite it. * * If .keyname is a single character, e.g. 'a', it is used as a key name * directly, rather than being looked up in the key table. */ void bind_key(keyname, funcname, is_macro) const WCHAR *keyname, *funcname; { tkey_t *key = NULL; function_t *func; binding_t *binding; INT code; /* Find the key and the function */ if (STRLEN(keyname) > 1) { if ((key = find_key(keyname)) == NULL) { errbox(WIDE("Unknown key \"%"FMT_L"s\""), keyname); return; } code = key->ky_code; } else code = *keyname; if (!is_macro) { if ((func = find_func(funcname)) == NULL) { errbox(WIDE("Unknown function \"%"FMT_L"s\""), funcname); return; } } /* Do we already have a binding for this key? */ TTS_TAILQ_FOREACH(binding, &bindings, bi_entries) { if (binding->bi_code == code) { if (is_macro) { binding->bi_func = NULL; binding->bi_macro = STRDUP(funcname); } else { free(binding->bi_macro); binding->bi_func = func; } return; } } /* No, add a new one */ if ((binding = calloc(1, sizeof(*binding))) == NULL) return; binding->bi_key = key; binding->bi_code = code; if (is_macro) binding->bi_macro = STRDUP(funcname); else binding->bi_func = func; TTS_TAILQ_INSERT_TAIL(&bindings, binding, bi_entries); } /* * Return the tkey_t for the key called .name, or NULL if such a key doesn't * exist. */ tkey_t * find_key(name) const WCHAR *name; { size_t i; for (i = 0; i < sizeof(keys) / sizeof(*keys); i++) if (STRCMP(name, keys[i].ky_name) == 0) return &keys[i]; return NULL; }