summaryrefslogtreecommitdiff
path: root/src/main.c
diff options
context:
space:
mode:
authorLars-Dominik Braun <lars@6xq.net>2016-03-05 13:13:47 +0100
committerLars-Dominik Braun <lars@6xq.net>2016-03-05 13:18:52 +0100
commit8c06a59a34b5d9bba277a50198fe2dd50d832da3 (patch)
tree798b9b6b6d5cec0efad2931643e2a564b5ac3589 /src/main.c
parent522a82bba38670d8a052d80c13714c8978f1e072 (diff)
downloadpianobar-8c06a59a34b5d9bba277a50198fe2dd50d832da3.tar.gz
pianobar-8c06a59a34b5d9bba277a50198fe2dd50d832da3.tar.bz2
pianobar-8c06a59a34b5d9bba277a50198fe2dd50d832da3.zip
Quit upon reception of two SIGINT
If player is running one SIGINT restarts current track request, two SIGINT (or more) quit pianobar. Idle main loop (i.e. no player or submenu) quits on SIGINT. Fixes issue #564.
Diffstat (limited to 'src/main.c')
-rw-r--r--src/main.c15
1 files changed, 10 insertions, 5 deletions
diff --git a/src/main.c b/src/main.c
index 5d0e91b..c0388e2 100644
--- a/src/main.c
+++ b/src/main.c
@@ -259,7 +259,7 @@ static void BarMainStartPlayback (BarApp_t *app, pthread_t *playerThread) {
pthread_mutex_init (&app->player.pauseMutex, NULL);
pthread_cond_init (&app->player.pauseCond, NULL);
- assert (interrupted == NULL);
+ assert (interrupted == &app->doQuit);
interrupted = &app->player.interrupted;
/* throw event */
@@ -306,7 +306,7 @@ static void BarMainPlayerCleanup (BarApp_t *app, pthread_t *playerThread) {
memset (&app->player, 0, sizeof (app->player));
assert (interrupted == &app->player.interrupted);
- interrupted = NULL;
+ interrupted = &app->doQuit;
}
/* print song duration
@@ -355,12 +355,16 @@ static void BarMainLoop (BarApp_t *app) {
while (!app->doQuit) {
/* song finished playing, clean up things/scrobble song */
if (app->player.mode == PLAYER_FINISHED) {
+ if (app->player.interrupted != 0) {
+ app->doQuit = 1;
+ }
BarMainPlayerCleanup (app, &playerThread);
}
/* check whether player finished playing and start playing new
* song */
- if (app->player.mode == PLAYER_DEAD && app->curStation != NULL) {
+ if (app->player.mode == PLAYER_DEAD && app->curStation != NULL &&
+ !app->doQuit) {
/* what's next? */
if (app->playlist != NULL) {
PianoSong_t *histsong = app->playlist;
@@ -394,7 +398,7 @@ sig_atomic_t *interrupted = NULL;
static void intHandler (int signal) {
if (interrupted != NULL) {
- *interrupted = 1;
+ *interrupted += 1;
}
}
@@ -414,10 +418,11 @@ int main (int argc, char **argv) {
/* save terminal attributes, before disabling echoing */
BarTermInit ();
- BarMainSetupSigaction ();
/* signals */
signal (SIGPIPE, SIG_IGN);
+ BarMainSetupSigaction ();
+ interrupted = &app.doQuit;
/* init some things */
gcry_check_version (NULL);