TerminalFont: support Warp; improve performance of Apple Terminal (macOS)

This commit is contained in:
李通洲
2022-11-17 18:14:14 +08:00
parent a498e9e142
commit fb78d9bbb9
3 changed files with 49 additions and 17 deletions
+33 -12
View File
@@ -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);
}
@@ -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