#include <iostream>
-#include <gtkmm.h>
+#include <gtkmm/messagedialog.h>
+#include <gtkmm/accelmap.h>
+
#include <pbd/error.h>
#include <pbd/compose.h>
#include <pbd/basename.h>
#include <pbd/pathscanner.h>
#include <pbd/failed_constructor.h>
#include <gtkmm2ext/gtk_ui.h>
-#include <gtkmm2ext/pix.h>
#include <gtkmm2ext/utils.h>
#include <gtkmm2ext/click_box.h>
#include <gtkmm2ext/fastmeter.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 "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),
-
+
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")),
shown_flag (false)
using namespace Gtk::Menu_Helpers;
Gtkmm2ext::init();
-
- /* actually, its already loaded, but ... */
-
- cerr << "Loading UI configuration file " << rcfile << endl;
-
+
about = 0;
if (theArdourUI == 0) {
theArdourUI = this;
}
+ ActionManager::init ();
+
+ /* load colors */
+
+ color_manager = new ColorManager();
+
+ std::string color_file = ARDOUR::find_config_file("ardour.colors");
+
+ color_manager->load (color_file);
+
+ m_new_session_dialog = 0;
+ m_new_session_dialog_ref = NewSessionDialogFactory::create();
+ m_new_session_dialog_ref->get_widget_derived (NewSessionDialogFactory::top_level_widget_name(), m_new_session_dialog);
editor = 0;
mixer = 0;
session = 0;
connection_editor = 0;
add_route_dialog = 0;
route_params = 0;
- meter_bridge = 0;
option_editor = 0;
location_ui = 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;
- ui_manager = UIManager::create ();
-
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));
-
- ui_manager->insert_action_group (shuttle_actions);
+ shuttle_style_menu = 0;
+ shuttle_unit_menu = 0;
- shuttle_style_menu = dynamic_cast<Menu*> (ui_manager->get_widget ("ShuttleStylePopup"));
- shuttle_unit_menu = dynamic_cast<Menu*> (ui_manager->get_widget ("ShuttleUnitPopup"));
-
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 */
}
You would be wasting space recording silence."),
ds->name());
- ArdourMessage message (editor, X_("cannotrecord"), msg);
+ MessageDialog message (*editor, msg);
+ message.run ();
}
void
_tooltips.enable();
keyboard = new Keyboard;
- install_keybindings ();
- FastMeter::set_vertical_xpm (v_meter_strip_xpm);
- FastMeter::set_horizontal_xpm (h_meter_strip_xpm);
+ string meter_path;
+
+ meter_path = ARDOUR::find_data_file("v_meter_strip.xpm", "pixmaps");
+ if (meter_path.empty()) {
+ error << _("no vertical meter strip image found") << endmsg;
+ exit (1);
+ }
+ FastMeter::set_vertical_xpm (meter_path);
+
+ meter_path = ARDOUR::find_data_file("h_meter_strip.xpm", "pixmaps");
+ if (meter_path.empty()) {
+ error << _("no horizontal meter strip image found") << endmsg;
+ exit (1);
+ }
+ FastMeter::set_horizontal_xpm (meter_path);
if (setup_windows ()) {
throw failed_constructor ();
}
if (GTK_ARDOUR::show_key_actions) {
- KeyboardTarget::show_all_actions ();
+ vector<string> names;
+ vector<string> paths;
+ vector<string> keys;
+ vector<AccelKey> bindings;
+
+ ActionManager::get_all_actions (names, paths, keys, bindings);
+
+ vector<string>::iterator n;
+ vector<string>::iterator k;
+ for (n = names.begin(), k = keys.begin(); n != names.end(); ++n, ++k) {
+ cerr << "Action: " << (*n) << " bound to " << (*k) << endl;
+ }
+
exit (0);
}
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;
}
}
- 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 = string_compose(_("Save and %1"), what);
-
- Gtk::Button save_button (msg);
- save_button.set_name ("EditorGTKButton");
-
+ window.add_button (msg, RESPONSE_ACCEPT);
msg = string_compose(_("Just %1"), what);
-
- Gtk::Button nosave_button (msg);
- nosave_button.set_name ("EditorGTKButton");
-
+ 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");
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.set_keyboard_input (true);
save_the_session = 0;
editor->ensure_float (window);
- window.run ();
+ ResponseType r = (ResponseType) window.run();
+
+ 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 window.run_status();
+ 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_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::OK, 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);
-
-}
-
-void
-ARDOUR_UI::fs_cancel_clicked (Gtk::FileSelection* fs)
-{
- fs->hide_all();
- fs->get_selection_entry()->set_text("");
- allow_focus (false);
-}
-
-gint
-ARDOUR_UI::fs_delete_event (GdkEventAny* ev, Gtk::FileSelection* fs)
-{
- fs_cancel_clicked (fs);
- return 1;
}
bool
ARDOUR_UI::filter_ardour_session_dirs (const FileFilter::Info& info)
{
struct stat statbuf;
-
+
if (stat (info.filename.c_str(), &statbuf) != 0) {
return false;
}
/* 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 ();
}
}
void
ARDOUR_UI::diskstream_added (DiskStream* ds)
{
- // meter_bridge_dialog_check->set_sensitive (true);
}
void
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
}
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 (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;
}
}
-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)
{
}
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;
-#if 0
- // GTK2FIX
+ do {
+ response = m_new_session_dialog->run ();
- /* 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;
- }
-#endif
-
- string session_path = new_session_window->file_selector.get_filename ();
- 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 << string_compose(_("Session %1 already exists at %2"), session_name, session_path) << endmsg;
- return;
- }
+ if(response == Gtk::RESPONSE_OK) {
- _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);
- }
-
- 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;
/* 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;
}
}
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,
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) {
}
void
-ARDOUR_UI::display_cleanup_results (Session::cleanup_report& rep, const gchar* list_title, string msg)
+ARDOUR_UI::display_cleanup_results (Session::cleanup_report& rep, const gchar* list_title, const string & msg)
{
size_t removed;
removed = rep.paths.size();
if (removed == 0) {
- ArdourMessage msg (editor, X_("cleanupresults"),
+ MessageDialog msg (*editor, X_("cleanupresults"),
_("\
No audio files were ready for cleanup\n\n\
If this seems suprising, check for any existing\n\
snapshots. These may still include regions that\n\
require some unused files to continue to exist."));
+ msg.run ();
return;
}
- ArdourDialog results ("cleanup results");
+ ArdourDialog results (_("ardour: cleanup"), true);
struct CleanupResultsModelColumns : public Gtk::TreeModel::ColumnRecord {
CleanupResultsModelColumns() {
Gtk::ScrolledWindow list_scroller;
Gtk::Label txt;
- Gtk::Button ok_button (_("OK"));
- Gtk::VBox vpacker;
-
- vpacker.set_border_width (10);
- vpacker.set_spacing (10);
if (rep.space < 1048576.0f) {
if (removed > 1) {
}
}
- 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) {
TreeModel::Row row = *(results_model->append());
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);
-
- 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);
- 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;
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);
- 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 (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 ();
+ }
+}