summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVito Caputo <vcaputo@pengaru.com>2021-02-18 04:09:06 -0800
committerVito Caputo <vcaputo@pengaru.com>2021-02-18 04:09:06 -0800
commit2e1b25d15934d24be6c59fc469ab55cc8870d54c (patch)
treed9aaf2d5d7db7a16928456babc87a2a1dd9751b3
parentac47c893a317618499019ca70ea211e00eae6246 (diff)
gtk_fb: integrate fb_rebuild() to handle resizes
This wires up the "configure-event" signal on the fb window to trigger fb_rebuild() on resizes in the subsequent gtk_fb_page_flip().
-rw-r--r--src/gtk_fb.c31
1 files changed, 30 insertions, 1 deletions
diff --git a/src/gtk_fb.c b/src/gtk_fb.c
index 9cf0477..1e4fdf5 100644
--- a/src/gtk_fb.c
+++ b/src/gtk_fb.c
@@ -29,6 +29,7 @@ typedef struct gtk_fb_t {
GtkWidget *image;
unsigned width, height;
unsigned fullscreen:1;
+ unsigned resized:1;
} gtk_fb_t;
typedef struct gtk_fb_page_t gtk_fb_page_t;
@@ -38,6 +39,28 @@ struct gtk_fb_page_t {
};
+/* called on "configure-event" for the fb's gtk window */
+static gboolean resized(GtkWidget *widget, GdkEvent *event, gpointer user_data)
+{
+ gtk_fb_t *c = user_data;
+
+ if (c->width != event->configure.width ||
+ c->height != event->configure.height) {
+
+ /* just cache the new dimensions and set a resized flag, these will
+ * become realized @ flip time where the fb is available by telling
+ * the fb to rebuild via fb_rebuild() and clearing the resized flag.
+ */
+
+ c->width = event->configure.width;
+ c->height = event->configure.height;
+ c->resized = 1;
+ }
+
+ return FALSE;
+}
+
+
/* parse settings and get the output window realized before
* attempting to create any pages "similar" to it.
*/
@@ -71,6 +94,7 @@ static int gtk_fb_init(const settings_t *settings, void **res_context)
c->window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_widget_realize(c->window);
+ g_signal_connect(c->window, "configure-event", G_CALLBACK(resized), c);
*res_context = c;
@@ -181,7 +205,7 @@ static int gtk_fb_page_free(fb_t *fb, void *context, void *page)
/* XXX: due to gtk's event-driven nature, this isn't a vsync-synchronous page flip,
- * so and fb_flip() must be scheduled independently to not just spin.
+ * so fb_flip() must be scheduled independently to not just spin.
* The "draw" signal on the image is used to drive fb_flip() on frameclock "ticks",
* a method suggested by Christian Hergert, thanks!
*/
@@ -193,6 +217,11 @@ static int gtk_fb_page_flip(fb_t *fb, void *context, void *page)
cairo_surface_mark_dirty(p->surface);
gtk_image_set_from_surface(GTK_IMAGE(c->image), p->surface);
+ if (c->resized) {
+ c->resized = 0;
+ fb_rebuild(fb);
+ }
+
return 0;
}
© All Rights Reserved