summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: a32a122)
raw | patch | inline | side by side (parent: a32a122)
author | Jonathan Neuschäfer <j.neuschaefer@gmx.net> | |
Sat, 24 Dec 2011 17:28:05 +0000 (18:28 +0100) | ||
committer | Jonathan Neuschäfer <j.neuschaefer@gmx.net> | |
Sat, 24 Dec 2011 17:28:05 +0000 (18:28 +0100) |
src/screen_keydef.c | patch | blob | history |
diff --git a/src/screen_keydef.c b/src/screen_keydef.c
index 6ed3e332c53162571e42959fb11f361b8e1bce19..8174c0426e3a0f4c582a0e8edbdcb0b3c65804ca 100644 (file)
--- a/src/screen_keydef.c
+++ b/src/screen_keydef.c
#include <string.h>
#include <glib.h>
-#define STATIC_ITEMS 0
-#define STATIC_SUB_ITEMS 1
+static struct list_window *lw;
-#define LIST_ITEM_APPLY() ((unsigned)command_list_length)
-#define LIST_ITEM_SAVE() (LIST_ITEM_APPLY()+1)
-#define LIST_LENGTH() (LIST_ITEM_SAVE()+1)
+static command_definition_t *cmds = NULL;
+/** the number of commands */
+static unsigned command_n_commands = 0;
-static struct list_window *lw;
-static unsigned command_list_length = 0;
-static command_definition_t *cmds = NULL;
+/**
+ * the position of the "apply" item. It's the same as command_n_commands,
+ * because array subscripts start at 0, while numbers of items start at 1.
+ */
+#define command_item_apply (command_n_commands)
+
+/** the position of the "apply and save" item */
+#define command_item_save (command_item_apply + 1)
+/** the number of items on the "command" view */
+#define command_length (command_item_save + 1)
+
+
+/**
+ * The command being edited, represented by a array subscript to @cmds, or -1,
+ * if no command is being edited
+ */
static int subcmd = -1;
-static unsigned subcmd_length = 0;
-static unsigned subcmd_addpos = 0;
+
+/** The number of keys assigned to the current command */
+static unsigned subcmd_n_keys = 0;
+
+/** The position of the up ("[..]") item */
+#define subcmd_item_up 0
+
+/** The position of the "add a key" item */
+#define subcmd_item_add (subcmd_n_keys + 1)
+
+/** The number of items in the list_window, if there's a command being edited */
+#define subcmd_length (subcmd_item_add + 1)
+
+/** Check whether a given item is a key */
+#define subcmd_item_is_key(i) \
+ ((i) > subcmd_item_up && (i) < subcmd_item_add)
+
+/**
+ * Convert an item id (as in lw->selected) into a "key id", which is an array
+ * subscript to cmds[subcmd].keys.
+ */
+#define subcmd_item_to_key_id(i) ((i) - 1)
+
static int
keybindings_changed(void)
{
command_definition_t *orginal_cmds = get_command_definitions();
- size_t size = command_list_length * sizeof(command_definition_t);
+ size_t size = command_n_commands * sizeof(command_definition_t);
return memcmp(orginal_cmds, cmds, size);
}
{
if (keybindings_changed()) {
command_definition_t *orginal_cmds = get_command_definitions();
- size_t size = command_list_length * sizeof(command_definition_t);
+ size_t size = command_n_commands * sizeof(command_definition_t);
memcpy(orginal_cmds, cmds, size);
screen_status_printf(_("You have new key bindings"));
return fclose(f);
}
+/* TODO: rename to check_n_keys / subcmd_count_keys? */
static void
check_subcmd_length(void)
{
- subcmd_length = 0;
- while (subcmd_length < MAX_COMMAND_KEYS &&
- cmds[subcmd].keys[subcmd_length] > 0)
- ++subcmd_length;
-
- if (subcmd_length < MAX_COMMAND_KEYS) {
- subcmd_addpos = subcmd_length;
- subcmd_length++;
- } else
- subcmd_addpos = 0;
- subcmd_length += STATIC_SUB_ITEMS;
+ unsigned i;
+
+ /* this loops counts the continous valid keys at the start of the the keys
+ array, so make sure you don't have gaps */
+ for (i = 0; i < MAX_COMMAND_KEYS; i++)
+ if (cmds[subcmd].keys[i] == 0)
+ break;
+ subcmd_n_keys = i;
+
list_window_set_length(lw, subcmd_length);
}
{
static char buf[256];
- if (subcmd < 0) {
- if (idx == LIST_ITEM_APPLY())
+ if (subcmd == -1) {
+ if (idx == command_item_apply)
return _("===> Apply key bindings ");
- else if (idx == LIST_ITEM_SAVE())
+ if (idx == command_item_save)
return _("===> Apply & Save key bindings ");
- assert(idx < (unsigned)command_list_length);
+ assert(idx < (unsigned) command_n_commands);
return cmds[idx].name;
} else {
- if (idx == 0)
+ if (idx == subcmd_item_up)
return "[..]";
- idx--;
- if (idx == subcmd_addpos) {
+
+ if (idx == subcmd_item_add) {
g_snprintf(buf, sizeof(buf), "%d. %s",
- idx + 1, _("Add new key"));
+ idx, _("Add new key"));
return buf;
}
- assert(idx < MAX_COMMAND_KEYS && cmds[subcmd].keys[idx] > 0);
+ assert(subcmd_item_is_key(idx));
g_snprintf(buf, sizeof(buf),
- "%d. %-20s (%d) ",
- idx + 1,
- key2str(cmds[subcmd].keys[idx]),
- cmds[subcmd].keys[idx]);
+ "%d. %-20s (%d) ", idx,
+ key2str(cmds[subcmd].keys[subcmd_item_to_key_id(idx)]),
+ cmds[subcmd].keys[subcmd_item_to_key_id(idx)]);
return buf;
}
}
command_definition_t *current_cmds = get_command_definitions();
size_t cmds_size;
- command_list_length = 0;
- while (current_cmds[command_list_length].name)
- command_list_length++;
+ command_n_commands = 0;
+ while (current_cmds[command_n_commands].name)
+ command_n_commands++;
- cmds_size = (command_list_length+1) * sizeof(command_definition_t);
+ /* +1 for the terminator element */
+ cmds_size = (command_n_commands + 1) * sizeof(command_definition_t);
cmds = g_malloc0(cmds_size);
memcpy(cmds, current_cmds, cmds_size);
- command_list_length += STATIC_ITEMS;
}
subcmd = -1;
- list_window_set_length(lw, LIST_LENGTH());
+ list_window_set_length(lw, command_length);
}
static void
static const char *
keydef_title(char *str, size_t size)
{
- if (subcmd < 0)
+ if (subcmd == -1)
return _("Edit key bindings");
g_snprintf(str, size, _("Edit keys for %s"), cmds[subcmd].name);
switch(cmd) {
case CMD_PLAY:
- if (subcmd < 0) {
- if (lw->selected == LIST_ITEM_APPLY())
+ if (subcmd == -1) {
+ if (lw->selected == command_item_apply) {
apply_keys();
- else if (lw->selected == LIST_ITEM_SAVE()) {
+ } else if (lw->selected == command_item_save) {
apply_keys();
save_keys();
} else {
keydef_repaint();
}
} else {
- if (lw->selected == 0) { /* up */
- list_window_set_length(lw, LIST_LENGTH());
+ if (lw->selected == subcmd_item_up) {
+ list_window_set_length(lw, command_length);
list_window_set_cursor(lw, subcmd);
subcmd = -1;
keydef_repaint();
- } else
- assign_new_key(subcmd,
- lw->selected - STATIC_SUB_ITEMS);
+ } else {
+ /* TODO: subcmd_item_add should be handled
+ separately, just for clarity */
+ assign_new_key(subcmd, subcmd_item_to_key_id(lw->selected));
+ }
}
return true;
case CMD_GO_PARENT_DIRECTORY:
- if (subcmd >=0) {
- list_window_set_length(lw, LIST_LENGTH());
+ if (subcmd != -1) {
+ list_window_set_length(lw, command_length);
list_window_set_cursor(lw, subcmd);
subcmd = -1;
}
return true;
case CMD_DELETE:
- if (subcmd >= 0 && lw->selected >= STATIC_SUB_ITEMS)
- delete_key(subcmd, lw->selected - STATIC_SUB_ITEMS);
+ if (subcmd != -1 && subcmd_item_is_key(lw->selected))
+ delete_key(subcmd, subcmd_item_to_key_id(lw->selected));
+
return true;
case CMD_SAVE_PLAYLIST:
apply_keys();