X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fgraphics%2Fx11%2Fdisplay.cpp;h=a48f3f874f1a3600da402f9fd88a1138b7f80c89;hb=91d461ab8ef19ba49423dbbbe9b467ffdf0d1584;hp=8f022f7957a8af1c5df81d5844fe7e7683d2a7d9;hpb=85609ce268bdd6a91cd26e0bda7460862d3f38d7;p=libs%2Fgui.git diff --git a/source/graphics/x11/display.cpp b/source/graphics/x11/display.cpp index 8f022f7..a48f3f8 100644 --- a/source/graphics/x11/display.cpp +++ b/source/graphics/x11/display.cpp @@ -1,5 +1,5 @@ -#include #include +#include #ifdef WITH_XRANDR #include #endif @@ -85,7 +85,8 @@ namespace Graphics { 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); @@ -96,6 +97,8 @@ Display::Display(const string &disp_name): XSetErrorHandler(x_error_handler); + priv->root_window = DefaultRootWindow(priv->display); + err_dialog = new ErrorDialog(this); #ifdef WITH_XRANDR @@ -107,9 +110,9 @@ Display::Display(const string &disp_name): 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); + Atom edid_prop = XInternAtom(priv->display, RR_PROPERTY_RANDR_EDID, true); map modes_by_id; for(int i=0; inmode; ++i) @@ -126,6 +129,30 @@ Display::Display(const string &disp_name): monitor.name.assign(output->name, output->nameLen); priv->monitors.push_back(res->outputs[i]); + if(edid_prop) + { + Atom prop_type; + int prop_format; + unsigned long length; + unsigned long overflow; + unsigned char *edid = 0; + XRRGetOutputProperty(priv->display, res->outputs[i], edid_prop, 0, 32, false, false, XA_INTEGER, &prop_type, &prop_format, &length, &overflow, &edid); + if(prop_type==XA_INTEGER && prop_format==8) + { + for(unsigned j=0; j<4; ++j) + { + unsigned offset = 54+j*18; + if(edid[offset]==0 && edid[offset+1]==0 && edid[offset+3]==0xFC) + { + unsigned k; + for(k=0; (k<13 && edid[offset+5+k]!=0x0A); ++k) ; + monitor.name.assign(reinterpret_cast(edid+offset+5), k); + } + } + } + XFree(edid); + } + if(crtc) { monitor.desktop_rotation = rotation_from_sys(crtc->rotation); @@ -219,8 +246,7 @@ void Display::set_mode(const VideoMode &requested_mode, bool exclusive) 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);