X-Git-Url: https://git.brokenzipper.com/gitweb?a=blobdiff_plain;f=src%2FBaseDisplay.cc;h=aa2d974ee83b2ef17e0f2b356d9e26e3caefc3e4;hb=b29977196b527bb50b045cad249e9c149fa0ef75;hp=5c34a727133aa07733a26530ebabc8e770b2dcd7;hpb=23640740ca6659ee4effb9e5c040900e0bbdeb59;p=chaz%2Fopenbox diff --git a/src/BaseDisplay.cc b/src/BaseDisplay.cc index 5c34a727..aa2d974e 100644 --- a/src/BaseDisplay.cc +++ b/src/BaseDisplay.cc @@ -78,7 +78,7 @@ extern "C" { #endif // HAVE_SYS_WAIT_H } -#include +#include using std::string; #include "i18n.hh" @@ -411,43 +411,55 @@ ScreenInfo::ScreenInfo(BaseDisplay *d, unsigned int num) { screen_number = num; root_window = RootWindow(basedisplay->getXDisplay(), screen_number); - depth = DefaultDepth(basedisplay->getXDisplay(), screen_number); rect.setSize(WidthOfScreen(ScreenOfDisplay(basedisplay->getXDisplay(), screen_number)), HeightOfScreen(ScreenOfDisplay(basedisplay->getXDisplay(), screen_number))); + /* + If the default depth is at least 8 we will use that, + otherwise we try to find the largest TrueColor visual. + Preference is given to 24 bit over larger depths if 24 bit is an option. + */ - // search for a TrueColor Visual... if we can't find one... we will use the - // default visual for the screen - XVisualInfo vinfo_template, *vinfo_return; - int vinfo_nitems; - - vinfo_template.screen = screen_number; - vinfo_template.c_class = TrueColor; - - visual = (Visual *) 0; - - vinfo_return = XGetVisualInfo(basedisplay->getXDisplay(), - VisualScreenMask | VisualClassMask, - &vinfo_template, &vinfo_nitems); - if (vinfo_return && vinfo_nitems > 0) { - for (int i = 0; i < vinfo_nitems; i++) { - if (depth < (vinfo_return + i)->depth) { - depth = (vinfo_return + i)->depth; - visual = (vinfo_return + i)->visual; + depth = DefaultDepth(basedisplay->getXDisplay(), screen_number); + visual = DefaultVisual(basedisplay->getXDisplay(), screen_number); + colormap = DefaultColormap(basedisplay->getXDisplay(), screen_number); + + if (depth < 8) { + // search for a TrueColor Visual... if we can't find one... + // we will use the default visual for the screen + XVisualInfo vinfo_template, *vinfo_return; + int vinfo_nitems; + int best = -1; + + vinfo_template.screen = screen_number; + vinfo_template.c_class = TrueColor; + + vinfo_return = XGetVisualInfo(basedisplay->getXDisplay(), + VisualScreenMask | VisualClassMask, + &vinfo_template, &vinfo_nitems); + if (vinfo_return) { + int max_depth = 1; + for (int i = 0; i < vinfo_nitems; ++i) { + if (vinfo_return[i].depth > max_depth) { + if (max_depth == 24 && vinfo_return[i].depth > 24) + break; // prefer 24 bit over 32 + max_depth = vinfo_return[i].depth; + best = i; + } } + if (max_depth < depth) best = -1; } - XFree(vinfo_return); - } + if (best != -1) { + depth = vinfo_return[best].depth; + visual = vinfo_return[best].visual; + colormap = XCreateColormap(basedisplay->getXDisplay(), root_window, + visual, AllocNone); + } - if (visual) { - colormap = XCreateColormap(basedisplay->getXDisplay(), root_window, - visual, AllocNone); - } else { - visual = DefaultVisual(basedisplay->getXDisplay(), screen_number); - colormap = DefaultColormap(basedisplay->getXDisplay(), screen_number); + XFree(vinfo_return); } // get the default display string and strip the screen number @@ -456,7 +468,6 @@ ScreenInfo::ScreenInfo(BaseDisplay *d, unsigned int num) { if (pos != string::npos) default_string.resize(pos); - std::ostringstream formatter; - formatter << "DISPLAY=" << default_string << '.' << screen_number; - display_string = formatter.str(); + display_string = string("DISPLAY=") + default_string + '.' + + itostring(static_cast(screen_number)); }