2007-10-10 [colin] 3.0.2cvs52
* src/printing.c * src/printing.h Generalize a bit printing, so we can factorize most of the code.
This commit is contained in:
parent
3876c9580a
commit
52337572af
5 changed files with 110 additions and 34 deletions
|
@ -1,3 +1,10 @@
|
|||
2007-10-10 [colin] 3.0.2cvs52
|
||||
|
||||
* src/printing.c
|
||||
* src/printing.h
|
||||
Generalize a bit printing, so we can factorize
|
||||
most of the code.
|
||||
|
||||
2007-10-10 [paul] 3.0.2cvs51
|
||||
|
||||
* src/addrduplicates.c
|
||||
|
|
|
@ -2964,3 +2964,4 @@
|
|||
( cvs diff -u -r 1.9.2.17 -r 1.9.2.18 src/addressadd.c; cvs diff -u -r 1.28.2.35 -r 1.28.2.36 src/addrindex.c; cvs diff -u -r 1.14.2.33 -r 1.14.2.34 src/editaddress.c; cvs diff -u -r 1.1.2.5 -r 1.1.2.6 src/editaddress_other_attributes_ldap.h; cvs diff -u -r 1.8.2.24 -r 1.8.2.25 src/headerview.c; cvs diff -u -r 1.94.2.157 -r 1.94.2.158 src/messageview.c; cvs diff -u -r 1.395.2.329 -r 1.395.2.330 src/summaryview.c; cvs diff -u -r 1.96.2.185 -r 1.96.2.186 src/textview.c; ) > 3.0.2cvs49.patchset
|
||||
( cvs diff -u -r 1.9.2.18 -r 1.9.2.19 src/addressadd.c; cvs diff -u -r 1.28.2.36 -r 1.28.2.37 src/addrindex.c; cvs diff -u -r 1.14.2.34 -r 1.14.2.35 src/editaddress.c; ) > 3.0.2cvs50.patchset
|
||||
( cvs diff -u -r 1.1.2.4 -r 1.1.2.5 src/addrduplicates.c; ) > 3.0.2cvs51.patchset
|
||||
( cvs diff -u -r 1.1.2.9 -r 1.1.2.10 src/printing.c; cvs diff -u -r 1.1.2.2 -r 1.1.2.3 src/printing.h; ) > 3.0.2cvs52.patchset
|
||||
|
|
|
@ -11,7 +11,7 @@ MINOR_VERSION=0
|
|||
MICRO_VERSION=2
|
||||
INTERFACE_AGE=0
|
||||
BINARY_AGE=0
|
||||
EXTRA_VERSION=51
|
||||
EXTRA_VERSION=52
|
||||
EXTRA_RELEASE=
|
||||
EXTRA_GTK2_VERSION=
|
||||
|
||||
|
|
118
src/printing.c
118
src/printing.c
|
@ -37,19 +37,20 @@
|
|||
#include <string.h>
|
||||
#include <math.h>
|
||||
|
||||
typedef struct {
|
||||
struct _PrintData {
|
||||
PrintRenderer *renderer;
|
||||
gpointer renderer_data;
|
||||
PangoLayout *layout;
|
||||
PangoContext *pango_context;
|
||||
char *text;
|
||||
gpointer to_print;
|
||||
GList *page_breaks;
|
||||
guint npages;
|
||||
GtkTextBuffer *buffer;
|
||||
gint sel_start;
|
||||
gint sel_end;
|
||||
GHashTable *images;
|
||||
gint img_cnt;
|
||||
gdouble zoom;
|
||||
} PrintData;
|
||||
};
|
||||
|
||||
typedef struct {
|
||||
GtkPrintOperation *op;
|
||||
|
@ -76,8 +77,8 @@ typedef struct {
|
|||
} PreviewData;
|
||||
|
||||
/* callbacks */
|
||||
static void cb_begin_print(GtkPrintOperation*, GtkPrintContext*, gpointer);
|
||||
static void cb_draw_page(GtkPrintOperation*, GtkPrintContext*, gint,
|
||||
static void printing_textview_cb_begin_print(GtkPrintOperation*, GtkPrintContext*, gpointer);
|
||||
static void printing_textview_cb_draw_page(GtkPrintOperation*, GtkPrintContext*, gint,
|
||||
gpointer);
|
||||
static gboolean cb_preview(GtkPrintOperation*, GtkPrintOperationPreview*,
|
||||
GtkPrintContext*, GtkWindow*, gpointer);
|
||||
|
@ -126,37 +127,50 @@ static void free_pixbuf(gpointer key, gpointer value, gpointer data)
|
|||
g_object_unref(G_OBJECT(attr->data));
|
||||
}
|
||||
|
||||
void printing_print(GtkTextView *text_view, GtkWindow *parent, gint sel_start, gint sel_end)
|
||||
gpointer printing_get_renderer_data(PrintData *print_data)
|
||||
{
|
||||
if (!print_data)
|
||||
return NULL;
|
||||
return print_data->renderer_data;
|
||||
}
|
||||
|
||||
gdouble printing_get_zoom(PrintData *print_data)
|
||||
{
|
||||
if (!print_data)
|
||||
return 1.0;
|
||||
return print_data->zoom;
|
||||
}
|
||||
|
||||
void printing_set_n_pages(PrintData *print_data, gint n_pages)
|
||||
{
|
||||
if (!print_data)
|
||||
return;
|
||||
print_data->npages = n_pages;
|
||||
}
|
||||
|
||||
void printing_print_full(GtkWindow *parent, PrintRenderer *renderer, gpointer renderer_data,
|
||||
gint sel_start, gint sel_end)
|
||||
{
|
||||
GtkPrintOperation *op;
|
||||
GtkPrintOperationResult res;
|
||||
PrintData *print_data;
|
||||
GtkTextIter start, end;
|
||||
GtkTextBuffer *buffer;
|
||||
|
||||
op = gtk_print_operation_new();
|
||||
|
||||
print_data = g_new0(PrintData,1);
|
||||
|
||||
print_data->renderer = renderer;
|
||||
print_data->renderer_data = renderer_data;
|
||||
print_data->sel_start = sel_start;
|
||||
print_data->sel_end = sel_end;
|
||||
|
||||
print_data->zoom = 1.;
|
||||
|
||||
print_data->images = g_hash_table_new(g_direct_hash, g_direct_equal);
|
||||
print_data->pango_context=gtk_widget_get_pango_context(GTK_WIDGET(text_view));
|
||||
|
||||
print_data->pango_context = renderer->get_pango_context(renderer_data);
|
||||
|
||||
/* get text */
|
||||
buffer = gtk_text_view_get_buffer(text_view);
|
||||
print_data->buffer = buffer;
|
||||
print_data->sel_start = sel_start;
|
||||
print_data->sel_end = sel_end;
|
||||
if (print_data->sel_start < 0 || print_data->sel_end <= print_data->sel_start) {
|
||||
gtk_text_buffer_get_start_iter(buffer, &start);
|
||||
gtk_text_buffer_get_end_iter(buffer, &end);
|
||||
} else {
|
||||
gtk_text_buffer_get_iter_at_offset(buffer, &start, print_data->sel_start);
|
||||
gtk_text_buffer_get_iter_at_offset(buffer, &end, print_data->sel_end);
|
||||
}
|
||||
|
||||
print_data->text = gtk_text_buffer_get_text(buffer, &start, &end, FALSE);
|
||||
print_data->to_print = renderer->get_data_to_print(renderer_data, sel_start, sel_end);
|
||||
|
||||
if (settings == NULL) {
|
||||
settings = gtk_print_settings_new();
|
||||
|
@ -180,8 +194,8 @@ void printing_print(GtkTextView *text_view, GtkWindow *parent, gint sel_start, g
|
|||
gtk_print_operation_set_default_page_setup(op, page_setup);
|
||||
|
||||
/* signals */
|
||||
g_signal_connect(op, "begin_print", G_CALLBACK(cb_begin_print), print_data);
|
||||
g_signal_connect(op, "draw_page", G_CALLBACK(cb_draw_page), print_data);
|
||||
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);
|
||||
g_signal_connect(op, "preview", G_CALLBACK(cb_preview), print_data);
|
||||
|
||||
/* Start printing process */
|
||||
|
@ -207,8 +221,8 @@ void printing_print(GtkTextView *text_view, GtkWindow *parent, gint sel_start, g
|
|||
|
||||
g_hash_table_foreach(print_data->images, free_pixbuf, NULL);
|
||||
g_hash_table_destroy(print_data->images);
|
||||
if(print_data->text)
|
||||
g_free(print_data->text);
|
||||
if(print_data->to_print)
|
||||
g_free(print_data->to_print);
|
||||
g_list_free(print_data->page_breaks);
|
||||
if(print_data->layout)
|
||||
g_object_unref(print_data->layout);
|
||||
|
@ -219,6 +233,42 @@ void printing_print(GtkTextView *text_view, GtkWindow *parent, gint sel_start, g
|
|||
debug_print("printing_print finished\n");
|
||||
}
|
||||
|
||||
static PangoContext *printing_textview_get_pango_context(gpointer data)
|
||||
{
|
||||
return gtk_widget_get_pango_context(GTK_WIDGET(data));
|
||||
}
|
||||
|
||||
static gpointer printing_textview_get_data_to_print(gpointer data, gint sel_start, gint sel_end)
|
||||
{
|
||||
GtkTextView *text_view = GTK_TEXT_VIEW(data);
|
||||
GtkTextBuffer *buffer = gtk_text_view_get_buffer(text_view);
|
||||
GtkTextIter start, end;
|
||||
|
||||
if (sel_start < 0 || sel_end <= sel_start) {
|
||||
gtk_text_buffer_get_start_iter(buffer, &start);
|
||||
gtk_text_buffer_get_end_iter(buffer, &end);
|
||||
} else {
|
||||
gtk_text_buffer_get_iter_at_offset(buffer, &start, sel_start);
|
||||
gtk_text_buffer_get_iter_at_offset(buffer, &end, sel_end);
|
||||
}
|
||||
|
||||
return gtk_text_buffer_get_text(buffer, &start, &end, FALSE);
|
||||
}
|
||||
|
||||
void printing_print(GtkTextView *text_view, GtkWindow *parent, gint sel_start, gint sel_end)
|
||||
{
|
||||
PrintRenderer *textview_renderer = g_new0(PrintRenderer, 1);
|
||||
|
||||
textview_renderer->get_pango_context = printing_textview_get_pango_context;
|
||||
textview_renderer->get_data_to_print = printing_textview_get_data_to_print;
|
||||
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);
|
||||
|
||||
g_free(textview_renderer);
|
||||
}
|
||||
|
||||
void printing_page_setup(GtkWindow *parent)
|
||||
{
|
||||
GtkPageSetup *new_page_setup;
|
||||
|
@ -697,7 +747,7 @@ static void cb_preview_request_page_setup(GtkPrintOperation *op,
|
|||
GTK_UNIT_INCH);
|
||||
}
|
||||
|
||||
static void cb_begin_print(GtkPrintOperation *op, GtkPrintContext *context,
|
||||
static void printing_textview_cb_begin_print(GtkPrintOperation *op, GtkPrintContext *context,
|
||||
gpointer user_data)
|
||||
{
|
||||
double width, height;
|
||||
|
@ -731,7 +781,7 @@ static void cb_begin_print(GtkPrintOperation *op, GtkPrintContext *context,
|
|||
pango_font_description_free(desc);
|
||||
|
||||
pango_layout_set_width(print_data->layout, width * PANGO_SCALE);
|
||||
pango_layout_set_text(print_data->layout, print_data->text, -1);
|
||||
pango_layout_set_text(print_data->layout, (char *)print_data->to_print, -1);
|
||||
|
||||
printing_layout_set_text_attributes(print_data, context);
|
||||
|
||||
|
@ -858,7 +908,7 @@ static cairo_surface_t *pixbuf_to_surface(GdkPixbuf *pixbuf)
|
|||
return surface;
|
||||
}
|
||||
|
||||
static void cb_draw_page(GtkPrintOperation *op, GtkPrintContext *context,
|
||||
static void printing_textview_cb_draw_page(GtkPrintOperation *op, GtkPrintContext *context,
|
||||
int page_nr, gpointer user_data)
|
||||
{
|
||||
cairo_t *cr;
|
||||
|
@ -935,12 +985,14 @@ static void printing_layout_set_text_attributes(PrintData *print_data, GtkPrintC
|
|||
PangoAttrList *attr_list;
|
||||
PangoAttribute *attr;
|
||||
GSList *open_attrs, *attr_walk;
|
||||
GtkTextView *text_view = GTK_TEXT_VIEW(print_data->renderer_data);
|
||||
GtkTextBuffer *buffer = gtk_text_view_get_buffer(text_view);
|
||||
|
||||
attr_list = pango_attr_list_new();
|
||||
if (print_data->sel_start < 0 || print_data->sel_end <= print_data->sel_start) {
|
||||
gtk_text_buffer_get_start_iter(print_data->buffer, &iter);
|
||||
gtk_text_buffer_get_start_iter(buffer, &iter);
|
||||
} else {
|
||||
gtk_text_buffer_get_iter_at_offset(print_data->buffer, &iter, print_data->sel_start);
|
||||
gtk_text_buffer_get_iter_at_offset(buffer, &iter, print_data->sel_start);
|
||||
}
|
||||
|
||||
open_attrs = NULL;
|
||||
|
|
|
@ -28,8 +28,24 @@
|
|||
|
||||
#if GTK_CHECK_VERSION(2,10,0) && !defined(USE_GNOMEPRINT)
|
||||
|
||||
typedef struct _PrintData PrintData;
|
||||
|
||||
typedef struct _PrintRenderer {
|
||||
PangoContext *(*get_pango_context)(gpointer renderer_data);
|
||||
gpointer (*get_data_to_print)(gpointer renderer_data, gint sel_start, gint sel_end);
|
||||
void (*cb_begin_print)(GtkPrintOperation *op, GtkPrintContext *context,
|
||||
gpointer user_data);
|
||||
void (*cb_draw_page)(GtkPrintOperation* op, GtkPrintContext*, gint page_nr,
|
||||
gpointer user_data);
|
||||
} PrintRenderer;
|
||||
|
||||
void printing_print(GtkTextView*, GtkWindow*, gint, gint);
|
||||
void printing_print_full(GtkWindow *parent, PrintRenderer *renderer, gpointer renderer_data,
|
||||
gint sel_start, gint sel_end);
|
||||
void printing_page_setup(GtkWindow*);
|
||||
gpointer printing_get_renderer_data(PrintData *print_data);
|
||||
gdouble printing_get_zoom(PrintData *print_data);
|
||||
void printing_set_n_pages(PrintData *print_data, gint n_pages);
|
||||
|
||||
#endif /* GTK+ >= 2.10.0 */
|
||||
|
||||
|
|
Loading…
Reference in a new issue