diff --git a/Fltk/Callbacks.cpp b/Fltk/Callbacks.cpp
index 6a4b34f68fc578444e0f899e5d9277eb08f57569..55bcbb453f782cc841bc21c991daee267ab29948 100644
--- a/Fltk/Callbacks.cpp
+++ b/Fltk/Callbacks.cpp
@@ -1,4 +1,4 @@
-// $Id: Callbacks.cpp,v 1.332 2005-02-02 18:47:55 geuzaine Exp $
+// $Id: Callbacks.cpp,v 1.333 2005-02-05 21:49:00 geuzaine Exp $
 //
 // Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
 //
@@ -265,7 +265,7 @@ void status_cancel_cb(CALLBACK_ARGS)
 void file_new_cb(CALLBACK_ARGS)
 {
  test:
-  if(file_chooser(0, 1, "New", "*", 0)) {
+  if(file_chooser(0, 1, "New", "*")) {
     char *name = file_chooser_get_name(1);
     struct stat buf;
     if(!stat(name, &buf)){
@@ -300,7 +300,7 @@ static char *file_types =
 void file_open_cb(CALLBACK_ARGS)
 {
   int n = List_Nbr(CTX.post.list);
-  if(file_chooser(0, 0, "Open", file_types, 0)) {
+  if(file_chooser(0, 0, "Open", file_types)) {
     OpenProblem(file_chooser_get_name(1));
     Draw();
   }
@@ -311,7 +311,7 @@ void file_open_cb(CALLBACK_ARGS)
 void file_merge_cb(CALLBACK_ARGS)
 {
   int n = List_Nbr(CTX.post.list);
-  int f = file_chooser(1, 0, "Merge", file_types, 0);
+  int f = file_chooser(1, 0, "Merge", file_types);
   if(f) {
     for(int i = 1; i <= f; i++)
       MergeProblem(file_chooser_get_name(i));
@@ -450,7 +450,6 @@ typedef struct{
 void file_save_as_cb(CALLBACK_ARGS)
 {
   int i, nbformats;
-  static int patindex = 0;
   static char *pat = NULL;
   static patXfunc formats[] = {
     {"By extension (*)", _save_auto},
@@ -497,7 +496,7 @@ void file_save_as_cb(CALLBACK_ARGS)
   }
 
  test:
-  if(file_chooser(0, 1, "Save As", pat, patindex)) {
+  if(file_chooser(0, 1, "Save As", pat)) {
     char *name = file_chooser_get_name(1);
     if(CTX.confirm_overwrite) {
       struct stat buf;
@@ -513,14 +512,12 @@ void file_save_as_cb(CALLBACK_ARGS)
     else        // handle any additional automatic fltk filter
       _save_auto(name);
   }
-
-  patindex = file_chooser_get_filter();
 }
 
 void file_rename_cb(CALLBACK_ARGS)
 {
  test:
-  if(file_chooser(0, 1, "Rename", "*", 0, CTX.filename)) {
+  if(file_chooser(0, 1, "Rename", "*", CTX.filename)) {
     char *name = file_chooser_get_name(1);
     if(CTX.confirm_overwrite) {
       struct stat buf;
@@ -946,7 +943,7 @@ void message_clear_cb(CALLBACK_ARGS)
 void message_save_cb(CALLBACK_ARGS)
 {
  test:
-  if(file_chooser(0, 1, "Save", "*", 0)) {
+  if(file_chooser(0, 1, "Save", "*")) {
     char *name = file_chooser_get_name(1);
     if(CTX.confirm_overwrite) {
       struct stat buf;
@@ -2691,7 +2688,7 @@ void solver_file_open_cb(CALLBACK_ARGS)
 
   // We allow to create the .pro file... Or should we add a "New file"
   // button?
-  if(file_chooser(0, 1, "Choose", tmp, 0)) {
+  if(file_chooser(0, 1, "Choose", tmp)) {
     WID->solver[num].input[0]->value(file_chooser_get_name(1));
     if(SINFO[num].nboptions) {
       char file[1024];
@@ -2717,7 +2714,7 @@ void solver_file_edit_cb(CALLBACK_ARGS)
 void solver_choose_mesh_cb(CALLBACK_ARGS)
 {
   int num = (int)(long)data;
-  if(file_chooser(0, 0, "Choose", "*.msh", 0))
+  if(file_chooser(0, 0, "Choose", "*.msh"))
     WID->solver[num].input[1]->value(file_chooser_get_name(1));
 }
 
@@ -2792,7 +2789,7 @@ void solver_choose_executable_cb(CALLBACK_ARGS)
 #else
                   "*"
 #endif
-                  , 0))
+                  ))
     WID->solver[num].input[2]->value(file_chooser_get_name(1));
 }
 
@@ -2932,7 +2929,7 @@ static void _view_save_as(int view_num, char *title, int type)
   Post_View *v = *(Post_View **) List_Pointer(CTX.post.list, view_num);
   
  test:
-  if(file_chooser(0, 1, title, "*", 0, v->FileName)) {
+  if(file_chooser(0, 1, title, "*", v->FileName)) {
     char *name = file_chooser_get_name(1);
     if(CTX.confirm_overwrite) {
       struct stat buf;
diff --git a/Fltk/File_Picker.h b/Fltk/File_Picker.h
index ca2d3b628bdb2b15b77980bfc0e6c54ef32765a8..25634b9cba9bd62fe46dc2e2bfa9180ed17fb6f4 100644
--- a/Fltk/File_Picker.h
+++ b/Fltk/File_Picker.h
@@ -46,7 +46,7 @@ public:
       if(_in)
 	_in->take_focus();
       else
-	_win->take_focus();	
+	_win->take_focus();
     }
     else
       Fl_File_Chooser::show();
diff --git a/Fltk/GUI_Extras.cpp b/Fltk/GUI_Extras.cpp
index 7ef0e090b3ecb216c57fb9d2c4adcfe7823d6bc6..fb7c29364053757bec0b28fe8ff2628f3c845f38 100644
--- a/Fltk/GUI_Extras.cpp
+++ b/Fltk/GUI_Extras.cpp
@@ -1,4 +1,4 @@
-// $Id: GUI_Extras.cpp,v 1.7 2005-01-18 19:03:07 geuzaine Exp $
+// $Id: GUI_Extras.cpp,v 1.8 2005-02-05 21:49:00 geuzaine Exp $
 //
 // Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
 //
@@ -40,18 +40,24 @@ extern Context_T CTX;
 static File_Picker *fc = NULL;
 
 int file_chooser(int multi, int create, const char *message,
-		 const char *pat, int patindex, char *fname)
+		 const char *filter, char *fname)
 {
-  static char oldfilter[1024];
+  static char thefilter[1024] = "";
+  static int thefilterindex = 0;
 
   Fl_File_Chooser::show_label = "Format:";
   Fl_File_Chooser::all_files_label = "All files (*)";
 
+  if(strncmp(thefilter, filter, 1024)) {
+    // reset the filter and the selection if the filter has changed
+    strncpy(thefilter, filter, 1024);
+    thefilterindex = 0;
+  }
+
   if(!fc) {
-    fc = new File_Picker(getenv("PWD") ? "." : CTX.home_dir, pat, 
-			      Fl_File_Chooser::SINGLE, message);
+    fc = new File_Picker(getenv("PWD") ? "." : CTX.home_dir, thefilter, 
+			 Fl_File_Chooser::SINGLE, message);
     fc->position(CTX.file_chooser_position[0], CTX.file_chooser_position[1]);
-    strncpy(oldfilter, pat, 1024);
   }
 
   fc->label(message);
@@ -59,11 +65,8 @@ int file_chooser(int multi, int create, const char *message,
   if(fname)
     fc->value(fname);
 
-  if(strncmp(oldfilter, pat, 1024)) {
-    strncpy(oldfilter, pat, 1024);
-    fc->filter(pat);
-    fc->filter_value(patindex);
-  }
+  fc->filter(thefilter);
+  fc->filter_value(thefilterindex);
 
   if(multi)
     fc->type(Fl_File_Chooser::MULTI);
@@ -77,6 +80,8 @@ int file_chooser(int multi, int create, const char *message,
   while(fc->shown())
     Fl::wait();
 
+  thefilterindex = fc->filter_value();
+
   if(fc->value())
     return fc->count();
   else
diff --git a/Fltk/GUI_Extras.h b/Fltk/GUI_Extras.h
index 5cbae0312faa41b3b9e7ff44160cbeb10f312f70..18a2e30bf0134d9a7c9c7d1955d9e62028d7b115 100644
--- a/Fltk/GUI_Extras.h
+++ b/Fltk/GUI_Extras.h
@@ -21,7 +21,7 @@
 // Please report all bugs and problems to <gmsh@geuz.org>.
 
 int file_chooser(int multi, int create, const char *message,
-		 const char *pat, int patindex, char *fname=NULL);
+		 const char *pat, char *fname=NULL);
 char *file_chooser_get_name(int num);
 int file_chooser_get_filter();
 void file_chooser_get_position(int *x, int *y);