summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CHANGELOG2
-rw-r--r--src/BaseDisplay.cc62
-rw-r--r--src/Screen.cc8
-rw-r--r--src/Window.cc11
-rw-r--r--src/Workspace.cc23
-rw-r--r--src/openbox.cc5
6 files changed, 68 insertions, 43 deletions
diff --git a/CHANGELOG b/CHANGELOG
index fb13110c..4581419d 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -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
diff --git a/src/BaseDisplay.cc b/src/BaseDisplay.cc
index ea3f123d..09180498 100644
--- a/src/BaseDisplay.cc
+++ b/src/BaseDisplay.cc
@@ -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);
-
- 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.
}
}
}
@@ -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
diff --git a/src/Screen.cc b/src/Screen.cc
index 175d966d..08b76971 100644
--- a/src/Screen.cc
+++ b/src/Screen.cc
@@ -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);
diff --git a/src/Window.cc b/src/Window.cc
index 3f531d52..342864c9 100644
--- a/src/Window.cc
+++ b/src/Window.cc
@@ -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) {
diff --git a/src/Workspace.cc b/src/Workspace.cc
index dc7007ee..47ad3827 100644
--- a/src/Workspace.cc
+++ b/src/Workspace.cc
@@ -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;
}
diff --git a/src/openbox.cc b/src/openbox.cc
index ab88729f..e71b269d 100644
--- a/src/openbox.cc
+++ b/src/openbox.cc
@@ -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);