summaryrefslogtreecommitdiff
path: root/gtk
diff options
context:
space:
mode:
authorJohn Tytgat <joty@netsurf-browser.org>2008-08-14 20:32:10 +0000
committerJohn Tytgat <joty@netsurf-browser.org>2008-08-14 20:32:10 +0000
commite063a2a59d698dd96123b68a44b09f0623f80cab (patch)
tree1bd06130de988cb0f6da239800229387f189d21c /gtk
parent44856d86d4efb12e08c8ef7560f39233107dfa8a (diff)
downloadnetsurf-e063a2a59d698dd96123b68a44b09f0623f80cab.tar.gz
netsurf-e063a2a59d698dd96123b68a44b09f0623f80cab.tar.bz2
Second merge of Adam Blokus' GSoC work from his branch 'branches/adamblokus/netsurf'.
Merged revisions 4195-4211,4216,4219-4220,4222-4234,4236-4250,4252-4262,4264-4266,4268-4326,4329-4335,4338-4342,4344-4411,4413-4420,4422-4436,4438-4491,4494-4506,4508-4514,4516,4518-4552,4554,4556-4564,4567-4568,4570-4574,4576-4686,4689-4692,4694,4698-4709,4715-4723,4725-4755,4757-4769,4771-4919,4921-4996,4998-5110,5112-5117 via svnmerge from svn://svn.netsurf-browser.org/branches/adamblokus/netsurf ........ r4736 | adamblokus | 2008-07-26 13:46:54 +0200 (Sat, 26 Jul 2008) | 2 lines Sorting out some problems with svn. ........ r4737 | adamblokus | 2008-07-26 13:54:36 +0200 (Sat, 26 Jul 2008) | 4 lines Added export tab to the options dialog. Added the possibility of changing some print options. ........ r4897 | adamblokus | 2008-08-04 17:59:05 +0200 (Mon, 04 Aug 2008) | 5 lines Added checking of horizontal clipping. Added better table loosening. Changed some minor bugs. Applied changes in the Export options tab according to the review from tlsa. ........ r4905 | adamblokus | 2008-08-05 01:53:34 +0200 (Tue, 05 Aug 2008) | 2 lines Fixed bug which made it impossible to export pdf's. ........ r4919 | adamblokus | 2008-08-05 16:39:33 +0200 (Tue, 05 Aug 2008) | 2 lines Fixed some memory leaks which caused Netsurf to break. ........ r4927 | adamblokus | 2008-08-06 02:26:30 +0200 (Wed, 06 Aug 2008) | 4 lines Fixed bug with filenames which crashed Netsurf. Turned anti aliasing off for printing. Fixed some scaling issues. ........ r4928 | adamblokus | 2008-08-06 17:52:44 +0200 (Wed, 06 Aug 2008) | 5 lines Added new export/print options: - suppressing images - turning off backgrounds - toggled loosening ........ r4950 | adamblokus | 2008-08-07 21:15:21 +0200 (Thu, 07 Aug 2008) | 5 lines Added new options to PDF export: - document compression - document encryption Added PDF password dialog ........ r4954 | adamblokus | 2008-08-07 22:11:31 +0200 (Thu, 07 Aug 2008) | 2 lines Added saving print settings. ........ r4956 | adamblokus | 2008-08-07 22:44:48 +0200 (Thu, 07 Aug 2008) | 2 lines Fixes to PDF encryption ........ r4970 | adamblokus | 2008-08-09 15:26:24 +0200 (Sat, 09 Aug 2008) | 3 lines Fixed bug in plotting tiled bitmaps. Fixed bug with too long text decorations. ........ r4977 | adamblokus | 2008-08-09 19:18:56 +0200 (Sat, 09 Aug 2008) | 2 lines Fixed JPG embedding bug. ........ r4988 | adamblokus | 2008-08-10 16:59:51 +0200 (Sun, 10 Aug 2008) | 3 lines Added clip checking to pdf plotters. No more "blank" clips. Made PDF compression a default setting. ........ r4995 | adamblokus | 2008-08-10 20:03:00 +0200 (Sun, 10 Aug 2008) | 2 lines Fixed Haru crash on font-size==0. ........ r4996 | adamblokus | 2008-08-10 21:04:43 +0200 (Sun, 10 Aug 2008) | 2 lines Added changing text mode only if necessary. ........ r5045 | adamblokus | 2008-08-11 21:26:26 +0200 (Mon, 11 Aug 2008) | 3 lines Removing gtk stuff from core code. Little fix in options. ........ r5048 | adamblokus | 2008-08-11 21:57:45 +0200 (Mon, 11 Aug 2008) | 2 lines Better font size checking in PDF export. ........ r5050 | adamblokus | 2008-08-11 22:19:56 +0200 (Mon, 11 Aug 2008) | 2 lines Fixed riscos text scale bug. ........ r5073 | adamblokus | 2008-08-12 17:40:57 +0200 (Tue, 12 Aug 2008) | 2 lines Added missing tooltips ........ r5092 | adamblokus | 2008-08-13 17:09:25 +0200 (Wed, 13 Aug 2008) | 2 lines Moved /pdf folder to desktop/save_pdf ........ r5110 | adamblokus | 2008-08-13 22:44:50 +0200 (Wed, 13 Aug 2008) | 2 lines Added comments. ........ r5113 | adamblokus | 2008-08-13 23:07:35 +0200 (Wed, 13 Aug 2008) | 2 lines Cosmetic changes ........ r5116 | adamblokus | 2008-08-14 16:10:18 +0200 (Thu, 14 Aug 2008) | 2 lines Fixed bug with BOX_INLINE_END in tree duplication. ........ r5117 | joty | 2008-08-14 21:47:46 +0200 (Thu, 14 Aug 2008) | 1 line Improvement for r5116: use local vars when possible; rename global last to box_duplicate_last; check on box_duplicate_main_tree failure. ........ svn path=/trunk/netsurf/; revision=5118
Diffstat (limited to 'gtk')
-rw-r--r--gtk/dialogs/gtk_about.c7
-rw-r--r--gtk/dialogs/gtk_options.c78
-rw-r--r--gtk/gtk_gui.c112
-rw-r--r--gtk/gtk_gui.h1
-rw-r--r--gtk/gtk_print.c17
-rw-r--r--gtk/gtk_print.h14
-rw-r--r--gtk/gtk_scaffolding.c73
-rw-r--r--gtk/res/netsurf.glade275
-rw-r--r--gtk/res/options.glade429
9 files changed, 951 insertions, 55 deletions
diff --git a/gtk/dialogs/gtk_about.c b/gtk/dialogs/gtk_about.c
index e39af1cc2..81d22cea8 100644
--- a/gtk/dialogs/gtk_about.c
+++ b/gtk/dialogs/gtk_about.c
@@ -52,9 +52,10 @@ void nsgtk_about_dialog_init(GtkWindow *parent, struct browser_window *bw, const
gtk_about_dialog_set_url_hook (launch_url, (gpointer) bw, NULL);
gtk_show_about_dialog(parent, "artists", artists, "authors", authors,
- "comments", description,"copyright", copyright,
- "documenters", documenters, "license", licence, "program-name", name,
- "translator-credits", translators, "version", version, "website", url,
+ "comments", description,"copyright", copyright, "documenters", documenters,
+ "license", licence,
+ "program-name", name, "translator-credits", translators,
+ "version", version, "website", url, "website-label", url_label,
"wrap-license", FALSE, NULL);
}
diff --git a/gtk/dialogs/gtk_options.c b/gtk/dialogs/gtk_options.c
index b205d2d87..29ea54b1b 100644
--- a/gtk/dialogs/gtk_options.c
+++ b/gtk/dialogs/gtk_options.c
@@ -20,7 +20,6 @@
#include <stdlib.h>
#include <string.h>
#include <errno.h>
-#include <math.h>
#include <gtk/gtk.h>
#include <glade/glade.h>
#include "utils/log.h"
@@ -31,6 +30,8 @@
#include "gtk/dialogs/gtk_options.h"
#include "gtk/gtk_window.h"
+#include "desktop/print.h"
+
GtkDialog *wndPreferences;
GladeXML *gladeFile;
gboolean is_initialized = FALSE;
@@ -86,6 +87,18 @@ DECLARE(checkClearDownloads);
DECLARE(checkRequestOverwrite);
DECLARE(fileChooserDownloads);
+DECLARE(spinMarginTop);
+DECLARE(spinMarginBottom);
+DECLARE(spinMarginLeft);
+DECLARE(spinMarginRight);
+DECLARE(spinExportScale);
+DECLARE(checkSuppressImages);
+DECLARE(checkRemoveBackgrounds);
+DECLARE(checkFitPage);
+DECLARE(checkCompressPDF);
+DECLARE(checkPasswordPDF);
+DECLARE(setDefaultExportOptions);
+
/* Used when the feature is not implemented yet */
#define FIND_WIDGET(x) (x) = glade_xml_get_widget(gladeFile, #x); \
if ((x) == NULL) LOG(("Unable to find widget '%s'!", #x))
@@ -149,6 +162,19 @@ GtkDialog* nsgtk_options_init(struct browser_window *bw, GtkWindow *parent) {
CONNECT(checkRequestOverwrite, "toggled");
CONNECT(fileChooserDownloads, "current-folder-changed");
+ CONNECT(spinMarginTop, "value-changed");
+ CONNECT(spinMarginBottom, "value-changed");
+ CONNECT(spinMarginLeft, "value-changed");
+ CONNECT(spinMarginRight, "value-changed");
+ CONNECT(spinExportScale, "value-changed");
+ CONNECT(checkSuppressImages, "toggled");
+ CONNECT(checkRemoveBackgrounds, "toggled");
+ CONNECT(checkFitPage, "toggled");
+ CONNECT(checkCompressPDF, "toggled");
+ CONNECT(checkPasswordPDF, "toggled");
+ CONNECT(setDefaultExportOptions, "clicked");
+
+
g_signal_connect(G_OBJECT(wndPreferences), "response",
G_CALLBACK (dialog_response_handler), NULL);
@@ -233,6 +259,18 @@ void nsgtk_options_load(void) {
SET_CHECK(checkClearDownloads, option_downloads_clear);
SET_CHECK(checkRequestOverwrite, option_request_overwrite);
SET_FILE_CHOOSER(fileChooserDownloads, option_downloads_directory);
+
+ SET_SPIN(spinMarginTop, option_margin_top);
+ SET_SPIN(spinMarginBottom, option_margin_bottom);
+ SET_SPIN(spinMarginLeft, option_margin_left);
+ SET_SPIN(spinMarginRight, option_margin_right);
+ SET_SPIN(spinExportScale, option_export_scale);
+ SET_CHECK(checkSuppressImages, option_suppress_images);
+ SET_CHECK(checkRemoveBackgrounds, option_remove_backgrounds);
+ SET_CHECK(checkFitPage, option_enable_loosening);
+ SET_CHECK(checkCompressPDF, option_enable_PDF_compression);
+ SET_CHECK(checkPasswordPDF, option_enable_PDF_password);
+ SET_BUTTON(setDefaultExportOptions);
}
static void dialog_response_handler (GtkDialog *dlg, gint res_id){
@@ -280,7 +318,6 @@ static gboolean on_dialog_close (GtkDialog *dlg, gboolean stay_alive){
(y) = gtk_file_chooser_get_current_folder(GTK_FILE_CHOOSER((x)));
#define BUTTON_CLICKED(x) gboolean on_##x##_changed(GtkWidget *widget, gpointer data) { \
LOG(("Signal emitted on '%s'", #x));
-
ENTRY_CHANGED(entryHomePageURL, option_homepage_url)}
return FALSE;}
BUTTON_CLICKED(setCurrentPage)
@@ -318,7 +355,7 @@ COMBO_CHANGED(comboProxyType, proxy_type)
option_http_proxy_auth = OPTION_HTTP_PROXY_AUTH_NTLM;
break;
}
- gboolean sensitive = (option_http_proxy_auth);
+ gboolean sensitive = (!proxy_type == 0);
gtk_widget_set_sensitive (entryProxyHost, sensitive);
gtk_widget_set_sensitive (entryProxyPort, sensitive);
gtk_widget_set_sensitive (entryProxyUser, sensitive);
@@ -383,3 +420,38 @@ SPIN_CHANGED(spinDiscCacheAge, option_disc_cache_age)}
CHECK_CHANGED(checkClearDownloads, option_downloads_clear)}
CHECK_CHANGED(checkRequestOverwrite, option_request_overwrite)}
FILE_CHOOSER_CHANGED(fileChooserDownloads, option_downloads_directory)}
+
+SPIN_CHANGED(spinMarginTop, option_margin_top)}
+SPIN_CHANGED(spinMarginBottom, option_margin_bottom)}
+SPIN_CHANGED(spinMarginLeft, option_margin_left)}
+SPIN_CHANGED(spinMarginRight, option_margin_right)}
+SPIN_CHANGED(spinExportScale, option_export_scale)}
+CHECK_CHANGED(checkSuppressImages, option_suppress_images)}
+CHECK_CHANGED(checkRemoveBackgrounds, option_remove_backgrounds)}
+CHECK_CHANGED(checkFitPage, option_enable_loosening)}
+CHECK_CHANGED(checkCompressPDF, option_enable_PDF_compression)}
+CHECK_CHANGED(checkPasswordPDF, option_enable_PDF_password)}
+BUTTON_CLICKED(setDefaultExportOptions)
+ option_margin_top = DEFAULT_MARGIN_TOP_MM;
+ option_margin_bottom = DEFAULT_MARGIN_BOTTOM_MM;
+ option_margin_left = DEFAULT_MARGIN_LEFT_MM;
+ option_margin_right = DEFAULT_MARGIN_RIGHT_MM;
+ option_export_scale = DEFAULT_EXPORT_SCALE * 100;
+ option_suppress_images = false;
+ option_remove_backgrounds = false;
+ option_enable_loosening = true;
+ option_enable_PDF_compression = true;
+ option_enable_PDF_password = false;
+
+ SET_SPIN(spinMarginTop, option_margin_top);
+ SET_SPIN(spinMarginBottom, option_margin_bottom);
+ SET_SPIN(spinMarginLeft, option_margin_left);
+ SET_SPIN(spinMarginRight, option_margin_right);
+ SET_SPIN(spinExportScale, option_export_scale);
+ SET_CHECK(checkSuppressImages, option_suppress_images);
+ SET_CHECK(checkRemoveBackgrounds, option_remove_backgrounds);
+ SET_CHECK(checkCompressPDF, option_enable_PDF_compression);
+ SET_CHECK(checkPasswordPDF, option_enable_PDF_password);
+ SET_CHECK(checkFitPage, option_enable_loosening);
+
+}
diff --git a/gtk/gtk_gui.c b/gtk/gtk_gui.c
index 2efa5fa15..359f1d7dd 100644
--- a/gtk/gtk_gui.c
+++ b/gtk/gtk_gui.c
@@ -44,6 +44,7 @@
#include "desktop/gui.h"
#include "desktop/netsurf.h"
#include "desktop/options.h"
+#include "desktop/save_pdf/pdf_plotters.h"
#include "gtk/gtk_gui.h"
#include "gtk/dialogs/gtk_options.h"
#include "gtk/gtk_completion.h"
@@ -69,6 +70,7 @@ char *adblock_stylesheet_url;
char *options_file_location;
char *glade_file_location;
char *res_dir_location;
+char *print_options_file_location;
struct gui_window *search_current_window = 0;
@@ -89,6 +91,8 @@ static void nsgtk_ssl_accept(GtkButton *w, gpointer data);
static void nsgtk_ssl_reject(GtkButton *w, gpointer data);
static void nsgtk_select_menu_clicked(GtkCheckMenuItem *checkmenuitem,
gpointer user_data);
+static void nsgtk_PDF_set_pass(GtkButton *w, gpointer data);
+static void nsgtk_PDF_no_pass(GtkButton *w, gpointer data);
/**
* Locate a shared resource file by searching known places in order.
@@ -287,7 +291,7 @@ void gui_init(int argc, char** argv)
LOG(("Using '%s' as download directory", home));
option_downloads_directory = home;
}
-
+
find_resource(buf, "messages", "./gtk/res/messages");
LOG(("Using '%s' as Messages file", buf));
messages_load(buf);
@@ -304,6 +308,10 @@ void gui_init(int argc, char** argv)
adblock_stylesheet_url = path_to_url(buf);
LOG(("Using '%s' as AdBlock CSS URL", adblock_stylesheet_url));
+ find_resource(buf, "Print", "~/.netsurf/Print");
+ LOG(("Using '%s' as Print Settings file", buf));
+ print_options_file_location = strdup(buf);
+
urldb_load(option_url_file);
urldb_load_cookies(option_cookie_file);
@@ -409,6 +417,7 @@ void gui_quit(void)
free(adblock_stylesheet_url);
free(option_cookie_file);
free(option_cookie_jar);
+ free(print_options_file_location);
gtk_fetch_filetype_fin();
#ifdef WITH_HUBBUB
/* We don't care if this fails as we're about to die, anyway */
@@ -618,3 +627,104 @@ bool cookies_update(const char *domain, const struct cookie_data *data)
{
return true;
}
+
+void PDF_Password(char **owner_pass, char **user_pass, char *path)
+{
+ GladeXML *x = glade_xml_new(glade_file_location, NULL, NULL);
+ GtkWindow *wnd = GTK_WINDOW(glade_xml_get_widget(x, "wndPDFPassword"));
+ GtkButton *ok, *no;
+ void **data = malloc(5 * sizeof(void *));
+
+ *owner_pass = NULL;
+ *user_pass = NULL;
+
+ data[0] = owner_pass;
+ data[1] = user_pass;
+ data[2] = wnd;
+ data[3] = x;
+ data[4] = path;
+
+ ok = GTK_BUTTON(glade_xml_get_widget(x, "buttonPDFSetPassword"));
+ no = GTK_BUTTON(glade_xml_get_widget(x, "buttonPDFNoPassword"));
+
+ g_signal_connect(G_OBJECT(ok), "clicked",
+ G_CALLBACK(nsgtk_PDF_set_pass), (gpointer)data);
+ g_signal_connect(G_OBJECT(no), "clicked",
+ G_CALLBACK(nsgtk_PDF_no_pass), (gpointer)data);
+
+ gtk_widget_show(GTK_WIDGET(wnd));
+}
+
+static void nsgtk_PDF_set_pass(GtkButton *w, gpointer data)
+{
+ char **owner_pass = ((void **)data)[0];
+ char **user_pass = ((void **)data)[1];
+ GtkWindow *wnd = ((void **)data)[2];
+ GladeXML *x = ((void **)data)[3];
+ char *path = ((void **)data)[4];
+
+ char *op, *op1;
+ char *up, *up1;
+
+ op = strdup(gtk_entry_get_text(GTK_ENTRY(glade_xml_get_widget(x,
+ "entryPDFOwnerPassword"))));
+ op1 = strdup(gtk_entry_get_text(GTK_ENTRY(glade_xml_get_widget(x,
+ "entryPDFOwnerPassword1"))));
+ up = strdup(gtk_entry_get_text(GTK_ENTRY(glade_xml_get_widget(x,
+ "entryPDFUserPassword"))));
+ up1 = strdup(gtk_entry_get_text(GTK_ENTRY(glade_xml_get_widget(x,
+ "entryPDFUserPassword1"))));
+
+
+ if (op[0] == '\0') {
+ gtk_label_set_text(GTK_LABEL(glade_xml_get_widget(x,
+ "labelInfo")),
+ "Owner password must be at least 1 character long:");
+ free(op);
+ free(up);
+ }
+ else if (!strcmp(op, up)) {
+ gtk_label_set_text(GTK_LABEL(glade_xml_get_widget(x,
+ "labelInfo")),
+ "User and owner passwords must be different:");
+ free(op);
+ free(up);
+ }
+ else if (!strcmp(op, op1) && !strcmp(up, up1)) {
+
+ *owner_pass = op;
+ if (up[0] == '\0')
+ free(up);
+ else
+ *user_pass = up;
+
+ free(data);
+ gtk_widget_destroy(GTK_WIDGET(wnd));
+ g_object_unref(G_OBJECT(x));
+
+ save_pdf(path);
+ }
+ else {
+ gtk_label_set_text(GTK_LABEL(glade_xml_get_widget(x,
+ "labelInfo")), "Passwords not confirmed:");
+ free(op);
+ free(up);
+ }
+
+ free(op1);
+ free(up1);
+}
+
+static void nsgtk_PDF_no_pass(GtkButton *w, gpointer data)
+{
+ GtkWindow *wnd = ((void **)data)[2];
+ GladeXML *x = ((void **)data)[3];
+ char *path = ((void **)data)[4];
+
+ free(data);
+
+ gtk_widget_destroy(GTK_WIDGET(wnd));
+ g_object_unref(G_OBJECT(x));
+
+ save_pdf(path);
+}
diff --git a/gtk/gtk_gui.h b/gtk/gtk_gui.h
index 39d4d5f16..e7cd8a1f9 100644
--- a/gtk/gtk_gui.h
+++ b/gtk/gtk_gui.h
@@ -25,6 +25,7 @@ extern GladeXML *gladeWindows;
extern char *glade_file_location;
extern char *options_file_location;
extern char *res_dir_location;
+extern char *print_options_file_location;
extern GtkWindow *wndAbout;
diff --git a/gtk/gtk_print.c b/gtk/gtk_print.c
index 6f1bf976c..5828ead75 100644
--- a/gtk/gtk_print.c
+++ b/gtk/gtk_print.c
@@ -242,7 +242,7 @@ bool nsgtk_print_plot_clip(int clip_x0, int clip_y0,
cliprect.y = clip_y0;
cliprect.width = clip_x1 - clip_x0;
cliprect.height = clip_y1 - clip_y0;
-// gdk_gc_set_clip_rectangle(gtk_print_current_gc, &cliprect);
+
return true;
}
@@ -411,7 +411,6 @@ void nsgtk_print_set_colour(colour c)
gdk_color_alloc(gdk_colormap_get_system(),
&colour);
-// gdk_gc_set_foreground(gtk_print_current_gc, &colour);
cairo_set_source_rgba(gtk_print_current_cr, r / 255.0,
g / 255.0, b / 255.0, 1.0);
@@ -505,28 +504,25 @@ static void gtk_print_end()
* \param context the print context used to set up the pages
* \param user_data nothing in here
*/
-
void gtk_print_signal_begin_print (GtkPrintOperation *operation,
GtkPrintContext *context,
gpointer user_data)
{
-
int page_number;
double height_on_page, height_to_print;
LOG(("Begin print"));
- settings = print_make_settings(DEFAULT);
+ settings = user_data;
- settings->margins[MARGINTEXT] = 0;
settings->margins[MARGINTOP] = 0;
settings->margins[MARGINLEFT] = 0;
settings->margins[MARGINBOTTOM] = 0;
settings->margins[MARGINRIGHT] = 0;
settings->page_width = gtk_print_context_get_width(context);
settings->page_height = gtk_print_context_get_height(context);
- settings->scale = 0.7;
+ settings->scale = 0.7;/*at 0.7 the pages look the best*/
settings->font_func = &nsfont;
print_set_up(content_to_print, &gtk_printer, settings, &height_to_print);
@@ -542,15 +538,13 @@ void gtk_print_signal_begin_print (GtkPrintOperation *operation,
page_number = height_to_print / height_on_page;
if (height_to_print - page_number * height_on_page > 0)
page_number += 1;
-
-
+
gtk_print_operation_set_n_pages(operation, page_number);
}
/** Handle the draw_page signal from the GtkPrintOperation.
* This function changes only the cairo context to print on.
*/
-
void gtk_print_signal_draw_page(GtkPrintOperation *operation,
GtkPrintContext *context,
gint page_nr,
@@ -564,13 +558,12 @@ void gtk_print_signal_draw_page(GtkPrintOperation *operation,
/** Handle the end_print signal from the GtkPrintOperation.
* This functions calls only the print_cleanup function from the print interface
*/
-
void gtk_print_signal_end_print(GtkPrintOperation *operation,
GtkPrintContext *context,
gpointer user_data)
{
LOG(("End print"));
- print_cleanup(content_to_print, &gtk_printer);
+ print_cleanup(content_to_print, &gtk_printer, user_data);
}
#endif /* WITH_PDF_EXPORT */
diff --git a/gtk/gtk_print.h b/gtk/gtk_print.h
index b232920de..d2b89b92d 100644
--- a/gtk/gtk_print.h
+++ b/gtk/gtk_print.h
@@ -33,16 +33,16 @@ extern struct content *content_to_print;
/*handlers for signals from the GTK print operation*/
void gtk_print_signal_begin_print(GtkPrintOperation *operation,
- GtkPrintContext *context,
- gpointer user_data);
+ GtkPrintContext *context,
+ gpointer user_data);
void gtk_print_signal_draw_page(GtkPrintOperation *operation,
- GtkPrintContext *context,
- gint page_nr,
- gpointer user_data);
+ GtkPrintContext *context,
+ gint page_nr,
+ gpointer user_data);
void gtk_print_signal_end_print(GtkPrintOperation *operation,
- GtkPrintContext *context,
- gpointer user_data);
+ GtkPrintContext *context,
+ gpointer user_data);
#endif
diff --git a/gtk/gtk_scaffolding.c b/gtk/gtk_scaffolding.c
index df1ea68b7..c2f546ec0 100644
--- a/gtk/gtk_scaffolding.c
+++ b/gtk/gtk_scaffolding.c
@@ -43,15 +43,17 @@
#include "gtk/gtk_window.h"
#include "gtk/gtk_schedule.h"
#include "gtk/gtk_download.h"
+#include "gtk/options.h"
#include "render/box.h"
#include "render/font.h"
#include "render/form.h"
#include "render/html.h"
#include "utils/messages.h"
#include "utils/utils.h"
+#include "utils/url.h"
-#include "pdf/pdf_plotters.h"
#include "desktop/print.h"
+#include "desktop/save_pdf/pdf_plotters.h"
#ifdef WITH_PDF_EXPORT
#include "gtk/gtk_print.h"
#endif
@@ -146,7 +148,6 @@ MENUPROTO(open_location);
MENUPROTO(open_file);
MENUPROTO(export_pdf);
MENUPROTO(print);
-MENUPROTO(print_preview);
MENUPROTO(close_window);
MENUPROTO(quit);
@@ -193,7 +194,6 @@ static struct menu_events menu_events[] = {
#ifdef WITH_PDF_EXPORT
MENUEVENT(export_pdf),
MENUEVENT(print),
- MENUEVENT(print_preview),
#endif
MENUEVENT(close_window),
MENUEVENT(quit),
@@ -489,10 +489,25 @@ MENUHANDLER(export_pdf){
struct gtk_scaffolding *gw = (struct gtk_scaffolding *)g;
struct browser_window *bw = nsgtk_get_browser_for_gui(gw->top_level);
struct print_settings* settings;
+ char filename[PATH_MAX];
+ char dirname[PATH_MAX];
+ char *url_name;
LOG(("Print preview (generating PDF) started."));
- settings = print_make_settings(DEFAULT);
+ url_nice(bw->current_content->url, &url_name, true);
+ strcat(filename, url_name);
+ strcat(filename, ".pdf");
+
+ free(url_name);
+
+ strcpy(dirname, option_downloads_directory);
+ strcat(dirname, "/");
+
+ settings = print_make_settings(OPTIONS, NULL);
+ /*this way the scale used by PDF functions is synchronized with that
+ used by the all-purpose print interface*/
+ pdf_set_scale((float)option_export_scale / 100);
save_dialog = gtk_file_chooser_dialog_new("Export to PDF", gw->window,
GTK_FILE_CHOOSER_ACTION_SAVE,
@@ -501,10 +516,10 @@ MENUHANDLER(export_pdf){
NULL);
gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(save_dialog),
- getenv("HOME") ? getenv("HOME") : "/");
-
+ dirname);
+
gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(save_dialog),
- "out.pdf");
+ filename);
if (gtk_dialog_run(GTK_DIALOG(save_dialog)) == GTK_RESPONSE_ACCEPT) {
settings->output = gtk_file_chooser_get_filename(
@@ -512,7 +527,7 @@ MENUHANDLER(export_pdf){
}
gtk_widget_destroy(save_dialog);
-
+
print_basic_run(bw->current_content, &pdf_printer, settings);
return TRUE;
@@ -525,44 +540,49 @@ MENUHANDLER(print){
GtkPrintOperation* print_op;
GtkPageSetup* page_setup;
- struct print_settings* settings;
-
- settings = print_make_settings(DEFAULT);
+ GtkPrintSettings* gtk_print_settings;
+ GtkPrintOperationResult res;
+ struct print_settings *settings;
print_op = gtk_print_operation_new();
page_setup = gtk_page_setup_new();
+ /*use previously saved settings if any*/
+ gtk_print_settings = gtk_print_settings_new_from_file(print_options_file_location, NULL);
+ if (gtk_print_settings != NULL)
+ gtk_print_operation_set_print_settings(print_op,
+ gtk_print_settings);
+
content_to_print = bw->current_content;
page_setup = gtk_print_run_page_setup_dialog(gw->window, page_setup, NULL);
gtk_print_operation_set_default_page_setup (print_op, page_setup);
- g_signal_connect(print_op, "begin_print", G_CALLBACK (gtk_print_signal_begin_print), NULL);
+ settings = print_make_settings(DEFAULT, NULL);
+
+ g_signal_connect(print_op, "begin_print", G_CALLBACK (gtk_print_signal_begin_print), settings);
g_signal_connect(print_op, "draw_page", G_CALLBACK (gtk_print_signal_draw_page), NULL);
- g_signal_connect(print_op, "end_print", G_CALLBACK (gtk_print_signal_end_print), NULL);
+ g_signal_connect(print_op, "end_print", G_CALLBACK (gtk_print_signal_end_print), settings);
- gtk_print_operation_run(print_op,
+ res = gtk_print_operation_run(print_op,
GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG,
gw->window,
NULL);
+ /*if the settings were used save them for future use*/
+ if (res == GTK_PRINT_OPERATION_RESULT_APPLY) {
+ if (gtk_print_settings != NULL)
+ g_object_unref(gtk_print_settings);
+ gtk_print_settings = g_object_ref(
+ gtk_print_operation_get_print_settings(print_op));
+ gtk_print_settings_to_file(gtk_print_settings,
+ print_options_file_location ,NULL);
+ }
return TRUE;
}
-MENUHANDLER(print_preview){
-
- struct gtk_scaffolding *gw = (struct gtk_scaffolding *)g;
- struct browser_window *bw = nsgtk_get_browser_for_gui(gw->top_level);
-
- LOG(("Print preview (generating PDF) started."));
-
- print_basic_run(bw->current_content, &pdf_printer, NULL);
-
- return TRUE;
-}
-
#endif /* WITH_PDF_EXPORT */
MENUHANDLER(close_window)
@@ -1142,7 +1162,6 @@ nsgtk_scaffolding *nsgtk_new_scaffolding(struct gui_window *toplevel)
#ifndef WITH_PDF_EXPORT
gtk_widget_set_sensitive(GET_WIDGET("export_pdf"), FALSE);
gtk_widget_set_sensitive(GET_WIDGET("print"), FALSE);
- gtk_widget_set_sensitive(GET_WIDGET("print_preview"), FALSE);
#endif
/* finally, show the window. */
diff --git a/gtk/res/netsurf.glade b/gtk/res/netsurf.glade
index f250be753..48084e555 100644
--- a/gtk/res/netsurf.glade
+++ b/gtk/res/netsurf.glade
@@ -165,14 +165,14 @@
<property name="tooltip" translatable="yes">Produce a hardcopy on your printer.</property>
<property name="label" translatable="yes">Print...</property>
<property name="use_underline">True</property>
- <child internal-child="image">
+ <accelerator key="P" signal="activate" modifiers="GDK_CONTROL_MASK"/>
+ <child internal-child="image">
<widget class="GtkImage" id="image559">
<property name="visible">True</property>
<property name="stock">gtk-print</property>
<property name="icon_size">1</property>
</widget>
</child>
- <accelerator key="P" signal="activate" modifiers="GDK_CONTROL_MASK"/>
</widget>
</child>
<child>
@@ -1662,4 +1662,275 @@
</widget>
</child>
</widget>
+ <widget class="GtkWindow" id="wndPDFPassword">
+ <property name="title" translatable="yes">PDF Password</property>
+ <property name="modal">True</property>
+ <property name="window_position">GTK_WIN_POS_CENTER</property>
+ <child>
+ <widget class="GtkHBox" id="hbox1">
+ <property name="visible">True</property>
+ <child>
+ <widget class="GtkImage" id="image2">
+ <property name="visible">True</property>
+ <property name="yalign">0.10000000149011612</property>
+ <property name="xpad">12</property>
+ <property name="icon_size">6</property>
+ <property name="icon_name">gtk-dialog-authentication</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkVBox" id="vbox1">
+ <property name="visible">True</property>
+ <property name="border_width">5</property>
+ <child>
+ <widget class="GtkLabel" id="labelInfo">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Write and confirm passwords:</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkHBox" id="hbox2">
+ <property name="visible">True</property>
+ <property name="border_width">5</property>
+ <child>
+ <widget class="GtkLabel" id="label1">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Owner password:</property>
+ <property name="width_chars">15</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkEntry" id="entryPDFOwnerPassword">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="max_length">20</property>
+ <property name="visibility">False</property>
+ <property name="width_chars">20</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkHBox" id="hbox3">
+ <property name="visible">True</property>
+ <property name="border_width">5</property>
+ <child>
+ <widget class="GtkLabel" id="label3">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Repeat password:</property>
+ <property name="width_chars">15</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkEntry" id="entryPDFOwnerPassword1">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="max_length">20</property>
+ <property name="visibility">False</property>
+ <property name="width_chars">20</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkHBox" id="hbox4">
+ <property name="visible">True</property>
+ <property name="border_width">5</property>
+ <child>
+ <widget class="GtkLabel" id="label2">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">User password:</property>
+ <property name="width_chars">15</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkEntry" id="entryPDFUserPassword">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="max_length">20</property>
+ <property name="visibility">False</property>
+ <property name="width_chars">20</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkHBox" id="hbox5">
+ <property name="visible">True</property>
+ <property name="border_width">5</property>
+ <child>
+ <widget class="GtkLabel" id="label4">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Repeat password:</property>
+ <property name="width_chars">15</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkEntry" id="entryPDFUserPassword1">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="max_length">20</property>
+ <property name="visibility">False</property>
+ <property name="width_chars">20</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkHButtonBox" id="hbuttonbox1">
+ <property name="visible">True</property>
+ <property name="border_width">5</property>
+ <property name="spacing">10</property>
+ <property name="layout_style">GTK_BUTTONBOX_END</property>
+ <child>
+ <widget class="GtkButton" id="buttonPDFSetPassword">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="response_id">0</property>
+ <child>
+ <widget class="GtkHBox" id="hbox7">
+ <property name="visible">True</property>
+ <child>
+ <widget class="GtkImage" id="image3">
+ <property name="visible">True</property>
+ <property name="stock">gtk-ok</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkLabel" id="label6">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Set password</property>
+ </widget>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </widget>
+ </child>
+ </widget>
+ </child>
+ <child>
+ <widget class="GtkButton" id="buttonPDFNoPassword">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="response_id">0</property>
+ <child>
+ <widget class="GtkAlignment" id="alignment1">
+ <property name="visible">True</property>
+ <child>
+ <widget class="GtkHBox" id="hbox6">
+ <property name="visible">True</property>
+ <child>
+ <widget class="GtkImage" id="image1">
+ <property name="visible">True</property>
+ <property name="stock">gtk-cancel</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkLabel" id="label5">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">No password</property>
+ </widget>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </widget>
+ </child>
+ </widget>
+ </child>
+ </widget>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </widget>
+ </child>
+ </widget>
</glade-interface>
diff --git a/gtk/res/options.glade b/gtk/res/options.glade
index d3f5eaca8..e13d492b3 100644
--- a/gtk/res/options.glade
+++ b/gtk/res/options.glade
@@ -1565,6 +1565,435 @@ Fantasy</property>
<property name="tab_fill">False</property>
</packing>
</child>
+ <child>
+ <widget class="GtkVBox" id="vbox5">
+ <property name="visible">True</property>
+ <child>
+ <widget class="GtkFrame" id="frame2">
+ <property name="visible">True</property>
+ <property name="border_width">5</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">GTK_SHADOW_NONE</property>
+ <child>
+ <widget class="GtkAlignment" id="alignment2">
+ <property name="visible">True</property>
+ <property name="left_padding">12</property>
+ <child>
+ <widget class="GtkHBox" id="hbox4">
+ <property name="visible">True</property>
+ <property name="homogeneous">True</property>
+ <child>
+ <widget class="GtkTable" id="table1">
+ <property name="visible">True</property>
+ <property name="n_rows">2</property>
+ <property name="n_columns">3</property>
+ <property name="column_spacing">4</property>
+ <property name="row_spacing">5</property>
+ <child>
+ <widget class="GtkLabel" id="label5">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Top:</property>
+ </widget>
+ </child>
+ <child>
+ <widget class="GtkLabel" id="label6">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Bottom:</property>
+ </widget>
+ <packing>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkSpinButton" id="spinMarginTop">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="tooltip" translatable="yes">Set the top margin</property>
+ <property name="adjustment">0 0 100 1 10 10</property>
+ </widget>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkSpinButton" id="spinMarginBottom">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="tooltip" translatable="yes">Set the bottom margin</property>
+ <property name="adjustment">0 0 100 1 10 10</property>
+ </widget>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkLabel" id="label9">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">mm</property>
+ </widget>
+ <packing>
+ <property name="left_attach">2</property>
+ <property name="right_attach">3</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkLabel" id="label10">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">mm</property>
+ </widget>
+ <packing>
+ <property name="left_attach">2</property>
+ <property name="right_attach">3</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkTable" id="table2">
+ <property name="visible">True</property>
+ <property name="n_rows">2</property>
+ <property name="n_columns">3</property>
+ <property name="column_spacing">4</property>
+ <property name="row_spacing">5</property>
+ <child>
+ <widget class="GtkLabel" id="label7">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Left:</property>
+ </widget>
+ </child>
+ <child>
+ <widget class="GtkLabel" id="label8">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Right:</property>
+ </widget>
+ <packing>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkSpinButton" id="spinMarginLeft">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="tooltip" translatable="yes">Set the left margin</property>
+ <property name="adjustment">0 0 100 1 10 10</property>
+ </widget>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkSpinButton" id="spinMarginRight">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="tooltip" translatable="yes">Set the right margin</property>
+ <property name="adjustment">0 0 100 1 10 10</property>
+ </widget>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkLabel" id="label11">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">mm</property>
+ </widget>
+ <packing>
+ <property name="left_attach">2</property>
+ <property name="right_attach">3</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkLabel" id="label12">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">mm</property>
+ </widget>
+ <packing>
+ <property name="left_attach">2</property>
+ <property name="right_attach">3</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </widget>
+ </child>
+ </widget>
+ </child>
+ <child>
+ <widget class="GtkLabel" id="frame">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">&lt;b&gt;Margins&lt;/b&gt;</property>
+ <property name="use_markup">True</property>
+ </widget>
+ <packing>
+ <property name="type">label_item</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkFrame" id="frame3">
+ <property name="visible">True</property>
+ <property name="border_width">5</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">GTK_SHADOW_NONE</property>
+ <child>
+ <widget class="GtkAlignment" id="alignment3">
+ <property name="visible">True</property>
+ <property name="left_padding">12</property>
+ <child>
+ <widget class="GtkHBox" id="hbox5">
+ <property name="visible">True</property>
+ <property name="spacing">4</property>
+ <child>
+ <widget class="GtkLabel" id="label14">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Scale:</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkSpinButton" id="spinExportScale">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="tooltip" translatable="yes">Set the scaling for the document - this way more content can fit in a page</property>
+ <property name="adjustment">0 0 1000 1 10 10</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkLabel" id="label15">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">%</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </widget>
+ </child>
+ </widget>
+ </child>
+ <child>
+ <widget class="GtkLabel" id="label13">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">&lt;b&gt;Scaling&lt;/b&gt;</property>
+ <property name="use_markup">True</property>
+ </widget>
+ <packing>
+ <property name="type">label_item</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkFrame" id="frame4">
+ <property name="visible">True</property>
+ <property name="border_width">5</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">GTK_SHADOW_NONE</property>
+ <child>
+ <widget class="GtkAlignment" id="alignment4">
+ <property name="visible">True</property>
+ <property name="left_padding">12</property>
+ <child>
+ <widget class="GtkVBox" id="vbox6">
+ <property name="visible">True</property>
+ <child>
+ <widget class="GtkCheckButton" id="checkSuppressImages">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="has_tooltip">True</property>
+ <property name="tooltip_markup">Turn off all images</property>
+ <property name="label" translatable="yes">Suppress images</property>
+ <property name="response_id">0</property>
+ <property name="draw_indicator">True</property>
+ </widget>
+ </child>
+ <child>
+ <widget class="GtkCheckButton" id="checkRemoveBackgrounds">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="has_tooltip">True</property>
+ <property name="tooltip_markup">Remove background images and colors</property>
+ <property name="label" translatable="yes">Remove backgrounds</property>
+ <property name="response_id">0</property>
+ <property name="draw_indicator">True</property>
+ </widget>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkCheckButton" id="checkFitPage">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="has_tooltip">True</property>
+ <property name="tooltip_markup">Try to rearrange content to fit a page</property>
+ <property name="label" translatable="yes">Fit page</property>
+ <property name="response_id">0</property>
+ <property name="draw_indicator">True</property>
+ </widget>
+ <packing>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </widget>
+ </child>
+ </widget>
+ </child>
+ <child>
+ <widget class="GtkLabel" id="label16">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">&lt;b&gt;Appearance&lt;/b&gt;</property>
+ <property name="use_markup">True</property>
+ </widget>
+ <packing>
+ <property name="type">label_item</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="fill">False</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkFrame" id="frame5">
+ <property name="visible">True</property>
+ <property name="border_width">5</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">GTK_SHADOW_NONE</property>
+ <child>
+ <widget class="GtkAlignment" id="alignment5">
+ <property name="visible">True</property>
+ <property name="left_padding">12</property>
+ <child>
+ <widget class="GtkVBox" id="vbox7">
+ <property name="visible">True</property>
+ <child>
+ <widget class="GtkCheckButton" id="checkCompressPDF">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="has_tooltip">True</property>
+ <property name="tooltip_markup">Compress the PDF document significantly decreasing it's size</property>
+ <property name="label" translatable="yes">Compress PDF</property>
+ <property name="response_id">0</property>
+ <property name="draw_indicator">True</property>
+ </widget>
+ </child>
+ <child>
+ <widget class="GtkCheckButton" id="checkPasswordPDF">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="has_tooltip">True</property>
+ <property name="tooltip_markup">Set a password and encrypt the PDF document</property>
+ <property name="label" translatable="yes">Set a password for PDF</property>
+ <property name="response_id">0</property>
+ <property name="draw_indicator">True</property>
+ </widget>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </widget>
+ </child>
+ </widget>
+ </child>
+ <child>
+ <widget class="GtkLabel" id="label17">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">&lt;b&gt;Advanced&lt;/b&gt;</property>
+ <property name="use_markup">True</property>
+ </widget>
+ <packing>
+ <property name="type">label_item</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkHBox" id="hbox7">
+ <property name="visible">True</property>
+ <property name="border_width">10</property>
+ <child>
+ <widget class="GtkButton" id="setDefaultExportOptions">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="tooltip" translatable="yes">Reset export settings to defaults</property>
+ <property name="receives_default">True</property>
+ <property name="label" translatable="yes">Default</property>
+ <property name="response_id">0</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkLabel" id="label2">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Export</property>
+ </widget>
+ <packing>
+ <property name="type">tab</property>
+ <property name="position">6</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
</widget>
<packing>
<property name="position">1</property>