summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog12
-rw-r--r--ChangeLog.pre-2-1012
-rw-r--r--gtk/gtkprinteroption.c2
-rw-r--r--gtk/gtkprinteroption.h5
-rw-r--r--gtk/gtkprinteroptionwidget.c173
-rw-r--r--modules/printbackends/cups/gtkprintbackendcups.c81
6 files changed, 260 insertions, 25 deletions
diff --git a/ChangeLog b/ChangeLog
index 5195b2f997..3dc1b09f7c 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,15 @@
+2006-07-19 John (J5) Palmieri <johnp@redhat.com>
+
+ * gtk/gtkprinteroption.h:
+ * gtk/gtkprinteroptionwidget.c:
+ * modules/printbackends/cups/gtkprintbackendcups.c:
+ add GTK_PRINTER_OPTION_TYPE_PICKONE_PASSWORD,
+ GTK_PRINTER_OPTION_TYPE_PICKONE_PASSCODE,
+ GTK_PRINTER_OPTION_TYPE_PICKONE_REAL,
+ GTK_PRINTER_OPTION_TYPE_PICKONE_INT,
+ and GTK_PRINTER_OPTION_TYPE_PICKONE_STRING options to support a subset
+ of the new CUPS 1.2 custom options spec
+
2006-07-18 Federico Mena Quintero <federico@novell.com>
Fix https://bugzilla.novell.com/show_bug.cgi?id=184875 - make the
diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10
index 5195b2f997..3dc1b09f7c 100644
--- a/ChangeLog.pre-2-10
+++ b/ChangeLog.pre-2-10
@@ -1,3 +1,15 @@
+2006-07-19 John (J5) Palmieri <johnp@redhat.com>
+
+ * gtk/gtkprinteroption.h:
+ * gtk/gtkprinteroptionwidget.c:
+ * modules/printbackends/cups/gtkprintbackendcups.c:
+ add GTK_PRINTER_OPTION_TYPE_PICKONE_PASSWORD,
+ GTK_PRINTER_OPTION_TYPE_PICKONE_PASSCODE,
+ GTK_PRINTER_OPTION_TYPE_PICKONE_REAL,
+ GTK_PRINTER_OPTION_TYPE_PICKONE_INT,
+ and GTK_PRINTER_OPTION_TYPE_PICKONE_STRING options to support a subset
+ of the new CUPS 1.2 custom options spec
+
2006-07-18 Federico Mena Quintero <federico@novell.com>
Fix https://bugzilla.novell.com/show_bug.cgi?id=184875 - make the
diff --git a/gtk/gtkprinteroption.c b/gtk/gtkprinteroption.c
index 821efbd3e7..983dc65d56 100644
--- a/gtk/gtkprinteroption.c
+++ b/gtk/gtkprinteroption.c
@@ -84,7 +84,7 @@ gtk_printer_option_class_init (GtkPrinterOptionClass *class)
GtkPrinterOption *
gtk_printer_option_new (const char *name, const char *display_text,
- GtkPrinterOptionType type)
+ GtkPrinterOptionType type)
{
GtkPrinterOption *option;
diff --git a/gtk/gtkprinteroption.h b/gtk/gtkprinteroption.h
index b2e052819b..cce6986960 100644
--- a/gtk/gtkprinteroption.h
+++ b/gtk/gtkprinteroption.h
@@ -46,6 +46,11 @@ typedef struct _GtkPrinterOptionClass GtkPrinterOptionClass;
typedef enum {
GTK_PRINTER_OPTION_TYPE_BOOLEAN,
GTK_PRINTER_OPTION_TYPE_PICKONE,
+ GTK_PRINTER_OPTION_TYPE_PICKONE_PASSWORD,
+ GTK_PRINTER_OPTION_TYPE_PICKONE_PASSCODE,
+ GTK_PRINTER_OPTION_TYPE_PICKONE_REAL,
+ GTK_PRINTER_OPTION_TYPE_PICKONE_INT,
+ GTK_PRINTER_OPTION_TYPE_PICKONE_STRING,
GTK_PRINTER_OPTION_TYPE_ALTERNATIVE,
GTK_PRINTER_OPTION_TYPE_STRING,
GTK_PRINTER_OPTION_TYPE_FILESAVE
diff --git a/gtk/gtkprinteroptionwidget.c b/gtk/gtkprinteroptionwidget.c
index d5d625f235..a5f95286d0 100644
--- a/gtk/gtkprinteroptionwidget.c
+++ b/gtk/gtkprinteroptionwidget.c
@@ -21,6 +21,7 @@
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
+#include <ctype.h>
#include "gtkintl.h"
#include "gtkalignment.h"
@@ -28,6 +29,7 @@
#include "gtkcelllayout.h"
#include "gtkcellrenderertext.h"
#include "gtkcombobox.h"
+#include "gtkcomboboxentry.h"
#include "gtkfilechooserbutton.h"
#include "gtkimage.h"
#include "gtklabel.h"
@@ -254,22 +256,49 @@ gtk_printer_option_widget_set_source (GtkPrinterOptionWidget *widget,
g_object_notify (G_OBJECT (widget), "source");
}
-static GtkWidget *
-combo_box_new (void)
+static void
+combo_box_set_model (GtkWidget *combo_box)
{
- GtkWidget *combo_box;
- GtkCellRenderer *cell;
GtkListStore *store;
store = gtk_list_store_new (2, G_TYPE_STRING, G_TYPE_STRING);
- combo_box = gtk_combo_box_new_with_model (GTK_TREE_MODEL (store));
+ gtk_combo_box_set_model (GTK_COMBO_BOX (combo_box), GTK_TREE_MODEL (store));
g_object_unref (store);
+}
+
+static void
+combo_box_set_view (GtkWidget *combo_box)
+{
+ GtkCellRenderer *cell;
cell = gtk_cell_renderer_text_new ();
gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (combo_box), cell, TRUE);
gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (combo_box), cell,
- "text", 0,
- NULL);
+ "text", 1,
+ NULL);
+}
+
+static GtkWidget *
+combo_box_entry_new (void)
+{
+ GtkWidget *combo_box;
+ combo_box = gtk_combo_box_entry_new ();
+
+ combo_box_set_model (combo_box);
+
+ gtk_combo_box_entry_set_text_column (GTK_COMBO_BOX_ENTRY (combo_box), 1);
+
+ return combo_box;
+}
+
+static GtkWidget *
+combo_box_new (void)
+{
+ GtkWidget *combo_box;
+ combo_box = gtk_combo_box_new ();
+
+ combo_box_set_model (combo_box);
+ combo_box_set_view (combo_box);
return combo_box;
}
@@ -337,14 +366,21 @@ combo_box_get (GtkWidget *combo)
GtkTreeModel *model;
char *val;
GtkTreeIter iter;
-
- model = gtk_combo_box_get_model (GTK_COMBO_BOX (combo));
- val = NULL;
- if (gtk_combo_box_get_active_iter (GTK_COMBO_BOX (combo), &iter))
- gtk_tree_model_get (model, &iter,
- 1, &val,
- -1);
+ if (GTK_IS_COMBO_BOX_ENTRY (combo))
+ {
+ val = gtk_combo_box_get_active_text(GTK_COMBO_BOX (combo));
+ }
+ else
+ {
+ model = gtk_combo_box_get_model (GTK_COMBO_BOX (combo));
+
+ val = NULL;
+ if (gtk_combo_box_get_active_iter (GTK_COMBO_BOX (combo), &iter))
+ gtk_tree_model_get (model, &iter,
+ 1, &val,
+ -1);
+ }
return val;
}
@@ -451,15 +487,93 @@ filesave_changed_cb (GtkWidget *w,
emit_changed (widget);
}
+static char *
+filter_numeric (const char *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,
GtkPrinterOptionWidget *widget)
{
GtkPrinterOptionWidgetPrivate *priv = widget->priv;
- char *value;
-
+ gchar *value;
+ gchar *filtered_val = NULL;
+ gboolean changed;
+
g_signal_handler_block (priv->source, priv->source_changed_handler);
+
value = combo_box_get (combo);
+
+ /* handle some constraints */
+ switch (priv->source->type)
+ {
+ case GTK_PRINTER_OPTION_TYPE_PICKONE_PASSCODE:
+ filtered_val = filter_numeric (value, FALSE, FALSE, &changed);
+ break;
+ case GTK_PRINTER_OPTION_TYPE_PICKONE_INT:
+ filtered_val = filter_numeric (value, TRUE, FALSE, &changed);
+ break;
+ case GTK_PRINTER_OPTION_TYPE_PICKONE_REAL:
+ filtered_val = filter_numeric (value, TRUE, TRUE, &changed);
+ break;
+ default:
+ break;
+ }
+
+ if (filtered_val)
+ {
+ g_free (value);
+
+ if (changed)
+ {
+ GtkEntry *entry;
+
+ entry = GTK_ENTRY (gtk_bin_get_child (GTK_BIN (combo)));
+
+ gtk_entry_set_text (entry, filtered_val);
+ }
+ value = filtered_val;
+ }
+
if (value)
gtk_printer_option_set (priv->source, value);
g_free (value);
@@ -567,9 +681,32 @@ construct_widgets (GtkPrinterOptionWidget *widget)
gtk_widget_show (priv->check);
gtk_box_pack_start (GTK_BOX (widget), priv->check, TRUE, TRUE, 0);
break;
-
case GTK_PRINTER_OPTION_TYPE_PICKONE:
- priv->combo = combo_box_new ();
+ case GTK_PRINTER_OPTION_TYPE_PICKONE_PASSWORD:
+ case GTK_PRINTER_OPTION_TYPE_PICKONE_PASSCODE:
+ case GTK_PRINTER_OPTION_TYPE_PICKONE_REAL:
+ case GTK_PRINTER_OPTION_TYPE_PICKONE_INT:
+ case GTK_PRINTER_OPTION_TYPE_PICKONE_STRING:
+ if (source->type == GTK_PRINTER_OPTION_TYPE_PICKONE)
+ {
+ priv->combo = combo_box_new ();
+ }
+ else
+ {
+ priv->combo = combo_box_entry_new ();
+
+ if (source->type == GTK_PRINTER_OPTION_TYPE_PICKONE_PASSWORD ||
+ source->type == GTK_PRINTER_OPTION_TYPE_PICKONE_PASSCODE)
+ {
+ GtkEntry *entry;
+
+ entry = GTK_ENTRY (gtk_bin_get_child (GTK_BIN (priv->combo)));
+
+ gtk_entry_set_visibility (entry, FALSE);
+ }
+ }
+
+
for (i = 0; i < source->num_choices; i++)
combo_box_append (priv->combo,
source->choices_display[i],
diff --git a/modules/printbackends/cups/gtkprintbackendcups.c b/modules/printbackends/cups/gtkprintbackendcups.c
index add72fb7f7..bcaf2561d0 100644
--- a/modules/printbackends/cups/gtkprintbackendcups.c
+++ b/modules/printbackends/cups/gtkprintbackendcups.c
@@ -1825,9 +1825,10 @@ available_choices (ppd_file_t *ppd,
}
static GtkPrinterOption *
-create_pickone_option (ppd_file_t *ppd_file,
- ppd_option_t *ppd_option,
- const gchar *gtk_name)
+create_pickone_option_custom (ppd_file_t *ppd_file,
+ ppd_option_t *ppd_option,
+ ppd_coption_t *coption,
+ const gchar *gtk_name)
{
GtkPrinterOption *option;
ppd_choice_t **available;
@@ -1842,9 +1843,59 @@ create_pickone_option (ppd_file_t *ppd_file,
n_choices = available_choices (ppd_file, ppd_option, &available, g_str_has_prefix (gtk_name, "gtk-"));
if (n_choices > 0)
{
+ ppd_cparam_t *cparam;
+
label = get_option_text (ppd_file, ppd_option);
- option = gtk_printer_option_new (gtk_name, label,
- GTK_PRINTER_OPTION_TYPE_PICKONE);
+
+ /* right now only support one parameter per custom option
+ * if more than one print warning and only offer the default choices
+ */
+ if (coption)
+ {
+ cparam = ppdFirstCustomParam (coption);
+
+ if (ppdNextCustomParam (coption) == NULL)
+ {
+ switch (cparam->type)
+ {
+ case PPD_CUSTOM_INT:
+ option = gtk_printer_option_new (gtk_name, label,
+ GTK_PRINTER_OPTION_TYPE_PICKONE_INT);
+ break;
+ case PPD_CUSTOM_PASSCODE:
+ option = gtk_printer_option_new (gtk_name, label,
+ GTK_PRINTER_OPTION_TYPE_PICKONE_PASSCODE);
+ break;
+ case PPD_CUSTOM_PASSWORD:
+ option = gtk_printer_option_new (gtk_name, label,
+ GTK_PRINTER_OPTION_TYPE_PICKONE_PASSWORD);
+ break;
+ case PPD_CUSTOM_REAL:
+ option = gtk_printer_option_new (gtk_name, label,
+ GTK_PRINTER_OPTION_TYPE_PICKONE_REAL);
+ break;
+ case PPD_CUSTOM_STRING:
+ option = gtk_printer_option_new (gtk_name, label,
+ GTK_PRINTER_OPTION_TYPE_PICKONE_STRING);
+ break;
+ case PPD_CUSTOM_POINTS:
+ g_warning ("Not Supported: PPD Custom Points Option");
+ break;
+ case PPD_CUSTOM_CURVE:
+ g_warning ("Not Supported: PPD Custom Curve Option");
+ break;
+ case PPD_CUSTOM_INVCURVE:
+ g_warning ("Not Supported: PPD Custom Inverse Curve Option");
+ break;
+ }
+ }
+ else
+ g_warning ("Not Supported: PPD Custom Option has more than one parameter");
+ }
+
+ if (!option)
+ option = gtk_printer_option_new (gtk_name, label,
+ GTK_PRINTER_OPTION_TYPE_PICKONE);
g_free (label);
gtk_printer_option_allocate_choices (option, n_choices);
@@ -1874,6 +1925,18 @@ create_pickone_option (ppd_file_t *ppd_file,
}
static GtkPrinterOption *
+create_pickone_option (ppd_file_t *ppd_file,
+ ppd_option_t *ppd_option,
+ const gchar *gtk_name)
+{
+ GtkPrinterOption *option;
+
+ option = create_pickone_option_custom (ppd_file, ppd_option, NULL, gtk_name);
+
+ return option;
+}
+
+static GtkPrinterOption *
create_boolean_option (ppd_file_t *ppd_file,
ppd_option_t *ppd_option,
const gchar *gtk_name)
@@ -1953,16 +2016,22 @@ handle_option (GtkPrinterOptionSet *set,
{
GtkPrinterOption *option;
char *name;
+ ppd_coption_t *coption;
if (STRING_IN_TABLE (ppd_option->keyword, cups_option_blacklist))
return;
name = get_option_name (ppd_option->keyword);
+ coption = ppdFindCustomOption (ppd_file, ppd_option->keyword);
+
option = NULL;
if (ppd_option->ui == PPD_UI_PICKONE)
{
- option = create_pickone_option (ppd_file, ppd_option, name);
+ if (coption)
+ option = create_pickone_option_custom (ppd_file, ppd_option, coption, name);
+ else
+ option = create_pickone_option (ppd_file, ppd_option, name);
}
else if (ppd_option->ui == PPD_UI_BOOLEAN)
{