From cfecbde1396e473af1b9567e91e823b1ad566b46 Mon Sep 17 00:00:00 2001 From: Ricardo Mones Date: Wed, 20 Jul 2022 16:46:58 +0200 Subject: [PATCH] Remove GTK3 deprecated calls from printing MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Fixes: sys:1: Warning: ../../../gobject/gsignal.c:2613: signal 'expose_event' is invalid for instance '0x2d768d0' of type 'GtkDrawingArea' And the following warnings are also gone: • printing.c:517:9: warning: ‘gtk_widget_set_double_buffered’ is deprecated • printing.c:648:9: warning: ‘gdk_cairo_create’ is deprecated: … • printing.c:1262:65: warning: ‘gdk_color_free’ is deprecated: … --- src/printing.c | 85 +++++++++++++++++++++++++++++++++++++++------------------- 1 file changed, 58 insertions(+), 27 deletions(-) diff --git a/src/printing.c b/src/printing.c index 144b6f5a9..86a9faf9e 100644 --- a/src/printing.c +++ b/src/printing.c @@ -93,7 +93,7 @@ static gboolean cb_preview_close(GtkWidget*, GdkEventAny*, gpointer); static void cb_preview_size_allocate(GtkWidget*, GtkAllocation*); static void cb_preview_ready(GtkPrintOperationPreview*, GtkPrintContext*, gpointer); -static gboolean cb_preview_expose(GtkWidget*, GdkEventExpose*, gpointer); +static gboolean cb_drawing_area(GtkWidget *widget, cairo_t *cr, gpointer data); static void cb_preview_got_page_size(GtkPrintOperationPreview*, GtkPrintContext*, GtkPageSetup*, gpointer); @@ -118,7 +118,8 @@ static GtkPageSetup *page_setup = NULL; /* other static functions */ static void printing_layout_set_text_attributes(PrintData*, GtkPrintContext *, gboolean *); -static gboolean printing_is_pango_gdk_color_equal(PangoColor*, GdkColor*); +static gboolean printing_is_pango_gdk_rgba_equal(PangoColor*, GdkRGBA*); +PangoColor* printing_pango_color_from_gdk_rgba(GdkRGBA*); static gint printing_text_iter_get_offset_bytes(PrintData *, const GtkTextIter*); #define PAGE_MARGIN_STORAGE_UNIT GTK_UNIT_MM @@ -395,7 +396,9 @@ static gboolean cb_preview(GtkPrintOperation *operation, gpointer data) { PrintData *print_data; + cairo_region_t *creg; cairo_t *cr; + GdkDrawingContext *gdc; PreviewData *preview_data; GtkWidget *vbox; GtkWidget *toolbar; @@ -514,16 +517,18 @@ static gboolean cb_preview(GtkPrintOperation *operation, GTK_POLICY_AUTOMATIC); gtk_box_pack_start(GTK_BOX(vbox), sw, TRUE, TRUE, 0); da = gtk_drawing_area_new(); - gtk_widget_set_double_buffered(da, FALSE); gtk_container_add(GTK_CONTAINER(sw), da); gtk_widget_realize(da); preview_data->scrolled_window = sw; preview_data->area = da; /* cairo context */ - cr = gdk_cairo_create(gtk_widget_get_window(da)); + creg = cairo_region_create(); + gdc = gdk_window_begin_draw_frame(gtk_widget_get_window(da), creg); + cr = gdk_drawing_context_get_cairo_context(gdc); gtk_print_context_set_cairo_context(context, cr, PREVIEW_SCALE, PREVIEW_SCALE); - cairo_destroy(cr); + gdk_window_end_draw_frame(gtk_widget_get_window(da), gdc); + cairo_region_destroy(creg); /* signals */ g_signal_connect(dialog, "key_press_event", @@ -604,9 +609,8 @@ static void cb_preview_ready(GtkPrintOperationPreview *preview, preview_data->current_page = preview_data->pages_to_print; preview_data->context = context; - g_signal_connect(preview_data->area, "expose_event", - G_CALLBACK(cb_preview_expose), - preview_data); + g_signal_connect(G_OBJECT (preview_data->area), "draw", + G_CALLBACK(cb_drawing_area), preview_data); gtk_widget_queue_draw(preview_data->area); } @@ -637,19 +641,25 @@ static void cb_preview_got_page_size(GtkPrintOperationPreview *preview, paper_width, paper_height); } -static gboolean cb_preview_expose(GtkWidget *widget, GdkEventExpose *event, - gpointer data) +static gboolean cb_drawing_area(GtkWidget *widget, cairo_t *cr, gpointer data) { PreviewData *preview_data = data; - cairo_t *cr; + GdkDrawingContext *gdc; + cairo_region_t *creg; + guint width, height; + + width = gtk_widget_get_allocated_width (widget); + height = gtk_widget_get_allocated_height (widget); debug_print("preview_expose (current %p)\n", preview_data->current_page); - cr = gdk_cairo_create(gtk_widget_get_window(preview_data->area)); + creg = cairo_region_create(); + gdc = gdk_window_begin_draw_frame(gtk_widget_get_window(preview_data->area), creg); + cr = gdk_drawing_context_get_cairo_context(gdc); /* background */ cairo_set_source_rgb(cr, 0.5, 0.5, 0.5); - cairo_rectangle(cr, event->area.x, event->area.y, event->area.width, event->area.height); + cairo_rectangle(cr, 0, 0, width, height); cairo_fill(cr); /* shadow */ @@ -667,7 +677,8 @@ static gboolean cb_preview_expose(GtkWidget *widget, GdkEventExpose *event, cairo_fill(cr); gtk_print_context_set_cairo_context(preview_data->context, cr, PREVIEW_SCALE, PREVIEW_SCALE); - cairo_destroy(cr); + gdk_window_end_draw_frame(gtk_widget_get_window(preview_data->area), gdc); + cairo_region_destroy(creg); if (preview_data->current_page) { preview_data->rendering = TRUE; @@ -1166,7 +1177,7 @@ static void printing_layout_set_text_attributes(PrintData *print_data, gboolean fg_set, bg_set, under_set, strike_set, weight_set; GSList *tags, *tag_walk; GtkTextTag *tag; - GdkColor *color = NULL; + GdkRGBA *color = NULL; PangoUnderline underline; gboolean strikethrough; gint weight; @@ -1221,10 +1232,10 @@ static void printing_layout_set_text_attributes(PrintData *print_data, attr = (PangoAttribute*)attr_walk->data; if (attr->klass->type == PANGO_ATTR_FOREGROUND) { attr_color = (PangoAttrColor*) attr; - g_object_get(G_OBJECT(tag), "foreground_gdk", + g_object_get(G_OBJECT(tag), "foreground-rgba", &color, NULL); if (color && - printing_is_pango_gdk_color_equal(&(attr_color->color), + printing_is_pango_gdk_rgba_equal(&(attr_color->color), color)) { attr->end_index = printing_text_iter_get_offset_bytes(print_data, &iter); pango_attr_list_insert(attr_list, attr); @@ -1233,7 +1244,7 @@ static void printing_layout_set_text_attributes(PrintData *print_data, break; } if (color) - gdk_color_free(color); + gdk_rgba_free(color); } } if (!found) @@ -1247,10 +1258,10 @@ static void printing_layout_set_text_attributes(PrintData *print_data, attr = (PangoAttribute*)attr_walk->data; if (attr->klass->type == PANGO_ATTR_BACKGROUND) { attr_color = (PangoAttrColor*) attr; - g_object_get(G_OBJECT(tag), "background-gdk", + g_object_get(G_OBJECT(tag), "background-rgba", &color, NULL); if (color && - printing_is_pango_gdk_color_equal(&(attr_color->color), + printing_is_pango_gdk_rgba_equal(&(attr_color->color), color)) { attr->end_index = printing_text_iter_get_offset_bytes(print_data, &iter); pango_attr_list_insert(attr_list, attr); @@ -1259,7 +1270,7 @@ static void printing_layout_set_text_attributes(PrintData *print_data, break; } if (color) - gdk_color_free(color); + gdk_rgba_free(color); } } if (!found) @@ -1349,16 +1360,20 @@ static void printing_layout_set_text_attributes(PrintData *print_data, "weight-set", &weight_set, NULL); if (fg_set) { - g_object_get(G_OBJECT(tag), "foreground-gdk", &color, NULL); - attr = pango_attr_foreground_new(color->red,color->green,color->blue); + g_object_get(G_OBJECT(tag), "foreground-rgba", &color, NULL); + PangoColor *pc = printing_pango_color_from_gdk_rgba(color); + attr = pango_attr_foreground_new(pc->red, pc->green, pc->blue); attr->start_index = printing_text_iter_get_offset_bytes(print_data, &iter); open_attrs = g_slist_prepend(open_attrs, attr); + g_free(pc); } if (bg_set) { - g_object_get(G_OBJECT(tag), "background-gdk", &color, NULL); - attr = pango_attr_background_new(color->red,color->green,color->blue); + g_object_get(G_OBJECT(tag), "background-rgba", &color, NULL); + PangoColor *pc = printing_pango_color_from_gdk_rgba(color); + attr = pango_attr_background_new(pc->red, pc->green, pc->blue); attr->start_index = printing_text_iter_get_offset_bytes(print_data, &iter); open_attrs = g_slist_prepend(open_attrs, attr); + g_free(pc); } if (under_set) { g_object_get(G_OBJECT(tag), "underline", &underline, NULL); @@ -1401,9 +1416,25 @@ static void printing_layout_set_text_attributes(PrintData *print_data, pango_attr_list_unref(attr_list); } -static gboolean printing_is_pango_gdk_color_equal(PangoColor *p, GdkColor *g) +PangoColor* printing_pango_color_from_gdk_rgba(GdkRGBA* g) +{ + PangoColor *c; + + c = g_new(PangoColor, 1); + c->red = (guint16) (g->red * 65535); + c->green = (guint16) (g->green * 65535); + c->blue = (guint16) (g->blue * 65535); + return c; +} + +static gboolean printing_is_pango_gdk_rgba_equal(PangoColor *p, GdkRGBA *g) { - return ((p->red == g->red) && (p->green == g->green) && (p->blue == g->blue)); + PangoColor c; + + c.red = (guint16) (g->red * 65535); + c.green = (guint16) (g->green * 65535); + c.blue = (guint16) (g->blue * 65535); + return ((c.red == p->red) && (c.green == p->green) && (c.blue == p->blue)); } /* Pango has it's attribute in bytes, but GtkTextIter gets only an offset -- 2.11.4.GIT