]> Dogcows Code - chaz/openbox/blobdiff - src/BaseDisplay.cc
acquire and provide Xinerama information for the window manager. now we just gotta...
[chaz/openbox] / src / BaseDisplay.cc
index 6bf290e26cb1102865a32b064b4747ae3c84f6c7..8f3b39b17e827c1ebdaa753429d0e36639647473 100644 (file)
@@ -35,6 +35,10 @@ extern "C" {
 #  include <X11/extensions/shape.h>
 #endif // SHAPE
 
+#ifdef    XINERAMA
+#  include <X11/extensions/Xinerama.h>
+#endif // XINERAMA
+
 #ifdef    HAVE_FCNTL_H
 #  include <fcntl.h>
 #endif // HAVE_FCNTL_H
@@ -232,6 +236,22 @@ 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)) {
+#ifdef    DEBUG
+      fprintf(stderr,
+              "BaseDisplay::BaseDisplay: Found Xinerama version %d.%d\n",
+              xinerama.major, xinerama.minor);
+#endif // DEBUG
+      xinerama.extensions = True;
+    }
+  }
+#endif // XINERAMA
+
   XSetErrorHandler((XErrorHandler) handleXErrors);
 
   screenInfoList.reserve(ScreenCount(display));
@@ -462,4 +482,34 @@ ScreenInfo::ScreenInfo(BaseDisplay *d, unsigned int num) {
 
   display_string = string("DISPLAY=") + default_string + '.' +
     itostring(static_cast<unsigned long>(screen_number));
+  
+#ifdef    XINERAMA
+  if (d->hasXineramaExtensions()) {
+    if (d->getXineramaMajorVersion() == 1) {
+      // we know the version 1(.1?) protocol
+
+      /*
+         in this version of Xinerama, we can't query on a per-screen basis, but
+         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));
+        }
+        XFree(info);
+      }
+    }
+  }
+#endif // XINERAMA
 }
This page took 0.024432 seconds and 4 git commands to generate.