a) start at creating ControlProtocol objects
[ardour.git] / gtk2_ardour / ardour_ui.cc
index 37792a80190c40900abf82d7bd86955d2988c795..79c81992dcc6573d4a163f3ca87507519b7f07c0 100644 (file)
 
 #include <iostream>
 
-#include <gtkmm.h>
+#include <gtkmm/messagedialog.h>
+#include <gtkmm/accelmap.h>
+
 #include <pbd/error.h>
+#include <pbd/compose.h>
 #include <pbd/basename.h>
 #include <pbd/pathscanner.h>
 #include <pbd/failed_constructor.h>
 #include <gtkmm2ext/gtk_ui.h>
-#include <gtkmm2ext/pix.h>
 #include <gtkmm2ext/utils.h>
 #include <gtkmm2ext/click_box.h>
-#include <gtkmm2ext/selector.h>
 #include <gtkmm2ext/fastmeter.h>
 #include <gtkmm2ext/stop_signal.h>
 #include <gtkmm2ext/popup.h>
@@ -57,8 +58,8 @@
 #include <ardour/port.h>
 #include <ardour/audio_track.h>
 
+#include "actions.h"
 #include "ardour_ui.h"
-#include "ardour_message.h"
 #include "public_editor.h"
 #include "audio_clock.h"
 #include "keyboard.h"
@@ -71,6 +72,7 @@
 #include "about.h"
 #include "utils.h"
 #include "gui_thread.h"
+#include "color_manager.h"
 
 #include "i18n.h"
 
@@ -80,710 +82,16 @@ using namespace Gtk;
 using namespace sigc;
 
 ARDOUR_UI *ARDOUR_UI::theArdourUI = 0;
-SoundFileSelector* ARDOUR_UI::sfdb_window = 0;
 
 sigc::signal<void,bool> ARDOUR_UI::Blink;
 sigc::signal<void>      ARDOUR_UI::RapidScreenUpdate;
 sigc::signal<void>      ARDOUR_UI::SuperRapidScreenUpdate;
 sigc::signal<void,jack_nframes_t> ARDOUR_UI::Clock;
 
-/* XPM */
-static const gchar *h_meter_strip_xpm[] = {
-"186 5 187 2",
-"      c None",
-".     c #2BFE00",
-"+     c #2DFE00",
-"@     c #2FFE01",
-"#     c #32FE01",
-"$     c #34FE02",
-"%     c #36FE02",
-"&     c #38FE03",
-"*     c #3BFE03",
-"=     c #3DFD04",
-"-     c #3FFD04",
-";     c #41FD05",
-">     c #44FD05",
-",     c #46FD06",
-"'     c #48FD06",
-")     c #4AFD07",
-"!     c #4DFD07",
-"~     c #4FFD08",
-"{     c #51FC08",
-"]     c #53FC09",
-"^     c #56FC09",
-"/     c #58FC09",
-"(     c #5AFC0A",
-"_     c #5CFC0A",
-":     c #5FFC0B",
-"<     c #61FC0B",
-"[     c #63FB0C",
-"}     c #65FB0C",
-"|     c #68FB0D",
-"1     c #6AFB0D",
-"2     c #6CFB0E",
-"3     c #6EFB0E",
-"4     c #71FB0F",
-"5     c #73FB0F",
-"6     c #75FB10",
-"7     c #77FA10",
-"8     c #7AFA11",
-"9     c #7CFA11",
-"0     c #7EFA12",
-"a     c #80FA12",
-"b     c #83FA12",
-"c     c #85FA13",
-"d     c #87FA13",
-"e     c #89FA14",
-"f     c #8CF914",
-"g     c #8EF915",
-"h     c #90F915",
-"i     c #92F916",
-"j     c #95F916",
-"k     c #97F917",
-"l     c #99F917",
-"m     c #9BF918",
-"n     c #9EF818",
-"o     c #A0F819",
-"p     c #A2F819",
-"q     c #A4F81A",
-"r     c #A7F81A",
-"s     c #A9F81A",
-"t     c #ABF81B",
-"u     c #ADF81B",
-"v     c #B0F81C",
-"w     c #B2F71C",
-"x     c #B4F71D",
-"y     c #B6F71D",
-"z     c #B9F71E",
-"A     c #BBF71E",
-"B     c #BDF71F",
-"C     c #BFF71F",
-"D     c #C2F720",
-"E     c #C4F720",
-"F     c #C6F621",
-"G     c #C8F621",
-"H     c #CBF622",
-"I     c #CDF622",
-"J     c #CFF623",
-"K     c #D1F623",
-"L     c #D4F624",
-"M     c #D6F624",
-"N     c #D8F524",
-"O     c #DAF525",
-"P     c #DDF525",
-"Q     c #DFF526",
-"R     c #E1F526",
-"S     c #E3F527",
-"T     c #E6F527",
-"U     c #E8F528",
-"V     c #EAF528",
-"W     c #ECF429",
-"X     c #EFF429",
-"Y     c #F1F42A",
-"Z     c #F3F42A",
-"`     c #F5F42B",
-" .    c #F8F42B",
-"..    c #FAF42C",
-"+.    c #FCF42C",
-"@.    c #FFF42D",
-"#.    c #FFF22C",
-"$.    c #FFF12B",
-"%.    c #FFF02A",
-"&.    c #FFEF2A",
-"*.    c #FFEE29",
-"=.    c #FFED28",
-"-.    c #FFEC28",
-";.    c #FFEB27",
-">.    c #FFE926",
-",.    c #FFE826",
-"'.    c #FFE725",
-").    c #FFE624",
-"!.    c #FFE524",
-"~.    c #FFE423",
-"{.    c #FFE322",
-"].    c #FFE222",
-"^.    c #FFE021",
-"/.    c #FFDF20",
-"(.    c #FFDE20",
-"_.    c #FFDD1F",
-":.    c #FFDC1E",
-"<.    c #FFDB1E",
-"[.    c #FFDA1D",
-"}.    c #FFD91C",
-"|.    c #FFD71B",
-"1.    c #FFD61B",
-"2.    c #FFD51A",
-"3.    c #FFD419",
-"4.    c #FFD319",
-"5.    c #FFD218",
-"6.    c #FFD117",
-"7.    c #FFD017",
-"8.    c #FFCF16",
-"9.    c #FFCD15",
-"0.    c #FFCC15",
-"a.    c #FFCB14",
-"b.    c #FFCA13",
-"c.    c #FFC913",
-"d.    c #FFC812",
-"e.    c #FFC711",
-"f.    c #FFC611",
-"g.    c #FFC410",
-"h.    c #FFC30F",
-"i.    c #FFC20F",
-"j.    c #FFC10E",
-"k.    c #FFC00D",
-"l.    c #FFBF0C",
-"m.    c #FFBE0C",
-"n.    c #FFBD0B",
-"o.    c #FFBB0A",
-"p.    c #FFBA0A",
-"q.    c #FFB909",
-"r.    c #FFB808",
-"s.    c #FFB708",
-"t.    c #FFB607",
-"u.    c #FFB506",
-"v.    c #FFB406",
-"w.    c #FFB205",
-"x.    c #FFB104",
-"y.    c #FFB004",
-"z.    c #FFAF03",
-"A.    c #FFAE02",
-"B.    c #FFAD02",
-"C.    c #FFAC01",
-"D.    c #FFAB00",
-"E.    c #FFA900",
-"F.    c #F11F00",
-"G.    c #F21E00",
-"H.    c #F21C00",
-"I.    c #F31B00",
-"J.    c #F31A00",
-"K.    c #F41800",
-"L.    c #F41700",
-"M.    c #F51600",
-"N.    c #F61400",
-"O.    c #F61300",
-"P.    c #F71100",
-"Q.    c #F71000",
-"R.    c #F80F00",
-"S.    c #F90D00",
-"T.    c #F90C00",
-"U.    c #FA0B00",
-"V.    c #FA0900",
-"W.    c #FB0800",
-"X.    c #FC0600",
-"Y.    c #FC0500",
-"Z.    c #FD0400",
-"`.    c #FD0200",
-" +    c #FE0100",
-".+    c #FE0000",
-"++    c #FF0000",
-". + @ # $ % & * = - ; > , ' ) ! ~ { ] ^ / ( _ : < [ } | 1 2 3 4 5 6 7 8 9 0 a b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z `  ...+.@.@.#.$.%.&.*.=.-.;.>.,.'.).!.~.{.].^./.(._.:.<.[.}.|.1.2.3.4.5.6.7.8.9.0.a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.q.r.s.t.u.v.w.x.y.z.A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.`. +.+",
-". + @ # $ % & * = - ; > , ' ) ! ~ { ] ^ / ( _ : < [ } | 1 2 3 4 5 6 7 8 9 0 a b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z `  ...+.@.@.#.$.%.&.*.=.-.;.>.,.'.).!.~.{.].^./.(._.:.<.[.}.|.1.2.3.4.5.6.7.8.9.0.a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.q.r.s.t.u.v.w.x.y.z.A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.`. +.+",
-". + @ # $ % & * = - ; > , ' ) ! ~ { ] ^ / ( _ : < [ } | 1 2 3 4 5 6 7 8 9 0 a b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z `  ...+.@.@.#.$.%.&.*.=.-.;.>.,.'.).!.~.{.].^./.(._.:.<.[.}.|.1.2.3.4.5.6.7.8.9.0.a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.q.r.s.t.u.v.w.x.y.z.A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.`. +++",
-". + @ # $ % & * = - ; > , ' ) ! ~ { ] ^ / ( _ : < [ } | 1 2 3 4 5 6 7 8 9 0 a b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z `  ...+.@.@.#.$.%.&.*.=.-.;.>.,.'.).!.~.{.].^./.(._.:.<.[.}.|.1.2.3.4.5.6.7.8.9.0.a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.q.r.s.t.u.v.w.x.y.z.A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.`. +++",
-". + @ # $ % & * = - ; > , ' ) ! ~ { ] ^ / ( _ : < [ } | 1 2 3 4 5 6 7 8 9 0 a b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z `  ...+.@.@.#.$.%.&.*.=.-.;.>.,.'.).!.~.{.].^./.(._.:.<.[.}.|.1.2.3.4.5.6.7.8.9.0.a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.q.r.s.t.u.v.w.x.y.z.A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.`. +++"};
-
-/* XPM */
-static const gchar * v_meter_strip_xpm[] = {
-"5 250 230 2",
-"      c None",
-".     c #FE0000",
-"+     c #FF0000",
-"@     c #FE0100",
-"#     c #FD0200",
-"$     c #FD0300",
-"%     c #FD0400",
-"&     c #FC0500",
-"*     c #FC0600",
-"=     c #FC0700",
-"-     c #FB0800",
-";     c #FA0900",
-">     c #FA0A00",
-",     c #FA0B00",
-"'     c #F90C00",
-")     c #F90D00",
-"!     c #F80E00",
-"~     c #F80F00",
-"{     c #F71000",
-"]     c #F71100",
-"^     c #F61200",
-"/     c #F61300",
-"(     c #F61400",
-"_     c #F51600",
-":     c #F41700",
-"<     c #F41800",
-"[     c #F31A00",
-"}     c #F31B00",
-"|     c #F21C00",
-"1     c #F21E00",
-"2     c #F11F00",
-"3     c #F54A00",
-"4     c #FFA900",
-"5     c #FFAB00",
-"6     c #FFAC01",
-"7     c #FFAD02",
-"8     c #FFAE02",
-"9     c #FFAF03",
-"0     c #FFB004",
-"a     c #FFB104",
-"b     c #FFB205",
-"c     c #FFB406",
-"d     c #FFB506",
-"e     c #FFB607",
-"f     c #FFB708",
-"g     c #FFB808",
-"h     c #FFB909",
-"i     c #FFBA0A",
-"j     c #FFBB0A",
-"k     c #FFBC0A",
-"l     c #FFBD0B",
-"m     c #FFBE0C",
-"n     c #FFBF0C",
-"o     c #FFC00D",
-"p     c #FFC10E",
-"q     c #FFC20F",
-"r     c #FFC30F",
-"s     c #FFC410",
-"t     c #FFC511",
-"u     c #FFC611",
-"v     c #FFC711",
-"w     c #FFC812",
-"x     c #FFC913",
-"y     c #FFCA13",
-"z     c #FFCB14",
-"A     c #FFCC15",
-"B     c #FFCD15",
-"C     c #FFCF16",
-"D     c #FFD017",
-"E     c #FFD117",
-"F     c #FFD218",
-"G     c #FFD319",
-"H     c #FFD419",
-"I     c #FFD51A",
-"J     c #FFD61B",
-"K     c #FFD71B",
-"L     c #FFD81C",
-"M     c #FFD91C",
-"N     c #FFDA1D",
-"O     c #FFDB1E",
-"P     c #FFDC1E",
-"Q     c #FFDD1F",
-"R     c #FFDE20",
-"S     c #FFDF20",
-"T     c #FFE021",
-"U     c #FFE222",
-"V     c #FFE322",
-"W     c #FFE423",
-"X     c #FFE524",
-"Y     c #FFE624",
-"Z     c #FFE725",
-"`     c #FFE826",
-" .    c #FFE926",
-"..    c #FFEA26",
-"+.    c #FFEB27",
-"@.    c #FFEC28",
-"#.    c #FFED28",
-"$.    c #FFEE29",
-"%.    c #FFEF2A",
-"&.    c #FFF02A",
-"*.    c #FFF12B",
-"=.    c #FFF22C",
-"-.    c #FFF32D",
-";.    c #FFF42D",
-">.    c #FDF42C",
-",.    c #FBF42C",
-"'.    c #FAF42C",
-").    c #F8F42B",
-"!.    c #F6F42B",
-"~.    c #F4F42B",
-"{.    c #F3F42A",
-"].    c #F1F42A",
-"^.    c #F0F429",
-"/.    c #EEF429",
-"(.    c #ECF429",
-"_.    c #EAF528",
-":.    c #E9F528",
-"<.    c #E7F528",
-"[.    c #E5F527",
-"}.    c #E3F527",
-"|.    c #E2F526",
-"1.    c #E0F526",
-"2.    c #DFF526",
-"3.    c #DDF525",
-"4.    c #DBF525",
-"5.    c #D9F525",
-"6.    c #D8F524",
-"7.    c #D6F624",
-"8.    c #D5F624",
-"9.    c #D3F624",
-"0.    c #D1F623",
-"a.    c #CFF623",
-"b.    c #CEF622",
-"c.    c #CCF622",
-"d.    c #CBF622",
-"e.    c #C9F621",
-"f.    c #C7F621",
-"g.    c #C5F621",
-"h.    c #C4F720",
-"i.    c #C2F720",
-"j.    c #C0F71F",
-"k.    c #BEF71F",
-"l.    c #BDF71F",
-"m.    c #BBF71E",
-"n.    c #BAF71E",
-"o.    c #B8F71E",
-"p.    c #B6F71D",
-"q.    c #B5F71D",
-"r.    c #B3F71D",
-"s.    c #B2F71C",
-"t.    c #B0F81C",
-"u.    c #AEF81B",
-"v.    c #ACF81B",
-"w.    c #ABF81B",
-"x.    c #A9F81A",
-"y.    c #A8F81A",
-"z.    c #A6F81A",
-"A.    c #A4F81A",
-"B.    c #A2F819",
-"C.    c #A1F819",
-"D.    c #9FF819",
-"E.    c #9EF818",
-"F.    c #9BF918",
-"G.    c #9AF917",
-"H.    c #98F917",
-"I.    c #97F917",
-"J.    c #95F916",
-"K.    c #93F916",
-"L.    c #91F916",
-"M.    c #90F915",
-"N.    c #8EF915",
-"O.    c #8DF914",
-"P.    c #8BF914",
-"Q.    c #89FA14",
-"R.    c #87FA13",
-"S.    c #86FA13",
-"T.    c #84FA13",
-"U.    c #83FA12",
-"V.    c #81FA12",
-"W.    c #7FFA12",
-"X.    c #7DFA12",
-"Y.    c #7CFA11",
-"Z.    c #7AFA11",
-"`.    c #78FA10",
-" +    c #76FA10",
-".+    c #75FB10",
-"++    c #73FB0F",
-"@+    c #72FB0F",
-"#+    c #70FB0F",
-"$+    c #6EFB0E",
-"%+    c #6DFB0E",
-"&+    c #6BFB0E",
-"*+    c #6AFB0D",
-"=+    c #68FB0D",
-"-+    c #66FB0C",
-";+    c #64FB0C",
-">+    c #63FB0C",
-",+    c #61FC0B",
-"'+    c #60FC0B",
-")+    c #5EFC0B",
-"!+    c #5CFC0A",
-"~+    c #5AFC0A",
-"{+    c #59FC09",
-"]+    c #57FC09",
-"^+    c #56FC09",
-"/+    c #53FC09",
-"(+    c #52FC08",
-"_+    c #50FC08",
-":+    c #4FFD08",
-"<+    c #4DFD07",
-"[+    c #4BFD07",
-"}+    c #49FD07",
-"|+    c #48FD06",
-"1+    c #46FD06",
-"2+    c #45FD05",
-"3+    c #43FD05",
-"4+    c #41FD05",
-"5+    c #3FFD04",
-"6+    c #3EFD04",
-"7+    c #3CFD04",
-"8+    c #3BFE03",
-"9+    c #39FE03",
-"0+    c #37FE02",
-"a+    c #35FE02",
-"b+    c #34FE02",
-"c+    c #32FE01",
-"d+    c #30FE01",
-"e+    c #2EFE01",
-"f+    c #2DFE00",
-"g+    c #2BFE00",
-". . + + + ",
-". . + + + ",
-"@ @ @ @ @ ",
-"# # # # # ",
-"$ $ $ $ $ ",
-"% % % % % ",
-"& & & & & ",
-"* * * * * ",
-"= = = = = ",
-"- - - - - ",
-"; ; ; ; ; ",
-"> > > > > ",
-", , , , , ",
-"' ' ' ' ' ",
-") ) ) ) ) ",
-"! ! ! ! ! ",
-"~ ~ ~ ~ ~ ",
-"{ { { { { ",
-"] ] ] ] ] ",
-"^ ^ ^ ^ ^ ",
-"/ / / / / ",
-"( ( ( ( ( ",
-"_ _ _ _ _ ",
-": : : : : ",
-": : : : : ",
-"< < < < < ",
-"[ [ [ [ [ ",
-"} } } } } ",
-"} } } } } ",
-"| | | | | ",
-"1 1 1 1 1 ",
-"2 2 2 2 2 ",
-"3 3 3 3 3 ",
-"4 4 4 4 4 ",
-"5 5 5 5 5 ",
-"6 6 6 6 6 ",
-"6 6 6 6 6 ",
-"7 7 7 7 7 ",
-"8 8 8 8 8 ",
-"9 9 9 9 9 ",
-"9 9 9 9 9 ",
-"0 0 0 0 0 ",
-"a a a a a ",
-"a a a a a ",
-"b b b b b ",
-"c c c c c ",
-"d d d d d ",
-"d d d d d ",
-"e e e e e ",
-"f f f f f ",
-"g g g g g ",
-"g g g g g ",
-"h h h h h ",
-"i i i i i ",
-"j j j j j ",
-"k k k k k ",
-"l l l l l ",
-"m m m m m ",
-"n n n n n ",
-"n n n n n ",
-"o o o o o ",
-"p p p p p ",
-"q q q q q ",
-"q q q q q ",
-"r r r r r ",
-"s s s s s ",
-"t t t t t ",
-"u u u u u ",
-"v v v v v ",
-"w w w w w ",
-"x x x x x ",
-"x x x x x ",
-"y y y y y ",
-"z z z z z ",
-"A A A A A ",
-"A A A A A ",
-"B B B B B ",
-"C C C C C ",
-"D D D D D ",
-"D D D D D ",
-"E E E E E ",
-"F F F F F ",
-"G G G G G ",
-"G G G G G ",
-"H H H H H ",
-"I I I I I ",
-"I I I I I ",
-"J J J J J ",
-"K K K K K ",
-"L L L L L ",
-"M M M M M ",
-"N N N N N ",
-"O O O O O ",
-"P P P P P ",
-"P P P P P ",
-"Q Q Q Q Q ",
-"R R R R R ",
-"S S S S S ",
-"S S S S S ",
-"T T T T T ",
-"U U U U U ",
-"V V V V V ",
-"V V V V V ",
-"W W W W W ",
-"X X X X X ",
-"Y Y Y Y Y ",
-"Y Y Y Y Y ",
-"Z Z Z Z Z ",
-"` ` ` ` ` ",
-" . . . . .",
-"..........",
-"+.+.+.+.+.",
-"@.@.@.@.@.",
-"#.#.#.#.#.",
-"#.#.#.#.#.",
-"$.$.$.$.$.",
-"%.%.%.%.%.",
-"&.&.&.&.&.",
-"&.&.&.&.&.",
-"*.*.*.*.*.",
-"=.=.=.=.=.",
-"-.-.-.-.-.",
-";.;.;.;.;.",
-";.;.;.;.;.",
-">.>.>.>.>.",
-",.,.,.,.,.",
-"'.'.'.'.'.",
-").).).).).",
-"!.!.!.!.!.",
-"~.~.~.~.~.",
-"{.{.{.{.{.",
-"].].].].].",
-"^.^.^.^.^.",
-"/././././.",
-"(.(.(.(.(.",
-"_._._._._.",
-":.:.:.:.:.",
-"<.<.<.<.<.",
-"[.[.[.[.[.",
-"}.}.}.}.}.",
-"|.|.|.|.|.",
-"1.1.1.1.1.",
-"2.2.2.2.2.",
-"3.3.3.3.3.",
-"4.4.4.4.4.",
-"5.5.5.5.5.",
-"6.6.6.6.6.",
-"7.7.7.7.7.",
-"8.8.8.8.8.",
-"9.9.9.9.9.",
-"0.0.0.0.0.",
-"a.a.a.a.a.",
-"b.b.b.b.b.",
-"c.c.c.c.c.",
-"d.d.d.d.d.",
-"e.e.e.e.e.",
-"f.f.f.f.f.",
-"g.g.g.g.g.",
-"h.h.h.h.h.",
-"i.i.i.i.i.",
-"j.j.j.j.j.",
-"k.k.k.k.k.",
-"l.l.l.l.l.",
-"m.m.m.m.m.",
-"n.n.n.n.n.",
-"o.o.o.o.o.",
-"p.p.p.p.p.",
-"q.q.q.q.q.",
-"r.r.r.r.r.",
-"s.s.s.s.s.",
-"t.t.t.t.t.",
-"u.u.u.u.u.",
-"v.v.v.v.v.",
-"w.w.w.w.w.",
-"x.x.x.x.x.",
-"y.y.y.y.y.",
-"z.z.z.z.z.",
-"A.A.A.A.A.",
-"B.B.B.B.B.",
-"C.C.C.C.C.",
-"D.D.D.D.D.",
-"E.E.E.E.E.",
-"F.F.F.F.F.",
-"G.G.G.G.G.",
-"H.H.H.H.H.",
-"I.I.I.I.I.",
-"J.J.J.J.J.",
-"K.K.K.K.K.",
-"L.L.L.L.L.",
-"M.M.M.M.M.",
-"N.N.N.N.N.",
-"O.O.O.O.O.",
-"P.P.P.P.P.",
-"Q.Q.Q.Q.Q.",
-"R.R.R.R.R.",
-"S.S.S.S.S.",
-"T.T.T.T.T.",
-"U.U.U.U.U.",
-"V.V.V.V.V.",
-"W.W.W.W.W.",
-"X.X.X.X.X.",
-"Y.Y.Y.Y.Y.",
-"Z.Z.Z.Z.Z.",
-"`.`.`.`.`.",
-" + + + + +",
-".+.+.+.+.+",
-"++++++++++",
-"@+@+@+@+@+",
-"#+#+#+#+#+",
-"$+$+$+$+$+",
-"%+%+%+%+%+",
-"&+&+&+&+&+",
-"*+*+*+*+*+",
-"=+=+=+=+=+",
-"-+-+-+-+-+",
-";+;+;+;+;+",
-">+>+>+>+>+",
-",+,+,+,+,+",
-"'+'+'+'+'+",
-")+)+)+)+)+",
-"!+!+!+!+!+",
-"~+~+~+~+~+",
-"{+{+{+{+{+",
-"]+]+]+]+]+",
-"^+^+^+^+^+",
-"/+/+/+/+/+",
-"(+(+(+(+(+",
-"_+_+_+_+_+",
-":+:+:+:+:+",
-"<+<+<+<+<+",
-"[+[+[+[+[+",
-"}+}+}+}+}+",
-"|+|+|+|+|+",
-"1+1+1+1+1+",
-"2+2+2+2+2+",
-"3+3+3+3+3+",
-"4+4+4+4+4+",
-"5+5+5+5+5+",
-"6+6+6+6+6+",
-"7+7+7+7+7+",
-"8+8+8+8+8+",
-"9+9+9+9+9+",
-"0+0+0+0+0+",
-"a+a+a+a+a+",
-"b+b+b+b+b+",
-"c+c+c+c+c+",
-"d+d+d+d+d+",
-"e+e+e+e+e+",
-"f+f+f+f+f+",
-"g+g+g+g+g+"};
-
-static const char* channel_setup_names[] = {
-       "mono",
-       "stereo",
-       "3 channels",
-       "4 channels",
-       "5 channels",
-       "8 channels",
-       "manual setup",
-       0
-};
-
-vector<string> channel_combo_strings;
-
 ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], string rcfile)
 
        : Gtkmm2ext::UI ("ardour", argcp, argvp, rcfile),
-
+         
          primary_clock (X_("TransportClockDisplay"), true, false, true),
          secondary_clock (X_("SecondaryClockDisplay"), true, false, true),
          preroll_clock (X_("PreRollClock"), true, true),
@@ -804,38 +112,44 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], string rcfile)
 
          /* transport */
 
+         time_master_button (_("time\nmaster")),
+
          shuttle_units_button (_("% ")),
-         shuttle_style_button (_("spring")),
-         
+
          punch_in_button (_("punch\nin")),
          punch_out_button (_("punch\nout")),
          auto_return_button (_("auto\nreturn")),
          auto_play_button (_("auto\nplay")),
          auto_input_button (_("auto\ninput")),
          click_button (_("click")),
-         follow_button (_("follow\nPH")),
          auditioning_alert_button (_("AUDITIONING")),
          solo_alert_button (_("SOLO")),
-
-         session_selector (1, 0),
-
          shown_flag (false)
 
 {
        using namespace Gtk::Menu_Helpers;
 
        Gtkmm2ext::init();
-
-       /* actually, its already loaded, but ... */
-
-       cerr << "Loading UI configuration file " << rcfile << endl;
-
+       
        about = 0;
 
        if (theArdourUI == 0) {
                theArdourUI = this;
        }
 
+       ActionManager::init ();
+
+       /* load colors */
+
+       color_manager = new ColorManager();
+
+       std::string color_file = ARDOUR::find_config_file("ardour.colors");
+       
+       color_manager->load (color_file);
+
+       m_new_session_dialog = 0;
+       m_new_session_dialog_ref = NewSessionDialogFactory::create();
+       m_new_session_dialog_ref->get_widget_derived (NewSessionDialogFactory::top_level_widget_name(), m_new_session_dialog);
        editor = 0;
        mixer = 0;
        session = 0;
@@ -846,67 +160,59 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], string rcfile)
        connection_editor = 0;
        add_route_dialog = 0;
        route_params = 0;
-       meter_bridge = 0;
        option_editor = 0;
        location_ui = 0;
-       sfdb_window = 0;
-       new_session_window = 0;
+       sfdb = 0;
        open_session_selector = 0;
        have_configure_timeout = false;
        have_disk_overrun_displayed = false;
        have_disk_underrun_displayed = false;
        _will_create_new_session_automatically = false;
        session_loaded = false;
+       last_speed_displayed = -1.0f;
 
        last_configure_time.tv_sec = 0;
        last_configure_time.tv_usec = 0;
 
        shuttle_grabbed = false;
        shuttle_fract = 0.0;
+       shuttle_max_speed = 8.0f;
 
        set_shuttle_units (Percentage);
        set_shuttle_behaviour (Sprung);
 
-       shuttle_unit_menu.items().push_back (MenuElem (_("Percentage"), bind (slot (*this, &ARDOUR_UI::set_shuttle_units),
-                                                                     Percentage)));
-       shuttle_unit_menu.items().push_back (MenuElem (_("Semitones"), bind (slot (*this, &ARDOUR_UI::set_shuttle_units),
-                                                                     Semitones)));
-
-       shuttle_style_menu.items().push_back (MenuElem (_("Sprung"), bind (slot (*this, &ARDOUR_UI::set_shuttle_behaviour),
-                                                                  Sprung)));
-       shuttle_style_menu.items().push_back (MenuElem (_("Wheel"), bind (slot (*this, &ARDOUR_UI::set_shuttle_behaviour),
-                                                                 Wheel)));
+       shuttle_style_menu = 0;
+       shuttle_unit_menu = 0;
 
        gettimeofday (&last_peak_grab, 0);
        gettimeofday (&last_shuttle_request, 0);
 
-       ARDOUR::DiskStream::CannotRecordNoInput.connect (slot (*this, &ARDOUR_UI::cannot_record_no_input));
-       ARDOUR::DiskStream::DeleteSources.connect (slot (*this, &ARDOUR_UI::delete_sources_in_the_right_thread));
-       ARDOUR::DiskStream::DiskOverrun.connect (slot (*this, &ARDOUR_UI::disk_overrun_handler));
-       ARDOUR::DiskStream::DiskUnderrun.connect (slot (*this, &ARDOUR_UI::disk_underrun_handler));
+       ARDOUR::DiskStream::CannotRecordNoInput.connect (mem_fun(*this, &ARDOUR_UI::cannot_record_no_input));
+       ARDOUR::DiskStream::DeleteSources.connect (mem_fun(*this, &ARDOUR_UI::delete_sources_in_the_right_thread));
+       ARDOUR::DiskStream::DiskOverrun.connect (mem_fun(*this, &ARDOUR_UI::disk_overrun_handler));
+       ARDOUR::DiskStream::DiskUnderrun.connect (mem_fun(*this, &ARDOUR_UI::disk_underrun_handler));
 
        /* handle pending state with a dialog */
 
-       ARDOUR::Session::AskAboutPendingState.connect (slot (*this, &ARDOUR_UI::pending_state_dialog));
+       ARDOUR::Session::AskAboutPendingState.connect (mem_fun(*this, &ARDOUR_UI::pending_state_dialog));
 
-       channel_combo_strings = internationalize (channel_setup_names);
-       
        /* have to wait for AudioEngine and Configuration before proceeding */
 }
 
 void
 ARDOUR_UI::cannot_record_no_input (DiskStream* ds)
 {
-       ENSURE_GUI_THREAD (bind (slot (*this, &ARDOUR_UI::cannot_record_no_input), ds));
+       ENSURE_GUI_THREAD (bind (mem_fun(*this, &ARDOUR_UI::cannot_record_no_input), ds));
        
-       string msg = compose (_("\
+       string msg = string_compose (_("\
 You cannot record-enable\n\
 track %1\n\
 because it has no input connections.\n\
 You would be wasting space recording silence."),
                              ds->name());
 
-       ArdourMessage message (editor, X_("cannotrecord"), msg);
+       MessageDialog message (*editor, msg);
+       message.run ();
 }
 
 void
@@ -914,25 +220,49 @@ ARDOUR_UI::set_engine (AudioEngine& e)
 {
        engine = &e;
 
-       engine->Stopped.connect (slot (*this, &ARDOUR_UI::engine_stopped));
-       engine->Running.connect (slot (*this, &ARDOUR_UI::engine_running));
-       engine->Halted.connect (slot (*this, &ARDOUR_UI::engine_halted));
-       engine->SampleRateChanged.connect (slot (*this, &ARDOUR_UI::update_sample_rate));
+       engine->Stopped.connect (mem_fun(*this, &ARDOUR_UI::engine_stopped));
+       engine->Running.connect (mem_fun(*this, &ARDOUR_UI::engine_running));
+       engine->Halted.connect (mem_fun(*this, &ARDOUR_UI::engine_halted));
+       engine->SampleRateChanged.connect (mem_fun(*this, &ARDOUR_UI::update_sample_rate));
 
        _tooltips.enable();
 
        keyboard = new Keyboard;
-       install_keybindings ();
 
-       FastMeter::set_vertical_xpm (v_meter_strip_xpm);
-       FastMeter::set_horizontal_xpm (h_meter_strip_xpm);
+       string meter_path;
+
+       meter_path = ARDOUR::find_data_file("v_meter_strip.xpm", "pixmaps");
+       if (meter_path.empty()) {
+               error << _("no vertical meter strip image found") << endmsg;
+               exit (1);
+       }
+       FastMeter::set_vertical_xpm (meter_path);
+
+       meter_path = ARDOUR::find_data_file("h_meter_strip.xpm", "pixmaps");
+       if (meter_path.empty()) {
+               error << _("no horizontal meter strip image found") << endmsg;
+               exit (1);
+       }
+       FastMeter::set_horizontal_xpm (meter_path);
 
        if (setup_windows ()) {
                throw failed_constructor ();
        }
 
        if (GTK_ARDOUR::show_key_actions) {
-               KeyboardTarget::show_all_actions ();
+               vector<string> names;
+               vector<string> paths;
+               vector<string> keys;
+               vector<AccelKey> bindings;
+
+               ActionManager::get_all_actions (names, paths, keys, bindings);
+
+               vector<string>::iterator n;
+               vector<string>::iterator k;
+               for (n = names.begin(), k = keys.begin(); n != names.end(); ++n, ++k) {
+                       cerr << "Action: " << (*n) << " bound to " << (*k) << endl;
+               }
+
                exit (0);
        }
 
@@ -941,6 +271,10 @@ ARDOUR_UI::set_engine (AudioEngine& e)
        
        blink_timeout_tag = -1;
 
+       /* the global configuration object is now valid */
+
+       use_config ();
+
        /* this being a GUI and all, we want peakfiles */
 
        FileSource::set_build_peakfiles (true);
@@ -953,14 +287,14 @@ ARDOUR_UI::set_engine (AudioEngine& e)
        /* start the time-of-day-clock */
        
        update_wall_clock ();
-       Main::timeout.connect (slot (*this, &ARDOUR_UI::update_wall_clock), 60000);
+       Glib::signal_timeout().connect (mem_fun(*this, &ARDOUR_UI::update_wall_clock), 60000);
 
        update_disk_space ();
        update_cpu_load ();
        update_sample_rate (engine->frame_rate());
 
-       starting.connect (slot (*this, &ARDOUR_UI::startup));
-       stopping.connect (slot (*this, &ARDOUR_UI::shutdown));
+       starting.connect (mem_fun(*this, &ARDOUR_UI::startup));
+       stopping.connect (mem_fun(*this, &ARDOUR_UI::shutdown));
 }
 
 ARDOUR_UI::~ARDOUR_UI ()
@@ -1018,8 +352,7 @@ ARDOUR_UI::configure_handler (GdkEventConfigure* conf)
        if (have_configure_timeout) {
                gettimeofday (&last_configure_time, 0);
        } else {
-               TimeoutSig t;
-               t.connect (slot (*this, &ARDOUR_UI::configure_timeout), 100);
+               Glib::signal_timeout().connect (mem_fun(*this, &ARDOUR_UI::configure_timeout), 100);
                have_configure_timeout = true;
        }
                
@@ -1048,9 +381,13 @@ ARDOUR_UI::save_ardour_state ()
                session->add_instant_xml(enode, session->path());
                session->add_instant_xml(mnode, session->path());
        } else {
-               Config->add_instant_xml(enode, Config->get_user_ardour_path());
-               Config->add_instant_xml(mnode, Config->get_user_ardour_path());
+               Config->add_instant_xml(enode, get_user_ardour_path());
+               Config->add_instant_xml(mnode, get_user_ardour_path());
        }
+
+       /* keybindings */
+
+       AccelMap::save ("ardour.saved_bindings");
 }
 
 void
@@ -1063,7 +400,7 @@ ARDOUR_UI::startup ()
           with the scheduling of the audio thread.
        */
 
-       Gtk::Main::idle.connect (slot (*this, &ARDOUR_UI::start_engine));
+       Glib::signal_idle().connect (mem_fun(*this, &ARDOUR_UI::start_engine));
 }
 
 void
@@ -1078,11 +415,12 @@ ARDOUR_UI::finish()
                        /* use the default name */
                        if (save_state_canfail ("")) {
                                /* failed - don't quit */
-                               ArdourMessage (editor, X_("badsave dialog"),
+                               MessageDialog msg (*editor, 
                                               _("\
 Ardour was unable to save your session.\n\n\
 If you still wish to quit, please use the\n\n\
 \"Just quit\" option."));
+                               msg.run ();
                                return;
                        }
                        break;
@@ -1091,30 +429,22 @@ If you still wish to quit, please use the\n\n\
                }
        }
 
-       quit();
+       quit ();
 }
 
 int
-ARDOUR_UI::ask_about_saving_session (string what)
+ARDOUR_UI::ask_about_saving_session (const string & what)
 {
-       ArdourDialog window ("saving dialog");
-       Gtk::VBox   packer;
+       ArdourDialog window (_("ardour: save session?"));
        Gtk::Label  prompt_label;
-       Gtk::HBox   button_packer;
-
        string msg;
 
-       msg = compose(_("Save and %1"), what);
-       
-       Gtk::Button save_button (msg);
-       save_button.set_name ("EditorGTKButton");
-
-       msg = compose(_("Just %1"), what);
-
-       Gtk::Button nosave_button (msg);
-       nosave_button.set_name ("EditorGTKButton");
-
-       msg = compose(_("Don't %1"), what);
+       msg = string_compose(_("Save and %1"), what);
+       window.add_button (msg, RESPONSE_ACCEPT);
+       msg = string_compose(_("Just %1"), what);
+       window.add_button (msg, RESPONSE_APPLY);
+       msg = string_compose(_("Don't %1"), what);
+       window.add_button (msg, RESPONSE_REJECT);
 
        Gtk::Button noquit_button (msg);
        noquit_button.set_name ("EditorGTKButton");
@@ -1127,45 +457,38 @@ ARDOUR_UI::ask_about_saving_session (string what)
        } else {
                type = _("snapshot");
        }
-       prompt = compose(_("The %1\n\"%2\"\nhas not been saved.\n\nAny changes made this time\nwill be lost unless you save it.\n\nWhat do you want to do?"), 
+       prompt = string_compose(_("The %1\n\"%2\"\nhas not been saved.\n\nAny changes made this time\nwill be lost unless you save it.\n\nWhat do you want to do?"), 
                         type, session->snap_name());
        
        prompt_label.set_text (prompt);
        prompt_label.set_alignment (0.5, 0.5);
        prompt_label.set_name (X_("PrompterLabel"));
-
-       save_button.signal_clicked().connect (bind(slot(window,&ArdourDialog::stop), 1));
-       nosave_button.signal_clicked().connect (bind(slot(window,&ArdourDialog::stop), 0));
-       noquit_button.signal_clicked().connect (bind(slot(window,&ArdourDialog::stop), -1));
-
-       button_packer.set_spacing (10);
-       button_packer.pack_start (save_button);
-       button_packer.pack_start (nosave_button);
-       button_packer.pack_start (noquit_button);
        
-       packer.set_spacing (10);
-       packer.set_border_width (10);
-       packer.pack_start (prompt_label);
-       packer.pack_start (button_packer);
+       window.get_vbox()->pack_start (prompt_label);
 
        window.set_name (_("Prompter"));
-       window.set_title (_("ardour: save session?"));
        window.set_position (Gtk::WIN_POS_MOUSE);
        window.set_modal (true);
-       window.add (packer);
        window.show_all ();
 
-       window.realize();
-       window.get_window().set_decorations (GdkWMDecoration (GDK_DECOR_BORDER|GDK_DECOR_RESIZEH));
-       window.set_keyboard_input (true);
-
        save_the_session = 0;
 
        editor->ensure_float (window);
 
-       window.run ();
+       ResponseType r = (ResponseType) window.run();
 
-       return window.run_status();
+       window.hide ();
+
+       switch (r) {
+       case RESPONSE_ACCEPT: // save and get out of here
+               return 1;
+       case RESPONSE_APPLY:  // get out of here
+               return 0;
+       default:
+               break;
+       }
+
+       return -1;
 }
        
 gint
@@ -1212,7 +535,7 @@ ARDOUR_UI::update_sample_rate (jack_nframes_t ignored)
 {
        char buf[32];
 
-       ENSURE_GUI_THREAD (bind (slot (*this, &ARDOUR_UI::update_sample_rate), ignored));
+       ENSURE_GUI_THREAD (bind (mem_fun(*this, &ARDOUR_UI::update_sample_rate), ignored));
 
        if (!engine->connected()) {
 
@@ -1342,218 +665,6 @@ ARDOUR_UI::update_wall_clock ()
 
        return TRUE;
 }
-
-void
-ARDOUR_UI::toggle_recording_plugins ()
-{
-       /* XXX use toggle_some_session_state */
-
-       if (session == 0) {
-               return;
-       }
-
-       session->set_recording_plugins (!session->get_recording_plugins());
-}
-       
-void
-ARDOUR_UI::toggle_auto_play ()
-
-{
-       toggle_some_session_state (auto_play_button,
-                                  &Session::get_auto_play,
-                                  &Session::set_auto_play);
-}
-
-void
-ARDOUR_UI::toggle_auto_return ()
-
-{
-       toggle_some_session_state (auto_return_button,
-                                  &Session::get_auto_return,
-                                  &Session::set_auto_return);
-}
-
-void
-ARDOUR_UI::toggle_click ()
-{
-       toggle_some_session_state (click_button,
-                                  &Session::get_clicking,
-                                  &Session::set_clicking);
-}
-
-void
-ARDOUR_UI::follow_changed ()
-{
-       bool x;
-
-       if (!editor) {
-               return;
-       }
-
-       if (follow_button.get_active() != (x = editor->follow_playhead())) {
-               follow_button.set_active (x);
-       }
-}
-
-void
-ARDOUR_UI::toggle_follow ()
-{
-       bool x;
-
-       if (!editor) {
-               return;
-       }
-
-       if (editor->follow_playhead() != (x = follow_button.get_active())) {
-               editor->set_follow_playhead (x);
-       }
-}
-
-void
-ARDOUR_UI::toggle_session_auto_loop ()
-{
-       if (session) {
-               if (session->get_auto_loop()) {
-                       if (session->transport_rolling()) {
-                               transport_roll();
-                       }
-                       else {
-                               session->request_auto_loop (false);
-                       }
-               }
-               else {
-                       session->request_auto_loop (true);
-               }
-       }
-}
-
-void
-ARDOUR_UI::toggle_session_punch_in ()
-{
-       if (session) {
-               session->set_punch_in (!session->get_punch_in());
-       }
-}
-
-void
-ARDOUR_UI::toggle_punch_out ()
-{
-       toggle_some_session_state (punch_out_button,
-                                  &Session::get_punch_out,
-                                  &Session::set_punch_out);
-}
-
-void
-ARDOUR_UI::toggle_punch_in ()
-{
-       toggle_some_session_state (punch_in_button,
-                                  &Session::get_punch_in,
-                                  &Session::set_punch_in);
-}
-
-void
-ARDOUR_UI::map_button_state ()
-
-{
-       map_some_session_state (auto_return_button,
-                               &Session::get_auto_return);
-       map_some_session_state (auto_play_button,
-                               &Session::get_auto_play);
-       map_some_session_state (auto_input_button,
-                               &Session::get_auto_input);
-       map_some_session_state (punch_in_button,
-                               &Session::get_punch_in);
-       map_some_session_state (punch_out_button,
-                               &Session::get_punch_out);
-       map_some_session_state (click_button,
-                               &Session::get_clicking);
-}
-
-void
-ARDOUR_UI::queue_map_control_change (Session::ControlType t)
-{
-       ENSURE_GUI_THREAD (bind (slot (*this, &ARDOUR_UI::map_control_change), t));
-}
-
-void
-ARDOUR_UI::map_control_change (Session::ControlType t)
-{
-       switch (t) {
-       case Session::AutoPlay:
-               map_some_session_state (auto_play_button, &Session::get_auto_play);
-               break;
-
-       case Session::AutoLoop:
-               break;
-
-       case Session::AutoReturn:
-               map_some_session_state (auto_return_button, &Session::get_auto_return);
-               break;
-
-       case Session::AutoInput:
-               map_some_session_state (auto_input_button, &Session::get_auto_input);
-               break;
-
-       case Session::PunchOut:
-               map_some_session_state (punch_in_button, &Session::get_punch_out);
-               break;
-
-       case Session::PunchIn:
-               map_some_session_state (punch_in_button, &Session::get_punch_in);
-               break;
-
-       case Session::Clicking:
-               map_some_session_state (click_button, &Session::get_clicking);
-               break;
-
-       case Session::SlaveType:
-//             map_some_session_state (mtc_slave_button, &Session::get_mtc_slave);
-               break;
-
-       case Session::SendMTC:
-//             map_some_session_state (send_mtc_button, &Session::get_send_mtc);
-               break;
-
-       case Session::SendMMC:
-//             map_some_session_state (send_mmc_button, &Session::get_send_mmc);
-               break;
-
-       case Session::MMCControl:       
-//             map_some_session_state (mmc_control_button, &Session::get_mmc_control);
-               break;
-
-       case Session::MidiFeedback:       
-//             map_some_session_state (mmc_control_button, &Session::get_mmc_control);
-               break;
-       case Session::MidiControl:       
-//             map_some_session_state (mmc_control_button, &Session::get_mmc_control);
-               break;
-               
-       case Session::Live:
-               break;
-
-       case Session::RecordingPlugins:
-               break;
-
-       case Session::CrossFadesActive:
-               break;
-               
-       case Session::EditingMode:
-               break;
-
-       case Session::PlayRange:
-               break;
-
-       case Session::AlignChoice:
-               /* don't care, this is handled by the options editor */
-               break;
-       case Session::SeamlessLoop:
-               /* don't care, this is handled by the options editor */
-               break;
-              
-       }
-}
-
 void
 ARDOUR_UI::control_methods_adjusted ()
 
@@ -1589,100 +700,45 @@ ARDOUR_UI::mmc_device_id_adjusted ()
 #endif
 }
 
-void
-ARDOUR_UI::map_some_session_state (ToggleButton& button,
-                                  bool (Session::*get)() const)
-       
-{
-       bool x;
-
-       if (session == 0) {
-               return;
-       }
-       
-       if (button.get_active() != (x = (session->*get)())) {
-               button.set_active (x);
-       }
-}
-
-void
-ARDOUR_UI::toggle_some_session_state (ToggleButton& button,
-                                     bool (Session::*get)() const,
-                                     void (Session::*set)(bool))
-
-{
-       bool button_state;
-       bool session_state;
-
-       if (session == 0) {
-               return;
-       }
-
-       button_state = button.get_active ();
-       session_state = (session->*get)();
-
-       if (button_state != session_state) {
-               (session->*set) (button_state);
-#if 0
-       
-               /* check that it worked, and reverse
-                  the button state if it didn't
-               */
-
-               if ((session->*get)() != button_state) {
-                       button->set_active (!button_state);
-               }
-#endif
-
-       }
-}      
-
 gint
 ARDOUR_UI::session_menu (GdkEventButton *ev)
 {
-       session_popup_menu->popup (0, 0, 0, 0);
+       session_popup_menu->popup (0, 0);
        return TRUE;
 }
 
 void
 ARDOUR_UI::redisplay_recent_sessions ()
 {
-       using namespace Gtkmm2ext;
-       using namespace Gtk::CTree_Helpers;
-
        vector<string *> *sessions;
        vector<string *>::iterator i;
        RecentSessionsSorter cmp;
-
-       /* ---------------------------------------- */
-       /* XXX MAKE ME A FUNCTION (no CTree::clear() in gtkmm 1.2) */
-
-       gtk_ctree_remove_node (session_selector.gobj(), NULL);
-       /* ---------------------------------------- */
-
+       
+       recent_session_display.set_model (Glib::RefPtr<TreeModel>(0));
+       recent_session_model->clear ();
 
        RecentSessions rs;
        ARDOUR::read_recent_sessions (rs);
 
        if (rs.empty()) {
-               session_selector.thaw();
+               recent_session_display.set_model (recent_session_model);
                return;
        }
+
        /* sort them alphabetically */
-       sort(rs.begin(), rs.end(), cmp);
+       sort (rs.begin(), rs.end(), cmp);
        sessions = new vector<string*>;
+
        for (RecentSessions::iterator i = rs.begin(); i != rs.end(); ++i) {
                sessions->push_back (new string ((*i).second));
        }
 
-       session_selector.freeze();
-
        for (i = sessions->begin(); i != sessions->end(); ++i) {
 
                vector<string*>* states;
                vector<const gchar*> item;
                string fullpath = *(*i);
-
+               
                /* remove any trailing / */
 
                if (fullpath[fullpath.length()-1] == '/') {
@@ -1691,49 +747,27 @@ ARDOUR_UI::redisplay_recent_sessions ()
 
                /* now get available states for this session */
 
-               if ((states = Session::possible_states(fullpath)) == 0) {
+               if ((states = Session::possible_states (fullpath)) == 0) {
                        /* no state file? */
                        continue;
                }
 
-               /* OK, try to add entries for this session */
+               TreeModel::Row row = *(recent_session_model->append());
 
+               row[recent_session_columns.visible_name] = PBD::basename (fullpath);
+               row[recent_session_columns.fullpath] = fullpath;
 
-               /* add the parent */
+               if (states->size() > 1) {
 
-               item.clear ();
-               string basen = PBD::basename (fullpath);
-               item.push_back (basen.c_str());
-               session_selector.rows().push_back (Element (item));
-
-               session_selector.rows().back().set_data (new string (fullpath), deferred_delete<string>);
-
-               if (states->size() == 1) {
-
-                       /* only 1 state, show it at the top level */
-
-                       session_selector.rows().back().set_leaf (true);
-
-               } else {
-
-                       session_selector.rows().back().set_leaf (false);
-
-                       vector<string *>::iterator i2;
-                       
                        /* add the children */
                        
-                       for (i2 = states->begin(); i2 != states->end(); ++i2) {
-                               
-                               string statename = *(*i2);
-                               
-                               item.clear ();
-                               item.push_back (statename.c_str());
-                               
-                               session_selector.rows().back().subtree().push_back (Element (item));
-                               session_selector.rows().back().subtree().back().set_data (new string (statename),
-                                                                                         deferred_delete<string>);
-                               session_selector.rows().back().subtree().back().set_leaf (true);
+                       for (vector<string*>::iterator i2 = states->begin(); i2 != states->end(); ++i2) {
                                
+                               TreeModel::Row child_row = *(recent_session_model->append (row.children()));
+
+                               child_row[recent_session_columns.visible_name] = **i2;
+                               child_row[recent_session_columns.fullpath] = fullpath;
+
                                delete *i2;
                        }
                }
@@ -1741,98 +775,102 @@ ARDOUR_UI::redisplay_recent_sessions ()
                delete states;
        }
 
-       session_selector.thaw();
+       recent_session_display.set_model (recent_session_model);
        delete sessions;
 }
 
 void
-ARDOUR_UI::session_selection (Gtk::CTree_Helpers::Row row, gint column)
+ARDOUR_UI::build_session_selector ()
 {
-       using namespace Gtk::CTree_Helpers;
+       session_selector_window = new ArdourDialog ("session selector");
+       
+       Gtk::ScrolledWindow *scroller = manage (new Gtk::ScrolledWindow);
+       
+       session_selector_window->add_button (Stock::CANCEL, RESPONSE_CANCEL);
+       session_selector_window->add_button (Stock::OK, RESPONSE_ACCEPT);
 
-       string session_name;
-       string session_path;
-       string session_state;
+       recent_session_model = TreeStore::create (recent_session_columns);
+       recent_session_display.set_model (recent_session_model);
+       recent_session_display.append_column (_("Recent Sessions"), recent_session_columns.visible_name);
+       recent_session_display.set_headers_visible (false);
+       recent_session_display.get_selection()->set_mode (SELECTION_SINGLE);
 
-       if (!row.is_leaf()) {
-               row.expand();
-               return;
-       }
+       recent_session_display.signal_row_activated().connect (mem_fun (*this, &ARDOUR_UI::recent_session_row_activated));
 
-       string *stp = static_cast<string *> (row.get_data());
+       scroller->add (recent_session_display);
+       scroller->set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC);
 
-       if ((*stp)[0] != '/' && (*stp)[0] != '.') {
-               
-               /* its a state file node, so get the parent for the session information,
-                  and combine with the state file name.
-               */
-               
-               string *spp = static_cast<string *> (row.get_parent().get_data());
-               
-               session_name = *spp;
-               session_path = *spp;
-               session_state = *stp;
-               
-       } else {
-               
-               /* its a session directory node, so just get the session path,
-                  and use "default" to load the state.
-               */
-               
-               string *spp = static_cast<string *> (row.get_data());
-               
-               session_name = *spp;
-               session_path = *spp;
-               session_state = PBD::basename (*spp);
-       }
+       session_selector_window->set_name ("SessionSelectorWindow");
+       session_selector_window->set_size_request (200, 400);
+       session_selector_window->get_vbox()->pack_start (*scroller);
+       session_selector_window->show_all_children();
+}
 
-       session_selector_window->hide ();
-       _session_is_new = false;
-       load_session (session_path, session_state);
+void
+ARDOUR_UI::recent_session_row_activated (const TreePath& path, TreeViewColumn* col)
+{
+       session_selector_window->response (RESPONSE_ACCEPT);
 }
 
 void
-ARDOUR_UI::build_session_selector ()
+ARDOUR_UI::open_recent_session ()
 {
-       session_selector_window = new ArdourDialog ("session selector");
-       
-       Gtk::VBox *vpacker = new Gtk::VBox;
-       Gtk::ScrolledWindow *scroller = new Gtk::ScrolledWindow;
-       Gtk::HBox *button_packer = new Gtk::HBox;
-       Gtk::Button *cancel_button = new Gtk::Button (_("cancel"));
-       Gtk::Button *rescan_button = new Gtk::Button (_("rescan"));
+       /* popup selector window */
 
-       button_packer->pack_start (*rescan_button);
-       button_packer->pack_start (*cancel_button);
+       if (session_selector_window == 0) {
+               build_session_selector ();
+       }
 
-       vpacker->pack_start (*scroller);
-       vpacker->pack_start (*button_packer, false, false);
+       redisplay_recent_sessions ();
 
-       scroller->add (session_selector);
-       scroller->set_policy(Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC);
+       ResponseType r = (ResponseType) session_selector_window->run ();
 
-       session_selector_window->add (*vpacker);
-       session_selector_window->set_name ("SessionSelectorWindow");
-       session_selector_window->set_size_request (200, 400);
+       session_selector_window->hide();
 
-       session_selector_window->delete_event.connect (bind (slot (just_hide_it), static_cast<Gtk::Window*>(session_selector_window)));
-       cancel_button-.signal_clicked().connect (bind (slot (*this, &ARDOUR_UI::hide_dialog), session_selector_window));
-       session_selector.tree_select_row.connect (slot (*this, &ARDOUR_UI::session_selection));
-}
+       switch (r) {
+       case RESPONSE_ACCEPT:
+               break;
+       default:
+               return;
+       }
 
-void
-ARDOUR_UI::fs_cancel_clicked (Gtk::FileSelection* fs)
-{
-       fs->hide_all();
-       fs->get_selection_entry()->set_text("");
-       allow_focus (false);
+       Gtk::TreeModel::iterator i = recent_session_display.get_selection()->get_selected();
+
+       if (i == recent_session_model->children().end()) {
+               return;
+       }
+       
+       Glib::ustring path = (*i)[recent_session_columns.fullpath];
+       Glib::ustring state = (*i)[recent_session_columns.visible_name];
+
+       _session_is_new = false;
+
+       load_session (path, state);
 }
 
-gint 
-ARDOUR_UI::fs_delete_event (GdkEventAny* ev, Gtk::FileSelection* fs)
+bool
+ARDOUR_UI::filter_ardour_session_dirs (const FileFilter::Info& info) 
 {
-       fs_cancel_clicked (fs);
-       return 1;
+       struct stat statbuf;
+
+       if (stat (info.filename.c_str(), &statbuf) != 0) {
+               return false;
+       }
+
+       if (!S_ISDIR(statbuf.st_mode)) {
+               return false;
+       }
+
+       string session_file = info.filename;
+       session_file += '/';
+       session_file += PBD::basename (info.filename);
+       session_file += ".ardour";
+       
+       if (stat (session_file.c_str(), &statbuf) != 0) {
+               return false;
+       }
+
+       return S_ISREG (statbuf.st_mode);
 }
 
 void
@@ -1841,22 +879,32 @@ ARDOUR_UI::open_session ()
        /* popup selector window */
 
        if (open_session_selector == 0) {
-               open_session_selector = new Gtk::FileSelection(_("open session"));
-               open_session_selector->get_ok_button()-.signal_clicked().connect (slot (*this, &ARDOUR_UI::open_ok_clicked));
-               open_session_selector->get_cancel_button()-.signal_clicked().connect (bind (slot (*this, &ARDOUR_UI::fs_cancel_clicked), open_session_selector));
-               open_session_selector->delete_event.connect (bind (slot (*this, &ARDOUR_UI::fs_delete_event), open_session_selector));
-       }
 
-       open_session_selector->show_all ();
-       allow_focus (true);
+               /* ardour sessions are folders */
 
-       /* wait for selection */
-}
+               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);
 
-void
-ARDOUR_UI::open_ok_clicked ()
-{
-       open_session_selector->hide_all();
+               FileFilter session_filter;
+               session_filter.add_pattern ("*.ardour");
+               session_filter.set_name (_("Ardour sessions"));
+               open_session_selector->add_filter (session_filter);
+               open_session_selector->set_filter (session_filter);
+       }
+
+       int response = open_session_selector->run();
+       open_session_selector->hide ();
+
+       switch (response) {
+       case RESPONSE_ACCEPT:
+               break;
+       default:
+               open_session_selector->hide();
+               return;
+       }
+
+       open_session_selector->hide();
        string session_path = open_session_selector->get_filename();
        string path, name;
        bool isnew;
@@ -1867,31 +915,8 @@ ARDOUR_UI::open_ok_clicked ()
                        load_session (path, name);
                }
        }
-
-       open_session_selector->get_selection_entry()->set_text("");
-       
-       /* XXX hack hack hack */
-
-       GtkCList* clist = (GtkCList*) open_session_selector->gobj()->file_list;
-       gtk_clist_unselect_all (clist);
-
-       allow_focus(false);
 }
 
-void
-ARDOUR_UI::open_recent_session ()
-{
-       /* popup selector window */
-
-       if (session_selector_window == 0) {
-               build_session_selector ();
-       }
-
-       redisplay_recent_sessions ();
-       session_selector_window->show_all ();
-
-       /* wait for selection */
-}
 
 void
 ARDOUR_UI::session_add_midi_track ()
@@ -1900,7 +925,7 @@ ARDOUR_UI::session_add_midi_track ()
 }
 
 void
-ARDOUR_UI::session_add_audio_route (bool disk, int32_t input_channels, int32_t output_channels)
+ARDOUR_UI::session_add_audio_route (bool disk, int32_t input_channels, int32_t output_channels, ARDOUR::TrackMode mode)
 {
        Route* route;
 
@@ -1911,7 +936,7 @@ ARDOUR_UI::session_add_audio_route (bool disk, int32_t input_channels, int32_t o
 
        try { 
                if (disk) {
-                       if ((route = session->new_audio_track (input_channels, output_channels)) == 0) {
+                       if ((route = session->new_audio_track (input_channels, output_channels, mode)) == 0) {
                                error << _("could not create new audio track") << endmsg;
                        }
                } else {
@@ -1934,18 +959,18 @@ ARDOUR_UI::session_add_audio_route (bool disk, int32_t input_channels, int32_t o
        }
 
        catch (...) {
-               ArdourMessage msg (editor, X_("noport dialog"),
+               MessageDialog msg (*editor, 
                                   _("There are insufficient JACK ports available\n\
 to create a new track or bus.\n\
 You should save Ardour, exit and\n\
 restart JACK with more ports."));
+               msg.run ();
        }
 }
 
 void
 ARDOUR_UI::diskstream_added (DiskStream* ds)
 {
-       // meter_bridge_dialog_check->set_sensitive (true);
 }
 
 void
@@ -1970,7 +995,7 @@ void
 ARDOUR_UI::transport_goto_start ()
 {
        if (session) {
-               session->request_locate (0);
+               session->goto_start();
 
                
                /* force displayed area in editor to start no matter
@@ -1978,54 +1003,43 @@ ARDOUR_UI::transport_goto_start ()
                */
                
                if (editor) {
-                       editor->reposition_x_origin (0);
+                       editor->reposition_x_origin (session->current_start_frame());
                }
        }
 }
 
 void
-ARDOUR_UI::transport_goto_end ()
+ARDOUR_UI::transport_goto_zero ()
 {
        if (session) {
-               jack_nframes_t frame = session->current_end_frame();
-               session->request_locate (frame);
+               session->request_locate (0);
 
+               
                /* force displayed area in editor to start no matter
                   what "follow playhead" setting is.
                */
                
                if (editor) {
-                       editor->reposition_x_origin (frame);
+                       editor->reposition_x_origin (0);
                }
        }
 }
 
-gint 
-ARDOUR_UI::mouse_transport_stop (GdkEventButton *ev)
+void
+ARDOUR_UI::transport_goto_end ()
 {
-
-
        if (session) {
-                       if (session->transport_stopped()) {
-                       session->request_locate (session->last_transport_start());
-               } else {
-                       if (session->get_auto_loop()) {
-                               session->request_auto_loop (false);
-                       }
+               jack_nframes_t frame = session->current_end_frame();
+               session->request_locate (frame);
 
-                       Keyboard::ModifierMask mask = Keyboard::ModifierMask (Keyboard::Control|Keyboard::Shift);
-                       session->request_stop (Keyboard::modifier_state_equals (ev->state, mask));
-                       }
+               /* force displayed area in editor to start no matter
+                  what "follow playhead" setting is.
+               */
+               
+               if (editor) {
+                       editor->reposition_x_origin (frame);
+               }
        }
-
-       return TRUE;
-}
-
-gint
-ARDOUR_UI::mouse_transport_roll (GdkEventButton* ev)
-{
-       transport_roll ();
-       return TRUE;
 }
 
 void
@@ -2071,14 +1085,15 @@ ARDOUR_UI::transport_record ()
                case Session::Disabled:
                        if (session->ntracks() == 0) {
                                string txt = _("Please create 1 or more track\nbefore trying to record.\nCheck the Session menu.");
-                               ArdourMessage msg (editor, X_("cannotrecenable"), txt);
+                               MessageDialog msg (*editor, txt);
+                               msg.run ();
                                return;
                        }
                        session->maybe_enable_record ();
                        break;
                case Session::Recording:
                case Session::Enabled:
-                       session->disable_record ();
+                       session->disable_record (true);
                }
        }
 }
@@ -2226,7 +1241,7 @@ ARDOUR_UI::toggle_record_enable (guint32 dstream)
 void
 ARDOUR_UI::queue_transport_change ()
 {
-       Gtkmm2ext::UI::instance()->call_slot (slot (*this, &ARDOUR_UI::map_transport_state));
+       Gtkmm2ext::UI::instance()->call_slot (mem_fun(*this, &ARDOUR_UI::map_transport_state));
 }
 
 void
@@ -2245,14 +1260,6 @@ ARDOUR_UI::map_transport_state ()
        }
 }
 
-void
-ARDOUR_UI::send_all_midi_feedback ()
-{
-       if (session) {
-               session->send_all_midi_feedback();
-       }
-}
-
 void
 ARDOUR_UI::allow_local_only ()
 {
@@ -2281,41 +1288,37 @@ ARDOUR_UI::GlobalClickBox::printer (char buf[32], Adjustment &adj, void *arg)
 void
 ARDOUR_UI::engine_stopped ()
 {
-       ENSURE_GUI_THREAD (slot (*this, &ARDOUR_UI::engine_stopped));
-
-       jack_disconnect_item->set_sensitive (false);
-       jack_reconnect_item->set_sensitive (true);
-       jack_bufsize_menu->set_sensitive (false);
+       ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::engine_stopped));
+       ActionManager::set_sensitive (ActionManager::jack_sensitive_actions, false);
+       ActionManager::set_sensitive (ActionManager::jack_opposite_sensitive_actions, true);
 }
 
 
 void
 ARDOUR_UI::engine_running ()
 {
-       ENSURE_GUI_THREAD (slot (*this, &ARDOUR_UI::engine_running));
-
-       jack_disconnect_item->set_sensitive (true);
-       jack_reconnect_item->set_sensitive (false);
-       jack_bufsize_menu->set_sensitive (true);
+       ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::engine_running));
+       ActionManager::set_sensitive (ActionManager::jack_sensitive_actions, true);
+       ActionManager::set_sensitive (ActionManager::jack_opposite_sensitive_actions, false);
 }
 
 void
 ARDOUR_UI::engine_halted ()
 {
-       ENSURE_GUI_THREAD (slot (*this, &ARDOUR_UI::engine_halted));
+       ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::engine_halted));
 
-       jack_disconnect_item->set_sensitive (false);
-       jack_reconnect_item->set_sensitive (true);
-       jack_bufsize_menu->set_sensitive (false);
+       ActionManager::set_sensitive (ActionManager::jack_sensitive_actions, false);
+       ActionManager::set_sensitive (ActionManager::jack_opposite_sensitive_actions, true);
 
        update_sample_rate (0);
 
-       ArdourMessage msg (editor, X_("halted"),
+       MessageDialog msg (*editor, 
                           _("\
 JACK has either been shutdown or it\n\
 disconnected Ardour because Ardour\n\
 was not fast enough. You can save the\n\
 session and/or try to reconnect to JACK ."));
+       msg.run ();
 }
 
 int32_t
@@ -2361,7 +1364,7 @@ ARDOUR_UI::start_engine ()
                   solution, its what we have.
                */
 
-               Main::timeout.connect (slot (*this, &ARDOUR_UI::make_session_clean), 1000);
+               Glib::signal_timeout().connect (mem_fun(*this, &ARDOUR_UI::make_session_clean), 1000);
        }
 
        return FALSE;
@@ -2376,7 +1379,7 @@ ARDOUR_UI::update_clocks ()
 void
 ARDOUR_UI::start_clocking ()
 {
-       clock_signal_connection = RapidScreenUpdate.connect (slot (*this, &ARDOUR_UI::update_clocks));
+       clock_signal_connection = RapidScreenUpdate.connect (mem_fun(*this, &ARDOUR_UI::update_clocks));
 }
 
 void
@@ -2445,7 +1448,7 @@ ARDOUR_UI::add_diskstream_to_menu (DiskStream& dstream)
        }
 
        MenuList& items = diskstream_menu->items();
-       items.push_back (MenuElem (dstream.name(), bind (slot (*this, &ARDOUR_UI::diskstream_selected), (gint32) dstream.id())));
+       items.push_back (MenuElem (dstream.name(), bind (mem_fun(*this, &ARDOUR_UI::diskstream_selected), (gint32) dstream.id())));
 }
        
 void
@@ -2471,7 +1474,7 @@ ARDOUR_UI::select_diskstream (GdkEventButton *ev)
        using namespace Menu_Helpers;
 
        MenuList& items = diskstream_menu->items();
-       items.push_back (MenuElem (_("No Stream"), (bind (slot (*this, &ARDOUR_UI::diskstream_selected), -1))));
+       items.push_back (MenuElem (_("No Stream"), (bind (mem_fun(*this, &ARDOUR_UI::diskstream_selected), -1))));
 
        session->foreach_diskstream (this, &ARDOUR_UI::add_diskstream_to_menu);
 
@@ -2539,6 +1542,7 @@ void
 ARDOUR_UI::snapshot_session ()
 {
        ArdourPrompter prompter (true);
+       string snapname;
        string now;
        time_t n;
 
@@ -2549,23 +1553,22 @@ ARDOUR_UI::snapshot_session ()
        prompter.set_name ("Prompter");
        prompter.set_prompt (_("Name for snapshot"));
        prompter.set_initial_text (now);
-       prompter.done.connect (Gtk::Main::quit.slot());
-       prompter.show_all ();
-
-       Gtk::Main::run ();
-
-       if (prompter.status == Gtkmm2ext::Prompter::entered) {
-               string snapname;
-               
+       
+       switch (prompter.run()) {
+       case RESPONSE_ACCEPT:
                prompter.get_result (snapname);
                if (snapname.length()){
                        save_state (snapname);
                }
+               break;
+
+       default:
+               break;
        }
 }
 
 void
-ARDOUR_UI::save_state (string name)
+ARDOUR_UI::save_state (const string & name)
 {
        (void) save_state_canfail (name);
 }
@@ -2599,14 +1602,6 @@ ARDOUR_UI::restore_state (string name)
        }
 }
 
-void
-ARDOUR_UI::allow_focus (bool yn)
-{
-       if (keyboard) {
-               keyboard->allow_focus (yn);
-       }
-}
-
 void
 ARDOUR_UI::primary_clock_value_changed ()
 {
@@ -2635,21 +1630,21 @@ ARDOUR_UI::rec_enable_button_blink (bool onoff, DiskStream *dstream, Widget *w)
                switch (rs) {
                case Session::Disabled:
                case Session::Enabled:
-                       if (w->get_state() != GTK_STATE_SELECTED) {
-                               w->set_state (GTK_STATE_SELECTED);
+                       if (w->get_state() != STATE_SELECTED) {
+                               w->set_state (STATE_SELECTED);
                        }
                        break;
 
                case Session::Recording:
-                       if (w->get_state() != GTK_STATE_ACTIVE) {
-                               w->set_state (GTK_STATE_ACTIVE);
+                       if (w->get_state() != STATE_ACTIVE) {
+                               w->set_state (STATE_ACTIVE);
                        }
                        break;
                }
 
        } else {
-               if (w->get_state() != Gtk::STATE_NORMAL) {
-                       w->set_state (Gtk::STATE_NORMAL);
+               if (w->get_state() != STATE_NORMAL) {
+                       w->set_state (STATE_NORMAL);
                }
        }
 }
@@ -2664,37 +1659,22 @@ ARDOUR_UI::transport_rec_enable_blink (bool onoff)
        switch (session->record_status()) {
        case Session::Enabled:
                if (onoff) {
-                       rec_button.set_state (GTK_STATE_ACTIVE);
+                       rec_button.set_state (1);
                } else {
-                       rec_button.set_state (Gtk::STATE_NORMAL);
+                       rec_button.set_state (0);
                }
                break;
 
        case Session::Recording:
-               rec_button.set_state (GTK_STATE_ACTIVE);
+               rec_button.set_state (2);
                break;
 
        default:
-               rec_button.set_active (false);
-               rec_button.set_state (Gtk::STATE_NORMAL);
+               rec_button.set_state (0);
                break;
        }
 }
 
-gint
-ARDOUR_UI::generic_focus_in_event (GdkEventFocus *ev)
-{
-       ARDOUR_UI::instance()->allow_focus (true);
-       return FALSE;
-}
-
-gint
-ARDOUR_UI::generic_focus_out_event (GdkEventFocus *ev)
-{
-       ARDOUR_UI::instance()->allow_focus (false);
-       return FALSE;
-}
-
 gint
 ARDOUR_UI::hide_and_quit (GdkEventAny *ev, ArdourDialog *window)
 {
@@ -2714,108 +1694,113 @@ ARDOUR_UI::save_template ()
 
 {
        ArdourPrompter prompter (true);
-       prompter.set_name ("Prompter");
+       string name;
+
+       prompter.set_name (X_("Prompter"));
        prompter.set_prompt (_("Name for mix template:"));
        prompter.set_initial_text(session->name() + _("-template"));
-
-       prompter.done.connect(Gtk::Main::quit.slot());
-       prompter.show_all();
-       
-       Gtk::Main::run();
        
-       if (prompter.status == Gtkmm2ext::Prompter::entered) {
-               string name;
-
+       switch (prompter.run()) {
+       case RESPONSE_ACCEPT:
                prompter.get_result (name);
-
+               
                if (name.length()) {
                        session->save_template (name);
                }
+               break;
+
+       default:
+               break;
        }
 }
 
 void
-ARDOUR_UI::new_session (bool startup, string predetermined_path)
+ARDOUR_UI::new_session (bool startup, std::string predetermined_path)
 {
-       if (new_session_window == 0){
-               new_session_window = new NewSessionDialog (*engine, startup, predetermined_path);
-               editor->ensure_float (*new_session_window);
-       }
-
-       new_session_window->run ();
+       m_new_session_dialog->show_all();
+       m_new_session_dialog->set_transient_for(*editor);
+       m_new_session_dialog->set_name(predetermined_path);
 
-       /* write favorites either way */
-       Session::FavoriteDirs favs;
-       new_session_window->file_selector.get_favorites (favs);
-       Session::write_favorite_dirs (favs);
+       int response = Gtk::RESPONSE_CANCEL;
 
-       if (new_session_window->run_status()) {
-               return;
-       }
-
-       string session_path = new_session_window->file_selector.get_path ();
-       string session_name = PBD::basename (session_path);
-
-       // Check that it doesn't already exist.
-       access(session_path.c_str(), R_OK); 
-       if (errno != ENOENT){
-               error << compose(_("Session %1 already exists at %2"), session_name, session_path) << endmsg;
-               return;
-       }
-
-       _session_is_new = true;
-
-       if (session_path[session_path.length()-1] != '/') {
-
-               string template_name = new_session_window->get_template_name ();
-
-               if (template_name.length()) {
-
-                       load_session (session_path, session_name, &template_name);
-
-               } else {
-
-                       uint32_t cchns;
-                       uint32_t mchns;
-                       Session::AutoConnectOption iconnect;
-                       Session::AutoConnectOption oconnect;
-
-                       if (new_session_window->use_control_button.get_active()) {
-                               cchns = (uint32_t) channel_combo_get_channel_count (new_session_window->control_out_channel_combo);
-                       } else {
-                               cchns = 0;
-                       }
-                       if (new_session_window->use_master_button.get_active()) {
-                               mchns = (uint32_t) channel_combo_get_channel_count (new_session_window->master_out_channel_combo);
-                       } else {
-                               mchns = 0;
-                       }
-
-                       if (new_session_window->connect_to_physical_inputs_button.get_active()) {
-                               iconnect = Session::AutoConnectPhysical;
-                       } else {
-                               iconnect = Session::AutoConnectOption (0);
-                       }
+       do {
+               response = m_new_session_dialog->run ();
+       
+               if(response == Gtk::RESPONSE_OK) {
 
-                       if (new_session_window->connect_to_master_button.get_active ()) {
-                               oconnect = Session::AutoConnectMaster;
-                       } else if (new_session_window->connect_to_physical_outputs_button.get_active ()) {
-                               oconnect = Session::AutoConnectPhysical;
+                       _session_is_new = true;
+                       
+                       std::string session_name = m_new_session_dialog->session_name();
+                       std::string session_path = m_new_session_dialog->session_folder();
+                       
+                       /*
+                         XXX This is needed because session constructor wants a 
+                         non-existant path. hopefully this will be fixed at some point.
+                       */
+                       session_path = Glib::build_filename(session_path, session_name);
+                       
+                       std::string template_name = m_new_session_dialog->session_template_name();
+                       
+                       if (m_new_session_dialog->use_session_template()) {
+                               
+                               load_session (session_path, session_name, &template_name);
+                               
                        } else {
-                               oconnect = Session::AutoConnectOption (0);
-                       } 
-
-                       uint32_t nphysin = (uint32_t) new_session_window->in_count_adjustment.get_value();
-                       uint32_t nphysout = (uint32_t) new_session_window->out_count_adjustment.get_value();
-
-                       build_session (session_path, session_name, cchns, mchns, iconnect, oconnect, nphysin, nphysout, 
-                                      engine->frame_rate() * 60 * 5);
+                               
+                               uint32_t cchns;
+                               uint32_t mchns;
+                               Session::AutoConnectOption iconnect;
+                               Session::AutoConnectOption oconnect;
+                               
+                               if (m_new_session_dialog->create_control_bus()) {
+                                       cchns = (uint32_t) m_new_session_dialog->control_channel_count();
+                               } else {
+                                       cchns = 0;
+                               }
+                               
+                               if (m_new_session_dialog->create_master_bus()) {
+                                       mchns = (uint32_t) m_new_session_dialog->master_channel_count();
+                               } else {
+                                       mchns = 0;
+                               }
+                               
+                               if (m_new_session_dialog->connect_inputs()) {
+                                       iconnect = Session::AutoConnectPhysical;
+                               } else {
+                                       iconnect = Session::AutoConnectOption (0);
+                               }
+                               
+                               /// @todo some minor tweaks.
+
+                               if (m_new_session_dialog->connect_outs_to_master()) {
+                                       oconnect = Session::AutoConnectMaster;
+                               } else if (m_new_session_dialog->connect_outs_to_physical()) {
+                                       oconnect = Session::AutoConnectPhysical;
+                               } else {
+                                       oconnect = Session::AutoConnectOption (0);
+                               } 
+                               
+                               uint32_t nphysin = (uint32_t) m_new_session_dialog->input_limit_count();
+                               uint32_t nphysout = (uint32_t) m_new_session_dialog->output_limit_count();
+                               
+                               build_session (session_path,
+                                              session_name,
+                                              cchns,
+                                              mchns,
+                                              iconnect,
+                                              oconnect,
+                                              nphysin,
+                                              nphysout, 
+                                              engine->frame_rate() * 60 * 5);
+                       }               
                }
-       }
+
+       } while(response == Gtk::RESPONSE_HELP);
+       m_new_session_dialog->hide_all();
 }
 
 int
-ARDOUR_UI::load_session (string path, string snap_name, string* mix_template)
+ARDOUR_UI::load_session (const string & path, const string & snap_name, string* mix_template)
 {
        Session *new_session;
        int x;
@@ -2831,9 +1816,10 @@ ARDOUR_UI::load_session (string path, string snap_name, string* mix_template)
        /* if it already exists, we must have write access */
 
        if (::access (path.c_str(), F_OK) == 0 && ::access (path.c_str(), W_OK)) {
-               ArdourMessage msg (editor, X_("noaccess dialog"), _("\
+               MessageDialog msg (*editor, _("\
 You do not have write access to this session.\n\
 This prevents the session from being loaded."));
+               msg.run ();
                return -1;
        }
 
@@ -2843,7 +1829,7 @@ This prevents the session from being loaded."));
 
        catch (...) {
 
-               error << compose(_("Session \"%1 (snapshot %2)\" did not load successfully"), path, snap_name) << endmsg;
+               error << string_compose(_("Session \"%1 (snapshot %2)\" did not load successfully"), path, snap_name) << endmsg;
                return -1;
        }
 
@@ -2867,7 +1853,7 @@ ARDOUR_UI::make_session_clean ()
 }
 
 int
-ARDOUR_UI::build_session (string path, string snap_name, 
+ARDOUR_UI::build_session (const string & path, const string & snap_name, 
                          uint32_t control_channels,
                          uint32_t master_channels, 
                          Session::AutoConnectOption input_connect,
@@ -2896,7 +1882,7 @@ ARDOUR_UI::build_session (string path, string snap_name,
 
        catch (...) {
 
-               error << compose(_("Session \"%1 (snapshot %2)\" did not load successfully"), path, snap_name) << endmsg;
+               error << string_compose(_("Session \"%1 (snapshot %2)\" did not load successfully"), path, snap_name) << endmsg;
                return -1;
        }
 
@@ -2909,12 +1895,6 @@ ARDOUR_UI::build_session (string path, string snap_name,
        return 0;
 }
 
-void
-ARDOUR_UI::hide_dialog (ArdourDialog *dialog)
-{
-       dialog->hide_all();
-}
-
 void
 ARDOUR_UI::show ()
 {
@@ -2924,11 +1904,11 @@ ARDOUR_UI::show ()
        }
 
        if (session && mixer) {
-               mixer->show_window ();
+               // mixer->show_window ();
        }
        
        if (about) {
-               about->get_window().raise ();
+               about->present ();
        }
 }
 
@@ -2936,16 +1916,9 @@ void
 ARDOUR_UI::show_splash ()
 {
        if (about == 0) {
-               about = new About(this);
-               about->show_all();
-               about->show_sub (true);
-               about->get_window().raise ();
-       }
-       else {
-               about->get_window().set_decorations (GdkWMDecoration (GDK_DECOR_BORDER|GDK_DECOR_RESIZEH));
-               about->show_all ();
-               about->get_window().raise ();
+               about = new About();
        }
+       about->present();
 }
 
 void
@@ -2957,76 +1930,77 @@ ARDOUR_UI::hide_splash ()
 }
 
 void
-ARDOUR_UI::display_cleanup_results (Session::cleanup_report& rep, const gchar* list_title, string msg)
+ARDOUR_UI::display_cleanup_results (Session::cleanup_report& rep, const gchar* list_title, const string & msg)
 {
        size_t removed;
 
        removed = rep.paths.size();
 
        if (removed == 0) {
-               ArdourMessage msg (editor, X_("cleanupresults"),
+               MessageDialog msg (*editor, X_("cleanupresults"),
                                   _("\
 No audio files were ready for cleanup\n\n\
 If this seems suprising, check for any existing\n\
 snapshots. These may still include regions that\n\
 require some unused files to continue to exist."));
+               msg.run ();
                return;
        } 
 
-       ArdourDialog results ("cleanup results");
+       ArdourDialog results (_("ardour: cleanup"), true);
        
-       const gchar* list_titles[] = { 
-               list_title,
-               0
+       struct CleanupResultsModelColumns : public Gtk::TreeModel::ColumnRecord {
+           CleanupResultsModelColumns() { 
+                   add (visible_name);
+                   add (fullpath);
+           }
+           Gtk::TreeModelColumn<Glib::ustring> visible_name;
+           Gtk::TreeModelColumn<Glib::ustring> fullpath;
        };
+
+       
+       Glib::RefPtr<Gtk::ListStore> results_model;
+       CleanupResultsModelColumns results_columns;
+       Gtk::TreeView results_display;
        
-       Gtk::CList list (internationalize (list_titles));
+       results_model = ListStore::create (results_columns);
+       results_display.set_model (results_model);
+       results_display.append_column (list_title, results_columns.visible_name);
+       results_display.set_headers_visible (true);
+
        Gtk::ScrolledWindow list_scroller;
        Gtk::Label txt;
-       Gtk::Button ok_button (_("OK"));
-       Gtk::VBox vpacker;
-       const char* rowtext[1];
-       
-       list_scroller.set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC);
-       
-       vpacker.set_border_width (10);
-       vpacker.set_spacing (10);
 
        if (rep.space < 1048576.0f) {
                if (removed > 1) {
-                       txt.set_text (compose (msg, removed, _("files"), (float) rep.space / 1024.0f, "kilo"));
+                       txt.set_text (string_compose (msg, removed, _("files"), (float) rep.space / 1024.0f, "kilo"));
                } else {
-                       txt.set_text (compose (msg, removed, _("file"), (float) rep.space / 1024.0f, "kilo"));
+                       txt.set_text (string_compose (msg, removed, _("file"), (float) rep.space / 1024.0f, "kilo"));
                }
        } else {
                if (removed > 1) {
-                       txt.set_text (compose (msg, removed, _("files"), (float) rep.space / 1048576.0f, "mega"));
+                       txt.set_text (string_compose (msg, removed, _("files"), (float) rep.space / 1048576.0f, "mega"));
                } else {
-                       txt.set_text (compose (msg, removed, _("file"), (float) rep.space / 1048576.0f, "mega"));
+                       txt.set_text (string_compose (msg, removed, _("file"), (float) rep.space / 1048576.0f, "mega"));
                }
        }
 
-       vpacker.pack_start (txt, false, false);
+       results.get_vbox()->pack_start (txt, false, false);
        
        for (vector<string>::iterator i = rep.paths.begin(); i != rep.paths.end(); ++i) {
-               rowtext[0] = (*i).c_str();
-               list.rows().push_back (rowtext);
+               TreeModel::Row row = *(results_model->append());
+               row[results_columns.visible_name] = *i;
+               row[results_columns.fullpath] = *i;
        }
        
-       list_scroller.add_with_viewport (list);
+       list_scroller.add (results_display);
        list_scroller.set_size_request (-1, 250);
+       list_scroller.set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC);
        
-       vpacker.pack_start (list_scroller, true, true);
-       vpacker.pack_start (ok_button, false, false);
-       
-       ok_button.signal_clicked().connect (Main::quit.slot ());
-       results.Hiding.connect (Main::quit.slot ());
-       
-       results.add (vpacker);
-       
+       results.get_vbox()->pack_start (list_scroller, true, true);
+       results.add_button (Stock::OK, RESPONSE_ACCEPT);
        results.set_position (Gtk::WIN_POS_MOUSE);
-       results.set_title (_("ardour: cleanup"));
-       results.set_modal (true);
+
        results.run ();
 }
 
@@ -3038,41 +2012,24 @@ ARDOUR_UI::cleanup ()
                return;
        }
 
-       ArdourDialog checker (X_("cleanup confirm dialog"));
+       ArdourDialog checker (_("ardour cleanup"));
        Gtk::Label label (_("\
 Cleanup is a destructive operation.\n\
 ALL undo/redo information will be lost if you cleanup.\n\
 Unused audio files will be moved to a \"dead sounds\" location."));
-
-       Gtk::Button ok_button (_("Proceed with cleanup"));
-       Gtk::Button cancel_button (_("Cancel"));
-       Gtk::HBox   bbox;
-       Gtk::VBox   vbox;
-
-       bbox.set_border_width (6);
-       bbox.set_spacing (12);
-       bbox.pack_start (ok_button, true, false);
-       bbox.pack_start (cancel_button, true, false);
        
-       vbox.set_border_width (6);
-       vbox.set_spacing (12);
-       vbox.pack_start (label, false, false);
-       vbox.pack_start (bbox, false, false);
-       
-       checker.add (vbox);
+       checker.get_vbox()->pack_start (label, false, false);
+       checker.add_button (Stock::OK, RESPONSE_ACCEPT);
+       checker.add_button (Stock::CANCEL, RESPONSE_CANCEL);
+
        checker.set_name (_("CleanupDialog"));
-       checker.set_title (_("ardour cleanup"));
        checker.set_wmclass (_("ardour_cleanup"), "Ardour");
        checker.set_position (Gtk::WIN_POS_MOUSE);
-       checker.realize ();
-       checker.get_window().set_decorations (GdkWMDecoration (GDK_DECOR_BORDER|GDK_DECOR_RESIZEH));
-
-       ok_button.signal_clicked().connect (bind (slot (checker, &ArdourDialog::stop), 1));
-       cancel_button.signal_clicked().connect (bind (slot (checker, &ArdourDialog::stop), 0));
-
-       checker.run ();
 
-       if (checker.run_status() != 1) {
+       switch (checker.run()) {
+       case RESPONSE_ACCEPT:
+               break;
+       default:
                return;
        }
 
@@ -3132,10 +2089,16 @@ ARDOUR_UI::add_route ()
                return;
        }
 
-       add_route_dialog->run ();
+       ResponseType r = (ResponseType) add_route_dialog->run ();
+       
+       add_route_dialog->hide();
 
-       if (add_route_dialog->run_status()) {
+       switch (r) {
+       case RESPONSE_ACCEPT:
+               break;
+       default:
                return;
+               break;
        }
 
        if ((count = add_route_dialog->count()) <= 0) {
@@ -3159,7 +2122,7 @@ ARDOUR_UI::add_route ()
 
        while (count) {
                if (track) {
-                       session_add_audio_track (input_chan, output_chan);
+                       session_add_audio_track (input_chan, output_chan, add_route_dialog->mode());
                } else {
                        session_add_audio_bus (input_chan, output_chan);
                }
@@ -3179,7 +2142,7 @@ ARDOUR_UI::mixer_settings () const
        if (session) {
                node = session->instant_xml(X_("Mixer"), session->path());
        } else {
-               node = Config->instant_xml(X_("Mixer"), Config->get_user_ardour_path());
+               node = Config->instant_xml(X_("Mixer"), get_user_ardour_path());
        }
 
        if (!node) {
@@ -3197,7 +2160,7 @@ ARDOUR_UI::editor_settings () const
        if (session) {
                node = session->instant_xml(X_("Editor"), session->path());
        } else {
-               node = Config->instant_xml(X_("Editor"), Config->get_user_ardour_path());
+               node = Config->instant_xml(X_("Editor"), get_user_ardour_path());
        }
 
        if (!node) {
@@ -3222,16 +2185,17 @@ ARDOUR_UI::keyboard_settings () const
 void
 ARDOUR_UI::halt_on_xrun_message ()
 {
-       ENSURE_GUI_THREAD (slot (*this, &ARDOUR_UI::halt_on_xrun_message));
+       ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::halt_on_xrun_message));
 
-       ArdourMessage msg (editor, X_("haltonxrun"),
+       MessageDialog msg (*editor,
                           _("Recording was stopped because your system could not keep up."));
+       msg.run ();
 }
 
 void 
 ARDOUR_UI::delete_sources_in_the_right_thread (list<ARDOUR::Source*>* deletion_list)
 {
-       ENSURE_GUI_THREAD (bind (slot (*this, &ARDOUR_UI::delete_sources_in_the_right_thread), deletion_list));
+       ENSURE_GUI_THREAD (bind (mem_fun(*this, &ARDOUR_UI::delete_sources_in_the_right_thread), deletion_list));
 
        for (list<Source*>::iterator i = deletion_list->begin(); i != deletion_list->end(); ++i) {
                delete *i;
@@ -3243,16 +2207,17 @@ ARDOUR_UI::delete_sources_in_the_right_thread (list<ARDOUR::Source*>* deletion_l
 void
 ARDOUR_UI::disk_overrun_handler ()
 {
-       ENSURE_GUI_THREAD (slot (*this, &ARDOUR_UI::disk_underrun_handler));
+       ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::disk_underrun_handler));
 
        if (!have_disk_overrun_displayed) {
                have_disk_overrun_displayed = true;
-               ArdourMessage msg (editor, X_("diskrate dialog"), _("\
+               MessageDialog msg (*editor, X_("diskrate dialog"), _("\
 The disk system on your computer\n\
 was not able to keep up with Ardour.\n\
 \n\
 Specifically, it failed to write data to disk\n\
 quickly enough to keep up with recording.\n"));
+               msg.run ();
                have_disk_overrun_displayed = false;
        }
 }
@@ -3260,16 +2225,17 @@ quickly enough to keep up with recording.\n"));
 void
 ARDOUR_UI::disk_underrun_handler ()
 {
-       ENSURE_GUI_THREAD (slot (*this, &ARDOUR_UI::disk_underrun_handler));
+       ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::disk_underrun_handler));
 
        if (!have_disk_underrun_displayed) {
                have_disk_underrun_displayed = true;
-               ArdourMessage msg (editor, X_("diskrate2 dialog"),
+               MessageDialog msg (*editor,
                        (_("The disk system on your computer\n\
 was not able to keep up with Ardour.\n\
 \n\
 Specifically, it failed to read data from disk\n\
 quickly enough to keep up with playback.\n")));
+               msg.run ();
                have_disk_underrun_displayed = false;
        } 
 }
@@ -3290,8 +2256,6 @@ int
 ARDOUR_UI::pending_state_dialog ()
 {
        ArdourDialog dialog ("pending state dialog");
-       Button use_button (_("Recover from crash"));
-       Button cancel_button (_("Ignore crash data"));
        Label  message (_("\
 This session appears to have been in\n\
 middle of recording when ardour or\n\
@@ -3300,44 +2264,29 @@ the computer was shutdown.\n\
 Ardour can recover any captured audio for\n\
 you, or it can ignore it. Please decide\n\
 what you would like to do.\n"));
-       HBox hpacker;
-       VBox vpacker;
 
-       vpacker.set_border_width (12);
-       vpacker.set_spacing (7);
-       vpacker.pack_start (message);
-       vpacker.pack_start (hpacker);
-
-       hpacker.set_spacing (7);
-       hpacker.pack_start (use_button);
-       hpacker.pack_start (cancel_button);
-       
-       use_button.signal_clicked().connect (bind (slot (dialog, &ArdourDialog::stop), 0));
-       cancel_button.signal_clicked().connect (bind (slot (dialog, &ArdourDialog::stop), 1));
+       dialog.get_vbox()->pack_start (message);
+       dialog.add_button (_("Recover from crash"), RESPONSE_ACCEPT);
+       dialog.add_button (_("Ignore crash data"), RESPONSE_REJECT);
 
-       dialog.add (vpacker);
-       dialog.set_position (GTK_WIN_POS_CENTER);
+       dialog.set_position (WIN_POS_CENTER);
        dialog.show_all ();
-       dialog.realize();
-       dialog.get_window().set_decorations (GdkWMDecoration (GDK_DECOR_BORDER|GDK_DECOR_RESIZEH));
        
-       dialog.run ();
-
-       if (dialog.run_status () == 0) {
+       switch (dialog.run ()) {
+       case RESPONSE_ACCEPT:
                return 1;
+       default:
+               return 0;
        }
-
-       return 0;
 }
        
-       
 void
 ARDOUR_UI::disconnect_from_jack ()
 {
        if (engine) {
                if( engine->disconnect_from_jack ()) {
-                       ArdourMessage msg (editor, X_("nojack dialog"),
-                                          _("Could not disconnect from JACK"));
+                       MessageDialog msg (*editor, _("Could not disconnect from JACK"));
+                       msg.run ();
                }
 
                update_sample_rate (0);
@@ -3349,8 +2298,8 @@ ARDOUR_UI::reconnect_to_jack ()
 {
        if (engine) {
                if (engine->reconnect_to_jack ()) {
-                       ArdourMessage msg (editor, X_("nojack dialog"),
-                                          _("Could not reconnect to JACK"));
+                       MessageDialog msg (*editor,  _("Could not reconnect to JACK"));
+                       msg.run ();
                }
 
                update_sample_rate (0);
@@ -3383,3 +2332,106 @@ ARDOUR_UI::cmdline_new_session (string path)
        _will_create_new_session_automatically = false; /* done it */
        return FALSE; /* don't call it again */
 }
+
+void
+ARDOUR_UI::set_native_file_header_format (HeaderFormat hf)
+{
+       Glib::RefPtr<Action> act;
+       
+       switch (hf) {
+       case BWF:
+               act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatBWF"));
+               break;
+       case WAVE:
+               act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE"));
+               break;
+       case WAVE64:
+               act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE64"));
+               break;
+       case iXML:
+               act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatiXML"));
+               break;
+       case RF64:
+               act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatRF64"));
+               break;
+       }
+
+       if (act) {
+               Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
+               if (ract && ract->get_active() && Config->get_native_file_header_format() != hf) {
+                       Config->set_native_file_header_format (hf);
+                       if (session) {
+                               session->reset_native_file_format ();
+                       }
+               }
+       }
+}
+
+void
+ARDOUR_UI::set_native_file_data_format (SampleFormat sf)
+{
+       Glib::RefPtr<Action> act;
+       
+       switch (sf) {
+       case FormatFloat:
+               act = ActionManager::get_action (X_("options"), X_("FileDataFormatFloat"));
+               break;
+       case FormatInt24:
+               act = ActionManager::get_action (X_("options"), X_("FileDataFormat24bit"));
+               break;
+       }
+
+       if (act) {
+               Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
+
+               if (ract && ract->get_active() && Config->get_native_file_data_format() != sf) {
+                       Config->set_native_file_data_format (sf);
+                       if (session) {
+                               session->reset_native_file_format ();
+                       }
+               }
+       }
+}
+
+void
+ARDOUR_UI::use_config ()
+{
+       Glib::RefPtr<Action> act;
+
+       switch (Config->get_native_file_data_format ()) {
+       case FormatFloat:
+               act = ActionManager::get_action (X_("options"), X_("FileDataFormatFloat"));
+               break;
+       case FormatInt24:
+               act = ActionManager::get_action (X_("options"), X_("FileDataFormat24bit"));
+               break;
+       }
+
+       if (act) {
+               Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
+               ract->set_active ();
+       }       
+
+       switch (Config->get_native_file_header_format ()) {
+       case BWF:
+               act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatBWF"));
+               break;
+       case WAVE:
+               act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE"));
+               break;
+       case WAVE64:
+               act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE64"));
+               break;
+       case iXML:
+               act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatiXML"));
+               break;
+       case RF64:
+               act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatRF64"));
+               break;
+       }
+
+       if (act) {
+               Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
+               ract->set_active ();
+       }       
+}