Logo: adds option logo.position: auto

This commit is contained in:
Carter Li
2026-09-25 09:51:34 +08:00
parent c68bedd9bf
commit 537635cd9c
16 changed files with 277 additions and 45 deletions
+2 -1
View File
@@ -10,4 +10,5 @@ typedef struct FFTerminalSizeResult {
uint16_t height;
} FFTerminalSizeResult;
bool ffDetectTerminalSize(FFTerminalSizeResult* result);
// `fastOnly` avoids terminal query/response sequences and is intended for startup layout decisions.
bool ffDetectTerminalSize(FFTerminalSizeResult* result, bool fastOnly);
+12 -11
View File
@@ -9,7 +9,9 @@
#include <sys/termios.h>
#endif
bool ffDetectTerminalSize(FFTerminalSizeResult* result) {
bool ffDetectTerminalSize(FFTerminalSizeResult* result, bool fastOnly) {
*result = (FFTerminalSizeResult){};
struct winsize winsize = {};
static int ttyfd = STDOUT_FILENO;
if (!isatty(ttyfd)) {
@@ -18,21 +20,20 @@ bool ffDetectTerminalSize(FFTerminalSizeResult* result) {
ioctl(ttyfd, TIOCGWINSZ, &winsize);
if (winsize.ws_row == 0 || winsize.ws_col == 0) {
ffGetTerminalResponse("\e[18t", 2, "\e[8;%hu;%hut", &winsize.ws_row, &winsize.ws_col);
}
if (!fastOnly) {
if (winsize.ws_row == 0 || winsize.ws_col == 0) {
ffGetTerminalResponse("\e[18t", 2, "\e[8;%hu;%hut", &winsize.ws_row, &winsize.ws_col);
}
if (winsize.ws_ypixel == 0 || winsize.ws_xpixel == 0) {
ffGetTerminalResponse("\e[14t", 2, "\e[4;%hu;%hut", &winsize.ws_ypixel, &winsize.ws_xpixel);
}
if (winsize.ws_row == 0 && winsize.ws_col == 0) {
return false;
if (winsize.ws_ypixel == 0 || winsize.ws_xpixel == 0) {
ffGetTerminalResponse("\e[14t", 2, "\e[4;%hu;%hut", &winsize.ws_ypixel, &winsize.ws_xpixel);
}
}
result->rows = winsize.ws_row;
result->columns = winsize.ws_col;
result->width = winsize.ws_xpixel;
result->height = winsize.ws_ypixel;
return true;
return result->rows > 0 && result->columns > 0;
}
@@ -3,7 +3,9 @@
#include <windows.h>
bool ffDetectTerminalSize(FFTerminalSizeResult* result) {
bool ffDetectTerminalSize(FFTerminalSizeResult* result, bool fastOnly) {
*result = (FFTerminalSizeResult){};
HANDLE hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
FF_AUTO_CLOSE_FD HANDLE hConout = INVALID_HANDLE_VALUE;
{
@@ -18,16 +20,20 @@ bool ffDetectTerminalSize(FFTerminalSizeResult* result) {
if (GetConsoleScreenBufferInfo(hOutput, &csbi)) {
result->columns = (uint16_t) (csbi.srWindow.Right - csbi.srWindow.Left + 1);
result->rows = (uint16_t) (csbi.srWindow.Bottom - csbi.srWindow.Top + 1);
} else {
} else if (!fastOnly) {
// Windows Terminal doesn't report `\e` for some reason
ffGetTerminalResponse("\e[18t", 2, "%*[^;];%hu;%hut", &result->rows, &result->columns);
}
}
if (result->columns == 0 && result->rows == 0) {
if (result->columns == 0 || result->rows == 0) {
return false;
}
if (fastOnly) {
return true;
}
{
CONSOLE_FONT_INFOEX cfi = { .cbSize = sizeof(cfi) };
if (GetCurrentConsoleFontEx(hOutput, FALSE, &cfi)) // Only works for ConHost
@@ -41,5 +47,5 @@ bool ffDetectTerminalSize(FFTerminalSizeResult* result) {
}
}
return result->columns > 0 && result->rows > 0;
return true;
}