Don't keep gtk-file-chooser around.
authorRobin Gareus <robin@gareus.org>
Sun, 6 Sep 2015 16:15:13 +0000 (18:15 +0200)
committerRobin Gareus <robin@gareus.org>
Sun, 6 Sep 2015 16:15:13 +0000 (18:15 +0200)
This fixes some odd-crashes in the gtk main-thread after loading a new
session in gtk_file_system_model_sort().

gtk2_ardour/ardour_ui.cc
gtk2_ardour/ardour_ui.h

index beb96f434891778752b6899fab1302b362fd5435..815d8e88bc1ad3ed7377bc9dca39bc72b4074296 100644 (file)
@@ -256,7 +256,6 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], const char* localedir, UIConfi
        , editor_meter(0)
        , editor_meter_peak_display()
        , session_selector_window (0)
-       , open_session_selector (0)
        , _numpad_locate_happening (false)
        , _session_is_new (false)
        , last_key_press_time (0)
@@ -1775,55 +1774,43 @@ ARDOUR_UI::open_session ()
 
        }
 
-       /* popup selector window */
+       /* ardour sessions are folders */
+       Gtk::FileChooserDialog open_session_selector(_("Open Session"), FILE_CHOOSER_ACTION_OPEN);
+       open_session_selector.add_button (Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);
+       open_session_selector.add_button (Gtk::Stock::OPEN, Gtk::RESPONSE_ACCEPT);
+       open_session_selector.set_default_response(Gtk::RESPONSE_ACCEPT);
 
-       if (open_session_selector == 0) {
 
-               /* ardour sessions are folders */
 
-               open_session_selector = new Gtk::FileChooserDialog (_("Open Session"), FILE_CHOOSER_ACTION_OPEN);
-               open_session_selector->add_button (Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);
-               open_session_selector->add_button (Gtk::Stock::OPEN, Gtk::RESPONSE_ACCEPT);
-               open_session_selector->set_default_response(Gtk::RESPONSE_ACCEPT);
-               
-               if (_session) {
-                       string session_parent_dir = Glib::path_get_dirname(_session->path());
-                       string::size_type last_dir_sep = session_parent_dir.rfind(G_DIR_SEPARATOR);
-                       session_parent_dir = session_parent_dir.substr(0, last_dir_sep);
-                       open_session_selector->set_current_folder(session_parent_dir);
-               } else {
-                       open_session_selector->set_current_folder(Config->get_default_session_parent_dir());
-               }
+       if (_session) {
+               string session_parent_dir = Glib::path_get_dirname(_session->path());
+               open_session_selector.set_current_folder(session_parent_dir);
+       } else {
+               open_session_selector.set_current_folder(Config->get_default_session_parent_dir());
+       }
 
+       try {
+               /* add_shortcut_folder throws an exception if the folder being added already has a shortcut */
+#ifdef GTKOSX
+               open_session_selector.add_shortcut_folder_uri("file:///Volumes");
+#endif
                string default_session_folder = Config->get_default_session_parent_dir();
-               try {
-                       /* add_shortcut_folder throws an exception if the folder being added already has a shortcut */
-                       open_session_selector->add_shortcut_folder (default_session_folder);
-               }
-               catch (Glib::Error & e) {
-                       std::cerr << "open_session_selector->add_shortcut_folder (" << default_session_folder << ") threw Glib::Error " << e.what() << std::endl;
-               }
-
-               FileFilter session_filter;
-               session_filter.add_pattern (string_compose(X_("*%1"), ARDOUR::statefile_suffix));
-               session_filter.set_name (string_compose (_("%1 sessions"), PROGRAM_NAME));
-               open_session_selector->add_filter (session_filter);
-               open_session_selector->set_filter (session_filter);
-       }
+               open_session_selector.add_shortcut_folder (default_session_folder);
+       }
+       catch (Glib::Error & e) {
+               std::cerr << "open_session_selector.add_shortcut_folder() threw Glib::Error " << e.what() << std::endl;
+       }
 
-       int response = open_session_selector->run();
-       open_session_selector->hide ();
+       FileFilter session_filter;
+       session_filter.add_pattern (string_compose(X_("*%1"), ARDOUR::statefile_suffix));
+       session_filter.set_name (string_compose (_("%1 sessions"), PROGRAM_NAME));
+       open_session_selector.add_filter (session_filter);
+       open_session_selector.set_filter (session_filter);
 
-       switch (response) {
-       case RESPONSE_ACCEPT:
-               break;
-       default:
-               open_session_selector->hide();
-               return;
-       }
+       int response = open_session_selector.run();
+       open_session_selector.hide ();
 
-       open_session_selector->hide();
-       string session_path = open_session_selector->get_filename();
+       string session_path = open_session_selector.get_filename();
        string path, name;
        bool isnew;
 
index 722a0bf5961ed88a803df15f075b1da3cf1b32f5..f279ebd6ad554b469432dbbc69a8846211590aaf 100644 (file)
@@ -518,7 +518,6 @@ class ARDOUR_UI : public Gtkmm2ext::UI, public ARDOUR::SessionHandlePtr
        Glib::RefPtr<Gtk::TreeStore> recent_session_model;
 
        ArdourDialog*     session_selector_window;
-       Gtk::FileChooserDialog* open_session_selector;
 
        void build_session_selector();
        void redisplay_recent_sessions();