summaryrefslogtreecommitdiff
path: root/src/keys.c
diff options
context:
space:
mode:
authorFrederic Culot <calcurse@culot.org>2008-11-09 20:10:18 +0000
committerFrederic Culot <calcurse@culot.org>2008-11-09 20:10:18 +0000
commite8f12c65ca0245079ae015a90e7a14109759cdda (patch)
treedc16f443c7209b8f93f1e21146f7c7d87d2cf56a /src/keys.c
parentf845721828a0000f1c7e30f35360417771788e0a (diff)
downloadcalcurse-e8f12c65ca0245079ae015a90e7a14109759cdda.zip
Loading of user-configurable keys implemented
Diffstat (limited to 'src/keys.c')
-rwxr-xr-xsrc/keys.c75
1 files changed, 71 insertions, 4 deletions
diff --git a/src/keys.c b/src/keys.c
index f024be9..2c0fc98 100755
--- a/src/keys.c
+++ b/src/keys.c
@@ -1,4 +1,4 @@
-/* $calcurse: keys.c,v 1.1 2008/11/08 19:05:15 culot Exp $ */
+/* $calcurse: keys.c,v 1.2 2008/11/09 20:10:18 culot Exp $ */
/*
* Calcurse - text-based organizer
@@ -26,9 +26,21 @@
#include "i18n.h"
#include "utils.h"
+#include "htable.h"
#include "keys.h"
-const char *keylabel[NOKEYS] = {
+#define HTKEYSIZE 512
+
+struct keys_s {
+ int key;
+ keys_e action;
+ HTABLE_ENTRY (keys_s);
+};
+
+static HTABLE_HEAD (ht_keys, HTKEYSIZE, keys_s) ht_keys_action =
+ HTABLE_INITIALIZER (&ht_keys_action);
+
+static char *keylabel[NOKEYS] = {
"generic-help",
"generic-quit",
"generic-save",
@@ -85,10 +97,65 @@ const char *keylabel[NOKEYS] = {
"config-notify-menu"
};
-char *keys_get_label (keys_e key)
+static void
+ht_getkey (struct keys_s *data, char **key, int *len)
+{
+ *key = (char *)&data->key;
+ *len = sizeof (int);
+}
+
+static int
+ht_compare (struct keys_s *data1, struct keys_s *data2)
+{
+ if (data1->key == data2->key)
+ return 0;
+ else
+ return 1;
+}
+
+HTABLE_GENERATE (ht_keys, keys_s, ht_getkey, ht_compare);
+
+char *
+keys_get_label (keys_e key)
{
EXIT_IF (key < 0 || key > NOKEYS,
_("FATAL ERROR in keys_get_label: key value out of bounds"));
- return keylabel (key);
+ return keylabel[key];
+}
+
+int
+keys_get_key (int pressed)
+{
+ struct keys_s *key, find;
+
+ find.key = pressed;
+ key = HTABLE_LOOKUP (ht_keys, &ht_keys_action, &find);
+
+ if (key)
+ return (int)key->action;
+ else
+ return -1;
+}
+
+void
+keys_assign_binding (int key, keys_e action)
+{
+ struct keys_s *binding;
+
+ binding = malloc (sizeof (struct keys_s));
+ binding->key = key;
+ binding->action = action;
+ HTABLE_INSERT (ht_keys, &ht_keys_action, binding);
+}
+
+void
+key_remove_binding (int key, keys_e action)
+{
+ struct keys_s find, *removed;
+
+ find.key = key;
+ find.action = action;
+ removed = HTABLE_REMOVE (ht_keys, &ht_keys_action, &find);
+ mem_free (removed);
}