Code

Added seek, crossfade commands.
[ncmpc.git] / command.c
index d2d1e68253d60403061678e58518b66141fcd6e3..2ad85d0cef4d7406fcc8fa0780f545013f25186b 100644 (file)
--- a/command.c
+++ b/command.c
@@ -1,7 +1,22 @@
 /* 
- * $Id: command.c,v 1.9 2004/03/17 14:59:32 kalle Exp $ 
+ * (c) 2004 by Kalle Wallin (kaw@linux.se)
+ *
+ * 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
  *
  */
+
+#include <ctype.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
@@ -31,7 +46,7 @@
 #define PGDN KEY_NPAGE
 #define PGUP KEY_PPAGE
 #define TAB  0x09
-#define STAB 0x5A
+#define STAB 0x161
 #define ESC  0x1B
 #define F1   KEY_F(1)
 #define F2   KEY_F(2)
 
 static command_definition_t cmds[] =
 {
-  { {  13,   0,   0 }, CMD_PLAY, "Play/Enter directory" },
-  { { 'P',   0,   0 }, CMD_PAUSE, "Pause" },
-  { {  BS, ESC,   0 }, CMD_STOP, "Stop" },
-  { { '>',   0,   0 }, CMD_TRACK_NEXT, "Next song" },
-  { { '<',   0,   0 }, CMD_TRACK_PREVIOUS, "Previous song" },
-
-  { { '+', RGHT,  0 }, CMD_VOLUME_UP, "Increase volume" },
-  { { '-', LEFT,  0 }, CMD_VOLUME_DOWN, "Decrease volume" },
-
-  { { 'w',   0,   0 }, CMD_TOGGLE_FIND_WRAP, "Toggle find mode" },
-
-  { { ' ',   0,   0 }, CMD_SELECT, "Select/deselect song in playlist" },
-  { { DEL,   0,   0 }, CMD_DELETE, "Delete song from playlist" },
-  { { 's',   0,   0 }, CMD_SHUFFLE, "Shuffle playlist" },
-  { { 'c',   0,   0 }, CMD_CLEAR, "Clear playlist" },
-  { { 'r',   0,   0 }, CMD_REPEAT, "Toggle repeat mode" },
-  { { 'z',   0,   0 }, CMD_RANDOM, "Toggle random mode" },
-  { { 'S',   0,   0 }, CMD_SAVE_PLAYLIST, "Save playlist" },
-
-  { {  UP,   0,   0 }, CMD_LIST_PREVIOUS,      "Move: Up" },
-  { { DWN,   0,   0 }, CMD_LIST_NEXT,          "Move: Down" },
-  { { HOME,  0,   0 }, CMD_LIST_FIRST,         "Move: Home" },
-  { { END,   0,   0 }, CMD_LIST_LAST,          "Move: End" },
-  { { PGUP,  0,   0 }, CMD_LIST_PREVIOUS_PAGE, "Move: Page Up" },
-  { { PGDN,  0,   0 }, CMD_LIST_NEXT_PAGE,     "Move: Page Down" },
-  { { '/',   0,   0 }, CMD_LIST_FIND,          "Forward Find" },
-  { { 'n',   0,   0 }, CMD_LIST_FIND_NEXT,     "Forward Find Next" },
-  { { '?',   0,   0 }, CMD_LIST_RFIND,         "Backward Find" },
-  { { 'p',   0,   0 }, CMD_LIST_RFIND_NEXT,    "Backward Find Previous" },
-
-
-  { { TAB,   0,   0 }, CMD_SCREEN_NEXT,   "Next screen" },
-  { { STAB,  0,   0 }, CMD_SCREEN_PREVIOUS, "Previous screen" },
-  { { F1, '1', 'h' }, CMD_SCREEN_HELP,   "Help screen" },
-  { { F2, '2',   0 }, CMD_SCREEN_PLAY,   "Playlist screen" },
-  { { F3, '3',   0 }, CMD_SCREEN_FILE,   "Browse screen" },
-  //  { { F4, '4',   0 }, CMD_SCREEN_SEARCH, "Search screen" },
-  { {'u',   0,   0 }, CMD_SCREEN_UPDATE,   "Update screen" },
-
-  { { 'q',  0,   0 }, CMD_QUIT,   "Quit " PACKAGE },  
-
-  { { -1,  -1,  -1 }, CMD_NONE, NULL }
+  { {  13,   0,   0 }, CMD_PLAY, "play",  
+    "Play/Enter directory" },
+  { { 'P',   0,   0 }, CMD_PAUSE,"pause", 
+    "Pause" },
+  { { 's',  BS,   0 }, CMD_STOP, "stop",   
+    "Stop" },
+  { { '>',   0,   0 }, CMD_TRACK_NEXT, "next", 
+    "Next track" },
+  { { '<',   0,   0 }, CMD_TRACK_PREVIOUS, "prev", 
+    "Previous track" },
+  { { 'f',   0,   0 }, CMD_SEEK_FORWARD, "seek-forward", 
+    "Seek forward" },
+  { { 'b',   0,   0 }, CMD_SEEK_BACKWARD, "seek-backward", 
+    "Seek backward" },
+
+  { { '+', RGHT,  0 }, CMD_VOLUME_UP, "volume-up", 
+    "Increase volume" },
+  { { '-', LEFT,  0 }, CMD_VOLUME_DOWN, "volume-down", 
+    "Decrease volume" },
+
+  { { 'w',   0,   0 }, CMD_TOGGLE_FIND_WRAP,  "wrap-mode", 
+    "Toggle find mode" },
+  { { 'U',   0,   0 }, CMD_TOGGLE_AUTOCENTER, "autocenter-mode", 
+    "Toggle auto center mode" },
+
+  { { ' ',  'a',   0 }, CMD_SELECT, "select", 
+    "Select/deselect song in playlist" },
+  { { DEL,  'd',  0 }, CMD_DELETE, "delete",
+    "Delete song from playlist" },
+  { { 'Z',   0,   0 }, CMD_SHUFFLE, "shuffle",
+    "Shuffle playlist" },
+  { { 'c',   0,   0 }, CMD_CLEAR, "clear",
+    "Clear playlist" },
+  { { 'r',   0,   0 }, CMD_REPEAT, "repeat",
+    "Toggle repeat mode" },
+  { { 'z',   0,   0 }, CMD_RANDOM, "random",
+    "Toggle random mode" },
+  { { 'x',   0,   0 }, CMD_CROSSFADE, "crossfade",
+    "Toggle crossfade mode" },
+  { { 'S',   0,   0 }, CMD_SAVE_PLAYLIST, "save",
+    "Save playlist" },
+
+  { {  UP,  ',',   0 }, CMD_LIST_PREVIOUS,      "up",
+    "Move cursor up" },
+  { { DWN,  '.',   0 }, CMD_LIST_NEXT,          "down",
+    "Move cursor down" },
+  { { HOME, 0x01, 0 }, CMD_LIST_FIRST,          "home",
+    "Home " },
+  { { END,  0x05, 0 }, CMD_LIST_LAST,           "end",
+    "End " },
+  { { PGUP, 'A',   0 }, CMD_LIST_PREVIOUS_PAGE, "pgup",
+    "Page up" },
+  { { PGDN, 'B',   0 }, CMD_LIST_NEXT_PAGE,     "pgdn", 
+    "Page down" },
+  { { '/',   0,   0 }, CMD_LIST_FIND,           "find",
+    "Forward find" },
+  { { 'n',   0,   0 }, CMD_LIST_FIND_NEXT,      "find-next",
+    "Forward find next" },
+  { { '?',   0,   0 }, CMD_LIST_RFIND,          "rfind",
+    "Backward find" },
+  { { 'p',   0,   0 }, CMD_LIST_RFIND_NEXT,     "rfind-next",
+    "Backward find previous" },
+
+
+  { { TAB,   0,   0 }, CMD_SCREEN_NEXT,     "screen-next",
+    "Next screen" },
+
+  { { STAB,  0,   0 }, CMD_SCREEN_PREVIOUS, "screen-prev",
+    "Previous screen" },
+
+  { { '1', F1, 'h' }, CMD_SCREEN_HELP,      "screen-help",
+    "Help screen" },
+  { { '2', F2,  0 }, CMD_SCREEN_PLAY,      "screen-playlist",
+    "Playlist screen" },
+  { { '3', F3,  0 }, CMD_SCREEN_FILE,      "screen-browse",
+    "Browse screen" },
+  { {'u',   0,   0 }, CMD_SCREEN_UPDATE,    "update",
+    "Update screen" },
+#ifdef ENABLE_KEYDEF_SCREEN
+  { {'K',   0,   0 }, CMD_SCREEN_KEYDEF,    "screen-keyedit",
+    "Key configuration screen" },
+#endif
+
+  { { 'q',  0,   0 }, CMD_QUIT,   "quit",
+    "Quit " PACKAGE },  
+
+  { { -1,  -1,  -1 }, CMD_NONE, NULL, NULL }
 };
 
+command_definition_t *
+get_command_definitions(void)
+{
+  return cmds;
+}
+
 char *
 key2str(int key)
 {
-  static char buf[2];
+  static char buf[4];
+  int i;
 
   buf[0] = 0;
   switch(key)
     {
+    case 0:
+      return "Undefined";
     case ' ':
       return "Space";
     case 13:
@@ -124,20 +193,16 @@ key2str(int key)
       return "Shift+Tab";
     case ESC:
       return "Esc";
-    case F1:
-      return "F1";
-    case F2:
-      return "F2";
-    case F3:
-      return "F3";
-    case F4:
-      return "F4";
-    case F5:
-      return "F5";
-    case F6:
-      return "F6";
+    case KEY_IC:
+      return "Insert";
     default:
-      snprintf(buf, 2, "%c", key);
+      for(i=0; i<=63; i++)
+       if( key==KEY_F(i) )
+         {
+           snprintf(buf, 4, "F%d", i );
+           return buf;
+         }
+      snprintf(buf, 4, "%c", key);
     }
   return buf;
 }
@@ -151,30 +216,16 @@ command_dump_keys(void)
   while( cmds[i].description )
     {
       if( cmds[i].command != CMD_NONE )
-       {
-         int j;
-         char keystr[80];
-
-         strcpy(keystr, key2str(cmds[i].keys[0]));
-         j=1;
-         while( j<3 && cmds[i].keys[j]>0 )
-           {
-             strcat(keystr, " ");
-             strcat(keystr, key2str(cmds[i].keys[j]));
-             j++;
-           }
-         printf(" %20s : %s\n", keystr, cmds[i].description);
-       }
+       printf(" %20s : %s\n", get_key_names(cmds[i].command,1),cmds[i].name); 
       i++;
     }
 }
 
 char *
-command_get_keys(command_t command)
+get_key_names(command_t command, int all)
 {
   int i;
-
+  
   i=0;
   while( cmds[i].description )
     {
@@ -183,9 +234,11 @@ command_get_keys(command_t command)
          int j;
          static char keystr[80];
 
-         strcpy(keystr, key2str(cmds[i].keys[0]));
+         strncpy(keystr, key2str(cmds[i].keys[0]), 80);
+         if( !all )
+           return keystr;
          j=1;
-         while( j<3 && cmds[i].keys[j]>0 )
+         while( j<MAX_COMMAND_KEYS && cmds[i].keys[j]>0 )
            {
              strcat(keystr, " ");
              strcat(keystr, key2str(cmds[i].keys[j]));
@@ -198,10 +251,79 @@ command_get_keys(command_t command)
   return NULL;
 }
 
+char *
+get_key_description(command_t command)
+{
+  int i;
+
+  i=0;
+  while( cmds[i].description )
+    {
+      if( cmds[i].command == command )
+       return cmds[i].description;
+      i++;
+    }
+  return NULL;
+}
+
+char *
+get_key_command_name(command_t command)
+{
+  int i;
+
+  i=0;
+  while( cmds[i].name )
+    {
+      if( cmds[i].command == command )
+       return cmds[i].name;
+      i++;
+    }
+  return NULL;
+}
+
+command_t 
+get_key_command_from_name(char *name)
+{
+  int i;
+
+  i=0;
+  while( cmds[i].name )
+    {
+      if( strcmp(name, cmds[i].name) == 0 )
+       return cmds[i].command;
+      i++;
+    }
+  return CMD_NONE;
+}
+
+
+command_t 
+find_key_command(int key, command_definition_t *cmds)
+{
+  int i;
+
+  i=0;
+  while( cmds && cmds[i].name )
+    {
+      if( cmds[i].keys[0] == key || 
+         cmds[i].keys[1] == key ||
+         cmds[i].keys[2] == key )
+       return cmds[i].command;
+      i++;
+    }
+  return CMD_NONE;
+}
+
+command_t 
+get_key_command(int key)
+{
+  return find_key_command(key, cmds);
+}
+
+
 command_t
 get_keyboard_command(void)
 {
-  int i;
   int key;
 
   key = wgetch(stdscr);
@@ -211,21 +333,79 @@ get_keyboard_command(void)
 
   DK(fprintf(stderr, "key = 0x%02X\t", key));
 
-  //  if( isalpha(key) )
-  //    key=tolower(key);
+  return get_key_command(key);
+}
+
+int
+assign_keys(command_t command, int keys[MAX_COMMAND_KEYS])
+{
+ int i;
 
   i=0;
-  while( cmds[i].description )
+  while( cmds[i].name )
     {
-      if( cmds[i].keys[0] == key || 
-         cmds[i].keys[1] == key ||
-         cmds[i].keys[2] == key )
+      if( cmds[i].command == command )
        {
-         DK(fprintf(stderr, "Match - %s\n", cmds[i].description));
-         return cmds[i].command;
+         memcpy(cmds[i].keys, keys, sizeof(int)*MAX_COMMAND_KEYS);
+         return 0;
        }
       i++;
-    } 
-  DK(fprintf(stderr, "NO MATCH\n"));
-  return CMD_NONE;
+    }
+  return -1;
+}
+
+int 
+check_key_bindings(void)
+{
+  int i;
+  int retval = 0;
+  
+  i=0;
+  while( cmds[i].name )
+    {
+      int j;
+      command_t cmd;
+
+      for(j=0; j<MAX_COMMAND_KEYS; j++)
+       if( cmds[i].keys[j] && 
+           (cmd=get_key_command(cmds[i].keys[j])) != cmds[i].command )
+         {
+           fprintf(stderr, "Error: Key %s assigned to %s and %s !!!\n",
+                   key2str(cmds[i].keys[j]),
+                   get_key_command_name(cmds[i].command),
+                   get_key_command_name(cmd));
+           retval = -1;
+         }
+      i++;
+    }
+  return retval;
+}
+
+int
+write_key_bindings(FILE *f)
+{
+  int i,j;
+
+  i=0;
+  while( cmds[i].name && !ferror(f) )
+    {
+      fprintf(f, "# %s\n", cmds[i].description);
+      fprintf(f, "key %s = ", cmds[i].name);
+      for(j=0; j<MAX_COMMAND_KEYS; j++)
+       {
+         if( j && cmds[i].keys[j] )
+           fprintf(f, ",  ");
+         if( !j || cmds[i].keys[j] )
+           {
+             if( cmds[i].keys[j]<256 && (isalpha(cmds[i].keys[j]) || 
+                                         isdigit(cmds[i].keys[j])) )
+               fprintf(f, "\'%c\'", cmds[i].keys[j]);
+             else
+               fprintf(f, "%d", cmds[i].keys[j]);
+           }
+       }
+      fprintf(f,"\n\n");
+      i++;
+    }
+  return ferror(f);
 }