Code

ncmpc.git
16 years agobrowser: use mpdclient_filelist_find_song() in set_highlight()
Max Kellermann [Fri, 19 Sep 2008 12:48:22 +0000 (14:48 +0200)]
browser: use mpdclient_filelist_find_song() in set_highlight()

A song should not be twice in the browser.  Simplify set_highlight()
by finding the entry with mpdclient_filelist_find_song().

16 years agobrowser: song must not be NULL in set_highlight()
Max Kellermann [Fri, 19 Sep 2008 12:45:32 +0000 (14:45 +0200)]
browser: song must not be NULL in set_highlight()

The caller must not pass NULL to set_highlight().  Replaced check with
assertion.

16 years agofilelist: song must not be NULL
Max Kellermann [Fri, 19 Sep 2008 12:42:09 +0000 (14:42 +0200)]
filelist: song must not be NULL

A caller must not pass NULL to mpdclient_filelist_find_song().
Replace the check with an assertion.

16 years agompdclient: moved code to filelist.c
Max Kellermann [Fri, 19 Sep 2008 12:10:37 +0000 (14:10 +0200)]
mpdclient: moved code to filelist.c

Move everything which is solely filelist related to filelist.c and
filelist.h.  Fix the indentation of that file, and provide the struct
name "filelist".  Don't clear data in mpdclient_filelist_free() before
calling g_free().  Constify the "song" parameter to
mpdclient_filelist_find_song().

16 years agocode style, indent with tabs VII
Max Kellermann [Fri, 19 Sep 2008 12:10:35 +0000 (14:10 +0200)]
code style, indent with tabs VII

Follow the same code style als MPD itself.

16 years agofix terminal resizing (SIGWINCH)
Max Kellermann [Fri, 19 Sep 2008 06:02:40 +0000 (08:02 +0200)]
fix terminal resizing (SIGWINCH)

When I replaced ncmpc's old main loop with g_main_loop from libglib,
SIGWINCH (i.e. window resizing) stopped working.  This regression was
caused by the fact that ncurses' wgetch() function was only called
when there was actually data on STDIN.  wgetch() has several side
effects besides reading data from STDIN, for example it checks whether
there has been a window resize.

Fix this with a custom SIGWINCH handler.

16 years agoremoved the clock screen
Max Kellermann [Thu, 18 Sep 2008 21:35:12 +0000 (23:35 +0200)]
removed the clock screen

Why should an audio player display a large clock?

16 years agoscreen_browser: removed entity.song!=NULL check
Max Kellermann [Thu, 18 Sep 2008 21:35:12 +0000 (23:35 +0200)]
screen_browser: removed entity.song!=NULL check

It is guaranteed that the "song" attribute is not NULL, remove the
check.

16 years agoscreen_browser: removed redundant highlight check
Max Kellermann [Thu, 18 Sep 2008 21:35:12 +0000 (23:35 +0200)]
screen_browser: removed redundant highlight check

browser_select_entry() checked the entry's "highlight" flag twice: the
first time, it was toggled, and the second time, action was performed
based on the flag.  Merge the two checks.

16 years agoscreen_browser: removed redundant entity type checks
Max Kellermann [Thu, 18 Sep 2008 21:35:12 +0000 (23:35 +0200)]
screen_browser: removed redundant entity type checks

The function browser_select_entry() returns early when the entity type
is not "SONG".  No need to double check that.

16 years agoscreen_browser: moved code to browser_select_entry()
Max Kellermann [Thu, 18 Sep 2008 21:35:12 +0000 (23:35 +0200)]
screen_browser: moved code to browser_select_entry()

Moved code from browser_handle_select().  Call this new function also
from browser_handle_select_all().  This fixes a bug in select_all():
it actually did not select all, but stopped after the first song.

16 years agoscreen_browser: removed commented code
Max Kellermann [Thu, 18 Sep 2008 21:35:12 +0000 (23:35 +0200)]
screen_browser: removed commented code

16 years agoscreen_browser: moved code to browser_playlist_changed()
Max Kellermann [Thu, 18 Sep 2008 21:35:12 +0000 (23:35 +0200)]
screen_browser: moved code to browser_playlist_changed()

Merge code from all 3 browser screens into one generic browser
function.

16 years agoscreen_browser: moved code to screen_browser.c
Max Kellermann [Thu, 18 Sep 2008 21:35:11 +0000 (23:35 +0200)]
screen_browser: moved code to screen_browser.c

Isolate the generic browser code from the directory browser.

16 years agoscreen_browser: added struct screen_browser
Max Kellermann [Thu, 18 Sep 2008 21:35:11 +0000 (23:35 +0200)]
screen_browser: added struct screen_browser

We are going to separate the browser functions from screen_file.c.
Move all variables which are going to be needed by this code.

16 years agorenamed screen_browse.h to screen_browser.h
Max Kellermann [Thu, 18 Sep 2008 21:35:11 +0000 (23:35 +0200)]
renamed screen_browse.h to screen_browser.h

16 years agocode style, indent with tabs VI
Max Kellermann [Thu, 18 Sep 2008 21:35:10 +0000 (23:35 +0200)]
code style, indent with tabs VI

Follow the same code style als MPD itself.

16 years agoadded support for wide characters
Max Kellermann [Thu, 18 Sep 2008 11:18:16 +0000 (13:18 +0200)]
added support for wide characters

This patch was taken from bug 476, author unknown
(http://www.musicpd.org/mantis/view.php?id=476).  It changes the
definition of my_strlen(): instead of returning the number of UTF-8
characters, it counts the number of terminal cells occupied by a
string.

16 years agocode style, indent with tabs V
Max Kellermann [Thu, 18 Sep 2008 10:53:35 +0000 (12:53 +0200)]
code style, indent with tabs V

Follow the same code style als MPD itself.

16 years agoscreen: don't handle CMD_PLAY
Max Kellermann [Thu, 18 Sep 2008 10:32:09 +0000 (12:32 +0200)]
screen: don't handle CMD_PLAY

CMD_PLAY is mapped to the Enter key by default.  Some screens
(mis-)use it for navigation, for entering a directory.  The playlist
screen actually plays the file under the cursor.  On all other
screens, pressing Enter may be confusing, since it is more of a
"confirmation" key instead of "play".  We should probaby add
CMD_CONFIRM later, but for now, disable the general CMD_PLAY handler
in screen.c.  This fixes bug 240.

16 years agolibmpdclient: added resolver library
Max Kellermann [Thu, 18 Sep 2008 09:17:17 +0000 (11:17 +0200)]
libmpdclient: added resolver library

The resolver library provides unified access to all resolvers
(getaddrinfo(), gethostbyname(), Unix domain sockets).  Like
getaddrinfo(), it can return more than one address for a host name.
This fixes bug 1517 (http://www.musicpd.org/mantis/view.php?id=1517).

16 years agoquit with g_main_loop_quit()
Max Kellermann [Thu, 18 Sep 2008 07:44:01 +0000 (09:44 +0200)]
quit with g_main_loop_quit()

Call g_main_loop_quit() on CMD_QUIT, instead of exit() with an
atexit() handler.

16 years agoplaylist: reset id in playlist_clear()
Max Kellermann [Wed, 17 Sep 2008 23:57:34 +0000 (01:57 +0200)]
playlist: reset id in playlist_clear()

The playlist is reset when the connection to the MPD server is
closed.  After a successful reconnect, we have to reload the full
playlist.  To remember this, also reset the id attribute.

16 years agoplaylist: removed "updated" flag
Max Kellermann [Wed, 17 Sep 2008 23:55:45 +0000 (01:55 +0200)]
playlist: removed "updated" flag

The caller may check the playlist.id instead of checking the old
"updated" flag.

16 years agouse the glib main event loop
Max Kellermann [Wed, 17 Sep 2008 23:49:53 +0000 (01:49 +0200)]
use the glib main event loop

This big patch replaces our custom main loop with the event based glib
main loop.  This has several advantages: we can make all the tiny code
bits in the main loop independent from each others, we can add
additional file descriptors for polling (e.g. the mpdclient socket).

We don't need the ncurses timeout() anymore, because glib will poll
stdin for us.

16 years agoscreen: check MPD status only if connected
Max Kellermann [Wed, 17 Sep 2008 23:15:20 +0000 (01:15 +0200)]
screen: check MPD status only if connected

Fix several segmentation faults: when the connection to the MPD server
is lost, there were NULL pointer dereferences because
client->status==NULL.  Check before accessing it.

16 years agoscreen: moved code to screen_client_cmd()
Max Kellermann [Wed, 17 Sep 2008 23:14:00 +0000 (01:14 +0200)]
screen: moved code to screen_client_cmd()

Move all command handlers which need a connection to the MPD server to
screen_client_cmd().  This will allow us to unify error handling
later.

16 years agomain: connect while UI is displayed
Max Kellermann [Wed, 17 Sep 2008 23:13:02 +0000 (01:13 +0200)]
main: connect while UI is displayed

Display the UI always, and show connection errors there.  This fixes a
lot of consistency problems: error messages used to be printed to
stderr, but afterwards, the atexit() handlers deinitialized ncurses
and the screen was cleared.  This patch is still problematic, but
constitutes a good step forward.

16 years agolibmpdclient: moved code to mpd_recv(), mpd_wait()
Max Kellermann [Wed, 17 Sep 2008 23:10:40 +0000 (01:10 +0200)]
libmpdclient: moved code to mpd_recv(), mpd_wait()

Create generic utility functions for doint I/O: two wait functions,
and mpd_recv() fills the input buffer.  These functions are used in
mpd_newConnection() and mpd_getNextReturnElement().

16 years agolibmpdclient: smaller input buffer
Max Kellermann [Wed, 17 Sep 2008 23:07:16 +0000 (01:07 +0200)]
libmpdclient: smaller input buffer

Even for large responses, 16kB should be enough.  There is no
performance gain for larger buffers, even if MPD is local.

16 years agolibmpdclient: smaller error buffer
Max Kellermann [Wed, 17 Sep 2008 23:05:16 +0000 (01:05 +0200)]
libmpdclient: smaller error buffer

512 characters should be well enough for error messages which are
actually being displayed somewhere.  Use sizeof(errorStr) instead of
MPD_BUFFER_MAX_LENGTH everywhere.  Do proper length checking when
copying the output buffer to errorStr.

16 years agolibmpdclient: use memmove() instead of strcpy() for moving the buffer
Max Kellermann [Wed, 17 Sep 2008 23:05:14 +0000 (01:05 +0200)]
libmpdclient: use memmove() instead of strcpy() for moving the buffer

In general, don't treat the input buffer as a null-terminated string:
don't append '\0', don't use strchr() and strtok().  To delete
consumed portions of the buffer, strcpy() is bad anyway, because it
does not allow overlapping buffers.

16 years agolibmpdclient: don't strdup() MPD's welcome message
Max Kellermann [Wed, 17 Sep 2008 23:00:12 +0000 (01:00 +0200)]
libmpdclient: don't strdup() MPD's welcome message

Why bother duplicating the buffer, when we can simply parse the
response directly from the input buffer?

16 years agolibmpdclient: use size_t and ssize_t
Max Kellermann [Wed, 17 Sep 2008 22:59:40 +0000 (00:59 +0200)]
libmpdclient: use size_t and ssize_t

When working with buffer lengths and recv() results, we should declare
size_t and ssize_t variables, otherwise the code may fail on 64 bit
machines.

16 years agoscreen: removed empty methods
Max Kellermann [Wed, 17 Sep 2008 22:58:40 +0000 (00:58 +0200)]
screen: removed empty methods

Declaring empty methods is of no use.  If a method is empty, we should
set it to NULL in the screen_functions struct.

16 years agoscreen: removed NULL check
Max Kellermann [Wed, 17 Sep 2008 22:57:50 +0000 (00:57 +0200)]
screen: removed NULL check

Since the screen's initialization is guaranteed, we can remove the
NULL check in center_playing_item().

16 years agoscreen_artist: fix compilation errors
Max Kellermann [Wed, 17 Sep 2008 19:09:21 +0000 (21:09 +0200)]
screen_artist: fix compilation errors

Unfortunately when I fixed the GCC warnings and refactored lots of the
code, the "artist" screen was disabled.  This patch applies all API
changes and fixes all warnings.

16 years agocode style, indent with tabs IV
Max Kellermann [Wed, 17 Sep 2008 19:08:06 +0000 (21:08 +0200)]
code style, indent with tabs IV

Follow the same code style als MPD itself.

16 years agobrowse: when deselecting, don't search twice
Max Kellermann [Wed, 17 Sep 2008 10:29:24 +0000 (12:29 +0200)]
browse: when deselecting, don't search twice

When deselecting a song in the file browser, the local variable "idx"
was initialized and overwritten.  Remove the initialization.

16 years agoplaylist: added playlist_remove_reuse()
Max Kellermann [Wed, 17 Sep 2008 10:29:15 +0000 (12:29 +0200)]
playlist: added playlist_remove_reuse()

playlist_remove_reuse() removes a song from the playlist, but does not
free it.

Use this function in mpdclient_cmd_delete() to fix a segmentation
fault: the song pointer was still used after it was freed, by passing
it to mpdclient_playlist_callback().  Free the song manually now.
Reorganize and simply some code in mpdclient_cmd_delete().

16 years agomake several functions return void
Max Kellermann [Wed, 17 Sep 2008 10:29:07 +0000 (12:29 +0200)]
make several functions return void

16 years agoplaylist: use playlist_get() instead of playlist_get_song()
Max Kellermann [Wed, 17 Sep 2008 10:29:06 +0000 (12:29 +0200)]
playlist: use playlist_get() instead of playlist_get_song()

16 years agolist_window: don't reset *highlight to 0
Max Kellermann [Wed, 17 Sep 2008 10:25:52 +0000 (12:25 +0200)]
list_window: don't reset *highlight to 0

Since the list_window code sets highlight to 0 before it calls the
list_callback, the callback itself doesn't have to reset the flag.

16 years agolyrics: don't check current.lines==NULL
Max Kellermann [Wed, 17 Sep 2008 10:25:48 +0000 (12:25 +0200)]
lyrics: don't check current.lines==NULL

current.lines is always initialized, and cannot be NULL, no need to
check it.

16 years agohelp: return early from list_callback()
Max Kellermann [Wed, 17 Sep 2008 10:25:41 +0000 (12:25 +0200)]
help: return early from list_callback()

16 years agohelp: converted help_text_rows to a macro
Max Kellermann [Wed, 17 Sep 2008 10:25:40 +0000 (12:25 +0200)]
help: converted help_text_rows to a macro

Why bother counting the elements of help_text[] (with sentinel) at
runtime, when the compiler can do it at compile time?

16 years agolyrics: removed lyrics_text_rows, use current.lines->len instead
Max Kellermann [Wed, 17 Sep 2008 10:24:56 +0000 (12:24 +0200)]
lyrics: removed lyrics_text_rows, use current.lines->len instead

lyrics_text_rows wasn't set anyway, I somehow removed the code in a
patch some time ago.

16 years agolist_window: added list_window_center()
Max Kellermann [Wed, 17 Sep 2008 10:20:42 +0000 (12:20 +0200)]
list_window: added list_window_center()

Merge code which used to be duplicated in the screens "play", "help",
"lyrics".

16 years agolist_window: added list_window_scroll_cmd()
Max Kellermann [Wed, 17 Sep 2008 10:18:00 +0000 (12:18 +0200)]
list_window: added list_window_scroll_cmd()

It is similar to list_window_cmd(), but it scrolls the window instead
of moving the selection.  It is used by the "lyrics" and the "help"
screen.

16 years agolist_window: set repaint at the end of list_window_cmd()
Max Kellermann [Wed, 17 Sep 2008 10:08:09 +0000 (12:08 +0200)]
list_window: set repaint at the end of list_window_cmd()

16 years agoscreen: return early in switch_screen_mode() on error
Max Kellermann [Wed, 17 Sep 2008 10:08:06 +0000 (12:08 +0200)]
screen: return early in switch_screen_mode() on error

When the selected screen does not exist, return before calling
close().

16 years agoscreen: added macro NUM_SCREENS
Max Kellermann [Wed, 17 Sep 2008 10:08:03 +0000 (12:08 +0200)]
screen: added macro NUM_SCREENS

Since the number of screens is known at compile time, define a macro
which calculates this, instead of having a sentinel element.

16 years agoscreen: close only current screen in screen_exit()
Max Kellermann [Wed, 17 Sep 2008 10:07:32 +0000 (12:07 +0200)]
screen: close only current screen in screen_exit()

Screens which are not active have already been closed, or have never
been opened.  Don't call close again on them.

16 years agoscreen: don't store "screen" as a pointer
Max Kellermann [Wed, 17 Sep 2008 10:07:02 +0000 (12:07 +0200)]
screen: don't store "screen" as a pointer

There can only be onle screen struct instance at a time.  Declare it
as a static struct, instead of a pointer to the struct.  This
simplifies all accesses, and avoids the dynamic allocation.

16 years agoscreen: moved code to find_configured_screen()
Max Kellermann [Wed, 17 Sep 2008 10:06:14 +0000 (12:06 +0200)]
screen: moved code to find_configured_screen()

16 years agoscreen: mode_fn cannot be NULL, removed checks
Max Kellermann [Wed, 17 Sep 2008 10:06:11 +0000 (12:06 +0200)]
screen: mode_fn cannot be NULL, removed checks

At startup, mode_fn is initialized with &screen_playlist, and it will
never be reset to NULL.  Remove all checks.

16 years agoscreen: before calling update(), check if it is defined
Max Kellermann [Wed, 17 Sep 2008 10:06:05 +0000 (12:06 +0200)]
screen: before calling update(), check if it is defined

That seems to be a fn->paint was checked, then the code called
fn->update().  Fix this.

16 years agoscreen: removed screen_functions.get_lw()
Max Kellermann [Wed, 17 Sep 2008 10:06:04 +0000 (12:06 +0200)]
screen: removed screen_functions.get_lw()

If it is really important to set the curser, we should think of a
better way, instead of exporting one non-generic method.  For now,
just set the cursor to the origin.

16 years agoreplaced get_screen_X() with static screen_functions variable
Max Kellermann [Wed, 17 Sep 2008 10:05:02 +0000 (12:05 +0200)]
replaced get_screen_X() with static screen_functions variable

Compile time initialization saves resources, compared to run-time
initialization.  Declare all screen_function structs as global
variables, and remove all get functions.

16 years agocode style, indent with tabs III
Max Kellermann [Wed, 17 Sep 2008 10:03:43 +0000 (12:03 +0200)]
code style, indent with tabs III

Follow the same code style als MPD itself.

16 years agompdclient: call playlist_clear() in mpdclient_playlist_update()
Max Kellermann [Wed, 17 Sep 2008 05:21:30 +0000 (07:21 +0200)]
mpdclient: call playlist_clear() in mpdclient_playlist_update()

Instead of freeing the playlist with mpdclient_playlist_free(), call
playlist_clear() to empty the song list.  This fixes a segmentation
fault which occured when you cleared the playlist.

16 years agoinitial draw without delay
Max Kellermann [Tue, 16 Sep 2008 17:44:37 +0000 (19:44 +0200)]
initial draw without delay

Due to a missing refresh() call, ncmpc painted the screen after one
second.  Add refresh(), make ncmpc display immediately.

16 years agoscreen: added struct names
Max Kellermann [Tue, 16 Sep 2008 17:11:40 +0000 (19:11 +0200)]
screen: added struct names

Let us declare struct names in addition to typedef names, so we can
forward-declare them.

16 years agouse a C99 compiler
Max Kellermann [Tue, 16 Sep 2008 17:11:40 +0000 (19:11 +0200)]
use a C99 compiler

16 years agolyrics: converted in-process plugins to external programs
Max Kellermann [Tue, 16 Sep 2008 17:11:40 +0000 (19:11 +0200)]
lyrics: converted in-process plugins to external programs

In-process plugins are very problematic.  It is much easier and
flexible to move the lyrics plugins to external programs, with a
trivial protocol.  This is work in progress, among the things missing:

 - protocol specification, including exit codes
 - plugin installation
 - plugin search directory
 - run-time configuration (currently hard coded)
 - automatic polling (using glib's main loop?)
 - better and more robust error handling

16 years agouse GPtrArray instead of GArray for playlist songs
Max Kellermann [Tue, 16 Sep 2008 17:11:40 +0000 (19:11 +0200)]
use GPtrArray instead of GArray for playlist songs

16 years agoplaylist: hide direct accesses in inline functions
Max Kellermann [Tue, 16 Sep 2008 17:11:39 +0000 (19:11 +0200)]
playlist: hide direct accesses in inline functions

Added functions like playlist_length(), playlist_get(),
playlist_replace(), playlist_remove().  Don't access the
mpdclient_playlist struct directly.

16 years agompdclient: added mpdclient_playlist_init(), mpdclient_playlist_clear()
Max Kellermann [Tue, 16 Sep 2008 17:11:39 +0000 (19:11 +0200)]
mpdclient: added mpdclient_playlist_init(), mpdclient_playlist_clear()

Moved code from mpdclient_new() and mpdclient_playlist_free().  In
mpdclient_disconnect(), call mpdclient_playlist_clear() instead of
mpdclient_playlist_free() (which is now called in mpdclient_free()).

16 years agompdclient: moved code to playlist.c
Max Kellermann [Tue, 16 Sep 2008 17:11:39 +0000 (19:11 +0200)]
mpdclient: moved code to playlist.c

Move everything which manipulates the mpdclient_playlist struct to
playlist.c.  Many of the functions get a mpdclient pointer instead of
a playlist; this will be changed later.

The functions mpdclient_playlist_update() and
mpdclient_playlist_update_changes() stay in mpdclient.c for now, since
they are tightly connected to the client code.

16 years agosong: allocate mpd_song from glib slices
Max Kellermann [Tue, 16 Sep 2008 17:11:39 +0000 (19:11 +0200)]
song: allocate mpd_song from glib slices

Since we compile ncmpc with glib, we can use its slice allocator for
efficient song allocation.  I have added a way to disable this with a
macro.

16 years agosong: use struct mpd_song
Max Kellermann [Tue, 16 Sep 2008 17:11:39 +0000 (19:11 +0200)]
song: use struct mpd_song

Use a forward declared struct mpd_song instead of the typedef
mpd_Song.

16 years agolibmpdclient: moved code to song.c
Max Kellermann [Tue, 16 Sep 2008 17:11:39 +0000 (19:11 +0200)]
libmpdclient: moved code to song.c

Move everything which manipulates the mpd_Song struct to song.c.
Thousands of lines of too much for libmpdclient.c!

16 years agompdclient: add struct names, for forward declarations
Max Kellermann [Tue, 16 Sep 2008 17:11:39 +0000 (19:11 +0200)]
mpdclient: add struct names, for forward declarations

To relax the include dependencies, give all structs real names, in
addition to the typedef names.  This way, other headers can
forward-declare them, and do not need to include mpdclient.h.  In the
future, the typedefs will be removed.

16 years agolibmpdclient: const pointers
Max Kellermann [Tue, 16 Sep 2008 17:11:39 +0000 (19:11 +0200)]
libmpdclient: const pointers

Pass const pointers whenever possible.

16 years agocode style, indent with tabs II
Max Kellermann [Tue, 16 Sep 2008 17:11:36 +0000 (19:11 +0200)]
code style, indent with tabs II

Follow the same code style als MPD itself.

16 years agolist_window: update variables without looping
Max Kellermann [Tue, 16 Sep 2008 16:52:55 +0000 (18:52 +0200)]
list_window: update variables without looping

Apparently, somebody was too lazy to derive the formulas for cursor
movement, and wrote lots of while loops.

16 years agoinclude cleanup
Max Kellermann [Tue, 16 Sep 2008 16:52:55 +0000 (18:52 +0200)]
include cleanup

Include only headers which are really used.

16 years agodon't use libncursesw if libncurses was selected
Max Kellermann [Tue, 16 Sep 2008 16:52:54 +0000 (18:52 +0200)]
don't use libncursesw if libncurses was selected

No idea what this code was intended for, but if the user chooses
libncurses, ncmpc shouldn't override this manual choice if it finds
libncursesw.

16 years agoadded myself to AUTHORS
Max Kellermann [Tue, 16 Sep 2008 16:52:54 +0000 (18:52 +0200)]
added myself to AUTHORS

16 years agoset version to 0.12~git
Max Kellermann [Tue, 16 Sep 2008 16:52:54 +0000 (18:52 +0200)]
set version to 0.12~git

We are on git now, and since we are doing major changes, increase the
version number.

16 years agoeasy_download: fixed the type of write_data()
Max Kellermann [Mon, 15 Sep 2008 11:27:33 +0000 (13:27 +0200)]
easy_download: fixed the type of write_data()

Fix the type of write_data() to fit curl_write_callback.

16 years agouse GArray for playlist instead of GList
Max Kellermann [Mon, 15 Sep 2008 11:27:33 +0000 (13:27 +0200)]
use GArray for playlist instead of GList

Using a doubly linked list for the local playlist copy is a huge waste
of both memory and CPU cycles.  Use GArray instead of GList, which is
much faster in this case.

16 years agofree info entity while iterating
Max Kellermann [Mon, 15 Sep 2008 11:27:33 +0000 (13:27 +0200)]
free info entity while iterating

Memory leak: the function mpdclient_playlist_update_changes() did not
free the entity which was returned by mpd_getNextInfoEntity().  Add a
mpd_freeInfoEntity() call at the end of each iteration.

16 years agomanage tag string allocations in a pool
Max Kellermann [Mon, 15 Sep 2008 11:27:33 +0000 (13:27 +0200)]
manage tag string allocations in a pool

There are many duplicated strings in the tag database, e.g. many songs
having the same artist.  Don't allocate such strings twice, manage all
strings in a pool.

16 years agoadded support for unix domain sockets
Max Kellermann [Mon, 15 Sep 2008 11:27:33 +0000 (13:27 +0200)]
added support for unix domain sockets

If a host name starts with a slash, it is assumed to be a unix domain
socket path.  The port is ignored.  This code is disabled on WIN32,
until someone tests it.

16 years agolyrics: missing "break"
Max Kellermann [Mon, 15 Sep 2008 11:27:33 +0000 (13:27 +0200)]
lyrics: missing "break"

If get_text_line() fails, we should break from the loop.

16 years agolyrics: converted global variables to static
Max Kellermann [Mon, 15 Sep 2008 11:27:32 +0000 (13:27 +0200)]
lyrics: converted global variables to static

The variables "lyrics_text_rows" and "lw" were declared in
src_lyrics.h as static, but they were only actually used in
screen_lyrics.c.  Move both there.

16 years agofix unused parameter warnings
Max Kellermann [Mon, 15 Sep 2008 11:27:32 +0000 (13:27 +0200)]
fix unused parameter warnings

Add the "unused" attribute to all function parameters which are indeed
going to be ignored.

16 years agoimported gcc.h from mpd
Max Kellermann [Mon, 15 Sep 2008 11:27:32 +0000 (13:27 +0200)]
imported gcc.h from mpd

gcc.h contains a useful set of macros for setting attributes.

16 years agodon't declare local variable "options"
Max Kellermann [Mon, 15 Sep 2008 11:27:32 +0000 (13:27 +0200)]
don't declare local variable "options"

In main.c, the global variable "options" is used all over, except in
main(), which contains a shadowing declaration of it.  Remove this
local variable, and use the global "options" instead.  Also don't
pollute conf.c's namespace with the global variable with a CPP hack
(to be removed when we have fixed more of ncmpc's namespace
pollution).

16 years agouse size_t and unsigned integers
Max Kellermann [Mon, 15 Sep 2008 11:27:30 +0000 (13:27 +0200)]
use size_t and unsigned integers

16 years agofixed mixed declaration + code
Max Kellermann [Mon, 15 Sep 2008 10:27:29 +0000 (12:27 +0200)]
fixed mixed declaration + code

Although they are allowedd in C99, try to avoid them.  Move variable
declarations to the top of the current scope.

16 years agofix shadow warnings
Max Kellermann [Mon, 15 Sep 2008 10:27:29 +0000 (12:27 +0200)]
fix shadow warnings

Rename local variables and function parameters, so they don't shadow
global variables.

16 years agoinclude cleanup
Max Kellermann [Mon, 15 Sep 2008 10:27:29 +0000 (12:27 +0200)]
include cleanup

A header should include all headers which he needs.  Move local
includes on top, and let foo.c include foo.h in the first line, to
automatically test its dependencies.

16 years agoscreen_auth() returns result
Max Kellermann [Mon, 15 Sep 2008 10:27:29 +0000 (12:27 +0200)]
screen_auth() returns result

screen_auth() returns an int, and its result is actually being used.
Only the "return" was missing in its implementation.  Return
_screen_auth()'s result.

16 years agofix function prototypes
Max Kellermann [Mon, 15 Sep 2008 10:27:29 +0000 (12:27 +0200)]
fix function prototypes

Add missing prototypes, and fix wrong prototypes.  Convert lots of
functions to "static" when they are only used within the current
source file.

16 years agoconst pointers
Max Kellermann [Mon, 15 Sep 2008 10:27:28 +0000 (12:27 +0200)]
const pointers

Convert pointers to const whenever it is possible.  Fixes all those
-Wconst warnings.

16 years agoclock: don't initialize static variables with zero
Max Kellermann [Mon, 15 Sep 2008 10:27:28 +0000 (12:27 +0200)]
clock: don't initialize static variables with zero

Uninitialized static variables are put into BSS, which is
automatically zeroed.  Initializing doesn't hurt, but in this case,
there were elements missing, emitting a gcc warning.

16 years agoscreen: moved code to paint_top_window2()
Max Kellermann [Mon, 15 Sep 2008 10:27:28 +0000 (12:27 +0200)]
screen: moved code to paint_top_window2()

Nearly all of the code in paint_top_window() is on indent level 2,
just because it depends on a condition.  Make this more readable and
move to indent level 1 by moving this code to a separate function.

16 years agouse !NDEBUG instead of DEBUG
Max Kellermann [Mon, 15 Sep 2008 10:27:28 +0000 (12:27 +0200)]
use !NDEBUG instead of DEBUG

NDEBUG is more commonly used than DEBUG, e.g. in assert.h.  Convert
all macros to NDEBUG, and declare NDEBUG when debugging is disabled.