]> git.tdb.fi Git - libs/gui.git/blobdiff - source/graphics/x11/display.cpp
Avoid compiler warning for a declared but unused function
[libs/gui.git] / source / graphics / x11 / display.cpp
index 368b67cecdc5b6953db9e113664e16f30bed9889..15c69a9c604495132718adb1d526408f4a209441 100644 (file)
@@ -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.x<m2.x;
 }
+#endif
 
 inline unsigned mode_width(const Msp::Graphics::VideoMode &m, Msp::Graphics::VideoRotation r)
 {
@@ -94,6 +96,8 @@ Display::Display(const string &disp_name):
 
        XSetErrorHandler(x_error_handler);
 
+       err_dialog = new ErrorDialog(this);
+
 #ifdef WITH_XRANDR
        int event_base;
        int error_base;
@@ -144,7 +148,7 @@ Display::Display(const string &disp_name):
                                        mode.index = modes.size();
                                        mode.monitor = &monitor;
                                        mode.rate = info->dotClock/(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<Monitor>::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;