diff options
-rw-r--r-- | src/evbp-viewer.c | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/src/evbp-viewer.c b/src/evbp-viewer.c index 1c7ad70..1f19f6a 100644 --- a/src/evbp-viewer.c +++ b/src/evbp-viewer.c @@ -170,6 +170,58 @@ evbp_viewer_open_evince(GtkAction *action, EvbpViewer *viewer) } static void +evbp_print_done_cb(EvPrintOperation *print, GtkPrintOperationResult result, + gpointer data) +{ + EvbpViewer *viewer = data; + + /* FIXME: handle storing print settings */ + if (result == GTK_PRINT_OPERATION_RESULT_ERROR) { + GtkWidget *dialog; + GError *error = NULL; + + ev_print_operation_get_error(print, &error); + dialog = gtk_message_dialog_new(GTK_WINDOW(viewer), + GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_MESSAGE_ERROR, + GTK_BUTTONS_CLOSE, + "Failed to print document"); + gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(dialog), + error->message); + g_error_free(error); + g_signal_connect(dialog, "response", G_CALLBACK(gtk_widget_destroy), + NULL); + gtk_widget_show(dialog); + } +} + +static void +evbp_viewer_print(GtkAction *action, EvbpViewer *viewer) +{ + EvPrintOperation *print; + const gchar *title; + gint current_page; + GtkWindow *parent; + + print = ev_print_operation_new(viewer->document); + if (!print) { + g_warning("Printing is not supported for this document\n"); + return; + } + g_signal_connect(print, "done", G_CALLBACK(evbp_print_done_cb), viewer); + + /* setup the print job with a reasonable title if possible */ + title = ev_document_get_title(viewer->document); + if (title) + ev_print_operation_set_job_name(print, title); + current_page = ev_document_model_get_page(viewer->model); + ev_print_operation_set_current_page(print, current_page); + + parent = GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(viewer))); + ev_print_operation_run(print, GTK_WINDOW(parent)); +} + +static void evbp_viewer_previous_page(GtkAction *action, EvbpViewer *viewer) { ev_view_previous_page(EV_VIEW(viewer->view)); @@ -329,6 +381,10 @@ static const GtkActionEntry action_entries[] = { "_Open in Evince", NULL, "Open the document in the Evince viewer", G_CALLBACK(evbp_viewer_open_evince) }, + { "Print", GTK_STOCK_PRINT, + "_Print", "<control>p", + "Print the document", + G_CALLBACK(evbp_viewer_print) }, { "GoPreviousPage", GTK_STOCK_GO_UP, "_Previous Page", "<control>Page_Up", "Go to the previous page", @@ -364,6 +420,7 @@ static const gchar ui_string[] = " <toolbar name=\"ViewerToolbar\">\n" " <toolitem name=\"SaveCopy\" action =\"SaveCopy\"/>\n" " <toolitem name=\"OpenInEvince\" action =\"OpenInEvince\"/>\n" + " <toolitem name=\"Print\" action=\"Print\"/>\n" " <separator/>\n" " <toolitem name=\"GoPreviousPage\" action=\"GoPreviousPage\"/>\n" " <toolitem name=\"GoNextPage\" action=\"GoNextPage\"/>\n" |