+static gboolean
+page_setup_is_equal (GtkPageSetup *a,
+ GtkPageSetup *b)
+{
+ return
+ gtk_paper_size_is_equal (gtk_page_setup_get_paper_size (a),
+ gtk_page_setup_get_paper_size (b)) &&
+ gtk_page_setup_get_top_margin (a, GTK_UNIT_MM) == gtk_page_setup_get_top_margin (b, GTK_UNIT_MM) &&
+ gtk_page_setup_get_bottom_margin (a, GTK_UNIT_MM) == gtk_page_setup_get_bottom_margin (b, GTK_UNIT_MM) &&
+ gtk_page_setup_get_left_margin (a, GTK_UNIT_MM) == gtk_page_setup_get_left_margin (b, GTK_UNIT_MM) &&
+ gtk_page_setup_get_right_margin (a, GTK_UNIT_MM) == gtk_page_setup_get_right_margin (b, GTK_UNIT_MM);
+}
+
+static gboolean
+page_setup_is_same_size (GtkPageSetup *a,
+ GtkPageSetup *b)
+{
+ return gtk_paper_size_is_equal (gtk_page_setup_get_paper_size (a),
+ gtk_page_setup_get_paper_size (b));
+}
+
+static gboolean
+set_paper_size (GtkPrintUnixDialog *dialog,
+ GtkPageSetup *page_setup,
+ gboolean size_only,
+ gboolean add_item)
+{
+ GtkPrintUnixDialogPrivate *priv = dialog->priv;
+ GtkTreeModel *model;
+ GtkTreeIter iter;
+ GtkPageSetup *list_page_setup;
+
+ if (!priv->internal_page_setup_change)
+ return TRUE;
+
+ if (page_setup == NULL)
+ return FALSE;
+
+ model = GTK_TREE_MODEL (priv->page_setup_list);
+
+ if (gtk_tree_model_get_iter_first (model, &iter))
+ {
+ do
+ {
+ gtk_tree_model_get (GTK_TREE_MODEL (priv->page_setup_list), &iter,
+ PAGE_SETUP_LIST_COL_PAGE_SETUP, &list_page_setup,
+ -1);
+ if (list_page_setup == NULL)
+ continue;
+
+ if ((size_only && page_setup_is_same_size (page_setup, list_page_setup)) ||
+ (!size_only && page_setup_is_equal (page_setup, list_page_setup)))
+ {
+ gtk_combo_box_set_active_iter (GTK_COMBO_BOX (priv->paper_size_combo),
+ &iter);
+ gtk_combo_box_set_active (GTK_COMBO_BOX (priv->orientation_combo),
+ gtk_page_setup_get_orientation (page_setup));
+ g_object_unref (list_page_setup);
+ return TRUE;
+ }
+
+ g_object_unref (list_page_setup);
+
+ } while (gtk_tree_model_iter_next (model, &iter));
+ }
+
+ if (add_item)
+ {
+ gtk_list_store_append (priv->page_setup_list, &iter);
+ gtk_list_store_set (priv->page_setup_list, &iter,
+ PAGE_SETUP_LIST_COL_IS_SEPARATOR, TRUE,
+ -1);
+ gtk_list_store_append (priv->page_setup_list, &iter);
+ gtk_list_store_set (priv->page_setup_list, &iter,
+ PAGE_SETUP_LIST_COL_PAGE_SETUP, page_setup,
+ -1);
+ gtk_combo_box_set_active_iter (GTK_COMBO_BOX (priv->paper_size_combo),
+ &iter);
+ gtk_combo_box_set_active (GTK_COMBO_BOX (priv->orientation_combo),
+ gtk_page_setup_get_orientation (page_setup));
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+static void
+fill_custom_paper_sizes (GtkPrintUnixDialog *dialog)
+{
+ GtkPrintUnixDialogPrivate *priv = dialog->priv;
+ GtkTreeIter iter, paper_iter;
+ GtkTreeModel *model;
+
+ model = GTK_TREE_MODEL (priv->custom_paper_list);
+ if (gtk_tree_model_get_iter_first (model, &iter))
+ {
+ gtk_list_store_append (priv->page_setup_list, &paper_iter);
+ gtk_list_store_set (priv->page_setup_list, &paper_iter,
+ PAGE_SETUP_LIST_COL_IS_SEPARATOR, TRUE,
+ -1);
+ do
+ {
+ GtkPageSetup *page_setup;
+ gtk_tree_model_get (model, &iter, 0, &page_setup, -1);
+
+ gtk_list_store_append (priv->page_setup_list, &paper_iter);
+ gtk_list_store_set (priv->page_setup_list, &paper_iter,
+ PAGE_SETUP_LIST_COL_PAGE_SETUP, page_setup,
+ -1);
+
+ g_object_unref (page_setup);
+ } while (gtk_tree_model_iter_next (model, &iter));
+ }
+
+ gtk_list_store_append (priv->page_setup_list, &paper_iter);
+ gtk_list_store_set (priv->page_setup_list, &paper_iter,
+ PAGE_SETUP_LIST_COL_IS_SEPARATOR, TRUE,
+ -1);
+ gtk_list_store_append (priv->page_setup_list, &paper_iter);
+ gtk_list_store_set (priv->page_setup_list, &paper_iter,
+ PAGE_SETUP_LIST_COL_PAGE_SETUP, NULL,
+ -1);
+}
+
+static void
+fill_paper_sizes (GtkPrintUnixDialog *dialog,
+ GtkPrinter *printer)
+{
+ GtkPrintUnixDialogPrivate *priv = dialog->priv;
+ GList *list, *l;
+ GtkPageSetup *page_setup;
+ GtkPaperSize *paper_size;
+ GtkTreeIter iter;
+ gint i;
+
+ gtk_list_store_clear (priv->page_setup_list);
+
+ if (printer == NULL || (list = gtk_printer_list_papers (printer)) == NULL)
+ {
+ for (i = 0; i < G_N_ELEMENTS (common_paper_sizes); i++)
+ {
+ page_setup = gtk_page_setup_new ();
+ paper_size = gtk_paper_size_new (common_paper_sizes[i]);
+ gtk_page_setup_set_paper_size_and_default_margins (page_setup, paper_size);
+ gtk_paper_size_free (paper_size);
+
+ gtk_list_store_append (priv->page_setup_list, &iter);
+ gtk_list_store_set (priv->page_setup_list, &iter,
+ PAGE_SETUP_LIST_COL_PAGE_SETUP, page_setup,
+ -1);
+ g_object_unref (page_setup);
+ }
+ }
+ else
+ {
+ for (l = list; l != NULL; l = l->next)
+ {
+ page_setup = l->data;
+ gtk_list_store_append (priv->page_setup_list, &iter);
+ gtk_list_store_set (priv->page_setup_list, &iter,
+ PAGE_SETUP_LIST_COL_PAGE_SETUP, page_setup,
+ -1);
+ g_object_unref (page_setup);
+ }
+ g_list_free (list);
+ }
+
+ fill_custom_paper_sizes (dialog);
+}
+
+static void
+update_paper_sizes (GtkPrintUnixDialog *dialog)
+{
+ GtkPageSetup *current_page_setup = NULL;
+ GtkPrinter *printer;
+
+ printer = gtk_print_unix_dialog_get_selected_printer (dialog);
+
+ fill_paper_sizes (dialog, printer);
+
+ current_page_setup = gtk_page_setup_copy (gtk_print_unix_dialog_get_page_setup (dialog));
+
+ if (current_page_setup)
+ {
+ if (!set_paper_size (dialog, current_page_setup, FALSE, FALSE))
+ set_paper_size (dialog, current_page_setup, TRUE, TRUE);
+
+ g_object_unref (current_page_setup);
+ }
+}
+