Wrong type of Import file browser <SOLVED>

Building from SVN head on Debian Squeeze or Linux Mint Debian Edition.

The Import file browser has a text field for the file name. Single clicking on a file does not enter the name into that field. Double clicking on a file selects the file and loads it. It is not possible to import more than one file at a time because the OK button annot be clicked until there is ONE file name in the text field. Any ideas how to solve this?
import-file-browser.png

I spent quite a while looking at file requester dialogs today on Windows and see that for the open file dialog the code devolves directly to one of the OS’s generic dialogs. In Window’s case it devolves to a version available at least as far back as Win2k (it does not recognize that there is a new flavor available in Win7 and with the latest SPs of Vista).

For GTK I see (in lib-srcFileDialoggtkFileDialogPrivate.cpp at-or-near line 171) :

FileDialog::FileDialog(wxWindow *parent, const wxString& message,
                       const wxString& defaultDir,
                       const wxString& defaultFileName,
                       const wxString& wildCard,
                       long style, const wxPoint& pos)
: wxGenericFileDialog(parent, message, defaultDir, defaultFileName,
                      wildCard, style, pos, 
#if wxCHECK_VERSION(2,8,0)
                      wxDefaultSize,
                      wxFileDialogNameStr,
#endif
                      true )
{
#if defined(__WXGTK24__) && (!defined(__WXGPE__))
   if (!gtk_check_version(2,4,0))
   {
      wxASSERT_MSG( !( (style & wxFD_SAVE) && (style & wxFD_MULTIPLE) ), wxT("FileDialog - wxFD_MULTIPLE used on a save dialog" ) );
      m_needParent = false;
      m_destroyed_by_delete = false;
      
      if (!PreCreation(parent, pos, wxDefaultSize) ||
          !CreateBase(parent, wxID_ANY, pos, wxDefaultSize, style,
                      wxDefaultValidator, wxT("filedialog")))
      {
         wxFAIL_MSG( wxT("FileDialog creation failed") );
         return;
      }
      
      GtkFileChooserAction gtk_action;
      GtkWindow* gtk_parent = NULL;
      if (parent)
         gtk_parent = GTK_WINDOW( gtk_widget_get_toplevel(parent->m_widget) );
      
      const gchar* ok_btn_stock;
      if ( style & wxFD_SAVE )
      {
         gtk_action = GTK_FILE_CHOOSER_ACTION_SAVE;
         ok_btn_stock = GTK_STOCK_SAVE;
      }
      else
      {
         gtk_action = GTK_FILE_CHOOSER_ACTION_OPEN;
         ok_btn_stock = GTK_STOCK_OPEN;
      }
      
      m_widget = gtk_file_chooser_dialog_new(
                                             wxGTK_CONV(m_message),
                                             gtk_parent,
                                             gtk_action,
                                             GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
                                             ok_btn_stock, GTK_RESPONSE_ACCEPT,
                                             NULL);
      
      // Allow pressing "Enter" key for default action
      gtk_dialog_set_default_response(GTK_DIALOG(m_widget), GTK_RESPONSE_ACCEPT);
      
      if ( style & wxFD_MULTIPLE )
         gtk_file_chooser_set_select_multiple(GTK_FILE_CHOOSER(m_widget), true);
      
      // local-only property could be set to false to allow non-local files to be loaded.
      // In that case get/set_uri(s) should be used instead of get/set_filename(s) everywhere
      // and the GtkFileChooserDialog should probably also be created with a backend,
      // e.g "gnome-vfs", "default", ... (gtk_file_chooser_dialog_new_with_backend).
      // Currently local-only is kept as the default - true:
      // gtk_file_chooser_set_local_only(GTK_FILE_CHOOSER(m_widget), true);
      
      g_signal_connect(G_OBJECT(m_widget), "response",
                       GTK_SIGNAL_FUNC(gtk_filedialog_response_callback), (gpointer)this);
      g_signal_connect(G_OBJECT(m_widget), "show",
                       GTK_SIGNAL_FUNC(gtk_filedialog_show_callback), (gpointer)this);
      
      SetWildcard(wildCard);
      
      if ( style & wxFD_SAVE )
      {
         if ( !defaultDir.empty() )
            gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(m_widget),
                                                wxConvFileName->cWX2MB(defaultDir));
         
         gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(m_widget),
                                           wxConvFileName->cWX2MB(defaultFileName));
         
#if GTK_CHECK_VERSION(2,7,3)
         if (!gtk_check_version(2,7,3))
            gtk_file_chooser_set_do_overwrite_confirmation(GTK_FILE_CHOOSER(m_widget), FALSE);
#endif
      }
      else
      {
         if ( !defaultFileName.empty() )
         {
            wxString dir;
            if ( defaultDir.empty() )
               dir = ::wxGetCwd();
            else
               dir = defaultDir;
            
            gtk_file_chooser_set_filename(
                                          GTK_FILE_CHOOSER(m_widget),
                                          wxConvFileName->cWX2MB( wxFileName(dir, defaultFileName).GetFullPath() ) );
         }
         else if ( !defaultDir.empty() )
            gtk_file_chooser_set_current_folder( GTK_FILE_CHOOSER(m_widget),
                                                wxConvFileName->cWX2MB(defaultDir) );
      }
   }
   else
#endif
      wxGenericFileDialog::Create( parent, message, defaultDir, defaultFileName, wildCard, style, pos );
}

wherein I see some version specific checks setting up the parameters and also controlling which dialog to call:
if (!gtk_check_version(2,4,0)) then
m_widget = gtk_file_chooser_dialog_new([…])
and before showing the dialog:
if (!gtk_check_version(2,7,3)) then
gtk_file_chooser_set_do_overwrite_confirmation([…])

but if not 2,4,0 then id goes to the very bare-bones:
wxGenericFileDialog::Create([…])

Not being a Linux guru, I cannot be sure, but it may be that you are using a gtk which fails
if (!gtk_check_version(2,4,0))
because it is 3,x,x or newer. I do not know if the test returns TRUE for 2.4.0 or newer of if it only returns TRUE if the first version # is 2. You could add some wxMessageBox statements to see which version you are calling. If you need me to I can give you code which will do that.

It would be good if you find an example of an OS operation which does an open file dialog and see what actions are available to you there and how they differ from what is available in Audacity. This would give you better grounds/support for an enhancement proposal. I would be willing to add the details for Win7 (and am planning on enhancing my personal version this coming week so that it uses Win7 file requesters).

Do you mean libwxgtk ? I’m using version 2.8.
The build in the repositories works fine, but when I build from either SVN or from the current 1.3.13 source tarball I get this wrong file browser window when trying to import.

I initially had the following libraries installed:

libgtk2.0-bin
libgtk2.0-common

but not

libgtk2.0-dev

In LMDE I’ve added libgtk2.0-dev (version 2.4.4-3) and it appears to have fixed the problem.

Thanks Edgar for the pointer.

Also works on Debian Squeeze by installing libgtk2.0-dev (2.20.1-2)