Code

Merge remote branches 'jn/cosmetics', 'jn/doxygen' and 'jn/renames'
[ncmpc.git] / src / screen_keydef.c
index d55d4c0d2999313e7de38e472913410e4ccfdc65..6e19d8d2bb924cb62a38e89bd4f157cffb4415fd 100644 (file)
@@ -1,5 +1,6 @@
-/*
- * (c) 2004 by Kalle Wallin <kaw@linux.se>
+/* ncmpc (Ncurses MPD Client)
+ * (c) 2004-2010 The Music Player Daemon Project
+ * Project homepage: http://musicpd.org
  *
  * 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
  * 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
  *
+ * 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.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
 
+#include "screen_keydef.h"
+#include "screen_interface.h"
+#include "screen_status.h"
+#include "screen_find.h"
 #include "i18n.h"
-#include "mpdclient.h"
-#include "options.h"
 #include "conf.h"
-#include "command.h"
 #include "screen.h"
 #include "screen_utils.h"
 
+#include <assert.h>
 #include <errno.h>
-#include <stdlib.h>
 #include <string.h>
 #include <glib.h>
 
@@ -41,7 +43,7 @@
 #define LIST_ITEM_APPLY_LABEL _("===> Apply key bindings ")
 
 
-static list_window_t *lw = NULL;
+static struct list_window *lw;
 static unsigned command_list_length = 0;
 static command_definition_t *cmds = NULL;
 
@@ -66,7 +68,7 @@ apply_keys(void)
                size_t size = command_list_length * sizeof(command_definition_t);
 
                memcpy(orginal_cmds, cmds, size);
-               screen_status_printf(_("You have new key bindings!"));
+               screen_status_printf(_("You have new key bindings"));
        } else
                screen_status_printf(_("Keybindings unchanged."));
 }
@@ -78,7 +80,7 @@ save_keys(void)
        char *filename;
 
        if (check_user_conf_dir()) {
-               screen_status_printf(_("Error: Unable to create direcory ~/.ncmpc - %s"),
+               screen_status_printf(_("Error: Unable to create directory ~/.ncmpc - %s"),
                                     strerror(errno));
                screen_bell();
                return -1;
@@ -116,6 +118,7 @@ check_subcmd_length(void)
        } else
                subcmd_addpos = 0;
        subcmd_length += STATIC_SUB_ITEMS;
+       list_window_set_length(lw, subcmd_length);
 }
 
 static void
@@ -148,18 +151,18 @@ delete_key(int cmd_index, int key_index)
 }
 
 static void
-assign_new_key(WINDOW *w, int cmd_index, int key_index)
+assign_new_key(int cmd_index, int key_index)
 {
        int key;
        char *buf;
        command_t cmd;
 
        buf = g_strdup_printf(_("Enter new key for %s: "), cmds[cmd_index].name);
-       key = screen_getch(w, buf);
+       key = screen_getch(buf);
        g_free(buf);
 
        if (key==ERR) {
-               screen_status_printf(_("Aborted!"));
+               screen_status_printf(_("Aborted"));
                return;
        }
 
@@ -187,37 +190,38 @@ assign_new_key(WINDOW *w, int cmd_index, int key_index)
 }
 
 static const char *
-list_callback(unsigned idx, int *highlight, G_GNUC_UNUSED void *data)
+list_callback(unsigned idx, G_GNUC_UNUSED void *data)
 {
        static char buf[BUFSIZE];
 
        if (subcmd < 0) {
-               if (idx < (unsigned)command_list_length) {
-                       if (cmds[idx].flags & COMMAND_KEY_CONFLICT)
-                               *highlight = 1;
-                       return cmds[idx].name;
-               } else if (idx == LIST_ITEM_APPLY())
+               if (idx == LIST_ITEM_APPLY())
                        return LIST_ITEM_APPLY_LABEL;
                else if (idx == LIST_ITEM_SAVE())
                        return LIST_ITEM_SAVE_LABEL;
+
+               assert(idx < (unsigned)command_list_length);
+
+               return cmds[idx].name;
        } else {
                if (idx == 0)
                        return "[..]";
                idx--;
-               if (idx < MAX_COMMAND_KEYS && cmds[subcmd].keys[idx] > 0) {
-                       g_snprintf(buf,
-                                  BUFSIZE, "%d. %-20s   (%d) ",
-                                  idx + 1,
-                                  key2str(cmds[subcmd].keys[idx]),
-                                  cmds[subcmd].keys[idx]);
-                       return buf;
-               } else if (idx == subcmd_addpos) {
-                       g_snprintf(buf, BUFSIZE, _("%d. Add new key "), idx + 1);
+               if (idx == subcmd_addpos) {
+                       g_snprintf(buf, BUFSIZE, "%d. %s",
+                                  idx + 1, _("Add new key"));
                        return buf;
                }
-       }
 
-       return NULL;
+               assert(idx < MAX_COMMAND_KEYS && cmds[subcmd].keys[idx] > 0);
+
+               g_snprintf(buf,
+                          BUFSIZE, "%d. %-20s   (%d) ",
+                          idx + 1,
+                          key2str(cmds[subcmd].keys[idx]),
+                          cmds[subcmd].keys[idx]);
+               return buf;
+       }
 }
 
 static void
@@ -229,8 +233,7 @@ keydef_init(WINDOW *w, int cols, int rows)
 static void
 keydef_resize(int cols, int rows)
 {
-       lw->cols = cols;
-       lw->rows = rows;
+       list_window_resize(lw, cols, rows);
 }
 
 static void
@@ -244,7 +247,7 @@ keydef_exit(void)
 }
 
 static void
-keydef_open(G_GNUC_UNUSED mpdclient_t *c)
+keydef_open(G_GNUC_UNUSED struct mpdclient *c)
 {
        if (cmds == NULL) {
                command_definition_t *current_cmds = get_command_definitions();
@@ -258,11 +261,10 @@ keydef_open(G_GNUC_UNUSED mpdclient_t *c)
                cmds = g_malloc0(cmds_size);
                memcpy(cmds, current_cmds, cmds_size);
                command_list_length += STATIC_ITEMS;
-               screen_status_printf(_("Welcome to the key editor!"));
        }
 
        subcmd = -1;
-       list_window_check_selected(lw, LIST_LENGTH());
+       list_window_set_length(lw, LIST_LENGTH());
 }
 
 static void
@@ -292,14 +294,12 @@ keydef_paint(void)
 }
 
 static bool
-keydef_cmd(G_GNUC_UNUSED mpdclient_t *c, command_t cmd)
+keydef_cmd(G_GNUC_UNUSED struct mpdclient *c, command_t cmd)
 {
-       int length = LIST_LENGTH();
-
-       if (subcmd >= 0)
-               length = subcmd_length;
+       if (cmd == CMD_LIST_RANGE_SELECT)
+               return false;
 
-       if (list_window_cmd(lw, length, cmd)) {
+       if (list_window_cmd(lw, cmd)) {
                keydef_repaint();
                return true;
        }
@@ -314,23 +314,32 @@ keydef_cmd(G_GNUC_UNUSED mpdclient_t *c, command_t cmd)
                                save_keys();
                        } else {
                                subcmd = lw->selected;
-                               lw->selected=0;
+                               list_window_reset(lw);
                                check_subcmd_length();
 
                                keydef_repaint();
                        }
                } else {
                        if (lw->selected == 0) { /* up */
-                               lw->selected = subcmd;
+                               list_window_set_length(lw, LIST_LENGTH());
+                               list_window_set_cursor(lw, subcmd);
                                subcmd = -1;
 
                                keydef_repaint();
                        } else
-                               assign_new_key(screen.status_window.w,
-                                              subcmd,
+                               assign_new_key(subcmd,
                                               lw->selected - STATIC_SUB_ITEMS);
                }
                return true;
+       case CMD_GO_PARENT_DIRECTORY:
+               if (subcmd >=0) {
+                       list_window_set_length(lw, LIST_LENGTH());
+                       list_window_set_cursor(lw, subcmd);
+                       subcmd = -1;
+
+                       keydef_repaint();
+               }
+               break;
        case CMD_DELETE:
                if (subcmd >= 0 && lw->selected >= STATIC_SUB_ITEMS)
                        delete_key(subcmd, lw->selected - STATIC_SUB_ITEMS);
@@ -344,8 +353,7 @@ keydef_cmd(G_GNUC_UNUSED mpdclient_t *c, command_t cmd)
        case CMD_LIST_RFIND:
        case CMD_LIST_FIND_NEXT:
        case CMD_LIST_RFIND_NEXT:
-               screen_find(lw, length,
-                           cmd, list_callback, NULL);
+               screen_find(lw, cmd, list_callback, NULL);
                keydef_repaint();
                return true;