diff options
author | John Tytgat <joty@netsurf-browser.org> | 2008-08-14 20:32:10 +0000 |
---|---|---|
committer | John Tytgat <joty@netsurf-browser.org> | 2008-08-14 20:32:10 +0000 |
commit | e063a2a59d698dd96123b68a44b09f0623f80cab (patch) | |
tree | 1bd06130de988cb0f6da239800229387f189d21c /gtk | |
parent | 44856d86d4efb12e08c8ef7560f39233107dfa8a (diff) | |
download | netsurf-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.c | 7 | ||||
-rw-r--r-- | gtk/dialogs/gtk_options.c | 78 | ||||
-rw-r--r-- | gtk/gtk_gui.c | 112 | ||||
-rw-r--r-- | gtk/gtk_gui.h | 1 | ||||
-rw-r--r-- | gtk/gtk_print.c | 17 | ||||
-rw-r--r-- | gtk/gtk_print.h | 14 | ||||
-rw-r--r-- | gtk/gtk_scaffolding.c | 73 | ||||
-rw-r--r-- | gtk/res/netsurf.glade | 275 | ||||
-rw-r--r-- | gtk/res/options.glade | 429 |
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, >k_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, >k_printer); + print_cleanup(content_to_print, >k_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"><b>Margins</b></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"><b>Scaling</b></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"><b>Appearance</b></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"><b>Advanced</b></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> |