diff options
author | Marek Marczykowski-Górecki <marmarek@invisiblethingslab.com> | 2016-07-22 02:40:29 +0200 |
---|---|---|
committer | Adam Jackson <ajax@nwnk.net> | 2020-03-10 17:33:43 +0000 |
commit | a87cfeca7dca26a840793024cc44f5aea5adc7bf (patch) | |
tree | 8926d6ec0879946dbb8ab32b8589c89dec23f745 | |
parent | 327a25c4c3ab0b79a1103794449a1f7ccd6faff3 (diff) |
xf86-video-dummy: changeable physical output size
Add WIDTH_MM and HEIGHT_MM output properties to allow setting "physical"
size of the output. Normally this data is retrieved from EDID, but for
obvious reasons it can't be done in the VM.
This patch allows to set this properties from user space. This is later
reported as output size (the header line describing the output in
`xrandr` output).
Signed-off-by: Marek Marczykowski-Górecki <marmarek@invisiblethingslab.com>
-rw-r--r-- | src/dummy_driver.c | 60 |
1 files changed, 58 insertions, 2 deletions
diff --git a/src/dummy_driver.c b/src/dummy_driver.c index 045de64..2d1ecfd 100644 --- a/src/dummy_driver.c +++ b/src/dummy_driver.c @@ -82,6 +82,10 @@ static Bool dummyDriverFunc(ScrnInfoPtr pScrn, xorgDriverFuncOp op, */ static int pix24bpp = 0; +Atom width_mm_atom = 0; +#define WIDTH_MM_NAME "WIDTH_MM" +Atom height_mm_atom = 0; +#define HEIGHT_MM_NAME "HEIGHT_MM" /* * This contains the functions needed by the server after loading the driver @@ -279,9 +283,61 @@ dummy_output_get_modes (xf86OutputPtr output) return pModes; } +void dummy_output_register_prop(xf86OutputPtr output, Atom prop, uint64_t value) +{ + INT32 dims_range[2] = { 0, 65535 }; + int err; + + err = RRConfigureOutputProperty(output->randr_output, prop, FALSE, + TRUE, FALSE, 2, dims_range); + if (err != 0) + xf86DrvMsg(output->scrn->scrnIndex, X_ERROR, + "RRConfigureOutputProperty error, %d\n", err); + + err = RRChangeOutputProperty(output->randr_output, prop, XA_INTEGER, + 32, PropModeReplace, 1, &value, FALSE, FALSE); + if (err != 0) + xf86DrvMsg(output->scrn->scrnIndex, X_ERROR, + "RRChangeOutputProperty error, %d\n", err); +} + +void dummy_output_create_resources(xf86OutputPtr output) +{ + if (!ValidAtom(width_mm_atom)) + width_mm_atom = MakeAtom(WIDTH_MM_NAME, strlen(WIDTH_MM_NAME), 1); + if (!ValidAtom(height_mm_atom)) + height_mm_atom = MakeAtom(HEIGHT_MM_NAME, strlen(HEIGHT_MM_NAME), 1); + + dummy_output_register_prop(output, width_mm_atom, 0); + dummy_output_register_prop(output, height_mm_atom, 0); +} + +static Bool dummy_output_set_property(xf86OutputPtr output, Atom property, + RRPropertyValuePtr value) +{ + + if (property == width_mm_atom || property == height_mm_atom) { + INT32 val; + + if (value->type != XA_INTEGER || value->format != 32 || + value->size != 1) + { + return FALSE; + } + + val = *(INT32 *)value->data; + if (property == width_mm_atom) + output->mm_width = val; + else if (property == height_mm_atom) + output->mm_height = val; + return TRUE; + } + return TRUE; +} + static const xf86OutputFuncsRec DUMMYOutputFuncs = { - .create_resources = dummy_output_stub, + .create_resources = dummy_output_create_resources, .dpms = dummy_output_dpms, .save = NULL, /* These two are never called by the server. */ .restore = NULL, @@ -293,7 +349,7 @@ static const xf86OutputFuncsRec DUMMYOutputFuncs = { .detect = dummy_output_detect, .get_modes = dummy_output_get_modes, #ifdef RANDR_12_INTERFACE - .set_property = NULL, + .set_property = dummy_output_set_property, #endif .destroy = dummy_output_stub }; |