+filesave_choose_cb (GtkWidget *button,
+ GtkPrinterOptionWidget *widget)
+{
+ GtkPrinterOptionWidgetPrivate *priv = widget->priv;
+ gchar *last_location = NULL;
+ GtkWidget *dialog;
+ GtkWindow *toplevel;
+
+ /* this will be unblocked in the dialog_response_callback function */
+ g_signal_handler_block (priv->source, priv->source_changed_handler);
+
+ toplevel = GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (widget)));
+ dialog = gtk_file_chooser_dialog_new (_("Select a filename"),
+ toplevel,
+ GTK_FILE_CHOOSER_ACTION_SAVE,
+ GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+ _("_Select"), GTK_RESPONSE_ACCEPT,
+ NULL);
+
+ /* The confirmation dialog will appear, when the user clicks print */
+ gtk_file_chooser_set_do_overwrite_confirmation (GTK_FILE_CHOOSER (dialog), FALSE);
+
+ /* select the current filename in the dialog */
+ if (priv->source != NULL)
+ {
+ priv->last_location = last_location = g_strdup (priv->source->value);
+ if (last_location)
+ {
+ GFile *file;
+ gchar *basename;
+ gchar *basename_utf8;
+
+ gtk_file_chooser_select_uri (GTK_FILE_CHOOSER (dialog), last_location);
+ file = g_file_new_for_uri (last_location);
+ basename = g_file_get_basename (file);
+ basename_utf8 = g_filename_to_utf8 (basename, -1, NULL, NULL, NULL);
+ gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER (dialog), basename_utf8);
+ g_free (basename_utf8);
+ g_free (basename);
+ g_object_unref (file);
+ }
+ }
+
+ g_signal_connect (dialog, "response",
+ G_CALLBACK (dialog_response_callback), widget);
+ gtk_window_set_modal (GTK_WINDOW (dialog), TRUE);
+ gtk_window_present (GTK_WINDOW (dialog));
+}
+
+static gchar *
+filter_numeric (const gchar *val,
+ gboolean allow_neg,
+ gboolean allow_dec,
+ gboolean *changed_out)
+{
+ gchar *filtered_val;
+ int i, j;
+ int len = strlen (val);
+ gboolean dec_set = FALSE;
+
+ filtered_val = g_malloc (len + 1);
+
+ for (i = 0, j = 0; i < len; i++)
+ {
+ if (isdigit (val[i]))
+ {
+ filtered_val[j] = val[i];
+ j++;
+ }
+ else if (allow_dec && !dec_set &&
+ (val[i] == '.' || val[i] == ','))
+ {
+ /* allow one period or comma
+ * we should be checking locals
+ * but this is good enough for now
+ */
+ filtered_val[j] = val[i];
+ dec_set = TRUE;
+ j++;
+ }
+ else if (allow_neg && i == 0 && val[0] == '-')
+ {
+ filtered_val[0] = val[0];
+ j++;
+ }
+ }
+
+ filtered_val[j] = '\0';
+ *changed_out = !(i == j);
+
+ return filtered_val;
+}
+
+static void
+combo_changed_cb (GtkWidget *combo,