+ int major, minor;
+ XRRQueryVersion(priv->display, &major, &minor);
+ if(major>1 || (major==1 && minor>=2))
+ {
+ WindowHandle root = DefaultRootWindow(priv->display);
+ XRRScreenResources *res = XRRGetScreenResources(priv->display, root);
+ RROutput primary = XRRGetOutputPrimary(priv->display, root);
+
+ map<RRMode, XRRModeInfo *> modes_by_id;
+ for(int i=0; i<res->nmode; ++i)
+ modes_by_id[res->modes[i].id] = &res->modes[i];
+
+ for(int i=0; i<res->noutput; ++i)
+ {
+ XRROutputInfo *output = XRRGetOutputInfo(priv->display, res, res->outputs[i]);
+ XRRCrtcInfo *crtc = (output->crtc ? XRRGetCrtcInfo(priv->display, res, output->crtc) : 0);
+
+ monitors.push_back(Monitor());
+ Monitor &monitor = monitors.back();
+ monitor.index = monitors.size()-1;
+ priv->monitors.push_back(res->outputs[i]);
+
+ if(crtc)
+ {
+ monitor.desktop_rotation = rotation_from_sys(crtc->rotation);
+ monitor.current_rotation = monitor.desktop_rotation;
+ monitor.x = crtc->x;
+ monitor.y = crtc->y;
+ }
+
+ if(res->outputs[i]==primary)
+ primary_monitor = &monitor;
+
+ for(int j=0; j<output->nmode; ++j)
+ {
+ map<RRMode, XRRModeInfo *>::iterator k = modes_by_id.find(output->modes[j]);
+ if(k==modes_by_id.end())
+ continue;
+
+ XRRModeInfo *info = k->second;
+
+ VideoMode mode(info->width, info->height);
+ mode.index = modes.size();
+ mode.monitor = &monitor;
+ mode.rate = info->dotClock/(info->hTotal*info->vTotal);
+ if(find_matching_mode(mode))
+ continue;
+
+ modes.push_back(mode);
+ priv->modes.push_back(info->id);
+ monitor.video_modes.push_back(&modes.back());
+
+ if(crtc && info->id==crtc->mode)
+ {
+ monitor.desktop_mode = &modes.back();
+ monitor.current_mode = monitor.desktop_mode;
+ }
+ }
+
+ XRRFreeOutputInfo(output);
+ if(crtc)
+ XRRFreeCrtcInfo(crtc);
+ }