From 55180f5bb3063a491487bedc58550a3571cbdcbd Mon Sep 17 00:00:00 2001 From: Alberto Milone Date: Tue, 3 Dec 2013 18:16:22 +0100 Subject: [PATCH] xrandr: ignore the error if setting the primary output fails Some drivers which support RandR 1.4 may not support setting or getting the primary output, therefore mutter should trap and ignore any relevant errors. The modesetting driver exposes this problem when used in combination with the nvidia binary driver using RandR 1.4 offloading. Also use a local display variable instead of calling meta_get_display () every time. --- src/core/monitor-xrandr.c | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/src/core/monitor-xrandr.c b/src/core/monitor-xrandr.c index d8ee2a2c0..498e75390 100644 --- a/src/core/monitor-xrandr.c +++ b/src/core/monitor-xrandr.c @@ -453,8 +453,10 @@ meta_monitor_manager_xrandr_read_current (MetaMonitorManager *manager) XRRFreeCrtcInfo (crtc); } + meta_error_trap_push (meta_get_display ()); primary_output = XRRGetOutputPrimary (manager_xrandr->xdisplay, DefaultRootWindow (manager_xrandr->xdisplay)); + meta_error_trap_pop (meta_get_display ()); n_actual_outputs = 0; for (i = 0; i < (unsigned)resources->noutput; i++) @@ -693,10 +695,11 @@ meta_monitor_manager_xrandr_apply_configuration (MetaMonitorManager *manager, unsigned int n_outputs) { MetaMonitorManagerXrandr *manager_xrandr = META_MONITOR_MANAGER_XRANDR (manager); + MetaDisplay *display = meta_get_display (); unsigned i; int width, height, width_mm, height_mm; - meta_display_grab (meta_get_display ()); + meta_display_grab (display); /* First compute the new size of the screen (framebuffer) */ width = 0; height = 0; @@ -790,10 +793,10 @@ meta_monitor_manager_xrandr_apply_configuration (MetaMonitorManager *manager, */ width_mm = (width / DPI_FALLBACK) * 25.4 + 0.5; height_mm = (height / DPI_FALLBACK) * 25.4 + 0.5; - meta_error_trap_push (meta_get_display ()); + meta_error_trap_push (display); XRRSetScreenSize (manager_xrandr->xdisplay, DefaultRootWindow (manager_xrandr->xdisplay), width, height, width_mm, height_mm); - meta_error_trap_pop (meta_get_display ()); + meta_error_trap_pop (display); for (i = 0; i < n_crtcs; i++) { @@ -850,7 +853,7 @@ meta_monitor_manager_xrandr_apply_configuration (MetaMonitorManager *manager, goto next; } - meta_error_trap_push (meta_get_display ()); + meta_error_trap_push (display); ok = XRRSetCrtcConfig (manager_xrandr->xdisplay, manager_xrandr->resources, (XID)crtc->crtc_id, @@ -859,7 +862,7 @@ meta_monitor_manager_xrandr_apply_configuration (MetaMonitorManager *manager, (XID)mode->mode_id, wl_transform_to_xrandr (crtc_info->transform), outputs, n_outputs); - meta_error_trap_pop (meta_get_display ()); + meta_error_trap_pop (display); if (ok != Success) { @@ -900,9 +903,11 @@ meta_monitor_manager_xrandr_apply_configuration (MetaMonitorManager *manager, if (output_info->is_primary) { + meta_error_trap_push (display); XRRSetOutputPrimary (manager_xrandr->xdisplay, DefaultRootWindow (manager_xrandr->xdisplay), (XID)output_info->output->output_id); + meta_error_trap_pop (display); } output_set_presentation_xrandr (manager_xrandr, @@ -928,7 +933,7 @@ meta_monitor_manager_xrandr_apply_configuration (MetaMonitorManager *manager, output->is_primary = FALSE; } - meta_display_ungrab (meta_get_display ()); + meta_display_ungrab (display); } static void