]> Dogcows Code - chaz/openbox/blobdiff - src/Screen.cc
add comment
[chaz/openbox] / src / Screen.cc
index f1ba429c25048d4b098e1a61e2a2d8b644f5b0aa..6970fdf68111095befb48096e916cf5eadeafc67 100644 (file)
@@ -29,6 +29,11 @@ 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
@@ -154,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(),
@@ -208,7 +212,7 @@ BScreen::BScreen(Blackbox *bb, unsigned int scrn) : ScreenInfo(bb, scrn) {
   iconmenu = new Iconmenu(this);
   configmenu = new Configmenu(this);
 
-  if (resource.workspaces != 0) {
+  if (resource.workspaces > 0) {
     for (unsigned int i = 0; i < resource.workspaces; ++i) {
       Workspace *wkspc = new Workspace(this, workspacesList.size());
       workspacesList.push_back(wkspc);
@@ -526,6 +530,20 @@ 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::saveWorkspaceWarping(bool w) {
+  resource.workspace_warping = w;
+  config->setValue(screenstr + "workspaceWarping",
+                   resource.workspace_warping);
+}
+
+
 void BScreen::save_rc(void) {
   saveSloppyFocus(resource.sloppy_focus);
   saveAutoRaise(resource.auto_raise);
@@ -552,6 +570,8 @@ void BScreen::save_rc(void) {
 #endif // HAVE_STRFTIME
   savePlaceIgnoreShaded(resource.ignore_shaded);
   savePlaceIgnoreMaximized(resource.ignore_maximized);
+  saveAllowScrollLock(resource.allow_scroll_lock);
+  saveWorkspaceWarping(resource.workspace_warping);
 
   toolbar->save_rc();
   slit->save_rc();
@@ -686,6 +706,14 @@ 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;
+
+  if (! config->getValue(screenstr + "workspaceWarping",
+                         resource.workspace_warping))
+    resource.workspace_warping = false;
 }
 
 
@@ -1229,12 +1257,6 @@ void BScreen::manageWindow(Window w) {
 void BScreen::unmanageWindow(BlackboxWindow *w, bool remap) {
   w->restore(remap);
 
-  if (w->getWorkspaceNumber() != BSENTINEL &&
-      w->getWindowNumber() != BSENTINEL)
-    getWorkspace(w->getWorkspaceNumber())->removeWindow(w);
-  else if (w->isIconic())
-    removeIcon(w);
-
   if (w->isNormal()) {
     // we don't list non-normal windows as managed windows
     windowList.remove(w);
@@ -1250,9 +1272,6 @@ void BScreen::unmanageWindow(BlackboxWindow *w, bool remap) {
     assert(it != end);  // the window wasnt a desktop window?
   }
 
-  if (blackbox->getFocusedWindow() == w)
-    blackbox->setFocusedWindow((BlackboxWindow *) 0);
-
   removeNetizen(w->getClientWindow());
 
   /*
@@ -1383,8 +1402,13 @@ void BScreen::updateNetizenConfigNotify(XEvent *e) {
 
 void BScreen::raiseWindows(Window *workspace_stack, unsigned int num) {
   // the 13 represents the number of blackbox windows such as menus
+  int bbwins = 13;
+#ifdef    XINERAMA
+  ++bbwins;
+#endif // XINERAMA
+
   Window *session_stack = new
-    Window[(num + workspacesList.size() + rootmenuList.size() + 13)];
+    Window[(num + workspacesList.size() + rootmenuList.size() + bbwins)];
   unsigned int i = 0, k = num;
 
   XRaiseWindow(blackbox->getXDisplay(), iconmenu->getWindowID());
@@ -1399,6 +1423,9 @@ void BScreen::raiseWindows(Window *workspace_stack, unsigned int num) {
 
   *(session_stack + i++) = configmenu->getFocusmenu()->getWindowID();
   *(session_stack + i++) = configmenu->getPlacementmenu()->getWindowID();
+#ifdef    XINERAMA
+  *(session_stack + i++) = configmenu->getXineramamenu()->getWindowID();
+#endif // XINERAMA
   *(session_stack + i++) = configmenu->getWindowID();
 
   *(session_stack + i++) = slit->getMenu()->getDirectionmenu()->getWindowID();
@@ -2058,10 +2085,28 @@ const Rect& BScreen::availableArea(void) const {
 }
 
 
+#ifdef    XINERAMA
+const RectList& BScreen::allAvailableAreas(void) const {
+  assert(isXineramaActive());
+  assert(xineramaUsableArea.size() > 0);
+  fprintf(stderr, "1found x %d y %d w %d h %d\n",
+          xineramaUsableArea[0].x(), xineramaUsableArea[0].y(),
+          xineramaUsableArea[0].width(), xineramaUsableArea[0].height());
+  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
@@ -2088,6 +2133,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.023676 seconds and 4 git commands to generate.