summaryrefslogtreecommitdiff
path: root/src/keys.c
diff options
context:
space:
mode:
authorFrederic Culot <calcurse@culot.org>2008-11-23 20:38:55 +0000
committerFrederic Culot <calcurse@culot.org>2008-11-23 20:38:55 +0000
commiteb88eaecb3055fc5ab3cd3e05f0bc77e68f3942a (patch)
treec2ea254df263a1db681b82493392fa8f9639f477 /src/keys.c
parent9d4899110a067d4899116ac229c8b4c489096b60 (diff)
downloadcalcurse-eb88eaecb3055fc5ab3cd3e05f0bc77e68f3942a.zip
Building configuration menu to assign keybindings
Diffstat (limited to 'src/keys.c')
-rwxr-xr-xsrc/keys.c226
1 files changed, 220 insertions, 6 deletions
diff --git a/src/keys.c b/src/keys.c
index 4f8f9bc..bef1e9d 100755
--- a/src/keys.c
+++ b/src/keys.c
@@ -1,4 +1,4 @@
-/* $calcurse: keys.c,v 1.3 2008/11/16 17:42:53 culot Exp $ */
+/* $calcurse: keys.c,v 1.4 2008/11/23 20:38:56 culot Exp $ */
/*
* Calcurse - text-based organizer
@@ -25,9 +25,11 @@
*/
#include <string.h>
+#include <math.h>
#include "i18n.h"
#include "utils.h"
+#include "custom.h"
#include "keys.h"
#define MAXKEYVAL 256
@@ -104,7 +106,9 @@ dump_intro (FILE *fd)
"# To define bindings which use the CONTROL key, prefix the key with "
"'C-'.\n"
"# The escape and horizontal Tab key can be specified using the 'ESC'\n"
- "# and 'TAB' keyword, respectively.\n");
+ "# and 'TAB' keyword, respectively.\n#\n"
+ "# A description of what each ACTION keyword is used for is available\n"
+ "# from calcurse online configuration menu.\n");
fprintf (fd, "%s\n", intro);
}
@@ -144,7 +148,7 @@ keys_get_label (keys_e key)
return keydef[key].label;
}
-static int
+keys_e
keys_get_action (int pressed)
{
if (pressed < 0 || pressed > MAXKEYVAL)
@@ -256,7 +260,9 @@ keys_str2int (char *key)
return (int)key[0];
else
{
- if (!strncmp (key, CONTROL_KEY.str, CONTROL_KEY.len))
+ if (key[0] == '^')
+ return CTRL ((int)key[1]);
+ else if (!strncmp (key, CONTROL_KEY.str, CONTROL_KEY.len))
return CTRL ((int)key[CONTROL_KEY.len]);
else if (!strncmp (key, TAB_KEY.str, TAB_KEY.len))
return TAB;
@@ -270,13 +276,50 @@ keys_str2int (char *key)
char *
keys_int2str (int key)
{
- return keyname (key);
+ switch (key)
+ {
+ case TAB:
+ return "TAB";
+ case ESCAPE:
+ return "ESC";
+ default:
+ return keyname (key);
+ }
+}
+
+int
+keys_action_count_keys (keys_e action)
+{
+ struct key_str_s *key;
+ int i;
+
+ i = 0;
+ for (key = keys[action]; key; key = key->next)
+ i++;
+
+ return i;
}
char *
keys_action_firstkey (keys_e action)
{
- return (keys[action] != NULL) ? keys[action]->str : NULL;
+ return (keys[action] != NULL) ? keys[action]->str : "XXX";
+}
+
+char *
+keys_action_nkey (keys_e action, int keynum)
+{
+ struct key_str_s *key;
+ int i;
+
+ i = 0;
+ for (key = keys[action]; key; key = key->next)
+ {
+ if (i == keynum)
+ return key->str;
+ i++;
+ }
+ return (char *)0;
}
char *
@@ -298,3 +341,174 @@ keys_action_allkeys (keys_e action)
return keystr;
}
+
+/* Need this to display keys properly inside status bar. */
+static char *
+keys_format_label (char *key, int keylen)
+{
+ static char fmtkey[BUFSIZ];
+ const int len = strlen (key);
+ char *dot = ".";
+ int i;
+
+ if (keylen > BUFSIZ)
+ return (char *)0;
+
+ bzero (fmtkey, sizeof (fmtkey));
+ if (len == 0)
+ snprintf (fmtkey, sizeof (fmtkey), "?");
+ else if (len <= keylen)
+ {
+ for (i = 0; i < keylen - len; i++)
+ fmtkey[i] = ' ';
+ strncat (fmtkey, key, keylen);
+ }
+ else
+ {
+ for (i = 0; i < keylen - 1; i++)
+ fmtkey[i] = key[i];
+ strncat (fmtkey, dot, strlen (dot));
+ }
+ return fmtkey;
+}
+
+void
+keys_display_bindings_bar (WINDOW *win, binding_t **binding, int first_key,
+ int last_key)
+{
+ int i, j, cmdlen, space_between_cmds;
+
+ /* Total length of a command. */
+ cmdlen = KEYS_KEYLEN + 1 + KEYS_LABELEN;
+ space_between_cmds = floor (col / KEYS_CMDS_PER_LINE - cmdlen);
+ cmdlen += space_between_cmds;
+
+ j = 0;
+ erase_status_bar ();
+ for (i = first_key; i < last_key; i += 2)
+ {
+ char key[KEYS_KEYLEN + 1], *fmtkey;
+ const int KEY_POS = j * cmdlen;
+ const int LABEL_POS = j * cmdlen + KEYS_KEYLEN + 1;
+
+ strncpy (key, keys_action_firstkey (binding[i]->action), KEYS_KEYLEN);
+ fmtkey = keys_format_label (key, KEYS_KEYLEN);
+ custom_apply_attr (win, ATTR_HIGHEST);
+ mvwprintw (win, 0, KEY_POS, fmtkey);
+ if (i + 1 != last_key)
+ {
+ strncpy (key, keys_action_firstkey (binding[i + 1]->action),
+ KEYS_KEYLEN);
+ fmtkey = keys_format_label (key, KEYS_KEYLEN);
+ mvwprintw (win, 1, KEY_POS, fmtkey);
+ }
+ custom_remove_attr (win, ATTR_HIGHEST);
+ mvwprintw (win, 0, LABEL_POS, binding[i]->label);
+ if (i + 1 != last_key)
+ mvwprintw (win, 1, LABEL_POS, binding[i + 1]->label);
+ j++;
+ }
+ wnoutrefresh (win);
+}
+
+/*
+ * Display information about the given key.
+ * (could not add the keys descriptions to keydef variable, because of i18n).
+ */
+void
+keys_popup_info (keys_e key)
+{
+ char *info[NBKEYS];
+ WINDOW *infowin;
+
+ info[KEY_GENERIC_ESCAPE] =
+ _("Cancel the ongoing action.");
+ info[KEY_GENERIC_CREDITS] =
+ _("Print general information about calcurse's authors, license, etc.");
+ info[KEY_GENERIC_HELP] =
+ _("Display hints whenever some help screens are available.");
+ info[KEY_GENERIC_QUIT] =
+ _("Exit from the current menu, or quit calcurse.");
+ info[KEY_GENERIC_SAVE] =
+ _("Save calcurse data.");
+ info[KEY_GENERIC_CHANGE_VIEW] =
+ _("Select next panel in calcurse main screen.");
+ info[KEY_GENERIC_IMPORT] =
+ _("Import data from an external file.");
+ info[KEY_GENERIC_EXPORT] =
+ _("Export data to a new file format.");
+ info[KEY_GENERIC_GOTO] =
+ _("Select the day to go to.");
+ info[KEY_GENERIC_OTHER_CMD] =
+ _("Show next possible actions inside status bar.");
+ info[KEY_GENERIC_CONFIG_MENU] =
+ _("Enter the configuration menu.");
+ info[KEY_GENERIC_REDRAW] =
+ _("Redraw calcurse's screen.");
+ info[KEY_GENERIC_ADD_APPT] =
+ _("Add an appointment, whichever panel is currently selected.");
+ info[KEY_GENERIC_ADD_TODO] =
+ _("Add a todo item, whichever panel is currently selected.");
+ info[KEY_GENERIC_NEXT_DAY] =
+ _("Move to next day in calendar, whichever panel is currently selected.");
+ info[KEY_GENERIC_PREV_DAY] =
+ _("Move to previous day in calendar, whichever panel is currently "
+ "selected.");
+ info[KEY_GENERIC_NEXT_WEEK] =
+ _("Move to next week in calendar, whichever panel is currently selected.");
+ info[KEY_GENERIC_PREV_WEEK] =
+ _("Move to previous week in calendar, whichever panel is currently "
+ "selected");
+ info[KEY_GENERIC_SCROLL_DOWN] =
+ _("Scroll window down (e.g. when displaying text inside a popup window).");
+ info[KEY_GENERIC_SCROLL_UP] =
+ _("Scroll window up (e.g. when displaying text inside a popup window).");
+ info[KEY_GENERIC_GOTO_TODAY] =
+ _("Go to today, whichever panel is selected.");
+ info[KEY_MOVE_RIGHT] =
+ _("Move to the right.");
+ info[KEY_MOVE_LEFT] =
+ _("Move to the left.");
+ info[KEY_MOVE_DOWN] =
+ _("Move down.");
+ info[KEY_MOVE_UP] =
+ _("Move up.");
+ info[KEY_START_OF_WEEK] =
+ _("Select the first day of the current week when inside the calendar "
+ "panel.");
+ info[KEY_END_OF_WEEK] =
+ _("Select the last day of the current week when inside the calendar "
+ "panel.");
+ info[KEY_ADD_ITEM] =
+ _("Add an item to the currently selected panel.");
+ info[KEY_DEL_ITEM] =
+ _("Delete the currently selected item.");
+ info[KEY_EDIT_ITEM] =
+ _("Edit the currently seleted item.");
+ info[KEY_VIEW_ITEM] =
+ _("Display the currently selected item inside a popup window.");
+ info[KEY_FLAG_ITEM] =
+ _("Flag the currently selected item as important.");
+ info[KEY_REPEAT_ITEM] =
+ _("Repeat an item");
+ info[KEY_EDIT_NOTE] =
+ _("Attach (or edit if one exists) a note to the currently selected item");
+ info[KEY_VIEW_NOTE] =
+ _("View the note attached to the currently selected item.");
+ info[KEY_RAISE_PRIORITY] =
+ _("Raise a task priority inside the todo panel.");
+ info[KEY_LOWER_PRIORITY] =
+ _("Lower a task priority inside the todo panel.");
+
+ if (key < 0 || key > NBKEYS)
+ return;
+
+#define WINROW 10
+#define WINCOL (col - 4)
+ infowin = popup (WINROW, WINCOL, (row - WINROW) / 2, (col - WINCOL) / 2,
+ keydef[key].label, info[key], 1);
+ keys_getch (infowin);
+ delwin (infowin);
+#undef WINROW
+#undef WINCOL
+}