-#include <iostream>
#include <X11/Xlib.h>
#ifdef WITH_XRANDR
#include <X11/extensions/Xrandr.h>
return 0;
}
+#ifdef WITH_XRANDR
inline Msp::Graphics::VideoRotation rotation_from_sys(Rotation r)
{
switch(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)
{
Display::Display(const string &disp_name):
primary_monitor(0),
- priv(new Private)
+ priv(new Private),
+ focus_window(0)
{
if(disp_name.empty())
priv->display = XOpenDisplay(0);
XSetErrorHandler(x_error_handler);
+ priv->root_window = DefaultRootWindow(priv->display);
+
err_dialog = new ErrorDialog(this);
#ifdef WITH_XRANDR
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);
+ XRRScreenResources *res = XRRGetScreenResources(priv->display, priv->root_window);
+ RROutput primary = XRRGetOutputPrimary(priv->display, priv->root_window);
map<RRMode, XRRModeInfo *> modes_by_id;
for(int i=0; i<res->nmode; ++i)
monitors.push_back(Monitor());
Monitor &monitor = monitors.back();
monitor.index = monitors.size()-1;
+ monitor.name.assign(output->name, output->nameLen);
priv->monitors.push_back(res->outputs[i]);
if(crtc)
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))
+ mode.rate = static_cast<float>(info->dotClock)/(info->hTotal*info->vTotal);
+ if(find_mode(mode, 0.01f))
continue;
modes.push_back(mode);
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);
if(requested_rotation==ROTATE_ANY)
requested_rotation = mode->monitor->desktop_rotation;
- WindowHandle root = DefaultRootWindow(priv->display);
- XRRScreenResources *res = XRRGetScreenResources(priv->display, root);
+ XRRScreenResources *res = XRRGetScreenResources(priv->display, priv->root_window);
RROutput output = priv->monitors[mode->monitor->index];
XRROutputInfo *output_info = XRRGetOutputInfo(priv->display, res, output);
{
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;