X-Git-Url: https://git.piment-noir.org/?p=deb_libcec.git;a=blobdiff_plain;f=src%2Flib%2Fplatform%2FX11%2Frandr-edid.cpp;h=4de17e4a111cd7705448dcc75bcad397c97cf3a1;hp=42071b345f18b6c45837030cc7ef7833059de976;hb=5ce88432714dbc3ff38f93227d84da5ff88b6781;hpb=103eb041ef46f322b3c374da47feabab6c378004 diff --git a/src/lib/platform/X11/randr-edid.cpp b/src/lib/platform/X11/randr-edid.cpp index 42071b3..4de17e4 100644 --- a/src/lib/platform/X11/randr-edid.cpp +++ b/src/lib/platform/X11/randr-edid.cpp @@ -25,7 +25,7 @@ * please contact Pulse-Eight Licensing for more information. * * For more information contact: - * Pulse-Eight Licensing + * Pulse-Eight Licensing * http://www.pulse-eight.com/ * http://www.pulse-eight.net/ */ @@ -46,121 +46,121 @@ using namespace PLATFORM; static const char * const edid_names[] = { #if (RANDR_MAJOR > 1) || (RANDR_MAJOR == 1 && RANDR_MINOR >2) - RR_PROPERTY_RANDR_EDID, + RR_PROPERTY_RANDR_EDID, #else - "EDID", + "EDID", #endif - "EDID_DATA", - "XFree86_DDC_EDID1_RAWDATA" + "EDID_DATA", + "XFree86_DDC_EDID1_RAWDATA" }; #define EDID_NAME_COUNT (sizeof(edid_names)/sizeof(*edid_names)) uint16_t CRandrEdidParser::GetPhysicalAddress(void) { - uint16_t physical_address = 0; + uint16_t physical_address = 0; - /* open default X11 DISPLAY */ - Display *disp = XOpenDisplay(NULL); - if( disp ) - { - int event_base, error_base; - int maj, min; + /* open default X11 DISPLAY */ + Display *disp = XOpenDisplay(NULL); + if( disp ) + { + int event_base, error_base; + int maj, min; - if( XRRQueryExtension(disp, &event_base, &error_base) - && XRRQueryVersion(disp, &maj, &min) ) + if( XRRQueryExtension(disp, &event_base, &error_base) + && XRRQueryVersion(disp, &maj, &min) ) + { + int version = (maj << 8) | min; + + if( version >= 0x0102 ) + { + size_t atom_avail = 0; + Atom edid_atoms[EDID_NAME_COUNT]; + + if( XInternAtoms(disp, (char **)edid_names, EDID_NAME_COUNT, True, edid_atoms) ) { - int version = (maj << 8) | min; - - if( version >= 0x0102 ) + /* remove missing some atoms */ + atom_avail = 0; + for(size_t atom_count=0; atom_count 0 ) - { - int scr_count = ScreenCount(disp); - int screen; + if( atom_avail > 0 ) + { + int scr_count = ScreenCount(disp); + int screen; - for(screen=0; screen 1) || (RANDR_MAJOR == 1 && RANDR_MINOR >=2) - if( version >= 0x0103 ) - { - /* get cached resources if they are available */ - rsrc = XRRGetScreenResourcesCurrent(disp, root); - } +#if (RANDR_MAJOR > 1) || (RANDR_MAJOR == 1 && RANDR_MINOR >=3) + if( version >= 0x0103 ) + { + /* get cached resources if they are available */ + rsrc = XRRGetScreenResourcesCurrent(disp, root); + } - if( NULL == rsrc ) + if( NULL == rsrc ) #endif - rsrc = XRRGetScreenResources(disp, root); + rsrc = XRRGetScreenResources(disp, root); - if( NULL != rsrc ) + if( NULL != rsrc ) + { + int output_id; + for( output_id=0; 0 == physical_address && output_id < rsrc->noutput; ++output_id ) + { + RROutput rr_output_id = rsrc->outputs[output_id]; + XRROutputInfo *output_info = XRRGetOutputInfo(disp, rsrc, rr_output_id); + if( NULL != output_info ) + { + if( RR_Connected == output_info->connection ) + { + for(size_t atom_count=0; 0 == physical_address && atom_countnoutput; ++output_id ) - { - RROutput rr_output_id = rsrc->outputs[output_id]; - XRROutputInfo *output_info = XRRGetOutputInfo(disp, rsrc, rr_output_id); - if( NULL != output_info ) - { - if( RR_Connected == output_info->connection ) - { - for(size_t atom_count=0; 0 == physical_address && atom_count