| From: Kai-Uwe Behrmann <ku.b@gmx.de> |
| 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; |
| |