X-Git-Url: https://git.brokenzipper.com/gitweb?a=blobdiff_plain;f=src%2FScreen.cc;h=0186e97bf26384db990cec7a7d2ed49500674dce;hb=c6a826bf663d3cb286025642f5e2a725b5d1c660;hp=1b3860f46166ea02062e74f5ad86b4db340863e4;hpb=0c04fb5260a535d8457febca9bf05669a85b1c12;p=chaz%2Fopenbox diff --git a/src/Screen.cc b/src/Screen.cc index 1b3860f4..0186e97b 100644 --- a/src/Screen.cc +++ b/src/Screen.cc @@ -310,6 +310,12 @@ BScreen::~BScreen(void) { std::for_each(netizenList.begin(), netizenList.end(), PointerAssassin()); + while (! desktopWindowList.empty()) + removeDesktopWindow(desktopWindowList[0]); + + while (! systrayWindowList.empty()) + removeSystrayWindow(systrayWindowList[0]); + delete rootmenu; delete workspacemenu; delete iconmenu; @@ -1015,41 +1021,38 @@ unsigned int BScreen::removeLastWorkspace(void) { void BScreen::changeWorkspaceID(unsigned int id) { - if (! current_workspace) return; - - if (id != current_workspace->getID()) { - BlackboxWindow *focused = blackbox->getFocusedWindow(); - if (focused && focused->getScreen() == this && ! focused->isStuck()) { - if (focused->getWorkspaceNumber() != current_workspace->getID()) { - fprintf(stderr, "%s is on the wrong workspace, aborting\n", - focused->getTitle()); - abort(); - } - current_workspace->setLastFocusedWindow(focused); - } else { - // if no window had focus, no need to store a last focus - current_workspace->setLastFocusedWindow((BlackboxWindow *) 0); - } - // when we switch workspaces, unfocus whatever was focused - blackbox->setFocusedWindow((BlackboxWindow *) 0); + if (! current_workspace || id == current_workspace->getID()) return; + + BlackboxWindow *focused = blackbox->getFocusedWindow(); + if (focused && focused->getScreen() == this) { + assert(focused->isStuck() || + focused->getWorkspaceNumber() == current_workspace->getID()); + + current_workspace->setLastFocusedWindow(focused); + } else { + // if no window had focus, no need to store a last focus + current_workspace->setLastFocusedWindow((BlackboxWindow *) 0); + } + + // when we switch workspaces, unfocus whatever was focused + blackbox->setFocusedWindow((BlackboxWindow *) 0); - current_workspace->hideAll(); - workspacemenu->setItemSelected(current_workspace->getID() + 2, False); + current_workspace->hideAll(); + workspacemenu->setItemSelected(current_workspace->getID() + 2, False); - current_workspace = getWorkspace(id); + current_workspace = getWorkspace(id); - xatom->setValue(getRootWindow(), XAtom::net_current_desktop, - XAtom::cardinal, id); + xatom->setValue(getRootWindow(), XAtom::net_current_desktop, + XAtom::cardinal, id); - workspacemenu->setItemSelected(current_workspace->getID() + 2, True); - toolbar->redrawWorkspaceLabel(True); + workspacemenu->setItemSelected(current_workspace->getID() + 2, True); + toolbar->redrawWorkspaceLabel(True); - current_workspace->showAll(); + current_workspace->showAll(); - if (resource.focus_last && current_workspace->getLastFocusedWindow()) { - XSync(blackbox->getXDisplay(), False); - current_workspace->getLastFocusedWindow()->setInputFocus(); - } + if (resource.focus_last && current_workspace->getLastFocusedWindow()) { + XSync(blackbox->getXDisplay(), False); + current_workspace->getLastFocusedWindow()->setInputFocus(); } updateNetizenCurrentWorkspace(); @@ -1377,13 +1380,27 @@ void BScreen::raiseWindows(Window *workspace_stack, unsigned int num) { } -void BScreen::lowerDesktops(void) { - if (desktopWindowList.empty()) return; +void BScreen::lowerWindows(Window *workspace_stack, unsigned int num) { + assert(num > 0); // this would cause trouble in the XRaiseWindow call + + Window *session_stack = new Window[(num + desktopWindowList.size())]; + unsigned int i = 0, k = num; + + XLowerWindow(blackbox->getXDisplay(), workspace_stack[0]); + + while (k--) + *(session_stack + i++) = *(workspace_stack + k); - XLowerWindow(blackbox->getXDisplay(), desktopWindowList[0]); - if (desktopWindowList.size() > 1) - XRestackWindows(blackbox->getXDisplay(), &desktopWindowList[0], - desktopWindowList.size()); + WindowList::iterator dit = desktopWindowList.begin(); + const WindowList::iterator d_end = desktopWindowList.end(); + for (; dit != d_end; ++dit) + *(session_stack + i++) = *dit; + + XRestackWindows(blackbox->getXDisplay(), session_stack, i); + + delete [] session_stack; + + updateStackingList(); }