randr: Add monitor option "Panning" for initial panning configuration
This commit is contained in:
parent
27261a950d
commit
fdbbe65a7e
|
@ -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
|
||||
|
@ -2247,6 +2299,11 @@ xf86InitialConfiguration (ScrnInfoPtr scrn, Bool canGrow)
|
|||
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;
|
||||
|
|
|
@ -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 {
|
||||
|
|
Loading…
Reference in New Issue
Block a user