From f00ed578baacb73a36227fed1419e9d451ee7bb0 Mon Sep 17 00:00:00 2001 From: Dana Jansens Date: Tue, 14 May 2002 07:53:22 +0000 Subject: [PATCH] new focus code! working better than ever! --- src/Screen.cc | 7 +++---- src/Workspace.cc | 35 ++++++++++++++++++----------------- src/Workspace.h | 9 +++++---- src/openbox.cc | 39 ++++++++++++++++++--------------------- src/openbox.h | 2 +- 5 files changed, 45 insertions(+), 47 deletions(-) diff --git a/src/Screen.cc b/src/Screen.cc index 75f8459a..50a0f1d1 100644 --- a/src/Screen.cc +++ b/src/Screen.cc @@ -1979,8 +1979,7 @@ void BScreen::changeWorkspaceID(int id) { if (openbox.focusedWindow() && openbox.focusedWindow()->getScreen() == this && (! openbox.focusedWindow()->isStuck())) { - current_workspace->setLastFocusedWindow(openbox.focusedWindow()); - openbox.focusWindow((OpenboxWindow *) 0); + openbox.focusWindow(0); } current_workspace = getWorkspace(id); @@ -1991,9 +1990,9 @@ void BScreen::changeWorkspaceID(int id) { current_workspace->showAll(); - if (resource.focus_last && current_workspace->getLastFocusedWindow()) { + if (resource.focus_last && current_workspace->lastFocusedWindow()) { XSync(openbox.getXDisplay(), False); - current_workspace->getLastFocusedWindow()->setInputFocus(); + current_workspace->lastFocusedWindow()->setInputFocus(); } } diff --git a/src/Workspace.cc b/src/Workspace.cc index 5982f878..41a09324 100644 --- a/src/Workspace.cc +++ b/src/Workspace.cc @@ -63,13 +63,11 @@ typedef std::vector rectList; Workspace::Workspace(BScreen &scrn, int i) : screen(scrn) { cascade_x = cascade_y = 0; - _focused = (OpenboxWindow *) 0; + _focused = _last = (OpenboxWindow *) 0; id = i; clientmenu = new Clientmenu(*this); - lastfocus = (OpenboxWindow *) 0; - name = (char *) 0; setName(screen.getNameOfWorkspace(id)); } @@ -86,6 +84,8 @@ Workspace::~Workspace(void) { const int Workspace::addWindow(OpenboxWindow *w, Bool place) { if (! w) return -1; + if (place) placeWindow(*w); + w->setWorkspace(id); w->setWindowNumber(_windows.size()); @@ -99,8 +99,6 @@ const int Workspace::addWindow(OpenboxWindow *w, Bool place) { raiseWindow(w); - if (place) placeWindow(*w); - return w->getWindowNumber(); } @@ -111,21 +109,22 @@ const int Workspace::removeWindow(OpenboxWindow *w) { _zorder.remove(w); if (w->isFocused()) { + if (w == _last) + _last = (OpenboxWindow *) 0; + + OpenboxWindow *fw = (OpenboxWindow *) 0; if (w->isTransient() && w->getTransientFor() && - w->getTransientFor()->isVisible()) { - w->getTransientFor()->setInputFocus(); - } else { - if (screen.sloppyFocus() || // sloppy focus - _zorder.empty() || // click focus but no windows - !_zorder.front()->setInputFocus()) { // tried window, but wont focus - screen.getOpenbox().focusWindow((OpenboxWindow *) 0); - } - } + w->getTransientFor()->isVisible()) + fw = w->getTransientFor(); + else if (screen.sloppyFocus()) // sloppy focus + fw = (OpenboxWindow *) 0; + else if (!_zorder.empty()) // click focus + fw = _zorder.front(); + + if (!(fw != (OpenboxWindow *) 0 && fw->setInputFocus())) + screen.getOpenbox().focusWindow(0); } - if (lastfocus == w) - lastfocus = (OpenboxWindow *) 0; - _windows.erase(_windows.begin() + w->getWindowNumber()); clientmenu->remove(w->getWindowNumber()); clientmenu->update(); @@ -146,6 +145,8 @@ void Workspace::focusWindow(OpenboxWindow *win) { if (_focused != (OpenboxWindow *) 0) clientmenu->setItemSelected(_focused->getWindowNumber(), false); _focused = win; + if (win != (OpenboxWindow *) 0) + _last = win; } diff --git a/src/Workspace.h b/src/Workspace.h index 1f2483af..21e65cec 100644 --- a/src/Workspace.h +++ b/src/Workspace.h @@ -38,7 +38,6 @@ class Rect; class Workspace { private: BScreen &screen; - OpenboxWindow *lastfocus; Clientmenu *clientmenu; typedef std::vector winVect; @@ -49,7 +48,10 @@ private: char *name; int id, cascade_x, cascade_y; - OpenboxWindow *_focused; + OpenboxWindow *_focused, *_last; // last is the same as focused except + // that when focus is removed from all + // windows on the workspace, last doesnt + // change to NULL protected: void placeWindow(OpenboxWindow &); @@ -64,12 +66,11 @@ public: ~Workspace(void); inline BScreen &getScreen(void) { return screen; } - inline OpenboxWindow *getLastFocusedWindow(void) { return lastfocus; } inline Clientmenu *getMenu(void) { return clientmenu; } inline const char *getName(void) const { return name; } inline const int &getWorkspaceID(void) const { return id; } - inline void setLastFocusedWindow(OpenboxWindow *w) { lastfocus = w; } inline OpenboxWindow *focusedWindow() { return _focused; } + inline OpenboxWindow *lastFocusedWindow() { return _last; } void focusWindow(OpenboxWindow *win); OpenboxWindow *getWindow(int); Bool isCurrent(void); diff --git a/src/openbox.cc b/src/openbox.cc index b603e56f..8ef1e07c 100644 --- a/src/openbox.cc +++ b/src/openbox.cc @@ -186,8 +186,8 @@ Openbox::Openbox(int m_argc, char **m_argv, char *dpy_name, char *rc) resource.titlebar_layout = NULL; resource.auto_raise_delay.tv_sec = resource.auto_raise_delay.tv_usec = 0; - focused_screen = (BScreen *) 0; - masked_window = NULL; + current_screen = (BScreen *) 0; + masked_window = (OpenboxWindow *) 0; masked = None; load(); @@ -213,7 +213,7 @@ Openbox::Openbox(int m_argc, char **m_argv, char *dpy_name, char *rc) "Openbox::Openbox: no managable screens found, aborting.\n")); ::exit(3); } - focused_screen = screenList.front(); + current_screen = screenList.front(); // save current settings and default values save(); @@ -229,7 +229,7 @@ Openbox::Openbox(int m_argc, char **m_argv, char *dpy_name, char *rc) ungrab(); - focusWindow((OpenboxWindow *) 0); + focusWindow(0); } @@ -868,11 +868,11 @@ void Openbox::restart(const char *prog) { void Openbox::shutdown() { BaseDisplay::shutdown(); - focusWindow((OpenboxWindow *) 0); - std::for_each(screenList.begin(), screenList.end(), std::mem_fun(&BScreen::shutdown)); + focusWindow(0); + XSync(getXDisplay(), False); } @@ -1063,12 +1063,11 @@ void Openbox::timeout() { OpenboxWindow *Openbox::focusedWindow() { - if (focused_screen == (BScreen *) 0) - return (OpenboxWindow *) 0; - Workspace *w = focused_screen->getCurrentWorkspace(); - if (w == (Workspace *) 0) - return (OpenboxWindow *) 0; - return w->focusedWindow(); + Workspace *w; + if (current_screen) + if ((w = current_screen->getCurrentWorkspace())) + return w->focusedWindow(); + return (OpenboxWindow *) 0; } @@ -1083,28 +1082,26 @@ void Openbox::focusWindow(OpenboxWindow *win) { old_wkspc = old_screen->getWorkspace(old_win->getWorkspaceNumber()); old_tbar = old_screen->getToolbar(); - old_win->setFocusFlag(False); + old_win->setFocusFlag(false); old_wkspc->focusWindow((OpenboxWindow *) 0); } if (win && !win->isIconic()) { - focused_screen = win->getScreen(); - tbar = focused_screen->getToolbar(); - wkspc = focused_screen->getWorkspace(win->getWorkspaceNumber()); + current_screen = win->getScreen(); + tbar = current_screen->getToolbar(); + wkspc = current_screen->getWorkspace(win->getWorkspaceNumber()); win->setFocusFlag(true); wkspc->focusWindow(win); if (tbar) tbar->redrawWindowLabel(true); - focused_screen->updateNetizenWindowFocus(); + current_screen->updateNetizenWindowFocus(); } else { - ASSERT(focused_screen != (BScreen *) 0); - XSetInputFocus(getXDisplay(), focused_screen->getRootWindow(), - None, CurrentTime); + XSetInputFocus(getXDisplay(), PointerRoot, None, CurrentTime); } if (old_tbar && old_tbar != tbar) old_tbar->redrawWindowLabel(true); - if (old_screen && old_screen != focused_screen) + if (old_screen && old_screen != current_screen) old_screen->updateNetizenWindowFocus(); } diff --git a/src/openbox.h b/src/openbox.h index c62dfa2a..61d5fdb2 100644 --- a/src/openbox.h +++ b/src/openbox.h @@ -118,7 +118,7 @@ private: typedef std::list ScreenList; ScreenList screenList; - BScreen *focused_screen; + BScreen *current_screen; OpenboxWindow *masked_window; BTimer *timer; -- 2.45.2