diff --git a/src/detection/displayserver/displayserver_apple.c b/src/detection/displayserver/displayserver_apple.c index 80211fb38..96bdf3d2e 100644 --- a/src/detection/displayserver/displayserver_apple.c +++ b/src/detection/displayserver/displayserver_apple.c @@ -4,53 +4,31 @@ #include #include #include -#include - -//Resolution code heavily inspired by displayplacer <3 - -typedef union -{ - uint8_t rawData[0xDC]; - struct - { - uint32_t mode; - uint32_t flags; // 0x4 - uint32_t width; // 0x8 - uint32_t height; // 0xC - uint32_t depth; // 0x10 - uint32_t dc2[42]; - uint16_t dc3; - uint16_t freq; // 0xBC - uint32_t dc4[4]; - float density; // 0xD0 - } derived; -} modes_D4; - -void CGSGetCurrentDisplayMode(CGDirectDisplayID display, int* modeNum); -void CGSGetDisplayModeDescriptionOfLength(CGDirectDisplayID display, int idx, modes_D4* mode, int length); +#include +#include static void detectResolution(FFDisplayServerResult* ds) { - CGDisplayCount screenCount; - CGGetOnlineDisplayList(INT_MAX, NULL, &screenCount); - if(screenCount == 0) + CGDirectDisplayID screens[128]; + uint32_t screenCount; + if(CGGetOnlineDisplayList(sizeof(screens) / sizeof(screens[0]), screens, &screenCount) != kCGErrorSuccess) return; - CGDirectDisplayID* screens = malloc(screenCount * sizeof(CGDirectDisplayID)); - CGGetOnlineDisplayList(INT_MAX, screens, &screenCount); - for(uint32_t i = 0; i < screenCount; i++) { - int modeID; - CGSGetCurrentDisplayMode(screens[i], &modeID); - modes_D4 mode; - CGSGetDisplayModeDescriptionOfLength(screens[i], modeID, &mode, 0xD4); - - uint32_t refreshRate = ffdsParseRefreshRate(mode.derived.freq); - ffdsAppendResolution(ds, mode.derived.width, mode.derived.height, refreshRate); + CGDirectDisplayID screen = screens[i]; + CGDisplayModeRef mode = CGDisplayCopyDisplayMode(screen); + if(mode) + { + ffdsAppendResolution(ds, + (uint32_t)CGDisplayModeGetWidth(mode), + (uint32_t)CGDisplayModeGetHeight(mode), + (uint32_t)CGDisplayModeGetRefreshRate(mode) + ); + CGDisplayModeRelease(mode); + } + CGDisplayRelease(screen); } - - free(screens); } static void detectWM(FFDisplayServerResult* ds)