/* $calcurse: keys.c,v 1.2 2008/11/09 20:10:18 culot Exp $ */ /* * Calcurse - text-based organizer * Copyright (c) 2008 Frederic Culot * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. * * Send your feedback or comments to : calcurse@culot.org * Calcurse home page : http://culot.org/calcurse * */ #include "i18n.h" #include "utils.h" #include "htable.h" #include "keys.h" #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", "generic-change-view", "generic-import", "generic-export", "generic-goto", "generic-other-cmd", "generic-config-menu", "generic-redraw", "generic-add-appt", "generic-add-todo", "generic-next-ady", "generic-prev-day", "generic-next-week", "generic-prev-week", "generic-goto-today", "cal-next-day", "cal-prev-day", "cal-next-week", "cal-prev-week", "cal-start-of-week", "cal-end-of-week", "apt-add-item", "apt-del-item", "apt-edit-item", "apt-view-item", "apt-flag-item", "apt-repeat", "apt-move-up", "apt-move-down", "apt-edit-note", "apt-view-note", "todo-add-item", "todo-del-item", "todo-edit-item", "todo-view-item", "todo-raise-priority", "todo-lower-priority", "todo-move-up", "todo-move-down", "todo-edit-note", "todo-view-bote", "config-quit", "config-general-menu", "config-layout-menu", "config-color-menu", "config-notify-menu" }; 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]; } 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); }