From bc3268b6f9f86e6aebe0d06ce174b2d603d09c1e Mon Sep 17 00:00:00 2001 From: Dana Jansens Date: Fri, 9 Aug 2002 00:44:35 +0000 Subject: [PATCH] handle toolbars and utility windows proper. also, no more crashes from kpager (i really hope :P), at least not the same way --- src/Screen.cc | 21 ++++++++++++++++++++- src/Screen.hh | 2 +- src/Window.cc | 17 +++++++++++++---- src/Window.hh | 5 ++++- src/Workspace.cc | 2 +- 5 files changed, 39 insertions(+), 8 deletions(-) diff --git a/src/Screen.cc b/src/Screen.cc index 3d51a2d2..d49e418a 100644 --- a/src/Screen.cc +++ b/src/Screen.cc @@ -1313,6 +1313,9 @@ void BScreen::manageWindow(Window w) { // don't list non-normal windows as managed windows windowList.push_back(win); updateClientList(); + + if (win->isTopmost()) + specialWindowList.push_back(win->getFrameWindow()); } else if (win->isDesktop()) { desktopWindowList.push_back(win->getFrameWindow()); } @@ -1345,6 +1348,17 @@ void BScreen::unmanageWindow(BlackboxWindow *w, bool remap) { // we don't list non-normal windows as managed windows windowList.remove(w); updateClientList(); + + if (w->isTopmost()) { + WindowList::iterator it = specialWindowList.begin(); + const WindowList::iterator end = specialWindowList.end(); + for (; it != end; ++it) + if (*it == w->getFrameWindow()) { + specialWindowList.erase(it); + break; + } + assert(it != end); // the window wasnt a special window? + } } else if (w->isDesktop()) { WindowList::iterator it = desktopWindowList.begin(); const WindowList::iterator end = desktopWindowList.end(); @@ -1495,7 +1509,8 @@ void BScreen::raiseWindows(Window *workspace_stack, unsigned int num) { #endif // XINERAMA Window *session_stack = new - Window[(num + workspacesList.size() + rootmenuList.size() + bbwins)]; + Window[(num + workspacesList.size() + rootmenuList.size() + + specialWindowList.size() + bbwins)]; unsigned int i = 0, k = num; XRaiseWindow(blackbox->getXDisplay(), iconmenu->getWindowID()); @@ -1536,6 +1551,10 @@ void BScreen::raiseWindows(Window *workspace_stack, unsigned int num) { if (slit->isOnTop()) *(session_stack + i++) = slit->getWindowID(); + WindowList::iterator sit, send = specialWindowList.end(); + for (sit = specialWindowList.begin(); sit != send; ++sit) + *(session_stack + i++) = *sit; + while (k--) *(session_stack + i++) = *(workspace_stack + k); diff --git a/src/Screen.hh b/src/Screen.hh index 71a012dd..4b454e02 100644 --- a/src/Screen.hh +++ b/src/Screen.hh @@ -120,7 +120,7 @@ private: BlackboxWindowList iconList, windowList; typedef std::vector WindowList; - WindowList desktopWindowList, systrayWindowList; + WindowList specialWindowList, desktopWindowList, systrayWindowList; Slit *slit; Toolbar *toolbar; diff --git a/src/Window.cc b/src/Window.cc index fae990b6..243bfa48 100644 --- a/src/Window.cc +++ b/src/Window.cc @@ -202,14 +202,20 @@ BlackboxWindow::BlackboxWindow(Blackbox *b, Window w, BScreen *s) { case Type_Desktop: case Type_Dock: case Type_Menu: - case Type_Toolbar: - case Type_Utility: + blackbox_attrib.workspace = 0; // we do need to belong to a workspace + flags.stuck = True; // we show up on all workspaces case Type_Splash: // none of these windows are decorated or manipulated by the window manager decorations = 0; functions = 0; - blackbox_attrib.workspace = 0; // we do need to belong to a workspace - flags.stuck = True; // we show up on all workspaces + break; + + case Type_Toolbar: + case Type_Utility: + // these windows get less decorations and functionality + decorations &= ~(Decor_Maximize | Decor_Handle | Decor_Iconify | + Decor_Border); + functions &= ~(Func_Maximize | Func_Resize | Func_Iconify); break; case Type_Dialog: @@ -349,6 +355,9 @@ BlackboxWindow::~BlackboxWindow(void) { if (! timer) // window not managed... return; + if (flags.moving) + endMove(); + screen->removeStrut(&client.strut); screen->updateAvailableArea(); diff --git a/src/Window.hh b/src/Window.hh index 105aef16..8143ade1 100644 --- a/src/Window.hh +++ b/src/Window.hh @@ -325,7 +325,10 @@ public: // is a 'normal' window? meaning, a standard client application inline bool isNormal(void) const - { return window_type == Type_Dialog || window_type == Type_Normal; } + { return window_type == Type_Dialog || window_type == Type_Normal || + window_type == Type_Toolbar || window_type == Type_Utility; } + inline bool isTopmost(void) const + { return window_type == Type_Toolbar || window_type == Type_Utility; } inline bool isDesktop(void) const { return window_type == Type_Desktop; } inline bool hasTitlebar(void) const { return decorations & Decor_Titlebar; } diff --git a/src/Workspace.cc b/src/Workspace.cc index 7e05e4c9..b03ee7b2 100644 --- a/src/Workspace.cc +++ b/src/Workspace.cc @@ -84,7 +84,7 @@ void Workspace::addWindow(BlackboxWindow *w, bool place, bool sticky) { if (place) placeWindow(w); stackingList.push_front(w); - + if (w->isNormal()) { if (! sticky) { w->setWorkspace(id); -- 2.39.2