summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/Screen.cc21
-rw-r--r--src/Screen.hh2
-rw-r--r--src/Window.cc17
-rw-r--r--src/Window.hh5
-rw-r--r--src/Workspace.cc2
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<Window> 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);