#include <iostream>
+#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/fastmeter.h>
#include "actions.h"
#include "ardour_ui.h"
-#include "ardour_message.h"
#include "public_editor.h"
#include "audio_clock.h"
#include "keyboard.h"
#include "about.h"
#include "utils.h"
#include "gui_thread.h"
+#include "color_manager.h"
#include "i18n.h"
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),
/* 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")),
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) {
}
ActionManager::init ();
+
+ /* load colors */
+
+ color_manager = new ColorManager();
+
+ std::string color_file = ARDOUR::find_config_file("ardour.colors");
- 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);
+ color_manager->load (color_file);
+
+ m_new_session_dialog = new NewSessionDialog();
editor = 0;
mixer = 0;
session = 0;
route_params = 0;
option_editor = 0;
location_ui = 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);
- Glib::RefPtr<ActionGroup> shuttle_actions = ActionGroup::create ("ShuttleActions");
-
- shuttle_actions->add (Action::create (X_("SetShuttleUnitsPercentage"), _("Percentage")), bind (mem_fun(*this, &ARDOUR_UI::set_shuttle_units), Percentage));
- shuttle_actions->add (Action::create (X_("SetShuttleUnitsSemitones"), _("Semitones")), bind (mem_fun(*this, &ARDOUR_UI::set_shuttle_units), Semitones));
- shuttle_actions->add (Action::create (X_("SetShuttleActionSprung"), _("Sprung")), bind (mem_fun(*this, &ARDOUR_UI::set_shuttle_behaviour), Sprung));
- shuttle_actions->add (Action::create (X_("SetShuttleActionWheel"), _("Wheel")), bind (mem_fun(*this, &ARDOUR_UI::set_shuttle_behaviour), Wheel));
-
- ActionManager::add_action_group (shuttle_actions);
+ shuttle_style_menu = 0;
+ shuttle_unit_menu = 0;
- shuttle_style_menu = dynamic_cast<Menu*> (ActionManager::get_widget ("ShuttleStylePopup"));
- shuttle_unit_menu = dynamic_cast<Menu*> (ActionManager::get_widget ("ShuttleUnitPopup"));
-
gettimeofday (&last_peak_grab, 0);
gettimeofday (&last_shuttle_request, 0);
- 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));
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 (mem_fun(*this, &ARDOUR_UI::cannot_record_no_input), ds));
-
- 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);
-}
-
void
ARDOUR_UI::set_engine (AudioEngine& e)
{
_tooltips.enable();
keyboard = new Keyboard;
- install_keybindings ();
-
- FastMeter::set_vertical_xpm (v_meter_strip_xpm);
- FastMeter::set_horizontal_xpm (h_meter_strip_xpm);
if (setup_windows ()) {
throw failed_constructor ();
}
if (GTK_ARDOUR::show_key_actions) {
- // GTK2FIX
- // 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);
}
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);
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
/* 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;
break;
}
}
-
- quit();
+ Config->save_state();
+ 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::HBox dhbox; // the hbox for the image and text
Gtk::Label prompt_label;
- Gtk::HBox button_packer;
+ Gtk::Image* dimage = manage (new Gtk::Image(Stock::DIALOG_WARNING, Gtk::ICON_SIZE_DIALOG));
string msg;
- msg = string_compose(_("Save and %1"), what);
-
- Gtk::Button save_button (msg);
- save_button.set_name ("EditorGTKButton");
-
+ msg = string_compose(_("Don't %1"), what);
+ window.add_button (msg, RESPONSE_REJECT);
msg = string_compose(_("Just %1"), what);
+ window.add_button (msg, RESPONSE_APPLY);
+ msg = string_compose(_("Save and %1"), what);
+ window.add_button (msg, RESPONSE_ACCEPT);
- Gtk::Button nosave_button (msg);
- nosave_button.set_name ("EditorGTKButton");
-
- msg = string_compose(_("Don't %1"), what);
+ window.set_default_response (RESPONSE_ACCEPT);
Gtk::Button noquit_button (msg);
noquit_button.set_name ("EditorGTKButton");
} else {
type = _("snapshot");
}
- 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?"),
+ prompt = string_compose(_("The %1\"%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"));
+ prompt_label.set_alignment(ALIGN_LEFT, ALIGN_TOP);
- 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);
+ dimage->set_alignment(ALIGN_CENTER, ALIGN_TOP)
+;
+ dhbox.set_homogeneous (false);
+ dhbox.pack_start (*dimage, false, false, 5);
+ dhbox.pack_start (prompt_label, true, false, 5);
+ window.get_vbox()->pack_start (dhbox);
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.set_resizable (false);
window.show_all ();
- window.set_keyboard_input (true);
save_the_session = 0;
editor->ensure_float (window);
- window.run ();
+ ResponseType r = (ResponseType) window.run();
+
+ window.hide ();
- return window.run_status();
+ 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
update_cpu_load ();
update_buffer_load ();
update_disk_space ();
- // update_disk_rate ();
return TRUE;
}
gint
ARDOUR_UI::every_point_one_seconds ()
{
- struct timeval now;
- struct timeval diff;
-
- /* do not attempt to grab peak power more than once per cycle.
- */
-
- gettimeofday (&now, 0);
- timersub (&now, &last_peak_grab, &diff);
-
- if ((diff.tv_usec + (diff.tv_sec * 1000000)) >= engine->usecs_per_cycle()) {
- IO::GrabPeakPower(); /* EMIT_SIGNAL */
- last_peak_grab = now;
- }
-
update_speed_display ();
RapidScreenUpdate(); /* EMIT_SIGNAL */
return TRUE;
cpu_load_label.set_text (buf);
}
-void
-ARDOUR_UI::update_disk_rate ()
-{
- char buf[64];
-
- if (session) {
- snprintf (buf, sizeof (buf), _("Disk r:%5.1f w:%5.1f MB/s"),
- session->read_data_rate()/1048576.0f, session->write_data_rate()/1048576.0f);
- disk_rate_label.set_text (buf);
- } else {
- disk_rate_label.set_text ("");
- }
-}
-
void
ARDOUR_UI::update_buffer_load ()
{
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)
{
TreeModel::Row row = *(recent_session_model->append());
- row[recent_session_columns.visible_name] = PBD::basename (fullpath);
+ row[recent_session_columns.visible_name] = Glib::path_get_basename (fullpath);
row[recent_session_columns.fullpath] = fullpath;
if (states->size() > 1) {
{
session_selector_window = new ArdourDialog ("session selector");
- Gtk::VBox *vpacker = manage (new Gtk::VBox);
Gtk::ScrolledWindow *scroller = manage (new Gtk::ScrolledWindow);
- Gtk::HBox *button_packer = manage (new Gtk::HBox);
- Gtk::Button *cancel_button = manage (new Gtk::Button (_("cancel")));
- Gtk::Button *rescan_button = manage (new Gtk::Button (_("rescan")));
-
- button_packer->pack_start (*rescan_button);
- button_packer->pack_start (*cancel_button);
-
- vpacker->pack_start (*scroller);
- vpacker->pack_start (*button_packer, false, false);
-
+
+ session_selector_window->add_button (Stock::CANCEL, RESPONSE_CANCEL);
+ session_selector_window->add_button (Stock::OPEN, RESPONSE_ACCEPT);
+ session_selector_window->set_default_response (RESPONSE_ACCEPT);
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);
+
+ recent_session_display.signal_row_activated().connect (mem_fun (*this, &ARDOUR_UI::recent_session_row_activated));
scroller->add (recent_session_display);
scroller->set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC);
- session_selector_window->add (*vpacker);
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::recent_session_row_activated (const TreePath& path, TreeViewColumn* col)
+{
+ session_selector_window->response (RESPONSE_ACCEPT);
}
void
redisplay_recent_sessions ();
- session_selector_window->run ();
+ ResponseType r = (ResponseType) session_selector_window->run ();
+ session_selector_window->hide();
- switch (session_selector_window->run_status()) {
- case 0:
+ switch (r) {
+ case RESPONSE_ACCEPT:
break;
-
default:
return;
}
Glib::ustring path = (*i)[recent_session_columns.fullpath];
Glib::ustring state = (*i)[recent_session_columns.visible_name];
- session_selector_window->response (RESPONSE_ACCEPT);
_session_is_new = false;
load_session (path, state);
-
}
bool
ARDOUR_UI::filter_ardour_session_dirs (const FileFilter::Info& info)
{
struct stat statbuf;
-
+
if (stat (info.filename.c_str(), &statbuf) != 0) {
return false;
}
return false;
}
+ // XXX Portability
+
string session_file = info.filename;
session_file += '/';
- session_file += PBD::basename (info.filename);
+ session_file += Glib::path_get_basename (info.filename);
session_file += ".ardour";
if (stat (session_file.c_str(), &statbuf) != 0) {
/* popup selector window */
if (open_session_selector == 0) {
+
+ /* ardour sessions are folders */
+
open_session_selector = new Gtk::FileChooserDialog (_("open session"), FILE_CHOOSER_ACTION_OPEN);
open_session_selector->add_button (Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);
- open_session_selector->add_button (Gtk::Stock::OPEN, Gtk::RESPONSE_OK);
-
- FileFilter filter_ardour;
- filter_ardour.set_name (_("Ardour sessions"));
- filter_ardour.add_custom (FILE_FILTER_FILENAME, mem_fun (*this, &ARDOUR_UI::filter_ardour_session_dirs));
+ open_session_selector->add_button (Gtk::Stock::OPEN, Gtk::RESPONSE_ACCEPT);
- open_session_selector->add_filter (filter_ardour);
+ 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);
}
- switch (open_session_selector->run ()) {
- case RESPONSE_OK:
+ 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;
}
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 {
}
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 ();
}
}
ARDOUR_UI::transport_goto_start ()
{
if (session) {
- session->request_locate (0);
+ session->goto_start();
/* force displayed area in editor to start no matter
*/
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
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);
}
}
}
}
}
-void
-ARDOUR_UI::send_all_midi_feedback ()
-{
- if (session) {
- session->send_all_midi_feedback();
- }
-}
-
void
ARDOUR_UI::allow_local_only ()
{
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);
- 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
time (&n);
now = ctime (&n);
- now = now.substr (0, now.length() - 1);
+ now = now.substr (20, 4) + now.substr (3, 16) + " (" + now.substr (0, 3) + ")";
prompter.set_name ("Prompter");
- prompter.set_prompt (_("Name for snapshot"));
+ prompter.add_button (Gtk::Stock::SAVE, Gtk::RESPONSE_ACCEPT);
+ prompter.set_response_sensitive (Gtk::RESPONSE_ACCEPT, false);
+ prompter.set_prompt (_("Name of New Snapshot"));
prompter.set_initial_text (now);
switch (prompter.run()) {
}
void
-ARDOUR_UI::save_state (string name)
+ARDOUR_UI::save_state (const string & name)
{
(void) save_state_canfail (name);
}
switch (session->record_status()) {
case Session::Enabled:
if (onoff) {
- rec_button.set_state (STATE_ACTIVE);
+ rec_button.set_state (1);
} else {
- rec_button.set_state (STATE_NORMAL);
+ rec_button.set_state (0);
}
break;
case Session::Recording:
- rec_button.set_state (STATE_ACTIVE);
+ rec_button.set_state (2);
break;
default:
- rec_button.set_active (false);
- rec_button.set_state (STATE_NORMAL);
+ rec_button.set_state (0);
break;
}
}
prompter.set_name (X_("Prompter"));
prompter.set_prompt (_("Name for mix template:"));
prompter.set_initial_text(session->name() + _("-template"));
-
+ prompter.add_button (Gtk::Stock::SAVE, Gtk::RESPONSE_ACCEPT);
+ prompter.set_response_sensitive (Gtk::RESPONSE_ACCEPT, false);
+
switch (prompter.run()) {
case RESPONSE_ACCEPT:
prompter.get_result (name);
void
ARDOUR_UI::new_session (bool startup, std::string predetermined_path)
{
- m_new_session_dialog->show_all();
- m_new_session_dialog->set_transient_for(*editor);
+ m_new_session_dialog->show();
+ m_new_session_dialog->set_modal(true);
m_new_session_dialog->set_name(predetermined_path);
+ m_new_session_dialog->reset_recent();
int response = Gtk::RESPONSE_CANCEL;
do {
response = m_new_session_dialog->run ();
-
- if(response == Gtk::RESPONSE_OK) {
+ if(response == Gtk::RESPONSE_CANCEL || response == Gtk::RESPONSE_DELETE_EVENT) {
+ quit();
+ return;
+
+ } else if (response == Gtk::RESPONSE_NONE) {
+ /* Clear was pressed */
+ m_new_session_dialog->reset();
+
+ } else if (response == Gtk::RESPONSE_YES) {
+ /* YES == OPEN, but there's no enum for that */
+ std::string session_name = m_new_session_dialog->session_name();
+ std::string session_path = m_new_session_dialog->session_folder();
+ load_session (session_path, session_name);
+
+
+ } else if (response == Gtk::RESPONSE_OK) {
+ if (m_new_session_dialog->get_current_page() == 1) {
+
+ /* XXX this is a bit of a hack..
+ i really want the new sesion dialog to return RESPONSE_YES
+ if we're on page 1 (the load page)
+ Unfortunately i can't see how atm..
+ */
+ std::string session_name = m_new_session_dialog->session_name();
+ std::string session_path = m_new_session_dialog->session_folder();
+ load_session (session_path, session_name);
+
+ } else {
_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()) {
Session::AutoConnectOption iconnect;
Session::AutoConnectOption oconnect;
- if (m_new_session_dialog->create_control_track()) {
+ 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_track()) {
+ if (m_new_session_dialog->create_master_bus()) {
mchns = (uint32_t) m_new_session_dialog->master_channel_count();
} else {
mchns = 0;
nphysin,
nphysout,
engine->frame_rate() * 60 * 5);
- }
+ }
+ }
}
+
+ } while (response == Gtk::RESPONSE_NONE);
+ m_new_session_dialog->hide();
+ show();
- } while(response == Gtk::RESPONSE_HELP);
- m_new_session_dialog->hide_all();
+}
+
+void
+ARDOUR_UI::close_session()
+{
+ unload_session();
+ new_session ();
}
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;
/* 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;
}
session->set_clean ();
}
+ show ();
+
return FALSE;
}
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,
}
if (session && mixer) {
- mixer->show_window ();
+ // mixer->show_window ();
}
if (about) {
}
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"),
- _("\
-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\
+ MessageDialog msgd (*editor,
+ _("No audio files were ready for cleanup"),
+ true,
+ Gtk::MESSAGE_INFO,
+ (Gtk::ButtonsType)(Gtk::BUTTONS_CLOSE) );
+ msgd.set_secondary_text (_("If this seems suprising, \n\
+check for any existing snapshots.\n\
+These may still include regions that\n\
require some unused files to continue to exist."));
+
+ msgd.run ();
return;
}
- ArdourDialog results ("cleanup results");
+ ArdourDialog results (_("ardour: cleanup"), true, false);
struct CleanupResultsModelColumns : public Gtk::TreeModel::ColumnRecord {
CleanupResultsModelColumns() {
};
- Glib::RefPtr<Gtk::ListStore> results_model;
CleanupResultsModelColumns results_columns;
+ Glib::RefPtr<Gtk::ListStore> results_model;
Gtk::TreeView results_display;
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_name ("CleanupResultsList");
results_display.set_headers_visible (true);
+ results_display.set_headers_clickable (false);
+ results_display.set_reorderable (false);
Gtk::ScrolledWindow list_scroller;
Gtk::Label txt;
- Gtk::Button ok_button (_("OK"));
- Gtk::VBox vpacker;
-
- vpacker.set_border_width (10);
- vpacker.set_spacing (10);
+ Gtk::VBox dvbox;
+ Gtk::HBox dhbox; // the hbox for the image and text
+ Gtk::HBox ddhbox; // the hbox we eventually pack into the dialog's vbox
+ Gtk::Image* dimage = manage (new Gtk::Image(Stock::DIALOG_INFO, Gtk::ICON_SIZE_DIALOG));
+
+ dimage->set_alignment(ALIGN_LEFT, ALIGN_TOP);
if (rep.space < 1048576.0f) {
if (removed > 1) {
- txt.set_text (string_compose (msg, removed, _("files"), (float) rep.space / 1024.0f, "kilo"));
+ txt.set_text (string_compose (msg, removed, _("files were"), session->path() + "dead_sounds", (float) rep.space / 1024.0f, "kilo"));
} else {
- txt.set_text (string_compose (msg, removed, _("file"), (float) rep.space / 1024.0f, "kilo"));
+ txt.set_text (string_compose (msg, removed, _("file was"), session->path() + "dead_sounds", (float) rep.space / 1024.0f, "kilo"));
}
} else {
if (removed > 1) {
- txt.set_text (string_compose (msg, removed, _("files"), (float) rep.space / 1048576.0f, "mega"));
+ txt.set_text (string_compose (msg, removed, _("files were"), session->path() + "dead_sounds", (float) rep.space / 1048576.0f, "mega"));
} else {
- txt.set_text (string_compose (msg, removed, _("file"), (float) rep.space / 1048576.0f, "mega"));
+ txt.set_text (string_compose (msg, removed, _("file was"), session->path() + "dead_sounds", (float) rep.space / 1048576.0f, "mega"));
}
}
- vpacker.pack_start (txt, false, false);
-
+ dhbox.pack_start (*dimage, true, false, 5);
+ dhbox.pack_start (txt, true, false, 5);
+
for (vector<string>::iterator i = rep.paths.begin(); i != rep.paths.end(); ++i) {
TreeModel::Row row = *(results_model->append());
row[results_columns.visible_name] = *i;
}
list_scroller.add (results_display);
- list_scroller.set_size_request (-1, 250);
+ list_scroller.set_size_request (-1, 150);
list_scroller.set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC);
-
- vpacker.pack_start (list_scroller, true, true);
- vpacker.pack_start (ok_button, false, false);
-
- results.add (vpacker);
-
+
+ dvbox.pack_start (dhbox, true, false, 5);
+ dvbox.pack_start (list_scroller, true, false, 5);
+ ddhbox.pack_start (dvbox, true, false, 5);
+
+ results.get_vbox()->pack_start (ddhbox, true, false, 5);
+ results.add_button (Stock::CLOSE, RESPONSE_CLOSE);
+ results.set_default_response (RESPONSE_CLOSE);
results.set_position (Gtk::WIN_POS_MOUSE);
- results.set_title (_("ardour: cleanup"));
- results.set_modal (true);
+ results.show_all_children ();
+ results.set_resizable (false);
results.run ();
+
}
void
return;
}
- ArdourDialog checker (X_("cleanup confirm dialog"));
- 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;
+ MessageDialog checker (_("Are you sure you want to cleanup?"),
+ true,
+ Gtk::MESSAGE_QUESTION,
+ (Gtk::ButtonsType)(Gtk::BUTTONS_NONE));
- 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.set_secondary_text(_("Cleanup is a destructive operation.\n\
+ALL undo/redo information will be lost if you cleanup.\n\
+After cleanup, unused audio files will be moved to a \
+\"dead sounds\" location."));
- checker.add (vbox);
+ checker.add_button (Stock::CANCEL, RESPONSE_CANCEL);
+ checker.add_button (_("Clean Up"), RESPONSE_ACCEPT);
+ checker.set_default_response (RESPONSE_CANCEL);
+
checker.set_name (_("CleanupDialog"));
- checker.set_title (_("ardour cleanup"));
checker.set_wmclass (_("ardour_cleanup"), "Ardour");
checker.set_position (Gtk::WIN_POS_MOUSE);
- 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 ();
-
- switch (checker.run_status()) {
- case 0:
+ switch (checker.run()) {
+ case RESPONSE_ACCEPT:
break;
default:
return;
if (session->cleanup_sources (rep)) {
return;
}
-
+ checker.hide();
display_cleanup_results (rep,
_("cleaned files"),
_("\
-The following %1 %2 were not in use.\n\
-The next time you flush the wastebasket\n\
-it will release an additional %3 %4bytes\n\
-of disk space"
+The following %1 %2 not in use and \n\
+have been moved to:\n\
+%3. \n\n\
+Flushing the wastebasket will \n\
+release an additional\n\
+%4 %5bytes of disk space.\n"
));
}
display_cleanup_results (rep,
_("deleted file"),
- _("The following %1 file%2 were deleted, releasing %3 %4bytes of disk space"));
+ _("The following %1 %2 deleted from\n\
+%3,\n\
+releasing %4 %5bytes of disk space"));
}
void
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);
}
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) {
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) {
{
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
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;
}
}
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;
}
}
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);
+ dialog.get_vbox()->pack_start (message);
+ dialog.add_button (_("Recover from crash"), RESPONSE_ACCEPT);
+ dialog.add_button (_("Ignore crash data"), RESPONSE_REJECT);
- 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.add (vpacker);
dialog.set_position (WIN_POS_CENTER);
dialog.show_all ();
- 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);
{
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);
_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 ();
+ }
+}