LIBDIVECOMPUTERARCHIVE = $(LIBDIVECOMPUTERDIR)/lib/libdivecomputer.a
OBJS = main.o dive.o profile.o info.o equipment.o divelist.o \
- parse-xml.o save-xml.o libdivecomputer.o
+ parse-xml.o save-xml.o libdivecomputer.o print.o
divelog: $(OBJS)
$(CC) $(LDFLAGS) -o divelog $(OBJS) \
divelist.o: divelist.c dive.h display.h divelist.h
$(CC) $(CFLAGS) `pkg-config --cflags gtk+-2.0 glib-2.0` -c divelist.c
+print.o: print.c dive.h display.h
+ $(CC) $(CFLAGS) `pkg-config --cflags gtk+-2.0 glib-2.0` -c print.c
+
libdivecomputer.o: libdivecomputer.c dive.h display.h
$(CC) $(CFLAGS) `pkg-config --cflags gtk+-2.0 glib-2.0` \
-I$(LIBDIVECOMPUTERINCLUDES) \
extern GtkWidget *equipment_widget(void);
extern void repaint_dive(void);
+extern void do_print(void);
+
+/*
+ * Cairo scaling really is horribly horribly mis-designed.
+ *
+ * Which is sad, because I really like Cairo otherwise. But
+ * the fact that the line width is scaled with the same scale
+ * as the coordinate system is a f*&%ing disaster. So we
+ * can't use it, and instead have this butt-ugly wrapper thing..
+ */
+struct graphics_context {
+ cairo_t *cr;
+ double maxx, maxy;
+ double leftx, rightx;
+ double topy, bottomy;
+};
+
+extern void plot(struct graphics_context *gc, int w, int h, struct dive *dive);
#endif
{ "FileMenuAction", GTK_STOCK_FILE, "Log", NULL, NULL, NULL},
{ "OpenFile", GTK_STOCK_OPEN, NULL, "<control>O", NULL, G_CALLBACK(file_open) },
{ "SaveFile", GTK_STOCK_SAVE, NULL, "<control>S", NULL, G_CALLBACK(file_save) },
+ { "Print", GTK_STOCK_PRINT, NULL, "<control>P", NULL, G_CALLBACK(do_print) },
{ "Import", NULL, "Import", NULL, NULL, G_CALLBACK(import_dialog) },
{ "Units", NULL, "Units", NULL, NULL, G_CALLBACK(unit_dialog) },
{ "Renumber", NULL, "Renumber", NULL, NULL, G_CALLBACK(renumber_dialog) },
<menu name=\"FileMenu\" action=\"FileMenuAction\"> \
<menuitem name=\"Open\" action=\"OpenFile\" /> \
<menuitem name=\"Save\" action=\"SaveFile\" /> \
+ <menuitem name=\"Print\" action=\"Print\" /> \
<separator name=\"Separator1\"/> \
<menuitem name=\"Import\" action=\"Import\" /> \
<separator name=\"Separator2\"/> \
--- /dev/null
+#include <gtk/gtk.h>
+
+#include "dive.h"
+#include "display.h"
+
+static void draw_page(GtkPrintOperation *operation,
+ GtkPrintContext *context,
+ gint page_nr,
+ gpointer user_data)
+{
+ cairo_t *cr;
+ PangoLayout *layout;
+ double w, h;
+ struct graphics_context gc = { 0 };
+
+ cr = gtk_print_context_get_cairo_context(context);
+ gc.cr = cr;
+
+ layout=gtk_print_context_create_pango_layout(context);
+
+ w = gtk_print_context_get_width(context);
+ h = gtk_print_context_get_height(context);
+
+ /* Do the profile on the top third of the page.. */
+ cairo_set_source_rgb(cr, 0, 0, 0);
+ cairo_rectangle(cr, 0, 0, w, h/3);
+ cairo_fill(cr);
+ plot(&gc, w, h/3, current_dive);
+
+ pango_cairo_show_layout(cr,layout);
+ g_object_unref(layout);
+}
+
+static void begin_print(GtkPrintOperation *operation, gpointer user_data)
+{
+}
+
+static GtkPrintSettings *settings = NULL;
+
+void do_print(void)
+{
+ GtkPrintOperation *print;
+ GtkPrintOperationResult res;
+
+ print = gtk_print_operation_new();
+ if (settings != NULL)
+ gtk_print_operation_set_print_settings(print, settings);
+ gtk_print_operation_set_n_pages(print, 1);
+ g_signal_connect(print, "begin_print", G_CALLBACK(begin_print), NULL);
+ g_signal_connect(print, "draw_page", G_CALLBACK(draw_page), NULL);
+ res = gtk_print_operation_run(print, GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG,
+ GTK_WINDOW(main_window), NULL);
+ if (res == GTK_PRINT_OPERATION_RESULT_APPLY) {
+ if (settings != NULL)
+ g_object_unref(settings);
+ settings = g_object_ref(gtk_print_operation_get_print_settings(print));
+ }
+ g_object_unref(print);
+}
int selected_dive = 0;
-/*
- * Cairo scaling really is horribly horribly mis-designed.
- *
- * Which is sad, because I really like Cairo otherwise. But
- * the fact that the line width is scaled with the same scale
- * as the coordinate system is a f*&%ing disaster. So we
- * can't use it, and instead have this butt-ugly wrapper thing..
- */
-struct graphics_context {
- cairo_t *cr;
- double maxx, maxy;
- double leftx, rightx;
- double topy, bottomy;
-};
-
/* Plot info with smoothing and one-, two- and three-minute minimums and maximums */
struct plot_info {
int nr;
return analyze_plot_info(pi);
}
-static void plot(struct graphics_context *gc, int w, int h, struct dive *dive)
+void plot(struct graphics_context *gc, int w, int h, struct dive *dive)
{
double topx, topy;
struct plot_info *pi = depth_plot_info(dive);