summaryrefslogtreecommitdiff
path: root/src/ui_readline.c
diff options
context:
space:
mode:
authorLars-Dominik Braun <lars@6xq.net>2015-10-23 10:27:31 +0200
committerLars-Dominik Braun <lars@6xq.net>2015-10-23 10:31:25 +0200
commit436a1d4012553a2f33d0e3a5180b3b5ae0378bdd (patch)
tree984f5007600dcf9029eaf8750740e10226196af1 /src/ui_readline.c
parentaf0f9d4bbff4f7a166c15df8c60ad61791740207 (diff)
downloadpianobar-436a1d4012553a2f33d0e3a5180b3b5ae0378bdd.tar.gz
pianobar-436a1d4012553a2f33d0e3a5180b3b5ae0378bdd.tar.bz2
pianobar-436a1d4012553a2f33d0e3a5180b3b5ae0378bdd.zip
Interruptible requests
^C now works as expected: It interrupts API requests, input prompts and audio streaming. Timeouts have been removed.
Diffstat (limited to 'src/ui_readline.c')
-rw-r--r--src/ui_readline.c37
1 files changed, 23 insertions, 14 deletions
diff --git a/src/ui_readline.c b/src/ui_readline.c
index eeb5c12..f47485f 100644
--- a/src/ui_readline.c
+++ b/src/ui_readline.c
@@ -28,6 +28,7 @@ THE SOFTWARE.
#include <assert.h>
#include "ui_readline.h"
+#include "main.h"
/* return size of previous UTF-8 character
*/
@@ -57,16 +58,24 @@ size_t BarReadline (char *buf, const size_t bufSize, const char *mask,
unsigned char escapeState = 0;
fd_set set;
const bool echo = !(flags & BAR_RL_NOECHO);
+ bool done = false;
assert (buf != NULL);
assert (bufSize > 0);
assert (input != NULL);
+ /* not actually used here. just stops the player from receiving the
+ * signal */
+ sig_atomic_t *prevInt = interrupted, localInt = 0;
+ if (!(flags & BAR_RL_NOINT)) {
+ interrupted = &localInt;
+ }
+
memset (buf, 0, bufSize);
/* if fd is a fifo fgetc will always return EOF if nobody writes to
* it, stdin will block */
- while (1) {
+ while (!done) {
int curFd = -1;
unsigned char chr;
struct timeval timeoutstruct;
@@ -78,7 +87,8 @@ size_t BarReadline (char *buf, const size_t bufSize, const char *mask,
if (select (input->maxfd, &set, NULL, NULL,
(timeout == -1) ? NULL : &timeoutstruct) <= 0) {
- /* fail or timeout */
+ /* timeout or interrupted */
+ bufLen = 0;
break;
}
@@ -103,11 +113,7 @@ size_t BarReadline (char *buf, const size_t bufSize, const char *mask,
case 4:
/* return */
case 10:
- if (echo) {
- fputs ("\n", stdout);
- }
- buf[bufLen] = '\0';
- return bufLen;
+ done = true;
break;
/* clear line */
@@ -180,18 +186,21 @@ size_t BarReadline (char *buf, const size_t bufSize, const char *mask,
}
/* buffer full => return if requested */
if (bufLen >= bufSize-1 && (flags & BAR_RL_FULLRETURN)) {
- if (echo) {
- fputs ("\n", stdout);
- }
- buf[bufLen] = '\0';
- return bufLen;
+ done = true;
}
}
break;
} /* end switch */
} /* end while */
- buf[0] = '\0';
- return 0;
+
+ if (echo) {
+ fputs ("\n", stdout);
+ }
+
+ interrupted = prevInt;
+
+ buf[bufLen] = '\0';
+ return bufLen;
}
/* Read string from stdin