File viewnior-1.4-print.patch of Package viewnior
Index: viewnior-1.4/configure.ac
===================================================================
--- viewnior-1.4.orig/configure.ac
+++ viewnior-1.4/configure.ac
@@ -54,6 +54,7 @@ EXIV2_REQUIRED=0.21
VNR_MODULES="gtk+-2.0 >= $GTK_REQUIRED \
+ gtk+-unix-print-2.0 >= $GTK_REQUIRED \
glib-2.0 >= $GLIB_REQUIRED \
gio-2.0 >= $GLIB_REQUIRED \
shared-mime-info >= $SHARED_MIME_INFO_REQUIRED \
Index: viewnior-1.4/src/vnr-prefs.c
===================================================================
--- viewnior-1.4.orig/src/vnr-prefs.c
+++ viewnior-1.4/src/vnr-prefs.c
@@ -168,6 +168,8 @@ vnr_prefs_set_default(VnrPrefs *prefs)
prefs->start_slideshow = FALSE;
prefs->start_fullscreen = FALSE;
prefs->auto_resize = FALSE;
+ prefs->page_setup = NULL;
+ prefs->print_settings = NULL;
}
static GtkWidget *
@@ -368,6 +370,9 @@ vnr_prefs_load (VnrPrefs *prefs)
prefs->jpeg_quality = g_key_file_get_integer (conf, "prefs", "jpeg-quality", &error);
prefs->png_compression = g_key_file_get_integer (conf, "prefs", "png-compression", &error);
+ prefs->page_setup = gtk_page_setup_new_from_key_file (conf, NULL, NULL);
+ prefs->print_settings = gtk_print_settings_new_from_key_file (conf, NULL, NULL);
+
if(error != NULL)
{
g_warning("Parsing config file: %s. All preferences are set to their default values.", error->message);
@@ -457,6 +462,11 @@ vnr_prefs_save (VnrPrefs *prefs)
g_key_file_set_integer (conf, "prefs", "jpeg-quality", prefs->jpeg_quality);
g_key_file_set_integer (conf, "prefs", "png-compression", prefs->png_compression);
+ if (prefs->page_setup)
+ gtk_page_setup_to_key_file (prefs->page_setup, conf, NULL);
+ if (prefs->print_settings)
+ gtk_print_settings_to_key_file (prefs->print_settings, conf, NULL);
+
if(g_mkdir_with_parents (dir, 0700) != 0)
g_warning("Error creating config file's parent directory (%s)\n", dir);
Index: viewnior-1.4/src/vnr-prefs.h
===================================================================
--- viewnior-1.4.orig/src/vnr-prefs.h
+++ viewnior-1.4/src/vnr-prefs.h
@@ -98,6 +98,9 @@ struct _VnrPrefs {
GtkWidget *vnr_win;
GtkSpinButton *slideshow_timeout_widget;
+
+ GtkPrintSettings *print_settings;
+ GtkPageSetup *page_setup;
};
struct _VnrPrefsClass {
Index: viewnior-1.4/src/vnr-window.c
===================================================================
--- viewnior-1.4.orig/src/vnr-window.c
+++ viewnior-1.4/src/vnr-window.c
@@ -25,6 +25,7 @@
#include <glib/gstdio.h>
#include <gtk/gtk.h>
#include <gdk/gdkkeysyms.h>
+#include <gtk/gtkunixprint.h>
#include <errno.h>
#include <sys/wait.h>
#include "vnr-window.h"
@@ -125,6 +126,9 @@ const gchar *ui_definition = "<ui>"
"<menuitem action=\"FileReload\"/>"
"<menuitem action=\"FileProperties\"/>"
"<separator/>"
+ "<menuitem action=\"FilePageSetup\"/>"
+ "<menuitem action=\"FilePrint\"/>"
+ "<separator/>"
"<menu action=\"Edit\">"
"<menuitem action=\"FileDelete\"/>"
"<separator/>"
@@ -169,6 +173,8 @@ const gchar *ui_definition = "<ui>"
"<separator/>"
"<toolitem action=\"ImageRotateCCW\"/>"
"<toolitem action=\"ImageRotateCW\"/>"
+ "<separator/>"
+ "<toolitem action=\"FilePrint\"/>"
"<separator expand=\"true\"/>"
"<toolitem action=\"Properties\"/>"
"</toolbar>"
@@ -190,6 +196,8 @@ const gchar *ui_definition = "<ui>"
"<menuitem name=\"Fullscreen\" action=\"ViewFullscreen\"/>"
"<separator/>"
"<menuitem action=\"FileProperties\"/>"
+ "<separator/>"
+ "<menuitem action=\"FilePrint\"/>"
"</popup>"
"<accelerator name=\"ControlEqualAccel\" action=\"ControlEqual\"/>"
"<accelerator name=\"ControlKPAddAccel\" action=\"ControlKpAdd\"/>"
@@ -1021,6 +1029,51 @@ vnr_window_cmd_main_menu_hidden (GtkWidg
}
static void
+draw_page_cb (GtkPrintOperation * oper,
+ GtkPrintContext * context,
+ gint nr, VnrWindow *window)
+{
+ cairo_t *cr;
+ GdkPixbuf *source_pixbuf;
+
+ cr = gtk_print_context_get_cairo_context (context);
+
+ source_pixbuf = UNI_IMAGE_VIEW (window->view)->pixbuf;
+
+ if (source_pixbuf)
+ {
+ GdkPixbuf *pixbuf;
+ guint iw, ih;
+ gdouble pw, ph;
+ gdouble factor;
+
+ /* scale image to page size */
+ pw = gtk_page_setup_get_paper_width (window->prefs->page_setup, GTK_UNIT_POINTS)
+ - gtk_page_setup_get_left_margin (window->prefs->page_setup, GTK_UNIT_POINTS)
+ - gtk_page_setup_get_right_margin (window->prefs->page_setup, GTK_UNIT_POINTS);
+ ph = gtk_page_setup_get_paper_height (window->prefs->page_setup, GTK_UNIT_POINTS)
+ - gtk_page_setup_get_top_margin (window->prefs->page_setup, GTK_UNIT_POINTS)
+ - gtk_page_setup_get_bottom_margin (window->prefs->page_setup, GTK_UNIT_POINTS);
+
+ iw = gdk_pixbuf_get_width (source_pixbuf);
+ ih = gdk_pixbuf_get_height (source_pixbuf);
+
+ factor = MIN (pw / iw, ph / ih);
+ factor = (factor > 1.0) ? 1.0 : factor;
+
+ pixbuf = gdk_pixbuf_scale_simple (source_pixbuf,
+ iw * factor, ih * factor,
+ GDK_INTERP_HYPER);
+
+ /* add image to surface */
+ gdk_cairo_set_source_pixbuf (cr, pixbuf, 0.0, 0.0);
+ cairo_paint (cr);
+
+ g_object_unref (pixbuf);
+ }
+}
+
+static void
leave_fs_cb (GtkButton *button, VnrWindow *window)
{
vnr_window_unfullscreen (window);
@@ -1380,6 +1433,65 @@ vnr_window_cmd_about (GtkAction *action,
}
static void
+vnr_window_cmd_page_setup (GtkAction *action, VnrWindow *window)
+{
+ GtkWidget *dlg;
+
+ dlg = gtk_page_setup_unix_dialog_new(_("Page settings"), GTK_WINDOW(window));
+ if (window->prefs->page_setup)
+ gtk_page_setup_unix_dialog_set_page_setup(GTK_PAGE_SETUP_UNIX_DIALOG(dlg),
+ window->prefs->page_setup);
+ if (window->prefs->print_settings)
+ gtk_page_setup_unix_dialog_set_print_settings(GTK_PAGE_SETUP_UNIX_DIALOG(dlg),
+ window->prefs->print_settings);
+ if (gtk_dialog_run (GTK_DIALOG (dlg)) == 0)
+ {
+ window->prefs->page_setup = gtk_page_setup_unix_dialog_get_page_setup
+ (GTK_PAGE_SETUP_UNIX_DIALOG (dlg));
+ window->prefs->print_settings = gtk_page_setup_unix_dialog_get_print_settings
+ (GTK_PAGE_SETUP_UNIX_DIALOG (dlg));
+ }
+ gtk_widget_destroy (dlg);
+}
+
+static void
+vnr_window_cmd_print (GtkAction *action, VnrWindow *window)
+{
+ GtkPrintOperation *op;
+
+ op = gtk_print_operation_new ();
+
+ if (!window->prefs->page_setup)
+ {
+ GtkPaperSize *size = gtk_paper_size_new (GTK_PAPER_NAME_A4);
+
+ window->prefs->page_setup = gtk_page_setup_new ();
+
+ gtk_page_setup_set_paper_size (window->prefs->page_setup, size);
+ gtk_page_setup_set_top_margin (window->prefs->page_setup, 0.5, GTK_UNIT_INCH);
+ gtk_page_setup_set_bottom_margin (window->prefs->page_setup, 0.5, GTK_UNIT_INCH);
+ gtk_page_setup_set_left_margin (window->prefs->page_setup, 0.5, GTK_UNIT_INCH);
+ gtk_page_setup_set_right_margin (window->prefs->page_setup, 0.5, GTK_UNIT_INCH);
+ gtk_page_setup_set_orientation (window->prefs->page_setup, GTK_PAGE_ORIENTATION_LANDSCAPE);
+
+ gtk_paper_size_free (size);
+ }
+ if (!window->prefs->print_settings)
+ window->prefs->print_settings = gtk_print_settings_new ();
+
+ gtk_print_operation_set_n_pages (op, 1);
+ gtk_print_operation_set_default_page_setup (op, window->prefs->page_setup);
+ gtk_print_operation_set_print_settings (op, window->prefs->print_settings);
+
+ g_signal_connect (G_OBJECT (op), "draw-page", G_CALLBACK (draw_page_cb), window);
+
+ gtk_print_operation_run (op, GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG,
+ GTK_WINDOW (window), NULL);
+
+ g_object_unref (op);
+}
+
+static void
vnr_set_wallpaper(GtkAction *action, VnrWindow *win)
{
pid_t pid;
@@ -1742,6 +1854,15 @@ static const GtkActionEntry action_entri
G_CALLBACK (vnr_window_cmd_preferences) }
};
+static const GtkActionEntry action_entries_print[] = {
+ { "FilePageSetup", GTK_STOCK_PAGE_SETUP, N_("Page Setup"), NULL,
+ N_("Set printer page settings"),
+ G_CALLBACK (vnr_window_cmd_page_setup) },
+ { "FilePrint", GTK_STOCK_PRINT, N_("_Print"), "<control>P",
+ N_("Print current image"),
+ G_CALLBACK (vnr_window_cmd_print) }
+};
+
static const GtkActionEntry action_entry_save[] = {
{ "FileSave", GTK_STOCK_SAVE, N_("_Save"), "<control>S",
N_("Save changes"),
@@ -2065,6 +2186,20 @@ vnr_window_init (VnrWindow * window)
gtk_ui_manager_insert_action_group (window->ui_mngr,
window->action_properties, 0);
+ window->actions_print = gtk_action_group_new("MenuActionPrint");
+
+
+ gtk_action_group_set_translation_domain (window->actions_print,
+ GETTEXT_PACKAGE);
+
+ gtk_action_group_add_actions (window->actions_print,
+ action_entries_print,
+ G_N_ELEMENTS (action_entries_print),
+ window);
+
+ gtk_ui_manager_insert_action_group (window->ui_mngr,
+ window->actions_print, 0);
+
window->actions_static_image = gtk_action_group_new("MenuActionsStaticImage");
@@ -2163,6 +2298,7 @@ vnr_window_init (VnrWindow * window)
gtk_action_group_set_sensitive(window->actions_image, FALSE);
gtk_action_group_set_sensitive(window->actions_static_image, FALSE);
gtk_action_group_set_sensitive(window->action_save, FALSE);
+ gtk_action_group_set_sensitive(window->actions_print, FALSE);
gtk_action_group_set_sensitive(window->actions_bars, TRUE);
/* Continue with layout */
@@ -2342,9 +2478,15 @@ vnr_window_open (VnrWindow * window, gbo
/* Return TRUE if the image is static */
if ( uni_anim_view_set_anim (UNI_ANIM_VIEW (window->view), pixbuf) )
+ {
+ gtk_action_group_set_sensitive(window->actions_print, TRUE);
gtk_action_group_set_sensitive(window->actions_static_image, TRUE);
+ }
else
+ {
+ gtk_action_group_set_sensitive(window->actions_print, FALSE);
gtk_action_group_set_sensitive(window->actions_static_image, FALSE);
+ }
if(window->mode != VNR_WINDOW_MODE_NORMAL && window->prefs->fit_on_fullscreen)
{
@@ -2436,6 +2578,7 @@ vnr_window_close(VnrWindow *window)
{
gtk_window_set_title (GTK_WINDOW (window), "Viewnior");
uni_anim_view_set_anim (UNI_ANIM_VIEW (window->view), NULL);
+ gtk_action_group_set_sensitive(window->actions_print, FALSE);
gtk_action_group_set_sensitive(window->actions_image, FALSE);
gtk_action_group_set_sensitive(window->action_wallpaper, FALSE);
gtk_action_group_set_sensitive(window->actions_static_image, FALSE);
Index: viewnior-1.4/src/vnr-window.h
===================================================================
--- viewnior-1.4.orig/src/vnr-window.h
+++ viewnior-1.4/src/vnr-window.h
@@ -53,6 +53,7 @@ struct _VnrWindow {
GtkActionGroup *actions_static_image;
GtkActionGroup *actions_collection;
GtkActionGroup *action_save;
+ GtkActionGroup *actions_print;
GtkActionGroup *action_properties;
GtkActionGroup *actions_bars;
GtkActionGroup *actions_open_with;