diff --git a/src/common/io.c b/src/common/io.c index 2c4950a0b..2075ad878 100644 --- a/src/common/io.c +++ b/src/common/io.c @@ -1,8 +1,11 @@ #include "fastfetch.h" +#include #include #include #include +#include +#include bool ffWriteFDContent(int fd, const FFstrbuf* content) { @@ -98,3 +101,33 @@ bool ffFileExists(const char* fileName, mode_t mode) struct stat fileStat; return stat(fileName, &fileStat) == 0 && ((fileStat.st_mode & S_IFMT) == mode); } + +void ffGetTerminalResponse(const char* request, char end, const char* format, ...) +{ + struct termios oldTerm, newTerm; + tcgetattr(STDIN_FILENO, &oldTerm); + + newTerm = oldTerm; + newTerm.c_lflag &= (tcflag_t) ~(ICANON | ECHO); + tcsetattr(STDIN_FILENO, TCSANOW, &newTerm); + + fputs(request, stdout); + + char buffer[512]; + int pos = 0; + while((size_t) pos < sizeof(buffer) - 1) + { + char c = (char) getc(stdin); + buffer[pos++] = c; + if(c == end) + break; + } + buffer[pos] = '\0'; + + tcsetattr(STDIN_FILENO, TCSANOW, &oldTerm); + + va_list args; + va_start(args, format); + vsscanf(buffer, format, args); + va_end(args); +} diff --git a/src/fastfetch.h b/src/fastfetch.h index 0059e727c..32ad5f5a8 100644 --- a/src/fastfetch.h +++ b/src/fastfetch.h @@ -405,6 +405,8 @@ void 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, ...); + //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, ...); void ffPrintFormatString(FFinstance* instance, const char* moduleName, uint8_t moduleIndex, const FFstrbuf* customKeyFormat, const FFstrbuf* formatString, const FFstrbuf* error, uint32_t numArgs, const FFformatarg* arguments); diff --git a/src/logo/image/image.c b/src/logo/image/image.c index 63b9f82db..c21ab8f9e 100644 --- a/src/logo/image/image.c +++ b/src/logo/image/image.c @@ -4,6 +4,30 @@ #define FF_KITTY_MAX_CHUNK_SIZE 4096 +#include +#include +#include // memset + +static bool getTermInfo(struct winsize* winsize) +{ + //Initialize every member to 0, because it isn't guaranteed that every terminal sets them all + memset(winsize, 0, sizeof(struct 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); + + if(winsize->ws_ypixel == 0 || winsize->ws_xpixel == 0) + ffGetTerminalResponse("\033[14t", 't', "\033[4;%hu;%hut", &winsize->ws_ypixel, &winsize->ws_xpixel); + + return + winsize->ws_row > 0 && + winsize->ws_col > 0 && + winsize->ws_ypixel > 0 && + winsize->ws_xpixel > 0; +} + #ifdef FF_HAVE_ZLIB #include @@ -129,7 +153,7 @@ static bool printImageSixel(ImageInfo* imageInfo, Image* image, ExceptionInfo* e FFLogoImageResult ffLogoPrintImageImpl(FFinstance* instance, void* imageMagick, FFLogoIMResizeFunc resizeFunc, FFLogoIMWriteFunc writeFunc, FFLogoType type) { struct winsize winsize; - if(ioctl(STDOUT_FILENO, TIOCGWINSZ, &winsize) != 0) + if(!getTermInfo(&winsize)) return FF_LOGO_IMAGE_RESULT_RUN_ERROR; FF_LIBRARY_LOAD_SYMBOL(imageMagick, AcquireExceptionInfo, FF_LOGO_IMAGE_RESULT_INIT_ERROR) diff --git a/src/logo/image/image.h b/src/logo/image/image.h index db22b24c0..48dfe3fe9 100644 --- a/src/logo/image/image.h +++ b/src/logo/image/image.h @@ -7,9 +7,6 @@ #if defined(FF_HAVE_IMAGEMAGICK7) || defined(FF_HAVE_IMAGEMAGICK6) -#include -#include - #define MAGICKCORE_HDRI_ENABLE 1 #define MAGICKCORE_QUANTUM_DEPTH 16