mirror of
https://github.com/RGBCube/serenity
synced 2025-05-31 01:58:12 +00:00
WindowServer: Window iteration should see the highlight window "in front".
This commit is contained in:
parent
420ef4da8a
commit
a149ad9b44
2 changed files with 19 additions and 15 deletions
|
@ -914,12 +914,12 @@ void WSWindowManager::compose()
|
||||||
m_back_painter->blit(dirty_rect.location(), *m_wallpaper, dirty_rect);
|
m_back_painter->blit(dirty_rect.location(), *m_wallpaper, dirty_rect);
|
||||||
}
|
}
|
||||||
|
|
||||||
auto compose_window = [&] (WSWindow& window) {
|
for_each_visible_window_from_back_to_front([&] (WSWindow& window) {
|
||||||
RetainPtr<GraphicsBitmap> backing_store = window.backing_store();
|
RetainPtr<GraphicsBitmap> backing_store = window.backing_store();
|
||||||
if (!backing_store)
|
if (!backing_store)
|
||||||
return;
|
return IterationDecision::Continue;
|
||||||
if (!any_dirty_rect_intersects_window(window))
|
if (!any_dirty_rect_intersects_window(window))
|
||||||
return;
|
return IterationDecision::Continue;
|
||||||
PainterStateSaver saver(*m_back_painter);
|
PainterStateSaver saver(*m_back_painter);
|
||||||
m_back_painter->set_clip_rect(outer_window_rect(window));
|
m_back_painter->set_clip_rect(outer_window_rect(window));
|
||||||
for (auto& dirty_rect : dirty_rects.rects()) {
|
for (auto& dirty_rect : dirty_rects.rects()) {
|
||||||
|
@ -939,21 +939,9 @@ void WSWindowManager::compose()
|
||||||
else
|
else
|
||||||
m_back_painter->blit_with_opacity(dst, *backing_store, dirty_rect_in_window_coordinates, window.opacity());
|
m_back_painter->blit_with_opacity(dst, *backing_store, dirty_rect_in_window_coordinates, window.opacity());
|
||||||
}
|
}
|
||||||
};
|
|
||||||
|
|
||||||
for_each_visible_window_from_back_to_front([&] (WSWindow& window) {
|
|
||||||
if (&window != m_highlight_window.ptr())
|
|
||||||
compose_window(window);
|
|
||||||
return IterationDecision::Continue;
|
|
||||||
});
|
});
|
||||||
|
|
||||||
if (m_highlight_window)
|
|
||||||
compose_window(*m_highlight_window);
|
|
||||||
|
|
||||||
draw_menubar();
|
draw_menubar();
|
||||||
if (m_switcher.is_visible())
|
|
||||||
compose_window(*m_switcher.switcher_window());
|
|
||||||
|
|
||||||
draw_cursor();
|
draw_cursor();
|
||||||
|
|
||||||
if (m_flash_flush) {
|
if (m_flash_flush) {
|
||||||
|
|
|
@ -177,14 +177,23 @@ 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 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()) {
|
||||||
if (!window->is_visible())
|
if (!window->is_visible())
|
||||||
continue;
|
continue;
|
||||||
if (window->type() != type)
|
if (window->type() != type)
|
||||||
continue;
|
continue;
|
||||||
|
if (m_highlight_window.ptr() == window) {
|
||||||
|
do_highlight_window_at_end = true;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
if (callback(*window) == IterationDecision::Abort)
|
if (callback(*window) == IterationDecision::Abort)
|
||||||
return IterationDecision::Abort;
|
return IterationDecision::Abort;
|
||||||
}
|
}
|
||||||
|
if (do_highlight_window_at_end) {
|
||||||
|
if (callback(*m_highlight_window) == IterationDecision::Abort)
|
||||||
|
return IterationDecision::Abort;
|
||||||
|
}
|
||||||
return IterationDecision::Continue;
|
return IterationDecision::Continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -199,11 +208,18 @@ 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)
|
||||||
{
|
{
|
||||||
|
if (m_highlight_window && m_highlight_window->type() == type && m_highlight_window->is_visible()) {
|
||||||
|
if (callback(*m_highlight_window) == IterationDecision::Abort)
|
||||||
|
return IterationDecision::Abort;
|
||||||
|
}
|
||||||
|
|
||||||
for (auto* window = m_windows_in_order.tail(); window; window = window->prev()) {
|
for (auto* window = m_windows_in_order.tail(); window; window = window->prev()) {
|
||||||
if (!window->is_visible())
|
if (!window->is_visible())
|
||||||
continue;
|
continue;
|
||||||
if (window->type() != type)
|
if (window->type() != type)
|
||||||
continue;
|
continue;
|
||||||
|
if (window == m_highlight_window.ptr())
|
||||||
|
continue;
|
||||||
if (callback(*window) == IterationDecision::Abort)
|
if (callback(*window) == IterationDecision::Abort)
|
||||||
return IterationDecision::Abort;
|
return IterationDecision::Abort;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue