X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fgraphics%2Fx11%2Fdisplay.cpp;h=15c69a9c604495132718adb1d526408f4a209441;hb=5b06f17bd09b4aaaa295f167566ca52f70db5c27;hp=368b67cecdc5b6953db9e113664e16f30bed9889;hpb=0913ba6fdd0e28740e0b521f275b9ce82c4a1b7a;p=libs%2Fgui.git diff --git a/source/graphics/x11/display.cpp b/source/graphics/x11/display.cpp index 368b67c..15c69a9 100644 --- a/source/graphics/x11/display.cpp +++ b/source/graphics/x11/display.cpp @@ -38,6 +38,7 @@ int x_error_handler(Display *display, XErrorEvent *event) return 0; } +#ifdef WITH_XRANDR inline Msp::Graphics::VideoRotation rotation_from_sys(Rotation r) { switch(r) @@ -60,12 +61,13 @@ inline Rotation rotation_to_sys(Msp::Graphics::VideoRotation r) } } -bool monitor_x_compare(const Msp::Graphics::Monitor &m1, const Msp::Graphics::Monitor &m2) +inline bool monitor_x_compare(const Msp::Graphics::Monitor &m1, const Msp::Graphics::Monitor &m2) { if(m1.desktop_mode && !m2.desktop_mode) return true; return m1.xdotClock/(info->hTotal*info->vTotal); - if(find_matching_mode(mode)) + if(find_mode(mode)) continue; modes.push_back(mode); @@ -175,6 +179,22 @@ Display::Display(const string &disp_name): prev_enabled->next_right = &*i; prev_enabled = &*i; } + + if(!primary_monitor || !primary_monitor->desktop_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(i->desktop_mode) + { + unsigned size = i->desktop_mode->width*i->desktop_mode->height; + if(size>largest) + { + largest = size; + primary_monitor = &*i; + } + } + } } } #endif @@ -184,12 +204,13 @@ Display::~Display() { XCloseDisplay(priv->display); delete priv; + delete err_dialog; } void Display::set_mode(const VideoMode &requested_mode, bool exclusive) { #ifdef WITH_XRANDR - const VideoMode *mode = find_matching_mode(requested_mode); + const VideoMode *mode = find_mode(requested_mode); if(!mode) throw unsupported_video_mode(requested_mode); @@ -281,6 +302,23 @@ void Display::set_mode(const VideoMode &requested_mode, bool exclusive) { XRROutputInfo *o = XRRGetOutputInfo(priv->display, res, priv->monitors[i->index]); XRRSetCrtcConfig(priv->display, res, o->crtc, CurrentTime, x, y, priv->modes[i->current_mode->index], rotation_to_sys(i->current_rotation), &priv->monitors[i->index], 1); + + XRRPanning panning; + panning.timestamp = CurrentTime; + panning.left = x; + panning.top = y; + panning.width = i->current_mode->width; + panning.height = i->current_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->x = x;