]> Dogcows Code - chaz/openbox/blobdiff - src/Screen.cc
much awesome support for special windows like panels/desktops.
[chaz/openbox] / src / Screen.cc
index f4c3dcadbee13b1c2bc5237535b1f0ef38a54dc0..e0ef585f20b09d9013ba8fda65fd832a6f69eb04 100644 (file)
@@ -312,9 +312,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 +441,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;
   }
@@ -647,6 +646,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")
@@ -1162,49 +1165,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 +1205,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 +2142,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.028651 seconds and 4 git commands to generate.