]> Dogcows Code - chaz/openbox/blobdiff - src/Screen.cc
default all xinerama support options to off
[chaz/openbox] / src / Screen.cc
index e0ef585f20b09d9013ba8fda65fd832a6f69eb04..46b15b2238800c6bb007e42c6f824666eab61552 100644 (file)
 // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 // DEALINGS IN THE SOFTWARE.
 
+#ifdef    HAVE_CONFIG_H
 #include "../config.h"
+#endif // HAVE_CONFIG_H
 
 extern "C" {
 #include <X11/Xatom.h>
 #include <X11/keysym.h>
 
+#ifdef    XINERAMA
+#  include <X11/Xlib.h>
+#  include <X11/extensions/Xinerama.h>
+#endif // XINERAMA
+
 #ifdef HAVE_STDLIB_H
 #  include <stdlib.h>
 #endif // HAVE_STDLIB_H
@@ -83,6 +90,7 @@ using std::string;
 #include "Window.hh"
 #include "Workspace.hh"
 #include "Workspacemenu.hh"
+#include "Util.hh"
 #include "XAtom.hh"
 
 #ifndef   FONT_ELEMENT_SIZE
@@ -151,8 +159,7 @@ BScreen::BScreen(Blackbox *bb, unsigned int scrn) : ScreenInfo(bb, scrn) {
   XDefineCursor(blackbox->getXDisplay(), getRootWindow(),
                 blackbox->getSessionCursor());
 
-  // start off full screen, top left.
-  usableArea.setSize(getWidth(), getHeight());
+  updateAvailableArea();
 
   image_control =
     new BImageControl(blackbox, this, True, blackbox->getColorsPerChannel(),
@@ -523,6 +530,13 @@ void BScreen::savePlaceIgnoreMaximized(bool i) {
 }
 
 
+void BScreen::saveAllowScrollLock(bool a) {
+  resource.allow_scroll_lock = a;
+  config->setValue(screenstr + "disableBindingsWithScrollLock",
+                   resource.allow_scroll_lock);
+}
+
+
 void BScreen::save_rc(void) {
   saveSloppyFocus(resource.sloppy_focus);
   saveAutoRaise(resource.auto_raise);
@@ -549,6 +563,7 @@ void BScreen::save_rc(void) {
 #endif // HAVE_STRFTIME
   savePlaceIgnoreShaded(resource.ignore_shaded);
   savePlaceIgnoreMaximized(resource.ignore_maximized);
+  saveAllowScrollLock(resource.allow_scroll_lock);
 
   toolbar->save_rc();
   slit->save_rc();
@@ -613,8 +628,9 @@ void BScreen::load_rc(void) {
   else
     resource.col_direction = TopBottom;
 
-  XAtom::StringVect workspaceNames;
   if (config->getValue(screenstr + "workspaceNames", s)) {
+    XAtom::StringVect workspaceNames;
+
     string::const_iterator it = s.begin(), end = s.end();
     while(1) {
       string::const_iterator tmp = it;     // current string.begin()
@@ -624,9 +640,10 @@ void BScreen::load_rc(void) {
         break;
       ++it;
     }
+
+    xatom->setValue(getRootWindow(), XAtom::net_desktop_names, XAtom::utf8,
+                    workspaceNames);
   }
-  xatom->setValue(getRootWindow(), XAtom::net_desktop_names, XAtom::utf8,
-                  workspaceNames);
 
   resource.sloppy_focus = true;
   resource.auto_raise = false;
@@ -681,15 +698,44 @@ void BScreen::load_rc(void) {
   if (! config->getValue(screenstr + "placementIgnoreMaximized",
                          resource.ignore_maximized))
     resource.ignore_maximized = true;
+
+  if (! config->getValue(screenstr + "disableBindingsWithScrollLock",
+                         resource.allow_scroll_lock))
+    resource.allow_scroll_lock = false;
+}
+
+
+void BScreen::changeWorkspaceCount(unsigned int new_count) {
+  assert(new_count > 0);
+
+  if (new_count < workspacesList.size()) {
+    // shrink
+    for (unsigned int i = workspacesList.size(); i > new_count; --i)
+      removeLastWorkspace();
+    // removeLast already sets the current workspace to the 
+    // last available one.
+  } else if (new_count > workspacesList.size()) {
+    // grow
+    for(unsigned int i = workspacesList.size(); i < new_count; ++i)
+      addWorkspace();
+  }
 }
 
 
 void BScreen::reconfigure(void) {
+  // don't reconfigure while saving the initial rc file, it's a waste and it
+  // breaks somethings (workspace names)
+  if (blackbox->isStartup()) return;
+
   load_rc();
   toolbar->load_rc();
   slit->load_rc();
   LoadStyle();
 
+  // we need to do this explicitly, because just loading this value from the rc
+  // does nothing
+  changeWorkspaceCount(resource.workspaces);
+
   XGCValues gcv;
   gcv.foreground = WhitePixel(blackbox->getXDisplay(),
                               getScreenNumber());
@@ -2028,10 +2074,25 @@ const Rect& BScreen::availableArea(void) const {
 }
 
 
+#ifdef    XINERAMA
+RectList BScreen::allAvailableAreas(void) const {
+  assert(isXineramaActive());
+  assert(xineramaUsableArea.size() > 0);
+  return xineramaUsableArea;
+}
+#endif // XINERAMA
+
+
 void BScreen::updateAvailableArea(void) {
   Rect old_area = usableArea;
   usableArea = getRect(); // reset to full screen
 
+#ifdef    XINERAMA
+  // reset to the full areas
+  if (isXineramaActive())
+    xineramaUsableArea = getXineramaAreas();
+#endif // XINERAMA
+
   /* these values represent offsets from the screen edge
    * we look for the biggest offset on each edge and then apply them
    * all at once
@@ -2058,6 +2119,27 @@ void BScreen::updateAvailableArea(void) {
   usableArea.setSize(usableArea.width() - (current_left + current_right),
                      usableArea.height() - (current_top + current_bottom));
 
+#ifdef    XINERAMA
+  if (isXineramaActive()) {
+    // keep each of the ximerama-defined areas inside the strut
+    RectList::iterator xit, xend = xineramaUsableArea.end();
+    for (xit = xineramaUsableArea.begin(); xit != xend; ++xit) {
+      if (xit->x() < usableArea.x()) {
+        xit->setX(usableArea.x());
+        xit->setWidth(xit->width() - usableArea.x());
+      }
+      if (xit->y() < usableArea.y()) {
+        xit->setY(usableArea.y());
+        xit->setHeight(xit->height() - usableArea.y());
+      }
+      if (xit->x() + xit->width() > usableArea.width())
+        xit->setWidth(usableArea.width() - xit->x());
+      if (xit->y() + xit->height() > usableArea.height())
+        xit->setHeight(usableArea.height() - xit->y());
+    }
+  }
+#endif // XINERAMA
+
   if (old_area != usableArea) {
     BlackboxWindowList::iterator it = windowList.begin(),
       end = windowList.end();
This page took 0.023551 seconds and 4 git commands to generate.