]> Dogcows Code - chaz/openbox/blobdiff - src/Screen.cc
add next/prev window on all workspaces
[chaz/openbox] / src / Screen.cc
index f4c3dcadbee13b1c2bc5237535b1f0ef38a54dc0..ab7003ad2e6f556d928fdebf4102849ad75bc273 100644 (file)
@@ -21,7 +21,9 @@
 // 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>
@@ -312,9 +314,6 @@ BScreen::~BScreen(void) {
 
   std::for_each(netizenList.begin(), netizenList.end(), PointerAssassin());
 
-  while (! desktopWindowList.empty())
-    removeDesktopWindow(desktopWindowList[0]);
-
   while (! systrayWindowList.empty())
     removeSystrayWindow(systrayWindowList[0]);
 
@@ -444,6 +443,8 @@ void BScreen::savePlacementPolicy(int p) {
   const char *placement;
   switch (resource.placement_policy) {
   case CascadePlacement: placement = "CascadePlacement"; break;
+  case UnderMousePlacement: placement = "UnderMousePlacement"; break;
+  case ClickMousePlacement: placement = "ClickMousePlacement"; break;
   case ColSmartPlacement: placement = "ColSmartPlacement"; break;
   case RowSmartPlacement: default: placement = "RowSmartPlacement"; break;
   }
@@ -614,8 +615,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()
@@ -625,9 +627,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;
@@ -647,6 +650,10 @@ void BScreen::load_rc(void) {
   if (config->getValue(screenstr + "windowPlacement", s)) {
     if (s == "CascadePlacement")
       resource.placement_policy = CascadePlacement;
+    else if (s == "UnderMousePlacement")
+      resource.placement_policy = UnderMousePlacement;
+    else if (s == "ClickMousePlacement")
+      resource.placement_policy = ClickMousePlacement;
     else if (s == "ColSmartPlacement")
       resource.placement_policy = ColSmartPlacement;
     else //if (s == "RowSmartPlacement")
@@ -681,12 +688,37 @@ void BScreen::load_rc(void) {
 }
 
 
+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());
@@ -1162,49 +1194,33 @@ void BScreen::removeSystrayWindow(Window window) {
 }
 
 
-void BScreen::addDesktopWindow(Window window) {
-  desktopWindowList.push_back(window);
-  XLowerWindow(blackbox->getXDisplay(), window);
-  XSelectInput(blackbox->getXDisplay(), window, StructureNotifyMask);
-  blackbox->saveDesktopWindowSearch(window, this);
-}
-
-
-void BScreen::removeDesktopWindow(Window window) {
-  WindowList::iterator it = desktopWindowList.begin();
-  const WindowList::iterator end = desktopWindowList.end();
-  for (; it != end; ++it)
-    if (*it == window) {
-      desktopWindowList.erase(it);
-      XSelectInput(blackbox->getXDisplay(), window, None);
-      blackbox->removeDesktopWindowSearch(window);
-      break;
-    }
-}
-
-
 void BScreen::manageWindow(Window w) {
+  // is the window a KDE systray window?
+  Window systray;
+  if (xatom->getValue(w, XAtom::kde_net_wm_system_tray_window_for,
+                      XAtom::window, systray) && systray) {
+    addSystrayWindow(w);
+    return;
+  }
+
   new BlackboxWindow(blackbox, w, this);
 
   BlackboxWindow *win = blackbox->searchWindow(w);
   if (! win)
     return;
-  if (win->windowType() == BlackboxWindow::Type_Desktop) {
-    // desktop windows cant do anything, so we remove all the normal window
-    // stuff from them, they are only kept around so that we can keep them on
-    // the bottom of the z-order
-    win->restore(True);
-    addDesktopWindow(win->getClientWindow());
-    delete win;
-    return;
-  }
 
-  windowList.push_back(win);
-  updateClientList();
+
+  if (win->isNormal()) {
+    // don't list non-normal windows as managed windows
+    windowList.push_back(win);
+    updateClientList();
+  } else if (win->isDesktop()) {
+    desktopWindowList.push_back(win->getFrameWindow());
+  }
 
   XMapRequestEvent mre;
   mre.window = w;
-  if (blackbox->isStartup()) win->restoreAttributes();
+  if (blackbox->isStartup() && win->isNormal()) win->restoreAttributes();
   win->mapRequestEvent(&mre);
 }
 
@@ -1218,8 +1234,20 @@ void BScreen::unmanageWindow(BlackboxWindow *w, bool remap) {
   else if (w->isIconic())
     removeIcon(w);
 
-  windowList.remove(w);
-  updateClientList();
+  if (w->isNormal()) {
+    // we don't list non-normal windows as managed windows
+    windowList.remove(w);
+    updateClientList();
+  } else if (w->isDesktop()) {
+    WindowList::iterator it = desktopWindowList.begin();
+    const WindowList::iterator end = desktopWindowList.end();
+    for (; it != end; ++it)
+      if (*it == w->getFrameWindow()) {
+        desktopWindowList.erase(it);
+        break;
+      }
+    assert(it != end);  // the window wasnt a desktop window?
+  }
 
   if (blackbox->getFocusedWindow() == w)
     blackbox->setFocusedWindow((BlackboxWindow *) 0);
@@ -2143,7 +2171,6 @@ void BScreen::buttonPressEvent(const XButtonEvent *xbutton) {
 void BScreen::propertyNotifyEvent(const XPropertyEvent *pe) {
   if (pe->atom == xatom->getAtom(XAtom::net_desktop_names)) {
     // _NET_WM_DESKTOP_NAMES
-    fprintf(stderr, "UPDATING WORKSPACE NAMES\n");
     WorkspaceList::iterator it = workspacesList.begin();
     const WorkspaceList::iterator end = workspacesList.end();
     for (; it != end; ++it) {
This page took 0.024226 seconds and 4 git commands to generate.