WM (macOS): fetches WM plugin version

This commit is contained in:
李通洲
2026-03-06 11:08:41 +08:00
parent abf8d75454
commit e4d31381d8
+37 -4
View File
@@ -5,6 +5,7 @@
#include "common/stringUtils.h"
#include <ctype.h>
#include <libproc.h>
#import <Foundation/Foundation.h>
const char* ffDetectWMPlugin(FFstrbuf* pluginName)
@@ -20,9 +21,10 @@ const char* ffDetectWMPlugin(FFstrbuf* pluginName)
for(size_t i = 0; i < length / sizeof(struct kinfo_proc); i++)
{
if (processes[i].kp_eproc.e_ppid != 1) continue;
const struct kinfo_proc* proc = &processes[i];
if (proc->kp_eproc.e_ppid != 1) continue;
const char* comm = processes[i].kp_proc.p_comm;
const char* comm = proc->kp_proc.p_comm;
if(
!ffStrEqualsIgnCase(comm, "spectacle") &&
@@ -34,6 +36,37 @@ const char* ffDetectWMPlugin(FFstrbuf* pluginName)
!ffStrEqualsIgnCase(comm, "rectangle")
) continue;
char buf[PROC_PIDPATHINFO_MAXSIZE];
int length = proc_pidpath(proc->kp_proc.p_pid, buf, ARRAY_SIZE(buf));
if (length > 0)
{
char* lastSlash = strrchr(buf, '/');
if (lastSlash)
{
*lastSlash = '\0';
if (ffStrEndsWith(buf, ".app/Contents/MacOS"))
{
lastSlash -= strlen("MacOS");
strcpy(lastSlash, "Info.plist"); // X.app/Contents/Info.plist
NSError* error;
NSDictionary* dict = [NSDictionary dictionaryWithContentsOfURL:[NSURL fileURLWithPath:@(buf)]
error:&error];
if (dict)
{
ffStrbufSetS(pluginName, [dict[@"CFBundleName"] UTF8String]);
NSString* version = dict[@"CFBundleShortVersionString"];
if (version)
{
ffStrbufAppendC(pluginName, ' ');
ffStrbufAppendS(pluginName, version.UTF8String);
}
break;
}
}
}
}
ffStrbufAppendS(pluginName, comm);
pluginName->chars[0] = (char) toupper(pluginName->chars[0]);
break;
@@ -50,11 +83,11 @@ const char* ffDetectWMVersion(const FFstrbuf* wmName, FFstrbuf* result, FF_MAYBE
if (ffStrbufEqualS(wmName, "WindowServer"))
{
NSError* error;
NSDictionary* dict = [NSDictionary dictionaryWithContentsOfURL:[NSURL URLWithString:@"file:///System/Library/PrivateFrameworks/SkyLight.framework/Resources/version.plist"]
NSDictionary* dict = [NSDictionary dictionaryWithContentsOfURL:[NSURL fileURLWithPath:@"/System/Library/PrivateFrameworks/SkyLight.framework/Resources/version.plist" isDirectory:NO]
error:&error];
if (!dict)
{
dict = [NSDictionary dictionaryWithContentsOfURL:[NSURL URLWithString:@"file:///System/Library/Frameworks/ApplicationServices.framework/Frameworks/CoreGraphics.framework/Resources/version.plist"]
dict = [NSDictionary dictionaryWithContentsOfURL:[NSURL fileURLWithPath:@"/System/Library/Frameworks/ApplicationServices.framework/Frameworks/CoreGraphics.framework/Resources/version.plist" isDirectory:NO]
error:&error];
}