From aec27c3e50b36dc7cf2f581b35ebe97b006a81cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Tue, 3 Sep 2024 21:31:43 +0800 Subject: [PATCH] Image (Windows): support sixel protocol --- src/logo/image/image.c | 44 +++++++++++++++--------------------------- 1 file changed, 16 insertions(+), 28 deletions(-) diff --git a/src/logo/image/image.c b/src/logo/image/image.c index c73fca10c..63278bc49 100644 --- a/src/logo/image/image.c +++ b/src/logo/image/image.c @@ -3,6 +3,7 @@ #include "common/printing.h" #include "util/stringUtils.h" #include "util/base64.h" +#include "detection/terminalsize/terminalsize.h" #include #include @@ -835,38 +836,25 @@ static bool printCached(FFLogoRequestData* requestData) static bool getCharacterPixelDimensions(FFLogoRequestData* requestData) { - #ifndef _WIN32 - - 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", "\033[8;%hu;%hut", &winsize.ws_row, &winsize.ws_col); - - if(winsize.ws_row == 0 || winsize.ws_col == 0) - return false; - - if(winsize.ws_ypixel == 0 || winsize.ws_xpixel == 0) - ffGetTerminalResponse("\033[14t", "\033[4;%hu;%hut", &winsize.ws_ypixel, &winsize.ws_xpixel); - - requestData->characterPixelWidth = winsize.ws_xpixel / (double) winsize.ws_col; - requestData->characterPixelHeight = winsize.ws_ypixel / (double) winsize.ws_row; - - #else + #ifdef _WIN32 CONSOLE_FONT_INFO cfi; - if(GetCurrentConsoleFont(GetStdHandle(STD_OUTPUT_HANDLE), FALSE, &cfi) == FALSE) // Only works for ConHost - return false; - - requestData->characterPixelWidth = cfi.dwFontSize.X; - requestData->characterPixelHeight = cfi.dwFontSize.Y; - + if(GetCurrentConsoleFont(GetStdHandle(STD_OUTPUT_HANDLE), FALSE, &cfi)) // Only works for ConHost + { + requestData->characterPixelWidth = cfi.dwFontSize.X; + requestData->characterPixelHeight = cfi.dwFontSize.Y; + } + if (requestData->characterPixelWidth > 1.0 && requestData->characterPixelHeight > 1.0) + return true; #endif + FFTerminalSizeResult termSize = {}; + if (ffDetectTerminalSize(&termSize)) + { + requestData->characterPixelWidth = termSize.width / (double) termSize.columns; + requestData->characterPixelHeight = termSize.height / (double) termSize.rows; + } + return requestData->characterPixelWidth > 1.0 && requestData->characterPixelHeight > 1.0; }