input_thread_t *p_input;
bool b_color;
+ bool b_exit;
int i_box_type;
int i_box_y; // start of box content
intf_sys_t *p_sys = p_intf->p_sys;
int l = 0;
- if (p_sys->b_color) color_set(C_CATEGORY, NULL);
- MainBoxWrite(p_sys, l++, _("[Display]"));
- if (p_sys->b_color) color_set(C_DEFAULT, NULL);
- MainBoxWrite(p_sys, l++, _(" h,H Show/Hide help box"));
- MainBoxWrite(p_sys, l++, _(" i Show/Hide info box"));
- MainBoxWrite(p_sys, l++, _(" m Show/Hide metadata box"));
- MainBoxWrite(p_sys, l++, _(" L Show/Hide messages box"));
- MainBoxWrite(p_sys, l++, _(" P Show/Hide playlist box"));
- MainBoxWrite(p_sys, l++, _(" B Show/Hide filebrowser"));
- MainBoxWrite(p_sys, l++, _(" x Show/Hide objects box"));
- MainBoxWrite(p_sys, l++, _(" S Show/Hide statistics box"));
- MainBoxWrite(p_sys, l++, _(" Esc Close Add/Search entry"));
- MainBoxWrite(p_sys, l++, _(" Ctrl-l Refresh the screen"));
- MainBoxWrite(p_sys, l++, "");
+#define H(a) MainBoxWrite(p_sys, l++, a)
if (p_sys->b_color) color_set(C_CATEGORY, NULL);
- MainBoxWrite(p_sys, l++, _("[Global]"));
+ H(_("[Display]"));
if (p_sys->b_color) color_set(C_DEFAULT, NULL);
- MainBoxWrite(p_sys, l++, _(" q, Q, Esc Quit"));
- MainBoxWrite(p_sys, l++, _(" s Stop"));
- MainBoxWrite(p_sys, l++, _(" <space> Pause/Play"));
- MainBoxWrite(p_sys, l++, _(" f Toggle Fullscreen"));
- MainBoxWrite(p_sys, l++, _(" n, p Next/Previous playlist item"));
- MainBoxWrite(p_sys, l++, _(" [, ] Next/Previous title"));
- MainBoxWrite(p_sys, l++, _(" <, > Next/Previous chapter"));
- MainBoxWrite(p_sys, l++, _(" ←, → Seek -/+ 1%%"));
- MainBoxWrite(p_sys, l++, _(" a, z Volume Up/Down"));
- MainBoxWrite(p_sys, l++, "");
+ H(_(" h,H Show/Hide help box"));
+ H(_(" i Show/Hide info box"));
+ H(_(" m Show/Hide metadata box"));
+ H(_(" L Show/Hide messages box"));
+ H(_(" P Show/Hide playlist box"));
+ H(_(" B Show/Hide filebrowser"));
+ H(_(" x Show/Hide objects box"));
+ H(_(" S Show/Hide statistics box"));
+ H(_(" Esc Close Add/Search entry"));
+ H(_(" Ctrl-l Refresh the screen"));
+ H("");
if (p_sys->b_color) color_set(C_CATEGORY, NULL);
- MainBoxWrite(p_sys, l++, _("[Playlist]"));
+ H(_("[Global]"));
if (p_sys->b_color) color_set(C_DEFAULT, NULL);
- MainBoxWrite(p_sys, l++, _(" r Toggle Random playing"));
- MainBoxWrite(p_sys, l++, _(" l Toggle Loop Playlist"));
- MainBoxWrite(p_sys, l++, _(" R Toggle Repeat item"));
- MainBoxWrite(p_sys, l++, _(" o Order Playlist by title"));
- MainBoxWrite(p_sys, l++, _(" O Reverse order Playlist by title"));
- MainBoxWrite(p_sys, l++, _(" g Go to the current playing item"));
- MainBoxWrite(p_sys, l++, _(" / Look for an item"));
- MainBoxWrite(p_sys, l++, _(" A Add an entry"));
- MainBoxWrite(p_sys, l++, _(" D, ⌫, <del> Delete an entry"));
- MainBoxWrite(p_sys, l++, _(" e Eject (if stopped)"));
- MainBoxWrite(p_sys, l++, "");
+ H(_(" q, Q, Esc Quit"));
+ H(_(" s Stop"));
+ H(_(" <space> Pause/Play"));
+ H(_(" f Toggle Fullscreen"));
+ H(_(" n, p Next/Previous playlist item"));
+ H(_(" [, ] Next/Previous title"));
+ H(_(" <, > Next/Previous chapter"));
+ /* xgettext: You can use ← and → characters */
+ H(_(" <left>,<right> Seek -/+ 1%%"));
+ H(_(" a, z Volume Up/Down"));
+ /* xgettext: You can use ↑ and ↓ characters */
+ H(_(" <up>,<down> Navigate through the box line by line"));
+ /* xgettext: You can use ⇞ and ⇟ characters */
+ H(_(" <pageup>,<pagedown> Navigate through the box page by page"));
+ /* xgettext: You can use ↖ and ↘ characters */
+ H(_(" <start>,<end> Navigate to start/end of box"));
+ H("");
if (p_sys->b_color) color_set(C_CATEGORY, NULL);
- MainBoxWrite(p_sys, l++, _("[Filebrowser]"));
+ H(_("[Playlist]"));
if (p_sys->b_color) color_set(C_DEFAULT, NULL);
- MainBoxWrite(p_sys, l++, _(" <enter> Add the selected file to the playlist"));
- MainBoxWrite(p_sys, l++, _(" <space> Add the selected directory to the playlist"));
- MainBoxWrite(p_sys, l++, _(" . Show/Hide hidden files"));
- MainBoxWrite(p_sys, l++, "");
+ H(_(" r Toggle Random playing"));
+ H(_(" l Toggle Loop Playlist"));
+ H(_(" R Toggle Repeat item"));
+ H(_(" o Order Playlist by title"));
+ H(_(" O Reverse order Playlist by title"));
+ H(_(" g Go to the current playing item"));
+ H(_(" / Look for an item"));
+ H(_(" A Add an entry"));
+ /* xgettext: You can use ⌫ character to translate <backspace> */
+ H(_(" D, <backspace>, <del> Delete an entry"));
+ H(_(" e Eject (if stopped)"));
+ H("");
if (p_sys->b_color) color_set(C_CATEGORY, NULL);
- MainBoxWrite(p_sys, l++, _("[Boxes]"));
+ H(_("[Filebrowser]"));
if (p_sys->b_color) color_set(C_DEFAULT, NULL);
- MainBoxWrite(p_sys, l++, _(" ↑,↓ Navigate through the box line by line"));
- MainBoxWrite(p_sys, l++, _(" ⇞,⇟ Navigate through the box page by page"));
- MainBoxWrite(p_sys, l++, _(" ↖,↘ Navigate to start/end of box"));
- MainBoxWrite(p_sys, l++, "");
+ H(_(" <enter> Add the selected file to the playlist"));
+ H(_(" <space> Add the selected directory to the playlist"));
+ H(_(" . Show/Hide hidden files"));
+ H("");
if (p_sys->b_color) color_set(C_CATEGORY, NULL);
- MainBoxWrite(p_sys, l++, _("[Player]"));
+ H(_("[Player]"));
if (p_sys->b_color) color_set(C_DEFAULT, NULL);
- MainBoxWrite(p_sys, l++, _(" ↑,↓ Seek +/-5%%"));
+ /* xgettext: You can use ↑ and ↓ characters */
+ H(_(" <up>,<down> Seek +/-5%%"));
+#undef H
return l;
}
if (i == p_sys->i_msgs) /* did we loop around the ring buffer ? */
break;
}
+
vlc_mutex_unlock(&p_sys->msg_lock);
+ if (p_sys->b_color)
+ color_set(C_DEFAULT, NULL);
return l;
}
FillTextBox(p_sys);
}
-static void Redraw(intf_thread_t *p_intf, time_t *t_last_refresh)
+static void Redraw(intf_thread_t *p_intf)
{
intf_sys_t *p_sys = p_intf->p_sys;
int box = p_sys->i_box_type;
DrawEmptyLine(y++, 1, COLS - 2);
refresh();
- *t_last_refresh = time(0);
}
static void ChangePosition(intf_thread_t *p_intf, float increment)
return false;
}
-static bool HandleEditBoxKey(intf_thread_t *p_intf, int key, int box)
+static void HandleEditBoxKey(intf_thread_t *p_intf, int key, int box)
{
intf_sys_t *p_sys = p_intf->p_sys;
bool search = box == BOX_SEARCH;
switch(key)
{
case 0x0c: /* ^l */
- case KEY_CLEAR: clear(); return 1;
+ case KEY_CLEAR: clear(); return;
case KEY_ENTER:
case '\r':
p_sys->b_plidx_follow = true;
}
p_sys->i_box_type = BOX_PLAYLIST;
- return 1;
+ return;
case 0x1b: /* ESC */
/* Alt+key combinations return 2 keys in the terminal keyboard:
* ESC, and the 2nd key.
* If some other key is available immediately (where immediately
- * means after wgetch() 1 second delay), that means that the
+ * means after getch() 1 second delay), that means that the
* ESC key was not pressed.
*
* man 3X curs_getch says:
*
*/
if (getch() != ERR)
- return 0;
+ return;
if (search) p_sys->i_box_idx = p_sys->i_before_search;
p_sys->i_box_type = BOX_PLAYLIST;
- return 1;
+ return;
case KEY_BACKSPACE:
case 0x7f:
p_sys->psz_old_search = NULL;
SearchPlaylist(p_sys, str);
}
- return 1;
}
static void InputNavigate(input_thread_t* p_input, const char *var)
var_TriggerCallback(p_input, var);
}
-static bool HandleCommonKey(intf_thread_t *p_intf, int key)
+static void HandleCommonKey(intf_thread_t *p_intf, int key)
{
intf_sys_t *p_sys = p_intf->p_sys;
playlist_t *p_playlist = pl_Get(p_intf);
{
case 0x1b: /* ESC */
if (getch() != ERR)
- return false;
+ return;
case 'q':
case 'Q':
case KEY_EXIT:
libvlc_Quit(p_intf->p_libvlc);
- return false;
+ p_sys->b_exit = true; // terminate the main loop
+ return;
case 'h':
- case 'H': BoxSwitch(p_sys, BOX_HELP); return true;
- case 'i': BoxSwitch(p_sys, BOX_INFO); return true;
- case 'm': BoxSwitch(p_sys, BOX_META); return true;
- case 'L': BoxSwitch(p_sys, BOX_LOG); return true;
- case 'P': BoxSwitch(p_sys, BOX_PLAYLIST); return true;
- case 'B': BoxSwitch(p_sys, BOX_BROWSE); return true;
- case 'x': BoxSwitch(p_sys, BOX_OBJECTS); return true;
- case 'S': BoxSwitch(p_sys, BOX_STATS); return true;
+ case 'H': BoxSwitch(p_sys, BOX_HELP); return;
+ case 'i': BoxSwitch(p_sys, BOX_INFO); return;
+ case 'm': BoxSwitch(p_sys, BOX_META); return;
+ case 'L': BoxSwitch(p_sys, BOX_LOG); return;
+ case 'P': BoxSwitch(p_sys, BOX_PLAYLIST); return;
+ case 'B': BoxSwitch(p_sys, BOX_BROWSE); return;
+ case 'x': BoxSwitch(p_sys, BOX_OBJECTS); return;
+ case 'S': BoxSwitch(p_sys, BOX_STATS); return;
case '/': /* Search */
p_sys->psz_search_chain[0] = '\0';
p_sys->b_plidx_follow = false;
p_sys->i_before_search = p_sys->i_box_idx;
p_sys->i_box_type = BOX_SEARCH;
- return true;
+ return;
case 'A': /* Open */
p_sys->psz_open_chain[0] = '\0';
p_sys->i_box_type = BOX_OPEN;
- return true;
+ return;
/* Navigation */
- case KEY_RIGHT: ChangePosition(p_intf, +0.01); return true;
- case KEY_LEFT: ChangePosition(p_intf, -0.01); return true;
+ case KEY_RIGHT: ChangePosition(p_intf, +0.01); return;
+ case KEY_LEFT: ChangePosition(p_intf, -0.01); return;
/* Common control */
case 'f':
vlc_object_release(p_vout);
}
}
- return false;
+ return;
- case ' ': PlayPause(p_intf); return true;
- case 's': playlist_Stop(p_playlist); return true;
- case 'e': Eject(p_intf); return true;
+ case ' ': PlayPause(p_intf); return;
+ case 's': playlist_Stop(p_playlist); return;
+ case 'e': Eject(p_intf); return;
- case '[': InputNavigate(p_sys->p_input, "prev-title"); return true;
- case ']': InputNavigate(p_sys->p_input, "next-title"); return true;
- case '<': InputNavigate(p_sys->p_input, "prev-chapter"); return true;
- case '>': InputNavigate(p_sys->p_input, "next-chapter"); return true;
+ case '[': InputNavigate(p_sys->p_input, "prev-title"); return;
+ case ']': InputNavigate(p_sys->p_input, "next-title"); return;
+ case '<': InputNavigate(p_sys->p_input, "prev-chapter"); return;
+ case '>': InputNavigate(p_sys->p_input, "next-chapter"); return;
case 'p': playlist_Prev(p_playlist); break;
case 'n': playlist_Next(p_playlist); break;
break;
default:
- return false;
+ return;
}
clear();
- return true;
+ return;
}
static bool HandleListKey(intf_thread_t *p_intf, int key)
return true;
}
-static bool HandleKey(intf_thread_t *p_intf)
+static void HandleKey(intf_thread_t *p_intf)
{
intf_sys_t *p_sys = p_intf->p_sys;
int key = getch();
int box = p_sys->i_box_type;
if (key == -1)
- return false;
+ return;
if (box == BOX_SEARCH || box == BOX_OPEN)
- return HandleEditBoxKey(p_intf, key, p_sys->i_box_type);
+ {
+ HandleEditBoxKey(p_intf, key, p_sys->i_box_type);
+ return;
+ }
if (box == BOX_NONE)
switch(key)
#ifdef __FreeBSD__
case KEY_SELECT:
#endif
- case KEY_END: ChangePosition(p_intf, +.99); return true;
- case KEY_HOME: ChangePosition(p_intf, -1.0); return true;
- case KEY_UP: ChangePosition(p_intf, +0.05); return true;
- case KEY_DOWN: ChangePosition(p_intf, -0.05); return true;
- default: return HandleCommonKey(p_intf, key);
+ case KEY_END: ChangePosition(p_intf, +.99); return;
+ case KEY_HOME: ChangePosition(p_intf, -1.0); return;
+ case KEY_UP: ChangePosition(p_intf, +0.05); return;
+ case KEY_DOWN: ChangePosition(p_intf, -0.05); return;
+ default: HandleCommonKey(p_intf, key); return;
}
if (box == BOX_BROWSE && HandleBrowseKey(p_intf, key))
- return true;
+ return;
if (box == BOX_PLAYLIST && HandlePlaylistKey(p_intf, key))
- return true;
+ return;
+
+ if (HandleListKey(p_intf, key))
+ return;
- return HandleListKey(p_intf, key) || HandleCommonKey(p_intf, key);
+ HandleCommonKey(p_intf, key);
}
/*
vlc_restorecancel(canc);
}
+static inline void UpdateInput(intf_sys_t *p_sys, playlist_t *p_playlist)
+{
+ if (!p_sys->p_input)
+ {
+ p_sys->p_input = playlist_CurrentInput(p_playlist);
+ }
+ else if (p_sys->p_input->b_dead)
+ {
+ vlc_object_release(p_sys->p_input);
+ p_sys->p_input = NULL;
+ }
+}
+
/*****************************************************************************
* Run: ncurses thread
*****************************************************************************/
intf_sys_t *p_sys = p_intf->p_sys;
playlist_t *p_playlist = pl_Get(p_intf);
- time_t t_last_refresh;
int canc = vlc_savecancel();
- Redraw(p_intf, &t_last_refresh);
-
var_AddCallback(p_playlist, "intf-change", PlaylistChanged, p_intf);
var_AddCallback(p_playlist, "playlist-item-append", PlaylistChanged, p_intf);
- while (vlc_object_alive(p_intf))
+ while (vlc_object_alive(p_intf) && !p_sys->b_exit)
{
- msleep(INTF_IDLE_SLEEP);
-
- if (!p_sys->p_input)
- {
- p_sys->p_input = playlist_CurrentInput(p_playlist);
- if (p_sys->p_input)
- Redraw(p_intf, &t_last_refresh);
- }
- else if (p_sys->p_input->b_dead)
- {
- vlc_object_release(p_sys->p_input);
- p_sys->p_input = NULL;
- }
-
- while (HandleKey(p_intf))
- Redraw(p_intf, &t_last_refresh);
-
- if ((time(0) - t_last_refresh) >= 1)
- Redraw(p_intf, &t_last_refresh);
+ UpdateInput(p_sys, p_playlist);
+ Redraw(p_intf);
+ HandleKey(p_intf);
}
+
var_DelCallback(p_playlist, "intf-change", PlaylistChanged, p_intf);
var_DelCallback(p_playlist, "playlist-item-append", PlaylistChanged, p_intf);
vlc_restorecancel(canc);
p_sys->i_msgs = 0;
memset(p_sys->msgs, 0, sizeof p_sys->msgs);
p_sys->p_sub = msg_Subscribe(p_intf->p_libvlc, MsgCallback, msg_cb_data);
+ msg_SubscriptionSetVerbosity(p_sys->p_sub,
+ var_GetInteger(p_intf->p_libvlc, "verbose"));
p_sys->i_box_type = BOX_PLAYLIST;
p_sys->b_plidx_follow = true;
nonl(); /* Take input chars one at a time */
cbreak(); /* Don't echo */
noecho(); /* Invisible cursor */
- curs_set(0); /* Non blocking wgetch() */
- timeout(0);
+ curs_set(0); /* Non blocking getch() */
+ timeout(1000);
clear();
/* Stop printing errors to the console */