Fallback to escape sequences if ioctl failed

This commit is contained in:
Linus Dierheimer
2022-04-19 11:48:08 +02:00
parent adc92b5548
commit 8b153833b1
4 changed files with 60 additions and 4 deletions
+33
View File
@@ -1,8 +1,11 @@
#include "fastfetch.h"
#include <stdio.h>
#include <malloc.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdarg.h>
#include <termios.h>
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);
}
+2
View File
@@ -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);
+25 -1
View File
@@ -4,6 +4,30 @@
#define FF_KITTY_MAX_CHUNK_SIZE 4096
#include <sys/ioctl.h>
#include <unistd.h>
#include <string.h> // 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 <zlib.h>
@@ -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)
-3
View File
@@ -7,9 +7,6 @@
#if defined(FF_HAVE_IMAGEMAGICK7) || defined(FF_HAVE_IMAGEMAGICK6)
#include <sys/ioctl.h>
#include <unistd.h>
#define MAGICKCORE_HDRI_ENABLE 1
#define MAGICKCORE_QUANTUM_DEPTH 16