summaryrefslogtreecommitdiff
path: root/src/Screen.cc
diff options
context:
space:
mode:
authorDana Jansens <danakj@orodu.net>2002-07-16 08:00:59 +0000
committerDana Jansens <danakj@orodu.net>2002-07-16 08:00:59 +0000
commit2dde696a1335ef61bb368c55f4ee52e1dd8610a1 (patch)
treea4f0ec5415ed31221aa4eaca1c0c6f4de3fb476b /src/Screen.cc
parent41053a810aa701e4e39f124c725c5bbc20492059 (diff)
much awesome support for special windows like panels/desktops.
All 'non-normal' windows are treated equally now, with a fe wexceptionms for the desktop for stacking. Fix some ClicmMousePlacement bugs while we're at it.
Diffstat (limited to 'src/Screen.cc')
-rw-r--r--src/Screen.cc72
1 files changed, 32 insertions, 40 deletions
diff --git a/src/Screen.cc b/src/Screen.cc
index 4df5ea17..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]);
@@ -652,7 +649,7 @@ void BScreen::load_rc(void) {
else if (s == "UnderMousePlacement")
resource.placement_policy = UnderMousePlacement;
else if (s == "ClickMousePlacement")
- resource.placement_policy = UnderMousePlacement;
+ resource.placement_policy = ClickMousePlacement;
else if (s == "ColSmartPlacement")
resource.placement_policy = ColSmartPlacement;
else //if (s == "RowSmartPlacement")
@@ -1168,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);
}
@@ -1224,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);
@@ -2149,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) {