WindowServer: Fix 'Maximize' Button

When a window is maximized by clicking the 'maximize' button in the window frame,
the WindowFrame *is* invalidated and repainted properly. However, the internal
state of the WindowServer::Button does not get updated until the next mouse
movement. This means that the 'maximize' button is erroneously highlighted until
the mouse moves again. This is very visible.

Ideally, a patch should compute the actual new m_hovered. However, this requires
knowledge of the new rect, or calling something on the Button after the new rect
has been determined. Until someone can figure out a good way around this,
setting m_hovered to false is a solution that 'usually' works.

Note that this does *not* work when after maximizing/restoring, the maximize
button falls exactly under the mouse again. The button functions properly, but
is erroneously not highlighted.

At least a *missing* highlight is less noticable than a highlight too many.
This commit is contained in:
Ben Wiederhake 2020-05-04 05:00:34 +02:00 committed by Andreas Kling
parent cc67671d95
commit 124cbea347

View file

@ -78,8 +78,14 @@ void Button::on_mouse_event(const MouseEvent& event)
if (on_click)
on_click(*this);
}
if (old_pressed != m_pressed)
if (old_pressed != m_pressed) {
// Would like to compute:
// m_hovered = rect_after_action().contains(event.position());
// However, we don't know that rect yet. We can make an educated
// guess which also looks okay even when wrong:
m_hovered = false;
wm.invalidate(screen_rect());
}
return;
}