diff --git a/src/common/io.c b/src/common/io.c index 84a36c29a..0e2a04d09 100644 --- a/src/common/io.c +++ b/src/common/io.c @@ -1,11 +1,11 @@ #include "fastfetch.h" #include -#include #include #include #include #include +#include bool ffWriteFDContent(int fd, const FFstrbuf* content) { @@ -128,32 +128,42 @@ bool ffFileExists(const char* fileName, mode_t mode) return stat(fileName, &fileStat) == 0 && ((fileStat.st_mode & S_IFMT) == mode); } -void ffGetTerminalResponse(const char* request, char end, const char* format, ...) +void ffGetTerminalResponse(const char* request, const char* format, ...) { struct termios oldTerm, newTerm; - tcgetattr(STDIN_FILENO, &oldTerm); + if(tcgetattr(STDIN_FILENO, &oldTerm) == -1) + return; newTerm = oldTerm; newTerm.c_lflag &= (tcflag_t) ~(ICANON | ECHO); - tcsetattr(STDIN_FILENO, TCSANOW, &newTerm); + if(tcsetattr(STDIN_FILENO, TCSANOW, &newTerm) == -1) + return; fputs(request, stdout); + fflush(stdout); + + struct pollfd pfd; + pfd.fd = STDIN_FILENO; + pfd.events = POLLIN; + pfd.revents = 0; + + //Give the terminal 20ms to respond + if(poll(&pfd, 1, 20) <= 0) + { + tcsetattr(STDIN_FILENO, TCSANOW, &oldTerm); + return; + } char buffer[512]; - int pos = 0; - while((size_t) pos < sizeof(buffer) - 1) - { - char c = (char) getc(stdin); - if(c == '\0') - break; - buffer[pos++] = c; - if(c == end) - break; - } - buffer[pos] = '\0'; + ssize_t readed = read(STDIN_FILENO, buffer, sizeof(buffer) - 1); tcsetattr(STDIN_FILENO, TCSANOW, &oldTerm); + if(readed <= 0) + return; + + buffer[readed] = '\0'; + va_list args; va_start(args, format); vsscanf(buffer, format, args); diff --git a/src/detection/media.c b/src/detection/media.c index 865a2aa6c..251dd7ab6 100644 --- a/src/detection/media.c +++ b/src/detection/media.c @@ -4,7 +4,7 @@ #include #define FF_DBUS_MPRIS_PREFIX "org.mpris.MediaPlayer2." -#define FF_DBUS_TIMEOUT_MILLISECONDS 50 +#define FF_DBUS_TIMEOUT_MILLISECONDS 20 #ifdef FF_HAVE_DBUS #include diff --git a/src/fastfetch.h b/src/fastfetch.h index f9aa6bdd2..f6ad66088 100644 --- a/src/fastfetch.h +++ b/src/fastfetch.h @@ -405,7 +405,7 @@ bool ffWriteFileContent(const char* fileName, const FFstrbuf* buffer); bool ffFileExists(const char* fileName, mode_t mode); void ffSuppressIO(bool suppress); // Not thread safe! -void ffGetTerminalResponse(const char* request, char end, const char* format, ...); +void ffGetTerminalResponse(const char* request, const char* format, ...); //common/printing.c void ffPrintError(FFinstance* instance, const char* moduleName, uint8_t moduleIndex, const FFstrbuf* customKeyFormat, const FFstrbuf* formatString, uint32_t numFormatArgs, const char* message, ...); diff --git a/src/logo/image/image.c b/src/logo/image/image.c index ca62b3734..23fdff2ea 100644 --- a/src/logo/image/image.c +++ b/src/logo/image/image.c @@ -330,10 +330,10 @@ static bool getTermInfo(struct winsize* winsize) ioctl(STDOUT_FILENO, TIOCGWINSZ, winsize); if(winsize->ws_row == 0 || winsize->ws_col == 0) - ffGetTerminalResponse("\033[18t", 't', "\033[8;%hu;%hut", &winsize->ws_row, &winsize->ws_col); + ffGetTerminalResponse("\033[18t", "\033[8;%hu;%hut", &winsize->ws_row, &winsize->ws_col); if(winsize->ws_ypixel == 0 || winsize->ws_xpixel == 0) - ffGetTerminalResponse("\033[14t", 't', "\033[4;%hu;%hut", &winsize->ws_ypixel, &winsize->ws_xpixel); + ffGetTerminalResponse("\033[14t", "\033[4;%hu;%hut", &winsize->ws_ypixel, &winsize->ws_xpixel); return winsize->ws_row > 0 &&