Skip to content

Commit dd0f635

Browse files
MacOS custom WM support
1 parent 0e2d353 commit dd0f635

File tree

1 file changed

+53
-8
lines changed

1 file changed

+53
-8
lines changed

src/detection/displayserver/displayserver_apple.c

Lines changed: 53 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@
22
#include "common/library.h"
33

44
#include <stdlib.h>
5+
#include <ctype.h>
6+
#include <string.h>
7+
#include <sys/sysctl.h>
58
#include <ApplicationServices/ApplicationServices.h>
69

710
//Resolution code heavily inspired by displayplacer <3
@@ -51,25 +54,67 @@ static void detectResolution(FFDisplayServerResult* ds)
5154
free(screens);
5255
}
5356

57+
static void detectWM(FFDisplayServerResult* ds)
58+
{
59+
int request[] = {CTL_KERN, KERN_PROC, KERN_PROC_ALL};
60+
u_int requestLength = sizeof(request) / sizeof(*request);
61+
62+
size_t length = 0;
63+
if(sysctl(request, requestLength, NULL, &length, NULL, 0) != 0)
64+
return;
65+
66+
struct kinfo_proc* processes = malloc(length);
67+
if(processes == NULL)
68+
return;
69+
70+
if(sysctl(request, requestLength, processes, &length, NULL, 0) != 0)
71+
{
72+
free(processes);
73+
return;
74+
}
75+
76+
for(size_t i = 0; i < length / sizeof(struct kinfo_proc); i++)
77+
{
78+
const char* comm = processes[i].kp_proc.p_comm;
79+
80+
if(
81+
strcasecmp(comm, "spectacle") != 0 &&
82+
strcasecmp(comm, "amethyst") != 0 &&
83+
strcasecmp(comm, "kwm") != 0 &&
84+
strcasecmp(comm, "chunkwm") != 0 &&
85+
strcasecmp(comm, "yabai") != 0 &&
86+
strcasecmp(comm, "rectangle") != 0
87+
) continue;
88+
89+
ffStrbufAppendS(&ds->wmProcessName, comm);
90+
ffStrbufAppendS(&ds->wmPrettyName, comm);
91+
ds->wmPrettyName.chars[0] = (char) toupper(ds->wmPrettyName.chars[0]);
92+
break;
93+
}
94+
95+
free(processes);
96+
}
97+
5498
void ffConnectDisplayServerImpl(FFDisplayServerResult* ds, const FFinstance* instance)
5599
{
56100
FF_UNUSED(instance);
57101

58102
ffStrbufInit(&ds->wmProcessName);
59-
ffStrbufAppendS(&ds->wmProcessName, "quartz");
60-
61103
ffStrbufInit(&ds->wmPrettyName);
62-
ffStrbufAppendS(&ds->wmPrettyName, "Quartz Compositor");
104+
ffStrbufInitA(&ds->wmProtocolName, 0);
105+
detectWM(ds);
106+
if(ds->wmProcessName.length == 0)
107+
{
108+
ffStrbufAppendS(&ds->wmProcessName, "quartz");
109+
ffStrbufAppendS(&ds->wmPrettyName, "Quartz Compositor");
110+
}
63111

64112
ffStrbufInit(&ds->deProcessName);
65-
ffStrbufAppendS(&ds->deProcessName, "aqua");
66-
67113
ffStrbufInit(&ds->dePrettyName);
114+
ffStrbufInitA(&ds->deVersion, 0);
115+
ffStrbufAppendS(&ds->deProcessName, "aqua");
68116
ffStrbufAppendS(&ds->dePrettyName, "Aqua");
69117

70118
ffListInitA(&ds->resolutions, sizeof(FFResolutionResult), 4);
71119
detectResolution(ds);
72-
73-
ffStrbufInitA(&ds->deVersion, 0);
74-
ffStrbufInitA(&ds->wmProtocolName, 0);
75120
}

0 commit comments

Comments
 (0)