+ /* 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(list<Monitor>::iterator i=monitors.begin(); i!=monitors.end(); ++i)
+ if(&*i!=mode->monitor)
+ {
+ XRROutputInfo *o = XRRGetOutputInfo(priv->display, res, priv->monitors[i->index]);
+ if(o->crtc)
+ XRRSetCrtcConfig(priv->display, res, o->crtc, CurrentTime, 0, 0, 0, RR_Rotate_0, 0, 0);
+ XRRFreeOutputInfo(o);
+
+ i->current_settings.mode = 0;
+ i->current_settings.rotation = ROTATE_NORMAL;
+ i->current_settings.x = 0;
+ i->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);