X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2FScreen.cc;h=e0ef585f20b09d9013ba8fda65fd832a6f69eb04;hb=2dde696a1335ef61bb368c55f4ee52e1dd8610a1;hp=f4c3dcadbee13b1c2bc5237535b1f0ef38a54dc0;hpb=fb613db29ffcf1539c91f0ac0ca5d25cb4e593b5;p=chaz%2Fopenbox diff --git a/src/Screen.cc b/src/Screen.cc index f4c3dcad..e0ef585f 100644 --- a/src/Screen.cc +++ b/src/Screen.cc @@ -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) {