randr: Add monitor option "Panning" for initial panning configuration

This commit is contained in:
Matthias Hopf 2008-12-11 14:56:51 +01:00
parent 27261a950d
commit fdbbe65a7e
2 changed files with 65 additions and 1 deletions

View File

@ -457,6 +457,7 @@ typedef enum {
OPTION_MAX_CLOCK,
OPTION_IGNORE,
OPTION_ROTATE,
OPTION_PANNING,
} OutputOpts;
static OptionInfoRec xf86OutputOptions[] = {
@ -472,6 +473,7 @@ static OptionInfoRec xf86OutputOptions[] = {
{OPTION_MAX_CLOCK, "MaxClock", OPTV_FREQ, {0}, FALSE },
{OPTION_IGNORE, "Ignore", OPTV_BOOLEAN, {0}, FALSE },
{OPTION_ROTATE, "Rotate", OPTV_STRING, {0}, FALSE },
{OPTION_PANNING, "Panning", OPTV_STRING, {0}, FALSE },
{-1, NULL, OPTV_NONE, {0}, FALSE },
};
@ -1320,6 +1322,56 @@ xf86InitialOutputPositions (ScrnInfoPtr scrn, DisplayModePtr *modes)
return TRUE;
}
static void
xf86InitialPanning (ScrnInfoPtr scrn)
{
xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(scrn);
int o;
for (o = 0; o < config->num_output; o++)
{
xf86OutputPtr output = config->output[o];
char *panning = xf86GetOptValString (output->options, OPTION_PANNING);
int width, height, left, top;
int track_width, track_height, track_left, track_top;
int brdr[4];
memset (&output->initialTotalArea, 0, sizeof(BoxRec));
memset (&output->initialTrackingArea, 0, sizeof(BoxRec));
memset (output->initialBorder, 0, 4*sizeof(INT16));
if (! panning)
continue;
switch (sscanf (panning, "%dx%d+%d+%d/%dx%d+%d+%d/%d/%d/%d/%d",
&width, &height, &left, &top,
&track_width, &track_height, &track_left, &track_top,
&brdr[0], &brdr[1], &brdr[2], &brdr[3])) {
case 12:
memcpy (output->initialBorder, brdr, 4*sizeof(INT16));
/* fall through */
case 8:
output->initialTrackingArea.x1 = track_left;
output->initialTrackingArea.y1 = track_top;
output->initialTrackingArea.x2 = track_left + track_width;
output->initialTrackingArea.y2 = track_top + track_height;
/* fall through */
case 4:
output->initialTotalArea.x1 = left;
output->initialTotalArea.y1 = top;
/* fall through */
case 2:
output->initialTotalArea.x2 = output->initialTotalArea.x1 + width;
output->initialTotalArea.y2 = output->initialTotalArea.y1 + height;
break;
default:
xf86DrvMsg (output->scrn->scrnIndex, X_ERROR,
"Broken panning specification '%s' for output %s in config file\n",
panning, output->name);
}
}
}
/*
* XXX walk the monitor mode list and prune out duplicates that
* are inserted by xf86DDCMonitorSet. In an ideal world, that
@ -2246,6 +2298,11 @@ xf86InitialConfiguration (ScrnInfoPtr scrn, Bool canGrow)
xfree (modes);
return FALSE;
}
/*
* Set initial panning of each output
*/
xf86InitialPanning (scrn);
/*
* Assign CRTCs to fit output configuration
@ -2289,6 +2346,9 @@ xf86InitialConfiguration (ScrnInfoPtr scrn, Bool canGrow)
crtc->enabled = TRUE;
crtc->x = output->initial_x;
crtc->y = output->initial_y;
memcpy (&crtc->panningTotalArea, &output->initialTotalArea, sizeof(BoxRec));
memcpy (&crtc->panningTrackingArea, &output->initialTrackingArea, sizeof(BoxRec));
memcpy (crtc->panningBorder, output->initialBorder, 4*sizeof(INT16));
output->crtc = crtc;
} else {
output->crtc = NULL;

View File

@ -466,7 +466,7 @@ typedef struct _xf86OutputFuncs {
} xf86OutputFuncsRec, *xf86OutputFuncsPtr;
#define XF86_OUTPUT_VERSION 1
#define XF86_OUTPUT_VERSION 2
struct _xf86Output {
/**
@ -574,6 +574,10 @@ struct _xf86Output {
#else
void *randr_output;
#endif
/** Desired initial panning */
BoxRec initialTotalArea;
BoxRec initialTrackingArea;
INT16 initialBorder[4];
};
typedef struct _xf86CrtcConfigFuncs {