From 3312a209d7882a32253d715ee24bcaa717af75c2 Mon Sep 17 00:00:00 2001 From: Dana Jansens Date: Sun, 14 Jul 2002 18:45:46 +0000 Subject: [PATCH] sych with blackbox --- src/Screen.hh | 6 ++-- src/Window.cc | 38 ++++++++++++------------ src/Workspace.cc | 75 +++++++++++++++++++++++++++--------------------- 3 files changed, 64 insertions(+), 55 deletions(-) diff --git a/src/Screen.hh b/src/Screen.hh index 8986803b..d2175ce4 100644 --- a/src/Screen.hh +++ b/src/Screen.hh @@ -245,11 +245,11 @@ public: inline unsigned int getResizeZones(void) const { return resource.resize_zones; } - inline unsigned int getCurrentWorkspaceID(void) + inline unsigned int getCurrentWorkspaceID(void) const { return current_workspace->getID(); } - inline unsigned int getWorkspaceCount(void) + inline unsigned int getWorkspaceCount(void) const { return workspacesList.size(); } - inline unsigned int getIconCount(void) { return iconList.size(); } + inline unsigned int getIconCount(void) const { return iconList.size(); } inline unsigned int getNumberOfWorkspaces(void) const { return resource.workspaces; } inline int getPlacementPolicy(void) const diff --git a/src/Window.cc b/src/Window.cc index 18662450..c32acbdf 100644 --- a/src/Window.cc +++ b/src/Window.cc @@ -422,7 +422,7 @@ Window BlackboxWindow::createToplevelWindow(void) { ButtonMotionMask | EnterWindowMask; return XCreateWindow(blackbox->getXDisplay(), screen->getRootWindow(), - -1, -1, 1, 1, frame.border_w, screen->getDepth(), + 0, 0, 1, 1, frame.border_w, screen->getDepth(), InputOutput, screen->getVisual(), create_mask, &attrib_create); } @@ -462,10 +462,14 @@ void BlackboxWindow::associateClientWindow(void) { XSelectInput(blackbox->getXDisplay(), frame.plate, SubstructureRedirectMask); XGrabServer(blackbox->getXDisplay()); - XSelectInput(blackbox->getXDisplay(), client.window, NoEventMask); - XReparentWindow(blackbox->getXDisplay(), client.window, frame.plate, 0, 0); + + unsigned long event_mask = PropertyChangeMask | FocusChangeMask | + StructureNotifyMask; XSelectInput(blackbox->getXDisplay(), client.window, - PropertyChangeMask | FocusChangeMask | StructureNotifyMask); + event_mask & ~StructureNotifyMask); + XReparentWindow(blackbox->getXDisplay(), client.window, frame.plate, 0, 0); + XSelectInput(blackbox->getXDisplay(), client.window, event_mask); + XUngrabServer(blackbox->getXDisplay()); XRaiseWindow(blackbox->getXDisplay(), frame.plate); @@ -1636,11 +1640,13 @@ void BlackboxWindow::iconify(void) { * split second, leaving us with a ghost window... so, we need to do this * while the X server is grabbed */ + unsigned long event_mask = PropertyChangeMask | FocusChangeMask | + StructureNotifyMask; XGrabServer(blackbox->getXDisplay()); - XSelectInput(blackbox->getXDisplay(), client.window, NoEventMask); - XUnmapWindow(blackbox->getXDisplay(), client.window); XSelectInput(blackbox->getXDisplay(), client.window, - PropertyChangeMask | FocusChangeMask | StructureNotifyMask); + event_mask & ~StructureNotifyMask); + XUnmapWindow(blackbox->getXDisplay(), client.window); + XSelectInput(blackbox->getXDisplay(), client.window, event_mask); XUngrabServer(blackbox->getXDisplay()); XUnmapWindow(blackbox->getXDisplay(), frame.window); @@ -1749,10 +1755,12 @@ void BlackboxWindow::withdraw(void) { XGrabServer(blackbox->getXDisplay()); - XSelectInput(blackbox->getXDisplay(), client.window, NoEventMask); - XUnmapWindow(blackbox->getXDisplay(), client.window); + unsigned long event_mask = PropertyChangeMask | FocusChangeMask | + StructureNotifyMask; XSelectInput(blackbox->getXDisplay(), client.window, - PropertyChangeMask | FocusChangeMask | StructureNotifyMask); + event_mask & ~StructureNotifyMask); + XUnmapWindow(blackbox->getXDisplay(), client.window); + XSelectInput(blackbox->getXDisplay(), client.window, event_mask); XUngrabServer(blackbox->getXDisplay()); @@ -3679,16 +3687,8 @@ BWindowGroup::BWindowGroup(Blackbox *b, Window _group) return; } - /* - watch for destroy notify on the group window (in addition to - any other events we are looking for) - - since some managed windows can also be window group controllers, - we need to make sure that we don't clobber the event mask for the - managed window - */ XSelectInput(blackbox->getXDisplay(), group, - wattrib.your_event_mask | StructureNotifyMask); + PropertyChangeMask | FocusChangeMask | StructureNotifyMask); blackbox->saveGroupSearch(group, this); } diff --git a/src/Workspace.cc b/src/Workspace.cc index d2a43f44..65f323f1 100644 --- a/src/Workspace.cc +++ b/src/Workspace.cc @@ -103,19 +103,14 @@ unsigned int Workspace::removeWindow(BlackboxWindow *w) { // pass focus to the next appropriate window if ((w->isFocused() || w == lastfocus) && ! screen->getBlackbox()->doShutdown()) { - if (id == screen->getCurrentWorkspaceID()) { - // The window is on the visible workspace - focusFallback(w); - } else { - // The window is not on the visible workspace. - if (lastfocus == w) { - // The window was the last-focus target, so we need to replace it. - setLastFocusedWindow(stackingList.front()); - } - // if the window focused on the current workspace, then reapply that - // workspace's focus too - if (w->isFocused()) - screen->getCurrentWorkspace()->focusFallback(w); + focusFallback(w); + + // if the window is sticky, then it needs to be removed on all other + // workspaces too! + if (w->isStuck()) { + for (unsigned int i = 0; i < screen->getWorkspaceCount(); ++i) + if (i != id) + screen->getWorkspace(i)->focusFallback(w); } } @@ -141,31 +136,45 @@ unsigned int Workspace::removeWindow(BlackboxWindow *w) { void Workspace::focusFallback(const BlackboxWindow *old_window) { BlackboxWindow *newfocus = 0; - // if it's a transient, then try to focus its parent - if (old_window && old_window->isTransient()) { - newfocus = old_window->getTransientFor(); + if (id == screen->getCurrentWorkspaceID()) { + // The window is on the visible workspace. - if (! newfocus || - newfocus->isIconic() || // do not focus icons - newfocus->getWorkspaceNumber() != id || // or other workspaces - ! newfocus->setInputFocus()) - newfocus = 0; - } + // if it's a transient, then try to focus its parent + if (old_window && old_window->isTransient()) { + newfocus = old_window->getTransientFor(); + + if (! newfocus || + newfocus->isIconic() || // do not focus icons + newfocus->getWorkspaceNumber() != id || // or other workspaces + ! newfocus->setInputFocus()) + newfocus = 0; + } - if (! newfocus) { - BlackboxWindowList::iterator it = stackingList.begin(), - end = stackingList.end(); - for (; it != end; ++it) { - BlackboxWindow *tmp = *it; - if (tmp && tmp->setInputFocus()) { - // we found our new focus target - newfocus = tmp; - break; + if (! newfocus) { + BlackboxWindowList::iterator it = stackingList.begin(), + end = stackingList.end(); + for (; it != end; ++it) { + BlackboxWindow *tmp = *it; + if (tmp && tmp->setInputFocus()) { + // we found our new focus target + newfocus = tmp; + break; + } } } - } - screen->getBlackbox()->setFocusedWindow(newfocus); + screen->getBlackbox()->setFocusedWindow(newfocus); + } else { + // The window is not on the visible workspace. + + if (old_window && lastfocus == old_window) { + // The window was the last-focus target, so we need to replace it. + BlackboxWindow *win = (BlackboxWindow*) 0; + if (! stackingList.empty()) + win = stackingList.front(); + setLastFocusedWindow(win); + } + } } -- 2.45.2