1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-20 11:55:08 +00:00

Port Terminal to LibGUI.

To facilitate listening for action on arbitrary file descriptors,
I've added a GNotifier class. It's quite simple but very useful:

GNotifier notifier(fd, GNotifier::Read);
notifier.on_ready_to_read = [this] (GNotifier& fd) {
    // read from fd or whatever else you like :^)
};

The callback will get invoked by GEventLoop when select() says we
have something to read on the fd.
This commit is contained in:
Andreas Kling 2019-02-10 14:28:39 +01:00
parent ae4811fbae
commit 53d34a0885
15 changed files with 268 additions and 151 deletions

View file

@ -34,16 +34,11 @@ void GWidget::set_relative_rect(const Rect& rect)
update();
}
void GWidget::repaint(const Rect& rect)
{
// FIXME: Implement.
}
void GWidget::event(GEvent& event)
{
switch (event.type()) {
case GEvent::Paint:
m_has_pending_paint_event = false;
m_pending_paint_event_rects.clear();
return handle_paint_event(static_cast<GPaintEvent&>(event));
case GEvent::Resize:
return handle_resize_event(static_cast<GResizeEvent&>(event));
@ -171,14 +166,21 @@ void GWidget::focusout_event(GEvent&)
}
void GWidget::update()
{
update(rect());
}
void GWidget::update(const Rect& rect)
{
auto* w = window();
if (!w)
return;
if (m_has_pending_paint_event)
return;
m_has_pending_paint_event = true;
w->update(window_relative_rect());
for (auto& pending_rect : m_pending_paint_event_rects) {
if (pending_rect.contains(rect))
return;
}
m_pending_paint_event_rects.append(rect);
w->update(rect.translated(window_relative_rect().location()));
}
Rect GWidget::window_relative_rect() const