diff options
| -rw-r--r-- | src/main.c | 19 | ||||
| -rw-r--r-- | src/settings.h | 2 | ||||
| -rw-r--r-- | src/ui.c | 33 | ||||
| -rw-r--r-- | src/ui.h | 11 | ||||
| -rw-r--r-- | src/ui_act.c | 19 | ||||
| -rw-r--r-- | src/ui_readline.c | 20 | ||||
| -rw-r--r-- | src/ui_readline.h | 8 | 
7 files changed, 60 insertions, 52 deletions
@@ -106,13 +106,13 @@ int main (int argc, char **argv) {  	if (settings.username == NULL) {  		char nameBuf[100];  		BarUiMsg (MSG_QUESTION, "Username: "); -		BarReadlineStr (nameBuf, sizeof (nameBuf), 0); +		BarReadlineStr (nameBuf, sizeof (nameBuf), 0, stdin);  		settings.username = strdup (nameBuf);  	}  	if (settings.password == NULL) {  		char passBuf[100];  		BarUiMsg (MSG_QUESTION, "Password: "); -		BarReadlineStr (passBuf, sizeof (passBuf), 1); +		BarReadlineStr (passBuf, sizeof (passBuf), 1, stdin);  		settings.password = strdup (passBuf);  		BarUiMsg (MSG_NONE, "\n");  	} @@ -155,7 +155,7 @@ int main (int argc, char **argv) {  	}  	/* no autostart? ask the user */  	if (curStation == NULL) { -		curStation = BarUiSelectStation (&ph, "Select station: "); +		curStation = BarUiSelectStation (&ph, "Select station: ", stdin);  	}  	if (curStation != NULL) {  		BarUiPrintStation (curStation); @@ -250,19 +250,20 @@ int main (int argc, char **argv) {  		/* in the meantime: wait for user actions;  		 * 1000ms == 1s => refresh time display every second */  		if (poll (polls, pollsLen, 1000) > 0) { +			FILE *curFd = NULL; +  			if (polls[0].revents & POLLIN) { -				buf = fgetc (stdin); +				curFd = stdin;  			} else if (polls[1].revents & POLLIN) { -				buf = fgetc (ctlFd); +				curFd = ctlFd;  			} +			buf = fgetc (curFd);  			curShortcut = settings.keys; -			/* don't show what the user enters here, we could disable -			 * echoing too... */ -			BarUiMsg (MSG_NONE, "\r"); +  			while (curShortcut != NULL) {  				if (curShortcut->key == buf) {  					curShortcut->cmd (&ph, &player, &settings, &curSong, -							&curStation, &doQuit); +							&curStation, &doQuit, curFd);  					break;  				}  				curShortcut = curShortcut->next; diff --git a/src/settings.h b/src/settings.h index 3fed541..1f8b63d 100644 --- a/src/settings.h +++ b/src/settings.h @@ -31,7 +31,7 @@ THE SOFTWARE.  #define BAR_KS_ARGS PianoHandle_t *ph, struct audioPlayer *player, \  		struct BarSettings *settings, PianoSong_t **curSong, \ -		PianoStation_t **curStation, char *doQuit +		PianoStation_t **curStation, char *doQuit, FILE *curFd  struct BarSettings {  	char *username; @@ -149,7 +149,8 @@ PianoStation_t **BarSortedStations (PianoStation_t *unsortedStations) {   *	@param piano handle   *	@return pointer to selected station or NULL   */ -PianoStation_t *BarUiSelectStation (PianoHandle_t *ph, const char *prompt) { +PianoStation_t *BarUiSelectStation (PianoHandle_t *ph, const char *prompt, +		FILE *curFd) {  	PianoStation_t **ss = NULL, **ssCurr = NULL, *retStation;  	int i = 0; @@ -167,7 +168,7 @@ PianoStation_t *BarUiSelectStation (PianoHandle_t *ph, const char *prompt) {  	}  	BarUiMsg (MSG_QUESTION, prompt); -	if (BarReadlineInt (&i) == 0) { +	if (BarReadlineInt (&i, curFd) == 0) {  		free (ss);  		return NULL;  	} @@ -185,7 +186,7 @@ PianoStation_t *BarUiSelectStation (PianoHandle_t *ph, const char *prompt) {   *	@param song list   *	@return pointer to selected item in song list or NULL   */ -PianoSong_t *BarUiSelectSong (PianoSong_t *startSong) { +PianoSong_t *BarUiSelectSong (PianoSong_t *startSong, FILE *curFd) {  	PianoSong_t *tmpSong = NULL;  	int i = 0; @@ -198,7 +199,7 @@ PianoSong_t *BarUiSelectSong (PianoSong_t *startSong) {  		tmpSong = tmpSong->next;  	}  	BarUiMsg (MSG_QUESTION, "Select song: "); -	if (BarReadlineInt (&i) == 0) { +	if (BarReadlineInt (&i, curFd) == 0) {  		return NULL;  	}  	tmpSong = startSong; @@ -213,7 +214,7 @@ PianoSong_t *BarUiSelectSong (PianoSong_t *startSong) {   *	@param artists (linked list)   *	@return pointer to selected artist or NULL on abort   */ -PianoArtist_t *BarUiSelectArtist (PianoArtist_t *startArtist) { +PianoArtist_t *BarUiSelectArtist (PianoArtist_t *startArtist, FILE *curFd) {  	PianoArtist_t *tmpArtist = NULL;  	int i = 0; @@ -225,7 +226,7 @@ PianoArtist_t *BarUiSelectArtist (PianoArtist_t *startArtist) {  		tmpArtist = tmpArtist->next;  	}  	BarUiMsg (MSG_QUESTION, "Select artist: "); -	if (BarReadlineInt (&i) == 0) { +	if (BarReadlineInt (&i, curFd) == 0) {  		return NULL;  	}  	tmpArtist = startArtist; @@ -240,7 +241,7 @@ PianoArtist_t *BarUiSelectArtist (PianoArtist_t *startArtist) {   *	@param piano handle   *	@return musicId or NULL on abort/error   */ -char *BarUiSelectMusicId (const PianoHandle_t *ph) { +char *BarUiSelectMusicId (const PianoHandle_t *ph, FILE *curFd) {  	char *musicId = NULL;  	char lineBuf[100], selectBuf[2];  	PianoSearchResult_t searchResult; @@ -248,7 +249,7 @@ char *BarUiSelectMusicId (const PianoHandle_t *ph) {  	PianoSong_t *tmpSong;  	BarUiMsg (MSG_QUESTION, "Search for artist/title: "); -	if (BarReadlineStr (lineBuf, sizeof (lineBuf), 0) > 0) { +	if (BarReadlineStr (lineBuf, sizeof (lineBuf), 0, curFd) > 0) {  		BarUiMsg (MSG_INFO, "Searching... ");  		if (BarUiPrintPianoStatus (PianoSearchMusic (ph, lineBuf,  				&searchResult)) != PIANO_RET_OK) { @@ -259,27 +260,27 @@ char *BarUiSelectMusicId (const PianoHandle_t *ph) {  			/* songs and artists found */  			BarUiMsg (MSG_QUESTION, "Is this an [a]rtist or [t]rack name? "  					"Press c to abort. "); -			BarReadline (selectBuf, sizeof (selectBuf), "atc", 1, 0); +			BarReadline (selectBuf, sizeof (selectBuf), "atc", 1, 0, curFd);  			if (*selectBuf == 'a') { -				tmpArtist = BarUiSelectArtist (searchResult.artists); +				tmpArtist = BarUiSelectArtist (searchResult.artists, curFd);  				if (tmpArtist != NULL) {  					musicId = strdup (tmpArtist->musicId);  				}  			} else if (*selectBuf == 't') { -				tmpSong = BarUiSelectSong (searchResult.songs); +				tmpSong = BarUiSelectSong (searchResult.songs, curFd);  				if (tmpSong != NULL) {  					musicId = strdup (tmpSong->musicId);  				}  			}  		} else if (searchResult.songs != NULL) {  			/* songs found */ -			tmpSong = BarUiSelectSong (searchResult.songs); +			tmpSong = BarUiSelectSong (searchResult.songs, curFd);  			if (tmpSong != NULL) {  				musicId = strdup (tmpSong->musicId);  			}  		} else if (searchResult.artists != NULL) {  			/* artists found */ -			tmpArtist = BarUiSelectArtist (searchResult.artists); +			tmpArtist = BarUiSelectArtist (searchResult.artists, curFd);  			if (tmpArtist != NULL) {  				musicId = strdup (tmpArtist->musicId);  			} @@ -295,7 +296,7 @@ char *BarUiSelectMusicId (const PianoHandle_t *ph) {  /*	browse genre stations and create shared station   *	@param piano handle   */ -void BarStationFromGenre (PianoHandle_t *ph) { +void BarStationFromGenre (PianoHandle_t *ph, FILE *curFd) {  	int i;  	PianoGenreCategory_t *curCat;  	PianoStation_t *curStation; @@ -319,7 +320,7 @@ void BarStationFromGenre (PianoHandle_t *ph) {  	}  	/* select category or exit */  	BarUiMsg (MSG_QUESTION, "Select category: "); -	if (BarReadlineInt (&i) == 0) { +	if (BarReadlineInt (&i, curFd) == 0) {  		return;  	}  	curCat = ph->genreStations; @@ -337,7 +338,7 @@ void BarStationFromGenre (PianoHandle_t *ph) {  		curStation = curStation->next;  	}  	BarUiMsg (MSG_QUESTION, "Select genre: "); -	if (BarReadlineInt (&i) == 0) { +	if (BarReadlineInt (&i, curFd) == 0) {  		return;  	}  	curStation = curCat->stations; @@ -33,11 +33,12 @@ typedef enum {MSG_NONE, MSG_INFO, MSG_PLAYING, MSG_TIME, MSG_ERR,  inline void BarUiMsg (uiMsg_t type, const char *format, ...);  inline PianoReturn_t BarUiPrintPianoStatus (PianoReturn_t ret); -PianoStation_t *BarUiSelectStation (PianoHandle_t *ph, const char *prompt); -PianoSong_t *BarUiSelectSong (PianoSong_t *startSong); -PianoArtist_t *BarUiSelectArtist (PianoArtist_t *startArtist); -char *BarUiSelectMusicId (const PianoHandle_t *ph); -void BarStationFromGenre (PianoHandle_t *ph); +PianoStation_t *BarUiSelectStation (PianoHandle_t *ph, const char *prompt, +		FILE *curFd); +PianoSong_t *BarUiSelectSong (PianoSong_t *startSong, FILE *curFd); +PianoArtist_t *BarUiSelectArtist (PianoArtist_t *startArtist, FILE *curFd); +char *BarUiSelectMusicId (const PianoHandle_t *ph, FILE *curFd); +void BarStationFromGenre (PianoHandle_t *ph, FILE *curFd);  inline void BarUiPrintStation (PianoStation_t *);  inline void BarUiPrintSong (PianoSong_t *, PianoStation_t *);  void BarUiStartEventCmd (const BarSettings_t *settings, const char *type, diff --git a/src/ui_act.c b/src/ui_act.c index 951116e..b897d93 100644 --- a/src/ui_act.c +++ b/src/ui_act.c @@ -86,7 +86,7 @@ void BarUiActAddMusic (BAR_KS_ARGS) {  	RETURN_IF_NO_STATION; -	musicId = BarUiSelectMusicId (ph); +	musicId = BarUiSelectMusicId (ph, curFd);  	if (musicId != NULL) {  		if (!BarTransformIfShared (ph, *curStation)) {  			return; @@ -117,7 +117,7 @@ void BarUiActBanSong (BAR_KS_ARGS) {   */  void BarUiActCreateStation (BAR_KS_ARGS) {  	char *musicId; -	musicId = BarUiSelectMusicId (ph); +	musicId = BarUiSelectMusicId (ph, curFd);  	if (musicId != NULL) {  		BarUiMsg (MSG_INFO, "Creating station... ");  		BarUiPrintPianoStatus (PianoCreateStation (ph, "mi", musicId)); @@ -131,7 +131,8 @@ void BarUiActAddSharedStation (BAR_KS_ARGS) {  	char stationId[50];  	BarUiMsg (MSG_QUESTION, "Station id: "); -	if (BarReadline (stationId, sizeof (stationId), "0123456789", 0, 0) > 0) { +	if (BarReadline (stationId, sizeof (stationId), "0123456789", 0, 0, +			curFd) > 0) {  		BarUiMsg (MSG_INFO, "Adding shared station... ");  		BarUiPrintPianoStatus (PianoCreateStation (ph, "sh",  				(char *) stationId)); @@ -145,7 +146,7 @@ void BarUiActDeleteStation (BAR_KS_ARGS) {  	BarUiMsg (MSG_QUESTION, "Really delete \"%s\"? [yN] ",  			(*curStation)->name); -	if (BarReadlineYesNo (0)) { +	if (BarReadlineYesNo (0, curFd)) {  		BarUiMsg (MSG_INFO, "Deleting station... ");  		if (BarUiPrintPianoStatus (PianoDeleteStation (ph,  				*curStation)) == PIANO_RET_OK) { @@ -176,7 +177,7 @@ void BarUiActExplain (BAR_KS_ARGS) {   */  void BarUiActStationFromGenre (BAR_KS_ARGS) {  	/* use genre station */ -	BarStationFromGenre (ph); +	BarStationFromGenre (ph, curFd);  }  /*	print verbose song information @@ -242,7 +243,7 @@ void BarUiActMoveSong (BAR_KS_ARGS) {  	RETURN_IF_NO_SONG; -	moveStation = BarUiSelectStation (ph, "Move song to station: "); +	moveStation = BarUiSelectStation (ph, "Move song to station: ", curFd);  	if (moveStation != NULL) {  		if (!BarTransformIfShared (ph, *curStation) ||  				!BarTransformIfShared (ph, moveStation)) { @@ -278,7 +279,7 @@ void BarUiActRenameStation (BAR_KS_ARGS) {  	RETURN_IF_NO_STATION;  	BarUiMsg (MSG_QUESTION, "New name: "); -	if (BarReadlineStr (lineBuf, sizeof (lineBuf), 0) > 0) { +	if (BarReadlineStr (lineBuf, sizeof (lineBuf), 0, curFd) > 0) {  		if (!BarTransformIfShared (ph, *curStation)) {  			return;  		} @@ -294,7 +295,7 @@ void BarUiActSelectStation (BAR_KS_ARGS) {  	BarUiDoSkipSong (player);  	PianoDestroyPlaylist (ph);  	*curSong = NULL; -	*curStation = BarUiSelectStation (ph, "Select station: "); +	*curStation = BarUiSelectStation (ph, "Select station: ", curFd);  	if (*curStation != NULL) {  		BarUiPrintStation ((*curStation));  	} @@ -340,7 +341,7 @@ void BarUiActSelectQuickMix (BAR_KS_ARGS) {  	if ((*curStation)->isQuickMix) {  		PianoStation_t *selStation;  		while ((selStation = BarUiSelectStation (ph, -				"Toggle quickmix for station: ")) != NULL) { +				"Toggle quickmix for station: ", curFd)) != NULL) {  			selStation->useQuickMix = !selStation->useQuickMix;  		}  		BarUiMsg (MSG_INFO, "Setting quickmix stations... "); diff --git a/src/ui_readline.c b/src/ui_readline.c index fd4eb29..3ce1d17 100644 --- a/src/ui_readline.c +++ b/src/ui_readline.c @@ -54,10 +54,11 @@ inline char BarReadlineIsUtf8Content (char b) {   *	@param accept these characters   *	@param return if buffer full (otherwise more characters are not accepted)   *	@param don't echo anything (for passwords) + *	@param read from this fd   *	@return number of bytes read from stdin   */  size_t BarReadline (char *buf, size_t bufSize, const char *mask, -		char fullReturn, char noEcho) { +		char fullReturn, char noEcho, FILE *fd) {  	int chr = 0;  	size_t bufPos = 0;  	size_t bufLen = 0; @@ -65,7 +66,9 @@ size_t BarReadline (char *buf, size_t bufSize, const char *mask,  	memset (buf, 0, bufSize); -	while ((chr = fgetc (stdin)) != EOF) { +	/* if fd is a fifo fgetc will always return EOF if nobody writes to +	 * it, stdin will block */ +	while ((chr = fgetc (fd)) != EOF) {  		switch (chr) {  			/* EOT */  			case 4: @@ -162,19 +165,20 @@ size_t BarReadline (char *buf, size_t bufSize, const char *mask,   *	@param buffer size   *	@return number of bytes read from stdin   */ -inline size_t BarReadlineStr (char *buf, size_t bufSize, char noEcho) { -	return BarReadline (buf, bufSize, NULL, 0, noEcho); +inline size_t BarReadlineStr (char *buf, size_t bufSize, char noEcho, +		FILE *fd) { +	return BarReadline (buf, bufSize, NULL, 0, noEcho, fd);  }  /*	Read int from stdin   *	@param write result into this variable   *	@return number of bytes read from stdin   */ -size_t BarReadlineInt (int *ret) { +size_t BarReadlineInt (int *ret, FILE *fd) {  	int rlRet = 0;  	char buf[16]; -	rlRet = BarReadline (buf, sizeof (buf), "0123456789", 0, 0); +	rlRet = BarReadline (buf, sizeof (buf), "0123456789", 0, 0, fd);  	*ret = atoi ((char *) buf);  	return rlRet; @@ -183,9 +187,9 @@ size_t BarReadlineInt (int *ret) {  /*	Yes/No?   *	@param defaul (user presses enter)   */ -int BarReadlineYesNo (char def) { +int BarReadlineYesNo (char def, FILE *fd) {  	char buf[2]; -	BarReadline (buf, sizeof (buf), "yYnN", 1, 0); +	BarReadline (buf, sizeof (buf), "yYnN", 1, 0, fd);  	if (*buf == 'y' || *buf == 'Y' || (def == 1 && *buf == '\0')) {  		return 1;  	} else { diff --git a/src/ui_readline.h b/src/ui_readline.h index 3f2e886..194668a 100644 --- a/src/ui_readline.h +++ b/src/ui_readline.h @@ -21,8 +21,8 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN  THE SOFTWARE.  */ -size_t BarReadline (char *, size_t, const char *, char, char); -inline size_t BarReadlineStr (char *, size_t, char); -size_t BarReadlineInt (int *); -int BarReadlineYesNo (char def); +size_t BarReadline (char *, size_t, const char *, char, char, FILE *); +inline size_t BarReadlineStr (char *, size_t, char, FILE *); +size_t BarReadlineInt (int *, FILE *); +int BarReadlineYesNo (char def, FILE *);  | 
