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