X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fgraphics%2Fx11%2Fdisplay.cpp;h=a48f3f874f1a3600da402f9fd88a1138b7f80c89;hb=91d461ab8ef19ba49423dbbbe9b467ffdf0d1584;hp=24bb53f479657cf78dfded9e4b4b1b43217e6fea;hpb=eb1a0ac27179962b8719a729c483549a9cca971a;p=libs%2Fgui.git diff --git a/source/graphics/x11/display.cpp b/source/graphics/x11/display.cpp index 24bb53f..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); @@ -111,6 +112,7 @@ Display::Display(const string &disp_name): { 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) @@ -127,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);