mirror of
https://github.com/RGBCube/serenity
synced 2025-07-25 09:57:35 +00:00
WindowServer: Make the ordering in the window switcher a bit more sane.
This commit is contained in:
parent
a20ce4d2b8
commit
8c4b7fe385
2 changed files with 14 additions and 11 deletions
|
@ -131,8 +131,8 @@ private:
|
||||||
void start_window_drag(WSWindow&, const WSMouseEvent&);
|
void start_window_drag(WSWindow&, const WSMouseEvent&);
|
||||||
void handle_client_request(const WSAPIClientRequest&);
|
void handle_client_request(const WSAPIClientRequest&);
|
||||||
void set_hovered_window(WSWindow*);
|
void set_hovered_window(WSWindow*);
|
||||||
template<typename Callback> IterationDecision for_each_visible_window_of_type_from_back_to_front(WSWindowType, Callback);
|
template<typename Callback> IterationDecision for_each_visible_window_of_type_from_back_to_front(WSWindowType, Callback, bool ignore_highlight = false);
|
||||||
template<typename Callback> IterationDecision for_each_visible_window_of_type_from_front_to_back(WSWindowType, Callback);
|
template<typename Callback> IterationDecision for_each_visible_window_of_type_from_front_to_back(WSWindowType, Callback, bool ignore_highlight = false);
|
||||||
template<typename Callback> IterationDecision for_each_visible_window_from_front_to_back(Callback);
|
template<typename Callback> IterationDecision for_each_visible_window_from_front_to_back(Callback);
|
||||||
template<typename Callback> IterationDecision for_each_visible_window_from_back_to_front(Callback);
|
template<typename Callback> IterationDecision for_each_visible_window_from_back_to_front(Callback);
|
||||||
template<typename Callback> void for_each_window_listening_to_wm_events(Callback);
|
template<typename Callback> void for_each_window_listening_to_wm_events(Callback);
|
||||||
|
@ -234,7 +234,7 @@ private:
|
||||||
};
|
};
|
||||||
|
|
||||||
template<typename Callback>
|
template<typename Callback>
|
||||||
IterationDecision WSWindowManager::for_each_visible_window_of_type_from_back_to_front(WSWindowType type, Callback callback)
|
IterationDecision WSWindowManager::for_each_visible_window_of_type_from_back_to_front(WSWindowType type, Callback callback, bool ignore_highlight)
|
||||||
{
|
{
|
||||||
bool do_highlight_window_at_end = false;
|
bool do_highlight_window_at_end = false;
|
||||||
for (auto* window = m_windows_in_order.head(); window; window = window->next()) {
|
for (auto* window = m_windows_in_order.head(); window; window = window->next()) {
|
||||||
|
@ -244,7 +244,7 @@ IterationDecision WSWindowManager::for_each_visible_window_of_type_from_back_to_
|
||||||
continue;
|
continue;
|
||||||
if (window->type() != type)
|
if (window->type() != type)
|
||||||
continue;
|
continue;
|
||||||
if (m_highlight_window == window) {
|
if (!ignore_highlight && m_highlight_window == window) {
|
||||||
do_highlight_window_at_end = true;
|
do_highlight_window_at_end = true;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@ -273,9 +273,9 @@ IterationDecision WSWindowManager::for_each_visible_window_from_back_to_front(Ca
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename Callback>
|
template<typename Callback>
|
||||||
IterationDecision WSWindowManager::for_each_visible_window_of_type_from_front_to_back(WSWindowType type, Callback callback)
|
IterationDecision WSWindowManager::for_each_visible_window_of_type_from_front_to_back(WSWindowType type, Callback callback, bool ignore_highlight)
|
||||||
{
|
{
|
||||||
if (m_highlight_window && m_highlight_window->type() == type && m_highlight_window->is_visible()) {
|
if (!ignore_highlight && m_highlight_window && m_highlight_window->type() == type && m_highlight_window->is_visible()) {
|
||||||
if (callback(*m_highlight_window) == IterationDecision::Abort)
|
if (callback(*m_highlight_window) == IterationDecision::Abort)
|
||||||
return IterationDecision::Abort;
|
return IterationDecision::Abort;
|
||||||
}
|
}
|
||||||
|
@ -287,7 +287,7 @@ IterationDecision WSWindowManager::for_each_visible_window_of_type_from_front_to
|
||||||
continue;
|
continue;
|
||||||
if (window->type() != type)
|
if (window->type() != type)
|
||||||
continue;
|
continue;
|
||||||
if (window == m_highlight_window)
|
if (!ignore_highlight && window == m_highlight_window)
|
||||||
continue;
|
continue;
|
||||||
if (callback(*window) == IterationDecision::Abort)
|
if (callback(*window) == IterationDecision::Abort)
|
||||||
return IterationDecision::Abort;
|
return IterationDecision::Abort;
|
||||||
|
|
|
@ -105,21 +105,24 @@ void WSWindowSwitcher::draw()
|
||||||
|
|
||||||
void WSWindowSwitcher::refresh()
|
void WSWindowSwitcher::refresh()
|
||||||
{
|
{
|
||||||
|
auto& wm = WSWindowManager::the();
|
||||||
WSWindow* selected_window = nullptr;
|
WSWindow* selected_window = nullptr;
|
||||||
if (m_selected_index > 0 && m_windows[m_selected_index])
|
if (m_selected_index > 0 && m_windows[m_selected_index])
|
||||||
selected_window = m_windows[m_selected_index].ptr();
|
selected_window = m_windows[m_selected_index].ptr();
|
||||||
|
if (!selected_window)
|
||||||
|
selected_window = wm.highlight_window() ? wm.highlight_window() : wm.active_window();
|
||||||
m_windows.clear();
|
m_windows.clear();
|
||||||
m_selected_index = 0;
|
m_selected_index = 0;
|
||||||
int window_count = 0;
|
int window_count = 0;
|
||||||
int longest_title_width = 0;
|
int longest_title_width = 0;
|
||||||
WSWindowManager::the().for_each_visible_window_of_type_from_back_to_front(WSWindowType::Normal, [&] (WSWindow& window) {
|
wm.for_each_visible_window_of_type_from_front_to_back(WSWindowType::Normal, [&] (WSWindow& window) {
|
||||||
++window_count;
|
++window_count;
|
||||||
longest_title_width = max(longest_title_width, WSWindowManager::the().font().width(window.title()));
|
longest_title_width = max(longest_title_width, wm.font().width(window.title()));
|
||||||
if (selected_window == &window)
|
if (selected_window == &window)
|
||||||
m_selected_index = m_windows.size();
|
m_selected_index = m_windows.size();
|
||||||
m_windows.append(window.make_weak_ptr());
|
m_windows.append(window.make_weak_ptr());
|
||||||
return IterationDecision::Continue;
|
return IterationDecision::Continue;
|
||||||
});
|
}, true);
|
||||||
if (m_windows.is_empty()) {
|
if (m_windows.is_empty()) {
|
||||||
hide();
|
hide();
|
||||||
return;
|
return;
|
||||||
|
@ -127,7 +130,7 @@ void WSWindowSwitcher::refresh()
|
||||||
int space_for_window_rect = 180;
|
int space_for_window_rect = 180;
|
||||||
m_rect.set_width(thumbnail_width() + longest_title_width + space_for_window_rect + padding() * 2 + item_padding() * 2);
|
m_rect.set_width(thumbnail_width() + longest_title_width + space_for_window_rect + padding() * 2 + item_padding() * 2);
|
||||||
m_rect.set_height(window_count * item_height() + padding() * 2);
|
m_rect.set_height(window_count * item_height() + padding() * 2);
|
||||||
m_rect.center_within(WSWindowManager::the().m_screen_rect);
|
m_rect.center_within(wm.m_screen_rect);
|
||||||
if (!m_switcher_window)
|
if (!m_switcher_window)
|
||||||
m_switcher_window = make<WSWindow>(*this, WSWindowType::WindowSwitcher);
|
m_switcher_window = make<WSWindow>(*this, WSWindowType::WindowSwitcher);
|
||||||
m_switcher_window->set_rect(m_rect);
|
m_switcher_window->set_rect(m_rect);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue