X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2FBaseDisplay.cc;h=51d79399c41ca6ba18d1fb14238f5551e02f55ef;hb=fa3fb793e7e8a4d7dfdc1d4997983ea59a8b6924;hp=8f3b39b17e827c1ebdaa753429d0e36639647473;hpb=bcb14a3ce94ee4b4cba07de7a297470719390331;p=chaz%2Fopenbox diff --git a/src/BaseDisplay.cc b/src/BaseDisplay.cc index 8f3b39b1..51d79399 100644 --- a/src/BaseDisplay.cc +++ b/src/BaseDisplay.cc @@ -236,19 +236,18 @@ BaseDisplay::BaseDisplay(const char *app_name, const char *dpy_name) { shape.extensions = False; #endif // SHAPE - xinerama.extensions = False; #ifdef XINERAMA if (XineramaQueryExtension(display, &xinerama.event_basep, - &xinerama.error_basep)) { - if (XineramaQueryVersion(display, &xinerama.major, - &xinerama.minor)) { + &xinerama.error_basep) && + XineramaQueryVersion(display, &xinerama.major, &xinerama.minor)) { #ifdef DEBUG - fprintf(stderr, - "BaseDisplay::BaseDisplay: Found Xinerama version %d.%d\n", - xinerama.major, xinerama.minor); + fprintf(stderr, + "BaseDisplay::BaseDisplay: Found Xinerama version %d.%d\n", + xinerama.major, xinerama.minor); #endif // DEBUG - xinerama.extensions = True; - } + xinerama.extensions = True; + } else { + xinerama.extensions = False; } #endif // XINERAMA @@ -412,7 +411,7 @@ const ScreenInfo* BaseDisplay::getScreenInfo(unsigned int s) const { BGCCache* BaseDisplay::gcCache(void) const { if (! gccache) - gccache = new BGCCache(this); + gccache = new BGCCache(this, screenInfoList.size()); return gccache; } @@ -484,6 +483,8 @@ ScreenInfo::ScreenInfo(BaseDisplay *d, unsigned int num) { itostring(static_cast(screen_number)); #ifdef XINERAMA + xinerama_active = False; + if (d->hasXineramaExtensions()) { if (d->getXineramaMajorVersion() == 1) { // we know the version 1(.1?) protocol @@ -493,21 +494,27 @@ ScreenInfo::ScreenInfo(BaseDisplay *d, unsigned int num) { in future versions we should be able, so the 'activeness' is checked on a pre-screen basis anyways. */ - xinerama_active = XineramaIsActive(d->getXDisplay()); - /* - If Xinerama is being used, there there is only going to be one screen - present. We still, of course, want to use the screen class, but that is - why no screen number is used in this function call. There should never - be more than one screen present with Xinerama active. - */ - int num; - XineramaScreenInfo *info = XineramaQueryScreens(d->getXDisplay(), &num); - if (num > 0 && info) { - for (int i = 0; i < num; ++i) { - xinerama_areas.push_back(Rect(info[i].x_org, info[i].y_org, - info[i].width, info[i].height)); + if (XineramaIsActive(d->getXDisplay())) { + /* + If Xinerama is being used, there there is only going to be one screen + present. We still, of course, want to use the screen class, but that + is why no screen number is used in this function call. There should + never be more than one screen present with Xinerama active. + */ + int num; + XineramaScreenInfo *info = XineramaQueryScreens(d->getXDisplay(), &num); + if (num > 0 && info) { + xinerama_areas.reserve(num); + for (int i = 0; i < num; ++i) { + xinerama_areas.push_back(Rect(info[i].x_org, info[i].y_org, + info[i].width, info[i].height)); + } + XFree(info); + + // if we can't find any xinerama regions, then we act as if it is not + // active, even though it said it was + xinerama_active = True; } - XFree(info); } } }