// 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());
}
// 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();
#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());
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);
BlackboxWindowList iconList, windowList;
typedef std::vector<Window> WindowList;
- WindowList desktopWindowList, systrayWindowList;
+ WindowList specialWindowList, desktopWindowList, systrayWindowList;
Slit *slit;
Toolbar *toolbar;
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:
if (! timer) // window not managed...
return;
+ if (flags.moving)
+ endMove();
+
screen->removeStrut(&client.strut);
screen->updateAvailableArea();
// 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; }
if (place) placeWindow(w);
stackingList.push_front(w);
-
+
if (w->isNormal()) {
if (! sticky) {
w->setWorkspace(id);