Code

New configuraton option: screen-list
[ncmpc.git] / src / screen.c
index 966dbd303ea56ec6cbdef04b5a565e80767fbff2..b947190011aac6beaf6c1dd71f0390dca3ef5214 100644 (file)
 
 #define SCREEN_PLAYLIST_ID     0
 #define SCREEN_BROWSE_ID       1
+#define SCREEN_ARTIST_ID       2
 #define SCREEN_HELP_ID         100
 #define SCREEN_KEYDEF_ID       101
 #define SCREEN_CLOCK_ID        102
+#define SCREEN_SEARCH_ID       103
+
+
 
 /* screens */
 extern screen_functions_t *get_screen_playlist(void);
 extern screen_functions_t *get_screen_browse(void);
 extern screen_functions_t *get_screen_help(void);
+extern screen_functions_t *get_screen_search(void);
+extern screen_functions_t *get_screen_artist(void);
 extern screen_functions_t *get_screen_keydef(void);
 extern screen_functions_t *get_screen_clock(void);
 
@@ -68,14 +74,20 @@ typedef struct
 static screen_mode_info_t screens[] = {
   { SCREEN_PLAYLIST_ID, "playlist", get_screen_playlist },
   { SCREEN_BROWSE_ID,   "browse",   get_screen_browse },
+#ifdef ENABLE_ARTIST_SCREEN
+  { SCREEN_ARTIST_ID,   "artist",   get_screen_artist },
+#endif
   { SCREEN_HELP_ID,     "help",     get_screen_help },
+#ifdef ENABLE_SEARCH_SCREEN
+  { SCREEN_SEARCH_ID,   "search",   get_screen_search },
+#endif
 #ifdef ENABLE_KEYDEF_SCREEN
   { SCREEN_KEYDEF_ID,   "keydef",   get_screen_keydef },
 #endif
 #ifdef ENABLE_CLOCK_SCREEN
   { SCREEN_CLOCK_ID,    "clock",    get_screen_clock },
 #endif
-  { -1, NULL,      NULL }
+  { G_MAXINT, NULL,      NULL }
 };
 
 static gboolean welcome = TRUE;
@@ -84,6 +96,20 @@ static screen_functions_t *mode_fn = NULL;
 static int seek_id = -1;
 static int seek_target_time = 0;
 
+gint
+screen_get_id(char *name)
+{
+  gint i=0;
+
+  while( screens[i].name )
+    {
+      if( strcmp(name, screens[i].name) == 0 ) 
+       return screens[i].id;
+      i++;
+    }
+  return -1;
+}
+
 static gint 
 lookup_mode(gint id)
 {
@@ -114,6 +140,7 @@ switch_screen_mode(gint id, mpdclient_t *c)
   new_mode = lookup_mode(id);
   if( new_mode>=0 && screens[new_mode].get_mode_functions )
     {
+      D("switch_screen(%s)\n", screens[new_mode].name );
       mode_fn = screens[new_mode].get_mode_functions();
       screen->mode = new_mode;
     }
@@ -126,6 +153,32 @@ switch_screen_mode(gint id, mpdclient_t *c)
 
 }
 
+static void
+screen_next_mode(mpdclient_t *c, int offset)
+{
+  int max = g_strv_length(options.screen_list);
+  int current, next;
+  int i;
+
+  /* find current screen */
+  current = -1;
+  i = 0;
+  while( options.screen_list[i] )
+    {
+      if( strcmp(options.screen_list[i], screens[screen->mode].name) == 0 )
+       current = i;
+      i++;
+    }
+  next = current + offset;
+  if( next<0 )
+    next = max-1;
+  else if( next>=max )
+    next = 0;
+
+  D("current mode: %d:%d    next:%d\n", current, max, next);
+  switch_screen_mode(screen_get_id(options.screen_list[next]), c);
+}
+
 static void
 paint_top_window(char *header, mpdclient_t *c, int clear)
 {
@@ -168,7 +221,19 @@ paint_top_window(char *header, mpdclient_t *c, int clear)
          colors_use(w, COLOR_TITLE_BOLD);
          waddstr(w, get_key_names(CMD_SCREEN_FILE, FALSE));
          colors_use(w, COLOR_TITLE);
-         waddstr(w, _(":Browse"));
+         waddstr(w, _(":Browse  "));
+#ifdef ENABLE_ARTIST_SCREEN
+         colors_use(w, COLOR_TITLE_BOLD);
+         waddstr(w, get_key_names(CMD_SCREEN_ARTIST, FALSE));
+         colors_use(w, COLOR_TITLE);
+         waddstr(w, _(":Artist  "));
+#endif
+#ifdef ENABLE_SEARCH_SCREEN
+         colors_use(w, COLOR_TITLE_BOLD);
+         waddstr(w, get_key_names(CMD_SCREEN_SEARCH, FALSE));
+         colors_use(w, COLOR_TITLE);
+         waddstr(w, _(":Search  "));
+#endif
        }
       if( c->status->volume==MPD_STATUS_NO_VOLUME )
        {
@@ -565,7 +630,14 @@ screen_init(mpdclient_t *c)
       i++;
     }
 
+#if 0
+  /* broken */
+  mode_fn = NULL;
+  switch_screen_mode(screen_get_id(options.screen_list[0]), c);
+#else
   mode_fn = get_screen_playlist();
+#endif
+
   if( mode_fn && mode_fn->open )
     mode_fn->open(screen, c);
 
@@ -579,10 +651,15 @@ screen_init(mpdclient_t *c)
 void 
 screen_paint(mpdclient_t *c)
 {
-  D("screen_paint()\n");
-  /* paint the title/header window */
+  char *title = NULL;
+
   if( mode_fn && mode_fn->get_title )
-    paint_top_window(mode_fn->get_title(screen->buf,screen->buf_size), c, 1);
+    title = mode_fn->get_title(screen->buf,screen->buf_size);
+
+  D("screen_paint(%s)\n", title);
+  /* paint the title/header window */
+  if( title )
+    paint_top_window(title, c, 1);
   else
     paint_top_window("", c, 1);
 
@@ -765,7 +842,7 @@ screen_cmd(mpdclient_t *c, command_t cmd)
              seek_id = c->song->id;
              seek_target_time = c->status->elapsedTime;
            }
-         seek_target_time++;
+         seek_target_time+=options.seek_time;
          if( seek_target_time < c->status->totalTime )
            break;
          seek_target_time = c->status->totalTime;
@@ -785,7 +862,7 @@ screen_cmd(mpdclient_t *c, command_t cmd)
              seek_id = c->song->id;
              seek_target_time = c->status->elapsedTime;
            }
-         seek_target_time--;
+         seek_target_time-=options.seek_time;
          if( seek_target_time < 0 )
            seek_target_time=0;
        }
@@ -847,16 +924,10 @@ screen_cmd(mpdclient_t *c, command_t cmd)
       screen->painted = 0;
       break;
     case CMD_SCREEN_PREVIOUS:
-      if( screen->mode > 0 )
-       switch_screen_mode(screens[screen->mode-1].id, c);
-      else
-       switch_screen_mode(lookup_mode(SCREEN_HELP_ID)-1, c);
+      screen_next_mode(c, -1);
       break;
     case CMD_SCREEN_NEXT:
-      if( screens[screen->mode+1].id < SCREEN_HELP_ID )
-       switch_screen_mode(screens[screen->mode+1].id, c);
-      else
-       switch_screen_mode(screens[0].id, c);
+      screen_next_mode(c, 1);
       break;
     case CMD_SCREEN_PLAY:
       switch_screen_mode(SCREEN_PLAYLIST_ID, c);
@@ -867,6 +938,12 @@ screen_cmd(mpdclient_t *c, command_t cmd)
     case CMD_SCREEN_HELP:
       switch_screen_mode(SCREEN_HELP_ID, c);
       break;
+    case CMD_SCREEN_SEARCH:
+      switch_screen_mode(SCREEN_SEARCH_ID, c);
+      break;
+    case CMD_SCREEN_ARTIST:
+      switch_screen_mode(SCREEN_ARTIST_ID, c);
+      break;
     case CMD_SCREEN_KEYDEF:
       switch_screen_mode(SCREEN_KEYDEF_ID, c);
       break;