1/* 2cc -g -o /tmp/range range.c -framework ApplicationServices -framework IOKit -Wall 3*/ 4 5#include <CoreFoundation/CoreFoundation.h> 6#include <ApplicationServices/ApplicationServices.h> 7#include <IOKit/graphics/IOGraphicsLib.h> 8#include <stdlib.h> 9#include <stdio.h> 10 11 12int main(int argc, char * argv[]) 13{ 14 io_service_t service; 15 CGError err; 16 int i; 17 CGDisplayCount max; 18 CGDirectDisplayID displayIDs[8]; 19 uint32_t mask; 20 CFDataRef fbRange; 21 22 err = CGGetOnlineDisplayList(8, displayIDs, &max); 23 if(err != kCGErrorSuccess) 24 exit(1); 25 if(max > 8) 26 max = 8; 27 28 if( argc < 2) 29 mask = 0xffffffff; 30 else 31 mask = strtol( argv[1], 0, 0 ); 32 33 for(i = 0; i < max; i++ ) 34 { 35 if (!(mask & (1 << i))) 36 continue; 37 38 service = CGDisplayIOServicePort(displayIDs[i]); 39 40 41 printf("Display %p:\n", displayIDs[i]); 42 43 fbRange = (CFDataRef) IORegistryEntryCreateCFProperty( service, 44 CFSTR(kIOFBTimingRangeKey), 45 kCFAllocatorDefault, kNilOptions); 46 if (fbRange && CFDataGetLength(fbRange) >= sizeof(IODisplayTimingRange)) 47 { 48 IODisplayTimingRange * range = (IODisplayTimingRange *) CFDataGetBytePtr(fbRange); 49 50 printf(" minPixelClock %qd\n", range->minPixelClock); 51 printf(" maxPixelClock %qd\n", range->maxPixelClock); 52 53 printf(" maxPixelError %ld\n", range->maxPixelError); 54 printf(" supportedSyncFlags %ld\n", range->supportedSyncFlags); 55 printf(" supportedSignalLevels %ld\n", range->supportedSignalLevels); 56 printf(" supportedSignalConfigs %ld\n", range->supportedSignalConfigs); 57 printf(" minFrameRate %ld\n", range->minFrameRate); 58 printf(" maxFrameRate %ld\n", range->maxFrameRate); 59 printf(" minLineRate %ld\n", range->minLineRate); 60 printf(" maxLineRate %ld\n", range->maxLineRate); 61 62 printf(" maxHorizontalTotal %ld\n", range->maxHorizontalTotal); 63 printf(" maxVerticalTotal %ld\n", range->maxVerticalTotal); 64 printf(" charSizeHorizontalActive %d\n", range->charSizeHorizontalActive); 65 printf(" charSizeHorizontalBlanking %d\n", range->charSizeHorizontalBlanking); 66 printf(" charSizeHorizontalSyncOffset %d\n", range->charSizeHorizontalSyncOffset); 67 printf(" charSizeHorizontalSyncPulse %d\n", range->charSizeHorizontalSyncPulse); 68 printf(" charSizeVerticalActive %d\n", range->charSizeVerticalActive); 69 printf(" charSizeVerticalBlanking %d\n", range->charSizeVerticalBlanking); 70 printf(" charSizeVerticalSyncOffset %d\n", range->charSizeVerticalSyncOffset); 71 printf(" charSizeVerticalSyncPulse %d\n", range->charSizeVerticalSyncPulse); 72 printf(" charSizeHorizontalBorderLeft %d\n", range->charSizeHorizontalBorderLeft); 73 printf(" charSizeHorizontalBorderRight %d\n", range->charSizeHorizontalBorderRight); 74 printf(" charSizeVerticalBorderTop %d\n", range->charSizeVerticalBorderTop); 75 printf(" charSizeVerticalBorderBottom %d\n", range->charSizeVerticalBorderBottom); 76 printf(" charSizeHorizontalTotal %d\n", range->charSizeHorizontalTotal); 77 printf(" charSizeVerticalTotal %d\n", range->charSizeVerticalTotal); 78 79 printf(" minHorizontalActiveClocks %ld\n", range->minHorizontalActiveClocks); 80 printf(" maxHorizontalActiveClocks %ld\n", range->maxHorizontalActiveClocks); 81 printf(" minHorizontalBlankingClocks %ld\n", range->minHorizontalBlankingClocks); 82 printf(" maxHorizontalBlankingClocks %ld\n", range->maxHorizontalBlankingClocks); 83 printf(" minHorizontalSyncOffsetClocks %ld\n", range->minHorizontalSyncOffsetClocks); 84 printf(" maxHorizontalSyncOffsetClocks %ld\n", range->maxHorizontalSyncOffsetClocks); 85 printf(" minHorizontalPulseWidthClocks %ld\n", range->minHorizontalPulseWidthClocks); 86 printf(" maxHorizontalPulseWidthClocks %ld\n", range->maxHorizontalPulseWidthClocks); 87 88 printf(" minVerticalActiveClocks %ld\n", range->minVerticalActiveClocks); 89 printf(" maxVerticalActiveClocks %ld\n", range->maxVerticalActiveClocks); 90 printf(" minVerticalBlankingClocks %ld\n", range->minVerticalBlankingClocks); 91 printf(" maxVerticalBlankingClocks %ld\n", range->maxVerticalBlankingClocks); 92 93 printf(" minVerticalSyncOffsetClocks %ld\n", range->minVerticalSyncOffsetClocks); 94 printf(" maxVerticalSyncOffsetClocks %ld\n", range->maxVerticalSyncOffsetClocks); 95 printf(" minVerticalPulseWidthClocks %ld\n", range->minVerticalPulseWidthClocks); 96 printf(" maxVerticalPulseWidthClocks %ld\n", range->maxVerticalPulseWidthClocks); 97 98 printf(" minHorizontalBorderLeft %ld\n", range->minHorizontalBorderLeft); 99 printf(" maxHorizontalBorderLeft %ld\n", range->maxHorizontalBorderLeft); 100 printf(" minHorizontalBorderRight %ld\n", range->minHorizontalBorderRight); 101 printf(" maxHorizontalBorderRight %ld\n", range->maxHorizontalBorderRight); 102 103 printf(" minVerticalBorderTop %ld\n", range->minVerticalBorderTop); 104 printf(" maxVerticalBorderTop %ld\n", range->maxVerticalBorderTop); 105 printf(" minVerticalBorderBottom %ld\n", range->minVerticalBorderBottom); 106 printf(" maxVerticalBorderBottom %ld\n", range->maxVerticalBorderBottom); 107 108 printf(" maxNumLinks %ld\n", range->maxNumLinks); 109 printf(" minLink0PixelClock %ld\n", range->minLink0PixelClock); 110 printf(" maxLink0PixelClock %ld\n", range->maxLink0PixelClock); 111 printf(" minLink1PixelClock %ld\n", range->minLink1PixelClock); 112 printf(" maxLink1PixelClock %ld\n", range->maxLink1PixelClock); 113 114 } 115 116 fbRange = (CFDataRef) IORegistryEntryCreateCFProperty( service, 117 CFSTR(kIOFBScalerInfoKey), 118 kCFAllocatorDefault, kNilOptions); 119 if (fbRange && CFDataGetLength(fbRange) >= sizeof(IODisplayScalerInformation)) 120 { 121 IODisplayScalerInformation * range = (IODisplayScalerInformation *) CFDataGetBytePtr(fbRange); 122 printf("IODisplayScalerInformation:\n"); 123 printf(" scalerFeatures %lx\n", range->scalerFeatures); 124 printf(" maxHorizontalPixels %ld\n", range->maxHorizontalPixels); 125 printf(" maxVerticalPixels %ld\n", range->maxVerticalPixels); 126 } 127 128 129 } 130 131 exit(0); 132 return(0); 133} 134 135