screen_browser: don't return directory name with square brackets
Since the browser_lw_callback() isn't used for rendering anymore (only
for searching), we can remove the page breaks.
Since the browser_lw_callback() isn't used for rendering anymore (only
for searching), we can remove the page breaks.
screen_browser: added custom list painting function
Side effect: playlists and directories are rendered with different
colors (configuration "browser-directory" and "browser-playlist").
Side effect: playlists and directories are rendered with different
colors (configuration "browser-directory" and "browser-playlist").
list_window: added callback function for row painting
With the function list_window_paint2(), callers can customize how a
row is painted. The usual callback function is not used anymore.
With the function list_window_paint2(), callers can customize how a
row is painted. The usual callback function is not used anymore.
list_window: moved painting utilities to paint.h
Minor optimization: pass the full row width to whline(). This way,
ncurses performs clipping for us, and we don't have to call
utf8_width().
Minor optimization: pass the full row width to whline(). This way,
ncurses performs clipping for us, and we don't have to call
utf8_width().
screen_browser: added wrapper function screen_browser_paint()
Don't export browser_lw_callback().
Don't export browser_lw_callback().
list_window: simplified narrow cursor drawing
Clear the space after the text before drawing the second column. The
continue drawing the second column.
Clear the space after the text before drawing the second column. The
continue drawing the second column.
list_window: simplify show_cursor formula
And call list_window_get_range() only if show_cursor is true.
And call list_window_get_range() only if show_cursor is true.
list_window: removed selected_start, selected_end
Calculate those two variables on demand. This simplifies a lot of
code, and saves some memory and CPU cycles.
Calculate those two variables on demand. This simplifies a lot of
code, and saves some memory and CPU cycles.
mpdclient: fall back to simple "deleteid" if range is 1
options: removed deprecated password code
libmpdclient2 parses the password from the host name.
libmpdclient2 parses the password from the host name.
list_window: eliminate redundant code in list_window_fetch_cursor()
Use list_window_move_cursor() to eliminate redundant code.
Use list_window_move_cursor() to eliminate redundant code.
list_window: removed redundant range_base checks
No need to check range_base in list_window_check_selected().
No need to check range_base in list_window_check_selected().
list_window: moved checks to list_window_validate_index()
list_window: removed scrolling from list_window_check_selected()
This broke CMD_LIST_FIRST.
This broke CMD_LIST_FIRST.
screen_artist.c: use libmpdclient to obtain artist/album list
Moved the mpdclient_get_artists/albums() code from mpdclient.c to
screen_artist.c.
Moved the mpdclient_get_artists/albums() code from mpdclient.c to
screen_artist.c.
screen_artist: don't pass mpdclient object to free_lists()
It's unused.
It's unused.
mpdclient: merged duplicate code into recv_tag_values()
list_window: fix list_window_check_origin() indentation
list_window: fully disable highlighting code on --enable-mini
list_window: moved code to jump_match()
Simplify the list_window_jump() function.
Simplify the list_window_jump() function.
list_window: don't allow list_window_jump(NULL)
Added an assertion, removed two runtime checks. Same for
list_window_find() and list_window_rfind().
Added an assertion, removed two runtime checks. Same for
list_window_find() and list_window_rfind().
list_window: moved auto-scrolling code to list_window_check_origin()
Moved code from list_window_paint(). Call it in list_window_resize(),
list_window_set_length(), list_window_set_cursor(),
list_window_move_cursor(). Now that all the modifying code has been
removed from list_window_paint(), we can pass a const object to that
function.
Moved code from list_window_paint(). Call it in list_window_resize(),
list_window_set_length(), list_window_set_cursor(),
list_window_move_cursor(). Now that all the modifying code has been
removed from list_window_paint(), we can pass a const object to that
function.
list_window: added function list_window_resize()
Call this function instead of manually setting the "cols" and "rows"
attributes.
Call this function instead of manually setting the "cols" and "rows"
attributes.
list_window: use list_window_move_cursor() in find functions
Don't repeat the range selection code.
Don't repeat the range selection code.
gidle: free all objects in mpd_glib_free()
The mpd_parser object was not freed, and neither was the
mpd_glib_source object.
The mpd_parser object was not freed, and neither was the
mpd_glib_source object.
strfsong: support multiple values for a tag
Concatenate them with ", " in between.
Concatenate them with ", " in between.
screen_song: corrected list_window length
list_window: don't invoke callback out-of-range
For screen rows after the end of the list, don't invoke the callback.
We know the length of the list, and we know that the callback will
return NULL anyway.
Optimization: after the end of the list, call wclrtobot() to clear all
of the remaining visible (empty) lines.
For screen rows after the end of the list, don't invoke the callback.
We know the length of the list, and we know that the callback will
return NULL anyway.
Optimization: after the end of the list, call wclrtobot() to clear all
of the remaining visible (empty) lines.
list_window: added attribute "length"
Don't pass the number of list items to each and every function.
Instead, call list_window_set_length() each time the list contents
change.
Don't pass the number of list items to each and every function.
Instead, call list_window_set_length() each time the list contents
change.
screen_search: moved help text into a global variable
gidle: work around nested leave/enter problem
Add the flag "leaving" which disables the mpd_glib_enter() function
while mpd_glib_leave() is running.
Add the flag "leaving" which disables the mpd_glib_enter() function
while mpd_glib_leave() is running.
mpdclient: set all idle events on disconnect
After a disconnect, all subsystems have to consider the "new data"
(i.e. nothing).
After a disconnect, all subsystems have to consider the "new data"
(i.e. nothing).
list_window: disable support for second column on --enable-mini
screen_keydef: call list_window_reset() after entering a command
screen_{play,keydef,text}: use list_window_set_cursor()
Don't write list_window.selected directly.
Don't write list_window.selected directly.
list_window: moved code to list_window_fetch_cursor()
Merged code from screen_play.c and list_window_scroll_up(),
list_window_scroll_down().
Merged code from screen_play.c and list_window_scroll_up(),
list_window_scroll_down().
list_window: splitted function list_window_set_selected()
list_window_set_selected() becomes list_window_move_cursor().
list_window_set_cursor() is the new public function, which sets the
cursor and disables range selection.
list_window_set_selected() becomes list_window_move_cursor().
list_window_set_cursor() is the new public function, which sets the
cursor and disables range selection.
screen_text: start searching at window origin, not bottom
Don't add "text->lw->rows" to the window origin. This won't find text
displayed on the screen. This patch affects the lyrics screen.
Don't add "text->lw->rows" to the window origin. This won't find text
displayed on the screen. This patch affects the lyrics screen.
screen_play: repaint after the "select-playing" command
When the cursor moves, we have to repaint the list.
When the cursor moves, we have to repaint the list.
list_window: fix narrow cursor drawing
When there's a second column (e.g. in the playlist screen), the space
between the two columns isn't cleared properly, because the cursor
position was changed by the second column renderer.
Side effect of this patch: space drawing is a little bit optimized,
because it won't clear the second column (in wide-cursor mode) only to
draw the second column text on top of it.
When there's a second column (e.g. in the playlist screen), the space
between the two columns isn't cleared properly, because the cursor
position was changed by the second column renderer.
Side effect of this patch: space drawing is a little bit optimized,
because it won't clear the second column (in wide-cursor mode) only to
draw the second column text on top of it.
list_window: optimize second column drawing
Paint the space with waddch() instead of waddstr(). Removed the
second cursor movement, it's redundant.
Paint the space with waddch() instead of waddstr(). Removed the
second cursor movement, it's redundant.
list_window: moved code to list_window_paint_row()
list_window: simplified the selection painting code
Combine all the checks in the two boolean variables "show_cursor" and
"selected".
Combine all the checks in the two boolean variables "show_cursor" and
"selected".
list_window: removed the list_window_t typedef
Use the plain struct name "list_window".
Use the plain struct name "list_window".
list_window: don't allow list_window_free(NULL)
Also don't clear the list_window object.
Also don't clear the list_window object.
lyrics: replaced asserts with error handler
Handle missing artist and/or title for lyrics by defining an empty list of
plugins that fails almost immediately. Note that args in lyrics_load may now
start with NULL as the first array element. make_argv() in plugin.c made the
assumption that at least one argument is passed. If the first argument is
NULL a bogus pointer is returned by make_argv(). By converting do {} while
into while {}, we allow the first argument to be NULL.
Handle missing artist and/or title for lyrics by defining an empty list of
plugins that fails almost immediately. Note that args in lyrics_load may now
start with NULL as the first array element. make_argv() in plugin.c made the
assumption that at least one argument is passed. If the first argument is
NULL a bogus pointer is returned by make_argv(). By converting do {} while
into while {}, we allow the first argument to be NULL.
po: updated French translation
options: convert timedisplay_type into a bool variable
Save some CPU and memory by using bool instead of a string. This
patch also removes the compile-time option
--with-default-timedisplay_type.
Save some CPU and memory by using bool instead of a string. This
patch also removes the compile-time option
--with-default-timedisplay_type.
options: disable the status bar clock by default
main: don't call mpdclient_update() for clock update
When the "update timer" is running because the clock is enabled, don't
call mpdclient_update() in each tick. For the clock, it's enough to
update MPD only when an idle event occurs. While MPD is playing, we
still need MPD updates, beacuse we need the new "elapsed" time.
When the "update timer" is running because the clock is enabled, don't
call mpdclient_update() in each tick. For the clock, it's enough to
update MPD only when an idle event occurs. While MPD is playing, we
still need MPD updates, beacuse we need the new "elapsed" time.
screen: force repaint progress window in screen_paint()
charset: removed duplicate return
leoslyrics plugin: handle parser exceptions
Should fix bug #2286. Added exception handling for both calls of the SAX
XML parser. Also removed trailing newlines from the result to keep us from
scrolling down further than the last line.
Should fix bug #2286. Added exception handling for both calls of the SAX
XML parser. Also removed trailing newlines from the result to keep us from
scrolling down further than the last line.
mpdclient: use the "idle" command to reduce CPU and network usage
This patch makes mpdclient and the rest of ncmpc use the new
mpd_glib_source class. When mpdclient_get_connection() is called, it
sends the "noidle" command to MPD. Upon mpdclient_put_connection()
(which is called before returning control back to GLib), mpdclient.c
re-enters "idle" mode. The "idle" event handler lives in main.c, and
replaces timer_mpd_update().
Currently, the update timer is still used when MPD is playing, to keep
the progress bar and the time up to date. This is subject to change
soon.
Servers which do not support "idle" are detected automatically.
This patch makes mpdclient and the rest of ncmpc use the new
mpd_glib_source class. When mpdclient_get_connection() is called, it
sends the "noidle" command to MPD. Upon mpdclient_put_connection()
(which is called before returning control back to GLib), mpdclient.c
re-enters "idle" mode. The "idle" event handler lives in main.c, and
replaces timer_mpd_update().
Currently, the update timer is still used when MPD is playing, to keep
the progress bar and the time up to date. This is subject to change
soon.
Servers which do not support "idle" are detected automatically.
gidle: new GLib/libmpdclient integration library
This library acts as a GLib source, and invokes a callback whenever
MPD sends an idle response.
It is BSD licensed, because it may be moved to libmpdclient one day.
This library acts as a GLib source, and invokes a callback whenever
MPD sends an idle response.
It is BSD licensed, because it may be moved to libmpdclient one day.
mpdclient: wrap access in mpdclient_get_connection()
Added mpdclient_put_connection() to release the connection before
control is returned to the GLib main loop.
Added mpdclient_put_connection() to release the connection before
control is returned to the GLib main loop.
main: enable the update timer on demand
We don't need the timer when ncmpc is not connected and the clock is
disabled.
We don't need the timer when ncmpc is not connected and the clock is
disabled.
main: update within timer_reconnect()
Don't schedule the timer_mpd_update() call. Always return "true" from
timer_mpd_update().
This sets the full event mask after a connection was established. The
"database updated" message appears only if the connection existed
before.
Don't schedule the timer_mpd_update() call. Always return "true" from
timer_mpd_update().
This sets the full event mask after a connection was established. The
"database updated" message appears only if the connection existed
before.
main: check for connection lost in end_input_event()
Every GLib event callback which may affect the connection should
detect a lost connection.
Every GLib event callback which may affect the connection should
detect a lost connection.
main: reconnect at the end of timer_mpd_update()
During timer_mpd_update(), the MPD connection may get lost. Move that
reconnect test to the end of timer_mpd_update(), so we can catch it as
soon as possible. There is no advantage in having it at the
beginning.
During timer_mpd_update(), the MPD connection may get lost. Move that
reconnect test to the end of timer_mpd_update(), so we can catch it as
soon as possible. There is no advantage in having it at the
beginning.
status_bar: fixed visible_bitrate check
Don't render the bit rate if total_time is unknown, and the
visible_bitrate is disabled.
Don't render the bit rate if total_time is unknown, and the
visible_bitrate is disabled.
main: clear mpdclient.events in end_input_event()
The events bit mask should be cleared after every screen_update()
call.
The events bit mask should be cleared after every screen_update()
call.
main: assign reconnect_source_id when retrying to reconnect
Keep track of the current source id, and unregister it on exit.
Keep track of the current source id, and unregister it on exit.
screen_play, status_bar: update scrolling with a GLib timer
status_bar: moved hscroll object to struct status_bar
screen: don't use/define "welcome" stuff in --enable-mini
screen_play: make the scroll_stat variable global
hscroll: wrap attribute access added helper functions
hscroll: changed hscroll_state_t typedef to a struct
screen: disable the welcome screen list with a GLib timer
main: added functions dis/enable_update_timer()
playlist: removed unused macros
Removed ENABLE_PLCHANGES and MPD_ERROR.
Removed ENABLE_PLCHANGES and MPD_ERROR.
screen_search: eliminate duplicate results
Merge branch 'master' of git://git.musicpd.org/mithi/ncmpc
screen_search: moved code to screen_search_reload()
This function creates an empty list when the search query has failed.
It is now used on CMD_SCREEN_UPDATE.
This function creates an empty list when the search query has failed.
It is now used on CMD_SCREEN_UPDATE.
screen_search: check for SEARCH_URI in search_simple_query()
Call mpd_search_add_uri_constraint() in this case.
Call mpd_search_add_uri_constraint() in this case.
lyricwiki plugin: updated to their latest layout
hd plugin: fix exit code
mpdclient: removed mpdclient_filelist_get()
Not used anymore.
Not used anymore.
utils: don't use mpdclient_filelist_get() in gcmp_list_from_path()
Use libmpdclient's mpd_send_list_meta() instead. This way, we can
stream MPD's response into the GList, and we don't need to read the
full filelist response.
Use libmpdclient's mpd_send_list_meta() instead. This way, we can
stream MPD's response into the GList, and we don't need to read the
full filelist response.
filelist: removed filelist_prepend()
This hack isn't used anymore.
This hack isn't used anymore.
screen_file: don't use mpdclient_filelist_get()
Use libmpdclient's mpd_send_list_meta() instead. This way, we don't
have to use filelist_prepend() to the first NULL entry.
Use libmpdclient's mpd_send_list_meta() instead. This way, we don't
have to use filelist_prepend() to the first NULL entry.
mpdclient: moved compare_filelistentry() to filelist.c
utils: simplify gcmp_list_from_path() with "continue"
"continue" the loop when one condition fails. This simplifies the
"if" conditions.
"continue" the loop when one condition fails. This simplifies the
"if" conditions.
utils: removed filelist_get()!=NULL check
A filelist object can never have NULL objects (but an entry's entity
object may be NULL).
A filelist object can never have NULL objects (but an entry's entity
object may be NULL).
screen_artist: don't use filelist_prepend()
filelist_prepend() is quite expensive. Let's insert the NULL entry
first, and append all entries while they are received.
filelist_prepend() is quite expensive. Let's insert the NULL entry
first, and append all entries while they are received.
mpdclient: removed mpdclient_filelist_search()
It's unused.
It's unused.
screen_artist: check cursor position in cmd() method
Fix segmentation faults when the list is empty.
Fix segmentation faults when the list is empty.
screen_artist: removed superfluous braces
screen_artist: don't use mpdclient_filelist_search()
Use libmpdclient directly. Side effect is that the listing of an
album includes the artist filter, too. Same album name of different
artists doesn't mix anymore.
Use libmpdclient directly. Side effect is that the listing of an
album includes the artist filter, too. Same album name of different
artists doesn't mix anymore.
screen_browser: select next item after select/add
Commit d08e14fa broke this: previously, the assignment
"cmd=CMD_LIST_NEXT" was passed to list_window_cmd(). With this patch,
list_window_cmd() was called before. Thanks to Thomas Jansen for
finding this one.
Commit d08e14fa broke this: previously, the assignment
"cmd=CMD_LIST_NEXT" was passed to list_window_cmd(). With this patch,
list_window_cmd() was called before. Thanks to Thomas Jansen for
finding this one.
plugin: handle stderr messages of lyrics plugins
Use a second pipe to capture error messages generated by lyrics plugins. If
one plugin succeeds to retrieve some lyrics, we display them and discard the
error messages. If no plugin succeeds, we show the error messages of all
plugins that failed with an exit code other than 69 (EX_UNAVAILABLE,
sysexits.h).
All plugins use exit code 0 to indicate success (i.e. they are able to provide
lyrics on stdout). Exit code 69 indicates failure to retrieve lyrics, but
otherwise normal operation of the plugin. A plugin returning exit code 69 is
not listed as a failed plugin. Other exit codes indicate an internal error in
the plugin. Those plugins are listed as failed along with the output they
provide on stderr.
Use a second pipe to capture error messages generated by lyrics plugins. If
one plugin succeeds to retrieve some lyrics, we display them and discard the
error messages. If no plugin succeeds, we show the error messages of all
plugins that failed with an exit code other than 69 (EX_UNAVAILABLE,
sysexits.h).
All plugins use exit code 0 to indicate success (i.e. they are able to provide
lyrics on stdout). Exit code 69 indicates failure to retrieve lyrics, but
otherwise normal operation of the plugin. A plugin returning exit code 69 is
not listed as a failed plugin. Other exit codes indicate an internal error in
the plugin. Those plugins are listed as failed along with the output they
provide on stderr.
mpdclient: don't check mpd_song_get_uri()!=NULL
libmpdclient guarantees that this function always returns non-NULL.
libmpdclient guarantees that this function always returns non-NULL.
screen_search: pass libmpdclient object to search_simple_query()
Pass mpd_connection instead of mpdclient. Let the caller handle
errors.
Pass mpd_connection instead of mpdclient. Let the caller handle
errors.
filelist: added constructor filelist_new_recv()
This receives a filelist from a mpd_connection. This code has existed
before, and this patch merges those.
This receives a filelist from a mpd_connection. This code has existed
before, and this patch merges those.
screen_search: pass libmpdclient object to search_advanced_query()
Let the caller handle the errors.
Let the caller handle the errors.
screen_search: return NULL if advanced search is not used
After parsing the query, return NULL immediately if no valid advanced
search query could be parsed. Our caller do_search() will then fall
back to the simple search.
After parsing the query, return NULL immediately if no valid advanced
search query could be parsed. Our caller do_search() will then fall
back to the simple search.
screen_search: use strchr() instead of strrstr()
strrstr() is more expensive, and we're just interested in whether
there is a colon, not where.
strrstr() is more expensive, and we're just interested in whether
there is a colon, not where.
screen_search: removed pointless loop in search_advanced_query()
screen_search: renamed filelist_search() to search_simple_query()