Wrong type of Import file browser <SOLVED>

Building and customizing Audacity from the source code.
Forum rules
If you require help using Audacity, please post on the forum board relevant to your operating system:
Windows
Mac OS X
GNU/Linux and Unix-like
Post Reply
steve
Site Admin
Posts: 81609
Joined: Sat Dec 01, 2007 11:43 am
Operating System: Linux *buntu

Wrong type of Import file browser <SOLVED>

Post by steve » Fri Nov 04, 2011 9:04 pm

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
File selected but not in the file name field
import-file-browser.png (22.79 KiB) Viewed 2172 times
9/10 questions are answered in the FREQUENTLY ASKED QUESTIONS (FAQ)

Edgar
Forum Crew
Posts: 2043
Joined: Thu Sep 03, 2009 9:13 pm
Operating System: Windows 10

Re: Wrong type of Import file browser

Post by Edgar » Sat Nov 05, 2011 6:42 pm

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) :

Code: Select all

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).

steve
Site Admin
Posts: 81609
Joined: Sat Dec 01, 2007 11:43 am
Operating System: Linux *buntu

Re: Wrong type of Import file browser

Post by steve » Sun Nov 06, 2011 1:34 am

Edgar wrote: 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))
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.
9/10 questions are answered in the FREQUENTLY ASKED QUESTIONS (FAQ)

steve
Site Admin
Posts: 81609
Joined: Sat Dec 01, 2007 11:43 am
Operating System: Linux *buntu

Re: Wrong type of Import file browser <SOLVED>

Post by steve » Sun Nov 06, 2011 1:02 pm

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.

steve
Site Admin
Posts: 81609
Joined: Sat Dec 01, 2007 11:43 am
Operating System: Linux *buntu

Re: Wrong type of Import file browser <SOLVED>

Post by steve » Sun Nov 06, 2011 3:38 pm

Also works on Debian Squeeze by installing libgtk2.0-dev (2.20.1-2)
9/10 questions are answered in the FREQUENTLY ASKED QUESTIONS (FAQ)

Post Reply