diff --git a/src/detection/phycialdisplay/phycialdisplay.h b/src/detection/phycialdisplay/phycialdisplay.h index 81731e875..99e449686 100644 --- a/src/detection/phycialdisplay/phycialdisplay.h +++ b/src/detection/phycialdisplay/phycialdisplay.h @@ -5,6 +5,8 @@ typedef struct FFPhycialDisplayResult FFstrbuf name; uint32_t width; // native / maximum resolution, in pixels uint32_t height; // native / maximum resolution, in pixels + uint32_t phycialWidth; // in mm + uint32_t phycialHeight; // in mm } FFPhycialDisplayResult; const char* ffDetectPhycialDisplay(FFlist* results); diff --git a/src/detection/phycialdisplay/phycialdisplay_apple.c b/src/detection/phycialdisplay/phycialdisplay_apple.c index 824028951..80ed3b973 100644 --- a/src/detection/phycialdisplay/phycialdisplay_apple.c +++ b/src/detection/phycialdisplay/phycialdisplay_apple.c @@ -31,6 +31,10 @@ static const char* detectWithDisplayServices(const FFDisplayServerResult* displa CFDictionaryRef productNames; if(!ffCfDictGetDict(displayInfo, CFSTR(kDisplayProductName), &productNames)) ffCfDictGetString(productNames, CFSTR("en_US"), &phycialDisplay->name); + + CGSize size = CGDisplayScreenSize((CGDirectDisplayID) display->id); + phycialDisplay->phycialWidth = (uint32_t) (size.width + 0.5); + phycialDisplay->phycialHeight = (uint32_t) (size.height + 0.5); } } } @@ -83,14 +87,16 @@ static const char* detectWithDdcci(FFlist* results) continue; uint32_t width, height; - ffEdidGetPhycialResolution(CFDataGetBytePtr(edid), &width, &height); + const uint8_t* edidData = CFDataGetBytePtr(edid); + ffEdidGetPhycialResolution(edidData, &width, &height); if (width == 0 || height == 0) continue; FFPhycialDisplayResult* display = (FFPhycialDisplayResult*) ffListAdd(results); display->width = width; display->height = height; ffStrbufInit(&display->name); - ffEdidGetName(CFDataGetBytePtr(edid), &display->name); + ffEdidGetName(edidData, &display->name); + ffEdidGetPhycialSize(edidData, &display->phycialWidth, &display->phycialHeight); } return NULL; } diff --git a/src/detection/phycialdisplay/phycialdisplay_linux.c b/src/detection/phycialdisplay/phycialdisplay_linux.c index 681eb33db..3063b512c 100644 --- a/src/detection/phycialdisplay/phycialdisplay_linux.c +++ b/src/detection/phycialdisplay/phycialdisplay_linux.c @@ -50,6 +50,7 @@ const char* ffDetectPhycialDisplay(FFlist* results) display->width = width; display->height = height; ffStrbufInitS(&display->name, plainName); + ffEdidGetPhycialSize(edidData, &display->phycialWidth, &display->phycialHeight); } ffStrbufSubstrBefore(&drmDir, drmDirLength); diff --git a/src/detection/phycialdisplay/phycialdisplay_windows.c b/src/detection/phycialdisplay/phycialdisplay_windows.c index 999fcf3e7..3f02df66c 100644 --- a/src/detection/phycialdisplay/phycialdisplay_windows.c +++ b/src/detection/phycialdisplay/phycialdisplay_windows.c @@ -36,13 +36,12 @@ const char* ffDetectPhycialDisplay(FFlist* results) ffEdidGetPhycialResolution(edidData, &width, &height); if (width == 0 || height == 0) continue; - wchar_t wName[MAX_PATH] = {}; // MONITOR\BOE09F9 - if (!SetupDiGetDeviceRegistryPropertyW(hdev, &did, SPDRP_HARDWAREID, NULL, (BYTE*) wName, sizeof(wName), NULL)) continue; - FFPhycialDisplayResult* display = (FFPhycialDisplayResult*) ffListAdd(results); display->width = width; display->height = height; - ffStrbufInitWS(&display->name, wcschr(wName, L'\\') + 1); + ffStrbufInit(&display->name); + ffEdidGetName(edidData, &display->name); + ffEdidGetPhycialSize(edidData, &display->phycialWidth, &display->phycialHeight); } return NULL; } diff --git a/src/modules/phycialdisplay/phycialdisplay.c b/src/modules/phycialdisplay/phycialdisplay.c index 9a14c8a44..b2df93b77 100644 --- a/src/modules/phycialdisplay/phycialdisplay.c +++ b/src/modules/phycialdisplay/phycialdisplay.c @@ -4,6 +4,8 @@ #include "modules/phycialdisplay/phycialdisplay.h" #include "util/stringUtils.h" +#include + #define FF_PHYCIALDISPLAY_DISPLAY_NAME "Phycial Display" #define FF_PHYCIALDISPLAY_NUM_FORMAT_ARGS 3 @@ -29,6 +31,8 @@ void ffPrintPhycialDisplay(FFPhycialDisplayOptions* options) FF_STRBUF_AUTO_DESTROY key = ffStrbufCreate(); FF_LIST_FOR_EACH(FFPhycialDisplayResult, display, result) { + double inch = sqrt(display->phycialWidth * display->phycialWidth + display->phycialHeight * display->phycialHeight) / 25.4; + if(options->moduleArgs.outputFormat.length == 0) { ffStrbufClear(&key); @@ -44,7 +48,7 @@ void ffPrintPhycialDisplay(FFPhycialDisplayOptions* options) } ffPrintLogoAndKey(key.chars, 0, NULL, &options->moduleArgs.keyColor); - printf("%ux%u\n", display->width, display->height); + printf("%upx x %upx - %umm x %umm (%.2f inches)\n", display->width, display->height, display->phycialWidth, display->phycialHeight, inch); } else { @@ -52,6 +56,9 @@ void ffPrintPhycialDisplay(FFPhycialDisplayOptions* options) {FF_FORMAT_ARG_TYPE_STRBUF, &display->name}, {FF_FORMAT_ARG_TYPE_UINT, &display->width}, {FF_FORMAT_ARG_TYPE_UINT, &display->height}, + {FF_FORMAT_ARG_TYPE_UINT, &display->phycialWidth}, + {FF_FORMAT_ARG_TYPE_UINT, &display->phycialHeight}, + {FF_FORMAT_ARG_TYPE_DOUBLE, &inch}, }); } diff --git a/src/util/edidHelper.c b/src/util/edidHelper.c index 646630a1f..b8acc7dbc 100644 --- a/src/util/edidHelper.c +++ b/src/util/edidHelper.c @@ -26,3 +26,9 @@ void ffEdidGetName(const uint8_t edid[128], FFstrbuf* name) } } } + +void ffEdidGetPhycialSize(const uint8_t edid[128], uint32_t* width, uint32_t* height) +{ + *width = (((uint32_t) edid[68] & 0xF0) << 4) + edid[66]; + *height = (((uint32_t) edid[68] & 0x0F) << 8) + edid[67]; +} diff --git a/src/util/edidHelper.h b/src/util/edidHelper.h index 921f7d767..b5e3fa8c1 100644 --- a/src/util/edidHelper.h +++ b/src/util/edidHelper.h @@ -8,5 +8,6 @@ void ffEdidGetName(const uint8_t edid[128], FFstrbuf* name); void ffEdidGetPhycialResolution(const uint8_t edid[128], uint32_t* width, uint32_t* height); +void ffEdidGetPhycialSize(const uint8_t edid[128], uint32_t* width, uint32_t* height); // in mm #endif