remove all gtk3 conditionals
[claws.git] / src / printing.c
index 418196ab4a3bf8049159bd650e65f597798303f1..1fa5cb72b09ce6a3fe44ccf19f5501fe02fcddbe 100644 (file)
@@ -1,5 +1,5 @@
 /* Claws Mail -- a GTK+ based, lightweight, and fast e-mail client
- * Copyright (C) 2007-2009 Holger Berndt <hb@claws-mail.org>,
+ * Copyright (C) 2007-2012 Holger Berndt <hb@claws-mail.org>,
  * Colin Leroy <colin@colino.net>, and the Claws Mail team
  *
  * This program is free software; you can redistribute it and/or modify
@@ -19,6 +19,7 @@
 
 #ifdef HAVE_CONFIG_H
 #  include "config.h"
+#include "claws-features.h"
 #endif
 
 #include "defs.h"
@@ -26,8 +27,6 @@
 #include "printing.h"
 #include "image_viewer.h"
 
-#if GTK_CHECK_VERSION(2,10,0) && !defined(USE_GNOMEPRINT)
-
 #include "gtkutils.h"
 #include "toolbar.h"
 #include "prefs_common.h"
@@ -53,6 +52,7 @@ struct _PrintData {
        gint img_cnt;
        gdouble zoom;
        gdouble ypos_line;
+       GtkImage *avatar;
 };
 
 typedef struct {
@@ -191,7 +191,6 @@ GtkPageSetup *printing_get_page_setup(void)
 
                read_from_file = FALSE;
 
-#if GTK_CHECK_VERSION(2,14,0)
                /* try reading the page setup from file */
                page_setup_filename = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, 
                                                  PRINTING_PAGE_SETUP_STORAGE_FILE, NULL);
@@ -210,11 +209,6 @@ GtkPageSetup *printing_get_page_setup(void)
                } else {
                        debug_print("Printing: Could not read page setup from key file\n");
                }
-#else
-               key_file_read = FALSE;
-               keyfile = NULL;
-               page_setup_filename = NULL;
-#endif
 
                /* if reading from file did not work, or has not been tried (GTK+ < 2.14), use prefs */
                if (!read_from_file) {
@@ -251,7 +245,7 @@ GtkPageSetup *printing_get_page_setup(void)
 }
 
 void printing_print_full(GtkWindow *parent, PrintRenderer *renderer, gpointer renderer_data, 
-                        gint sel_start, gint sel_end)
+                        gint sel_start, gint sel_end, GtkImage *avatar)
 {                       
        GtkPrintOperation *op;
        GtkPrintOperationResult res;
@@ -265,6 +259,7 @@ void printing_print_full(GtkWindow *parent, PrintRenderer *renderer, gpointer re
        print_data->renderer_data = renderer_data;
        print_data->sel_start = sel_start;
        print_data->sel_end = sel_end;
+       print_data->avatar = (avatar != NULL? GTK_IMAGE(g_object_ref(avatar)): NULL);
 
        print_data->zoom = 1.;
 
@@ -280,11 +275,8 @@ void printing_print_full(GtkWindow *parent, PrintRenderer *renderer, gpointer re
        /* Config for printing */
        gtk_print_operation_set_print_settings(op, settings);
        gtk_print_operation_set_default_page_setup(op, page_setup);
-#if GTK_CHECK_VERSION(2, 18, 0)
         /* enable Page Size and Orientation in the print dialog */
        gtk_print_operation_set_embed_page_setup(op, TRUE);
-#endif
-
        /* signals */
        g_signal_connect(op, "begin_print", G_CALLBACK(renderer->cb_begin_print), print_data);
        g_signal_connect(op, "draw_page", G_CALLBACK(renderer->cb_draw_page), print_data);
@@ -311,6 +303,8 @@ void printing_print_full(GtkWindow *parent, PrintRenderer *renderer, gpointer re
        g_list_free(print_data->page_breaks);
        if (print_data->layout)
                g_object_unref(print_data->layout);
+       if (print_data->avatar)
+               g_object_unref(print_data->avatar);
 
        g_free(print_data);
 
@@ -340,7 +334,7 @@ static gpointer printing_textview_get_data_to_print(gpointer data, gint sel_star
        return gtk_text_buffer_get_text(buffer, &start, &end, FALSE);
 }
 
-void printing_print(GtkTextView *text_view, GtkWindow *parent, gint sel_start, gint sel_end)
+void printing_print(GtkTextView *text_view, GtkWindow *parent, gint sel_start, gint sel_end, GtkImage *avatar)
 {
        PrintRenderer *textview_renderer = g_new0(PrintRenderer, 1);
        
@@ -349,7 +343,7 @@ void printing_print(GtkTextView *text_view, GtkWindow *parent, gint sel_start, g
        textview_renderer->cb_begin_print    = printing_textview_cb_begin_print;
        textview_renderer->cb_draw_page      = printing_textview_cb_draw_page;
 
-       printing_print_full(parent, textview_renderer, text_view, sel_start, sel_end);
+       printing_print_full(parent, textview_renderer, text_view, sel_start, sel_end, avatar);
        
        g_free(textview_renderer);
 }
@@ -385,7 +379,6 @@ void printing_page_setup(GtkWindow *parent)
        prefs_common.print_margin_right  = (int) (100*gtk_page_setup_get_right_margin(page_setup,
                                                                PAGE_MARGIN_STORAGE_UNIT));
 
-#if GTK_CHECK_VERSION(2,14,0)
        /* save to file */
        keyfile = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S,
                              PRINTING_PAGE_SETUP_STORAGE_FILE, NULL);
@@ -393,7 +386,6 @@ void printing_page_setup(GtkWindow *parent)
                debug_print("Printing: Could not store page setup in file `%s'\n", keyfile);
        }
        g_free(keyfile);
-#endif
 }
 
 static gboolean cb_preview(GtkPrintOperation        *operation,
@@ -414,7 +406,6 @@ static gboolean cb_preview(GtkPrintOperation        *operation,
        static GdkGeometry geometry;
        GtkWidget *dialog = NULL;
        GtkWidget *statusbar = gtk_hbox_new(2, FALSE);
-       CLAWS_TIP_DECL();
 
        debug_print("Creating internal print preview\n");
 
@@ -444,11 +435,8 @@ static gboolean cb_preview(GtkPrintOperation        *operation,
   
        /* toolbar */
        toolbar = gtk_toolbar_new();
-#if (GTK_CHECK_VERSION(2,16,0))
        gtk_orientable_set_orientation(GTK_ORIENTABLE(toolbar), GTK_ORIENTATION_HORIZONTAL);
-#else
-       gtk_toolbar_set_orientation(GTK_TOOLBAR(toolbar), GTK_ORIENTATION_HORIZONTAL);
-#endif
+
        switch (prefs_common.toolbar_style) {
                case TOOLBAR_ICON:
                        gtk_toolbar_set_style(GTK_TOOLBAR(toolbar), GTK_TOOLBAR_ICONS);
@@ -467,16 +455,9 @@ static gboolean cb_preview(GtkPrintOperation        *operation,
 
        gtk_box_pack_start(GTK_BOX(vbox), toolbar, FALSE, FALSE, 0);
 
-#if !(GTK_CHECK_VERSION(2,12,0))
-#define CLAWS_SET_TOOL_ITEM_TIP(widget,tip) { \
-       gtk_tool_item_set_tooltip(GTK_TOOL_ITEM(widget), GTK_TOOLTIPS(tips),                    \
-                       tip, NULL);                                                             \
-}
-#else
 #define CLAWS_SET_TOOL_ITEM_TIP(widget,tip) { \
        gtk_tool_item_set_tooltip_text(GTK_TOOL_ITEM(widget), tip);                             \
 }
-#endif 
 
 #define TOOLBAR_ITEM(item,text,tooltip,cb,cbdata) {                                                            \
        item = GTK_WIDGET(gtk_tool_button_new_from_stock(text));                                        \
@@ -494,7 +475,6 @@ static gboolean cb_preview(GtkPrintOperation        *operation,
                     _("Previous page"), cb_preview_go_previous, preview_data);
 
        page = gtk_label_new("");
-       gtk_widget_set_size_request(page, 100, -1);
        preview_data->page_nr_label = page;
 
        TOOLBAR_ITEM(preview_data->next, GTK_STOCK_GO_FORWARD,
@@ -539,7 +519,7 @@ static gboolean cb_preview(GtkPrintOperation        *operation,
        preview_data->area = da;
 
        /* cairo context */
-       cr = gdk_cairo_create(da->window);
+       cr = gdk_cairo_create(gtk_widget_get_window(da));
        gtk_print_context_set_cairo_context(context, cr, PREVIEW_SCALE, PREVIEW_SCALE);
        cairo_destroy(cr);
 
@@ -583,7 +563,7 @@ static gboolean cb_preview_close(GtkWidget *widget, GdkEventAny *event,
 {
        PreviewData *preview_data = (PreviewData *)data;
        if (event->type == GDK_KEY_PRESS)
-                if (((GdkEventKey *)event)->keyval != GDK_Escape)
+                if (((GdkEventKey *)event)->keyval != GDK_KEY_Escape)
                        return FALSE;
        if (preview_data->rendering)
                return FALSE; 
@@ -635,14 +615,12 @@ static void cb_preview_got_page_size(GtkPrintOperationPreview *preview,
                                     gpointer                  data)
 {
        PreviewData *preview_data;
-       GtkPageOrientation orientation;
        GtkPaperSize *paper_size;
        gint paper_width;
        gint paper_height;
 
        preview_data = (PreviewData*) data;
        debug_print("got_page_size\n");
-       orientation  = gtk_page_setup_get_orientation(page_setup);
        paper_size   = gtk_page_setup_get_paper_size(page_setup);
        paper_width  = (gint)(gtk_paper_size_get_width(paper_size, GTK_UNIT_INCH)  
                              * PREVIEW_SCALE);
@@ -661,49 +639,31 @@ static gboolean cb_preview_expose(GtkWidget *widget, GdkEventExpose *event,
                                  gpointer data)
 {
        PreviewData *preview_data = data;
-       GdkGC *gc;
-       GdkColor white;
-       GdkColor black;
-       GdkColor gray;
        cairo_t *cr;
 
        debug_print("preview_expose (current %p)\n", preview_data->current_page);
-       gdk_window_clear(preview_data->area->window);
-
-       white.red   = 65535;
-       white.green = 65535;
-       white.blue  = 65535;
-       black.red   = 0;
-       black.green = 0;
-       black.blue  = 0;
-       gray.red   = 32700;
-       gray.green = 32700;
-       gray.blue  = 32700;
 
-       gc = gdk_gc_new(GDK_DRAWABLE(preview_data->area->window));
+       cr = gdk_cairo_create(gtk_widget_get_window(preview_data->area));
 
        /* background */
-       gdk_gc_set_rgb_fg_color(gc, &gray);
-       gdk_draw_rectangle(preview_data->area->window, gc, TRUE, 0, 0,
-                          preview_data->area->allocation.width,
-                          preview_data->area->allocation.height);
+       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_fill(cr);
 
        /* shadow */
-       gdk_gc_set_rgb_fg_color(gc, &black);
-       gdk_draw_rectangle(preview_data->area->window, gc, TRUE,
-                          PREVIEW_SHADOW_OFFSET, PREVIEW_SHADOW_OFFSET,
-                          preview_data->page_width+PREVIEW_SHADOW_OFFSET,
-                          preview_data->page_height+PREVIEW_SHADOW_OFFSET);
+       cairo_set_source_rgb(cr, 0., 0., 0.);
+       cairo_rectangle(cr, PREVIEW_SHADOW_OFFSET, PREVIEW_SHADOW_OFFSET,
+           preview_data->page_width+PREVIEW_SHADOW_OFFSET,
+           preview_data->page_height+PREVIEW_SHADOW_OFFSET);
+       cairo_fill(cr);
 
        /* paper */
-       gdk_gc_set_rgb_fg_color(gc, &white);
-       gdk_draw_rectangle(preview_data->area->window, gc, TRUE, 0, 0,
-                          preview_data->page_width,
-                          preview_data->page_height);
-
-       g_object_unref(gc);
+       cairo_set_source_rgb(cr, 1., 1., 1.);
+       cairo_rectangle(cr, 0, 0,
+           preview_data->page_width,
+           preview_data->page_height);
+       cairo_fill(cr);
 
-       cr = gdk_cairo_create(preview_data->area->window);
        gtk_print_context_set_cairo_context(preview_data->context, cr, PREVIEW_SCALE, PREVIEW_SCALE);
        cairo_destroy(cr);
 
@@ -788,13 +748,15 @@ static void cb_preview_zoom_100(GtkButton *button, gpointer data)
 static void cb_preview_zoom_fit(GtkButton *button, gpointer data)
 {
        PreviewData *preview_data = (PreviewData*) data;
+       GtkAllocation allocation;
        gdouble zoom_w;
        gdouble zoom_h;
 
-       zoom_w = ((gdouble)preview_data->scrolled_window->allocation.width) /
+       gtk_widget_get_allocation(preview_data->scrolled_window, &allocation);
+       zoom_w = ((gdouble)allocation.width) /
                 ((gdouble)preview_data->page_width/preview_data->print_data->zoom +
                  PREVIEW_SHADOW_OFFSET);
-       zoom_h = ((gdouble)preview_data->scrolled_window->allocation.height) /
+       zoom_h = ((gdouble)allocation.height) /
                 ((gdouble)preview_data->page_height/preview_data->print_data->zoom +
                  PREVIEW_SHADOW_OFFSET);
 
@@ -886,7 +848,6 @@ static void printing_textview_cb_begin_print(GtkPrintOperation *op, GtkPrintCont
        PangoFontDescription *desc;
        int start, ii;
        PangoLayoutIter *iter;
-       double start_pos;
        gint header_end_pos;
        gint num_header_lines;
        gint dummy;
@@ -925,7 +886,6 @@ static void printing_textview_cb_begin_print(GtkPrintOperation *op, GtkPrintCont
        page_height = 0;
        start = 0;
        ii = 0;
-       start_pos = 0.;
        iter = pango_layout_get_iter(print_data->layout);
 
        /* find the last character of the header */
@@ -954,15 +914,10 @@ static void printing_textview_cb_begin_print(GtkPrintOperation *op, GtkPrintCont
 
        do {
                PangoRectangle logical_rect;
-               PangoLayoutLine *line;
                PangoAttrShape *attr = NULL;
-               int baseline;
 
                if (ii >= start) {
-                       line = pango_layout_iter_get_line(iter);
-
                        pango_layout_iter_get_line_extents(iter, NULL, &logical_rect);
-                       baseline = pango_layout_iter_get_baseline(iter);
 
                        if ((attr = g_hash_table_lookup(print_data->images,
                                                GINT_TO_POINTER(pango_layout_iter_get_index(iter)))) != NULL) {
@@ -1119,9 +1074,9 @@ static void printing_textview_cb_draw_page(GtkPrintOperation *op, GtkPrintContex
                        pango_layout_iter_get_line_extents(iter, NULL, &logical_rect);
                        baseline = pango_layout_iter_get_baseline(iter);
 
-                       if (ii == start)
+                       if (ii == start) {
                                start_pos = ((double)logical_rect.y) / PANGO_SCALE;
-
+                       }
                        /* Draw header separator line */
                        if (ii == 0 && print_data->ypos_line >= 0) {
                                cairo_surface_t *surface;
@@ -1160,6 +1115,24 @@ static void printing_textview_cb_draw_page(GtkPrintOperation *op, GtkPrintContex
                }
                ii++;
        } while(ii < end && (notlast = pango_layout_iter_next_line(iter)));
+
+       if (print_data->avatar && page_nr == 0) {
+               cairo_surface_t *surface;
+               GdkPixbuf *pixbuf = gtk_image_get_pixbuf(print_data->avatar);
+               gdouble startx, starty;
+               
+               startx = gtk_print_context_get_width(context)/print_data->zoom;
+               
+               startx -= ((double)gdk_pixbuf_get_width(pixbuf));
+
+               starty = start_pos;
+
+               surface = pixbuf_to_surface(pixbuf);
+               cairo_set_source_surface (cr, surface, startx, starty);
+               cairo_paint (cr);
+               cairo_surface_destroy (surface);
+       }
+
        pango_layout_iter_free(iter);
        debug_print("Sent page %d to printer\n", page_nr+1);
 }
@@ -1272,7 +1245,8 @@ static void printing_layout_set_text_attributes(PrintData *print_data,
                                                        attr_color = (PangoAttrColor*) attr;
                                                        g_object_get(G_OBJECT(tag), "background-gdk",
                                                                     &color, NULL);
-                                                       if (printing_is_pango_gdk_color_equal(&(attr_color->color),
+                                                       if (color && 
+                                                           printing_is_pango_gdk_color_equal(&(attr_color->color),
                                                            color)) {
                                                                attr->end_index = printing_text_iter_get_offset_bytes(print_data, &iter);
                                                                pango_attr_list_insert(attr_list, attr);
@@ -1433,12 +1407,10 @@ static gboolean printing_is_pango_gdk_color_equal(PangoColor *p, GdkColor *g)
  */
 static gint printing_text_iter_get_offset_bytes(PrintData *print_data, const GtkTextIter *iter)
 {
-       gint off_chars;
        gint off_bytes;
        gchar *text;
        GtkTextIter start;
 
-       off_chars = gtk_text_iter_get_offset(iter);
        if (print_data->sel_start < 0 || print_data->sel_end <= print_data->sel_start) {
                gtk_text_buffer_get_start_iter(gtk_text_iter_get_buffer(iter), &start);
        } else {
@@ -1462,5 +1434,3 @@ static void printing_preview_update_zoom_sensitivity(PreviewData *preview_data)
        else
                gtk_widget_set_sensitive(preview_data->zoom_out, TRUE);
 }
-
-#endif /* GTK+ >= 2.10.0 */