X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fgraphics%2Fx11%2Fdisplay.cpp;h=949509ff52ac62b5a3e3c3a5df20b4c2e19fc1fb;hb=43d31e73c4b97a37017757232c4ef1db355fee3a;hp=ba8d2532d914494e31ca847abdb5052926c2b6df;hpb=a8a9191481151f049781b670ea8883025a594a5f;p=libs%2Fgui.git diff --git a/source/graphics/x11/display.cpp b/source/graphics/x11/display.cpp index ba8d253..949509f 100644 --- a/source/graphics/x11/display.cpp +++ b/source/graphics/x11/display.cpp @@ -165,7 +165,7 @@ Display::Display(const string &disp_name): for(int j=0; jnmode; ++j) { - map::iterator k = modes_by_id.find(output->modes[j]); + auto k = modes_by_id.find(output->modes[j]); if(k==modes_by_id.end()) continue; @@ -197,27 +197,27 @@ Display::Display(const string &disp_name): monitors.sort(monitor_x_compare); Monitor *prev_enabled = 0; - for(list::iterator i=monitors.begin(); i!=monitors.end(); ++i) - if(i->desktop_settings.mode) + for(Monitor &m: monitors) + if(m.desktop_settings.mode) { - i->next_left = prev_enabled; + m.next_left = prev_enabled; if(prev_enabled) - prev_enabled->next_right = &*i; - prev_enabled = &*i; + prev_enabled->next_right = &m; + prev_enabled = &m; } if(!primary_monitor || !primary_monitor->desktop_settings.mode) { // XRandR didn't give a sensible primary monitor. Try to guess one. unsigned largest = 0; - for(list::iterator i=monitors.begin(); i!=monitors.end(); ++i) - if(const VideoMode *desktop_mode = i->desktop_settings.mode) + for(Monitor &m: monitors) + if(const VideoMode *desktop_mode = m.desktop_settings.mode) { unsigned size = desktop_mode->width*desktop_mode->height; if(size>largest) { largest = size; - primary_monitor = &*i; + primary_monitor = &m; } } } @@ -273,85 +273,43 @@ void Display::set_mode(const VideoMode &requested_mode, bool exclusive) } } - int x = 0; - int y = 0; + /* 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(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::iterator i=monitors.begin(); i!=monitors.end(); ++i) - if(&*i!=mode->monitor) + for(Monitor &m: monitors) + if(&m!=mode->monitor) { - XRROutputInfo *o = XRRGetOutputInfo(priv->display, res, priv->monitors[i->index]); + 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, 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; + m.current_settings.mode = 0; + m.current_settings.rotation = ROTATE_NORMAL; + m.current_settings.x = 0; + m.current_settings.y = 0; } } else { - const Monitor *left = mode->monitor->next_left; - while(left && !left->current_settings.mode) - left = left->next_left; - - if(left) - { - const Monitor::Settings &cs = left->current_settings; - x = cs.x+mode_width(*cs.mode, cs.rotation); - y = cs.y; - } + monitor->current_settings.x = monitor->desktop_settings.x; + monitor->current_settings.y = monitor->desktop_settings.y; } - XRRSetCrtcConfig(priv->display, res, crtc, CurrentTime, x, y, priv->modes[mode->index], rotation_to_sys(requested_rotation), &output, 1); - - list::iterator i; - for(i=monitors.begin(); i!=monitors.end(); ++i) - if(&*i==mode->monitor) - { - i->current_settings.mode = mode; - i->current_settings.rotation = requested_rotation; - i->current_settings.x = x; - i->current_settings.y = y; - - x += mode_width(*mode, requested_rotation); - ++i; - break; - } - - for(; i!=monitors.end(); ++i) - if(i->current_settings.mode) - { - XRROutputInfo *o = XRRGetOutputInfo(priv->display, res, priv->monitors[i->index]); - XRRSetCrtcConfig(priv->display, res, o->crtc, CurrentTime, x, y, priv->modes[i->current_settings.mode->index], rotation_to_sys(i->current_settings.rotation), &priv->monitors[i->index], 1); - - XRRPanning panning; - panning.timestamp = CurrentTime; - panning.left = x; - panning.top = y; - panning.width = i->current_settings.mode->width; - panning.height = i->current_settings.mode->height; - panning.track_left = panning.left; - panning.track_top = panning.top; - panning.track_width = panning.width; - panning.track_height = panning.height; - panning.border_left = 0; - panning.border_top = 0; - panning.border_right = 0; - panning.border_bottom = 0; - XRRSetPanning(priv->display, res, o->crtc, &panning); - - XRRFreeOutputInfo(o); - - i->current_settings.x = x; - i->current_settings.y = y; - - x += mode_width(*i->current_settings.mode, i->current_settings.rotation); - } + 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); @@ -376,7 +334,7 @@ bool Display::process_events() check_error(); - map::iterator j = priv->windows.find(event.xevent.xany.window); + auto j = priv->windows.find(event.xevent.xany.window); if(j!=priv->windows.end()) { /* Filter keyboard autorepeat. If this packet is a KeyRelease and