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
+1 -1
View File
@@ -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
+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