From 086d3ce1329558f9da728e70c8f7c3a1e3f27fb2 Mon Sep 17 00:00:00 2001 From: Omar Emara Date: Tue, 3 Nov 2020 17:53:40 +0200 Subject: [PATCH 1/2] Fix Linux handling of window exposure events Currently, the Linux embedder does not handle window exposure events. This is typically not a problem for users who use compositing window managers, since they keep the display buffers even if the window is completely covered. However, for users that don't use a compositor, the window will not be redrawn by the engine if it was previously covered until another event triggers the redraw. This patch implements the GtkWidget draw callback to handle window exposure events. The callback doesn't actually draw anything, it just schedule a frame for drawing by the engine. The engine doesn't support exposure events, so instead, we force redraw by sending a window metrics event of the same geometry. Since the geometry didn't change, only a frame will be scheduled. --- shell/platform/linux/fl_view.cc | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/shell/platform/linux/fl_view.cc b/shell/platform/linux/fl_view.cc index b65e3da7d4297..881bf82d16165 100644 --- a/shell/platform/linux/fl_view.cc +++ b/shell/platform/linux/fl_view.cc @@ -257,6 +257,17 @@ static void fl_view_size_allocate(GtkWidget* widget, fl_view_geometry_changed(self); } +// Implements GtkWidget::draw. +static gboolean fl_view_draw(GtkWidget* widget, + cairo_t* cr) { + FlView* self = FL_VIEW(widget); + // The engine doesn't support exposure events, so instead, force redraw by + // sending a window metrics event of the same geometry. Since the geometry + // didn't change, only a frame will be scheduled. + fl_view_geometry_changed(self); + return TRUE; +} + // Implements GtkWidget::button_press_event. static gboolean fl_view_button_press_event(GtkWidget* widget, GdkEventButton* event) { @@ -363,6 +374,7 @@ static void fl_view_class_init(FlViewClass* klass) { G_OBJECT_CLASS(klass)->dispose = fl_view_dispose; GTK_WIDGET_CLASS(klass)->realize = fl_view_realize; GTK_WIDGET_CLASS(klass)->size_allocate = fl_view_size_allocate; + GTK_WIDGET_CLASS(klass)->draw = fl_view_draw; GTK_WIDGET_CLASS(klass)->button_press_event = fl_view_button_press_event; GTK_WIDGET_CLASS(klass)->button_release_event = fl_view_button_release_event; GTK_WIDGET_CLASS(klass)->scroll_event = fl_view_scroll_event; From 63cbb6e06eff6eb558e19e1031abc4c296ed5b4d Mon Sep 17 00:00:00 2001 From: Omar Emara Date: Tue, 3 Nov 2020 21:44:16 +0200 Subject: [PATCH 2/2] Clang format patch --- shell/platform/linux/fl_view.cc | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/shell/platform/linux/fl_view.cc b/shell/platform/linux/fl_view.cc index 881bf82d16165..87decdce97c88 100644 --- a/shell/platform/linux/fl_view.cc +++ b/shell/platform/linux/fl_view.cc @@ -258,8 +258,7 @@ static void fl_view_size_allocate(GtkWidget* widget, } // Implements GtkWidget::draw. -static gboolean fl_view_draw(GtkWidget* widget, - cairo_t* cr) { +static gboolean fl_view_draw(GtkWidget* widget, cairo_t* cr) { FlView* self = FL_VIEW(widget); // The engine doesn't support exposure events, so instead, force redraw by // sending a window metrics event of the same geometry. Since the geometry