+ /* Due to the semantics of find_mode, the mode's monitor pointer must point
+ to one of the elements of the monitors list, which is non-const here. */
+ Monitor *monitor = const_cast<Monitor *>(mode->monitor);
+
+ if(exclusive)
+ {
+ monitor->current_settings.mode = mode;
+ monitor->current_settings.rotation = requested_rotation;
+ monitor->current_settings.x = 0;
+ monitor->current_settings.y = 0;
+
+ // Disable other outputs for exclusive mode
+ for(Monitor &m: monitors)
+ if(&m!=mode->monitor)
+ {
+ XRROutputInfo *o = XRRGetOutputInfo(priv->display, res, priv->monitors[m.index]);
+ if(o->crtc)
+ XRRSetCrtcConfig(priv->display, res, o->crtc, CurrentTime, 0, 0, 0, RR_Rotate_0, nullptr, 0);
+ XRRFreeOutputInfo(o);
+
+ m.current_settings.mode = nullptr;
+ m.current_settings.rotation = ROTATE_NORMAL;
+ m.current_settings.x = 0;
+ m.current_settings.y = 0;
+ }
+ }
+ else
+ {
+ monitor->current_settings.x = monitor->desktop_settings.x;
+ monitor->current_settings.y = monitor->desktop_settings.y;
+ }
+
+ RRMode mode_id = priv->modes[mode->index];
+ int x = monitor->current_settings.x;
+ int y = monitor->current_settings.y;
+ Rotation sys_rot = rotation_to_sys(requested_rotation);
+ XRRSetCrtcConfig(priv->display, res, crtc, CurrentTime, x, y, mode_id, sys_rot, &output, 1);
+
+ XRRFreeOutputInfo(output_info);
+ XRRFreeCrtcInfo(crtc_info);
+ XRRFreeScreenResources(res);