diff options
-rw-r--r-- | ChangeLog | 3 | ||||
-rw-r--r-- | src/FocusControl.cc | 33 |
2 files changed, 21 insertions, 15 deletions
@@ -1,5 +1,8 @@ | |||
1 | (Format: Year/Month/Day) | 1 | (Format: Year/Month/Day) |
2 | Changes for 1.0.1: | 2 | Changes for 1.0.1: |
3 | *07/11/08: | ||
4 | * Fix crash when cycling focus and window closes, bug #1787345 (Mark) | ||
5 | FocusControl.cc | ||
3 | *07/11/04: | 6 | *07/11/04: |
4 | * Update autoraise delay on reconfigure (Mark) | 7 | * Update autoraise delay on reconfigure (Mark) |
5 | Window.cc | 8 | Window.cc |
diff --git a/src/FocusControl.cc b/src/FocusControl.cc index 4aa896b..8e6b895 100644 --- a/src/FocusControl.cc +++ b/src/FocusControl.cc | |||
@@ -137,6 +137,7 @@ void FocusControl::cycleFocus(const Focusables &window_list, | |||
137 | if (!doSkipWindow(**it, pat) && (*it)->focus()) | 137 | if (!doSkipWindow(**it, pat) && (*it)->focus()) |
138 | break; | 138 | break; |
139 | } | 139 | } |
140 | m_cycling_window = it; | ||
140 | 141 | ||
141 | // if we're still in the same fbwin, there's nothing else to do | 142 | // if we're still in the same fbwin, there's nothing else to do |
142 | if (m_cycling_last && m_cycling_last->fbwindow() == fbwin) | 143 | if (m_cycling_last && m_cycling_last->fbwindow() == fbwin) |
@@ -159,7 +160,6 @@ void FocusControl::cycleFocus(const Focusables &window_list, | |||
159 | if (!isCycling()) | 160 | if (!isCycling()) |
160 | fbwin->raise(); | 161 | fbwin->raise(); |
161 | 162 | ||
162 | m_cycling_window = it; | ||
163 | m_cycling_last = last_client; | 163 | m_cycling_last = last_client; |
164 | m_was_iconic = was_iconic; | 164 | m_was_iconic = was_iconic; |
165 | 165 | ||
@@ -242,18 +242,14 @@ void FocusControl::stopCyclingFocus() { | |||
242 | if (m_cycling_list == 0) | 242 | if (m_cycling_list == 0) |
243 | return; | 243 | return; |
244 | 244 | ||
245 | Focusables::const_iterator it_end = m_cycling_list->end(); | ||
246 | m_cycling_last = 0; | 245 | m_cycling_last = 0; |
247 | m_cycling_list = 0; | 246 | m_cycling_list = 0; |
248 | 247 | ||
249 | // put currently focused window to top | 248 | // put currently focused window to top |
250 | // the iterator may be invalid if the window died | 249 | if (s_focused_window) { |
251 | // in which case we'll do a proper revert focus | 250 | setScreenFocusedWindow(*s_focused_window); |
252 | if (m_cycling_window != it_end && (*m_cycling_window)->fbwindow() && | 251 | if (s_focused_fbwindow) |
253 | (*m_cycling_window)->fbwindow()->isVisible()) { | 252 | s_focused_fbwindow->raise(); |
254 | (*m_cycling_window)->fbwindow()->raise(); | ||
255 | if (s_focused_window) | ||
256 | setScreenFocusedWindow(*s_focused_window); | ||
257 | } else | 253 | } else |
258 | revertFocus(m_screen); | 254 | revertFocus(m_screen); |
259 | } | 255 | } |
@@ -439,24 +435,31 @@ void FocusControl::removeClient(WinClient &client) { | |||
439 | if (client.screen().isShuttingdown()) | 435 | if (client.screen().isShuttingdown()) |
440 | return; | 436 | return; |
441 | 437 | ||
442 | Focusable *cyc = 0; | ||
443 | if (m_cycling_list && m_cycling_window != m_cycling_list->end()) | ||
444 | cyc = *m_cycling_window; | ||
445 | |||
446 | m_focused_list.remove(&client); | 438 | m_focused_list.remove(&client); |
447 | m_creation_order_list.remove(&client); | 439 | m_creation_order_list.remove(&client); |
448 | client.screen().clientListSig().notify(); | 440 | client.screen().clientListSig().notify(); |
449 | 441 | ||
450 | if (cyc == &client) { | 442 | if (m_cycling_list && m_cycling_window != m_cycling_list->end() && |
443 | *m_cycling_window == &client) { | ||
451 | m_cycling_window = m_cycling_list->end(); | 444 | m_cycling_window = m_cycling_list->end(); |
452 | stopCyclingFocus(); | 445 | stopCyclingFocus(); |
453 | } | 446 | } else if (m_cycling_last == &client) |
447 | m_cycling_last = 0; | ||
454 | } | 448 | } |
455 | 449 | ||
456 | void FocusControl::removeWindow(Focusable &win) { | 450 | void FocusControl::removeWindow(Focusable &win) { |
451 | if (win.screen().isShuttingdown()) | ||
452 | return; | ||
453 | |||
457 | m_focused_win_list.remove(&win); | 454 | m_focused_win_list.remove(&win); |
458 | m_creation_order_win_list.remove(&win); | 455 | m_creation_order_win_list.remove(&win); |
459 | win.screen().clientListSig().notify(); | 456 | win.screen().clientListSig().notify(); |
457 | |||
458 | if (m_cycling_list && m_cycling_window != m_cycling_list->end() && | ||
459 | *m_cycling_window == &win) { | ||
460 | m_cycling_window = m_cycling_list->end(); | ||
461 | stopCyclingFocus(); | ||
462 | } | ||
460 | } | 463 | } |
461 | 464 | ||
462 | void FocusControl::shutdown() { | 465 | void FocusControl::shutdown() { |