aboutsummaryrefslogtreecommitdiffstats
Commit message (Collapse)AuthorAgeFilesLines
...
* use the glib main event loopMax Kellermann2008-09-185-90/+157
| | | | | | | | | | 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.
* screen: check MPD status only if connectedMax Kellermann2008-09-183-42/+61
| | | | | | 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.
* screen: moved code to screen_client_cmd()Max Kellermann2008-09-181-9/+24
| | | | | | 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.
* main: connect while UI is displayedMax Kellermann2008-09-181-39/+21
| | | | | | | | 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.
* libmpdclient: moved code to mpd_recv(), mpd_wait()Max Kellermann2008-09-181-90/+129
| | | | | | 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().
* libmpdclient: smaller input bufferMax Kellermann2008-09-182-6/+5
| | | | | Even for large responses, 16kB should be enough. There is no performance gain for larger buffers, even if MPD is local.
* libmpdclient: smaller error bufferMax Kellermann2008-09-182-21/+23
| | | | | | | 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.
* libmpdclient: use memmove() instead of strcpy() for moving the bufferMax Kellermann2008-09-181-8/+8
| | | | | | | 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.
* libmpdclient: don't strdup() MPD's welcome messageMax Kellermann2008-09-181-7/+3
| | | | | Why bother duplicating the buffer, when we can simply parse the response directly from the input buffer?
* libmpdclient: use size_t and ssize_tMax Kellermann2008-09-182-5/+6
| | | | | | 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.
* screen: removed empty methodsMax Kellermann2008-09-184-49/+0
| | | | | Declaring empty methods is of no use. If a method is empty, we should set it to NULL in the screen_functions struct.
* screen: removed NULL checkMax Kellermann2008-09-181-2/+1
| | | | | Since the screen's initialization is guaranteed, we can remove the NULL check in center_playing_item().
* screen_artist: fix compilation errorsMax Kellermann2008-09-171-26/+29
| | | | | | 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.
* code style, indent with tabs IVMax Kellermann2008-09-175-471/+449
| | | | Follow the same code style als MPD itself.
* browse: when deselecting, don't search twiceMax Kellermann2008-09-171-1/+1
| | | | | When deselecting a song in the file browser, the local variable "idx" was initialized and overwritten. Remove the initialization.
* playlist: added playlist_remove_reuse()Max Kellermann2008-09-172-3/+10
| | | | | | | | | | 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().
* make several functions return voidMax Kellermann2008-09-1710-41/+32
|
* playlist: use playlist_get() instead of playlist_get_song()Max Kellermann2008-09-172-6/+9
|
* list_window: don't reset *highlight to 0Max Kellermann2008-09-174-4/+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.
* lyrics: don't check current.lines==NULLMax Kellermann2008-09-171-2/+2
| | | | | current.lines is always initialized, and cannot be NULL, no need to check it.
* help: return early from list_callback()Max Kellermann2008-09-171-25/+25
|
* help: converted help_text_rows to a macroMax Kellermann2008-09-171-10/+3
| | | | | Why bother counting the elements of help_text[] (with sentinel) at runtime, when the compiler can do it at compile time?
* lyrics: removed lyrics_text_rows, use current.lines->len insteadMax Kellermann2008-09-171-2/+1
| | | | | lyrics_text_rows wasn't set anyway, I somehow removed the code in a patch some time ago.
* list_window: added list_window_center()Max Kellermann2008-09-175-27/+25
| | | | | Merge code which used to be duplicated in the screens "play", "help", "lyrics".
* list_window: added list_window_scroll_cmd()Max Kellermann2008-09-174-69/+62
| | | | | | 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.
* list_window: set repaint at the end of list_window_cmd()Max Kellermann2008-09-171-6/+1
|
* screen: return early in switch_screen_mode() on errorMax Kellermann2008-09-171-7/+7
| | | | | When the selected screen does not exist, return before calling close().
* screen: added macro NUM_SCREENSMax Kellermann2008-09-171-25/+16
| | | | | Since the number of screens is known at compile time, define a macro which calculates this, instead of having a sentinel element.
* screen: close only current screen in screen_exit()Max Kellermann2008-09-171-2/+3
| | | | | Screens which are not active have already been closed, or have never been opened. Don't call close again on them.
* screen: don't store "screen" as a pointerMax Kellermann2008-09-171-140/+135
| | | | | | 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.
* screen: moved code to find_configured_screen()Max Kellermann2008-09-171-10/+13
|
* screen: mode_fn cannot be NULL, removed checksMax Kellermann2008-09-171-17/+9
| | | | | At startup, mode_fn is initialized with &screen_playlist, and it will never be reset to NULL. Remove all checks.
* screen: before calling update(), check if it is definedMax Kellermann2008-09-171-1/+1
| | | | | That seems to be a fn->paint was checked, then the code called fn->update(). Fix this.
* screen: removed screen_functions.get_lw()Max Kellermann2008-09-178-53/+2
| | | | | | 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.
* replaced get_screen_X() with static screen_functions variableMax Kellermann2008-09-1710-208/+134
| | | | | | Compile time initialization saves resources, compared to run-time initialization. Declare all screen_function structs as global variables, and remove all get functions.
* code style, indent with tabs IIIMax Kellermann2008-09-173-112/+104
| | | | Follow the same code style als MPD itself.
* mpdclient: call playlist_clear() in mpdclient_playlist_update()Max Kellermann2008-09-171-2/+1
| | | | | | 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.
* initial draw without delayMax Kellermann2008-09-161-0/+2
| | | | | Due to a missing refresh() call, ncmpc painted the screen after one second. Add refresh(), make ncmpc display immediately.
* screen: added struct namesMax Kellermann2008-09-167-91/+95
| | | | | Let us declare struct names in addition to typedef names, so we can forward-declare them.
* use a C99 compilerMax Kellermann2008-09-161-1/+1
|
* lyrics: converted in-process plugins to external programsMax Kellermann2008-09-1620-1224/+589
| | | | | | | | | | | | | 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
* use GPtrArray instead of GArray for playlist songsMax Kellermann2008-09-162-13/+10
|
* playlist: hide direct accesses in inline functionsMax Kellermann2008-09-163-37/+92
| | | | | | Added functions like playlist_length(), playlist_get(), playlist_replace(), playlist_remove(). Don't access the mpdclient_playlist struct directly.
* mpdclient: added mpdclient_playlist_init(), mpdclient_playlist_clear()Max Kellermann2008-09-163-6/+34
| | | | | | 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()).
* mpdclient: moved code to playlist.cMax Kellermann2008-09-165-111/+174
| | | | | | | | | | 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.
* song: allocate mpd_song from glib slicesMax Kellermann2008-09-161-0/+15
| | | | | | 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.
* song: use struct mpd_songMax Kellermann2008-09-164-44/+44
| | | | | Use a forward declared struct mpd_song instead of the typedef mpd_Song.
* libmpdclient: moved code to song.cMax Kellermann2008-09-165-133/+231
| | | | | Move everything which manipulates the mpd_Song struct to song.c. Thousands of lines of too much for libmpdclient.c!
* mpdclient: add struct names, for forward declarationsMax Kellermann2008-09-161-4/+4
| | | | | | | 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.
* libmpdclient: const pointersMax Kellermann2008-09-162-2/+2
| | | | Pass const pointers whenever possible.