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
// check for timer timeout
gettimeofday(&now, 0);
- 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;
-
- if ((now.tv_sec < tm.tv_sec) ||
- (now.tv_sec == tm.tv_sec && now.tv_usec < tm.tv_usec))
- break;
-
- 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.
- }
+ 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;
+
+ if ((now.tv_sec < tm.tv_sec) ||
+ (now.tv_sec == tm.tv_sec && now.tv_usec < tm.tv_usec))
+ break;
+
+ 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.
}
}
}
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
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);
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) {
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())
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();
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;
}
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);