#include <iostream>
-#include <gtkmm.h>
#include <pbd/error.h>
+#include <pbd/compose.h>
#include <pbd/basename.h>
#include <pbd/pathscanner.h>
#include <pbd/failed_constructor.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>
#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 "about.h"
#include "utils.h"
#include "gui_thread.h"
+#include "meter_xpms.h"
+#include "color_manager.h"
#include "i18n.h"
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),
/* 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)
{
theArdourUI = this;
}
+ ActionManager::init ();
+
+ /* load colors */
+
+ color_manager = new ColorManager();
+
+ std::string color_file = Glib::getenv(X_("ARDOUR_COLORS"));
+ if(!Glib::file_test(color_file, Glib::FILE_TEST_EXISTS)) {
+ 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;
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;
set_shuttle_units (Percentage);
set_shuttle_behaviour (Sprung);
- shuttle_unit_menu.items().push_back (MenuElem (_("Percentage"), bind (mem_fun(*this, &ARDOUR_UI::set_shuttle_units),
- Percentage)));
- shuttle_unit_menu.items().push_back (MenuElem (_("Semitones"), bind (mem_fun(*this, &ARDOUR_UI::set_shuttle_units),
- Semitones)));
-
- shuttle_style_menu.items().push_back (MenuElem (_("Sprung"), bind (mem_fun(*this, &ARDOUR_UI::set_shuttle_behaviour),
- Sprung)));
- shuttle_style_menu.items().push_back (MenuElem (_("Wheel"), bind (mem_fun(*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::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 */
}
{
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\
}
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);
}
/* start the time-of-day-clock */
update_wall_clock ();
- Main::timeout.connect (mem_fun(*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 ();
if (have_configure_timeout) {
gettimeofday (&last_configure_time, 0);
} else {
- TimeoutSig t;
- t.connect (mem_fun(*this, &ARDOUR_UI::configure_timeout), 100);
+ Glib::signal_timeout().connect (mem_fun(*this, &ARDOUR_UI::configure_timeout), 100);
have_configure_timeout = true;
}
with the scheduling of the audio thread.
*/
- Gtk::Main::idle.connect (mem_fun(*this, &ARDOUR_UI::start_engine));
+ Glib::signal_idle().connect (mem_fun(*this, &ARDOUR_UI::start_engine));
}
void
}
}
- 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");
} 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(mem_fun(window,&ArdourDialog::stop), 1));
- nosave_button.signal_clicked().connect (bind(mem_fun(window,&ArdourDialog::stop), 0));
- noquit_button.signal_clicked().connect (bind(mem_fun(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
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 (mem_fun(*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 ()
#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] == '/') {
/* 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 */
-
-
- /* add the parent */
-
- 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 */
+ TreeModel::Row row = *(recent_session_model->append());
- session_selector.rows().back().set_leaf (true);
+ row[recent_session_columns.visible_name] = PBD::basename (fullpath);
+ row[recent_session_columns.fullpath] = fullpath;
- } else {
-
- session_selector.rows().back().set_leaf (false);
+ if (states->size() > 1) {
- 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;
}
}
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;
-
- string session_name;
- string session_path;
- string session_state;
-
- if (!row.is_leaf()) {
- row.expand();
- return;
- }
+ 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 *stp = static_cast<string *> (row.get_data());
+ 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);
- 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);
- }
+ scroller->add (recent_session_display);
+ scroller->set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC);
- session_selector_window->hide ();
- _session_is_new = false;
- load_session (session_path, session_state);
+ 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();
}
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->signal_delete_event.connect (bind (ptr_fun (just_hide_it), static_cast<Gtk::Window*>(session_selector_window)));
- cancel_button-.signal_clicked().connect (bind (mem_fun(*this, &ARDOUR_UI::hide_dialog), session_selector_window));
- session_selector.tree_select_row.connect (mem_fun(*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
/* 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 (mem_fun(*this, &ARDOUR_UI::open_ok_clicked));
- open_session_selector->get_cancel_button()-.signal_clicked().connect (bind (mem_fun(*this, &ARDOUR_UI::fs_cancel_clicked), open_session_selector));
- open_session_selector->signal_delete_event.connect (bind (mem_fun(*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;
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 ()
}
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;
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 {
void
ARDOUR_UI::diskstream_added (DiskStream* ds)
{
- // meter_bridge_dialog_check->set_sensitive (true);
}
void
}
}
-gint
-ARDOUR_UI::mouse_transport_stop (GdkEventButton *ev)
-{
-
-
- if (session) {
- if (session->transport_stopped()) {
- session->request_locate (session->last_transport_start());
- } else {
- if (session->get_auto_loop()) {
- session->request_auto_loop (false);
- }
-
- Keyboard::ModifierMask mask = Keyboard::ModifierMask (Keyboard::Control|Keyboard::Shift);
- session->request_stop (Keyboard::modifier_state_equals (ev->state, mask));
- }
- }
-
- return TRUE;
-}
-
-gint
-ARDOUR_UI::mouse_transport_roll (GdkEventButton* ev)
-{
- transport_roll ();
- return TRUE;
-}
-
void
ARDOUR_UI::transport_stop ()
{
break;
case Session::Recording:
case Session::Enabled:
- session->disable_record ();
+ session->disable_record (true);
}
}
}
ARDOUR_UI::engine_stopped ()
{
ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::engine_stopped));
-
- 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);
}
ARDOUR_UI::engine_running ()
{
ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::engine_running));
-
- jack_disconnect_item->set_sensitive (true);
- jack_reconnect_item->set_sensitive (false);
- jack_bufsize_menu->set_sensitive (true);
+ ActionManager::set_sensitive (ActionManager::jack_sensitive_actions, true);
+ ActionManager::set_sensitive (ActionManager::jack_opposite_sensitive_actions, false);
}
void
{
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);
solution, its what we have.
*/
- Main::timeout.connect (mem_fun(*this, &ARDOUR_UI::make_session_clean), 1000);
+ Glib::signal_timeout().connect (mem_fun(*this, &ARDOUR_UI::make_session_clean), 1000);
}
return FALSE;
ARDOUR_UI::snapshot_session ()
{
ArdourPrompter prompter (true);
+ string snapname;
string now;
time_t n;
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);
}
}
}
-void
-ARDOUR_UI::allow_focus (bool yn)
-{
- if (keyboard) {
- keyboard->allow_focus (yn);
- }
-}
-
void
ARDOUR_UI::primary_clock_value_changed ()
{
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);
}
}
}
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)
{
{
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);
- }
+ m_new_session_dialog->show_all();
+ m_new_session_dialog->set_transient_for(*editor);
+ m_new_session_dialog->set_name(predetermined_path);
- new_session_window->run ();
+ int response = Gtk::RESPONSE_CANCEL;
- /* write favorites either way */
- Session::FavoriteDirs favs;
- new_session_window->file_selector.get_favorites (favs);
- Session::write_favorite_dirs (favs);
-
- 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;
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;
}
}
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,
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;
}
return 0;
}
-void
-ARDOUR_UI::hide_dialog (ArdourDialog *dialog)
-{
- dialog->hide_all();
-}
-
void
ARDOUR_UI::show ()
{
}
if (session && mixer) {
- mixer->show_window ();
+ // mixer->show_window ();
}
if (about) {
- about->get_window().raise ();
+ about->present ();
}
}
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
}
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;
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 ();
}
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 (mem_fun (checker, &ArdourDialog::stop), 1));
- cancel_button.signal_clicked().connect (bind (mem_fun (checker, &ArdourDialog::stop), 0));
-
- checker.run ();
-
- if (checker.run_status() != 1) {
+ switch (checker.run()) {
+ case RESPONSE_ACCEPT:
+ break;
+ default:
return;
}
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) {
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);
}
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\
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 (mem_fun (dialog, &ArdourDialog::stop), 0));
- cancel_button.signal_clicked().connect (bind (mem_fun (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:
+ break;
+ default:
return 1;
}