merge the sticky window fix from 1.2.
Dana Jansens danakj@orodu.net
6 files changed,
64 insertions(+),
39 deletions(-)
M
src/BaseDisplay.cc
→
src/BaseDisplay.cc
@@ -462,34 +462,33 @@
// check for timer timeout gettimeofday(&now, 0); - TimerList::iterator it; - for (it = timerList.begin(); it != timerList.end(); ++it) { - BTimer *timer = *it; - ASSERT(timer != NULL); + TimerList::iterator it; + for (it = timerList.begin(); it != timerList.end(); ++it) { + BTimer *timer = *it; + ASSERT(timer != NULL); - tm.tv_sec = timer->getStartTime().tv_sec + - timer->getTimeout().tv_sec; - tm.tv_usec = timer->getStartTime().tv_usec + - timer->getTimeout().tv_usec; + tm.tv_sec = timer->getStartTime().tv_sec + + timer->getTimeout().tv_sec; + tm.tv_usec = timer->getStartTime().tv_usec + + timer->getTimeout().tv_usec; - if ((now.tv_sec < tm.tv_sec) || - (now.tv_sec == tm.tv_sec && now.tv_usec < tm.tv_usec)) - break; + if ((now.tv_sec < tm.tv_sec) || + (now.tv_sec == tm.tv_sec && now.tv_usec < tm.tv_usec)) + break; - timer->fireTimeout(); + timer->fireTimeout(); - // restart the current timer so that the start time is updated - if (! timer->doOnce()) { - // reorder - removeTimer(timer); - addTimer(timer); - timer->start(); - } else - timer->stop(); - it = timerList.begin(); // we no longer have any idea if the iterator is - // valid, but what was at the front() is no - // longer. - } + // restart the current timer so that the start time is updated + if (! timer->doOnce()) { + // reorder + removeTimer(timer); + addTimer(timer); + timer->start(); + } else + timer->stop(); + it = timerList.begin(); // we no longer have any idea if the iterator is + // valid, but what was at the front() is no + // longer. } } }@@ -540,6 +539,13 @@ ASSERT(timer != (BTimer *) 0);
timerList.remove(timer); } +<<<<<<< BaseDisplay.cc +======= +void BaseDisplay::removeTimer(BTimer *timer) { + ASSERT(timer != (BTimer *) 0); + timerList.remove(timer); +} +>>>>>>> 1.13.4.1 /* * Grabs a button, but also grabs the button in every possible combination with
M
src/Screen.cc
→
src/Screen.cc
@@ -1976,11 +1976,9 @@
workspacemenu->setItemSelected(current_workspace->getWorkspaceID() + 2, False); - if (openbox.focusedWindow() && - openbox.focusedWindow()->getScreen() == this && - (! openbox.focusedWindow()->isStuck())) { - openbox.focusWindow(0); - } + OpenboxWindow *fw = openbox.focusedWindow(); + if (fw && fw->getScreen() == this) + openbox.focusWindow(0); current_workspace = getWorkspace(id);
M
src/Window.cc
→
src/Window.cc
@@ -314,9 +314,14 @@ screen->hideGeometry();
XUngrabPointer(display, CurrentTime); } - if (workspace_number != -1 && window_number != -1) - screen->getWorkspace(workspace_number)->removeWindow(this); - else if (flags.iconic) + if (workspace_number != -1 && window_number != -1) { + if (flags.stuck) { + // make sure no other workspaces think that we're focused + for (int i=0; i < screen->getWorkspaceCount(); i++) + screen->getWorkspace(i)->removeWindow(this); + } else + screen->getWorkspace(workspace_number)->removeWindow(this); + } else if (flags.iconic) screen->removeIcon(this); if (timer) {
M
src/Workspace.cc
→
src/Workspace.cc
@@ -106,12 +106,21 @@
int Workspace::removeWindow(OpenboxWindow *w) { if (! w) return -1; - _zorder.remove(w); + winVect::iterator winit = std::find(_windows.begin(), _windows.end(), w); - if (w->isFocused()) { + if (winit == _windows.end()) { if (w == _last) _last = (OpenboxWindow *) 0; + if (w == _focused) + _focused = (OpenboxWindow *) 0; + return _windows.size(); + } + + _zorder.remove(w); + if (w == _last) + _last = (OpenboxWindow *) 0; + if (w == _focused) { OpenboxWindow *fw = (OpenboxWindow *) 0; if (w->isTransient() && w->getTransientFor() && w->getTransientFor()->isVisible())@@ -124,8 +133,8 @@
if (!(fw != (OpenboxWindow *) 0 && fw->setInputFocus())) screen.getOpenbox().focusWindow(0); } - - _windows.erase(_windows.begin() + w->getWindowNumber()); + + _windows.erase(winit); clientmenu->remove(w->getWindowNumber()); clientmenu->update();@@ -140,11 +149,13 @@ }
void Workspace::focusWindow(OpenboxWindow *win) { - if (win != (OpenboxWindow *) 0) - clientmenu->setItemSelected(win->getWindowNumber(), true); if (_focused != (OpenboxWindow *) 0) clientmenu->setItemSelected(_focused->getWindowNumber(), false); _focused = win; + // make sure the focused window belongs to this workspace before highlighting + // it in the menu (sticky windows arent in this workspace's menu). + if (_focused != (OpenboxWindow *) 0 && _focused->getWorkspaceNumber() == id) + clientmenu->setItemSelected(_focused->getWindowNumber(), true); if (win != (OpenboxWindow *) 0) _last = win; }
M
src/openbox.cc
→
src/openbox.cc
@@ -1088,7 +1088,10 @@
if (win && !win->isIconic()) { current_screen = win->getScreen(); tbar = current_screen->getToolbar(); - wkspc = current_screen->getWorkspace(win->getWorkspaceNumber()); + if (win->isStuck()) + wkspc = current_screen->getCurrentWorkspace(); + else + wkspc = current_screen->getWorkspace(win->getWorkspaceNumber()); win->setFocusFlag(true); wkspc->focusWindow(win);