all repos — openbox @ 67b4df1eff614c79bca956615a514bb5bb211af8

openbox fork - make it a bit more like ryudo

merge the sticky window fix from 1.2.
Dana Jansens danakj@orodu.net
commit

67b4df1eff614c79bca956615a514bb5bb211af8

parent

a25b213aff1ec7450b5d61c20cf3c8e0f918ee28

6 files changed, 64 insertions(+), 39 deletions(-)

jump to
M CHANGELOGCHANGELOG

@@ -1,6 +1,8 @@

Changelog for Openbox: 2.0.0: + * fixed sticky windows behavior. (Ben Jansens) + * make reconfigure reset the timeout values for windows, the slit, and the toolbar, so that a new autoRaiseDelay value will take effect without having
M src/BaseDisplay.ccsrc/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.ccsrc/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.ccsrc/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.ccsrc/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.ccsrc/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);