sych with blackbox

This commit is contained in:
Dana Jansens 2002-07-14 18:45:46 +00:00
parent 1525520dd1
commit 3312a209d7
3 changed files with 64 additions and 55 deletions

View file

@ -245,11 +245,11 @@ public:
inline unsigned int getResizeZones(void) const inline unsigned int getResizeZones(void) const
{ return resource.resize_zones; } { return resource.resize_zones; }
inline unsigned int getCurrentWorkspaceID(void) inline unsigned int getCurrentWorkspaceID(void) const
{ return current_workspace->getID(); } { return current_workspace->getID(); }
inline unsigned int getWorkspaceCount(void) inline unsigned int getWorkspaceCount(void) const
{ return workspacesList.size(); } { 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 inline unsigned int getNumberOfWorkspaces(void) const
{ return resource.workspaces; } { return resource.workspaces; }
inline int getPlacementPolicy(void) const inline int getPlacementPolicy(void) const

View file

@ -422,7 +422,7 @@ Window BlackboxWindow::createToplevelWindow(void) {
ButtonMotionMask | EnterWindowMask; ButtonMotionMask | EnterWindowMask;
return XCreateWindow(blackbox->getXDisplay(), screen->getRootWindow(), 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, InputOutput, screen->getVisual(), create_mask,
&attrib_create); &attrib_create);
} }
@ -462,10 +462,14 @@ void BlackboxWindow::associateClientWindow(void) {
XSelectInput(blackbox->getXDisplay(), frame.plate, SubstructureRedirectMask); XSelectInput(blackbox->getXDisplay(), frame.plate, SubstructureRedirectMask);
XGrabServer(blackbox->getXDisplay()); 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, 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()); XUngrabServer(blackbox->getXDisplay());
XRaiseWindow(blackbox->getXDisplay(), frame.plate); 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 * split second, leaving us with a ghost window... so, we need to do this
* while the X server is grabbed * while the X server is grabbed
*/ */
unsigned long event_mask = PropertyChangeMask | FocusChangeMask |
StructureNotifyMask;
XGrabServer(blackbox->getXDisplay()); XGrabServer(blackbox->getXDisplay());
XSelectInput(blackbox->getXDisplay(), client.window, NoEventMask);
XUnmapWindow(blackbox->getXDisplay(), client.window);
XSelectInput(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()); XUngrabServer(blackbox->getXDisplay());
XUnmapWindow(blackbox->getXDisplay(), frame.window); XUnmapWindow(blackbox->getXDisplay(), frame.window);
@ -1749,10 +1755,12 @@ void BlackboxWindow::withdraw(void) {
XGrabServer(blackbox->getXDisplay()); XGrabServer(blackbox->getXDisplay());
XSelectInput(blackbox->getXDisplay(), client.window, NoEventMask); unsigned long event_mask = PropertyChangeMask | FocusChangeMask |
XUnmapWindow(blackbox->getXDisplay(), client.window); StructureNotifyMask;
XSelectInput(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()); XUngrabServer(blackbox->getXDisplay());
@ -3679,16 +3687,8 @@ BWindowGroup::BWindowGroup(Blackbox *b, Window _group)
return; 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, XSelectInput(blackbox->getXDisplay(), group,
wattrib.your_event_mask | StructureNotifyMask); PropertyChangeMask | FocusChangeMask | StructureNotifyMask);
blackbox->saveGroupSearch(group, this); blackbox->saveGroupSearch(group, this);
} }

View file

@ -103,19 +103,14 @@ unsigned int Workspace::removeWindow(BlackboxWindow *w) {
// pass focus to the next appropriate window // pass focus to the next appropriate window
if ((w->isFocused() || w == lastfocus) && if ((w->isFocused() || w == lastfocus) &&
! screen->getBlackbox()->doShutdown()) { ! screen->getBlackbox()->doShutdown()) {
if (id == screen->getCurrentWorkspaceID()) { focusFallback(w);
// The window is on the visible workspace
focusFallback(w); // if the window is sticky, then it needs to be removed on all other
} else { // workspaces too!
// The window is not on the visible workspace. if (w->isStuck()) {
if (lastfocus == w) { for (unsigned int i = 0; i < screen->getWorkspaceCount(); ++i)
// The window was the last-focus target, so we need to replace it. if (i != id)
setLastFocusedWindow(stackingList.front()); screen->getWorkspace(i)->focusFallback(w);
}
// if the window focused on the current workspace, then reapply that
// workspace's focus too
if (w->isFocused())
screen->getCurrentWorkspace()->focusFallback(w);
} }
} }
@ -141,31 +136,45 @@ unsigned int Workspace::removeWindow(BlackboxWindow *w) {
void Workspace::focusFallback(const BlackboxWindow *old_window) { void Workspace::focusFallback(const BlackboxWindow *old_window) {
BlackboxWindow *newfocus = 0; BlackboxWindow *newfocus = 0;
// if it's a transient, then try to focus its parent if (id == screen->getCurrentWorkspaceID()) {
if (old_window && old_window->isTransient()) { // The window is on the visible workspace.
newfocus = old_window->getTransientFor();
if (! newfocus || // if it's a transient, then try to focus its parent
newfocus->isIconic() || // do not focus icons if (old_window && old_window->isTransient()) {
newfocus->getWorkspaceNumber() != id || // or other workspaces newfocus = old_window->getTransientFor();
! newfocus->setInputFocus())
newfocus = 0;
}
if (! newfocus) { if (! newfocus ||
BlackboxWindowList::iterator it = stackingList.begin(), newfocus->isIconic() || // do not focus icons
end = stackingList.end(); newfocus->getWorkspaceNumber() != id || // or other workspaces
for (; it != end; ++it) { ! newfocus->setInputFocus())
BlackboxWindow *tmp = *it; newfocus = 0;
if (tmp && tmp->setInputFocus()) { }
// we found our new focus target
newfocus = tmp; if (! newfocus) {
break; 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);
}
}
} }