merge the sticky window fix from 1.2.

This commit is contained in:
Dana Jansens 2002-05-23 14:27:52 +00:00
parent a25b213aff
commit 67b4df1eff
6 changed files with 64 additions and 39 deletions

View file

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

View file

@ -462,34 +462,33 @@ static RETSIGTYPE signalhandler(int sig) {
// 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 @@ static RETSIGTYPE signalhandler(int sig) {
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

View file

@ -1976,11 +1976,9 @@ void BScreen::load() {
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);

View file

@ -314,9 +314,14 @@ OpenboxWindow::~OpenboxWindow(void) {
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) {

View file

@ -106,12 +106,21 @@ int Workspace::addWindow(OpenboxWindow *w, bool place) {
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 @@ int Workspace::removeWindow(OpenboxWindow *w) {
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 @@ int Workspace::removeWindow(OpenboxWindow *w) {
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;
}

View file

@ -1088,7 +1088,10 @@ void Openbox::focusWindow(OpenboxWindow *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);