diff options
Diffstat (limited to 'src/FocusControl.cc')
-rw-r--r-- | src/FocusControl.cc | 41 |
1 files changed, 20 insertions, 21 deletions
diff --git a/src/FocusControl.cc b/src/FocusControl.cc index 6f919ef..6b4f64a 100644 --- a/src/FocusControl.cc +++ b/src/FocusControl.cc | |||
@@ -57,6 +57,7 @@ FocusControl::FocusControl(BScreen &screen): | |||
57 | screen.name()+".focusNewWindows", | 57 | screen.name()+".focusNewWindows", |
58 | screen.altName()+".FocusNewWindows"), | 58 | screen.altName()+".FocusNewWindows"), |
59 | m_cycling_focus(false), | 59 | m_cycling_focus(false), |
60 | m_was_iconic(false), | ||
60 | m_cycling_last(0) { | 61 | m_cycling_last(0) { |
61 | 62 | ||
62 | m_cycling_window = m_focused_list.end(); | 63 | m_cycling_window = m_focused_list.end(); |
@@ -73,38 +74,29 @@ bool doSkipWindow(const WinClient &winclient, int opts) { | |||
73 | (opts & FocusControl::CYCLEGROUPS) != 0 && win->winClient().window() != winclient.window() || | 74 | (opts & FocusControl::CYCLEGROUPS) != 0 && win->winClient().window() != winclient.window() || |
74 | // skip if shaded | 75 | // skip if shaded |
75 | (opts & FocusControl::CYCLESKIPSHADED) != 0 && win->isShaded() || | 76 | (opts & FocusControl::CYCLESKIPSHADED) != 0 && win->isShaded() || |
77 | // skip if iconic | ||
78 | (opts & FocusControl::CYCLESKIPICONIC) != 0 && win->isIconic() || | ||
76 | // skip if hidden | 79 | // skip if hidden |
77 | win->isFocusHidden() | 80 | win->isFocusHidden() |
78 | ); | 81 | ); |
79 | } | 82 | } |
80 | 83 | ||
81 | void FocusControl::cycleFocus(int opts, bool cycle_reverse) { | 84 | void FocusControl::cycleFocus(int opts, bool cycle_reverse) { |
82 | int num_windows = m_screen.currentWorkspace()->numberOfWindows(); | ||
83 | |||
84 | if (num_windows < 1) | ||
85 | return; | ||
86 | 85 | ||
87 | FocusedWindows *window_list = (opts & CYCLELINEAR) ? &m_creation_order_list : &m_focused_list; | 86 | FocusedWindows *window_list = (opts & CYCLELINEAR) ? &m_creation_order_list : &m_focused_list; |
88 | if (!m_cycling_focus) { | 87 | if (!m_cycling_focus) { |
89 | if (Fluxbox::instance()->watchingScreen()) | 88 | if (&m_screen == Fluxbox::instance()->watchingScreen()) |
90 | m_cycling_focus = true; | 89 | m_cycling_focus = true; |
91 | if (opts & CYCLELINEAR) { | 90 | m_cycling_window = find(window_list->begin(),window_list->end(),s_focused_window); |
92 | m_cycling_creation_order = true; | 91 | m_cycling_creation_order = (opts & CYCLELINEAR); |
93 | m_cycling_window = find(window_list->begin(),window_list->end(),s_focused_window); | 92 | m_was_iconic = false; |
94 | } else { | ||
95 | m_cycling_creation_order = (opts & CYCLELINEAR); | ||
96 | m_cycling_window = window_list->begin(); | ||
97 | } | ||
98 | m_cycling_last = 0; | 93 | m_cycling_last = 0; |
99 | } else { | 94 | } else { |
100 | // already cycling, so restack to put windows back in their proper order | 95 | // already cycling, so restack to put windows back in their proper order |
101 | m_screen.layerManager().restack(); | 96 | m_screen.layerManager().restack(); |
102 | if (m_cycling_creation_order ^ (bool)(opts & CYCLELINEAR)) { | 97 | if (m_cycling_creation_order ^ (bool)(opts & CYCLELINEAR)) { |
103 | m_cycling_creation_order ^= true; | 98 | m_cycling_creation_order ^= true; |
104 | if (m_cycling_window != m_focused_list.end() && m_cycling_window != m_creation_order_list.end()) | 99 | m_cycling_window = find(window_list->begin(),window_list->end(),*m_cycling_window); |
105 | m_cycling_window = find(window_list->begin(),window_list->end(),*m_cycling_window); | ||
106 | else | ||
107 | m_cycling_window = window_list->begin(); | ||
108 | } | 100 | } |
109 | } | 101 | } |
110 | // if it is stacked, we want the highest window in the focused list | 102 | // if it is stacked, we want the highest window in the focused list |
@@ -116,16 +108,18 @@ void FocusControl::cycleFocus(int opts, bool cycle_reverse) { | |||
116 | while (true) { | 108 | while (true) { |
117 | if (cycle_reverse && it == it_begin) | 109 | if (cycle_reverse && it == it_begin) |
118 | it = it_end; | 110 | it = it_end; |
119 | cycle_reverse ? --it : ++it; | 111 | else if (!cycle_reverse && it == it_end) |
120 | if (it == it_end) | ||
121 | it = it_begin; | 112 | it = it_begin; |
113 | else | ||
114 | cycle_reverse ? --it : ++it; | ||
122 | // give up [do nothing] if we reach the current focused again | 115 | // give up [do nothing] if we reach the current focused again |
123 | if ((*it) == (*m_cycling_window)) | 116 | if (it == m_cycling_window) |
124 | break; | 117 | break; |
118 | if (it == it_end) | ||
119 | continue; | ||
125 | 120 | ||
126 | FluxboxWindow *fbwin = (*it)->fbwindow(); | 121 | FluxboxWindow *fbwin = (*it)->fbwindow(); |
127 | if (fbwin && !fbwin->isIconic() && | 122 | if (fbwin && (fbwin->isStuck() |
128 | (fbwin->isStuck() | ||
129 | || fbwin->workspaceNumber() == m_screen.currentWorkspaceID())) { | 123 | || fbwin->workspaceNumber() == m_screen.currentWorkspaceID())) { |
130 | // either on this workspace, or stuck | 124 | // either on this workspace, or stuck |
131 | 125 | ||
@@ -140,6 +134,9 @@ void FocusControl::cycleFocus(int opts, bool cycle_reverse) { | |||
140 | m_cycling_last->fbwindow()->setCurrentClient(*m_cycling_last, false); | 134 | m_cycling_last->fbwindow()->setCurrentClient(*m_cycling_last, false); |
141 | } | 135 | } |
142 | m_cycling_last = &last_client; | 136 | m_cycling_last = &last_client; |
137 | if (m_was_iconic) | ||
138 | (*m_cycling_window)->fbwindow()->iconify(); | ||
139 | m_was_iconic = fbwin->isIconic(); | ||
143 | } | 140 | } |
144 | fbwin->tempRaise(); | 141 | fbwin->tempRaise(); |
145 | break; | 142 | break; |
@@ -362,6 +359,8 @@ void FocusControl::removeClient(WinClient &client) { | |||
362 | */ | 359 | */ |
363 | void FocusControl::revertFocus(BScreen &screen) { | 360 | void FocusControl::revertFocus(BScreen &screen) { |
364 | 361 | ||
362 | if (screen.focusControl().isCycling()) | ||
363 | return; | ||
365 | // Relevant resources: | 364 | // Relevant resources: |
366 | // resource.focus_last = whether we focus last focused when changing workspace | 365 | // resource.focus_last = whether we focus last focused when changing workspace |
367 | // BScreen::FocusModel = sloppy, click, whatever | 366 | // BScreen::FocusModel = sloppy, click, whatever |