Skip to content

Commit 87de3f1

Browse files
committed
TerminalFont: use Cocoa API to parse plist file
drop libplist dependency ( macOS )
1 parent 03511bd commit 87de3f1

File tree

3 files changed

+77
-147
lines changed

3 files changed

+77
-147
lines changed

CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -305,7 +305,7 @@ if(APPLE)
305305
src/detection/poweradapter/poweradapter_apple.c
306306
src/detection/memory/memory_apple.c
307307
src/detection/displayserver/displayserver_apple.c
308-
src/detection/terminalfont/terminalfont_apple.c
308+
src/detection/terminalfont/terminalfont_apple.m
309309
src/detection/media/media_apple.m
310310
src/detection/disk/disk_apple.m
311311
src/detection/wmtheme/wmtheme_apple.c

src/detection/terminalfont/terminalfont_apple.c

Lines changed: 0 additions & 146 deletions
This file was deleted.
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
#include "terminalfont.h"
2+
#include "common/font.h"
3+
#include "detection/terminalshell.h"
4+
#include "util/apple/osascript.h"
5+
6+
#include <stdlib.h>
7+
#include <string.h>
8+
#import <Foundation/Foundation.h>
9+
10+
static void detectIterm2(const FFinstance* instance, FFTerminalFontResult* terminalFont)
11+
{
12+
const char* profile = getenv("ITERM_PROFILE");
13+
if (profile == NULL)
14+
{
15+
ffStrbufAppendS(&terminalFont->error, "environment variable ITERM_PROFILE not set");
16+
return;
17+
}
18+
19+
NSError* error;
20+
NSString* fileName = [NSString stringWithFormat:@"file://%s/Library/Preferences/com.googlecode.iterm2.plist", instance->state.passwd->pw_dir];
21+
NSDictionary* dict = [NSDictionary dictionaryWithContentsOfURL:[NSURL URLWithString:fileName]
22+
error:&error];
23+
if(error)
24+
{
25+
ffStrbufAppendS(&terminalFont->error, [error localizedDescription].UTF8String);
26+
return;
27+
}
28+
29+
for(NSDictionary* bookmark in [dict valueForKey:@"New Bookmarks"])
30+
{
31+
if(![[bookmark valueForKey:@"Name"] isEqualToString:@(profile)])
32+
continue;
33+
34+
NSString* normalFont = [bookmark valueForKey:@"Normal Font"];
35+
if(!normalFont)
36+
{
37+
ffStrbufAppendF(&terminalFont->error, "`Normal Font` key in profile `%s` doesn't exist", profile);
38+
return;
39+
}
40+
ffFontInitWithSpace(&terminalFont->font, normalFont.UTF8String);
41+
return;
42+
}
43+
44+
ffStrbufAppendF(&terminalFont->error, "find profile `%s` bookmark failed", profile);
45+
}
46+
47+
static void detectAppleTerminal(FFTerminalFontResult* terminalFont)
48+
{
49+
FFstrbuf fontName;
50+
ffStrbufInit(&fontName);
51+
ffOsascript("tell application \"Terminal\" to font name of window frontmost", &fontName);
52+
53+
if(fontName.length == 0)
54+
{
55+
ffStrbufAppendS(&terminalFont->error, "executing osascript failed");
56+
ffStrbufDestroy(&fontName);
57+
return;
58+
}
59+
60+
FFstrbuf fontSize;
61+
ffStrbufInit(&fontSize);
62+
ffOsascript("tell application \"Terminal\" to font size of window frontmost", &fontSize);
63+
64+
ffFontInitValues(&terminalFont->font, fontName.chars, fontSize.chars);
65+
66+
ffStrbufDestroy(&fontName);
67+
ffStrbufDestroy(&fontSize);
68+
}
69+
70+
void ffDetectTerminalFontPlatform(const FFinstance* instance, const FFTerminalShellResult* terminalShell, FFTerminalFontResult* terminalFont)
71+
{
72+
if(ffStrbufIgnCaseCompS(&terminalShell->terminalProcessName, "iterm.app") == 0)
73+
detectIterm2(instance, terminalFont);
74+
else if(ffStrbufIgnCaseCompS(&terminalShell->terminalProcessName, "Apple_Terminal") == 0)
75+
detectAppleTerminal(terminalFont);
76+
}

0 commit comments

Comments
 (0)