From: Kai-Uwe Behrmann Date: Sun, 17 Feb 2013 19:28:06 +0000 (+0100) Subject: * [oyX1]: set xcalib to screen if XRandR >= 1.2 X-Git-Url: http://www.oyranos.org/scm?p=oyranos.git;a=commitdiff_plain;h=505b3931d9de6c667566278c5b3a1713d43212a8 * [oyX1]: set xcalib to screen if XRandR >= 1.2 --- diff --git a/src/modules/devices/oyranos_monitor_x11.c b/src/modules/devices/oyranos_monitor_x11.c index a090b14..a530a81 100644 --- a/src/modules/devices/oyranos_monitor_x11.c +++ b/src/modules/devices/oyranos_monitor_x11.c @@ -90,6 +90,8 @@ RROutput XRROutputInfo * oyX1Monitor_xrrOutputInfo_( oyX1Monitor_s * disp ) { return disp->output_info; } int oyX1Monitor_activeOutputs_( oyX1Monitor_s * disp ) { return disp->active_outputs; } +int oyX1Monitor_rrVersion_ ( oyX1Monitor_s * disp ) { return disp->rr_version; } +int oyX1Monitor_rrScreen_ ( oyX1Monitor_s * disp ) { return disp->rr_screen; } #endif @@ -680,7 +682,8 @@ int oyX1MonitorProfileSetup ( const char * display_name, char *text = 0; DBG_PROG_START - disp = oyX1Monitor_newFrom_( display_name, 0 ); + /* XRandR needs a expensive initialisation */ + disp = oyX1Monitor_newFrom_( display_name, 1 ); if(!disp) return 1; @@ -721,6 +724,13 @@ int oyX1MonitorProfileSetup ( const char * display_name, */ sprintf(text,"xcalib -d %s -s %d %s \'%s\'", dpy_name, disp->geo[1], oy_debug?"-v":"", profile_fullname); + if(oyX1Monitor_infoSource_( disp ) == oyX11INFO_SOURCE_XRANDR) + sprintf(text,"xcalib -d %s -s %d %s \'%s\'", dpy_name, oyX1Monitor_rrScreen_(disp), + oy_debug?"-v":"", profile_fullname); + else + sprintf(text,"xcalib -d %s -s %d %s \'%s\'", dpy_name, disp->geo[1], + oy_debug?"-v":"", profile_fullname); + { Display * display = oyX1Monitor_device_( disp ); int effective_screen = oyX1Monitor_screen_( disp ); @@ -751,17 +761,21 @@ int oyX1MonitorProfileSetup ( const char * display_name, #endif /* Check for incapabilities of X gamma table access */ - if(can_gamma || oyX1Monitor_screen_( disp ) == 0) + if(can_gamma || oyX1Monitor_screen_( disp ) == 0 || oyX1Monitor_infoSource_( disp ) == oyX11INFO_SOURCE_XRANDR ) error = system(text); if(error && error != 65280) { /* hack */ - WARNc2_S("%s %s", _("No monitor gamma curves by profile:"), - oyNoEmptyName_m_(profil_basename) ) + WARNc3_S("%s %s %d", _("No monitor gamma curves by profile:"), + oyNoEmptyName_m_(profil_basename), error ) error = -1; } else + { /* take xcalib error not serious, turn into a issue */ + if(oy_debug) + DBG1_S("xcalib returned %d", error) error = -1; + } } if(oy_debug) @@ -873,7 +887,8 @@ int oyX1MonitorProfileUnset ( const char * display_name ) DBG_PROG_START - disp = oyX1Monitor_newFrom_( display_name, 0 ); + /* XRandR needs a expensive initialisation */ + disp = oyX1Monitor_newFrom_( display_name, 1 ); if(!disp) { DBG_PROG_ENDE @@ -926,10 +941,16 @@ int oyX1MonitorProfileUnset ( const char * display_name ) if( (ptr = strchr(ptr,'.')) != 0 ) ptr[0] = '\000'; - oySnprintf2_(command, 1024, "xgamma -gamma 1.0 -screen %d -display %s", + if(oyX1Monitor_infoSource_( disp ) == oyX11INFO_SOURCE_XRANDR) + oySnprintf2_(command, 1024, "xrandr -display %s --output %s --gamma .999999:.999999:.999999", + dpy_name, oyX1Monitor_systemPort_(disp)); + else + oySnprintf2_(command, 1024, "xgamma -gamma 1.0 -screen %d -display %s", disp->geo[1], dpy_name); - if(screen == disp->geo[1]) + if(oy_debug) + DBG3_S( "%d %d system: %s", screen, disp->geo[1], command ) + if(screen == disp->geo[1] || oyX1Monitor_infoSource_( disp ) == oyX11INFO_SOURCE_XRANDR) r = system( command ); if(r) WARNc2_S("%s %d", _("found issues"),r); @@ -1347,17 +1368,16 @@ oyX1Monitor_s* oyX1Monitor_newFrom_ ( const char * display_name, if(monitors == 0) { - if(strcmp("default", output_info->name) != 0) - { - disp->info_source = oyX11INFO_SOURCE_XRANDR; - - } else + if(!XRRGetCrtcGammaSize( display, output_info->crtc )) { XRRFreeOutputInfo( output_info ); break; } } + if(XRRGetCrtcGammaSize( display, output_info->crtc )) + disp->info_source = oyX11INFO_SOURCE_XRANDR; + crtc_info = XRRGetCrtcInfo( disp->display, res_temp, output_info->crtc ); if(crtc_info) @@ -1390,6 +1410,8 @@ oyX1Monitor_s* oyX1Monitor_newFrom_ ( const char * display_name, if(disp->output_info->name && oyStrlen_(disp->output_info->name)) disp->system_port = oyStringCopy_( disp->output_info->name, oyAllocateFunc_ ); + disp->rr_version = major_versionp*100 + minor_versionp; + disp->rr_screen = xrand_screen; } ++ monitors;