summaryrefslogtreecommitdiffstats
path: root/src/detection/terminalfont/terminalfont_apple.m
diff options
context:
space:
mode:
authorsumuel <samuel@yakubos.org>2026-08-17 20:44:55 +0000
committersumuel <samuel@yakubos.org>2026-08-17 20:44:55 +0000
commit76424950e373d3b04ac3dd13019151bfba3e8423 (patch)
tree4c3cfdbda039e592b9186be3e28f8d7cfd439e8a /src/detection/terminalfont/terminalfont_apple.m
Add the files
Diffstat (limited to 'src/detection/terminalfont/terminalfont_apple.m')
-rw-r--r--src/detection/terminalfont/terminalfont_apple.m106
1 files changed, 106 insertions, 0 deletions
diff --git a/src/detection/terminalfont/terminalfont_apple.m b/src/detection/terminalfont/terminalfont_apple.m
new file mode 100644
index 0000000..126235f
--- /dev/null
+++ b/src/detection/terminalfont/terminalfont_apple.m
@@ -0,0 +1,106 @@
+#include "terminalfont.h"
+#include "common/font.h"
+#include "detection/terminalshell/terminalshell.h"
+#include "common/apple/osascript.h"
+
+#include <stdlib.h>
+#include <string.h>
+#import <Foundation/Foundation.h>
+
+static void detectIterm2(FFTerminalFontResult* terminalFont)
+{
+ const char* profile = getenv("ITERM_PROFILE");
+ if (profile == NULL)
+ {
+ ffStrbufAppendS(&terminalFont->error, "environment variable ITERM_PROFILE not set");
+ return;
+ }
+
+ NSError* error;
+ NSString* fileName = [NSString stringWithFormat:@"file://%s/Library/Preferences/com.googlecode.iterm2.plist", instance.state.platform.homeDir.chars];
+ NSDictionary* dict = [NSDictionary dictionaryWithContentsOfURL:[NSURL URLWithString:fileName]
+ error:&error];
+ if(error)
+ {
+ ffStrbufAppendS(&terminalFont->error, error.localizedDescription.UTF8String);
+ return;
+ }
+
+ for(NSDictionary* bookmark in dict[@"New Bookmarks"])
+ {
+ if(![bookmark[@"Name"] isEqualToString:@(profile)])
+ continue;
+
+ NSString* normalFont = bookmark[@"Normal Font"];
+ if(!normalFont)
+ {
+ ffStrbufAppendF(&terminalFont->error, "`Normal Font` key in profile `%s` doesn't exist", profile);
+ return;
+ }
+ ffFontInitWithSpace(&terminalFont->font, normalFont.UTF8String);
+
+ NSNumber* useNonAsciiFont = bookmark[@"Use Non-ASCII Font"];
+ if(useNonAsciiFont.boolValue)
+ {
+ NSString* nonAsciiFont = bookmark[@"Non Ascii Font"];
+ if (nonAsciiFont)
+ ffFontInitWithSpace(&terminalFont->fallback, nonAsciiFont.UTF8String);
+ }
+ return;
+ }
+
+ ffStrbufAppendF(&terminalFont->error, "find profile `%s` bookmark failed", profile);
+}
+
+static void detectAppleTerminal(FFTerminalFontResult* terminalFont)
+{
+ FF_STRBUF_AUTO_DESTROY font = ffStrbufCreate();
+ ffOsascript("tell application \"Terminal\" to font name of window frontmost & \" \" & font size of window frontmost", &font);
+
+ if(font.length == 0)
+ {
+ ffStrbufAppendS(&terminalFont->error, "executing osascript failed");
+ return;
+ }
+
+ ffFontInitWithSpace(&terminalFont->font, font.chars);
+}
+
+static void detectWarpTerminal(FFTerminalFontResult* terminalFont)
+{
+ NSError* error;
+ NSString* fileName = [NSString stringWithFormat:@"file://%s/Library/Preferences/dev.warp.Warp-Stable.plist", instance.state.platform.homeDir.chars];
+ NSDictionary* dict = [NSDictionary dictionaryWithContentsOfURL:[NSURL URLWithString:fileName]
+ error:&error];
+ if(error)
+ {
+ ffStrbufAppendS(&terminalFont->error, error.localizedDescription.UTF8String);
+ return;
+ }
+
+ NSString* fontName = dict[@"FontName"];
+ if(!fontName)
+ fontName = @"Hack";
+ else
+ fontName = [fontName stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"\""]];
+
+ NSString* fontSize = dict[@"FontSize"];
+ if(!fontSize)
+ fontSize = @"13";
+
+ ffFontInitValues(&terminalFont->font, fontName.UTF8String, fontSize.UTF8String);
+}
+
+bool ffDetectTerminalFontPlatform(const FFTerminalResult* terminal, FFTerminalFontResult* terminalFont)
+{
+ if(ffStrbufIgnCaseEqualS(&terminal->processName, "iterm.app") ||
+ ffStrbufStartsWithIgnCaseS(&terminal->processName, "iTermServer-"))
+ detectIterm2(terminalFont);
+ else if(ffStrbufIgnCaseEqualS(&terminal->processName, "Apple_Terminal"))
+ detectAppleTerminal(terminalFont);
+ else if(ffStrbufIgnCaseEqualS(&terminal->processName, "WarpTerminal"))
+ detectWarpTerminal(terminalFont);
+ else
+ return false;
+ return true;
+}