summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog25
-rw-r--r--docs/reference/ChangeLog4
-rw-r--r--docs/reference/gtk/gtk-sections.txt1
-rw-r--r--gtk/gtk.symbols1
-rw-r--r--gtk/gtkpagesetupunixdialog.c11
-rw-r--r--gtk/gtkprintbackend.c28
-rw-r--r--gtk/gtkprintbackend.h2
-rw-r--r--gtk/gtkprinter.c21
-rw-r--r--gtk/gtkprinter.h45
-rw-r--r--gtk/gtkprintoperation-unix.c14
-rw-r--r--gtk/gtkprintunixdialog.c18
-rw-r--r--modules/printbackends/cups/gtkprintbackendcups.c94
-rw-r--r--modules/printbackends/file/gtkprintbackendfile.c10
13 files changed, 201 insertions, 73 deletions
diff --git a/ChangeLog b/ChangeLog
index dec743a18d..51b5cb2ec6 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,28 @@
+2008-05-20 Matthias Clasen <mclasen@redhat.com>
+
+ RH bug 204621 - "GtkPrint" asks for "Letter" size paper when "A4" size
+ was chosen
+
+ Patch by Marek Kasik.
+
+ * gtk/gtk.symbols:
+ * gtk/gtkprinter.[hc]: Add gtk_printer_get_default_page_size.
+
+ * gtk/gtkprintbackend.[hc]: Add fallback implementation.
+
+ * modules/printbackends/file/gtkprintbackendfile.c:
+ * modules/printbackends/cups/gtkprintbackendcups.c: Implement
+ get_default_page_size.
+
+ * gtk/gtkpagesetupunixdialog.c: When selecting a different printer,
+ select its default paper size.
+
+ * gtk/gtkprintunixdialog.c: If no explicit page setup has been set,
+ use the printer default.
+
+ * gtk/gtkprintoperation-unix.c: Don't create an empty page setup
+ if we don't have a default page setup.
+
2008-05-20 Gian Mario Tagliaretti <gianmt@gnome.org>
* gtk/gtkdnd.c: (gtk_drag_set_icon_pixmap): Fix the docs, the mask param
diff --git a/docs/reference/ChangeLog b/docs/reference/ChangeLog
index e4367f9d08..ee7cdf5d53 100644
--- a/docs/reference/ChangeLog
+++ b/docs/reference/ChangeLog
@@ -1,5 +1,9 @@
2008-05-20 Matthias Clasen <mclasen@redhat.com>
+ * gtk/gtk-sections.txt: Add gtk_printer_get_default_page_size
+
+2008-05-20 Matthias Clasen <mclasen@redhat.com>
+
Bug 533761 - gdk_accelerator_parse() does not exist, should be
gtk_accelerator_parse()
diff --git a/docs/reference/gtk/gtk-sections.txt b/docs/reference/gtk/gtk-sections.txt
index 023f458182..2293778c01 100644
--- a/docs/reference/gtk/gtk-sections.txt
+++ b/docs/reference/gtk/gtk-sections.txt
@@ -6435,6 +6435,7 @@ gtk_printer_compare
gtk_printer_has_details
gtk_printer_request_details
gtk_printer_get_capabilities
+gtk_printer_get_default_page_size
GtkPrinterFunc
gtk_enumerate_printers
diff --git a/gtk/gtk.symbols b/gtk/gtk.symbols
index 55dabbcbdc..42b0a09ad1 100644
--- a/gtk/gtk.symbols
+++ b/gtk/gtk.symbols
@@ -2704,6 +2704,7 @@ gtk_printer_get_type G_GNUC_CONST
gtk_printer_get_backend
gtk_printer_get_name
gtk_printer_get_description
+gtk_printer_get_default_page_size
gtk_printer_get_state_message
gtk_printer_get_location
gtk_printer_get_icon_name
diff --git a/gtk/gtkpagesetupunixdialog.c b/gtk/gtkpagesetupunixdialog.c
index 00b6da074a..8d9cbc787e 100644
--- a/gtk/gtkpagesetupunixdialog.c
+++ b/gtk/gtkpagesetupunixdialog.c
@@ -681,8 +681,6 @@ fill_paper_sizes_from_printer (GtkPageSetupUnixDialog *dialog,
GtkTreeIter iter;
gint i;
- current_page_setup = get_current_page_setup (dialog);
-
gtk_list_store_clear (priv->page_setup_list);
if (printer == NULL)
@@ -720,6 +718,15 @@ fill_paper_sizes_from_printer (GtkPageSetupUnixDialog *dialog,
fill_custom_paper_sizes (dialog);
+ current_page_setup = NULL;
+
+ /* When selecting a different printer, select its default paper size */
+ if (printer != NULL)
+ current_page_setup = gtk_printer_get_default_page_size (printer);
+
+ if (current_page_setup == NULL)
+ current_page_setup = get_current_page_setup (dialog);
+
if (!set_paper_size (dialog, current_page_setup, FALSE, FALSE))
set_paper_size (dialog, current_page_setup, TRUE, TRUE);
diff --git a/gtk/gtkprintbackend.c b/gtk/gtkprintbackend.c
index 8be27d2f40..9b4e455208 100644
--- a/gtk/gtkprintbackend.c
+++ b/gtk/gtkprintbackend.c
@@ -283,16 +283,17 @@ gtk_print_backend_load_modules (void)
G_DEFINE_TYPE (GtkPrintBackend, gtk_print_backend, G_TYPE_OBJECT)
-static void fallback_printer_request_details (GtkPrinter *printer);
-static gboolean fallback_printer_mark_conflicts (GtkPrinter *printer,
- GtkPrinterOptionSet *options);
-static void fallback_printer_get_hard_margins (GtkPrinter *printer,
- gdouble *top,
- gdouble *bottom,
- gdouble *left,
- gdouble *right);
-static GList * fallback_printer_list_papers (GtkPrinter *printer);
-static GtkPrintCapabilities fallback_printer_get_capabilities (GtkPrinter *printer);
+static void fallback_printer_request_details (GtkPrinter *printer);
+static gboolean fallback_printer_mark_conflicts (GtkPrinter *printer,
+ GtkPrinterOptionSet *options);
+static void fallback_printer_get_hard_margins (GtkPrinter *printer,
+ gdouble *top,
+ gdouble *bottom,
+ gdouble *left,
+ gdouble *right);
+static GList * fallback_printer_list_papers (GtkPrinter *printer);
+static GtkPageSetup * fallback_printer_get_default_page_size (GtkPrinter *printer);
+static GtkPrintCapabilities fallback_printer_get_capabilities (GtkPrinter *printer);
static void
gtk_print_backend_class_init (GtkPrintBackendClass *class)
@@ -308,6 +309,7 @@ gtk_print_backend_class_init (GtkPrintBackendClass *class)
class->printer_mark_conflicts = fallback_printer_mark_conflicts;
class->printer_get_hard_margins = fallback_printer_get_hard_margins;
class->printer_list_papers = fallback_printer_list_papers;
+ class->printer_get_default_page_size = fallback_printer_get_default_page_size;
class->printer_get_capabilities = fallback_printer_get_capabilities;
g_type_class_add_private (class, sizeof (GtkPrintBackendPrivate));
@@ -419,6 +421,12 @@ fallback_printer_list_papers (GtkPrinter *printer)
return NULL;
}
+static GtkPageSetup *
+fallback_printer_get_default_page_size (GtkPrinter *printer)
+{
+ return NULL;
+}
+
static GtkPrintCapabilities
fallback_printer_get_capabilities (GtkPrinter *printer)
{
diff --git a/gtk/gtkprintbackend.h b/gtk/gtkprintbackend.h
index ea2f0f7d9b..81c549844a 100644
--- a/gtk/gtkprintbackend.h
+++ b/gtk/gtkprintbackend.h
@@ -99,6 +99,7 @@ struct _GtkPrintBackendClass
GtkPrintSettings *settings,
GtkPageSetup *page_setup);
GList * (*printer_list_papers) (GtkPrinter *printer);
+ GtkPageSetup * (*printer_get_default_page_size) (GtkPrinter *printer);
void (*printer_get_hard_margins) (GtkPrinter *printer,
double *top,
double *bottom,
@@ -123,7 +124,6 @@ struct _GtkPrintBackendClass
void (*_gtk_reserved4) (void);
void (*_gtk_reserved5) (void);
void (*_gtk_reserved6) (void);
- void (*_gtk_reserved7) (void);
};
GType gtk_print_backend_get_type (void) G_GNUC_CONST;
diff --git a/gtk/gtkprinter.c b/gtk/gtkprinter.c
index 15c866f8a1..1ce3ed55b1 100644
--- a/gtk/gtkprinter.c
+++ b/gtk/gtkprinter.c
@@ -832,6 +832,27 @@ gtk_printer_list_papers (GtkPrinter *printer)
return backend_class->printer_list_papers (printer);
}
+/**
+ * gtk_printer_get_default_page_size:
+ * @printer: a #GtkPrinter
+ *
+ * Returns default page size of @printer.
+ *
+ * Return value: a newly allocated #GtkPageSetup with default page size of the printer.
+ *
+ * Since: 2.13
+ */
+GtkPageSetup *
+gtk_printer_get_default_page_size (GtkPrinter *printer)
+{
+ GtkPrintBackendClass *backend_class;
+
+ g_return_val_if_fail (GTK_IS_PRINTER (printer), NULL);
+
+ backend_class = GTK_PRINT_BACKEND_GET_CLASS (printer->priv->backend);
+ return backend_class->printer_get_default_page_size (printer);
+}
+
void
_gtk_printer_get_hard_margins (GtkPrinter *printer,
gdouble *top,
diff --git a/gtk/gtkprinter.h b/gtk/gtkprinter.h
index 2d8bec1f82..1152f88f6a 100644
--- a/gtk/gtkprinter.h
+++ b/gtk/gtkprinter.h
@@ -83,28 +83,29 @@ struct _GtkPrinterClass
void (*_gtk_reserved7) (void);
};
-GType gtk_printer_get_type (void) G_GNUC_CONST;
-GtkPrinter *gtk_printer_new (const gchar *name,
- GtkPrintBackend *backend,
- gboolean virtual_);
-GtkPrintBackend *gtk_printer_get_backend (GtkPrinter *printer);
-G_CONST_RETURN gchar *gtk_printer_get_name (GtkPrinter *printer);
-G_CONST_RETURN gchar *gtk_printer_get_state_message (GtkPrinter *printer);
-G_CONST_RETURN gchar *gtk_printer_get_description (GtkPrinter *printer);
-G_CONST_RETURN gchar *gtk_printer_get_location (GtkPrinter *printer);
-G_CONST_RETURN gchar *gtk_printer_get_icon_name (GtkPrinter *printer);
-gint gtk_printer_get_job_count (GtkPrinter *printer);
-gboolean gtk_printer_is_active (GtkPrinter *printer);
-gboolean gtk_printer_is_virtual (GtkPrinter *printer);
-gboolean gtk_printer_is_default (GtkPrinter *printer);
-gboolean gtk_printer_accepts_pdf (GtkPrinter *printer);
-gboolean gtk_printer_accepts_ps (GtkPrinter *printer);
-GList *gtk_printer_list_papers (GtkPrinter *printer);
-gint gtk_printer_compare (GtkPrinter *a,
- GtkPrinter *b);
-gboolean gtk_printer_has_details (GtkPrinter *printer);
-void gtk_printer_request_details (GtkPrinter *printer);
-GtkPrintCapabilities gtk_printer_get_capabilities (GtkPrinter *printer);
+GType gtk_printer_get_type (void) G_GNUC_CONST;
+GtkPrinter *gtk_printer_new (const gchar *name,
+ GtkPrintBackend *backend,
+ gboolean virtual_);
+GtkPrintBackend *gtk_printer_get_backend (GtkPrinter *printer);
+G_CONST_RETURN gchar *gtk_printer_get_name (GtkPrinter *printer);
+G_CONST_RETURN gchar *gtk_printer_get_state_message (GtkPrinter *printer);
+G_CONST_RETURN gchar *gtk_printer_get_description (GtkPrinter *printer);
+G_CONST_RETURN gchar *gtk_printer_get_location (GtkPrinter *printer);
+G_CONST_RETURN gchar *gtk_printer_get_icon_name (GtkPrinter *printer);
+gint gtk_printer_get_job_count (GtkPrinter *printer);
+gboolean gtk_printer_is_active (GtkPrinter *printer);
+gboolean gtk_printer_is_virtual (GtkPrinter *printer);
+gboolean gtk_printer_is_default (GtkPrinter *printer);
+gboolean gtk_printer_accepts_pdf (GtkPrinter *printer);
+gboolean gtk_printer_accepts_ps (GtkPrinter *printer);
+GList *gtk_printer_list_papers (GtkPrinter *printer);
+GtkPageSetup *gtk_printer_get_default_page_size (GtkPrinter *printer);
+gint gtk_printer_compare (GtkPrinter *a,
+ GtkPrinter *b);
+gboolean gtk_printer_has_details (GtkPrinter *printer);
+void gtk_printer_request_details (GtkPrinter *printer);
+GtkPrintCapabilities gtk_printer_get_capabilities (GtkPrinter *printer);
typedef gboolean (*GtkPrinterFunc) (GtkPrinter *printer,
gpointer data);
diff --git a/gtk/gtkprintoperation-unix.c b/gtk/gtkprintoperation-unix.c
index be784380f8..6b692d5360 100644
--- a/gtk/gtkprintoperation-unix.c
+++ b/gtk/gtkprintoperation-unix.c
@@ -349,7 +349,6 @@ get_print_dialog (GtkPrintOperation *op,
{
GtkPrintOperationPrivate *priv = op->priv;
GtkWidget *pd, *label;
- GtkPageSetup *page_setup;
const gchar *custom_tab_label;
pd = gtk_print_unix_dialog_new (NULL, parent);
@@ -366,13 +365,8 @@ get_print_dialog (GtkPrintOperation *op,
gtk_print_unix_dialog_set_settings (GTK_PRINT_UNIX_DIALOG (pd),
priv->print_settings);
if (priv->default_page_setup)
- page_setup = gtk_page_setup_copy (priv->default_page_setup);
- else
- page_setup = gtk_page_setup_new ();
-
- gtk_print_unix_dialog_set_page_setup (GTK_PRINT_UNIX_DIALOG (pd),
- page_setup);
- g_object_unref (page_setup);
+ gtk_print_unix_dialog_set_page_setup (GTK_PRINT_UNIX_DIALOG (pd),
+ priv->default_page_setup);
g_signal_emit_by_name (op, "create-custom-widget",
&priv->custom_widget);
@@ -432,6 +426,10 @@ finish_print (PrintResponseData *rdata,
{
gtk_print_operation_set_print_settings (op, settings);
priv->print_context = _gtk_print_context_new (op);
+
+ if ( (page_setup != NULL) && (gtk_print_operation_get_default_page_setup (op) == NULL))
+ gtk_print_operation_set_default_page_setup (op, page_setup);
+
_gtk_print_context_set_page_setup (priv->print_context, page_setup);
if (!rdata->do_preview)
diff --git a/gtk/gtkprintunixdialog.c b/gtk/gtkprintunixdialog.c
index e9937a0569..73ec0c42c0 100644
--- a/gtk/gtkprintunixdialog.c
+++ b/gtk/gtkprintunixdialog.c
@@ -133,6 +133,7 @@ struct GtkPrintUnixDialogPrivate
GtkTreeModelFilter *printer_list_filter;
GtkPageSetup *page_setup;
+ gboolean page_setup_set;
GtkWidget *all_pages_radio;
GtkWidget *current_page_radio;
@@ -407,6 +408,7 @@ gtk_print_unix_dialog_init (GtkPrintUnixDialog *dialog)
priv->current_page = -1;
priv->page_setup = gtk_page_setup_new ();
+ priv->page_setup_set = FALSE;
g_signal_connect (dialog,
"destroy",
@@ -1440,6 +1442,20 @@ selected_printer_changed (GtkTreeSelection *selection,
if (printer != NULL)
{
+ if (!priv->page_setup_set)
+ {
+ /* if no explicit page setup has been set, use the printer default */
+ GtkPageSetup *page_setup;
+
+ page_setup = gtk_printer_get_default_page_size (printer);
+
+ if (!page_setup)
+ page_setup = gtk_page_setup_new ();
+
+ g_object_unref (priv->page_setup);
+ priv->page_setup = page_setup;
+ }
+
priv->printer_capabilities = gtk_printer_get_capabilities (printer);
priv->options = _gtk_printer_get_options (printer,
priv->initial_settings,
@@ -2650,6 +2666,8 @@ gtk_print_unix_dialog_set_page_setup (GtkPrintUnixDialog *dialog,
g_object_unref (priv->page_setup);
priv->page_setup = g_object_ref (page_setup);
+ priv->page_setup_set = TRUE;
+
g_object_notify (G_OBJECT (dialog), "page-setup");
}
}
diff --git a/modules/printbackends/cups/gtkprintbackendcups.c b/modules/printbackends/cups/gtkprintbackendcups.c
index 7277e42b21..5261e13c3e 100644
--- a/modules/printbackends/cups/gtkprintbackendcups.c
+++ b/modules/printbackends/cups/gtkprintbackendcups.c
@@ -136,6 +136,7 @@ static void cups_printer_prepare_for_print (GtkPrinter
GtkPrintSettings *settings,
GtkPageSetup *page_setup);
static GList * cups_printer_list_papers (GtkPrinter *printer);
+static GtkPageSetup * cups_printer_get_default_page_size (GtkPrinter *printer);
static void cups_printer_request_details (GtkPrinter *printer);
static void cups_request_default_printer (GtkPrintBackendCups *print_backend);
static void cups_request_ppd (GtkPrinter *printer);
@@ -255,6 +256,7 @@ gtk_print_backend_cups_class_init (GtkPrintBackendCupsClass *class)
backend_class->printer_get_settings_from_options = cups_printer_get_settings_from_options;
backend_class->printer_prepare_for_print = cups_printer_prepare_for_print;
backend_class->printer_list_papers = cups_printer_list_papers;
+ backend_class->printer_get_default_page_size = cups_printer_get_default_page_size;
backend_class->printer_get_hard_margins = cups_printer_get_hard_margins;
backend_class->printer_get_capabilities = cups_printer_get_capabilities;
}
@@ -1437,6 +1439,8 @@ cups_request_ppd_cb (GtkPrintBackendCups *print_backend,
/* let ppdOpenFd take over the ownership of the open file */
g_io_channel_seek_position (data->ppd_io, 0, G_SEEK_SET, NULL);
data->printer->ppd_file = ppdOpenFd (dup (g_io_channel_unix_get_fd (data->ppd_io)));
+
+ ppdMarkDefaults (data->printer->ppd_file);
gtk_printer_set_has_details (printer, TRUE);
g_signal_emit_by_name (printer, "details-acquired", TRUE);
@@ -3121,16 +3125,52 @@ cups_printer_prepare_for_print (GtkPrinter *printer,
print_job->rotate_to_orientation = TRUE;
}
+static GtkPageSetup *
+create_page_setup (ppd_file_t *ppd_file,
+ ppd_size_t *size)
+ {
+ char *display_name;
+ GtkPageSetup *page_setup;
+ GtkPaperSize *paper_size;
+ ppd_option_t *option;
+ ppd_choice_t *choice;
+
+ display_name = NULL;
+ option = ppdFindOption (ppd_file, "PageSize");
+ if (option)
+ {
+ choice = ppdFindChoice (option, size->name);
+ if (choice)
+ display_name = ppd_text_to_utf8 (ppd_file, choice->text);
+ }
+
+ if (display_name == NULL)
+ display_name = g_strdup (size->name);
+
+ page_setup = gtk_page_setup_new ();
+ paper_size = gtk_paper_size_new_from_ppd (size->name,
+ display_name,
+ size->width,
+ size->length);
+ gtk_page_setup_set_paper_size (page_setup, paper_size);
+ gtk_paper_size_free (paper_size);
+
+ gtk_page_setup_set_top_margin (page_setup, size->length - size->top, GTK_UNIT_POINTS);
+ gtk_page_setup_set_bottom_margin (page_setup, size->bottom, GTK_UNIT_POINTS);
+ gtk_page_setup_set_left_margin (page_setup, size->left, GTK_UNIT_POINTS);
+ gtk_page_setup_set_right_margin (page_setup, size->width - size->right, GTK_UNIT_POINTS);
+
+ g_free (display_name);
+
+ return page_setup;
+}
+
static GList *
cups_printer_list_papers (GtkPrinter *printer)
{
ppd_file_t *ppd_file;
ppd_size_t *size;
- char *display_name;
GtkPageSetup *page_setup;
- GtkPaperSize *paper_size;
- ppd_option_t *option;
- ppd_choice_t *choice;
GList *l;
int i;
@@ -3142,33 +3182,9 @@ cups_printer_list_papers (GtkPrinter *printer)
for (i = 0; i < ppd_file->num_sizes; i++)
{
- size = &ppd_file->sizes[i];
+ size = &ppd_file->sizes[i];
- display_name = NULL;
- option = ppdFindOption (ppd_file, "PageSize");
- if (option)
- {
- choice = ppdFindChoice (option, size->name);
- if (choice)
- display_name = ppd_text_to_utf8 (ppd_file, choice->text);
- }
- if (display_name == NULL)
- display_name = g_strdup (size->name);
-
- page_setup = gtk_page_setup_new ();
- paper_size = gtk_paper_size_new_from_ppd (size->name,
- display_name,
- size->width,
- size->length);
- gtk_page_setup_set_paper_size (page_setup, paper_size);
- gtk_paper_size_free (paper_size);
-
- gtk_page_setup_set_top_margin (page_setup, size->length - size->top, GTK_UNIT_POINTS);
- gtk_page_setup_set_bottom_margin (page_setup, size->bottom, GTK_UNIT_POINTS);
- gtk_page_setup_set_left_margin (page_setup, size->left, GTK_UNIT_POINTS);
- gtk_page_setup_set_right_margin (page_setup, size->width - size->right, GTK_UNIT_POINTS);
-
- g_free (display_name);
+ page_setup = create_page_setup (ppd_file, size);
l = g_list_prepend (l, page_setup);
}
@@ -3176,6 +3192,24 @@ cups_printer_list_papers (GtkPrinter *printer)
return g_list_reverse (l);
}
+static GtkPageSetup *
+cups_printer_get_default_page_size (GtkPrinter *printer)
+{
+ ppd_file_t *ppd_file;
+ ppd_size_t *size;
+ ppd_option_t *option;
+
+
+ ppd_file = gtk_printer_cups_get_ppd (GTK_PRINTER_CUPS (printer));
+ if (ppd_file == NULL)
+ return NULL;
+
+ option = ppdFindOption (ppd_file, "PageSize");
+ size = ppdPageSize (ppd_file, option->defchoice);
+
+ return create_page_setup (ppd_file, size);
+}
+
static void
cups_printer_get_hard_margins (GtkPrinter *printer,
gdouble *top,
diff --git a/modules/printbackends/file/gtkprintbackendfile.c b/modules/printbackends/file/gtkprintbackendfile.c
index a83d5bc05d..58b787919c 100644
--- a/modules/printbackends/file/gtkprintbackendfile.c
+++ b/modules/printbackends/file/gtkprintbackendfile.c
@@ -104,6 +104,7 @@ static cairo_surface_t * file_printer_create_cairo_surface (GtkPrinter
GIOChannel *cache_io);
static GList * file_printer_list_papers (GtkPrinter *printer);
+static GtkPageSetup * file_printer_get_default_page_size (GtkPrinter *printer);
static void
gtk_print_backend_file_register_type (GTypeModule *module)
@@ -182,6 +183,7 @@ gtk_print_backend_file_class_init (GtkPrintBackendFileClass *class)
backend_class->printer_get_settings_from_options = file_printer_get_settings_from_options;
backend_class->printer_prepare_for_print = file_printer_prepare_for_print;
backend_class->printer_list_papers = file_printer_list_papers;
+ backend_class->printer_get_default_page_size = file_printer_get_default_page_size;
}
/* return N_FORMATS if no explicit format in the settings */
@@ -697,3 +699,11 @@ file_printer_list_papers (GtkPrinter *printer)
return g_list_reverse (result);
}
+
+static GtkPageSetup *
+file_printer_get_default_page_size (GtkPrinter *printer)
+{
+ GtkPageSetup *result = NULL;
+
+ return result;
+}