diff options
author | rathnor <rathnor> | 2004-03-21 09:00:25 (GMT) |
---|---|---|
committer | rathnor <rathnor> | 2004-03-21 09:00:25 (GMT) |
commit | dea3281e6917601a81df7833457a942b875b8e49 (patch) | |
tree | 09878620d13c944a2a6af724dc3b3366984bac2f | |
parent | 2d82374b2f458c32895b093aff8c77e88daea2ba (diff) | |
download | fluxbox-dea3281e6917601a81df7833457a942b875b8e49.zip fluxbox-dea3281e6917601a81df7833457a942b875b8e49.tar.bz2 |
primarily focus fix/tweak/rejigging
-rw-r--r-- | ChangeLog | 7 | ||||
-rw-r--r-- | src/FbWinFrame.cc | 7 | ||||
-rw-r--r-- | src/Screen.cc | 32 | ||||
-rw-r--r-- | src/Screen.hh | 3 | ||||
-rw-r--r-- | src/Window.cc | 30 | ||||
-rw-r--r-- | src/Window.hh | 4 | ||||
-rw-r--r-- | src/Workspace.cc | 32 | ||||
-rw-r--r-- | src/Workspace.hh | 2 | ||||
-rw-r--r-- | src/fluxbox.cc | 62 | ||||
-rw-r--r-- | src/fluxbox.hh | 4 |
10 files changed, 121 insertions, 62 deletions
@@ -1,5 +1,12 @@ | |||
1 | (Format: Year/Month/Day) | 1 | (Format: Year/Month/Day) |
2 | Changes for 0.9.9: | 2 | Changes for 0.9.9: |
3 | *04/03/21: | ||
4 | * A number of small fixes (Simon) | ||
5 | - Fix up focus+highlights on tab close | ||
6 | - Centralise focus fallbacks (fluxbox::unfocusWindow) | ||
7 | - we now prefer the last focused window in the current tabgroup to | ||
8 | the actual last focused window on the whole screen. | ||
9 | fluxbox.hh/cc Screen.hh/cc Window.hh/cc Workspace.hh/cc FbWinFrame.cc | ||
3 | *04/03/19: | 10 | *04/03/19: |
4 | * fluxbox-generate_menu: (Han) | 11 | * fluxbox-generate_menu: (Han) |
5 | removes the reload-menu code which is obsolete | 12 | removes the reload-menu code which is obsolete |
diff --git a/src/FbWinFrame.cc b/src/FbWinFrame.cc index 9b8b7e7..8d93184 100644 --- a/src/FbWinFrame.cc +++ b/src/FbWinFrame.cc | |||
@@ -19,7 +19,7 @@ | |||
19 | // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER | 19 | // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER |
20 | // DEALINGS IN THE SOFTWARE. | 20 | // DEALINGS IN THE SOFTWARE. |
21 | 21 | ||
22 | // $Id: FbWinFrame.cc,v 1.76 2004/02/28 16:54:04 fluxgen Exp $ | 22 | // $Id: FbWinFrame.cc,v 1.77 2004/03/21 09:00:24 rathnor Exp $ |
23 | 23 | ||
24 | #include "FbWinFrame.hh" | 24 | #include "FbWinFrame.hh" |
25 | 25 | ||
@@ -301,10 +301,11 @@ void FbWinFrame::removeLabelButton(FbTk::TextButton &btn) { | |||
301 | if (erase_it == m_labelbuttons.end()) | 301 | if (erase_it == m_labelbuttons.end()) |
302 | return; | 302 | return; |
303 | 303 | ||
304 | if (&btn == m_current_label) | ||
305 | m_current_label = 0; | ||
306 | |||
304 | m_labelbuttons.erase(erase_it); | 307 | m_labelbuttons.erase(erase_it); |
305 | 308 | ||
306 | if (*erase_it == m_current_label) | ||
307 | m_current_label = 0; | ||
308 | } | 309 | } |
309 | 310 | ||
310 | 311 | ||
diff --git a/src/Screen.cc b/src/Screen.cc index 4fb6576..8c01402 100644 --- a/src/Screen.cc +++ b/src/Screen.cc | |||
@@ -22,7 +22,7 @@ | |||
22 | // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER | 22 | // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER |
23 | // DEALINGS IN THE SOFTWARE. | 23 | // DEALINGS IN THE SOFTWARE. |
24 | 24 | ||
25 | // $Id: Screen.cc,v 1.269 2004/03/18 14:45:56 fluxgen Exp $ | 25 | // $Id: Screen.cc,v 1.270 2004/03/21 09:00:24 rathnor Exp $ |
26 | 26 | ||
27 | 27 | ||
28 | #include "Screen.hh" | 28 | #include "Screen.hh" |
@@ -937,7 +937,7 @@ void BScreen::removeWindow(FluxboxWindow *win) { | |||
937 | if (win->isIconic()) | 937 | if (win->isIconic()) |
938 | removeIcon(win); | 938 | removeIcon(win); |
939 | else | 939 | else |
940 | getWorkspace(win->workspaceNumber())->removeWindow(win); | 940 | getWorkspace(win->workspaceNumber())->removeWindow(win, false); |
941 | } | 941 | } |
942 | 942 | ||
943 | 943 | ||
@@ -951,13 +951,6 @@ void BScreen::removeClient(WinClient &client) { | |||
951 | focused_list.remove(&client); | 951 | focused_list.remove(&client); |
952 | if (cyc == &client) { | 952 | if (cyc == &client) { |
953 | cycling_window = focused_list.end(); | 953 | cycling_window = focused_list.end(); |
954 | } else if (focused == &client) { | ||
955 | // if we are focused, then give our focus to our transient parent | ||
956 | // or revert normally | ||
957 | if (client.transientFor() && client.transientFor()->fbwindow()) | ||
958 | client.transientFor()->fbwindow()->setInputFocus(); | ||
959 | else | ||
960 | Fluxbox::instance()->revertFocus(focused->screen()); | ||
961 | } | 954 | } |
962 | 955 | ||
963 | if (cycling_last == &client) | 956 | if (cycling_last == &client) |
@@ -1471,7 +1464,7 @@ void BScreen::reassociateWindow(FluxboxWindow *w, unsigned int wkspc_id, | |||
1471 | // gets updated | 1464 | // gets updated |
1472 | m_clientlist_sig.notify(); | 1465 | m_clientlist_sig.notify(); |
1473 | } else if (ignore_sticky || ! w->isStuck()) { | 1466 | } else if (ignore_sticky || ! w->isStuck()) { |
1474 | getWorkspace(w->workspaceNumber())->removeWindow(w); | 1467 | getWorkspace(w->workspaceNumber())->removeWindow(w, true); |
1475 | getWorkspace(wkspc_id)->addWindow(*w); | 1468 | getWorkspace(wkspc_id)->addWindow(*w); |
1476 | // see comment above | 1469 | // see comment above |
1477 | m_clientlist_sig.notify(); | 1470 | m_clientlist_sig.notify(); |
@@ -2544,8 +2537,25 @@ WinClient *BScreen::getLastFocusedWindow(int workspace) { | |||
2544 | return 0; | 2537 | return 0; |
2545 | } | 2538 | } |
2546 | 2539 | ||
2540 | /** | ||
2541 | * Used to find out which window was last active in the given group | ||
2542 | * If ignore_client is given, it excludes that client. | ||
2543 | * Stuck, iconic etc don't matter within a group | ||
2544 | */ | ||
2545 | WinClient *BScreen::getLastFocusedWindow(FluxboxWindow &group, WinClient *ignore_client) { | ||
2546 | if (focused_list.empty()) return 0; | ||
2547 | |||
2548 | FocusedWindows::iterator it = focused_list.begin(); | ||
2549 | FocusedWindows::iterator it_end = focused_list.end(); | ||
2550 | for (; it != it_end; ++it) { | ||
2551 | if (((*it)->fbwindow() == &group) && | ||
2552 | (*it) != ignore_client) | ||
2553 | return *it; | ||
2554 | } | ||
2555 | return 0; | ||
2556 | } | ||
2557 | |||
2547 | void BScreen::updateSize() { | 2558 | void BScreen::updateSize() { |
2548 | cerr<<"update Size"<<endl; | ||
2549 | // force update geometry | 2559 | // force update geometry |
2550 | rootWindow().updateGeometry(); | 2560 | rootWindow().updateGeometry(); |
2551 | 2561 | ||
diff --git a/src/Screen.hh b/src/Screen.hh index ced6f66..070c45a 100644 --- a/src/Screen.hh +++ b/src/Screen.hh | |||
@@ -22,7 +22,7 @@ | |||
22 | // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER | 22 | // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER |
23 | // DEALINGS IN THE SOFTWARE. | 23 | // DEALINGS IN THE SOFTWARE. |
24 | 24 | ||
25 | // $Id: Screen.hh,v 1.134 2004/01/19 18:28:58 fluxgen Exp $ | 25 | // $Id: Screen.hh,v 1.135 2004/03/21 09:00:25 rathnor Exp $ |
26 | 26 | ||
27 | #ifndef SCREEN_HH | 27 | #ifndef SCREEN_HH |
28 | #define SCREEN_HH | 28 | #define SCREEN_HH |
@@ -147,6 +147,7 @@ public: | |||
147 | inline const FocusedWindows &getFocusedList() const { return focused_list; } | 147 | inline const FocusedWindows &getFocusedList() const { return focused_list; } |
148 | inline FocusedWindows &getFocusedList() { return focused_list; } | 148 | inline FocusedWindows &getFocusedList() { return focused_list; } |
149 | WinClient *getLastFocusedWindow(int workspace = -1); | 149 | WinClient *getLastFocusedWindow(int workspace = -1); |
150 | WinClient *getLastFocusedWindow(FluxboxWindow &group, WinClient *ignore_client = 0); | ||
150 | const Workspaces &getWorkspacesList() const { return m_workspaces_list; } | 151 | const Workspaces &getWorkspacesList() const { return m_workspaces_list; } |
151 | Workspaces &getWorkspacesList() { return m_workspaces_list; } | 152 | Workspaces &getWorkspacesList() { return m_workspaces_list; } |
152 | const WorkspaceNames &getWorkspaceNames() const { return m_workspace_names; } | 153 | const WorkspaceNames &getWorkspaceNames() const { return m_workspace_names; } |
diff --git a/src/Window.cc b/src/Window.cc index 6d9a344..5a93385 100644 --- a/src/Window.cc +++ b/src/Window.cc | |||
@@ -22,7 +22,7 @@ | |||
22 | // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER | 22 | // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER |
23 | // DEALINGS IN THE SOFTWARE. | 23 | // DEALINGS IN THE SOFTWARE. |
24 | 24 | ||
25 | // $Id: Window.cc,v 1.270 2004/03/08 12:20:31 rathnor Exp $ | 25 | // $Id: Window.cc,v 1.271 2004/03/21 09:00:25 rathnor Exp $ |
26 | 26 | ||
27 | #include "Window.hh" | 27 | #include "Window.hh" |
28 | 28 | ||
@@ -784,15 +784,11 @@ bool FluxboxWindow::removeClient(WinClient &client) { | |||
784 | 784 | ||
785 | // if it is our active client, deal with it... | 785 | // if it is our active client, deal with it... |
786 | if (m_client == &client) { | 786 | if (m_client == &client) { |
787 | // set next client to be focused | 787 | WinClient *next_client = screen().getLastFocusedWindow(*this, m_client); |
788 | // if the client we're about to remove is the last client then set prev client | 788 | if (next_client != 0) |
789 | if (&client == m_clientlist.back()) | 789 | setCurrentClient(*next_client, false); |
790 | prevClient(); | ||
791 | else | ||
792 | nextClient(); | ||
793 | } | 790 | } |
794 | 791 | ||
795 | client.m_win = 0; | ||
796 | m_clientlist.remove(&client); | 792 | m_clientlist.remove(&client); |
797 | 793 | ||
798 | if (m_client == &client) { | 794 | if (m_client == &client) { |
@@ -815,12 +811,12 @@ bool FluxboxWindow::removeClient(WinClient &client) { | |||
815 | } | 811 | } |
816 | 812 | ||
817 | m_labelbuttons.erase(&client); | 813 | m_labelbuttons.erase(&client); |
818 | |||
819 | frame().reconfigure(); | 814 | frame().reconfigure(); |
815 | updateClientLeftWindow(); | ||
820 | 816 | ||
821 | #ifdef DEBUG | 817 | #ifdef DEBUG |
822 | cerr<<__FILE__<<"("<<__FUNCTION__<<")["<<this<<"] numClients = "<<numClients()<<endl; | 818 | cerr<<__FILE__<<"("<<__FUNCTION__<<")["<<this<<"] numClients = "<<numClients()<<endl; |
823 | #endif // DEBUG | 819 | #endif // DEBUG |
824 | 820 | ||
825 | return true; | 821 | return true; |
826 | } | 822 | } |
@@ -905,6 +901,9 @@ void FluxboxWindow::moveClientRight() { | |||
905 | 901 | ||
906 | /// Update LEFT window atom on all clients. | 902 | /// Update LEFT window atom on all clients. |
907 | void FluxboxWindow::updateClientLeftWindow() { | 903 | void FluxboxWindow::updateClientLeftWindow() { |
904 | if (clientList().empty()) | ||
905 | return; | ||
906 | |||
908 | // It should just update the affected clients but that | 907 | // It should just update the affected clients but that |
909 | // would require more complex code and we're assuming | 908 | // would require more complex code and we're assuming |
910 | // the user dont have alot of windows grouped so this | 909 | // the user dont have alot of windows grouped so this |
@@ -929,8 +928,11 @@ bool FluxboxWindow::setCurrentClient(WinClient &client, bool setinput) { | |||
929 | 928 | ||
930 | m_client = &client; | 929 | m_client = &client; |
931 | m_client->raise(); | 930 | m_client->raise(); |
931 | |||
932 | // frame focused doesn't necessarily mean input focused | ||
933 | frame().setLabelButtonFocus(*m_labelbuttons[m_client]); | ||
934 | |||
932 | if (setinput && setInputFocus()) { | 935 | if (setinput && setInputFocus()) { |
933 | frame().setLabelButtonFocus(*m_labelbuttons[m_client]); | ||
934 | return true; | 936 | return true; |
935 | } | 937 | } |
936 | 938 | ||
@@ -1242,7 +1244,6 @@ bool FluxboxWindow::setInputFocus() { | |||
1242 | } else { | 1244 | } else { |
1243 | ret = m_client->sendFocus(); | 1245 | ret = m_client->sendFocus(); |
1244 | } | 1246 | } |
1245 | |||
1246 | 1247 | ||
1247 | return ret; | 1248 | return ret; |
1248 | } | 1249 | } |
@@ -1296,10 +1297,7 @@ void FluxboxWindow::iconify() { | |||
1296 | } | 1297 | } |
1297 | } | 1298 | } |
1298 | 1299 | ||
1299 | WinClient *focused_client = Fluxbox::instance()->getFocusedWindow(); | 1300 | // focus revert is done elsewhere (based on signal) |
1300 | if (focused_client && focused_client->fbwindow() == this) | ||
1301 | Fluxbox::instance()->revertFocus(screen()); | ||
1302 | |||
1303 | } | 1301 | } |
1304 | 1302 | ||
1305 | void FluxboxWindow::deiconify(bool reassoc, bool do_raise) { | 1303 | void FluxboxWindow::deiconify(bool reassoc, bool do_raise) { |
diff --git a/src/Window.hh b/src/Window.hh index f6cb3d0..0c80669 100644 --- a/src/Window.hh +++ b/src/Window.hh | |||
@@ -22,7 +22,7 @@ | |||
22 | // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER | 22 | // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER |
23 | // DEALINGS IN THE SOFTWARE. | 23 | // DEALINGS IN THE SOFTWARE. |
24 | 24 | ||
25 | // $Id: Window.hh,v 1.109 2004/02/20 09:07:27 fluxgen Exp $ | 25 | // $Id: Window.hh,v 1.110 2004/03/21 09:00:25 rathnor Exp $ |
26 | 26 | ||
27 | #ifndef WINDOW_HH | 27 | #ifndef WINDOW_HH |
28 | #define WINDOW_HH | 28 | #define WINDOW_HH |
@@ -281,6 +281,7 @@ public: | |||
281 | inline bool isResizing() const { return resizing; } | 281 | inline bool isResizing() const { return resizing; } |
282 | bool isGroupable() const; | 282 | bool isGroupable() const; |
283 | inline int numClients() const { return m_clientlist.size(); } | 283 | inline int numClients() const { return m_clientlist.size(); } |
284 | inline bool empty() const { return m_clientlist.empty(); } | ||
284 | inline ClientList &clientList() { return m_clientlist; } | 285 | inline ClientList &clientList() { return m_clientlist; } |
285 | inline const ClientList &clientList() const { return m_clientlist; } | 286 | inline const ClientList &clientList() const { return m_clientlist; } |
286 | inline WinClient &winClient() { return *m_client; } | 287 | inline WinClient &winClient() { return *m_client; } |
@@ -370,6 +371,7 @@ public: | |||
370 | }; | 371 | }; |
371 | 372 | ||
372 | bool oplock; ///< Used to help stop transient loops occurring by locking a window during certain operations | 373 | bool oplock; ///< Used to help stop transient loops occurring by locking a window during certain operations |
374 | |||
373 | private: | 375 | private: |
374 | static const int PropBlackboxAttributesElements = 8; | 376 | static const int PropBlackboxAttributesElements = 8; |
375 | 377 | ||
diff --git a/src/Workspace.cc b/src/Workspace.cc index 33818ad..da6d9c1 100644 --- a/src/Workspace.cc +++ b/src/Workspace.cc | |||
@@ -22,7 +22,7 @@ | |||
22 | // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER | 22 | // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER |
23 | // DEALINGS IN THE SOFTWARE. | 23 | // DEALINGS IN THE SOFTWARE. |
24 | 24 | ||
25 | // $Id: Workspace.cc,v 1.94 2004/03/15 23:36:13 rathnor Exp $ | 25 | // $Id: Workspace.cc,v 1.95 2004/03/21 09:00:25 rathnor Exp $ |
26 | 26 | ||
27 | #include "Workspace.hh" | 27 | #include "Workspace.hh" |
28 | 28 | ||
@@ -167,8 +167,11 @@ void Workspace::addWindow(FluxboxWindow &w, bool place) { | |||
167 | 167 | ||
168 | } | 168 | } |
169 | 169 | ||
170 | 170 | // still_alive is true if the window will continue to exist after | |
171 | int Workspace::removeWindow(FluxboxWindow *w) { | 171 | // this event. Particularly, this isn't the removeWindow for |
172 | // the destruction of the window. Because if so, the focus revert | ||
173 | // is done in another place | ||
174 | int Workspace::removeWindow(FluxboxWindow *w, bool still_alive) { | ||
172 | 175 | ||
173 | if (w == 0) | 176 | if (w == 0) |
174 | return -1; | 177 | return -1; |
@@ -180,27 +183,8 @@ int Workspace::removeWindow(FluxboxWindow *w) { | |||
180 | m_lastfocus = 0; | 183 | m_lastfocus = 0; |
181 | } | 184 | } |
182 | 185 | ||
183 | if (w->isFocused()) { | 186 | if (w->isFocused() && still_alive) |
184 | if (screen().isSloppyFocus()) { | 187 | Fluxbox::instance()->unfocusWindow(w->winClient(), true, true); |
185 | Fluxbox::instance()->revertFocus(screen()); | ||
186 | } else { | ||
187 | // go up the transient tree looking for a focusable window | ||
188 | WinClient *client = 0; | ||
189 | if (w->numClients() > 0) { | ||
190 | client = w->winClient().transientFor(); | ||
191 | while (client) { | ||
192 | if (client->fbwindow() && | ||
193 | client->fbwindow() != w && // can't be this window | ||
194 | client->fbwindow()->isVisible() && | ||
195 | client->fbwindow()->setCurrentClient(*client, true)) | ||
196 | break; | ||
197 | client = client->transientFor(); | ||
198 | } | ||
199 | } | ||
200 | if (client == 0) // we were unsuccessful | ||
201 | Fluxbox::instance()->revertFocus(screen()); | ||
202 | } | ||
203 | } | ||
204 | 188 | ||
205 | // we don't remove it from the layermanager, as it may be being moved | 189 | // we don't remove it from the layermanager, as it may be being moved |
206 | Windows::iterator erase_it = remove(m_windowlist.begin(), | 190 | Windows::iterator erase_it = remove(m_windowlist.begin(), |
diff --git a/src/Workspace.hh b/src/Workspace.hh index 55479b3..c2b02f3 100644 --- a/src/Workspace.hh +++ b/src/Workspace.hh | |||
@@ -62,7 +62,7 @@ public: | |||
62 | void reconfigure(); | 62 | void reconfigure(); |
63 | void shutdown(); | 63 | void shutdown(); |
64 | void addWindow(FluxboxWindow &win, bool place = false); | 64 | void addWindow(FluxboxWindow &win, bool place = false); |
65 | int removeWindow(FluxboxWindow *win); | 65 | int removeWindow(FluxboxWindow *win, bool still_alive); |
66 | void updateClientmenu(); | 66 | void updateClientmenu(); |
67 | 67 | ||
68 | BScreen &screen() { return m_screen; } | 68 | BScreen &screen() { return m_screen; } |
diff --git a/src/fluxbox.cc b/src/fluxbox.cc index dd70d6c..d32840a 100644 --- a/src/fluxbox.cc +++ b/src/fluxbox.cc | |||
@@ -22,7 +22,7 @@ | |||
22 | // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER | 22 | // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER |
23 | // DEALINGS IN THE SOFTWARE. | 23 | // DEALINGS IN THE SOFTWARE. |
24 | 24 | ||
25 | // $Id: fluxbox.cc,v 1.234 2004/03/03 12:53:06 rathnor Exp $ | 25 | // $Id: fluxbox.cc,v 1.235 2004/03/21 09:00:25 rathnor Exp $ |
26 | 26 | ||
27 | #include "fluxbox.hh" | 27 | #include "fluxbox.hh" |
28 | 28 | ||
@@ -1321,7 +1321,7 @@ void Fluxbox::update(FbTk::Subject *changedsub) { | |||
1321 | if (win.isIconic()) { | 1321 | if (win.isIconic()) { |
1322 | Workspace *space = win.screen().getWorkspace(win.workspaceNumber()); | 1322 | Workspace *space = win.screen().getWorkspace(win.workspaceNumber()); |
1323 | if (space != 0) | 1323 | if (space != 0) |
1324 | space->removeWindow(&win); | 1324 | space->removeWindow(&win, true); |
1325 | win.screen().addIcon(&win); | 1325 | win.screen().addIcon(&win); |
1326 | } | 1326 | } |
1327 | 1327 | ||
@@ -1409,8 +1409,14 @@ void Fluxbox::update(FbTk::Subject *changedsub) { | |||
1409 | // finaly send notify signal | 1409 | // finaly send notify signal |
1410 | screen.updateNetizenWindowDel(client.window()); | 1410 | screen.updateNetizenWindowDel(client.window()); |
1411 | 1411 | ||
1412 | if (m_focused_window == &client) | 1412 | // At this point, we trust that this client is no longer in the |
1413 | revertFocus(screen); | 1413 | // client list of its frame (but it still has reference to the frame) |
1414 | // We also assume that any remaining active one is the last focused one | ||
1415 | |||
1416 | // This is where we revert focus on window close | ||
1417 | // NOWHERE ELSE!!! | ||
1418 | if (m_focused_window == &client) | ||
1419 | unfocusWindow(client); | ||
1414 | 1420 | ||
1415 | // failed to revert focus? | 1421 | // failed to revert focus? |
1416 | if (m_focused_window == &client) | 1422 | if (m_focused_window == &client) |
@@ -1992,6 +1998,54 @@ void Fluxbox::revertFocus(BScreen &screen) { | |||
1992 | } | 1998 | } |
1993 | } | 1999 | } |
1994 | 2000 | ||
2001 | /* | ||
2002 | * Like revertFocus, but specifically related to this window (transients etc) | ||
2003 | * if full_revert, we fallback to a full revertFocus if we can't find anything | ||
2004 | * local to the client. | ||
2005 | * If unfocus_frame is true, we won't focus anything in the same frame | ||
2006 | * as the client. | ||
2007 | * | ||
2008 | * So, we first prefer to choose a transient parent, then the last | ||
2009 | * client in this window, and if no luck (or unfocus_frame), then | ||
2010 | * we just use the normal revertFocus on the screen. | ||
2011 | * | ||
2012 | * assumption: client has focus | ||
2013 | */ | ||
2014 | void Fluxbox::unfocusWindow(WinClient &client, bool full_revert, bool unfocus_frame) { | ||
2015 | // go up the transient tree looking for a focusable window | ||
2016 | |||
2017 | FluxboxWindow *fbwin = client.fbwindow(); | ||
2018 | if (fbwin == 0) | ||
2019 | unfocus_frame = false; | ||
2020 | |||
2021 | WinClient *trans_parent = client.transientFor(); | ||
2022 | while (trans_parent) { | ||
2023 | if (trans_parent->fbwindow() && // can't focus if no fbwin | ||
2024 | (!unfocus_frame || trans_parent->fbwindow() != fbwin) && // can't be this window | ||
2025 | trans_parent->fbwindow()->isVisible() && | ||
2026 | trans_parent->fbwindow()->setCurrentClient(*trans_parent, m_focused_window == &client)) { | ||
2027 | return; | ||
2028 | } | ||
2029 | trans_parent = trans_parent->transientFor(); | ||
2030 | } | ||
2031 | |||
2032 | if (fbwin == 0) | ||
2033 | return; // nothing more we can do | ||
2034 | |||
2035 | BScreen &screen = fbwin->screen(); | ||
2036 | |||
2037 | if (!unfocus_frame) { | ||
2038 | WinClient *last_focus = screen.getLastFocusedWindow(*fbwin, &client); | ||
2039 | if (last_focus != 0 && | ||
2040 | fbwin->setCurrentClient(*last_focus, m_focused_window == &client)) { | ||
2041 | return; | ||
2042 | } | ||
2043 | } | ||
2044 | |||
2045 | if (full_revert && m_focused_window == &client) | ||
2046 | revertFocus(screen); | ||
2047 | |||
2048 | } | ||
1995 | 2049 | ||
1996 | 2050 | ||
1997 | void Fluxbox::watchKeyRelease(BScreen &screen, unsigned int mods) { | 2051 | void Fluxbox::watchKeyRelease(BScreen &screen, unsigned int mods) { |
diff --git a/src/fluxbox.hh b/src/fluxbox.hh index 184ffd2..f063a1b 100644 --- a/src/fluxbox.hh +++ b/src/fluxbox.hh | |||
@@ -22,7 +22,7 @@ | |||
22 | // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER | 22 | // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER |
23 | // DEALINGS IN THE SOFTWARE. | 23 | // DEALINGS IN THE SOFTWARE. |
24 | 24 | ||
25 | // $Id: fluxbox.hh,v 1.83 2004/02/10 18:45:57 fluxgen Exp $ | 25 | // $Id: fluxbox.hh,v 1.84 2004/03/21 09:00:25 rathnor Exp $ |
26 | 26 | ||
27 | #ifndef FLUXBOX_HH | 27 | #ifndef FLUXBOX_HH |
28 | #define FLUXBOX_HH | 28 | #define FLUXBOX_HH |
@@ -157,6 +157,8 @@ public: | |||
157 | 157 | ||
158 | void setFocusedWindow(WinClient *w); | 158 | void setFocusedWindow(WinClient *w); |
159 | void revertFocus(BScreen &screen); | 159 | void revertFocus(BScreen &screen); |
160 | // like revertFocus, but specifically related to this window (transients etc) | ||
161 | void unfocusWindow(WinClient &client, bool full_revert = true, bool unfocus_frame = false); | ||
160 | void shutdown(); | 162 | void shutdown(); |
161 | void load_rc(BScreen &scr); | 163 | void load_rc(BScreen &scr); |
162 | void loadRootCommand(BScreen &scr); | 164 | void loadRootCommand(BScreen &scr); |