blob: 6acfcdd11cfab4a5f79147730cd1a5dced7c6074 [file] [log] [blame]
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;