diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2014-08-05 16:21:19 +0100 |
---|---|---|
committer | Chris Wilson <chris@chris-wilson.co.uk> | 2014-08-05 16:22:53 +0100 |
commit | c5e654cf2afcafbe3732548359771747dac1ce26 (patch) | |
tree | 0dd95a1b6be574ca483565e29df01dcb5f565f11 | |
parent | 999c8dc700a0573859ec1aaae4500493d01d0c0c (diff) |
sna: Set the RandR primary output from the option
If the user specifies the Option "Primary" for a monitor, we need to set
it as the RandR primary output.
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=82193
-rw-r--r-- | src/sna/sna.h | 1 | ||||
-rw-r--r-- | src/sna/sna_display.c | 26 | ||||
-rw-r--r-- | src/sna/sna_driver.c | 2 |
3 files changed, 29 insertions, 0 deletions
diff --git a/src/sna/sna.h b/src/sna/sna.h index 498149da..bce8bab3 100644 --- a/src/sna/sna.h +++ b/src/sna/sna.h @@ -432,6 +432,7 @@ extern void sna_shadow_set_crtc(struct sna *sna, xf86CrtcPtr crtc, struct kgem_b extern void sna_shadow_unset_crtc(struct sna *sna, xf86CrtcPtr crtc); extern bool sna_pixmap_discard_shadow_damage(struct sna_pixmap *priv, const RegionRec *region); +extern void sna_mode_set_primary(struct sna *sna); extern void sna_mode_close(struct sna *sna); extern void sna_mode_fini(struct sna *sna); diff --git a/src/sna/sna_display.c b/src/sna/sna_display.c index 0a6d35e6..5335f069 100644 --- a/src/sna/sna_display.c +++ b/src/sna/sna_display.c @@ -3921,6 +3921,7 @@ void sna_mode_discover(struct sna *sna) DBG(("%s: outputs changed, broadcasting\n", __FUNCTION__)); sna_mode_compute_possible_outputs(sna); + sna_mode_set_primary(sna); /* Reorder user visible listing */ sort_config_outputs(sna); @@ -5652,6 +5653,31 @@ sna_mode_wants_tear_free(struct sna *sna) } void +sna_mode_set_primary(struct sna *sna) +{ +#ifdef RANDR_12_INTERFACE + xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(sna->scrn); + rrScrPrivPtr rr = rrGetScrPriv(xf86ScrnToScreen(sna->scrn)); + int i; + + if (rr->primaryOutput) + return; + + for (i = 0; i < sna->mode.num_real_output; i++) { + xf86OutputPtr output = config->output[i]; + + if (!xf86ReturnOptValBool(output->options, OPTION_PRIMARY, FALSE)) + continue; + + rr->primaryOutput = output->randr_output; + RROutputChanged(rr->primaryOutput, 0); + rr->layoutChanged = TRUE; + break; + } +#endif +} + +void sna_mode_close(struct sna *sna) { while (sna_mode_has_pending_events(sna)) diff --git a/src/sna/sna_driver.c b/src/sna/sna_driver.c index 5e541253..322e9514 100644 --- a/src/sna/sna_driver.c +++ b/src/sna/sna_driver.c @@ -272,6 +272,8 @@ static Bool sna_create_screen_resources(ScreenPtr screen) return FALSE; } + sna_mode_set_primary(sna); + /* Only preserve the fbcon, not any subsequent server regens */ if (serverGeneration == 1 && (sna->flags & SNA_IS_HOSTED) == 0) sna_copy_fbcon(sna); |