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