# http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=487475
diff -urw ../xsane-0.996.orig/src/xsane-back-gtk.c ./src/xsane-back-gtk.c
--- ../xsane-0.996.orig/src/xsane-back-gtk.c	2007-08-13 09:49:34.000000000 +0200
+++ ./src/xsane-back-gtk.c	2010-05-01 20:48:41.000000000 +0200
@@ -2226,11 +2226,13 @@
 /* ----------------------------------------------------------------------------------------------------------------- */
 
 void xsane_back_gtk_option_menu_new(GtkWidget *parent, const char *name, char *str_list[],
-		 const char *val, DialogElement *elem,
+		 const char *val, SANE_Constraint_Type constraint_type, DialogElement *elem,
 		 GtkTooltips *tooltips, const char *desc, SANE_Int settable)
 {
  GtkWidget *hbox, *label, *option_menu, *menu, *item;
  MenuItem *menu_items;
+ int dup_string;
+ char *strval;
  int i, num_items;
 
   DBG(DBG_proc, "xsane_back_gtk_option_menu_new(%s)\n", name);
@@ -2248,16 +2250,23 @@
 
   menu_items = malloc((num_items + 1) * sizeof(menu_items[0]));
 
+  dup_string = (constraint_type == SANE_CONSTRAINT_STRING_LIST);
+
   menu = gtk_menu_new();
   for (i = 0; i < num_items; ++i)
   {
-    item = gtk_menu_item_new_with_label(_BGT(str_list[i]));
+    if (dup_string)
+      strval = strdup(str_list[i]);
+    else
+      strval = str_list[i];
+
+    item = gtk_menu_item_new_with_label(_BGT(strval));
     gtk_container_add(GTK_CONTAINER(menu), item);
     g_signal_connect(GTK_OBJECT(item), "activate", (GtkSignalFunc) xsane_back_gtk_option_menu_callback, menu_items + i);
 
     gtk_widget_show(item);
 
-    menu_items[i].label = str_list[i];
+    menu_items[i].label = strval;
     menu_items[i].elem = elem;
     menu_items[i].index = i;
   }
@@ -2403,14 +2412,15 @@
   xsane.standard_hbox = NULL;
   xsane.advanced_hbox = NULL;
 
-  /* free the menu labels of integer/fix-point word-lists: */
+  /* free the menu labels */
   for (i = 0; i < xsane.num_elements; ++i)
   {
     if (xsane.element[i].menu)
     {
       opt = xsane_get_option_descriptor(xsane.dev, i);
       elem = xsane.element + i;
-      if (opt->type != SANE_TYPE_STRING)
+      if ((opt->type != SANE_TYPE_STRING)
+	  || (opt->constraint_type == SANE_CONSTRAINT_STRING_LIST))
       {
         for (j = 0; j < elem->menu_size; ++j)
         {
diff -urw ../xsane-0.996.orig/src/xsane-back-gtk.h ./src/xsane-back-gtk.h
--- ../xsane-0.996.orig/src/xsane-back-gtk.h	2007-02-24 01:56:54.000000000 +0100
+++ ./src/xsane-back-gtk.h	2010-05-01 20:48:41.000000000 +0200
@@ -117,7 +117,7 @@
 	   gfloat quant, int automatic,
 	   DialogElement *elem, GtkTooltips *tooltips, const char *desc, SANE_Int settable);
 extern void xsane_back_gtk_option_menu_new(GtkWidget *parent, const char *name, char *str_list[],
-           const char *val, DialogElement *elem, GtkTooltips *tooltips, const char *desc, SANE_Int settable);
+           const char *val, SANE_Constraint_Type constraint_type, DialogElement *elem, GtkTooltips *tooltips, const char *desc, SANE_Int settable);
 extern void xsane_back_gtk_text_entry_new(GtkWidget *parent, const char *name, const char *val,
                 DialogElement *elem, GtkTooltips *tooltips, const char *desc, SANE_Int settable);
 extern void xsane_back_gtk_push_button_callback(GtkWidget *widget, gpointer data);
diff -urw ../xsane-0.996.orig/src/xsane-front-gtk.c ./src/xsane-front-gtk.c
--- ../xsane-0.996.orig/src/xsane-front-gtk.c	2007-05-17 15:35:06.000000000 +0200
+++ ./src/xsane-front-gtk.c	2010-05-01 20:48:41.000000000 +0200
@@ -64,10 +64,10 @@
                                          int *state, void *xsane_toggle_button_callback);
 GtkWidget *xsane_button_new_with_pixmap(GdkWindow *window, GtkWidget *parent, const char *xpm_d[], const char *desc,
                                         void *xsane_button_callback, gpointer data);
-void xsane_option_menu_new(GtkWidget *parent, char *str_list[], const char *val, int option_number, const char *desc,
+void xsane_option_menu_new(GtkWidget *parent, char *str_list[], const char *val, SANE_Constraint_Type constraint_type, int option_number, const char *desc,
                            void *option_menu_callback, SANE_Int settable, const gchar *widget_name);
 void xsane_option_menu_new_with_pixmap(GdkWindow *window, GtkBox *parent, const char *xpm_d[], const char *desc,
-                                       char *str_list[], const char *val,
+                                       char *str_list[], const char *val, SANE_Constraint_Type constraint_type,
                                        GtkWidget **data, int option,
                                        void *option_menu_callback, SANE_Int settable, const gchar *widget_name);
 void xsane_range_new(GtkBox *parent, char *labeltext, const char *desc,
@@ -1007,12 +1007,14 @@
 
 /* ---------------------------------------------------------------------------------------------------------------------- */
 
-void xsane_option_menu_new(GtkWidget *parent, char *str_list[], const char *val, int option_number, const char *desc,
+void xsane_option_menu_new(GtkWidget *parent, char *str_list[], const char *val, SANE_Constraint_Type constraint_type, int option_number, const char *desc,
                            void *option_menu_callback, SANE_Int settable, const gchar *widget_name)
 {
  GtkWidget *option_menu, *menu, *item;
  MenuItem *menu_items;
  DialogElement *elem;
+ int dup_string;
+ char *strval;
  int i, num_items;
 
   DBG(DBG_proc, "xsane_option_menu_new\n");
@@ -1031,9 +1033,16 @@
     gtk_widget_set_name(menu, widget_name);
   }
 
+  dup_string = (constraint_type == SANE_CONSTRAINT_STRING_LIST);
+
   for (i = 0; i < num_items; ++i)
   {
-    item = gtk_menu_item_new_with_label(_BGT(str_list[i]));
+    if (dup_string)
+      strval = strdup(str_list[i]);
+    else
+      strval = str_list[i];
+
+    item = gtk_menu_item_new_with_label(_BGT(strval));
     gtk_container_add(GTK_CONTAINER(menu), item);
 
     if (option_menu_callback)
@@ -1047,7 +1056,7 @@
 
     gtk_widget_show(item);
 
-    menu_items[i].label = str_list[i];
+    menu_items[i].label = strval;
     menu_items[i].elem  = elem;
     menu_items[i].index = i;
   }
@@ -1075,7 +1084,7 @@
 /* ---------------------------------------------------------------------------------------------------------------------- */
 
 void xsane_option_menu_new_with_pixmap(GdkWindow *window, GtkBox *parent, const char *xpm_d[], const char *desc,
-                                       char *str_list[], const char *val,
+                                       char *str_list[], const char *val, SANE_Constraint_Type constraint_type,
                                        GtkWidget **data, int option,
                                        void *option_menu_callback, SANE_Int settable, const gchar *widget_name)
 {
@@ -1094,7 +1103,7 @@
   gtk_box_pack_start(GTK_BOX(hbox), pixmapwidget, FALSE, FALSE, 2);
   gtk_widget_show(pixmapwidget);
 
-  xsane_option_menu_new(hbox, str_list, val, option, desc, option_menu_callback, settable, widget_name);
+  xsane_option_menu_new(hbox, str_list, val, constraint_type, option, desc, option_menu_callback, settable, widget_name);
   gtk_widget_show(hbox);
 }
 
diff -urw ../xsane-0.996.orig/src/xsane-front-gtk.h ./src/xsane-front-gtk.h
--- ../xsane-0.996.orig/src/xsane-front-gtk.h	2007-05-17 14:45:19.000000000 +0200
+++ ./src/xsane-front-gtk.h	2010-05-01 20:48:41.000000000 +0200
@@ -54,10 +54,10 @@
 extern GtkWidget *xsane_button_new_with_pixmap(GdkWindow *window, GtkWidget *parent, const char *xpm_d[], const char *desc, 
                                                void *xsane_button_callback, gpointer data);
 extern void xsane_pixmap_new(GtkWidget *parent, char *title, int width, int height, XsanePixmap *hist);
-extern void xsane_option_menu_new(GtkWidget *parent, char *str_list[], const char *val, int option_number, const char *desc,
+extern void xsane_option_menu_new(GtkWidget *parent, char *str_list[], const char *val, SANE_Constraint_Type constraint_type, int option_number, const char *desc,
                                   void *option_menu_callback, SANE_Int settable, const gchar *widget_name);
 extern void xsane_option_menu_new_with_pixmap(GdkWindow *window, GtkBox *parent, const char *xpm_d[], const char *desc,
-                                              char *str_list[], const char *val,
+                                              char *str_list[], const char *val, SANE_Constraint_Type constraint_type,
                                               GtkWidget **data, int option,
                                               void *option_menu_callback, SANE_Int settable, const gchar *widget_name);
 extern void xsane_range_new(GtkBox *parent, char *labeltext, const char *desc,
diff -urw ../xsane-0.996.orig/src/xsane.c ./src/xsane.c
--- ../xsane-0.996.orig/src/xsane.c	2008-03-29 09:56:30.000000000 +0100
+++ ./src/xsane.c	2010-05-01 20:48:41.000000000 +0200
@@ -876,7 +876,7 @@
             str_list[j] = 0;
             sprintf(str, "%d", (int) val);
 
-            xsane_option_menu_new_with_pixmap(xsane.xsane_window->window, GTK_BOX(parent), image_xpm, desc, str_list, str, &resolution_widget, well_known_option,
+            xsane_option_menu_new_with_pixmap(xsane.xsane_window->window, GTK_BOX(parent), image_xpm, desc, str_list, str, opt->constraint_type, &resolution_widget, well_known_option,
                                               xsane_resolution_list_callback, SANE_OPTION_IS_SETTABLE(opt->cap), widget_name);
 
             free(str_list);
@@ -931,7 +931,7 @@
 
 
           xsane_option_menu_new_with_pixmap(xsane.xsane_window->window, GTK_BOX(parent), image_xpm, desc,
-                                            str_list, str, &resolution_widget, well_known_option,
+                                            str_list, str, opt->constraint_type, &resolution_widget, well_known_option,
                                             xsane_resolution_list_callback, SANE_OPTION_IS_SETTABLE(opt->cap), widget_name);
           free(str_list);
         }
@@ -1490,7 +1490,7 @@
           set = malloc(opt->size);
           status = xsane_control_option(xsane.dev, xsane.well_known.scansource, SANE_ACTION_GET_VALUE, set, 0);
 
-          xsane_option_menu_new(hbox, (char **) opt->constraint.string_list, set, xsane.well_known.scansource,
+          xsane_option_menu_new(hbox, (char **) opt->constraint.string_list, set, opt->constraint_type, xsane.well_known.scansource,
                                 _BGT(opt->desc), 0, SANE_OPTION_IS_SETTABLE(opt->cap), 0);
          }
          break;
@@ -1529,7 +1529,7 @@
           set = malloc(opt->size);
           status = xsane_control_option(xsane.dev, xsane.well_known.scanmode, SANE_ACTION_GET_VALUE, set, 0);
 
-          xsane_option_menu_new(hbox, (char **) opt->constraint.string_list, set, xsane.well_known.scanmode,
+          xsane_option_menu_new(hbox, (char **) opt->constraint.string_list, set, opt->constraint_type, xsane.well_known.scanmode,
                                 _BGT(opt->desc), xsane_scanmode_menu_callback, SANE_OPTION_IS_SETTABLE(opt->cap), 0);
         }
          break;
@@ -4634,7 +4634,7 @@
               }
               str_list[j] = 0;
               sprintf(str, "%d", val);
-              xsane_back_gtk_option_menu_new(parent, title, str_list, str, elem, xsane.tooltips, _BGT(opt->desc),
+              xsane_back_gtk_option_menu_new(parent, title, str_list, str, opt->constraint_type, elem, xsane.tooltips, _BGT(opt->desc),
                                   SANE_OPTION_IS_SETTABLE(opt->cap));
               free(str_list);
               gtk_widget_show(parent->parent);
@@ -4732,7 +4732,7 @@
               }
               str_list[j] = 0;
               sprintf(str, "%g", SANE_UNFIX(val));
-              xsane_back_gtk_option_menu_new(parent, title, str_list, str, elem, xsane.tooltips, _BGT(opt->desc), SANE_OPTION_IS_SETTABLE(opt->cap));
+              xsane_back_gtk_option_menu_new(parent, title, str_list, str, opt->constraint_type, elem, xsane.tooltips, _BGT(opt->desc), SANE_OPTION_IS_SETTABLE(opt->cap));
               free (str_list);
               gtk_widget_show(parent->parent);
             }
@@ -4769,7 +4769,7 @@
                  (strcmp (opt->name, SANE_NAME_SCAN_SOURCE) != 0) ) /* do not show scansource */
             {
               /* use a "list-selection" widget */
-              xsane_back_gtk_option_menu_new(parent, title, (char **) opt->constraint.string_list, buf,
+              xsane_back_gtk_option_menu_new(parent, title, (char **) opt->constraint.string_list, buf, opt->constraint_type,
                                   elem, xsane.tooltips, _BGT(opt->desc), SANE_OPTION_IS_SETTABLE(opt->cap));
               gtk_widget_show (parent->parent);
             }
