all repos — openbox @ 3312a209d7882a32253d715ee24bcaa717af75c2

openbox fork - make it a bit more like ryudo

sych with blackbox
Dana Jansens danakj@orodu.net
commit

3312a209d7882a32253d715ee24bcaa717af75c2

parent

1525520dd177f7274ac5e2d2e95c5fa9027e0f48

3 files changed, 64 insertions(+), 55 deletions(-)

jump to
M src/Screen.hhsrc/Screen.hh

@@ -245,11 +245,11 @@ { return resource.border_width; }

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
M src/Window.ccsrc/Window.cc

@@ -422,7 +422,7 @@ attrib_create.event_mask = ButtonPressMask | ButtonReleaseMask |

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 @@

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 @@ * HOWEVER, since X11 is asynchronous, the window could be destroyed in that

* 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 @@ XUnmapWindow(blackbox->getXDisplay(), frame.window);

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 @@ delete this;

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); }
M src/Workspace.ccsrc/Workspace.cc

@@ -103,19 +103,14 @@

// 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 @@

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 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 || + 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); + } + } }