From 9e570f8b0035da1258ea849940165c925e2eb55f Mon Sep 17 00:00:00 2001 From: Vladislav Mikhailikov Date: Sat, 1 Nov 2025 17:33:27 +0300 Subject: [PATCH] Fix GTK 3.x compiler warnings MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This patch replces outdated API functions with newer ones: display.c: In function ‘update_window’: display.c:153:9: warning: ‘gdk_cairo_create’ is deprecated: Use 'gdk_window_begin_draw_frame() and gdk_drawing_context_get_cairo_context()' instead [-Wdeprecated-declarations] 153 | cairo_t *cr = gdk_cairo_create(drawable); | ^~~~~~~ In file included from /usr/include/gtk-3.0/gdk/gdk.h:33, from /usr/include/gtk-3.0/gtk/gtk.h:30, from display.c:23: /usr/include/gtk-3.0/gdk/gdkcairo.h:35:12: note: declared here 35 | cairo_t * gdk_cairo_create (GdkWindow *window); | ^~~~~~~~~~~~~~~~ display.c: In function ‘button_release_event’: display.c:323:9: warning: ‘gdk_cairo_create’ is deprecated: Use 'gdk_window_begin_draw_frame() and gdk_drawing_context_get_cairo_context()' instead [-Wdeprecated-declarations] 323 | cairo_t *cr = gdk_cairo_create(drawable); | ^~~~~~~ /usr/include/gtk-3.0/gdk/gdkcairo.h:35:12: note: declared here 35 | cairo_t * gdk_cairo_create (GdkWindow *window); | ^~~~~~~~~~~~~~~~ display.c:330:9: warning: ‘gdk_flush’ is deprecated: Use 'gdk_display_flush' instead [-Wdeprecated-declarations] 330 | gdk_flush(); /* force X to actually draw the damn thing. */ | ^~~~~~~~~ In file included from /usr/include/gtk-3.0/gdk/gdk.h:50: /usr/include/gtk-3.0/gdk/gdkmain.h:124:6: note: declared here 124 | void gdk_flush (void); | ^~~~~~~~~ display.c: In function ‘display_send_img’: display.c:64:5: warning: ignoring return value of ‘write’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 64 | write(imgpipe_writefd, name, len); | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ display.c: In function ‘do_image_display’: display.c:73:5: warning: ignoring return value of ‘pipe’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 73 | pipe(pfd); | ^~~~~~~~~ display.c: In function ‘pipe_event’: display.c:420:29: warning: ignoring return value of ‘write’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 420 | write(1, "\a", 1); | ^~~~~~~~~~~~~~~~~ rm -f libdisplay.a Signed-off-by: Vladislav Mikhailikov --- src/display/display.c | 52 ++++++++++++++++++++++++++++++++++++++----- 1 file changed, 46 insertions(+), 6 deletions(-) diff --git a/src/display/display.c b/src/display/display.c index 0da45b6..0ff032f 100644 --- a/src/display/display.c +++ b/src/display/display.c @@ -150,8 +150,18 @@ void make_backing_image() { * Copy the backing image onto the window. */ void update_window() { if (backing_image) { - cairo_t *cr = gdk_cairo_create(drawable); + cairo_region_t *cairoRegion = cairo_region_create(); + + /* the pointer to GdkWindow hold in global variable `drawable` */ + GdkDrawingContext *drawingContext = gdk_window_begin_draw_frame (drawable, cairoRegion); + + { + /* say: "I want to start drawing" */ + cairo_t *cr = gdk_drawing_context_get_cairo_context (drawingContext); + + { + /* do actual drawing here */ cairo_set_source_rgb(cr, 0.0, 0.0, 1.0); cairo_rectangle(cr, 0.0, 0.0, width, height); cairo_fill(cr); @@ -165,8 +175,14 @@ void update_window() { cairo_set_source_surface(cr, pSurface, 0.0, 0.0); cairo_paint(cr); + } + + /* say: "I'm finished drawing */ + gdk_window_end_draw_frame(drawable,drawingContext); + } - cairo_destroy(cr); + /* clean up */ + cairo_region_destroy(cairoRegion); } } @@ -318,25 +334,49 @@ void button_release_event(GtkWidget *widget, GdkEventButton *event) { struct imgrect *ir; ir = find_image_rectangle(click.x, click.y); if (ir && ir == find_image_rectangle((int)event->x, (int)event->y)) { + + // "convert" the G*t*kWidget to G*d*kWindow (no, it's not a GtkWindow!) + GdkWindow* window = gtk_widget_get_window(widget); + + cairo_region_t *cairoRegion = cairo_region_create(); + + GdkDrawingContext *drawingContext = gdk_window_begin_draw_frame (window,cairoRegion); + + { + /* say: "I want to start drawing" */ + cairo_t *cr = gdk_drawing_context_get_cairo_context (drawingContext); + + { /* We draw a little frame around the image while we're saving it, to * give some visual feedback. */ - cairo_t *cr = gdk_cairo_create(drawable); - cairo_set_line_width (cr, 1.0); cairo_set_source_rgb(cr, 1.0, 1.0, 1.0); cairo_rectangle(cr, ir->x, ir->y, ir->w+3, ir->h + 3); cairo_stroke(cr); + } + + /* say: "I'm finished drawing */ + gdk_window_end_draw_frame(window, drawingContext); - gdk_flush(); /* force X to actually draw the damn thing. */ save_image(ir); xnanosleep(100000000); + /* say: "I want to start drawing" one more time */ + cr = gdk_drawing_context_get_cairo_context (drawingContext); + + { + /* Draw more ... */ cairo_set_line_width (cr, 1.0); cairo_set_source_rgb(cr, 0.0, 0.0, 0.0); cairo_rectangle(cr, ir->x, ir->y, ir->w+3, ir->h + 3); cairo_stroke(cr); + } + + /* say: "I'm finished drawing one more time */ + gdk_window_end_draw_frame(window, drawingContext); + } - cairo_destroy(cr); + cairo_region_destroy(cairoRegion); } }