Index: gtk2_ardour/startup.cc
===================================================================
--- gtk2_ardour/startup.cc	(revision 11630)
+++ gtk2_ardour/startup.cc	(working copy)
@@ -39,6 +39,7 @@
 #include "ardour/session_state_utils.h"
 #include "ardour/template_utils.h"
 
+#include "ardour_ui.h"
 #include "startup.h"
 #include "opts.h"
 #include "engine_dialog.h"
@@ -360,7 +361,12 @@
 void
 ArdourStartup::default_dir_changed ()
 {
+
+	cerr << "default_dir_changed() to " << default_dir_chooser->get_filename() << endl;
 	Config->set_default_session_parent_dir (default_dir_chooser->get_filename());
+
+	// make new session folder chooser point to the new default
+	new_folder_chooser.set_current_folder (Config->get_default_session_parent_dir());
 	config_changed ();
 }
 
@@ -584,6 +590,7 @@
 
 		existing_session_chooser.set_title (_("Select session file"));
 		existing_session_chooser.signal_file_set().connect (sigc::mem_fun (*this, &ArdourStartup::existing_session_selected));
+		existing_session_chooser.set_current_folder(poor_mans_glob (Config->get_default_session_parent_dir()));
 			
 #ifdef GTKOSX
 		existing_session_chooser.add_shortcut_folder ("/Volumes");
@@ -786,6 +793,13 @@
 
 		if (!ARDOUR_COMMAND_LINE::session_name.empty()) {
 			new_folder_chooser.set_current_folder (poor_mans_glob (Glib::path_get_dirname (ARDOUR_COMMAND_LINE::session_name)));
+		} else if (ARDOUR_UI::instance()->session_loaded) {
+			// point the new session file chooser at the parent directory of the current session
+			string session_parent_dir = Glib::path_get_dirname(ARDOUR_UI::instance()->the_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);
+			new_folder_chooser.set_current_folder (session_parent_dir);
+			new_folder_chooser.add_shortcut_folder (poor_mans_glob (Config->get_default_session_parent_dir()));
 		} else {
 			new_folder_chooser.set_current_folder (poor_mans_glob (Config->get_default_session_parent_dir()));
 		}
Index: gtk2_ardour/ardour_ui.cc
===================================================================
--- gtk2_ardour/ardour_ui.cc	(revision 11630)
+++ gtk2_ardour/ardour_ui.cc	(working copy)
@@ -1348,7 +1349,18 @@
 		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());
+		}
 
+		open_session_selector->add_shortcut_folder (Config->get_default_session_parent_dir());
+
 		FileFilter session_filter;
 		session_filter.add_pattern ("*.ardour");
 		session_filter.set_name (string_compose (_("%1 sessions"), PROGRAM_NAME));
@@ -2584,24 +2596,15 @@
 				continue;
 			}
 
-			if (session_name.find ('/') != std::string::npos) {
-				MessageDialog msg (*_startup,
-				                   _("To ensure compatibility with various systems\n"
-				                     "session names may not contain a '/' character"));
+			char illegal = Session::session_name_is_legal(session_name);
+			if (illegal) {
+				MessageDialog msg (*_startup, string_compose(_("To ensure compatibility with various systems\n"
+				                     "session names may not contain a '%1' character"), illegal));
 				msg.run ();
 				ARDOUR_COMMAND_LINE::session_name = ""; // cancel that
 				continue;
 			}
 
-			if (session_name.find ('\\') != std::string::npos) {
-				MessageDialog msg (*_startup,
-				                   _("To ensure compatibility with various systems\n"
-				                     "session names may not contain a '\\' character"));
-				msg.run ();
-				ARDOUR_COMMAND_LINE::session_name = ""; // cancel that
-				continue;
-			}
-
 			_session_is_new = true;
 		}
 
@@ -3265,7 +3268,23 @@
 void
 ARDOUR_UI::create_xrun_marker (framepos_t where)
 {
-	editor->mouse_add_new_marker (where, false, true);
+	if (_session) {
+		/* adding xrun markers doesn't need to be undoable:
+		 * just add it, and don't make_current either.
+		 *
+		 * XXX doesn't do the right thing yet, since the xrun 
+		 * markers are created during capture, 
+		 * but begin_reversible_command (Operations::capture);
+		 * doesn't happen until the transport is stopped after
+		 * the capture.
+		 */
+		 
+		string markername;
+
+		_session->locations()->next_available_name(markername, _("xrun"));
+		Location *location = new Location (*_session, where, where, markername, Location::IsMark);
+		_session->locations()->add (location, false);
+	}
 }
 
 void
@@ -3626,10 +3645,23 @@
 void
 ARDOUR_UI::setup_profile ()
 {
+#ifndef GTKOSX
 	if (gdk_screen_width() < 1200) {
+		cerr << "gdk_screen_width() = " << gdk_screen_width() <<  ", font_scale = " << (Config->get_font_scale() / 1024) << endl;
+		if (Config->get_font_scale() / 1024 > 72) {
+			Config->set_font_scale(1024 * 72);
+			cerr << "font_scale now set to " << (Config->get_font_scale() / 1024) << endl;
+		}
+		if (gdk_screen_width() < 1024) {
+			Profile->set_small_screen ();
+		}
+	}
+#else 
+	if (gdk_screen_width() < 1200) {
 		Profile->set_small_screen ();
 	}
 
+#endif
 
 	if (getenv ("ARDOUR_SAE")) {
 		Profile->set_sae ();
