diff --git a/README.md b/README.md index c9a0a1776..6a5f0b770 100644 --- a/README.md +++ b/README.md @@ -103,7 +103,7 @@ KDE Plasma, Gnome, Cinnamon, Mate, XFCE4, LXQt ##### Terminal fonts ``` -Konsole, Gnome Terminal, Tilix, XFCE4 Terminal, Alacritty, LXTerminal, iTerm2, Apple Terminal, TTY, Windows Terminal, Termux, mintty, ConEmu +Konsole, Gnome Terminal, Tilix, XFCE4 Terminal, Alacritty, LXTerminal, iTerm2, Apple Terminal, Warp, TTY, Windows Terminal, Termux, mintty, ConEmu ``` ## Building diff --git a/src/detection/terminalfont/terminalfont_apple.m b/src/detection/terminalfont/terminalfont_apple.m index fb8c2769b..72e4c09cc 100644 --- a/src/detection/terminalfont/terminalfont_apple.m +++ b/src/detection/terminalfont/terminalfont_apple.m @@ -22,7 +22,7 @@ static void detectIterm2(const FFinstance* instance, FFTerminalFontResult* termi error:&error]; if(error) { - ffStrbufAppendS(&terminalFont->error, [error localizedDescription].UTF8String); + ffStrbufAppendS(&terminalFont->error, error.localizedDescription.UTF8String); return; } @@ -46,25 +46,44 @@ static void detectIterm2(const FFinstance* instance, FFTerminalFontResult* termi static void detectAppleTerminal(FFTerminalFontResult* terminalFont) { - FFstrbuf fontName; - ffStrbufInit(&fontName); - ffOsascript("tell application \"Terminal\" to font name of window frontmost", &fontName); + FFstrbuf font; + ffStrbufInit(&font); + ffOsascript("tell application \"Terminal\" to font name of window frontmost & \" \" & font size of window frontmost", &font); - if(fontName.length == 0) + if(font.length == 0) { ffStrbufAppendS(&terminalFont->error, "executing osascript failed"); - ffStrbufDestroy(&fontName); + ffStrbufDestroy(&font); return; } - FFstrbuf fontSize; - ffStrbufInit(&fontSize); - ffOsascript("tell application \"Terminal\" to font size of window frontmost", &fontSize); + ffFontInitWithSpace(&terminalFont->font, font.chars); + ffStrbufDestroy(&font); +} - ffFontInitValues(&terminalFont->font, fontName.chars, fontSize.chars); +static void detectWarpTerminal(const FFinstance* instance, FFTerminalFontResult* terminalFont) +{ + NSError* error; + NSString* fileName = [NSString stringWithFormat:@"file://%s/Library/Preferences/dev.warp.Warp-Stable.plist", instance->state.passwd->pw_dir]; + NSDictionary* dict = [NSDictionary dictionaryWithContentsOfURL:[NSURL URLWithString:fileName] + error:&error]; + if(error) + { + ffStrbufAppendS(&terminalFont->error, error.localizedDescription.UTF8String); + return; + } - ffStrbufDestroy(&fontName); - ffStrbufDestroy(&fontSize); + NSString* fontName = [dict valueForKey:@"FontName"]; + if(!fontName) + fontName = @"Hack"; + else + fontName = [fontName stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"\""]]; + + NSString* fontSize = [dict valueForKey:@"FontSize"]; + if(!fontSize) + fontSize = @"13"; + + ffFontInitValues(&terminalFont->font, fontName.UTF8String, fontSize.UTF8String); } void ffDetectTerminalFontPlatform(const FFinstance* instance, const FFTerminalShellResult* terminalShell, FFTerminalFontResult* terminalFont) @@ -73,4 +92,6 @@ void ffDetectTerminalFontPlatform(const FFinstance* instance, const FFTerminalSh detectIterm2(instance, terminalFont); else if(ffStrbufIgnCaseCompS(&terminalShell->terminalProcessName, "Apple_Terminal") == 0) detectAppleTerminal(terminalFont); + else if(ffStrbufIgnCaseCompS(&terminalShell->terminalProcessName, "WarpTerminal") == 0) + detectWarpTerminal(instance, terminalFont); } diff --git a/src/detection/terminalshell/terminalshell_linux.c b/src/detection/terminalshell/terminalshell_linux.c index 57867fdb6..0dfc40a10 100644 --- a/src/detection/terminalshell/terminalshell_linux.c +++ b/src/detection/terminalshell/terminalshell_linux.c @@ -180,10 +180,17 @@ static void getTerminalFromEnv(FFTerminalShellResult* result) if( result->terminalProcessName.length > 0 && !ffStrbufStartsWithIgnCaseS(&result->terminalProcessName, "login") && - ffStrbufIgnCaseCompS(&result->terminalProcessName, "(login)") != 0 && - ffStrbufIgnCaseCompS(&result->terminalProcessName, "systemd") != 0 && - ffStrbufIgnCaseCompS(&result->terminalProcessName, "init") != 0 && - ffStrbufIgnCaseCompS(&result->terminalProcessName, "(init)") != 0 && + !ffStrbufIgnCaseEqualS(&result->terminalProcessName, "(login)") && + + #ifdef __APPLE__ + !ffStrbufIgnCaseEqualS(&result->terminalProcessName, "launchd") && + !ffStrbufIgnCaseEqualS(&result->terminalProcessName, "stable") && //for WarpTerminal + #else + !ffStrbufIgnCaseEqualS(&result->terminalProcessName, "systemd") && + !ffStrbufIgnCaseEqualS(&result->terminalProcessName, "init") && + !ffStrbufIgnCaseEqualS(&result->terminalProcessName, "(init)") && + #endif + ffStrbufIgnCaseCompS(&result->terminalProcessName, "0") != 0 ) return; @@ -193,11 +200,13 @@ static void getTerminalFromEnv(FFTerminalShellResult* result) if(getenv("SSH_CONNECTION") != NULL) term = getenv("SSH_TTY"); + #ifdef __linux__ //Windows Terminal if(!ffStrSet(term) && ( getenv("WT_SESSION") != NULL || getenv("WT_PROFILE_ID") != NULL )) term = "Windows Terminal"; + #endif //Alacritty if(!ffStrSet(term) && ( @@ -365,6 +374,8 @@ const FFTerminalShellResult* ffDetectTerminalShell(const FFinstance* instance) ffStrbufInitS(&result.terminalPrettyName, "iTerm"); else if(ffStrbufEqualS(&result.terminalProcessName, "Apple_Terminal")) ffStrbufInitS(&result.terminalPrettyName, "Apple Terminal"); + else if(ffStrbufEqualS(&result.terminalProcessName, "WarpTerminal")) + ffStrbufInitS(&result.terminalPrettyName, "Warp"); else if(strncmp(result.terminalExeName, result.terminalProcessName.chars, result.terminalProcessName.length) == 0) // if exeName starts with processName, print it. Otherwise print processName ffStrbufInitS(&result.terminalPrettyName, result.terminalExeName); else