mirror of
https://github.com/Ardour/ardour.git
synced 2025-12-10 16:46:35 +01:00
merge 2.0-ongoing into 3.0 @ 3581 - 3710
git-svn-id: svn://localhost/ardour2/branches/3.0@3712 d708f5d6-7413-0410-9779-e7cbd77b26cf
This commit is contained in:
parent
68e943265e
commit
c86210a9d5
51 changed files with 1230 additions and 713 deletions
67
SConstruct
67
SConstruct
|
|
@ -54,7 +54,7 @@ opts.AddOptions(
|
||||||
BoolOption('UNIVERSAL', 'Compile as universal binary. Requires that external libraries are already universal.', 0),
|
BoolOption('UNIVERSAL', 'Compile as universal binary. Requires that external libraries are already universal.', 0),
|
||||||
BoolOption('VERSIONED', 'Add revision information to ardour/gtk executable name inside the build directory', 0),
|
BoolOption('VERSIONED', 'Add revision information to ardour/gtk executable name inside the build directory', 0),
|
||||||
BoolOption('VST', 'Compile with support for VST', 0),
|
BoolOption('VST', 'Compile with support for VST', 0),
|
||||||
BoolOption('LV2', 'Compile with support for LV2 (if slv2 is available)', 0),
|
BoolOption('LV2', 'Compile with support for LV2 (if slv2 is available)', 1),
|
||||||
BoolOption('GPROFILE', 'Compile with support for gprofile (Developers only)', 0),
|
BoolOption('GPROFILE', 'Compile with support for gprofile (Developers only)', 0),
|
||||||
BoolOption('FREEDESKTOP', 'Install MIME type, icons and .desktop file as per the freedesktop.org spec (requires xdg-utils and shared-mime-info). "scons uninstall" removes associations in desktop database', 0),
|
BoolOption('FREEDESKTOP', 'Install MIME type, icons and .desktop file as per the freedesktop.org spec (requires xdg-utils and shared-mime-info). "scons uninstall" removes associations in desktop database', 0),
|
||||||
BoolOption('TRANZPORT', 'Compile with support for Frontier Designs (if libusb is available)', 1),
|
BoolOption('TRANZPORT', 'Compile with support for Frontier Designs (if libusb is available)', 1),
|
||||||
|
|
@ -565,17 +565,14 @@ else:
|
||||||
print 'FREESOUND support is not enabled. Build with \'scons FREESOUND=1\' to enable.'
|
print 'FREESOUND support is not enabled. Build with \'scons FREESOUND=1\' to enable.'
|
||||||
|
|
||||||
if env['LV2']:
|
if env['LV2']:
|
||||||
conf = env.Configure(custom_tests = { 'CheckPKGExists' : CheckPKGExists })
|
conf = env.Configure(custom_tests = { 'CheckPKGVersion' : CheckPKGVersion})
|
||||||
|
|
||||||
if conf.CheckPKGExists ('slv2'):
|
if conf.CheckPKGVersion('slv2', '0.6.0'):
|
||||||
libraries['slv2'] = LibraryInfo()
|
libraries['slv2'] = LibraryInfo()
|
||||||
libraries['slv2'].ParseConfig('pkg-config --cflags --libs slv2')
|
libraries['slv2'].ParseConfig('pkg-config --cflags --libs slv2')
|
||||||
env.Append (CCFLAGS="-DHAVE_LV2")
|
env.Append (CCFLAGS="-DHAVE_LV2")
|
||||||
else:
|
else:
|
||||||
print 'Building Ardour with LV2 support requires SLV2 >= 0.6.0'
|
print 'LV2 support is not enabled (SLV2 not found or older than 0.6.0)'
|
||||||
print 'WARNING: SLV2 not found, or too old. Ardour will be built without LV2 support.'
|
|
||||||
print 'Until the 2.4 release, Ardour requires SLV2 out of SVN.'
|
|
||||||
print 'Testing would be very much appreciated! svn co http://svn.drobilla.net/lad/slv2'
|
|
||||||
env['LV2'] = 0
|
env['LV2'] = 0
|
||||||
conf.Finish()
|
conf.Finish()
|
||||||
else:
|
else:
|
||||||
|
|
@ -767,6 +764,13 @@ if env['DIST_TARGET'] in ['panther', 'tiger', 'leopard' ]:
|
||||||
# force tiger or later, to avoid issues on PPC which defaults
|
# force tiger or later, to avoid issues on PPC which defaults
|
||||||
# back to 10.1 if we don't tell it otherwise.
|
# back to 10.1 if we don't tell it otherwise.
|
||||||
env.Append (CCFLAGS="-DMAC_OS_X_VERSION_MIN_REQUIRED=1040")
|
env.Append (CCFLAGS="-DMAC_OS_X_VERSION_MIN_REQUIRED=1040")
|
||||||
|
|
||||||
|
if env['DIST_TARGET'] == 'leopard':
|
||||||
|
# need this to really build against the 10.4 SDK when building on leopard
|
||||||
|
# ideally this would be configurable, but lets just do that later when we need it
|
||||||
|
env.Append(CCFLAGS="-mmacosx-version-min=10.4 -isysroot /Developer/SDKs/MacOSX10.4u.sdk")
|
||||||
|
env.Append(LINKFLAGS="-mmacosx-version-min=10.4 -isysroot /Developer/SDKs/MacOSX10.4u.sdk")
|
||||||
|
|
||||||
else:
|
else:
|
||||||
env['IS_OSX'] = 0
|
env['IS_OSX'] = 0
|
||||||
|
|
||||||
|
|
@ -836,12 +840,13 @@ def prep_libcheck(topenv, libinfo):
|
||||||
#
|
#
|
||||||
# rationale: GTK-Quartz uses jhbuild and installs to /opt/gtk by default.
|
# rationale: GTK-Quartz uses jhbuild and installs to /opt/gtk by default.
|
||||||
# All libraries needed should be built against this location
|
# All libraries needed should be built against this location
|
||||||
|
# However.. now jhbuild installs to ~/gtk/inst by default.. changed to accomodate this
|
||||||
if topenv['GTKOSX']:
|
if topenv['GTKOSX']:
|
||||||
gtkroot = os.path.expanduser ("~");
|
GTKROOT = os.path.expanduser ('~/gtk/inst')
|
||||||
libinfo.Append(CPPPATH="$GTKROOT/include", LIBPATH="$GTKROOT/lib")
|
libinfo.Append(CPPPATH= GTKROOT + "/include", LIBPATH= GTKROOT + "/lib")
|
||||||
libinfo.Append(CXXFLAGS="-I$GTKROOT/include", LINKFLAGS="-L$GTKROOT/lib")
|
libinfo.Append(CXXFLAGS="-I" + GTKROOT + "/include", LINKFLAGS="-L" + GTKROOT + "/lib")
|
||||||
libinfo.Append(CPPPATH="/opt/local/include", LIBPATH="/opt/local/lib")
|
#libinfo.Append(CPPPATH="/opt/local/include", LIBPATH="/opt/local/lib")
|
||||||
libinfo.Append(CXXFLAGS="-I/opt/local/include", LINKFLAGS="-L/opt/local/lib")
|
#libinfo.Append(CXXFLAGS="-I/opt/local/include", LINKFLAGS="-L/opt/local/lib")
|
||||||
|
|
||||||
prep_libcheck(env, env)
|
prep_libcheck(env, env)
|
||||||
|
|
||||||
|
|
@ -859,25 +864,25 @@ libraries['vamphost'] = LibraryInfo (LIBS='vamphostsdk',
|
||||||
|
|
||||||
env['RUBBERBAND'] = False
|
env['RUBBERBAND'] = False
|
||||||
|
|
||||||
#conf = Configure (env)
|
conf = Configure (env)
|
||||||
#
|
|
||||||
#if conf.CheckHeader ('fftw3.h'):
|
if conf.CheckHeader ('fftw3.h'):
|
||||||
# env['RUBBERBAND'] = True
|
env['RUBBERBAND'] = True
|
||||||
# libraries['rubberband'] = LibraryInfo (LIBS='rubberband',
|
libraries['rubberband'] = LibraryInfo (LIBS='rubberband',
|
||||||
# LIBPATH='#libs/rubberband',
|
LIBPATH='#libs/rubberband',
|
||||||
# CPPPATH='#libs/rubberband',
|
CPPPATH='#libs/rubberband',
|
||||||
# CCFLAGS='-DUSE_RUBBERBAND')
|
CCFLAGS='-DUSE_RUBBERBAND')
|
||||||
#else:
|
else:
|
||||||
# print ""
|
print ""
|
||||||
# print "-------------------------------------------------------------------------"
|
print "-------------------------------------------------------------------------"
|
||||||
# print "You do not have the FFTW single-precision development package installed."
|
print "You do not have the FFTW single-precision development package installed."
|
||||||
# print "This prevents Ardour from using the Rubberband library for timestretching"
|
print "This prevents Ardour from using the Rubberband library for timestretching"
|
||||||
# print "and pitchshifting. It will fall back on SoundTouch for timestretch, and "
|
print "and pitchshifting. It will fall back on SoundTouch for timestretch, and "
|
||||||
# print "pitchshifting will not be available."
|
print "pitchshifting will not be available."
|
||||||
# print "-------------------------------------------------------------------------"
|
print "-------------------------------------------------------------------------"
|
||||||
# print ""
|
print ""
|
||||||
#
|
|
||||||
#conf.Finish()
|
conf.Finish()
|
||||||
|
|
||||||
#
|
#
|
||||||
# Check for libusb
|
# Check for libusb
|
||||||
|
|
|
||||||
|
|
@ -286,8 +286,11 @@ if env['VST']:
|
||||||
extra_sources += vst_files
|
extra_sources += vst_files
|
||||||
gtkardour.Append (CCFLAGS="-DVST_SUPPORT", CPPPATH="#libs/fst")
|
gtkardour.Append (CCFLAGS="-DVST_SUPPORT", CPPPATH="#libs/fst")
|
||||||
|
|
||||||
|
lv2_files = [ 'lv2_plugin_ui.cc' ]
|
||||||
|
|
||||||
if env['LV2']:
|
if env['LV2']:
|
||||||
gtkardour.Append (CCFLAGS="-DHAVE_SLV2")
|
extra_sources += lv2_files
|
||||||
|
gtkardour.Append (CCFLAGS="-DHAVE_LV2")
|
||||||
gtkardour.Merge ([libraries['slv2']])
|
gtkardour.Merge ([libraries['slv2']])
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -432,7 +435,7 @@ else:
|
||||||
keybindings_dict['%LEVEL4%'] = env['WINDOWS_KEY']
|
keybindings_dict['%LEVEL4%'] = env['WINDOWS_KEY']
|
||||||
keybindings_dict['%WINDOW%'] = 'Alt'
|
keybindings_dict['%WINDOW%'] = 'Alt'
|
||||||
|
|
||||||
for b in [ 'SAE-de', 'mnemonic-us', 'ergonomic-us' ]:
|
for b in [ 'SAE-de', 'SAE-us', 'mnemonic-us', 'ergonomic-us' ]:
|
||||||
target_file = b + '.bindings'
|
target_file = b + '.bindings'
|
||||||
src_file = target_file + '.in'
|
src_file = target_file + '.in'
|
||||||
Default (env.SubstInFile (target_file, src_file, SUBST_DICT = keybindings_dict))
|
Default (env.SubstInFile (target_file, src_file, SUBST_DICT = keybindings_dict))
|
||||||
|
|
|
||||||
|
|
@ -1344,7 +1344,7 @@ ARDOUR_UI::do_transport_locate (nframes_t new_position)
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
ARDOUR_UI::transport_goto_start ()
|
ARDOUR_UI::transport_goto_start ()
|
||||||
{
|
{
|
||||||
if (session) {
|
if (session) {
|
||||||
session->goto_start();
|
session->goto_start();
|
||||||
|
|
|
||||||
|
|
@ -104,6 +104,9 @@ AudioClock::AudioClock (std::string clock_name, bool transient, std::string widg
|
||||||
Gtkmm2ext::set_size_request_to_display_given_text(*smpte_upper_info_label, "23.98",0,0);
|
Gtkmm2ext::set_size_request_to_display_given_text(*smpte_upper_info_label, "23.98",0,0);
|
||||||
Gtkmm2ext::set_size_request_to_display_given_text(*smpte_lower_info_label, "NDF",0,0);
|
Gtkmm2ext::set_size_request_to_display_given_text(*smpte_lower_info_label, "NDF",0,0);
|
||||||
|
|
||||||
|
Gtkmm2ext::set_size_request_to_display_given_text(*bbt_upper_info_label, "88|88",0,0);
|
||||||
|
Gtkmm2ext::set_size_request_to_display_given_text(*bbt_lower_info_label, "888.88",0,0);
|
||||||
|
|
||||||
frames_info_box.pack_start (*frames_upper_info_label, true, true);
|
frames_info_box.pack_start (*frames_upper_info_label, true, true);
|
||||||
frames_info_box.pack_start (*frames_lower_info_label, true, true);
|
frames_info_box.pack_start (*frames_lower_info_label, true, true);
|
||||||
smpte_info_box.pack_start (*smpte_upper_info_label, true, true);
|
smpte_info_box.pack_start (*smpte_upper_info_label, true, true);
|
||||||
|
|
@ -644,11 +647,17 @@ AudioClock::set_bbt (nframes_t when, bool force)
|
||||||
}
|
}
|
||||||
|
|
||||||
sprintf (buf, "%03" PRIu32, bbt.bars);
|
sprintf (buf, "%03" PRIu32, bbt.bars);
|
||||||
bars_label.set_text (buf);
|
if (force || bars_label.get_text () != buf) {
|
||||||
|
bars_label.set_text (buf);
|
||||||
|
}
|
||||||
sprintf (buf, "%02" PRIu32, bbt.beats);
|
sprintf (buf, "%02" PRIu32, bbt.beats);
|
||||||
beats_label.set_text (buf);
|
if (force || beats_label.get_text () != buf) {
|
||||||
|
beats_label.set_text (buf);
|
||||||
|
}
|
||||||
sprintf (buf, "%04" PRIu32, bbt.ticks);
|
sprintf (buf, "%04" PRIu32, bbt.ticks);
|
||||||
ticks_label.set_text (buf);
|
if (force || ticks_label.get_text () != buf) {
|
||||||
|
ticks_label.set_text (buf);
|
||||||
|
}
|
||||||
|
|
||||||
if (bbt_upper_info_label) {
|
if (bbt_upper_info_label) {
|
||||||
nframes64_t pos;
|
nframes64_t pos;
|
||||||
|
|
|
||||||
|
|
@ -209,8 +209,7 @@ Editor::Editor ()
|
||||||
range_mark_label (_("Range Markers")),
|
range_mark_label (_("Range Markers")),
|
||||||
transport_mark_label (_("Loop/Punch Ranges")),
|
transport_mark_label (_("Loop/Punch Ranges")),
|
||||||
cd_mark_label (_("CD Markers")),
|
cd_mark_label (_("CD Markers")),
|
||||||
|
edit_packer (3, 4, true),
|
||||||
edit_packer (3, 3, true),
|
|
||||||
|
|
||||||
/* the values here don't matter: layout widgets
|
/* the values here don't matter: layout widgets
|
||||||
reset them as needed.
|
reset them as needed.
|
||||||
|
|
@ -219,9 +218,6 @@ Editor::Editor ()
|
||||||
vertical_adjustment (0.0, 0.0, 10.0, 400.0),
|
vertical_adjustment (0.0, 0.0, 10.0, 400.0),
|
||||||
horizontal_adjustment (0.0, 0.0, 20.0, 1200.0),
|
horizontal_adjustment (0.0, 0.0, 20.0, 1200.0),
|
||||||
|
|
||||||
tempo_lines(0),
|
|
||||||
marker_tempo_lines(0),
|
|
||||||
|
|
||||||
/* tool bar related */
|
/* tool bar related */
|
||||||
|
|
||||||
edit_point_clock (X_("editpoint"), false, X_("EditPointClock"), true),
|
edit_point_clock (X_("editpoint"), false, X_("EditPointClock"), true),
|
||||||
|
|
@ -375,7 +371,6 @@ Editor::Editor ()
|
||||||
range_marker_drag_rect = 0;
|
range_marker_drag_rect = 0;
|
||||||
marker_drag_line = 0;
|
marker_drag_line = 0;
|
||||||
tempo_map_change_idle_handler_id = -1;
|
tempo_map_change_idle_handler_id = -1;
|
||||||
canvas_hroizontally_scrolled_handler_id = -1;
|
|
||||||
set_midi_edit_mode (MidiEditPencil, true);
|
set_midi_edit_mode (MidiEditPencil, true);
|
||||||
set_mouse_mode (MouseObject, true);
|
set_mouse_mode (MouseObject, true);
|
||||||
|
|
||||||
|
|
@ -390,16 +385,10 @@ Editor::Editor ()
|
||||||
initialize_canvas ();
|
initialize_canvas ();
|
||||||
|
|
||||||
edit_controls_vbox.set_spacing (0);
|
edit_controls_vbox.set_spacing (0);
|
||||||
horizontal_adjustment.signal_value_changed().connect (mem_fun(*this, &Editor::canvas_horizontally_scrolled), false);
|
horizontal_adjustment.signal_value_changed().connect (mem_fun(*this, &Editor::scroll_canvas_horizontally), false);
|
||||||
vertical_adjustment.signal_value_changed().connect (mem_fun(*this, &Editor::tie_vertical_scrolling), true);
|
vertical_adjustment.signal_value_changed().connect (mem_fun(*this, &Editor::tie_vertical_scrolling), true);
|
||||||
|
|
||||||
track_canvas->set_hadjustment (horizontal_adjustment);
|
|
||||||
track_canvas->set_vadjustment (vertical_adjustment);
|
|
||||||
time_canvas->set_hadjustment (horizontal_adjustment);
|
|
||||||
|
|
||||||
track_canvas->signal_map_event().connect (mem_fun (*this, &Editor::track_canvas_map_handler));
|
track_canvas->signal_map_event().connect (mem_fun (*this, &Editor::track_canvas_map_handler));
|
||||||
time_canvas->signal_map_event().connect (mem_fun (*this, &Editor::time_canvas_map_handler));
|
|
||||||
|
|
||||||
controls_layout.add (edit_controls_vbox);
|
controls_layout.add (edit_controls_vbox);
|
||||||
controls_layout.set_name ("EditControlsBase");
|
controls_layout.set_name ("EditControlsBase");
|
||||||
controls_layout.add_events (Gdk::SCROLL_MASK);
|
controls_layout.add_events (Gdk::SCROLL_MASK);
|
||||||
|
|
@ -436,9 +425,8 @@ Editor::Editor ()
|
||||||
time_canvas_vbox.pack_start (*smpte_ruler, false, false);
|
time_canvas_vbox.pack_start (*smpte_ruler, false, false);
|
||||||
time_canvas_vbox.pack_start (*frames_ruler, false, false);
|
time_canvas_vbox.pack_start (*frames_ruler, false, false);
|
||||||
time_canvas_vbox.pack_start (*bbt_ruler, false, false);
|
time_canvas_vbox.pack_start (*bbt_ruler, false, false);
|
||||||
time_canvas_vbox.pack_start (*time_canvas, true, true);
|
//time_canvas_vbox.set_size_request (-1, (int)(timebar_height * visible_timebars) + 2);
|
||||||
time_canvas_vbox.set_size_request (-1, (int)(timebar_height * visible_timebars) + 5);
|
time_canvas_vbox.set_size_request (-1, -1);
|
||||||
|
|
||||||
bbt_label.set_name ("EditorTimeButton");
|
bbt_label.set_name ("EditorTimeButton");
|
||||||
bbt_label.set_size_request (-1, (int)timebar_height);
|
bbt_label.set_size_request (-1, (int)timebar_height);
|
||||||
bbt_label.set_alignment (1.0, 0.5);
|
bbt_label.set_alignment (1.0, 0.5);
|
||||||
|
|
@ -455,6 +443,7 @@ Editor::Editor ()
|
||||||
frame_label.set_size_request (-1, (int)timebar_height);
|
frame_label.set_size_request (-1, (int)timebar_height);
|
||||||
frame_label.set_alignment (1.0, 0.5);
|
frame_label.set_alignment (1.0, 0.5);
|
||||||
frame_label.set_padding (5,0);
|
frame_label.set_padding (5,0);
|
||||||
|
|
||||||
tempo_label.set_name ("EditorTimeButton");
|
tempo_label.set_name ("EditorTimeButton");
|
||||||
tempo_label.set_size_request (-1, (int)timebar_height);
|
tempo_label.set_size_request (-1, (int)timebar_height);
|
||||||
tempo_label.set_alignment (1.0, 0.5);
|
tempo_label.set_alignment (1.0, 0.5);
|
||||||
|
|
@ -479,26 +468,26 @@ Editor::Editor ()
|
||||||
transport_mark_label.set_size_request (-1, (int)timebar_height);
|
transport_mark_label.set_size_request (-1, (int)timebar_height);
|
||||||
transport_mark_label.set_alignment (1.0, 0.5);
|
transport_mark_label.set_alignment (1.0, 0.5);
|
||||||
transport_mark_label.set_padding (5,0);
|
transport_mark_label.set_padding (5,0);
|
||||||
|
|
||||||
|
ruler_label_vbox.pack_start (minsec_label, false, false);
|
||||||
|
ruler_label_vbox.pack_start (smpte_label, false, false);
|
||||||
|
ruler_label_vbox.pack_start (frame_label, false, false);
|
||||||
|
ruler_label_vbox.pack_start (bbt_label, false, false);
|
||||||
|
|
||||||
time_button_vbox.pack_start (minsec_label, false, false);
|
ruler_label_event_box.add (ruler_label_vbox);
|
||||||
time_button_vbox.pack_start (smpte_label, false, false);
|
ruler_label_event_box.set_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK);
|
||||||
time_button_vbox.pack_start (frame_label, false, false);
|
ruler_label_event_box.set_name ("TimebarLabelBase");
|
||||||
time_button_vbox.pack_start (bbt_label, false, false);
|
ruler_label_event_box.signal_button_release_event().connect (mem_fun(*this, &Editor::ruler_label_button_release));
|
||||||
|
|
||||||
time_button_vbox.pack_start (meter_label, false, false);
|
time_button_vbox.pack_start (meter_label, false, false);
|
||||||
time_button_vbox.pack_start (tempo_label, false, false);
|
time_button_vbox.pack_start (tempo_label, false, false);
|
||||||
time_button_vbox.pack_start (mark_label, false, false);
|
time_button_vbox.pack_start (mark_label, false, false);
|
||||||
|
|
||||||
time_button_event_box.add (time_button_vbox);
|
time_button_event_box.add (time_button_vbox);
|
||||||
time_button_event_box.set_name ("TimebarLabelBase");
|
time_button_event_box.set_name ("TimebarLabelBase");
|
||||||
time_button_frame.set_shadow_type (Gtk::SHADOW_NONE);
|
|
||||||
|
|
||||||
time_button_event_box.set_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK);
|
time_button_event_box.set_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK);
|
||||||
time_button_event_box.signal_button_release_event().connect (mem_fun(*this, &Editor::ruler_label_button_release));
|
time_button_event_box.signal_button_release_event().connect (mem_fun(*this, &Editor::ruler_label_button_release));
|
||||||
|
|
||||||
time_button_frame.add (time_button_event_box);
|
|
||||||
time_button_frame.set_name ("TimebarLabelBase");
|
|
||||||
time_button_frame.set_shadow_type (Gtk::SHADOW_ETCHED_OUT);
|
|
||||||
|
|
||||||
/* these enable us to have a dedicated window (for cursor setting, etc.)
|
/* these enable us to have a dedicated window (for cursor setting, etc.)
|
||||||
for the canvas areas.
|
for the canvas areas.
|
||||||
*/
|
*/
|
||||||
|
|
@ -514,16 +503,16 @@ Editor::Editor ()
|
||||||
edit_packer.set_border_width (0);
|
edit_packer.set_border_width (0);
|
||||||
edit_packer.set_name ("EditorWindow");
|
edit_packer.set_name ("EditorWindow");
|
||||||
|
|
||||||
edit_packer.attach (edit_vscrollbar, 3, 4, 1, 2, FILL, FILL|EXPAND, 0, 0);
|
edit_packer.attach (edit_vscrollbar, 0, 1, 0, 4, FILL, FILL|EXPAND, 0, 0);
|
||||||
|
edit_packer.attach (ruler_label_event_box, 1, 2, 0, 1, FILL, SHRINK, 0, 0);
|
||||||
|
edit_packer.attach (time_button_event_box, 1, 2, 1, 2, FILL, SHRINK, 0, 0);
|
||||||
|
edit_packer.attach (time_canvas_event_box, 2, 3, 0, 1, FILL|EXPAND, FILL, 0, 0);
|
||||||
|
|
||||||
edit_packer.attach (time_button_frame, 0, 2, 0, 1, FILL, SHRINK, 0, 0);
|
edit_packer.attach (controls_layout, 1, 2, 2, 3, FILL, FILL|EXPAND, 0, 0);
|
||||||
edit_packer.attach (time_canvas_event_box, 2, 4, 0, 1, FILL|EXPAND, FILL, 0, 0);
|
edit_packer.attach (track_canvas_event_box, 2, 3, 1, 3, FILL|EXPAND, FILL|EXPAND, 0, 0);
|
||||||
|
|
||||||
edit_packer.attach (controls_layout, 1, 2, 1, 2, FILL, FILL|EXPAND, 0, 0);
|
edit_packer.attach (zoom_box, 1, 2, 3, 4, FILL, FILL, 0, 0);
|
||||||
edit_packer.attach (track_canvas_event_box, 2, 3, 1, 2, FILL|EXPAND, FILL|EXPAND, 0, 0);
|
edit_packer.attach (edit_hscrollbar, 2, 3, 3, 4, FILL|EXPAND, FILL, 0, 0);
|
||||||
|
|
||||||
edit_packer.attach (zoom_box, 1, 2, 2, 3, FILL, FILL, 0, 0);
|
|
||||||
edit_packer.attach (edit_hscrollbar, 2, 3, 2, 3, FILL|EXPAND, FILL, 0, 0);
|
|
||||||
|
|
||||||
bottom_hbox.set_border_width (2);
|
bottom_hbox.set_border_width (2);
|
||||||
bottom_hbox.set_spacing (3);
|
bottom_hbox.set_spacing (3);
|
||||||
|
|
@ -854,20 +843,10 @@ Editor::~Editor()
|
||||||
track_canvas = 0;
|
track_canvas = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (time_canvas) {
|
|
||||||
delete time_canvas;
|
|
||||||
time_canvas = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (track_canvas) {
|
if (track_canvas) {
|
||||||
delete track_canvas;
|
delete track_canvas;
|
||||||
track_canvas = 0;
|
track_canvas = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (time_canvas) {
|
|
||||||
delete time_canvas;
|
|
||||||
time_canvas = 0;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
@ -1103,6 +1082,7 @@ Editor::start_scrolling ()
|
||||||
{
|
{
|
||||||
scroll_connection = ARDOUR_UI::instance()->SuperRapidScreenUpdate.connect
|
scroll_connection = ARDOUR_UI::instance()->SuperRapidScreenUpdate.connect
|
||||||
(mem_fun(*this, &Editor::update_current_screen));
|
(mem_fun(*this, &Editor::update_current_screen));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
@ -1161,7 +1141,7 @@ Editor::handle_new_duration ()
|
||||||
if (new_end > last_canvas_frame) {
|
if (new_end > last_canvas_frame) {
|
||||||
last_canvas_frame = new_end;
|
last_canvas_frame = new_end;
|
||||||
horizontal_adjustment.set_upper (last_canvas_frame / frames_per_unit);
|
horizontal_adjustment.set_upper (last_canvas_frame / frames_per_unit);
|
||||||
reset_scrolling_region ();
|
//reset_scrolling_region ();
|
||||||
}
|
}
|
||||||
|
|
||||||
horizontal_adjustment.set_value (leftmost_frame/frames_per_unit);
|
horizontal_adjustment.set_value (leftmost_frame/frames_per_unit);
|
||||||
|
|
@ -3562,13 +3542,23 @@ Editor::hide_verbose_canvas_cursor ()
|
||||||
double
|
double
|
||||||
Editor::clamp_verbose_cursor_x (double x)
|
Editor::clamp_verbose_cursor_x (double x)
|
||||||
{
|
{
|
||||||
return min (horizontal_adjustment.get_value() + canvas_width - 75.0, x);
|
if (x < 0) {
|
||||||
|
x = 0;
|
||||||
|
} else {
|
||||||
|
x = min (canvas_width - 200.0, x);
|
||||||
|
}
|
||||||
|
return x;
|
||||||
}
|
}
|
||||||
|
|
||||||
double
|
double
|
||||||
Editor::clamp_verbose_cursor_y (double y)
|
Editor::clamp_verbose_cursor_y (double y)
|
||||||
{
|
{
|
||||||
return min (vertical_adjustment.get_value() + canvas_height - 50.0, y);
|
if (y < canvas_timebars_vsize) {
|
||||||
|
y = canvas_timebars_vsize;
|
||||||
|
} else {
|
||||||
|
y = min (canvas_height - 50, y);
|
||||||
|
}
|
||||||
|
return y;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
@ -3577,7 +3567,7 @@ Editor::set_verbose_canvas_cursor (const string & txt, double x, double y)
|
||||||
verbose_canvas_cursor->property_text() = txt.c_str();
|
verbose_canvas_cursor->property_text() = txt.c_str();
|
||||||
/* don't get too close to the edge */
|
/* don't get too close to the edge */
|
||||||
verbose_canvas_cursor->property_x() = clamp_verbose_cursor_x (x);
|
verbose_canvas_cursor->property_x() = clamp_verbose_cursor_x (x);
|
||||||
verbose_canvas_cursor->property_y() = clamp_verbose_cursor_x (y);
|
verbose_canvas_cursor->property_y() = clamp_verbose_cursor_y (y);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
@ -4014,7 +4004,8 @@ void
|
||||||
Editor::end_location_changed (Location* location)
|
Editor::end_location_changed (Location* location)
|
||||||
{
|
{
|
||||||
ENSURE_GUI_THREAD (bind (mem_fun(*this, &Editor::end_location_changed), location));
|
ENSURE_GUI_THREAD (bind (mem_fun(*this, &Editor::end_location_changed), location));
|
||||||
reset_scrolling_region ();
|
//reset_scrolling_region ();
|
||||||
|
horizontal_adjustment.set_upper ( location->start());
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
|
|
@ -4405,6 +4396,7 @@ Editor::on_key_release_event (GdkEventKey* ev)
|
||||||
void
|
void
|
||||||
Editor::reset_x_origin (nframes64_t frame)
|
Editor::reset_x_origin (nframes64_t frame)
|
||||||
{
|
{
|
||||||
|
//cerr << "resetting x origin" << endl;
|
||||||
queue_visual_change (frame);
|
queue_visual_change (frame);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -4532,10 +4524,6 @@ Editor::set_frames_per_unit (double fpu)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (fpu == frames_per_unit) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
frames_per_unit = fpu;
|
frames_per_unit = fpu;
|
||||||
post_zoom ();
|
post_zoom ();
|
||||||
}
|
}
|
||||||
|
|
@ -4566,9 +4554,11 @@ Editor::post_zoom ()
|
||||||
ZoomChanged (); /* EMIT_SIGNAL */
|
ZoomChanged (); /* EMIT_SIGNAL */
|
||||||
|
|
||||||
reset_hscrollbar_stepping ();
|
reset_hscrollbar_stepping ();
|
||||||
reset_scrolling_region ();
|
//reset_scrolling_region ();
|
||||||
|
|
||||||
if (playhead_cursor) playhead_cursor->set_position (playhead_cursor->current_frame);
|
if (playhead_cursor) {
|
||||||
|
playhead_cursor->set_position (playhead_cursor->current_frame);
|
||||||
|
}
|
||||||
|
|
||||||
instant_save ();
|
instant_save ();
|
||||||
}
|
}
|
||||||
|
|
@ -4576,10 +4566,12 @@ Editor::post_zoom ()
|
||||||
void
|
void
|
||||||
Editor::queue_visual_change (nframes64_t where)
|
Editor::queue_visual_change (nframes64_t where)
|
||||||
{
|
{
|
||||||
pending_visual_change.pending = VisualChange::Type (pending_visual_change.pending | VisualChange::TimeOrigin);
|
// pending_visual_change.pending = VisualChange::Type (pending_visual_change.pending | VisualChange::TimeOrigin);
|
||||||
pending_visual_change.time_origin = where;
|
// pending_visual_change.time_origin = where;
|
||||||
|
|
||||||
if (pending_visual_change.idle_handler_id < 0) {
|
if (pending_visual_change.idle_handler_id < 0) {
|
||||||
|
pending_visual_change.pending = VisualChange::Type (pending_visual_change.pending | VisualChange::TimeOrigin);
|
||||||
|
pending_visual_change.time_origin = where;
|
||||||
pending_visual_change.idle_handler_id = g_idle_add (_idle_visual_changer, this);
|
pending_visual_change.idle_handler_id = g_idle_add (_idle_visual_changer, this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -4606,13 +4598,6 @@ int
|
||||||
Editor::idle_visual_changer ()
|
Editor::idle_visual_changer ()
|
||||||
{
|
{
|
||||||
VisualChange::Type p = pending_visual_change.pending;
|
VisualChange::Type p = pending_visual_change.pending;
|
||||||
nframes64_t csf, cef;
|
|
||||||
|
|
||||||
if (session) {
|
|
||||||
csf = session->current_start_frame();
|
|
||||||
cef = session->current_end_frame() + (current_page_frames() / 24);// Add a little extra so we can see the end marker
|
|
||||||
}
|
|
||||||
|
|
||||||
pending_visual_change.pending = (VisualChange::Type) 0;
|
pending_visual_change.pending = (VisualChange::Type) 0;
|
||||||
|
|
||||||
if (p & VisualChange::ZoomLevel) {
|
if (p & VisualChange::ZoomLevel) {
|
||||||
|
|
@ -4624,26 +4609,29 @@ Editor::idle_visual_changer ()
|
||||||
update_tempo_based_rulers ();
|
update_tempo_based_rulers ();
|
||||||
}
|
}
|
||||||
if (p & VisualChange::TimeOrigin) {
|
if (p & VisualChange::TimeOrigin) {
|
||||||
|
|
||||||
nframes64_t time_origin = (nframes64_t) floor (horizontal_adjustment.get_value() * frames_per_unit);
|
nframes64_t csf, cef;
|
||||||
|
nframes64_t current_time_origin = (nframes64_t) floor (horizontal_adjustment.get_value() * frames_per_unit);
|
||||||
|
|
||||||
|
if (session) {
|
||||||
|
csf = session->current_start_frame();
|
||||||
|
cef = session->current_end_frame() + (current_page_frames() / 24);// Add a little extra so we can see the end marker
|
||||||
|
}
|
||||||
|
|
||||||
/* if we seek beyond the current end of the canvas, move the end */
|
/* if we seek beyond the current end of the canvas, move the end */
|
||||||
|
|
||||||
if (time_origin != pending_visual_change.time_origin) {
|
if (current_time_origin != pending_visual_change.time_origin) {
|
||||||
|
//if (horizontal_adjustment.get_upper() < pending_visual_change.time_origin) {
|
||||||
if (horizontal_adjustment.get_upper() < pending_visual_change.time_origin) {
|
last_canvas_frame = (cef > (pending_visual_change.time_origin + current_page_frames())) ? cef : pending_visual_change.time_origin + current_page_frames();
|
||||||
last_canvas_frame = (cef > (pending_visual_change.time_origin + current_page_frames())) ? cef : pending_visual_change.time_origin + current_page_frames();
|
horizontal_adjustment.set_upper ((cef - csf) / frames_per_unit);
|
||||||
horizontal_adjustment.set_upper ((cef - csf) / frames_per_unit);
|
//}
|
||||||
reset_scrolling_region ();
|
horizontal_adjustment.set_value (pending_visual_change.time_origin / frames_per_unit);
|
||||||
}
|
|
||||||
|
|
||||||
horizontal_adjustment.set_value (pending_visual_change.time_origin/frames_per_unit);
|
|
||||||
} else {
|
} else {
|
||||||
update_fixed_rulers();
|
update_fixed_rulers();
|
||||||
redisplay_tempo (true);
|
redisplay_tempo (true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
//cerr << "Editor::idle_visual_changer () called ha v:l:u:ps:fpu = " << horizontal_adjustment.get_value() << ":" << horizontal_adjustment.get_lower() << ":" << horizontal_adjustment.get_upper() << ":" << horizontal_adjustment.get_page_size() << ":" << frames_per_unit << endl;//DEBUG
|
||||||
pending_visual_change.idle_handler_id = -1;
|
pending_visual_change.idle_handler_id = -1;
|
||||||
return 0; /* this is always a one-shot call */
|
return 0; /* this is always a one-shot call */
|
||||||
}
|
}
|
||||||
|
|
@ -5020,7 +5008,7 @@ Editor::queue_draw_resize_line (int at)
|
||||||
/* redraw where it used to be */
|
/* redraw where it used to be */
|
||||||
|
|
||||||
|
|
||||||
Gdk::Rectangle r (xroot, old_resize_line_y - 1, controls_width + (int) canvas_width, 3);
|
Gdk::Rectangle r (0, old_resize_line_y - 1, controls_width + (int) canvas_width, 3);
|
||||||
win->invalidate_rect (r, true);
|
win->invalidate_rect (r, true);
|
||||||
cerr << "invalidate " << xroot << "," << old_resize_line_y - 1 << ' '
|
cerr << "invalidate " << xroot << "," << old_resize_line_y - 1 << ' '
|
||||||
<< controls_width + canvas_width << " x 3\n";
|
<< controls_width + canvas_width << " x 3\n";
|
||||||
|
|
@ -5028,7 +5016,7 @@ Editor::queue_draw_resize_line (int at)
|
||||||
|
|
||||||
/* draw where it is */
|
/* draw where it is */
|
||||||
|
|
||||||
Gdk::Rectangle r (xroot, at - 1, controls_width + (int) canvas_width, 3);
|
Gdk::Rectangle r (0, at - 1, controls_width + (int) canvas_width, 3);
|
||||||
win->invalidate_rect (r, true);
|
win->invalidate_rect (r, true);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
@ -5063,7 +5051,7 @@ Editor::on_expose_event (GdkEventExpose* ev)
|
||||||
GdkRectangle lr;
|
GdkRectangle lr;
|
||||||
GdkRectangle intersection;
|
GdkRectangle intersection;
|
||||||
|
|
||||||
lr.x = xroot;
|
lr.x = 0;
|
||||||
lr.y = resize_line_y;
|
lr.y = resize_line_y;
|
||||||
lr.width = controls_width + (int) canvas_width;
|
lr.width = controls_width + (int) canvas_width;
|
||||||
lr.height = 3;
|
lr.height = 3;
|
||||||
|
|
@ -5084,15 +5072,17 @@ Editor::on_expose_event (GdkEventExpose* ev)
|
||||||
Gdk::JOIN_MITER);
|
Gdk::JOIN_MITER);
|
||||||
|
|
||||||
gdk_draw_line (win, gc->gobj(),
|
gdk_draw_line (win, gc->gobj(),
|
||||||
xroot,
|
0,
|
||||||
yroot + resize_line_y,
|
resize_line_y,
|
||||||
xroot + (int) canvas_width + controls_width,
|
(int) canvas_width + controls_width,
|
||||||
yroot + resize_line_y);
|
resize_line_y);
|
||||||
|
#if 0
|
||||||
cerr << "drew line @ " << xroot << ", " << yroot + resize_line_y
|
cerr << "drew line @ " << xroot << ", " << yroot + resize_line_y
|
||||||
<< " to " << xroot + (int) canvas_width + controls_width
|
<< " to " << xroot + (int) canvas_width + controls_width
|
||||||
<< ", " << yroot + resize_line_y
|
<< ", " << yroot + resize_line_y
|
||||||
<< endl;
|
<< endl;
|
||||||
old_resize_line_y = yroot + resize_line_y;
|
#endif
|
||||||
|
old_resize_line_y = resize_line_y;
|
||||||
cerr << "NEXT EXPOSE SHOULD BE AT " << old_resize_line_y << endl;
|
cerr << "NEXT EXPOSE SHOULD BE AT " << old_resize_line_y << endl;
|
||||||
} else {
|
} else {
|
||||||
cerr << "no intersect with "
|
cerr << "no intersect with "
|
||||||
|
|
|
||||||
|
|
@ -600,7 +600,6 @@ class Editor : public PublicEditor
|
||||||
Gdk::Cursor* which_grabber_cursor ();
|
Gdk::Cursor* which_grabber_cursor ();
|
||||||
|
|
||||||
ArdourCanvas::Canvas* track_canvas;
|
ArdourCanvas::Canvas* track_canvas;
|
||||||
ArdourCanvas::Canvas* time_canvas;
|
|
||||||
|
|
||||||
ArdourCanvas::Text* first_action_message;
|
ArdourCanvas::Text* first_action_message;
|
||||||
ArdourCanvas::Text* verbose_canvas_cursor;
|
ArdourCanvas::Text* verbose_canvas_cursor;
|
||||||
|
|
@ -620,7 +619,7 @@ class Editor : public PublicEditor
|
||||||
Gtk::EventBox time_canvas_event_box;
|
Gtk::EventBox time_canvas_event_box;
|
||||||
Gtk::EventBox track_canvas_event_box;
|
Gtk::EventBox track_canvas_event_box;
|
||||||
Gtk::EventBox time_button_event_box;
|
Gtk::EventBox time_button_event_box;
|
||||||
Gtk::Frame time_button_frame;
|
Gtk::EventBox ruler_label_event_box;
|
||||||
|
|
||||||
ArdourCanvas::Group *minsec_group;
|
ArdourCanvas::Group *minsec_group;
|
||||||
ArdourCanvas::Pixbuf *logo_item;
|
ArdourCanvas::Pixbuf *logo_item;
|
||||||
|
|
@ -633,6 +632,34 @@ class Editor : public PublicEditor
|
||||||
ArdourCanvas::Group *range_marker_group;
|
ArdourCanvas::Group *range_marker_group;
|
||||||
ArdourCanvas::Group *transport_marker_group;
|
ArdourCanvas::Group *transport_marker_group;
|
||||||
ArdourCanvas::Group* cd_marker_group;
|
ArdourCanvas::Group* cd_marker_group;
|
||||||
|
|
||||||
|
ArdourCanvas::Group* timebar_group;
|
||||||
|
|
||||||
|
/* These bars never need to be scrolled */
|
||||||
|
ArdourCanvas::Group* meter_bar_group;
|
||||||
|
ArdourCanvas::Group* tempo_bar_group;
|
||||||
|
ArdourCanvas::Group* marker_bar_group;
|
||||||
|
ArdourCanvas::Group* range_marker_bar_group;
|
||||||
|
ArdourCanvas::Group* transport_marker_bar_group;
|
||||||
|
ArdourCanvas::Group* cd_marker_bar_group;
|
||||||
|
|
||||||
|
/*
|
||||||
|
The _master_group is the group containing all items
|
||||||
|
that require horizontal scrolling..
|
||||||
|
It is primarily used to separate canvas items
|
||||||
|
that require horizontal scrolling from those that do not.
|
||||||
|
*/
|
||||||
|
ArdourCanvas::Group* _master_group;
|
||||||
|
/*
|
||||||
|
The _trackview_group is the group containing all trackviews.
|
||||||
|
It is only scrolled vertically.
|
||||||
|
*/
|
||||||
|
ArdourCanvas::Group* _trackview_group;
|
||||||
|
/*
|
||||||
|
This canvas group is used for region motion.
|
||||||
|
It sits on top of the _trackview_group
|
||||||
|
*/
|
||||||
|
ArdourCanvas::Group* _region_motion_group;
|
||||||
|
|
||||||
enum RulerType {
|
enum RulerType {
|
||||||
ruler_metric_smpte = 0,
|
ruler_metric_smpte = 0,
|
||||||
|
|
@ -755,6 +782,7 @@ class Editor : public PublicEditor
|
||||||
|
|
||||||
static const double timebar_height;
|
static const double timebar_height;
|
||||||
guint32 visible_timebars;
|
guint32 visible_timebars;
|
||||||
|
gdouble canvas_timebars_vsize;
|
||||||
Gtk::Menu *editor_ruler_menu;
|
Gtk::Menu *editor_ruler_menu;
|
||||||
|
|
||||||
ArdourCanvas::SimpleRect* tempo_bar;
|
ArdourCanvas::SimpleRect* tempo_bar;
|
||||||
|
|
@ -858,12 +886,12 @@ class Editor : public PublicEditor
|
||||||
nframes64_t last_canvas_frame;
|
nframes64_t last_canvas_frame;
|
||||||
|
|
||||||
bool track_canvas_map_handler (GdkEventAny*);
|
bool track_canvas_map_handler (GdkEventAny*);
|
||||||
bool time_canvas_map_handler (GdkEventAny*);
|
|
||||||
|
|
||||||
gint edit_controls_button_release (GdkEventButton*);
|
gint edit_controls_button_release (GdkEventButton*);
|
||||||
Gtk::Menu *edit_controls_left_menu;
|
Gtk::Menu *edit_controls_left_menu;
|
||||||
Gtk::Menu *edit_controls_right_menu;
|
Gtk::Menu *edit_controls_right_menu;
|
||||||
|
|
||||||
|
Gtk::VBox ruler_label_vbox;
|
||||||
Gtk::VBox track_canvas_vbox;
|
Gtk::VBox track_canvas_vbox;
|
||||||
Gtk::VBox time_canvas_vbox;
|
Gtk::VBox time_canvas_vbox;
|
||||||
Gtk::VBox edit_controls_vbox;
|
Gtk::VBox edit_controls_vbox;
|
||||||
|
|
@ -874,7 +902,11 @@ class Editor : public PublicEditor
|
||||||
bool deferred_control_scroll (nframes64_t);
|
bool deferred_control_scroll (nframes64_t);
|
||||||
sigc::connection control_scroll_connection;
|
sigc::connection control_scroll_connection;
|
||||||
|
|
||||||
|
gdouble get_trackview_group_vertical_offset () const { return vertical_adjustment.get_value () - canvas_timebars_vsize;}
|
||||||
|
ArdourCanvas::Group* get_trackview_group () const { return _trackview_group; }
|
||||||
void tie_vertical_scrolling ();
|
void tie_vertical_scrolling ();
|
||||||
|
void scroll_canvas_horizontally ();
|
||||||
|
void scroll_canvas_vertically ();
|
||||||
void canvas_horizontally_scrolled ();
|
void canvas_horizontally_scrolled ();
|
||||||
void canvas_scroll_to (nframes64_t);
|
void canvas_scroll_to (nframes64_t);
|
||||||
|
|
||||||
|
|
@ -1464,15 +1496,12 @@ public:
|
||||||
|
|
||||||
bool canvas_playhead_cursor_event (GdkEvent* event, ArdourCanvas::Item*);
|
bool canvas_playhead_cursor_event (GdkEvent* event, ArdourCanvas::Item*);
|
||||||
bool track_canvas_scroll (GdkEventScroll* event);
|
bool track_canvas_scroll (GdkEventScroll* event);
|
||||||
bool time_canvas_scroll (GdkEventScroll* event);
|
|
||||||
|
|
||||||
bool track_canvas_scroll_event (GdkEventScroll* event);
|
bool track_canvas_scroll_event (GdkEventScroll* event);
|
||||||
bool track_canvas_button_press_event (GdkEventButton* event);
|
bool track_canvas_button_press_event (GdkEventButton* event);
|
||||||
bool track_canvas_button_release_event (GdkEventButton* event);
|
bool track_canvas_button_release_event (GdkEventButton* event);
|
||||||
bool track_canvas_motion_notify_event (GdkEventMotion* event);
|
bool track_canvas_motion_notify_event (GdkEventMotion* event);
|
||||||
|
|
||||||
bool time_canvas_scroll_event (GdkEventScroll* event);
|
|
||||||
|
|
||||||
Gtk::Allocation canvas_allocation;
|
Gtk::Allocation canvas_allocation;
|
||||||
bool canvas_idle_queued;
|
bool canvas_idle_queued;
|
||||||
void track_canvas_allocate (Gtk::Allocation alloc);
|
void track_canvas_allocate (Gtk::Allocation alloc);
|
||||||
|
|
@ -1489,9 +1518,6 @@ public:
|
||||||
|
|
||||||
void handle_new_duration ();
|
void handle_new_duration ();
|
||||||
void initialize_canvas ();
|
void initialize_canvas ();
|
||||||
int canvas_hroizontally_scrolled_handler_id;
|
|
||||||
void reset_horizontally_scrolling_region (Gtk::Allocation* alloc = 0);
|
|
||||||
void reset_scrolling_region (Gtk::Allocation* alloc = 0);
|
|
||||||
|
|
||||||
/* display control */
|
/* display control */
|
||||||
|
|
||||||
|
|
@ -1505,11 +1531,12 @@ public:
|
||||||
|
|
||||||
ARDOUR::TempoMap::BBTPointList *current_bbt_points;
|
ARDOUR::TempoMap::BBTPointList *current_bbt_points;
|
||||||
|
|
||||||
|
typedef vector<ArdourCanvas::SimpleLine*> TimeLineList;
|
||||||
|
TimeLineList free_measure_lines;
|
||||||
|
TimeLineList used_measure_lines;
|
||||||
|
|
||||||
ArdourCanvas::Group* time_line_group;
|
ArdourCanvas::Group* time_line_group;
|
||||||
ArdourCanvas::Group* marker_time_line_group;
|
ArdourCanvas::SimpleLine* get_time_line ();
|
||||||
|
|
||||||
TempoLines* tempo_lines;
|
|
||||||
TempoLines* marker_tempo_lines;
|
|
||||||
|
|
||||||
void hide_measures ();
|
void hide_measures ();
|
||||||
void draw_measures ();
|
void draw_measures ();
|
||||||
|
|
@ -1887,12 +1914,13 @@ public:
|
||||||
uint32_t autoscroll_cnt;
|
uint32_t autoscroll_cnt;
|
||||||
nframes64_t autoscroll_x_distance;
|
nframes64_t autoscroll_x_distance;
|
||||||
double autoscroll_y_distance;
|
double autoscroll_y_distance;
|
||||||
|
|
||||||
static gint _autoscroll_canvas (void *);
|
static gint _autoscroll_canvas (void *);
|
||||||
bool autoscroll_canvas ();
|
bool autoscroll_canvas ();
|
||||||
void start_canvas_autoscroll (int x, int y);
|
void start_canvas_autoscroll (int x, int y);
|
||||||
void stop_canvas_autoscroll ();
|
void stop_canvas_autoscroll ();
|
||||||
void maybe_autoscroll (GdkEventMotion*);
|
void maybe_autoscroll (GdkEventMotion*);
|
||||||
|
void maybe_autoscroll_horizontally (GdkEventMotion*);
|
||||||
bool allow_vertical_scroll;
|
bool allow_vertical_scroll;
|
||||||
|
|
||||||
/* trimming */
|
/* trimming */
|
||||||
|
|
|
||||||
|
|
@ -100,10 +100,8 @@ Editor::initialize_canvas ()
|
||||||
{
|
{
|
||||||
if (getenv ("ARDOUR_NON_AA_CANVAS")) {
|
if (getenv ("ARDOUR_NON_AA_CANVAS")) {
|
||||||
track_canvas = new ArdourCanvas::Canvas ();
|
track_canvas = new ArdourCanvas::Canvas ();
|
||||||
time_canvas = new ArdourCanvas::Canvas ();
|
|
||||||
} else {
|
} else {
|
||||||
track_canvas = new ArdourCanvas::CanvasAA ();
|
track_canvas = new ArdourCanvas::CanvasAA ();
|
||||||
time_canvas = new ArdourCanvas::CanvasAA ();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ArdourCanvas::init ();
|
ArdourCanvas::init ();
|
||||||
|
|
@ -112,7 +110,7 @@ Editor::initialize_canvas ()
|
||||||
/* don't try to center the canvas */
|
/* don't try to center the canvas */
|
||||||
|
|
||||||
track_canvas->set_center_scroll_region (false);
|
track_canvas->set_center_scroll_region (false);
|
||||||
track_canvas->set_dither (Gdk::RGB_DITHER_NONE);
|
track_canvas->set_dither (Gdk::RGB_DITHER_NONE);
|
||||||
|
|
||||||
/* need to handle 4 specific types of events as catch-alls */
|
/* need to handle 4 specific types of events as catch-alls */
|
||||||
|
|
||||||
|
|
@ -121,9 +119,6 @@ Editor::initialize_canvas ()
|
||||||
track_canvas->signal_button_press_event().connect (mem_fun (*this, &Editor::track_canvas_button_press_event));
|
track_canvas->signal_button_press_event().connect (mem_fun (*this, &Editor::track_canvas_button_press_event));
|
||||||
track_canvas->signal_button_release_event().connect (mem_fun (*this, &Editor::track_canvas_button_release_event));
|
track_canvas->signal_button_release_event().connect (mem_fun (*this, &Editor::track_canvas_button_release_event));
|
||||||
|
|
||||||
/* just scroll stuff for the timecanvas */
|
|
||||||
time_canvas->signal_scroll_event().connect (mem_fun (*this, &Editor::time_canvas_scroll_event));
|
|
||||||
|
|
||||||
track_canvas->set_name ("EditorMainCanvas");
|
track_canvas->set_name ("EditorMainCanvas");
|
||||||
track_canvas->add_events (Gdk::POINTER_MOTION_HINT_MASK|Gdk::SCROLL_MASK);
|
track_canvas->add_events (Gdk::POINTER_MOTION_HINT_MASK|Gdk::SCROLL_MASK);
|
||||||
track_canvas->signal_leave_notify_event().connect (mem_fun(*this, &Editor::left_track_canvas));
|
track_canvas->signal_leave_notify_event().connect (mem_fun(*this, &Editor::left_track_canvas));
|
||||||
|
|
@ -166,97 +161,100 @@ Editor::initialize_canvas ()
|
||||||
// logo_item->property_width_set() = true;
|
// logo_item->property_width_set() = true;
|
||||||
logo_item->show ();
|
logo_item->show ();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* a group to hold time (measure) lines */
|
|
||||||
|
|
||||||
time_line_group = new ArdourCanvas::Group (*track_canvas->root(), 0.0, 0.0);
|
|
||||||
tempo_lines = new TempoLines(*track_canvas, time_line_group);
|
|
||||||
cursor_group = new ArdourCanvas::Group (*track_canvas->root(), 0.0, 0.0);
|
|
||||||
|
|
||||||
time_canvas->set_name ("EditorTimeCanvas");
|
_master_group = new ArdourCanvas::Group (*track_canvas->root());
|
||||||
time_canvas->add_events (Gdk::POINTER_MOTION_HINT_MASK);
|
|
||||||
time_canvas->set_flags (CAN_FOCUS);
|
|
||||||
time_canvas->set_center_scroll_region (false);
|
|
||||||
time_canvas->set_dither (Gdk::RGB_DITHER_NONE);
|
|
||||||
|
|
||||||
marker_time_line_group = new ArdourCanvas::Group (*time_canvas->root(), 0.0, 0.0);
|
|
||||||
marker_tempo_lines = new TempoLines(*time_canvas, marker_time_line_group);
|
|
||||||
meter_group = new ArdourCanvas::Group (*time_canvas->root(), 0.0, 0.0);
|
|
||||||
tempo_group = new ArdourCanvas::Group (*time_canvas->root(), 0.0, timebar_height);
|
|
||||||
range_marker_group = new ArdourCanvas::Group (*time_canvas->root(), 0.0, timebar_height * 2.0);
|
|
||||||
transport_marker_group = new ArdourCanvas::Group (*time_canvas->root(), 0.0, timebar_height * 3.0);
|
|
||||||
marker_group = new ArdourCanvas::Group (*time_canvas->root(), 0.0, timebar_height * 4.0);
|
|
||||||
cd_marker_group = new ArdourCanvas::Group (*time_canvas->root(), 0.0, timebar_height * 5.0);
|
|
||||||
|
|
||||||
tempo_bar = new ArdourCanvas::SimpleRect (*tempo_group, 0.0, 0.0, max_canvas_coordinate, timebar_height-1.0);
|
|
||||||
|
|
||||||
tempo_bar->property_outline_what() = (0x1 | 0x8);
|
_trackview_group = new ArdourCanvas::Group (*_master_group);
|
||||||
tempo_bar->property_outline_pixels() = 1;
|
_region_motion_group = new ArdourCanvas::Group (*_master_group);
|
||||||
|
|
||||||
meter_bar = new ArdourCanvas::SimpleRect (*meter_group, 0.0, 0.0, max_canvas_coordinate, timebar_height-1.0);
|
meter_bar_group = new ArdourCanvas::Group (*track_canvas->root());
|
||||||
|
meter_bar = new ArdourCanvas::SimpleRect (*meter_bar_group, 0.0, 0.0, 100, timebar_height);
|
||||||
|
|
||||||
meter_bar->property_outline_what() = (0x1 | 0x8);
|
meter_bar->property_outline_what() = (0x1 | 0x8);
|
||||||
meter_bar->property_outline_pixels() = 1;
|
meter_bar->property_outline_pixels() = 1;
|
||||||
|
|
||||||
marker_bar = new ArdourCanvas::SimpleRect (*marker_group, 0.0, 0.0, max_canvas_coordinate, timebar_height-1.0);
|
|
||||||
|
|
||||||
marker_bar->property_outline_what() = (0x1 | 0x8);
|
tempo_bar_group = new ArdourCanvas::Group (*track_canvas->root());
|
||||||
marker_bar->property_outline_pixels() = 1;
|
tempo_bar = new ArdourCanvas::SimpleRect (*tempo_bar_group, 0.0, 0.0, 100, (timebar_height));
|
||||||
|
tempo_bar->property_outline_what() = (0x1 | 0x8);
|
||||||
|
tempo_bar->property_outline_pixels() = 0;
|
||||||
|
|
||||||
cd_marker_bar = new ArdourCanvas::SimpleRect (*cd_marker_group, 0.0, 0.0, max_canvas_coordinate, timebar_height-1.0);
|
range_marker_bar_group = new ArdourCanvas::Group (*track_canvas->root());
|
||||||
|
range_marker_bar = new ArdourCanvas::SimpleRect (*range_marker_bar_group, 0.0, 0.0, 100, (timebar_height));
|
||||||
cd_marker_bar->property_outline_what() = (0x1 | 0x8);
|
|
||||||
cd_marker_bar->property_outline_pixels() = 1;
|
|
||||||
|
|
||||||
range_marker_bar = new ArdourCanvas::SimpleRect (*range_marker_group, 0.0, 0.0, max_canvas_coordinate, timebar_height-1.0);
|
|
||||||
|
|
||||||
range_marker_bar->property_outline_what() = (0x1 | 0x8);
|
range_marker_bar->property_outline_what() = (0x1 | 0x8);
|
||||||
range_marker_bar->property_outline_pixels() = 1;
|
range_marker_bar->property_outline_pixels() = 1;
|
||||||
|
|
||||||
transport_marker_bar = new ArdourCanvas::SimpleRect (*transport_marker_group, 0.0, 0.0, max_canvas_coordinate, timebar_height-1.0);
|
transport_marker_bar_group = new ArdourCanvas::Group (*track_canvas->root());
|
||||||
|
transport_marker_bar = new ArdourCanvas::SimpleRect (*transport_marker_bar_group, 0.0, 0.0, 100, (timebar_height));
|
||||||
transport_marker_bar->property_outline_what() = (0x1 | 0x8);
|
transport_marker_bar->property_outline_what() = (0x1 | 0x8);
|
||||||
transport_marker_bar->property_outline_pixels() = 1;
|
transport_marker_bar->property_outline_pixels() = 1;
|
||||||
|
|
||||||
|
marker_bar_group = new ArdourCanvas::Group (*track_canvas->root());
|
||||||
|
marker_bar = new ArdourCanvas::SimpleRect (*marker_bar_group, 0.0, 0.0, 100, (timebar_height));
|
||||||
|
marker_bar->property_outline_what() = (0x1 | 0x8);
|
||||||
|
marker_bar->property_outline_pixels() = 0;
|
||||||
|
|
||||||
cd_marker_bar_drag_rect = new ArdourCanvas::SimpleRect (*cd_marker_group, 0.0, 0.0, max_canvas_coordinate, timebar_height-1.0);
|
cd_marker_bar_group = new ArdourCanvas::Group (*track_canvas->root());
|
||||||
cd_marker_bar_drag_rect->property_outline_pixels() = 0;
|
cd_marker_bar = new ArdourCanvas::SimpleRect (*cd_marker_bar_group, 0.0, 0.0, 100, (timebar_height));
|
||||||
cd_marker_bar_drag_rect->hide ();
|
cd_marker_bar->property_outline_what() = (0x1 | 0x8);
|
||||||
|
cd_marker_bar->property_outline_pixels() = 0;
|
||||||
|
|
||||||
range_bar_drag_rect = new ArdourCanvas::SimpleRect (*range_marker_group, 0.0, 0.0, max_canvas_coordinate, timebar_height-1.0);
|
|
||||||
range_bar_drag_rect->property_outline_pixels() = 0;
|
|
||||||
|
|
||||||
transport_bar_drag_rect = new ArdourCanvas::SimpleRect (*transport_marker_group, 0.0, 0.0, max_canvas_coordinate, timebar_height-1.0);
|
/* a group to hold time (measure) lines */
|
||||||
transport_bar_drag_rect->property_outline_pixels() = 0;
|
|
||||||
transport_bar_drag_rect->hide ();
|
|
||||||
|
|
||||||
marker_drag_line_points.push_back(Gnome::Art::Point(0.0, 0.0));
|
time_line_group = new ArdourCanvas::Group (*_master_group, 0.0, 0.0);
|
||||||
marker_drag_line_points.push_back(Gnome::Art::Point(0.0, 0.0));
|
|
||||||
|
|
||||||
marker_drag_line = new ArdourCanvas::Line (*track_canvas->root());
|
range_marker_drag_rect = new ArdourCanvas::SimpleRect (*time_line_group, 0.0, 0.0, 0.0, 0.0);
|
||||||
|
//range_marker_drag_rect = new ArdourCanvas::SimpleRect (*_master_group, 0.0, 0.0, 0.0, 0.0);
|
||||||
|
range_marker_drag_rect->hide ();
|
||||||
|
|
||||||
|
timebar_group = new ArdourCanvas::Group (*track_canvas->root());
|
||||||
|
cursor_group = new ArdourCanvas::Group (*track_canvas->root(), 0.0, 0.0);
|
||||||
|
|
||||||
|
meter_group = new ArdourCanvas::Group (*timebar_group, 0.0, timebar_height * 5.0);
|
||||||
|
tempo_group = new ArdourCanvas::Group (*timebar_group, 0.0, timebar_height * 4.0);
|
||||||
|
range_marker_group = new ArdourCanvas::Group (*timebar_group, 0.0, timebar_height * 3.0);
|
||||||
|
transport_marker_group = new ArdourCanvas::Group (*timebar_group, 0.0, timebar_height * 2.0);
|
||||||
|
marker_group = new ArdourCanvas::Group (*timebar_group, 0.0, timebar_height);
|
||||||
|
cd_marker_group = new ArdourCanvas::Group (*timebar_group, 0.0, 0.0);
|
||||||
|
|
||||||
|
marker_drag_line_points.push_back(Gnome::Art::Point(0.0, 0.0));
|
||||||
|
marker_drag_line_points.push_back(Gnome::Art::Point(0.0, 1.0));
|
||||||
|
|
||||||
|
marker_drag_line = new ArdourCanvas::Line (*timebar_group);
|
||||||
marker_drag_line->property_width_pixels() = 1;
|
marker_drag_line->property_width_pixels() = 1;
|
||||||
marker_drag_line->property_points() = marker_drag_line_points;
|
marker_drag_line->property_points() = marker_drag_line_points;
|
||||||
marker_drag_line->hide();
|
marker_drag_line->hide();
|
||||||
|
|
||||||
range_marker_drag_rect = new ArdourCanvas::SimpleRect (*track_canvas->root(), 0.0, 0.0, 0.0, 0.0);
|
cd_marker_bar_drag_rect = new ArdourCanvas::SimpleRect (*cd_marker_group, 0.0, 0.0, 100, timebar_height);
|
||||||
range_marker_drag_rect->hide ();
|
cd_marker_bar_drag_rect->property_outline_pixels() = 0;
|
||||||
|
cd_marker_bar_drag_rect->hide ();
|
||||||
transport_loop_range_rect = new ArdourCanvas::SimpleRect (*time_line_group, 0.0, 0.0, 0.0, 0.0);
|
|
||||||
|
range_bar_drag_rect = new ArdourCanvas::SimpleRect (*range_marker_group, 0.0, 0.0, 100, timebar_height);
|
||||||
|
range_bar_drag_rect->property_outline_pixels() = 0;
|
||||||
|
|
||||||
|
transport_bar_drag_rect = new ArdourCanvas::SimpleRect (*transport_marker_group, 0.0, 0.0, 100, timebar_height);
|
||||||
|
transport_bar_drag_rect->property_outline_pixels() = 0;
|
||||||
|
transport_bar_drag_rect->hide ();
|
||||||
|
|
||||||
|
transport_loop_range_rect = new ArdourCanvas::SimpleRect (*_master_group, 0.0, 0.0, 0.0, 0.0);
|
||||||
transport_loop_range_rect->property_outline_pixels() = 1;
|
transport_loop_range_rect->property_outline_pixels() = 1;
|
||||||
transport_loop_range_rect->hide();
|
transport_loop_range_rect->hide();
|
||||||
|
|
||||||
transport_punch_range_rect = new ArdourCanvas::SimpleRect (*time_line_group, 0.0, 0.0, 0.0, 0.0);
|
transport_punch_range_rect = new ArdourCanvas::SimpleRect (*_master_group, 0.0, 0.0, 0.0, 0.0);
|
||||||
transport_punch_range_rect->property_outline_pixels() = 0;
|
transport_punch_range_rect->property_outline_pixels() = 0;
|
||||||
transport_punch_range_rect->hide();
|
transport_punch_range_rect->hide();
|
||||||
|
|
||||||
transport_loop_range_rect->lower_to_bottom (); // loop on the bottom
|
transport_loop_range_rect->lower_to_bottom (); // loop on the bottom
|
||||||
|
|
||||||
transport_punchin_line = new ArdourCanvas::SimpleLine (*time_line_group);
|
transport_punchin_line = new ArdourCanvas::SimpleLine (*_master_group);
|
||||||
transport_punchin_line->property_x1() = 0.0;
|
transport_punchin_line->property_x1() = 0.0;
|
||||||
transport_punchin_line->property_y1() = 0.0;
|
transport_punchin_line->property_y1() = 0.0;
|
||||||
transport_punchin_line->property_x2() = 0.0;
|
transport_punchin_line->property_x2() = 0.0;
|
||||||
transport_punchin_line->property_y2() = 0.0;
|
transport_punchin_line->property_y2() = 0.0;
|
||||||
transport_punchin_line->hide ();
|
transport_punchin_line->hide ();
|
||||||
|
|
||||||
transport_punchout_line = new ArdourCanvas::SimpleLine (*time_line_group);
|
transport_punchout_line = new ArdourCanvas::SimpleLine (*_master_group);
|
||||||
transport_punchout_line->property_x1() = 0.0;
|
transport_punchout_line->property_x1() = 0.0;
|
||||||
transport_punchout_line->property_y1() = 0.0;
|
transport_punchout_line->property_y1() = 0.0;
|
||||||
transport_punchout_line->property_x2() = 0.0;
|
transport_punchout_line->property_x2() = 0.0;
|
||||||
|
|
@ -264,14 +262,15 @@ Editor::initialize_canvas ()
|
||||||
transport_punchout_line->hide();
|
transport_punchout_line->hide();
|
||||||
|
|
||||||
// used to show zoom mode active zooming
|
// used to show zoom mode active zooming
|
||||||
zoom_rect = new ArdourCanvas::SimpleRect (*track_canvas->root(), 0.0, 0.0, 0.0, 0.0);
|
zoom_rect = new ArdourCanvas::SimpleRect (*_master_group, 0.0, 0.0, 0.0, 0.0);
|
||||||
zoom_rect->property_outline_pixels() = 1;
|
zoom_rect->property_outline_pixels() = 1;
|
||||||
zoom_rect->hide();
|
zoom_rect->hide();
|
||||||
|
|
||||||
zoom_rect->signal_event().connect (bind (mem_fun (*this, &Editor::canvas_zoom_rect_event), (ArdourCanvas::Item*) 0));
|
zoom_rect->signal_event().connect (bind (mem_fun (*this, &Editor::canvas_zoom_rect_event), (ArdourCanvas::Item*) 0));
|
||||||
|
|
||||||
// used as rubberband rect
|
// used as rubberband rect
|
||||||
rubberband_rect = new ArdourCanvas::SimpleRect (*track_canvas->root(), 0.0, 0.0, 0.0, 0.0);
|
rubberband_rect = new ArdourCanvas::SimpleRect (*_trackview_group, 0.0, 0.0, 0.0, 0.0);
|
||||||
|
|
||||||
rubberband_rect->property_outline_pixels() = 1;
|
rubberband_rect->property_outline_pixels() = 1;
|
||||||
rubberband_rect->hide();
|
rubberband_rect->hide();
|
||||||
|
|
||||||
|
|
@ -284,10 +283,6 @@ Editor::initialize_canvas ()
|
||||||
|
|
||||||
ZoomChanged.connect (bind (mem_fun(*this, &Editor::update_loop_range_view), false));
|
ZoomChanged.connect (bind (mem_fun(*this, &Editor::update_loop_range_view), false));
|
||||||
ZoomChanged.connect (bind (mem_fun(*this, &Editor::update_punch_range_view), false));
|
ZoomChanged.connect (bind (mem_fun(*this, &Editor::update_punch_range_view), false));
|
||||||
|
|
||||||
double time_height = timebar_height * 5;
|
|
||||||
double time_width = FLT_MAX/frames_per_unit;
|
|
||||||
time_canvas->set_scroll_region(0.0, 0.0, time_width, time_height);
|
|
||||||
|
|
||||||
playhead_cursor = new Cursor (*this, &Editor::canvas_playhead_cursor_event);
|
playhead_cursor = new Cursor (*this, &Editor::canvas_playhead_cursor_event);
|
||||||
|
|
||||||
|
|
@ -343,72 +338,47 @@ Editor::track_canvas_size_allocated ()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
full_canvas_height = height;
|
full_canvas_height = height + canvas_timebars_vsize;
|
||||||
}
|
}
|
||||||
|
|
||||||
zoom_range_clock.set ((nframes64_t) floor ((canvas_width * frames_per_unit)));
|
zoom_range_clock.set ((nframes64_t) floor ((canvas_width * frames_per_unit)));
|
||||||
playhead_cursor->set_position (playhead_cursor->current_frame);
|
playhead_cursor->set_position (playhead_cursor->current_frame);
|
||||||
|
|
||||||
|
horizontal_adjustment.set_upper (session->current_end_frame()/frames_per_unit);
|
||||||
|
horizontal_adjustment.set_page_size (current_page_frames()/frames_per_unit);
|
||||||
|
|
||||||
reset_hscrollbar_stepping ();
|
reset_hscrollbar_stepping ();
|
||||||
reset_scrolling_region ();
|
|
||||||
|
|
||||||
if (playhead_cursor) playhead_cursor->set_length (canvas_height);
|
if (playhead_cursor) {
|
||||||
|
playhead_cursor->set_length (canvas_height);
|
||||||
|
}
|
||||||
|
|
||||||
double y1 = vertical_adjustment.get_value ();
|
vertical_adjustment.set_page_size (canvas_height);
|
||||||
|
|
||||||
for (MarkerSelection::iterator x = selection->markers.begin(); x != selection->markers.end(); ++x) {
|
for (MarkerSelection::iterator x = selection->markers.begin(); x != selection->markers.end(); ++x) {
|
||||||
(*x)->set_line_vpos (y1, canvas_height);
|
(*x)->set_line_vpos (0, canvas_height);
|
||||||
}
|
}
|
||||||
|
|
||||||
range_marker_drag_rect->property_y1() = y1;
|
marker_drag_line_points.back().set_y(canvas_height);
|
||||||
range_marker_drag_rect->property_y2() = full_canvas_height;
|
|
||||||
transport_loop_range_rect->property_y1() = y1;
|
|
||||||
transport_loop_range_rect->property_y2() = full_canvas_height;
|
|
||||||
transport_punch_range_rect->property_y1() = y1;
|
|
||||||
transport_punch_range_rect->property_y2() = full_canvas_height;
|
|
||||||
transport_punchin_line->property_y1() = y1;
|
|
||||||
transport_punchin_line->property_y2() = full_canvas_height;
|
|
||||||
transport_punchout_line->property_y1() = y1;
|
|
||||||
transport_punchout_line->property_y2() = full_canvas_height;
|
|
||||||
|
|
||||||
update_fixed_rulers();
|
|
||||||
redisplay_tempo (true);
|
|
||||||
|
|
||||||
Resized (); /* EMIT_SIGNAL */
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
Editor::reset_scrolling_region (Gtk::Allocation* alloc)
|
|
||||||
{
|
|
||||||
TreeModel::Children rows = route_display_model->children();
|
|
||||||
TreeModel::Children::iterator i;
|
|
||||||
double pos;
|
|
||||||
|
|
||||||
for (pos = 0, i = rows.begin(); i != rows.end(); ++i) {
|
|
||||||
TimeAxisView *tv = (*i)[route_display_columns.tv];
|
|
||||||
if (tv != 0 && !tv->hidden()) {
|
|
||||||
pos += tv->effective_height;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
double last_canvas_unit = max ((last_canvas_frame / frames_per_unit), canvas_width);
|
|
||||||
//cerr << "Editor::reset_scrolling_region () lcf:fpu:cw:lcu " << last_canvas_frame << ":" << frames_per_unit << ":" << canvas_width << ":" << last_canvas_unit << endl;//DEBUG
|
|
||||||
track_canvas->set_scroll_region (0.0, 0.0, last_canvas_unit, pos);
|
|
||||||
|
|
||||||
// XXX what is the correct height value for the time canvas ? this overstates it
|
|
||||||
time_canvas->set_scroll_region ( 0.0, 0.0, last_canvas_unit, canvas_height);
|
|
||||||
|
|
||||||
range_marker_drag_rect->property_y2() = canvas_height;
|
range_marker_drag_rect->property_y2() = canvas_height;
|
||||||
transport_loop_range_rect->property_y2() = canvas_height;
|
transport_loop_range_rect->property_y2() = canvas_height;
|
||||||
transport_punch_range_rect->property_y2() = canvas_height;
|
transport_punch_range_rect->property_y2() = canvas_height;
|
||||||
transport_punchin_line->property_y2() = canvas_height;
|
transport_punchin_line->property_y2() = canvas_height;
|
||||||
transport_punchout_line->property_y2() = canvas_height;
|
transport_punchout_line->property_y2() = canvas_height;
|
||||||
|
|
||||||
update_punch_range_view (true);
|
tempo_bar->property_x2() = canvas_width;
|
||||||
|
meter_bar->property_x2() = canvas_width;
|
||||||
|
marker_bar->property_x2() = canvas_width;
|
||||||
|
cd_marker_bar->property_x2() = canvas_width;
|
||||||
|
range_marker_bar->property_x2() = canvas_width;
|
||||||
|
transport_marker_bar->property_x2() = canvas_width;
|
||||||
|
|
||||||
controls_layout.queue_resize();
|
update_fixed_rulers();
|
||||||
|
redisplay_tempo (true);
|
||||||
|
|
||||||
|
Resized (); /* EMIT_SIGNAL */
|
||||||
|
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
@ -446,7 +416,18 @@ Editor::controls_layout_size_request (Requisition* req)
|
||||||
controls_layout.set_size (edit_controls_vbox.get_width(), (gint) pos);
|
controls_layout.set_size (edit_controls_vbox.get_width(), (gint) pos);
|
||||||
controls_layout.set_size_request(edit_controls_vbox.get_width(), -1);
|
controls_layout.set_size_request(edit_controls_vbox.get_width(), -1);
|
||||||
zoom_box.set_size_request(edit_controls_vbox.get_width(), -1);
|
zoom_box.set_size_request(edit_controls_vbox.get_width(), -1);
|
||||||
time_button_frame.set_size_request(edit_controls_vbox.get_width(), -1);
|
time_button_event_box.set_size_request(edit_controls_vbox.get_width(), -1);
|
||||||
|
|
||||||
|
if ((vertical_adjustment.get_value() + canvas_height) >= vertical_adjustment.get_upper()) {
|
||||||
|
/*
|
||||||
|
We're increasing the size of the canvas while the bottom is visible.
|
||||||
|
We scroll down to keep in step with the controls layout.
|
||||||
|
*/
|
||||||
|
vertical_adjustment.set_upper (pos + canvas_timebars_vsize);
|
||||||
|
vertical_adjustment.set_value (pos + canvas_timebars_vsize - canvas_height);
|
||||||
|
} else {
|
||||||
|
vertical_adjustment.set_upper (pos + canvas_timebars_vsize);
|
||||||
|
}
|
||||||
|
|
||||||
//cerr << "sizes = " << req->width << " " << edit_controls_vbox.get_width() << " " << controls_layout.get_width() << " " << zoom_box.get_width() << " " << time_button_frame.get_width() << endl;//DEBUG
|
//cerr << "sizes = " << req->width << " " << edit_controls_vbox.get_width() << " " << controls_layout.get_width() << " " << zoom_box.get_width() << " " << time_button_frame.get_width() << endl;//DEBUG
|
||||||
}
|
}
|
||||||
|
|
@ -458,13 +439,6 @@ Editor::track_canvas_map_handler (GdkEventAny* ev)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
|
||||||
Editor::time_canvas_map_handler (GdkEventAny* ev)
|
|
||||||
{
|
|
||||||
time_canvas->get_window()->set_cursor (*timebar_cursor);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
Editor::track_canvas_drag_data_received (const RefPtr<Gdk::DragContext>& context,
|
Editor::track_canvas_drag_data_received (const RefPtr<Gdk::DragContext>& context,
|
||||||
int x, int y,
|
int x, int y,
|
||||||
|
|
@ -509,8 +483,8 @@ Editor::drop_paths (const RefPtr<Gdk::DragContext>& context,
|
||||||
double wy;
|
double wy;
|
||||||
|
|
||||||
track_canvas->window_to_world (x, y, wx, wy);
|
track_canvas->window_to_world (x, y, wx, wy);
|
||||||
wx += horizontal_adjustment.get_value();
|
//wx += horizontal_adjustment.get_value();
|
||||||
wy += vertical_adjustment.get_value();
|
//wy += vertical_adjustment.get_value();
|
||||||
|
|
||||||
ev.type = GDK_BUTTON_RELEASE;
|
ev.type = GDK_BUTTON_RELEASE;
|
||||||
ev.button.x = wx;
|
ev.button.x = wx;
|
||||||
|
|
@ -596,16 +570,25 @@ Editor::maybe_autoscroll (GdkEventMotion* event)
|
||||||
nframes64_t frame = drag_info.current_pointer_frame;
|
nframes64_t frame = drag_info.current_pointer_frame;
|
||||||
bool startit = false;
|
bool startit = false;
|
||||||
double vertical_pos = vertical_adjustment.get_value();
|
double vertical_pos = vertical_adjustment.get_value();
|
||||||
|
double upper = vertical_adjustment.get_upper();
|
||||||
|
|
||||||
|
/*
|
||||||
|
adjust the event.y to take account of the bounds
|
||||||
|
of the _trackview_group
|
||||||
|
*/
|
||||||
|
|
||||||
|
double vsx1, vsx2, vsy1, vsy2;
|
||||||
|
_trackview_group->get_bounds (vsx1, vsy1, vsx2, vsy2);
|
||||||
|
|
||||||
autoscroll_y = 0;
|
autoscroll_y = 0;
|
||||||
autoscroll_x = 0;
|
autoscroll_x = 0;
|
||||||
|
|
||||||
if (event->y < vertical_pos) {
|
if ((event->y - vsy1) < vertical_pos) {
|
||||||
autoscroll_y = -1;
|
autoscroll_y = -1;
|
||||||
startit = true;
|
startit = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (event->y > vertical_pos + canvas_height) {
|
if ((event->y - vsy1) > (vertical_pos + canvas_height - canvas_timebars_vsize) && vertical_pos <= upper) {
|
||||||
autoscroll_y = 1;
|
autoscroll_y = 1;
|
||||||
startit = true;
|
startit = true;
|
||||||
}
|
}
|
||||||
|
|
@ -618,7 +601,6 @@ Editor::maybe_autoscroll (GdkEventMotion* event)
|
||||||
}
|
}
|
||||||
|
|
||||||
} else if (frame < leftmost_frame) {
|
} else if (frame < leftmost_frame) {
|
||||||
|
|
||||||
if (leftmost_frame > 0) {
|
if (leftmost_frame > 0) {
|
||||||
autoscroll_x = -1;
|
autoscroll_x = -1;
|
||||||
startit = true;
|
startit = true;
|
||||||
|
|
@ -642,6 +624,43 @@ Editor::maybe_autoscroll (GdkEventMotion* event)
|
||||||
last_autoscroll_y = autoscroll_y;
|
last_autoscroll_y = autoscroll_y;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
Editor::maybe_autoscroll_horizontally (GdkEventMotion* event)
|
||||||
|
{
|
||||||
|
nframes64_t rightmost_frame = leftmost_frame + current_page_frames();
|
||||||
|
nframes64_t frame = drag_info.current_pointer_frame;
|
||||||
|
bool startit = false;
|
||||||
|
|
||||||
|
autoscroll_y = 0;
|
||||||
|
autoscroll_x = 0;
|
||||||
|
|
||||||
|
if (frame > rightmost_frame) {
|
||||||
|
|
||||||
|
if (rightmost_frame < max_frames) {
|
||||||
|
autoscroll_x = 1;
|
||||||
|
startit = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
} else if (frame < leftmost_frame) {
|
||||||
|
if (leftmost_frame > 0) {
|
||||||
|
autoscroll_x = -1;
|
||||||
|
startit = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((autoscroll_x != last_autoscroll_x) || (autoscroll_y != last_autoscroll_y) || (autoscroll_x == 0 && autoscroll_y == 0)) {
|
||||||
|
stop_canvas_autoscroll ();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (startit && autoscroll_timeout_tag < 0) {
|
||||||
|
start_canvas_autoscroll (autoscroll_x, autoscroll_y);
|
||||||
|
}
|
||||||
|
|
||||||
|
last_autoscroll_x = autoscroll_x;
|
||||||
|
last_autoscroll_y = autoscroll_y;
|
||||||
|
}
|
||||||
|
|
||||||
gint
|
gint
|
||||||
Editor::_autoscroll_canvas (void *arg)
|
Editor::_autoscroll_canvas (void *arg)
|
||||||
{
|
{
|
||||||
|
|
@ -654,97 +673,9 @@ Editor::autoscroll_canvas ()
|
||||||
nframes64_t new_frame;
|
nframes64_t new_frame;
|
||||||
nframes64_t limit = max_frames - current_page_frames();
|
nframes64_t limit = max_frames - current_page_frames();
|
||||||
GdkEventMotion ev;
|
GdkEventMotion ev;
|
||||||
nframes64_t target_frame;
|
|
||||||
double new_pixel;
|
double new_pixel;
|
||||||
double target_pixel;
|
double target_pixel;
|
||||||
|
|
||||||
if (autoscroll_x < 0) {
|
|
||||||
if (leftmost_frame < autoscroll_x_distance) {
|
|
||||||
new_frame = 0;
|
|
||||||
} else {
|
|
||||||
new_frame = leftmost_frame - autoscroll_x_distance;
|
|
||||||
}
|
|
||||||
target_frame = drag_info.current_pointer_frame - autoscroll_x_distance;
|
|
||||||
} else if (autoscroll_x > 0) {
|
|
||||||
if (leftmost_frame > limit - autoscroll_x_distance) {
|
|
||||||
new_frame = limit;
|
|
||||||
} else {
|
|
||||||
new_frame = leftmost_frame + autoscroll_x_distance;
|
|
||||||
}
|
|
||||||
target_frame = drag_info.current_pointer_frame + autoscroll_x_distance;
|
|
||||||
} else {
|
|
||||||
target_frame = drag_info.current_pointer_frame;
|
|
||||||
new_frame = leftmost_frame;
|
|
||||||
}
|
|
||||||
|
|
||||||
double vertical_pos = vertical_adjustment.get_value();
|
|
||||||
|
|
||||||
if (autoscroll_y < 0) {
|
|
||||||
|
|
||||||
if (vertical_pos < autoscroll_y_distance) {
|
|
||||||
new_pixel = 0;
|
|
||||||
} else {
|
|
||||||
new_pixel = vertical_pos - autoscroll_y_distance;
|
|
||||||
}
|
|
||||||
|
|
||||||
target_pixel = drag_info.current_pointer_y - autoscroll_y_distance;
|
|
||||||
target_pixel = max (target_pixel, 0.0);
|
|
||||||
|
|
||||||
} else if (autoscroll_y > 0) {
|
|
||||||
|
|
||||||
double top_of_bottom_of_canvas = full_canvas_height - canvas_height;
|
|
||||||
|
|
||||||
if (vertical_pos > full_canvas_height - autoscroll_y_distance) {
|
|
||||||
new_pixel = full_canvas_height;
|
|
||||||
} else {
|
|
||||||
new_pixel = vertical_pos + autoscroll_y_distance;
|
|
||||||
}
|
|
||||||
|
|
||||||
new_pixel = min (top_of_bottom_of_canvas, new_pixel);
|
|
||||||
|
|
||||||
target_pixel = drag_info.current_pointer_y + autoscroll_y_distance;
|
|
||||||
|
|
||||||
/* don't move to the full canvas height because the item will be invisible
|
|
||||||
(its top edge will line up with the bottom of the visible canvas.
|
|
||||||
*/
|
|
||||||
|
|
||||||
target_pixel = min (target_pixel, full_canvas_height - 10);
|
|
||||||
|
|
||||||
} else {
|
|
||||||
target_pixel = drag_info.current_pointer_y;
|
|
||||||
new_pixel = vertical_pos;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* now fake a motion event to get the object that is being dragged to move too */
|
|
||||||
|
|
||||||
ev.type = GDK_MOTION_NOTIFY;
|
|
||||||
ev.state &= Gdk::BUTTON1_MASK;
|
|
||||||
ev.x = frame_to_unit (target_frame);
|
|
||||||
ev.y = target_pixel;
|
|
||||||
motion_handler (drag_info.item, (GdkEvent*) &ev, drag_info.item_type, true);
|
|
||||||
|
|
||||||
if ((new_frame == 0 || new_frame == limit) && (new_pixel == 0 || new_pixel == DBL_MAX)) {
|
|
||||||
/* we are done */
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
autoscroll_cnt++;
|
|
||||||
|
|
||||||
if (autoscroll_cnt == 1) {
|
|
||||||
|
|
||||||
/* connect the timeout so that we get called repeatedly */
|
|
||||||
|
|
||||||
autoscroll_timeout_tag = g_idle_add ( _autoscroll_canvas, this);
|
|
||||||
return false;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
if (new_frame != leftmost_frame) {
|
|
||||||
reset_x_origin (new_frame);
|
|
||||||
}
|
|
||||||
|
|
||||||
vertical_adjustment.set_value (new_pixel);
|
|
||||||
|
|
||||||
if (autoscroll_x_distance != 0) {
|
if (autoscroll_x_distance != 0) {
|
||||||
|
|
||||||
if (autoscroll_cnt == 50) { /* 0.5 seconds */
|
if (autoscroll_cnt == 50) { /* 0.5 seconds */
|
||||||
|
|
@ -786,6 +717,97 @@ Editor::autoscroll_canvas ()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (autoscroll_x < 0) {
|
||||||
|
if (leftmost_frame < autoscroll_x_distance) {
|
||||||
|
new_frame = 0;
|
||||||
|
} else {
|
||||||
|
new_frame = leftmost_frame - autoscroll_x_distance;
|
||||||
|
}
|
||||||
|
} else if (autoscroll_x > 0) {
|
||||||
|
if (leftmost_frame > limit - autoscroll_x_distance) {
|
||||||
|
new_frame = limit;
|
||||||
|
} else {
|
||||||
|
new_frame = leftmost_frame + autoscroll_x_distance;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
new_frame = leftmost_frame;
|
||||||
|
}
|
||||||
|
|
||||||
|
double vertical_pos = vertical_adjustment.get_value();
|
||||||
|
|
||||||
|
if (autoscroll_y < 0) {
|
||||||
|
|
||||||
|
if (vertical_pos < autoscroll_y_distance) {
|
||||||
|
new_pixel = 0;
|
||||||
|
} else {
|
||||||
|
new_pixel = vertical_pos - autoscroll_y_distance;
|
||||||
|
}
|
||||||
|
|
||||||
|
target_pixel = drag_info.current_pointer_y - autoscroll_y_distance;
|
||||||
|
target_pixel = max (target_pixel, 0.0);
|
||||||
|
|
||||||
|
} else if (autoscroll_y > 0) {
|
||||||
|
|
||||||
|
double top_of_bottom_of_canvas = full_canvas_height - canvas_height;
|
||||||
|
|
||||||
|
if (vertical_pos > full_canvas_height - autoscroll_y_distance) {
|
||||||
|
new_pixel = full_canvas_height;
|
||||||
|
} else {
|
||||||
|
new_pixel = vertical_pos + autoscroll_y_distance;
|
||||||
|
}
|
||||||
|
|
||||||
|
new_pixel = min (top_of_bottom_of_canvas, new_pixel);
|
||||||
|
|
||||||
|
target_pixel = drag_info.current_pointer_y + autoscroll_y_distance;
|
||||||
|
|
||||||
|
/* don't move to the full canvas height because the item will be invisible
|
||||||
|
(its top edge will line up with the bottom of the visible canvas.
|
||||||
|
*/
|
||||||
|
|
||||||
|
target_pixel = min (target_pixel, full_canvas_height - 10);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
target_pixel = drag_info.current_pointer_y;
|
||||||
|
new_pixel = vertical_pos;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
if ((new_frame == 0 || new_frame == limit) && (new_pixel == 0 || new_pixel == DBL_MAX)) {
|
||||||
|
/* we are done */
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (new_frame != leftmost_frame) {
|
||||||
|
reset_x_origin (new_frame);
|
||||||
|
}
|
||||||
|
|
||||||
|
vertical_adjustment.set_value (new_pixel);
|
||||||
|
|
||||||
|
/* fake an event. */
|
||||||
|
|
||||||
|
Glib::RefPtr<Gdk::Window> canvas_window = const_cast<Editor*>(this)->track_canvas->get_window();
|
||||||
|
gint x, y;
|
||||||
|
Gdk::ModifierType mask;
|
||||||
|
canvas_window->get_pointer (x, y, mask);
|
||||||
|
ev.type = GDK_MOTION_NOTIFY;
|
||||||
|
ev.state &= Gdk::BUTTON1_MASK;
|
||||||
|
ev.x = x;
|
||||||
|
ev.y = y;
|
||||||
|
|
||||||
|
motion_handler (drag_info.item, (GdkEvent*) &ev, drag_info.item_type, true);
|
||||||
|
|
||||||
|
autoscroll_cnt++;
|
||||||
|
|
||||||
|
if (autoscroll_cnt == 1) {
|
||||||
|
|
||||||
|
/* connect the timeout so that we get called repeatedly */
|
||||||
|
|
||||||
|
autoscroll_timeout_tag = g_idle_add ( _autoscroll_canvas, this);
|
||||||
|
return false;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -813,6 +835,7 @@ Editor::start_canvas_autoscroll (int dx, int dy)
|
||||||
void
|
void
|
||||||
Editor::stop_canvas_autoscroll ()
|
Editor::stop_canvas_autoscroll ()
|
||||||
{
|
{
|
||||||
|
|
||||||
if (autoscroll_timeout_tag >= 0) {
|
if (autoscroll_timeout_tag >= 0) {
|
||||||
g_source_remove (autoscroll_timeout_tag);
|
g_source_remove (autoscroll_timeout_tag);
|
||||||
autoscroll_timeout_tag = -1;
|
autoscroll_timeout_tag = -1;
|
||||||
|
|
@ -840,34 +863,49 @@ Editor::entered_track_canvas (GdkEventCrossing *ev)
|
||||||
void
|
void
|
||||||
Editor::tie_vertical_scrolling ()
|
Editor::tie_vertical_scrolling ()
|
||||||
{
|
{
|
||||||
double y1 = vertical_adjustment.get_value();
|
scroll_canvas_vertically ();
|
||||||
|
|
||||||
playhead_cursor->set_y_axis (y1);
|
|
||||||
|
|
||||||
range_marker_drag_rect->property_y1() = y1;
|
|
||||||
range_marker_drag_rect->property_y2() = full_canvas_height;
|
|
||||||
transport_loop_range_rect->property_y1() = y1;
|
|
||||||
transport_loop_range_rect->property_y2() = full_canvas_height;
|
|
||||||
transport_punch_range_rect->property_y1() = y1;
|
|
||||||
transport_punch_range_rect->property_y2() = full_canvas_height;
|
|
||||||
transport_punchin_line->property_y1() = y1;
|
|
||||||
transport_punchin_line->property_y2() = full_canvas_height;
|
|
||||||
transport_punchout_line->property_y1() = y1;
|
|
||||||
transport_punchout_line->property_y2() = full_canvas_height;
|
|
||||||
|
|
||||||
if (!selection->markers.empty()) {
|
|
||||||
for (MarkerSelection::iterator x = selection->markers.begin(); x != selection->markers.end(); ++x) {
|
|
||||||
(*x)->set_line_vpos (y1, canvas_height);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (logo_item) {
|
|
||||||
logo_item->property_y() = y1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* this will do an immediate redraw */
|
/* this will do an immediate redraw */
|
||||||
|
|
||||||
controls_layout.get_vadjustment()->set_value (y1);
|
controls_layout.get_vadjustment()->set_value (vertical_adjustment.get_value());
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
Editor::scroll_canvas_horizontally ()
|
||||||
|
{
|
||||||
|
nframes64_t time_origin = (nframes64_t) floor (horizontal_adjustment.get_value() * frames_per_unit);
|
||||||
|
|
||||||
|
if (time_origin != leftmost_frame) {
|
||||||
|
canvas_scroll_to (time_origin);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* horizontal scrolling only */
|
||||||
|
double x1, x2, y1, y2, x_delta;
|
||||||
|
|
||||||
|
_master_group->get_bounds(x1, y1, x2, y2);
|
||||||
|
x_delta = x1 + horizontal_adjustment.get_value();
|
||||||
|
|
||||||
|
_master_group->move (-x_delta, 0);
|
||||||
|
timebar_group->move (-x_delta, 0);
|
||||||
|
cursor_group->move (-x_delta, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
Editor::scroll_canvas_vertically ()
|
||||||
|
{
|
||||||
|
/* vertical scrolling only */
|
||||||
|
double x1, x2, y1, y2, y_delta;
|
||||||
|
|
||||||
|
_trackview_group->get_bounds(x1, y1, x2, y2);
|
||||||
|
y_delta = y1 + vertical_adjustment.get_value() - canvas_timebars_vsize;
|
||||||
|
|
||||||
|
_trackview_group->move (0, -y_delta);
|
||||||
|
_region_motion_group->move (0, -y_delta);
|
||||||
|
|
||||||
|
#ifndef GTKOSX
|
||||||
|
/* required to keep the controls_layout in lock step with the canvas group */
|
||||||
|
track_canvas->update_now ();
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
@ -884,18 +922,13 @@ void
|
||||||
Editor::canvas_scroll_to (nframes64_t time_origin)
|
Editor::canvas_scroll_to (nframes64_t time_origin)
|
||||||
{
|
{
|
||||||
leftmost_frame = time_origin;
|
leftmost_frame = time_origin;
|
||||||
|
|
||||||
nframes64_t rightmost_frame = leftmost_frame + current_page_frames ();
|
nframes64_t rightmost_frame = leftmost_frame + current_page_frames ();
|
||||||
|
|
||||||
if (rightmost_frame > last_canvas_frame) {
|
if (rightmost_frame > last_canvas_frame) {
|
||||||
last_canvas_frame = rightmost_frame;
|
last_canvas_frame = rightmost_frame;
|
||||||
reset_scrolling_region ();
|
//reset_scrolling_region ();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (logo_item) {
|
|
||||||
logo_item->property_x() = horizontal_adjustment.get_value ();
|
|
||||||
}
|
|
||||||
|
|
||||||
update_fixed_rulers ();
|
update_fixed_rulers ();
|
||||||
|
|
||||||
redisplay_tempo (!_dragging_hscrollbar);
|
redisplay_tempo (!_dragging_hscrollbar);
|
||||||
|
|
|
||||||
|
|
@ -72,9 +72,7 @@ Editor::track_canvas_scroll (GdkEventScroll* ev)
|
||||||
*/
|
*/
|
||||||
track_canvas->get_pointer (x, y);
|
track_canvas->get_pointer (x, y);
|
||||||
track_canvas->window_to_world (x, y, wx, wy);
|
track_canvas->window_to_world (x, y, wx, wy);
|
||||||
wx += horizontal_adjustment.get_value();
|
|
||||||
wy += vertical_adjustment.get_value();
|
|
||||||
|
|
||||||
GdkEvent event;
|
GdkEvent event;
|
||||||
event.type = GDK_BUTTON_RELEASE;
|
event.type = GDK_BUTTON_RELEASE;
|
||||||
event.button.x = wx;
|
event.button.x = wx;
|
||||||
|
|
@ -89,7 +87,7 @@ Editor::track_canvas_scroll (GdkEventScroll* ev)
|
||||||
} else if (Keyboard::modifier_state_equals (ev->state, Keyboard::TertiaryModifier)) {
|
} else if (Keyboard::modifier_state_equals (ev->state, Keyboard::TertiaryModifier)) {
|
||||||
if (!current_stepping_trackview) {
|
if (!current_stepping_trackview) {
|
||||||
step_timeout = Glib::signal_timeout().connect (mem_fun(*this, &Editor::track_height_step_timeout), 500);
|
step_timeout = Glib::signal_timeout().connect (mem_fun(*this, &Editor::track_height_step_timeout), 500);
|
||||||
if (!(current_stepping_trackview = trackview_by_y_position (ev->y))) {
|
if (!(current_stepping_trackview = trackview_by_y_position (ev->y + vertical_adjustment.get_value() - canvas_timebars_vsize))) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -110,9 +108,7 @@ Editor::track_canvas_scroll (GdkEventScroll* ev)
|
||||||
//if (ev->state == GDK_CONTROL_MASK) {
|
//if (ev->state == GDK_CONTROL_MASK) {
|
||||||
track_canvas->get_pointer (x, y);
|
track_canvas->get_pointer (x, y);
|
||||||
track_canvas->window_to_world (x, y, wx, wy);
|
track_canvas->window_to_world (x, y, wx, wy);
|
||||||
wx += horizontal_adjustment.get_value();
|
|
||||||
wy += vertical_adjustment.get_value();
|
|
||||||
|
|
||||||
GdkEvent event;
|
GdkEvent event;
|
||||||
event.type = GDK_BUTTON_RELEASE;
|
event.type = GDK_BUTTON_RELEASE;
|
||||||
event.button.x = wx;
|
event.button.x = wx;
|
||||||
|
|
@ -127,7 +123,7 @@ Editor::track_canvas_scroll (GdkEventScroll* ev)
|
||||||
} else if (Keyboard::modifier_state_equals (ev->state, Keyboard::TertiaryModifier)) {
|
} else if (Keyboard::modifier_state_equals (ev->state, Keyboard::TertiaryModifier)) {
|
||||||
if (!current_stepping_trackview) {
|
if (!current_stepping_trackview) {
|
||||||
step_timeout = Glib::signal_timeout().connect (mem_fun(*this, &Editor::track_height_step_timeout), 500);
|
step_timeout = Glib::signal_timeout().connect (mem_fun(*this, &Editor::track_height_step_timeout), 500);
|
||||||
if (!(current_stepping_trackview = trackview_by_y_position (ev->y))) {
|
if (!(current_stepping_trackview = trackview_by_y_position (ev->y + vertical_adjustment.get_value() - canvas_timebars_vsize))) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -177,55 +173,6 @@ Editor::track_canvas_scroll_event (GdkEventScroll *event)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
|
||||||
Editor::time_canvas_scroll (GdkEventScroll* ev)
|
|
||||||
{
|
|
||||||
nframes64_t xdelta;
|
|
||||||
int direction = ev->direction;
|
|
||||||
|
|
||||||
switch (direction) {
|
|
||||||
case GDK_SCROLL_UP:
|
|
||||||
temporal_zoom_step (true);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case GDK_SCROLL_DOWN:
|
|
||||||
temporal_zoom_step (false);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case GDK_SCROLL_LEFT:
|
|
||||||
xdelta = (current_page_frames() / 2);
|
|
||||||
if (leftmost_frame > xdelta) {
|
|
||||||
reset_x_origin (leftmost_frame - xdelta);
|
|
||||||
} else {
|
|
||||||
reset_x_origin (0);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case GDK_SCROLL_RIGHT:
|
|
||||||
xdelta = (current_page_frames() / 2);
|
|
||||||
if (max_frames - xdelta > leftmost_frame) {
|
|
||||||
reset_x_origin (leftmost_frame + xdelta);
|
|
||||||
} else {
|
|
||||||
reset_x_origin (max_frames - current_page_frames());
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
/* what? */
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool
|
|
||||||
Editor::time_canvas_scroll_event (GdkEventScroll *event)
|
|
||||||
{
|
|
||||||
time_canvas->grab_focus();
|
|
||||||
time_canvas_scroll (event);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool
|
bool
|
||||||
Editor::track_canvas_button_press_event (GdkEventButton *event)
|
Editor::track_canvas_button_press_event (GdkEventButton *event)
|
||||||
{
|
{
|
||||||
|
|
@ -260,10 +207,6 @@ Editor::track_canvas_motion (GdkEvent *ev)
|
||||||
verbose_canvas_cursor->property_y() = clamp_verbose_cursor_y (ev->motion.y + 20);
|
verbose_canvas_cursor->property_y() = clamp_verbose_cursor_y (ev->motion.y + 20);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef GTKOSX
|
|
||||||
flush_canvas ();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -38,8 +38,8 @@ Editor::Cursor::Cursor (Editor& ed, bool (Editor::*callbck)(GdkEvent*,ArdourCanv
|
||||||
|
|
||||||
/* "randomly" initialize coords */
|
/* "randomly" initialize coords */
|
||||||
|
|
||||||
points.push_back(Gnome::Art::Point(-9383839.0, 0.0));
|
|
||||||
points.push_back(Gnome::Art::Point(1.0, 0.0));
|
points.push_back(Gnome::Art::Point(1.0, 0.0));
|
||||||
|
points.push_back(Gnome::Art::Point(1.0, 1.0));
|
||||||
|
|
||||||
canvas_item.property_points() = points;
|
canvas_item.property_points() = points;
|
||||||
canvas_item.property_width_pixels() = 1;
|
canvas_item.property_width_pixels() = 1;
|
||||||
|
|
@ -51,7 +51,6 @@ Editor::Cursor::Cursor (Editor& ed, bool (Editor::*callbck)(GdkEvent*,ArdourCanv
|
||||||
|
|
||||||
canvas_item.set_data ("cursor", this);
|
canvas_item.set_data ("cursor", this);
|
||||||
canvas_item.signal_event().connect (bind (mem_fun (ed, callbck), &canvas_item));
|
canvas_item.signal_event().connect (bind (mem_fun (ed, callbck), &canvas_item));
|
||||||
|
|
||||||
current_frame = 1; /* force redraw at 0 */
|
current_frame = 1; /* force redraw at 0 */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -67,23 +66,15 @@ Editor::Cursor::set_position (nframes64_t frame)
|
||||||
|
|
||||||
if (editor.session == 0) {
|
if (editor.session == 0) {
|
||||||
canvas_item.hide();
|
canvas_item.hide();
|
||||||
} else {
|
|
||||||
canvas_item.show();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
current_frame = frame;
|
current_frame = frame;
|
||||||
|
|
||||||
if (new_pos != points.front().get_x()) {
|
if (new_pos != points.front().get_x()) {
|
||||||
|
|
||||||
points.front().set_x (new_pos);
|
points.front().set_x (new_pos);
|
||||||
points.back().set_x (new_pos);
|
points.back().set_x (new_pos);
|
||||||
|
|
||||||
canvas_item.property_points() = points;
|
canvas_item.property_points() = points;
|
||||||
|
|
||||||
ArdourCanvas::Points p = canvas_item.property_points();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
canvas_item.raise_to_top();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
@ -92,6 +83,9 @@ Editor::Cursor::set_length (double units)
|
||||||
length = units;
|
length = units;
|
||||||
points.back().set_y (points.front().get_y() + length);
|
points.back().set_y (points.front().get_y() + length);
|
||||||
canvas_item.property_points() = points;
|
canvas_item.property_points() = points;
|
||||||
|
if (editor.session != 0) {
|
||||||
|
canvas_item.show();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
|
||||||
|
|
@ -1243,7 +1243,7 @@ Editor::marker_selection_changed ()
|
||||||
}
|
}
|
||||||
|
|
||||||
for (MarkerSelection::iterator x = selection->markers.begin(); x != selection->markers.end(); ++x) {
|
for (MarkerSelection::iterator x = selection->markers.begin(); x != selection->markers.end(); ++x) {
|
||||||
(*x)->add_line (cursor_group, vertical_adjustment.get_value(), canvas_height);
|
(*x)->add_line (cursor_group, 0, canvas_height);
|
||||||
(*x)->show_line ();
|
(*x)->show_line ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -203,7 +203,7 @@ Editor::update_current_screen ()
|
||||||
|
|
||||||
if (_follow_playhead && session->requested_return_frame() < 0) {
|
if (_follow_playhead && session->requested_return_frame() < 0) {
|
||||||
|
|
||||||
playhead_cursor->canvas_item.show();
|
//playhead_cursor->canvas_item.show();
|
||||||
|
|
||||||
if (frame != last_update_frame) {
|
if (frame != last_update_frame) {
|
||||||
|
|
||||||
|
|
@ -259,7 +259,10 @@ Editor::update_current_screen ()
|
||||||
|
|
||||||
almost_done:
|
almost_done:
|
||||||
last_update_frame = frame;
|
last_update_frame = frame;
|
||||||
|
#ifdef GTKOSX
|
||||||
|
/*XXX in a perfect world we would not have to do this. */
|
||||||
|
track_canvas->update_now();
|
||||||
|
#endif
|
||||||
if (current_mixer_strip) {
|
if (current_mixer_strip) {
|
||||||
current_mixer_strip->fast_update ();
|
current_mixer_strip->fast_update ();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,4 @@
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Copyright (C) 2000-2001 Paul Davis
|
Copyright (C) 2000-2001 Paul Davis
|
||||||
|
|
||||||
|
|
@ -92,23 +93,15 @@ Editor::mouse_frame (nframes64_t& where, bool& in_track_canvas) const
|
||||||
pointer_window = canvas_window->get_pointer (x, y, mask);
|
pointer_window = canvas_window->get_pointer (x, y, mask);
|
||||||
|
|
||||||
if (pointer_window == track_canvas->get_bin_window()) {
|
if (pointer_window == track_canvas->get_bin_window()) {
|
||||||
|
wx = x;
|
||||||
track_canvas->window_to_world (x, y, wx, wy);
|
wy = y;
|
||||||
in_track_canvas = true;
|
in_track_canvas = true;
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
in_track_canvas = false;
|
in_track_canvas = false;
|
||||||
|
|
||||||
if (pointer_window == time_canvas->get_bin_window()) {
|
|
||||||
time_canvas->window_to_world (x, y, wx, wy);
|
|
||||||
} else {
|
|
||||||
return false;
|
return false;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
wx += horizontal_adjustment.get_value();
|
|
||||||
wy += vertical_adjustment.get_value();
|
|
||||||
|
|
||||||
GdkEvent event;
|
GdkEvent event;
|
||||||
event.type = GDK_BUTTON_RELEASE;
|
event.type = GDK_BUTTON_RELEASE;
|
||||||
event.button.x = wx;
|
event.button.x = wx;
|
||||||
|
|
@ -138,10 +131,16 @@ Editor::event_frame (GdkEvent* event, double* pcx, double* pcy) const
|
||||||
case GDK_BUTTON_PRESS:
|
case GDK_BUTTON_PRESS:
|
||||||
case GDK_2BUTTON_PRESS:
|
case GDK_2BUTTON_PRESS:
|
||||||
case GDK_3BUTTON_PRESS:
|
case GDK_3BUTTON_PRESS:
|
||||||
track_canvas->w2c(event->button.x, event->button.y, *pcx, *pcy);
|
|
||||||
|
*pcx = event->button.x;
|
||||||
|
*pcy = event->button.y;
|
||||||
|
_trackview_group->w2i(*pcx, *pcy);
|
||||||
break;
|
break;
|
||||||
case GDK_MOTION_NOTIFY:
|
case GDK_MOTION_NOTIFY:
|
||||||
track_canvas->w2c(event->motion.x, event->motion.y, *pcx, *pcy);
|
|
||||||
|
*pcx = event->motion.x;
|
||||||
|
*pcy = event->motion.y;
|
||||||
|
_trackview_group->w2i(*pcx, *pcy);
|
||||||
break;
|
break;
|
||||||
case GDK_ENTER_NOTIFY:
|
case GDK_ENTER_NOTIFY:
|
||||||
case GDK_LEAVE_NOTIFY:
|
case GDK_LEAVE_NOTIFY:
|
||||||
|
|
@ -227,9 +226,9 @@ Editor::which_grabber_cursor ()
|
||||||
return grabber_edit_point_cursor;
|
return grabber_edit_point_cursor;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
return grabber_cursor;
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
return grabber_cursor;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
@ -609,7 +608,6 @@ Editor::button_press_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemTyp
|
||||||
pointer_window = canvas_window->get_pointer (x, y, mask);
|
pointer_window = canvas_window->get_pointer (x, y, mask);
|
||||||
|
|
||||||
if (pointer_window == track_canvas->get_bin_window()) {
|
if (pointer_window == track_canvas->get_bin_window()) {
|
||||||
|
|
||||||
track_canvas->window_to_world (x, y, wx, wy);
|
track_canvas->window_to_world (x, y, wx, wy);
|
||||||
allow_vertical_scroll = true;
|
allow_vertical_scroll = true;
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -770,8 +768,8 @@ Editor::button_press_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemTyp
|
||||||
|
|
||||||
case RegionViewName:
|
case RegionViewName:
|
||||||
/* rename happens on edit clicks */
|
/* rename happens on edit clicks */
|
||||||
start_trim (clicked_regionview->get_name_highlight(), event);
|
start_trim (clicked_regionview->get_name_highlight(), event);
|
||||||
return true;
|
return true;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ControlPointItem:
|
case ControlPointItem:
|
||||||
|
|
@ -1442,7 +1440,7 @@ Editor::enter_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType item_
|
||||||
case MeterBarItem:
|
case MeterBarItem:
|
||||||
case TempoBarItem:
|
case TempoBarItem:
|
||||||
if (is_drawable()) {
|
if (is_drawable()) {
|
||||||
time_canvas->get_window()->set_cursor (*timebar_cursor);
|
track_canvas->get_window()->set_cursor (*timebar_cursor);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
@ -1456,7 +1454,7 @@ Editor::enter_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType item_
|
||||||
case MeterMarkerItem:
|
case MeterMarkerItem:
|
||||||
case TempoMarkerItem:
|
case TempoMarkerItem:
|
||||||
if (is_drawable()) {
|
if (is_drawable()) {
|
||||||
time_canvas->get_window()->set_cursor (*timebar_cursor);
|
track_canvas->get_window()->set_cursor (*timebar_cursor);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case FadeInHandleItem:
|
case FadeInHandleItem:
|
||||||
|
|
@ -1569,7 +1567,7 @@ Editor::leave_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType item_
|
||||||
case TempoBarItem:
|
case TempoBarItem:
|
||||||
case MarkerBarItem:
|
case MarkerBarItem:
|
||||||
if (is_drawable()) {
|
if (is_drawable()) {
|
||||||
time_canvas->get_window()->set_cursor (*timebar_cursor);
|
track_canvas->get_window()->set_cursor (*timebar_cursor);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
@ -1586,7 +1584,7 @@ Editor::leave_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType item_
|
||||||
case TempoMarkerItem:
|
case TempoMarkerItem:
|
||||||
|
|
||||||
if (is_drawable()) {
|
if (is_drawable()) {
|
||||||
time_canvas->get_window()->set_cursor (*timebar_cursor);
|
track_canvas->get_window()->set_cursor (*timebar_cursor);
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
@ -1721,7 +1719,7 @@ Editor::motion_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType item
|
||||||
where DISPLAY = :0.0, and given the cost of what the motion
|
where DISPLAY = :0.0, and given the cost of what the motion
|
||||||
event might do, its a good tradeoff.
|
event might do, its a good tradeoff.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
track_canvas->get_pointer (x, y);
|
track_canvas->get_pointer (x, y);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1781,6 +1779,9 @@ Editor::motion_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType item
|
||||||
case PlayheadCursorItem:
|
case PlayheadCursorItem:
|
||||||
case MarkerItem:
|
case MarkerItem:
|
||||||
case ControlPointItem:
|
case ControlPointItem:
|
||||||
|
case RangeMarkerBarItem:
|
||||||
|
case TransportMarkerBarItem:
|
||||||
|
case CdMarkerBarItem:
|
||||||
case TempoMarkerItem:
|
case TempoMarkerItem:
|
||||||
case MeterMarkerItem:
|
case MeterMarkerItem:
|
||||||
case RegionViewNameHighlight:
|
case RegionViewNameHighlight:
|
||||||
|
|
@ -1802,13 +1803,13 @@ Editor::motion_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType item
|
||||||
if (drag_info.item && (event->motion.state & Gdk::BUTTON1_MASK ||
|
if (drag_info.item && (event->motion.state & Gdk::BUTTON1_MASK ||
|
||||||
(event->motion.state & Gdk::BUTTON2_MASK))) {
|
(event->motion.state & Gdk::BUTTON2_MASK))) {
|
||||||
if (!from_autoscroll) {
|
if (!from_autoscroll) {
|
||||||
maybe_autoscroll (&event->motion);
|
maybe_autoscroll_horizontally (&event->motion);
|
||||||
}
|
}
|
||||||
(this->*(drag_info.motion_callback)) (item, event);
|
(this->*(drag_info.motion_callback)) (item, event);
|
||||||
goto handled;
|
goto handled;
|
||||||
}
|
}
|
||||||
goto not_handled;
|
goto not_handled;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
@ -2352,7 +2353,7 @@ Editor::start_marker_grab (ArdourCanvas::Item* item, GdkEvent* event)
|
||||||
// marker_drag_line->raise_to_top();
|
// marker_drag_line->raise_to_top();
|
||||||
} else {
|
} else {
|
||||||
range_marker_drag_rect->show();
|
range_marker_drag_rect->show();
|
||||||
range_marker_drag_rect->raise_to_top();
|
//range_marker_drag_rect->raise_to_top();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (is_start) {
|
if (is_start) {
|
||||||
|
|
@ -3087,6 +3088,18 @@ Editor::start_region_grab (ArdourCanvas::Item* item, GdkEvent* event)
|
||||||
show_verbose_time_cursor (drag_info.last_frame_position, 10);
|
show_verbose_time_cursor (drag_info.last_frame_position, 10);
|
||||||
|
|
||||||
begin_reversible_command (_("move region(s)"));
|
begin_reversible_command (_("move region(s)"));
|
||||||
|
/*
|
||||||
|
the group containing moved regions may have been
|
||||||
|
offset during autoscroll. reset its y offset
|
||||||
|
(we should really handle this in the same way
|
||||||
|
we do with the x axis, but a simple way of achieving that
|
||||||
|
eludes me right now).
|
||||||
|
*/
|
||||||
|
|
||||||
|
_region_motion_group->property_y() = 0;
|
||||||
|
|
||||||
|
/* sync the canvas to what we think is its current state */
|
||||||
|
track_canvas->update_now();
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
@ -3133,6 +3146,8 @@ Editor::start_region_copy_grab (ArdourCanvas::Item* item, GdkEvent* event)
|
||||||
drag_info.motion_callback = &Editor::region_drag_motion_callback;
|
drag_info.motion_callback = &Editor::region_drag_motion_callback;
|
||||||
drag_info.finished_callback = &Editor::region_drag_finished_callback;
|
drag_info.finished_callback = &Editor::region_drag_finished_callback;
|
||||||
show_verbose_time_cursor (drag_info.last_frame_position, 10);
|
show_verbose_time_cursor (drag_info.last_frame_position, 10);
|
||||||
|
|
||||||
|
_region_motion_group->property_y() = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
@ -3181,7 +3196,6 @@ Editor::possibly_copy_regions_during_grab (GdkEvent* event)
|
||||||
vector<RegionView*> new_regionviews;
|
vector<RegionView*> new_regionviews;
|
||||||
|
|
||||||
for (list<RegionView*>::const_iterator i = selection->regions.by_layer().begin(); i != selection->regions.by_layer().end(); ++i) {
|
for (list<RegionView*>::const_iterator i = selection->regions.by_layer().begin(); i != selection->regions.by_layer().end(); ++i) {
|
||||||
|
|
||||||
RegionView* rv;
|
RegionView* rv;
|
||||||
RegionView* nrv;
|
RegionView* nrv;
|
||||||
|
|
||||||
|
|
@ -3197,7 +3211,7 @@ Editor::possibly_copy_regions_during_grab (GdkEvent* event)
|
||||||
} else {
|
} else {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
const boost::shared_ptr<const Region> original = arv->region();
|
const boost::shared_ptr<const Region> original = arv->region();
|
||||||
boost::shared_ptr<Region> region_copy = RegionFactory::create (original);
|
boost::shared_ptr<Region> region_copy = RegionFactory::create (original);
|
||||||
boost::shared_ptr<AudioRegion> ar = boost::dynamic_pointer_cast<AudioRegion> (region_copy);
|
boost::shared_ptr<AudioRegion> ar = boost::dynamic_pointer_cast<AudioRegion> (region_copy);
|
||||||
|
|
@ -3225,6 +3239,14 @@ Editor::possibly_copy_regions_during_grab (GdkEvent* event)
|
||||||
drag_info.data = new_regionviews.front();
|
drag_info.data = new_regionviews.front();
|
||||||
|
|
||||||
swap_grab (new_regionviews.front()->get_canvas_group (), 0, event->motion.time);
|
swap_grab (new_regionviews.front()->get_canvas_group (), 0, event->motion.time);
|
||||||
|
/*
|
||||||
|
sync the canvas to what we think is its current state
|
||||||
|
without it, the canvas seems to
|
||||||
|
"forget" to update properly after the upcoming reparent()
|
||||||
|
..only if the mouse is in rapid motion at the time of the grab.
|
||||||
|
something to do with regionview creation raking so long?
|
||||||
|
*/
|
||||||
|
track_canvas->update_now();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -3344,7 +3366,7 @@ Editor::region_drag_motion_callback (ArdourCanvas::Item* item, GdkEvent* event)
|
||||||
}
|
}
|
||||||
|
|
||||||
original_pointer_order = drag_info.dest_trackview->order;
|
original_pointer_order = drag_info.dest_trackview->order;
|
||||||
|
|
||||||
/************************************************************
|
/************************************************************
|
||||||
Y-Delta Computation
|
Y-Delta Computation
|
||||||
************************************************************/
|
************************************************************/
|
||||||
|
|
@ -3427,6 +3449,8 @@ Editor::region_drag_motion_callback (ArdourCanvas::Item* item, GdkEvent* event)
|
||||||
|
|
||||||
rv2->get_canvas_frame()->get_bounds (ix1, iy1, ix2, iy2);
|
rv2->get_canvas_frame()->get_bounds (ix1, iy1, ix2, iy2);
|
||||||
rv2->get_canvas_group()->i2w (ix1, iy1);
|
rv2->get_canvas_group()->i2w (ix1, iy1);
|
||||||
|
iy1 += vertical_adjustment.get_value() - canvas_timebars_vsize;
|
||||||
|
|
||||||
TimeAxisView* tvp2 = trackview_by_y_position (iy1);
|
TimeAxisView* tvp2 = trackview_by_y_position (iy1);
|
||||||
RouteTimeAxisView* rtv2 = dynamic_cast<RouteTimeAxisView*>(tvp2);
|
RouteTimeAxisView* rtv2 = dynamic_cast<RouteTimeAxisView*>(tvp2);
|
||||||
|
|
||||||
|
|
@ -3512,10 +3536,9 @@ Editor::region_drag_motion_callback (ArdourCanvas::Item* item, GdkEvent* event)
|
||||||
/* compute the amount of pointer motion in frames, and where
|
/* compute the amount of pointer motion in frames, and where
|
||||||
the region would be if we moved it by that much.
|
the region would be if we moved it by that much.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if ( drag_info.move_threshold_passed ) {
|
if ( drag_info.move_threshold_passed ) {
|
||||||
|
|
||||||
if (drag_info.current_pointer_frame > drag_info.pointer_frame_offset) {
|
if (drag_info.current_pointer_frame >= drag_info.pointer_frame_offset) {
|
||||||
|
|
||||||
nframes64_t sync_frame;
|
nframes64_t sync_frame;
|
||||||
nframes64_t sync_offset;
|
nframes64_t sync_offset;
|
||||||
|
|
@ -3550,7 +3573,7 @@ Editor::region_drag_motion_callback (ArdourCanvas::Item* item, GdkEvent* event)
|
||||||
if (pending_region_position > max_frames - rv->region()->length()) {
|
if (pending_region_position > max_frames - rv->region()->length()) {
|
||||||
pending_region_position = drag_info.last_frame_position;
|
pending_region_position = drag_info.last_frame_position;
|
||||||
}
|
}
|
||||||
|
|
||||||
// printf ("3: pending_region_position= %lu %lu\n", pending_region_position, drag_info.last_frame_position );
|
// printf ("3: pending_region_position= %lu %lu\n", pending_region_position, drag_info.last_frame_position );
|
||||||
|
|
||||||
bool x_move_allowed;
|
bool x_move_allowed;
|
||||||
|
|
@ -3566,7 +3589,7 @@ Editor::region_drag_motion_callback (ArdourCanvas::Item* item, GdkEvent* event)
|
||||||
x_move_allowed = !drag_info.x_constrained;
|
x_move_allowed = !drag_info.x_constrained;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( pending_region_position != drag_info.last_frame_position && x_move_allowed ) {
|
if (( pending_region_position != drag_info.last_frame_position) && x_move_allowed ) {
|
||||||
|
|
||||||
/* now compute the canvas unit distance we need to move the regionview
|
/* now compute the canvas unit distance we need to move the regionview
|
||||||
to make it appear at the new location.
|
to make it appear at the new location.
|
||||||
|
|
@ -3576,10 +3599,29 @@ Editor::region_drag_motion_callback (ArdourCanvas::Item* item, GdkEvent* event)
|
||||||
x_delta = ((double) (pending_region_position - drag_info.last_frame_position) / frames_per_unit);
|
x_delta = ((double) (pending_region_position - drag_info.last_frame_position) / frames_per_unit);
|
||||||
} else {
|
} else {
|
||||||
x_delta = -((double) (drag_info.last_frame_position - pending_region_position) / frames_per_unit);
|
x_delta = -((double) (drag_info.last_frame_position - pending_region_position) / frames_per_unit);
|
||||||
}
|
for (list<RegionView*>::const_iterator i = selection->regions.by_layer().begin(); i != selection->regions.by_layer().end(); ++i) {
|
||||||
|
|
||||||
|
RegionView* rv2 = (*i);
|
||||||
|
|
||||||
|
// If any regionview is at zero, we need to know so we can stop further leftward motion.
|
||||||
|
|
||||||
|
double ix1, ix2, iy1, iy2;
|
||||||
|
rv2->get_canvas_frame()->get_bounds (ix1, iy1, ix2, iy2);
|
||||||
|
rv2->get_canvas_group()->i2w (ix1, iy1);
|
||||||
|
|
||||||
|
if (-x_delta > ix1 + horizontal_adjustment.get_value()) {
|
||||||
|
// do_move = false;
|
||||||
|
cerr << "illegal move" << endl;
|
||||||
|
x_delta = 0;
|
||||||
|
pending_region_position = drag_info.last_frame_position;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
drag_info.last_frame_position = pending_region_position;
|
drag_info.last_frame_position = pending_region_position;
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
x_delta = 0;
|
x_delta = 0;
|
||||||
}
|
}
|
||||||
|
|
@ -3599,41 +3641,16 @@ Editor::region_drag_motion_callback (ArdourCanvas::Item* item, GdkEvent* event)
|
||||||
trackviews. nothing to do.
|
trackviews. nothing to do.
|
||||||
*/
|
*/
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
if (x_delta < 0) {
|
|
||||||
for (list<RegionView*>::const_iterator i = selection->regions.by_layer().begin(); i != selection->regions.by_layer().end(); ++i) {
|
|
||||||
|
|
||||||
RegionView* rv2 = (*i);
|
|
||||||
|
|
||||||
// If any regionview is at zero, we need to know so we can stop further leftward motion.
|
|
||||||
|
|
||||||
double ix1, ix2, iy1, iy2;
|
|
||||||
rv2->get_canvas_frame()->get_bounds (ix1, iy1, ix2, iy2);
|
|
||||||
rv2->get_canvas_group()->i2w (ix1, iy1);
|
|
||||||
|
|
||||||
if (ix1 <= 1) {
|
|
||||||
x_delta = 0;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*************************************************************
|
/*************************************************************
|
||||||
MOTION
|
MOTION
|
||||||
************************************************************/
|
************************************************************/
|
||||||
|
bool do_move = true;
|
||||||
bool do_move;
|
|
||||||
|
|
||||||
if (drag_info.first_move) {
|
if (drag_info.first_move) {
|
||||||
if (drag_info.move_threshold_passed) {
|
if (!drag_info.move_threshold_passed) {
|
||||||
do_move = true;
|
|
||||||
} else {
|
|
||||||
do_move = false;
|
do_move = false;
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
do_move = true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (do_move) {
|
if (do_move) {
|
||||||
|
|
@ -3658,6 +3675,30 @@ Editor::region_drag_motion_callback (ArdourCanvas::Item* item, GdkEvent* event)
|
||||||
|
|
||||||
rv->get_canvas_frame()->get_bounds (ix1, iy1, ix2, iy2);
|
rv->get_canvas_frame()->get_bounds (ix1, iy1, ix2, iy2);
|
||||||
rv->get_canvas_group()->i2w (ix1, iy1);
|
rv->get_canvas_group()->i2w (ix1, iy1);
|
||||||
|
|
||||||
|
if (drag_info.first_move) {
|
||||||
|
|
||||||
|
// hide any dependent views
|
||||||
|
|
||||||
|
rv->get_time_axis_view().hide_dependent_views (*rv);
|
||||||
|
|
||||||
|
/*
|
||||||
|
reparent to a non scrolling group so that we can keep the
|
||||||
|
region selection above all time axis views.
|
||||||
|
reparenting means we have to move the rv as the two
|
||||||
|
parent groups have different coordinates.
|
||||||
|
*/
|
||||||
|
|
||||||
|
rv->get_canvas_group()->property_y() = iy1 - 1;
|
||||||
|
rv->get_canvas_group()->reparent(*_region_motion_group);
|
||||||
|
|
||||||
|
rv->fake_set_opaque (true);
|
||||||
|
}
|
||||||
|
/* for evaluation of the track position of iy1, we have to adjust
|
||||||
|
to allow for the vertical scrolling adjustment and the height of the timebars.
|
||||||
|
*/
|
||||||
|
iy1 += vertical_adjustment.get_value() - canvas_timebars_vsize;
|
||||||
|
|
||||||
TimeAxisView* tvp2 = trackview_by_y_position (iy1);
|
TimeAxisView* tvp2 = trackview_by_y_position (iy1);
|
||||||
RouteTimeAxisView* canvas_rtv = dynamic_cast<RouteTimeAxisView*>(tvp2);
|
RouteTimeAxisView* canvas_rtv = dynamic_cast<RouteTimeAxisView*>(tvp2);
|
||||||
RouteTimeAxisView* temp_rtv;
|
RouteTimeAxisView* temp_rtv;
|
||||||
|
|
@ -3720,7 +3761,6 @@ Editor::region_drag_motion_callback (ArdourCanvas::Item* item, GdkEvent* event)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* prevent the regionview from being moved to before
|
/* prevent the regionview from being moved to before
|
||||||
the zero position on the canvas.
|
the zero position on the canvas.
|
||||||
*/
|
*/
|
||||||
|
|
@ -3734,30 +3774,10 @@ Editor::region_drag_motion_callback (ArdourCanvas::Item* item, GdkEvent* event)
|
||||||
x_delta = max_frames - rv->region()->last_frame();
|
x_delta = max_frames - rv->region()->last_frame();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (drag_info.first_move) {
|
|
||||||
|
|
||||||
/* hide any dependent views */
|
|
||||||
|
|
||||||
rv->get_time_axis_view().hide_dependent_views (*rv);
|
|
||||||
|
|
||||||
/* this is subtle. raising the regionview itself won't help,
|
|
||||||
because raise_to_top() just puts the item on the top of
|
|
||||||
its parent's stack. so, we need to put the trackview canvas_display group
|
|
||||||
on the top, since its parent is the whole canvas.
|
|
||||||
*/
|
|
||||||
|
|
||||||
rv->get_canvas_group()->raise_to_top();
|
|
||||||
rv->get_time_axis_view().canvas_display->raise_to_top();
|
|
||||||
cursor_group->raise_to_top();
|
|
||||||
|
|
||||||
rv->fake_set_opaque (true);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (drag_info.brushing) {
|
if (drag_info.brushing) {
|
||||||
mouse_brush_insert_region (rv, pending_region_position);
|
mouse_brush_insert_region (rv, pending_region_position);
|
||||||
} else {
|
} else {
|
||||||
rv->move (x_delta, y_delta);
|
rv->move (x_delta, y_delta);
|
||||||
}
|
}
|
||||||
|
|
||||||
} /* foreach region */
|
} /* foreach region */
|
||||||
|
|
@ -3785,7 +3805,9 @@ Editor::region_drag_finished_callback (ArdourCanvas::Item* item, GdkEvent* event
|
||||||
vector<RegionView*> new_selection;
|
vector<RegionView*> new_selection;
|
||||||
typedef set<boost::shared_ptr<Playlist> > PlaylistSet;
|
typedef set<boost::shared_ptr<Playlist> > PlaylistSet;
|
||||||
PlaylistSet modified_playlists;
|
PlaylistSet modified_playlists;
|
||||||
pair<PlaylistSet::iterator,bool> insert_result;
|
PlaylistSet frozen_playlists;
|
||||||
|
list <sigc::connection> modified_playlist_connections;
|
||||||
|
pair<PlaylistSet::iterator,bool> insert_result, frozen_insert_result;
|
||||||
|
|
||||||
/* first_move is set to false if the regionview has been moved in the
|
/* first_move is set to false if the regionview has been moved in the
|
||||||
motion handler.
|
motion handler.
|
||||||
|
|
@ -3798,11 +3820,12 @@ Editor::region_drag_finished_callback (ArdourCanvas::Item* item, GdkEvent* event
|
||||||
|
|
||||||
nocommit = false;
|
nocommit = false;
|
||||||
|
|
||||||
/* The regionview has been moved at some stage during the grab so we need
|
/* XXX is this true??? i can''t tell the difference.
|
||||||
|
The regionview has been moved at some stage during the grab so we need
|
||||||
to account for any mouse movement between this event and the last one.
|
to account for any mouse movement between this event and the last one.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
region_drag_motion_callback (item, event);
|
//region_drag_motion_callback (item, event);
|
||||||
|
|
||||||
if (Config->get_edit_mode() == Splice && !pre_drag_region_selection.empty()) {
|
if (Config->get_edit_mode() == Splice && !pre_drag_region_selection.empty()) {
|
||||||
selection->set (pre_drag_region_selection);
|
selection->set (pre_drag_region_selection);
|
||||||
|
|
@ -3853,11 +3876,12 @@ Editor::region_drag_finished_callback (ArdourCanvas::Item* item, GdkEvent* event
|
||||||
double ix1, ix2, iy1, iy2;
|
double ix1, ix2, iy1, iy2;
|
||||||
rv->get_canvas_frame()->get_bounds (ix1, iy1, ix2, iy2);
|
rv->get_canvas_frame()->get_bounds (ix1, iy1, ix2, iy2);
|
||||||
rv->get_canvas_group()->i2w (ix1, iy1);
|
rv->get_canvas_group()->i2w (ix1, iy1);
|
||||||
|
iy1 += vertical_adjustment.get_value() - canvas_timebars_vsize;
|
||||||
|
|
||||||
TimeAxisView* dest_tv = trackview_by_y_position (iy1);
|
TimeAxisView* dest_tv = trackview_by_y_position (iy1);
|
||||||
RouteTimeAxisView* dest_rtv = dynamic_cast<RouteTimeAxisView*>(dest_tv);
|
RouteTimeAxisView* dest_rtv = dynamic_cast<RouteTimeAxisView*>(dest_tv);
|
||||||
double speed;
|
double speed;
|
||||||
bool changed_tracks;
|
bool changed_tracks, changed_position;
|
||||||
bool changed_position;
|
|
||||||
nframes64_t where;
|
nframes64_t where;
|
||||||
|
|
||||||
if (rv->region()->locked()) {
|
if (rv->region()->locked()) {
|
||||||
|
|
@ -3877,24 +3901,26 @@ Editor::region_drag_finished_callback (ArdourCanvas::Item* item, GdkEvent* event
|
||||||
changed_tracks = (dest_tv != &rv->get_time_axis_view());
|
changed_tracks = (dest_tv != &rv->get_time_axis_view());
|
||||||
|
|
||||||
if (changed_position && !drag_info.x_constrained) {
|
if (changed_position && !drag_info.x_constrained) {
|
||||||
|
_master_group->w2i(ix1, iy1);
|
||||||
where = (nframes64_t) (unit_to_frame (ix1) * speed);
|
where = (nframes64_t) (unit_to_frame (ix1) * speed);
|
||||||
} else {
|
} else {
|
||||||
where = rv->region()->position();
|
where = rv->region()->position();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* undo the previous hide_dependent_views so that xfades don't
|
|
||||||
disappear on copying regions
|
|
||||||
*/
|
|
||||||
|
|
||||||
rv->get_time_axis_view().reveal_dependent_views (*rv);
|
|
||||||
|
|
||||||
boost::shared_ptr<Region> new_region;
|
boost::shared_ptr<Region> new_region;
|
||||||
|
|
||||||
|
|
||||||
if (drag_info.copy) {
|
if (drag_info.copy) {
|
||||||
/* we already made a copy */
|
/* we already made a copy */
|
||||||
new_region = rv->region();
|
new_region = rv->region();
|
||||||
} else {
|
|
||||||
|
/* undo the previous hide_dependent_views so that xfades don't
|
||||||
|
disappear on copying regions
|
||||||
|
*/
|
||||||
|
|
||||||
|
//rv->get_time_axis_view().reveal_dependent_views (*rv);
|
||||||
|
|
||||||
|
} else if (changed_tracks) {
|
||||||
new_region = RegionFactory::create (rv->region());
|
new_region = RegionFactory::create (rv->region());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -3908,7 +3934,7 @@ Editor::region_drag_finished_callback (ArdourCanvas::Item* item, GdkEvent* event
|
||||||
|
|
||||||
insert_result = modified_playlists.insert (to_playlist);
|
insert_result = modified_playlists.insert (to_playlist);
|
||||||
if (insert_result.second) {
|
if (insert_result.second) {
|
||||||
session->add_command (new MementoCommand<Playlist>(*to_playlist, &to_playlist->get_state(), 0));
|
session->add_command (new MementoCommand<Playlist>(*to_playlist, &to_playlist->get_state(), 0));
|
||||||
}
|
}
|
||||||
|
|
||||||
to_playlist->add_region (new_region, where);
|
to_playlist->add_region (new_region, where);
|
||||||
|
|
@ -3917,19 +3943,33 @@ Editor::region_drag_finished_callback (ArdourCanvas::Item* item, GdkEvent* event
|
||||||
|
|
||||||
if (!latest_regionviews.empty()) {
|
if (!latest_regionviews.empty()) {
|
||||||
// XXX why just the first one ? we only expect one
|
// XXX why just the first one ? we only expect one
|
||||||
dest_rtv->reveal_dependent_views (*latest_regionviews.front());
|
// commented out in nick_m's canvas reworking. is that intended?
|
||||||
|
//dest_atv->reveal_dependent_views (*latest_regionviews.front());
|
||||||
new_selection.push_back (latest_regionviews.front());
|
new_selection.push_back (latest_regionviews.front());
|
||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
/*
|
||||||
|
motion on the same track. plonk the previously reparented region
|
||||||
|
back to its original canvas group (its streamview).
|
||||||
|
No need to do anything for copies as they are fake regions which will be deleted.
|
||||||
|
*/
|
||||||
|
|
||||||
|
rv->get_canvas_group()->reparent (*dest_rtv->view()->canvas_item());
|
||||||
|
rv->get_canvas_group()->property_y() = 0;
|
||||||
|
|
||||||
/* just change the model */
|
/* just change the model */
|
||||||
|
|
||||||
boost::shared_ptr<Playlist> playlist = dest_rtv->playlist();
|
boost::shared_ptr<Playlist> playlist = dest_rtv->playlist();
|
||||||
|
|
||||||
insert_result = modified_playlists.insert (playlist);
|
insert_result = modified_playlists.insert (playlist);
|
||||||
if (insert_result.second) {
|
if (insert_result.second) {
|
||||||
session->add_command (new MementoCommand<Playlist>(*playlist, &playlist->get_state(), 0));
|
session->add_command (new MementoCommand<Playlist>(*playlist, &playlist->get_state(), 0));
|
||||||
|
}
|
||||||
|
/* freeze to avoid lots of relayering in the case of a multi-region drag */
|
||||||
|
frozen_insert_result = frozen_playlists.insert(playlist);
|
||||||
|
if (frozen_insert_result.second) {
|
||||||
|
playlist->freeze();
|
||||||
}
|
}
|
||||||
|
|
||||||
rv->region()->set_position (where, (void*) this);
|
rv->region()->set_position (where, (void*) this);
|
||||||
|
|
@ -3960,7 +4000,7 @@ Editor::region_drag_finished_callback (ArdourCanvas::Item* item, GdkEvent* event
|
||||||
|
|
||||||
insert_result = modified_playlists.insert (from_playlist);
|
insert_result = modified_playlists.insert (from_playlist);
|
||||||
if (insert_result.second) {
|
if (insert_result.second) {
|
||||||
session->add_command (new MementoCommand<Playlist>(*from_playlist, &from_playlist->get_state(), 0));
|
session->add_command (new MementoCommand<Playlist>(*from_playlist, &from_playlist->get_state(), 0));
|
||||||
}
|
}
|
||||||
|
|
||||||
from_playlist->remove_region ((rv->region()));
|
from_playlist->remove_region ((rv->region()));
|
||||||
|
|
@ -3996,7 +4036,6 @@ Editor::region_drag_finished_callback (ArdourCanvas::Item* item, GdkEvent* event
|
||||||
copies.push_back (rv);
|
copies.push_back (rv);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (new_selection.empty()) {
|
if (new_selection.empty()) {
|
||||||
if (drag_info.copy) {
|
if (drag_info.copy) {
|
||||||
|
|
@ -4012,6 +4051,10 @@ Editor::region_drag_finished_callback (ArdourCanvas::Item* item, GdkEvent* event
|
||||||
*/
|
*/
|
||||||
selection->set (new_selection);
|
selection->set (new_selection);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (set<boost::shared_ptr<Playlist> >::iterator p = frozen_playlists.begin(); p != frozen_playlists.end(); ++p) {
|
||||||
|
(*p)->thaw();
|
||||||
|
}
|
||||||
|
|
||||||
out:
|
out:
|
||||||
if (!nocommit) {
|
if (!nocommit) {
|
||||||
|
|
@ -4024,6 +4067,7 @@ Editor::region_drag_finished_callback (ArdourCanvas::Item* item, GdkEvent* event
|
||||||
for (vector<RegionView*>::iterator x = copies.begin(); x != copies.end(); ++x) {
|
for (vector<RegionView*>::iterator x = copies.begin(); x != copies.end(); ++x) {
|
||||||
delete *x;
|
delete *x;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
@ -4167,7 +4211,7 @@ Editor::show_verbose_time_cursor (nframes64_t frame, double offset, double xpos,
|
||||||
set_verbose_canvas_cursor (buf, xpos + offset, ypos + offset);
|
set_verbose_canvas_cursor (buf, xpos + offset, ypos + offset);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
set_verbose_canvas_cursor (buf, drag_info.current_pointer_x + offset, drag_info.current_pointer_y + offset);
|
set_verbose_canvas_cursor (buf, drag_info.current_pointer_x + offset - horizontal_adjustment.get_value(), drag_info.current_pointer_y + offset - vertical_adjustment.get_value() + canvas_timebars_vsize);
|
||||||
}
|
}
|
||||||
show_verbose_canvas_cursor ();
|
show_verbose_canvas_cursor ();
|
||||||
}
|
}
|
||||||
|
|
@ -5088,7 +5132,7 @@ Editor::drag_range_markerbar_op (ArdourCanvas::Item* item, GdkEvent* event)
|
||||||
|
|
||||||
update_marker_drag_item (temp_location);
|
update_marker_drag_item (temp_location);
|
||||||
range_marker_drag_rect->show();
|
range_marker_drag_rect->show();
|
||||||
range_marker_drag_rect->raise_to_top();
|
//range_marker_drag_rect->raise_to_top();
|
||||||
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
@ -5369,8 +5413,7 @@ Editor::end_rubberband_select (ArdourCanvas::Item* item, GdkEvent* event)
|
||||||
if (drag_info.current_pointer_y < drag_info.grab_y) {
|
if (drag_info.current_pointer_y < drag_info.grab_y) {
|
||||||
y1 = drag_info.current_pointer_y;
|
y1 = drag_info.current_pointer_y;
|
||||||
y2 = drag_info.grab_y;
|
y2 = drag_info.grab_y;
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
y2 = drag_info.current_pointer_y;
|
y2 = drag_info.current_pointer_y;
|
||||||
y1 = drag_info.grab_y;
|
y1 = drag_info.grab_y;
|
||||||
}
|
}
|
||||||
|
|
@ -5478,18 +5521,18 @@ Editor::end_time_fx (ArdourCanvas::Item* item, GdkEvent* event)
|
||||||
nframes64_t newlen = drag_info.last_pointer_frame - clicked_regionview->region()->position();
|
nframes64_t newlen = drag_info.last_pointer_frame - clicked_regionview->region()->position();
|
||||||
|
|
||||||
float percentage = (double) newlen / (double) clicked_regionview->region()->length();
|
float percentage = (double) newlen / (double) clicked_regionview->region()->length();
|
||||||
|
|
||||||
#ifndef USE_RUBBERBAND
|
#ifndef USE_RUBBERBAND
|
||||||
// Soundtouch uses percentage / 100 instead of normal (/ 1)
|
// Soundtouch uses percentage / 100 instead of normal (/ 1)
|
||||||
if (clicked_regionview->region()->data_type() == DataType::AUDIO) {
|
if (clicked_regionview->region()->data_type() == DataType::AUDIO) {
|
||||||
percentage = (float) ((double) newlen - (double) clicked_regionview->region()->length()) / ((double) newlen) * 100.0f;
|
percentage = (float) ((double) newlen - (double) clicked_regionview->region()->length()) / ((double) newlen) * 100.0f;
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
begin_reversible_command (_("timestretch"));
|
begin_reversible_command (_("timestretch"));
|
||||||
|
|
||||||
// XXX how do timeFX on multiple regions ?
|
// XXX how do timeFX on multiple regions ?
|
||||||
|
|
||||||
RegionSelection rs;
|
RegionSelection rs;
|
||||||
rs.add (clicked_regionview);
|
rs.add (clicked_regionview);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1549,7 +1549,7 @@ Editor::scroll_tracks_down_line ()
|
||||||
{
|
{
|
||||||
|
|
||||||
Gtk::Adjustment* adj = edit_vscrollbar.get_adjustment();
|
Gtk::Adjustment* adj = edit_vscrollbar.get_adjustment();
|
||||||
double vert_value = adj->get_value() + 20;
|
double vert_value = adj->get_value() + 60;
|
||||||
|
|
||||||
if (vert_value>adj->get_upper() - canvas_height) {
|
if (vert_value>adj->get_upper() - canvas_height) {
|
||||||
vert_value = adj->get_upper() - canvas_height;
|
vert_value = adj->get_upper() - canvas_height;
|
||||||
|
|
@ -1561,7 +1561,7 @@ void
|
||||||
Editor::scroll_tracks_up_line ()
|
Editor::scroll_tracks_up_line ()
|
||||||
{
|
{
|
||||||
Gtk::Adjustment* adj = edit_vscrollbar.get_adjustment();
|
Gtk::Adjustment* adj = edit_vscrollbar.get_adjustment();
|
||||||
adj->set_value (adj->get_value() - 20);
|
adj->set_value (adj->get_value() - 60);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ZOOM */
|
/* ZOOM */
|
||||||
|
|
@ -1875,8 +1875,9 @@ Editor::temporal_zoom_by_frame (nframes64_t start, nframes64_t end, const string
|
||||||
void
|
void
|
||||||
Editor::temporal_zoom_to_frame (bool coarser, nframes64_t frame)
|
Editor::temporal_zoom_to_frame (bool coarser, nframes64_t frame)
|
||||||
{
|
{
|
||||||
if (!session) return;
|
if (!session) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
double range_before = frame - leftmost_frame;
|
double range_before = frame - leftmost_frame;
|
||||||
double new_fpu;
|
double new_fpu;
|
||||||
|
|
||||||
|
|
@ -1890,12 +1891,15 @@ Editor::temporal_zoom_to_frame (bool coarser, nframes64_t frame)
|
||||||
range_before /= 1.61803399;
|
range_before /= 1.61803399;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (new_fpu == frames_per_unit) return;
|
if (new_fpu == frames_per_unit) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
nframes64_t new_leftmost = frame - (nframes64_t)range_before;
|
nframes64_t new_leftmost = frame - (nframes64_t)range_before;
|
||||||
|
|
||||||
if (new_leftmost > frame) new_leftmost = 0;
|
if (new_leftmost > frame) {
|
||||||
|
new_leftmost = 0;
|
||||||
|
}
|
||||||
// begin_reversible_command (_("zoom to frame"));
|
// begin_reversible_command (_("zoom to frame"));
|
||||||
// session->add_undo (bind (mem_fun(*this, &Editor::reposition_and_zoom), leftmost_frame, frames_per_unit));
|
// session->add_undo (bind (mem_fun(*this, &Editor::reposition_and_zoom), leftmost_frame, frames_per_unit));
|
||||||
// session->add_redo (bind (mem_fun(*this, &Editor::reposition_and_zoom), new_leftmost, new_fpu));
|
// session->add_redo (bind (mem_fun(*this, &Editor::reposition_and_zoom), new_leftmost, new_fpu));
|
||||||
|
|
@ -2213,8 +2217,8 @@ Editor::insert_region_list_drag (boost::shared_ptr<Region> region, int x, int y)
|
||||||
boost::shared_ptr<Playlist> playlist;
|
boost::shared_ptr<Playlist> playlist;
|
||||||
|
|
||||||
track_canvas->window_to_world (x, y, wx, wy);
|
track_canvas->window_to_world (x, y, wx, wy);
|
||||||
wx += horizontal_adjustment.get_value();
|
//wx += horizontal_adjustment.get_value();
|
||||||
wy += vertical_adjustment.get_value();
|
//wy += vertical_adjustment.get_value();
|
||||||
|
|
||||||
GdkEvent event;
|
GdkEvent event;
|
||||||
event.type = GDK_BUTTON_RELEASE;
|
event.type = GDK_BUTTON_RELEASE;
|
||||||
|
|
@ -6038,7 +6042,6 @@ Editor::fit_tracks ()
|
||||||
first_y_pos = std::min ((*t)->y_position, first_y_pos);
|
first_y_pos = std::min ((*t)->y_position, first_y_pos);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
vertical_adjustment.set_value (first_y_pos);
|
vertical_adjustment.set_value (first_y_pos);
|
||||||
|
|
||||||
redo_visual_stack.push_back (current_visual_state());
|
redo_visual_stack.push_back (current_visual_state());
|
||||||
|
|
|
||||||
|
|
@ -140,8 +140,8 @@ Editor::add_region_to_region_display (boost::shared_ptr<Region> region)
|
||||||
for (i = rows.begin(); i != rows.end(); ++i) {
|
for (i = rows.begin(); i != rows.end(); ++i) {
|
||||||
|
|
||||||
boost::shared_ptr<Region> rr = (*i)[region_list_columns.region];
|
boost::shared_ptr<Region> rr = (*i)[region_list_columns.region];
|
||||||
|
|
||||||
if (region->region_list_equivalent (rr)) {
|
if (rr && region->region_list_equivalent (rr)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -364,7 +364,7 @@ Editor::redisplay_route_list ()
|
||||||
|
|
||||||
cursor_group->raise_to_top ();
|
cursor_group->raise_to_top ();
|
||||||
|
|
||||||
reset_scrolling_region ();
|
//reset_scrolling_region ();
|
||||||
|
|
||||||
if (Config->get_sync_all_route_ordering() && !ignore_route_list_reorder) {
|
if (Config->get_sync_all_route_ordering() && !ignore_route_list_reorder) {
|
||||||
ignore_route_order_sync = true;
|
ignore_route_order_sync = true;
|
||||||
|
|
@ -401,7 +401,7 @@ Editor::hide_all_tracks (bool with_select)
|
||||||
otherwise.
|
otherwise.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
reset_scrolling_region ();
|
//reset_scrolling_region ();
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
@ -625,7 +625,9 @@ void
|
||||||
Editor::route_list_delete (const Gtk::TreeModel::Path& path)
|
Editor::route_list_delete (const Gtk::TreeModel::Path& path)
|
||||||
{
|
{
|
||||||
session->set_remote_control_ids();
|
session->set_remote_control_ids();
|
||||||
|
ignore_route_list_reorder = true;
|
||||||
redisplay_route_list ();
|
redisplay_route_list ();
|
||||||
|
ignore_route_list_reorder = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
|
||||||
|
|
@ -88,7 +88,7 @@ Editor::initialize_rulers ()
|
||||||
minsec_ruler->set_size_request (-1, (int)timebar_height);
|
minsec_ruler->set_size_request (-1, (int)timebar_height);
|
||||||
gtk_custom_ruler_set_metric (GTK_CUSTOM_RULER(_minsec_ruler), &ruler_metrics[ruler_metric_minsec]);
|
gtk_custom_ruler_set_metric (GTK_CUSTOM_RULER(_minsec_ruler), &ruler_metrics[ruler_metric_minsec]);
|
||||||
|
|
||||||
visible_timebars = 7; /* 4 here, 3 in time_canvas */
|
visible_timebars = 1; /*this will be changed below */
|
||||||
ruler_pressed_button = 0;
|
ruler_pressed_button = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -559,7 +559,9 @@ Editor::update_ruler_visibility ()
|
||||||
{
|
{
|
||||||
using namespace Box_Helpers;
|
using namespace Box_Helpers;
|
||||||
BoxList & lab_children = time_button_vbox.children();
|
BoxList & lab_children = time_button_vbox.children();
|
||||||
|
BoxList & ruler_lab_children = ruler_label_vbox.children();
|
||||||
BoxList & ruler_children = time_canvas_vbox.children();
|
BoxList & ruler_children = time_canvas_vbox.children();
|
||||||
|
int visible_rulers = 0;
|
||||||
|
|
||||||
if (no_ruler_shown_update) {
|
if (no_ruler_shown_update) {
|
||||||
return;
|
return;
|
||||||
|
|
@ -568,9 +570,10 @@ Editor::update_ruler_visibility ()
|
||||||
visible_timebars = 0;
|
visible_timebars = 0;
|
||||||
|
|
||||||
lab_children.clear();
|
lab_children.clear();
|
||||||
|
ruler_lab_children.clear();
|
||||||
|
|
||||||
// leave the last one (the time_canvas) intact
|
// leave the last one (the time_canvas) intact
|
||||||
while (ruler_children.size() > 1) {
|
while (ruler_children.size() > 0) {
|
||||||
ruler_children.pop_front();
|
ruler_children.pop_front();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -628,31 +631,32 @@ Editor::update_ruler_visibility ()
|
||||||
ruler_children.insert (canvaspos, Element(*_ruler_separator, PACK_SHRINK, PACK_START));
|
ruler_children.insert (canvaspos, Element(*_ruler_separator, PACK_SHRINK, PACK_START));
|
||||||
|
|
||||||
if (ruler_minsec_action->get_active()) {
|
if (ruler_minsec_action->get_active()) {
|
||||||
lab_children.push_back (Element(minsec_label, PACK_SHRINK, PACK_START));
|
ruler_lab_children.push_back (Element(minsec_label, PACK_SHRINK, PACK_START));
|
||||||
ruler_children.insert (canvaspos, Element(*minsec_ruler, PACK_SHRINK, PACK_START));
|
ruler_children.insert (canvaspos, Element(*minsec_ruler, PACK_SHRINK, PACK_START));
|
||||||
visible_timebars++;
|
visible_rulers++;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ruler_timecode_action->get_active()) {
|
if (ruler_timecode_action->get_active()) {
|
||||||
lab_children.push_back (Element(smpte_label, PACK_SHRINK, PACK_START));
|
ruler_lab_children.push_back (Element(smpte_label, PACK_SHRINK, PACK_START));
|
||||||
ruler_children.insert (canvaspos, Element(*smpte_ruler, PACK_SHRINK, PACK_START));
|
ruler_children.insert (canvaspos, Element(*smpte_ruler, PACK_SHRINK, PACK_START));
|
||||||
visible_timebars++;
|
visible_rulers++;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ruler_samples_action->get_active()) {
|
if (ruler_samples_action->get_active()) {
|
||||||
lab_children.push_back (Element(frame_label, PACK_SHRINK, PACK_START));
|
ruler_lab_children.push_back (Element(frame_label, PACK_SHRINK, PACK_START));
|
||||||
ruler_children.insert (canvaspos, Element(*frames_ruler, PACK_SHRINK, PACK_START));
|
ruler_children.insert (canvaspos, Element(*frames_ruler, PACK_SHRINK, PACK_START));
|
||||||
visible_timebars++;
|
visible_rulers++;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ruler_bbt_action->get_active()) {
|
if (ruler_bbt_action->get_active()) {
|
||||||
lab_children.push_back (Element(bbt_label, PACK_SHRINK, PACK_START));
|
ruler_lab_children.push_back (Element(bbt_label, PACK_SHRINK, PACK_START));
|
||||||
ruler_children.insert (canvaspos, Element(*bbt_ruler, PACK_SHRINK, PACK_START));
|
ruler_children.insert (canvaspos, Element(*bbt_ruler, PACK_SHRINK, PACK_START));
|
||||||
visible_timebars++;
|
visible_rulers++;
|
||||||
}
|
}
|
||||||
|
|
||||||
double tbpos = 1.0;
|
double tbpos = 0.0;
|
||||||
double old_unit_pos ;
|
double tbgpos = 0.0;
|
||||||
|
double old_unit_pos;
|
||||||
|
|
||||||
if (ruler_meter_action->get_active()) {
|
if (ruler_meter_action->get_active()) {
|
||||||
lab_children.push_back (Element(meter_label, PACK_SHRINK, PACK_START));
|
lab_children.push_back (Element(meter_label, PACK_SHRINK, PACK_START));
|
||||||
|
|
@ -661,11 +665,17 @@ Editor::update_ruler_visibility ()
|
||||||
if (tbpos != old_unit_pos) {
|
if (tbpos != old_unit_pos) {
|
||||||
meter_group->move ( 0.0, tbpos - old_unit_pos);
|
meter_group->move ( 0.0, tbpos - old_unit_pos);
|
||||||
}
|
}
|
||||||
|
old_unit_pos = meter_bar_group->property_y();
|
||||||
|
if (tbgpos != old_unit_pos) {
|
||||||
|
meter_bar_group->move ( 0.0, tbgpos - old_unit_pos);
|
||||||
|
}
|
||||||
|
meter_bar_group->show();
|
||||||
meter_group->show();
|
meter_group->show();
|
||||||
tbpos += timebar_height;
|
tbpos += timebar_height;
|
||||||
|
tbgpos += timebar_height;
|
||||||
visible_timebars++;
|
visible_timebars++;
|
||||||
}
|
} else {
|
||||||
else {
|
meter_bar_group->hide();
|
||||||
meter_group->hide();
|
meter_group->hide();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -675,11 +685,17 @@ Editor::update_ruler_visibility ()
|
||||||
if (tbpos != old_unit_pos) {
|
if (tbpos != old_unit_pos) {
|
||||||
tempo_group->move(0.0, tbpos - old_unit_pos);
|
tempo_group->move(0.0, tbpos - old_unit_pos);
|
||||||
}
|
}
|
||||||
|
old_unit_pos = tempo_bar_group->property_y();
|
||||||
|
if (tbgpos != old_unit_pos) {
|
||||||
|
tempo_bar_group->move ( 0.0, tbgpos - old_unit_pos);
|
||||||
|
}
|
||||||
|
tempo_bar_group->show();
|
||||||
tempo_group->show();
|
tempo_group->show();
|
||||||
tbpos += timebar_height;
|
tbpos += timebar_height;
|
||||||
|
tbgpos += timebar_height;
|
||||||
visible_timebars++;
|
visible_timebars++;
|
||||||
}
|
} else {
|
||||||
else {
|
tempo_bar_group->hide();
|
||||||
tempo_group->hide();
|
tempo_group->hide();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -689,10 +705,17 @@ Editor::update_ruler_visibility ()
|
||||||
if (tbpos != old_unit_pos) {
|
if (tbpos != old_unit_pos) {
|
||||||
range_marker_group->move (0.0, tbpos - old_unit_pos);
|
range_marker_group->move (0.0, tbpos - old_unit_pos);
|
||||||
}
|
}
|
||||||
|
old_unit_pos = range_marker_bar_group->property_y();
|
||||||
|
if (tbgpos != old_unit_pos) {
|
||||||
|
range_marker_bar_group->move (0.0, tbgpos - old_unit_pos);
|
||||||
|
}
|
||||||
|
range_marker_bar_group->show();
|
||||||
range_marker_group->show();
|
range_marker_group->show();
|
||||||
tbpos += timebar_height;
|
tbpos += timebar_height;
|
||||||
|
tbgpos += timebar_height;
|
||||||
visible_timebars++;
|
visible_timebars++;
|
||||||
} else {
|
} else {
|
||||||
|
range_marker_bar_group->hide();
|
||||||
range_marker_group->hide();
|
range_marker_group->hide();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -702,11 +725,17 @@ Editor::update_ruler_visibility ()
|
||||||
if (tbpos != old_unit_pos) {
|
if (tbpos != old_unit_pos) {
|
||||||
transport_marker_group->move ( 0.0, tbpos - old_unit_pos);
|
transport_marker_group->move ( 0.0, tbpos - old_unit_pos);
|
||||||
}
|
}
|
||||||
|
old_unit_pos = transport_marker_bar_group->property_y();
|
||||||
|
if (tbgpos != old_unit_pos) {
|
||||||
|
transport_marker_bar_group->move ( 0.0, tbgpos - old_unit_pos);
|
||||||
|
}
|
||||||
|
transport_marker_bar_group->show();
|
||||||
transport_marker_group->show();
|
transport_marker_group->show();
|
||||||
tbpos += timebar_height;
|
tbpos += timebar_height;
|
||||||
|
tbgpos += timebar_height;
|
||||||
visible_timebars++;
|
visible_timebars++;
|
||||||
}
|
} else {
|
||||||
else {
|
transport_marker_bar_group->hide();
|
||||||
transport_marker_group->hide();
|
transport_marker_group->hide();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -716,13 +745,19 @@ Editor::update_ruler_visibility ()
|
||||||
if (tbpos != old_unit_pos) {
|
if (tbpos != old_unit_pos) {
|
||||||
cd_marker_group->move (0.0, tbpos - old_unit_pos);
|
cd_marker_group->move (0.0, tbpos - old_unit_pos);
|
||||||
}
|
}
|
||||||
|
old_unit_pos = cd_marker_bar_group->property_y();
|
||||||
|
if (tbgpos != old_unit_pos) {
|
||||||
|
cd_marker_bar_group->move (0.0, tbgpos - old_unit_pos);
|
||||||
|
}
|
||||||
|
cd_marker_bar_group->show();
|
||||||
cd_marker_group->show();
|
cd_marker_group->show();
|
||||||
tbpos += timebar_height;
|
tbpos += timebar_height;
|
||||||
|
tbgpos += timebar_height;
|
||||||
visible_timebars++;
|
visible_timebars++;
|
||||||
// make sure all cd markers show up in their respective places
|
// make sure all cd markers show up in their respective places
|
||||||
update_cd_marker_display();
|
update_cd_marker_display();
|
||||||
}
|
} else {
|
||||||
else {
|
cd_marker_bar_group->hide();
|
||||||
cd_marker_group->hide();
|
cd_marker_group->hide();
|
||||||
// make sure all cd markers show up in their respective places
|
// make sure all cd markers show up in their respective places
|
||||||
update_cd_marker_display();
|
update_cd_marker_display();
|
||||||
|
|
@ -734,21 +769,42 @@ Editor::update_ruler_visibility ()
|
||||||
if (tbpos != old_unit_pos) {
|
if (tbpos != old_unit_pos) {
|
||||||
marker_group->move ( 0.0, tbpos - old_unit_pos);
|
marker_group->move ( 0.0, tbpos - old_unit_pos);
|
||||||
}
|
}
|
||||||
|
old_unit_pos = marker_bar_group->property_y();
|
||||||
|
if (tbgpos != old_unit_pos) {
|
||||||
|
marker_bar_group->move ( 0.0, tbgpos - old_unit_pos);
|
||||||
|
}
|
||||||
|
marker_bar_group->show();
|
||||||
marker_group->show();
|
marker_group->show();
|
||||||
tbpos += timebar_height;
|
tbpos += timebar_height;
|
||||||
|
tbgpos += timebar_height;
|
||||||
visible_timebars++;
|
visible_timebars++;
|
||||||
}
|
} else {
|
||||||
else {
|
marker_bar_group->hide();
|
||||||
marker_group->hide();
|
marker_group->hide();
|
||||||
}
|
}
|
||||||
|
|
||||||
time_canvas_vbox.set_size_request (-1, (int)(timebar_height * visible_timebars));
|
gdouble old_canvas_timebars_vsize = canvas_timebars_vsize;
|
||||||
|
canvas_timebars_vsize = timebar_height * visible_timebars;
|
||||||
|
gdouble vertical_pos_delta = canvas_timebars_vsize - old_canvas_timebars_vsize;
|
||||||
|
|
||||||
|
if (vertical_pos_delta < 0 && (vertical_adjustment.get_value() + canvas_height) >= vertical_adjustment.get_upper()) {
|
||||||
|
/*if we're at the bottom of the canvas, don't move the _trackview_grooup*/
|
||||||
|
vertical_adjustment.set_upper(vertical_adjustment.get_upper() + vertical_pos_delta);
|
||||||
|
} else {
|
||||||
|
vertical_adjustment.set_upper(vertical_adjustment.get_upper() + vertical_pos_delta);
|
||||||
|
_trackview_group->move (0, vertical_pos_delta);
|
||||||
|
}
|
||||||
|
ruler_label_vbox.set_size_request (-1, (int)(timebar_height * visible_rulers));
|
||||||
|
|
||||||
|
time_canvas_vbox.set_size_request (-1,-1);
|
||||||
time_canvas_event_box.queue_resize();
|
time_canvas_event_box.queue_resize();
|
||||||
compute_fixed_ruler_scale();
|
compute_fixed_ruler_scale();
|
||||||
update_fixed_rulers();
|
update_fixed_rulers();
|
||||||
|
redisplay_tempo (false);
|
||||||
|
|
||||||
time_canvas_event_box.show_all();
|
time_canvas_event_box.show_all();
|
||||||
time_button_frame.show_all();
|
ruler_label_event_box.show_all();
|
||||||
|
time_button_event_box.show_all();
|
||||||
|
|
||||||
compute_current_bbt_points (leftmost_frame, leftmost_frame + (nframes64_t)(edit_packer.get_width() * frames_per_unit));
|
compute_current_bbt_points (leftmost_frame, leftmost_frame + (nframes64_t)(edit_packer.get_width() * frames_per_unit));
|
||||||
compute_bbt_ruler_scale (leftmost_frame, leftmost_frame + (nframes64_t)(edit_packer.get_width() * frames_per_unit));
|
compute_bbt_ruler_scale (leftmost_frame, leftmost_frame + (nframes64_t)(edit_packer.get_width() * frames_per_unit));
|
||||||
|
|
@ -1704,7 +1760,7 @@ Editor::metric_get_frames (GtkCustomRulerMark **marks, gdouble lower, gdouble up
|
||||||
nmarks = 5;
|
nmarks = 5;
|
||||||
*marks = (GtkCustomRulerMark *) g_malloc (sizeof(GtkCustomRulerMark) * nmarks);
|
*marks = (GtkCustomRulerMark *) g_malloc (sizeof(GtkCustomRulerMark) * nmarks);
|
||||||
for (n = 0, pos = ilower; n < nmarks; pos += mark_interval, ++n) {
|
for (n = 0, pos = ilower; n < nmarks; pos += mark_interval, ++n) {
|
||||||
snprintf (buf, sizeof(buf), "%u", pos);
|
snprintf (buf, sizeof(buf), "%" PRIi64, pos);
|
||||||
(*marks)[n].label = g_strdup (buf);
|
(*marks)[n].label = g_strdup (buf);
|
||||||
(*marks)[n].position = pos;
|
(*marks)[n].position = pos;
|
||||||
(*marks)[n].style = GtkCustomRulerMarkMajor;
|
(*marks)[n].style = GtkCustomRulerMarkMajor;
|
||||||
|
|
|
||||||
|
|
@ -171,11 +171,36 @@ Editor::compute_current_bbt_points (nframes_t leftmost, nframes_t rightmost)
|
||||||
current_bbt_points = session->tempo_map().get_points (session->tempo_map().frame_time (previous_beat), session->tempo_map().frame_time (next_beat) + 1);
|
current_bbt_points = session->tempo_map().get_points (session->tempo_map().frame_time (previous_beat), session->tempo_map().frame_time (next_beat) + 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ArdourCanvas::SimpleLine *
|
||||||
|
Editor::get_time_line ()
|
||||||
|
{
|
||||||
|
ArdourCanvas::SimpleLine *line;
|
||||||
|
|
||||||
|
if (free_measure_lines.empty()) {
|
||||||
|
line = new ArdourCanvas::SimpleLine (*time_line_group);
|
||||||
|
used_measure_lines.push_back (line);
|
||||||
|
} else {
|
||||||
|
line = free_measure_lines.front();
|
||||||
|
free_measure_lines.erase (free_measure_lines.begin());
|
||||||
|
used_measure_lines.push_back (line);
|
||||||
|
}
|
||||||
|
|
||||||
|
return line;
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
Editor::hide_measures ()
|
Editor::hide_measures ()
|
||||||
{
|
{
|
||||||
tempo_lines->hide();
|
// from old pre-merge 3.0
|
||||||
marker_tempo_lines->hide();
|
// tempo_lines->hide();
|
||||||
|
// marker_tempo_lines->hide();
|
||||||
|
|
||||||
|
for (TimeLineList::iterator i = used_measure_lines.begin(); i != used_measure_lines.end(); ++i) {
|
||||||
|
(*i)->hide();
|
||||||
|
free_measure_lines.push_back (*i);
|
||||||
|
}
|
||||||
|
|
||||||
|
used_measure_lines.clear ();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
|
|
@ -195,16 +220,68 @@ Editor::draw_measures ()
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
tempo_lines->draw(*current_bbt_points, frames_per_unit);
|
TempoMap::BBTPointList::iterator i;
|
||||||
marker_tempo_lines->draw(*current_bbt_points, frames_per_unit);
|
ArdourCanvas::SimpleLine *line;
|
||||||
|
gdouble xpos;
|
||||||
|
double beat_density;
|
||||||
|
|
||||||
|
uint32_t beats = 0;
|
||||||
|
uint32_t bars = 0;
|
||||||
|
uint32_t color;
|
||||||
|
|
||||||
|
if (current_bbt_points == 0 || current_bbt_points->empty()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* get the first bar spacing */
|
||||||
|
|
||||||
|
i = current_bbt_points->end();
|
||||||
|
i--;
|
||||||
|
bars = (*i).bar - (*current_bbt_points->begin()).bar;
|
||||||
|
beats = current_bbt_points->size() - bars;
|
||||||
|
|
||||||
|
beat_density = (beats * 10.0f) / track_canvas->get_width ();
|
||||||
|
|
||||||
|
if (beat_density > 4.0f) {
|
||||||
|
/* if the lines are too close together, they become useless
|
||||||
|
*/
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = current_bbt_points->begin(); i != current_bbt_points->end(); ++i) {
|
||||||
|
|
||||||
|
switch ((*i).type) {
|
||||||
|
case TempoMap::Bar:
|
||||||
|
break;
|
||||||
|
|
||||||
|
case TempoMap::Beat:
|
||||||
|
|
||||||
|
if ((*i).beat == 1) {
|
||||||
|
color = ARDOUR_UI::config()->canvasvar_MeasureLineBar.get();
|
||||||
|
} else {
|
||||||
|
color = ARDOUR_UI::config()->canvasvar_MeasureLineBeat.get();
|
||||||
|
|
||||||
|
if (beat_density > 2.0) {
|
||||||
|
/* only draw beat lines if the gaps between beats are large.
|
||||||
|
*/
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
xpos = frame_to_unit ((nframes64_t) (*i).frame);
|
||||||
|
line = get_time_line ();
|
||||||
|
line->property_x1() = xpos;
|
||||||
|
line->property_x2() = xpos;
|
||||||
|
line->property_y2() = canvas_height;
|
||||||
|
line->property_color_rgba() = color;
|
||||||
|
//line->raise_to_top();
|
||||||
|
line->show();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*time_line_group->raise_to_top();
|
|
||||||
time_line_group->lower(1);*/
|
|
||||||
marker_time_line_group->raise_to_top();
|
|
||||||
//marker_time_line_group->lower(1);
|
|
||||||
|
|
||||||
/* the cursors are always on top of everything */
|
/* the cursors are always on top of everything */
|
||||||
cursor_group->raise_to_top();
|
//cursor_group->raise_to_top();
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
113
gtk2_ardour/lv2_plugin_ui.cc
Normal file
113
gtk2_ardour/lv2_plugin_ui.cc
Normal file
|
|
@ -0,0 +1,113 @@
|
||||||
|
/*
|
||||||
|
Copyright (C) 2008 Paul Davis
|
||||||
|
Author: Dave Robillard
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <ardour/insert.h>
|
||||||
|
#include <ardour/lv2_plugin.h>
|
||||||
|
|
||||||
|
#include "lv2_plugin_ui.h"
|
||||||
|
|
||||||
|
using namespace Gtk;
|
||||||
|
using namespace ARDOUR;
|
||||||
|
using namespace PBD;
|
||||||
|
|
||||||
|
void
|
||||||
|
LV2PluginUI::lv2_ui_write(LV2UI_Controller controller,
|
||||||
|
uint32_t port_index,
|
||||||
|
uint32_t buffer_size,
|
||||||
|
uint32_t format,
|
||||||
|
const void* buffer)
|
||||||
|
{
|
||||||
|
LV2PluginUI* me = (LV2PluginUI*)controller;
|
||||||
|
if (*(float*)buffer != me->_values[port_index])
|
||||||
|
me->_lv2->set_parameter(port_index, *(float*)buffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
LV2PluginUI::parameter_changed (uint32_t port_index, float val)
|
||||||
|
{
|
||||||
|
if (val != _values[port_index]) {
|
||||||
|
const LV2UI_Descriptor* ui_desc = slv2_ui_instance_get_descriptor(_inst);
|
||||||
|
LV2UI_Handle ui_handle = slv2_ui_instance_get_handle(_inst);
|
||||||
|
if (ui_desc->port_event)
|
||||||
|
ui_desc->port_event(ui_handle, port_index, 4, 0, &val);
|
||||||
|
_values[port_index] = val;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
LV2PluginUI::LV2PluginUI (boost::shared_ptr<PluginInsert> pi, boost::shared_ptr<LV2Plugin> lv2p)
|
||||||
|
: PlugUIBase (pi)
|
||||||
|
, _lv2(lv2p)
|
||||||
|
{
|
||||||
|
_inst = slv2_ui_instantiate(
|
||||||
|
_lv2->slv2_plugin(), _lv2->slv2_ui(), LV2PluginUI::lv2_ui_write, this,
|
||||||
|
_lv2->features());
|
||||||
|
|
||||||
|
GtkWidget* c_widget = (GtkWidget*)slv2_ui_instance_get_widget(_inst);
|
||||||
|
_gui_widget = Glib::wrap(c_widget);
|
||||||
|
_gui_widget->show_all();
|
||||||
|
pack_start(*_gui_widget, true, true);
|
||||||
|
|
||||||
|
uint32_t num_ports = slv2_plugin_get_num_ports(lv2p->slv2_plugin());
|
||||||
|
_values = new float[num_ports];
|
||||||
|
for (uint32_t i = 0; i < num_ports; ++i) {
|
||||||
|
bool ok;
|
||||||
|
_values[i] = lv2p->nth_parameter(i, ok);
|
||||||
|
if (ok)
|
||||||
|
lv2_ui_write(this, i, 4, /* FIXME: format */0, &_values[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
_lv2->ParameterChanged.connect(mem_fun(*this, &LV2PluginUI::parameter_changed));
|
||||||
|
}
|
||||||
|
|
||||||
|
LV2PluginUI::~LV2PluginUI ()
|
||||||
|
{
|
||||||
|
delete[] _values;
|
||||||
|
// plugin destructor destroys the GUI
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
LV2PluginUI::get_preferred_height ()
|
||||||
|
{
|
||||||
|
Gtk::Requisition r = size_request();
|
||||||
|
return r.height;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
LV2PluginUI::get_preferred_width ()
|
||||||
|
{
|
||||||
|
Gtk::Requisition r = size_request();
|
||||||
|
return r.width;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
LV2PluginUI::package (Gtk::Window& win)
|
||||||
|
{
|
||||||
|
/* forward configure events to plugin window */
|
||||||
|
win.signal_configure_event().connect (mem_fun (*this, &LV2PluginUI::configure_handler));
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
LV2PluginUI::configure_handler (GdkEventConfigure* ev)
|
||||||
|
{
|
||||||
|
cout << "CONFIGURE" << endl;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
76
gtk2_ardour/lv2_plugin_ui.h
Normal file
76
gtk2_ardour/lv2_plugin_ui.h
Normal file
|
|
@ -0,0 +1,76 @@
|
||||||
|
/*
|
||||||
|
Copyright (C) 2008 Paul Davis
|
||||||
|
Author: Dave Robillard
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __ardour_lv2_plugin_ui_h__
|
||||||
|
#define __ardour_lv2_plugin_ui_h__
|
||||||
|
|
||||||
|
#include <vector>
|
||||||
|
#include <map>
|
||||||
|
#include <list>
|
||||||
|
|
||||||
|
#include <sigc++/signal.h>
|
||||||
|
#include <gtkmm/widget.h>
|
||||||
|
|
||||||
|
#include <ardour_dialog.h>
|
||||||
|
#include <ardour/types.h>
|
||||||
|
#include "plugin_ui.h"
|
||||||
|
|
||||||
|
#ifdef HAVE_LV2
|
||||||
|
|
||||||
|
namespace ARDOUR {
|
||||||
|
class PluginInsert;
|
||||||
|
class LV2Plugin;
|
||||||
|
}
|
||||||
|
|
||||||
|
class LV2PluginUI : public PlugUIBase, public Gtk::VBox
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
LV2PluginUI (boost::shared_ptr<ARDOUR::PluginInsert>, boost::shared_ptr<ARDOUR::LV2Plugin>);
|
||||||
|
~LV2PluginUI ();
|
||||||
|
|
||||||
|
gint get_preferred_height ();
|
||||||
|
gint get_preferred_width ();
|
||||||
|
bool start_updating(GdkEventAny*) {return false;}
|
||||||
|
bool stop_updating(GdkEventAny*) {return false;}
|
||||||
|
|
||||||
|
int package (Gtk::Window&);
|
||||||
|
|
||||||
|
private:
|
||||||
|
boost::shared_ptr<ARDOUR::LV2Plugin> _lv2;
|
||||||
|
|
||||||
|
Gtk::Widget* _gui_widget;
|
||||||
|
SLV2UIInstance _inst;
|
||||||
|
float* _values;
|
||||||
|
|
||||||
|
static void lv2_ui_write(
|
||||||
|
LV2UI_Controller controller,
|
||||||
|
uint32_t port_index,
|
||||||
|
uint32_t buffer_size,
|
||||||
|
uint32_t format,
|
||||||
|
const void* buffer);
|
||||||
|
|
||||||
|
void parameter_changed(uint32_t, float);
|
||||||
|
bool configure_handler (GdkEventConfigure*);
|
||||||
|
void save_plugin_setting ();
|
||||||
|
};
|
||||||
|
#endif // HAVE_LV2
|
||||||
|
|
||||||
|
#endif /* __ardour_lv2_plugin_ui_h__ */
|
||||||
|
|
||||||
|
|
@ -18,6 +18,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <cstdlib>
|
#include <cstdlib>
|
||||||
|
#include <signal.h>
|
||||||
|
|
||||||
#include <sigc++/bind.h>
|
#include <sigc++/bind.h>
|
||||||
#include <gtkmm/settings.h>
|
#include <gtkmm/settings.h>
|
||||||
|
|
@ -252,6 +253,7 @@ fixup_bundle_environment ()
|
||||||
path += "/../Resources/gdk-pixbuf.loaders";
|
path += "/../Resources/gdk-pixbuf.loaders";
|
||||||
|
|
||||||
setenv ("GDK_PIXBUF_MODULE_FILE", path.c_str(), 1);
|
setenv ("GDK_PIXBUF_MODULE_FILE", path.c_str(), 1);
|
||||||
|
cerr << "Set GDK_PIXBUF_MODULE_FILE to " << path << endl;
|
||||||
|
|
||||||
if (getenv ("ARDOUR_WITH_JACK")) {
|
if (getenv ("ARDOUR_WITH_JACK")) {
|
||||||
// JACK driver dir
|
// JACK driver dir
|
||||||
|
|
@ -265,6 +267,12 @@ fixup_bundle_environment ()
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
static void
|
||||||
|
sigpipe_handler (int sig)
|
||||||
|
{
|
||||||
|
cerr << _("SIGPIPE received - JACK has probably died") << endl;
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef VST_SUPPORT
|
#ifdef VST_SUPPORT
|
||||||
/* this is called from the entry point of a wine-compiled
|
/* this is called from the entry point of a wine-compiled
|
||||||
executable that is linked against gtk2_ardour built
|
executable that is linked against gtk2_ardour built
|
||||||
|
|
@ -278,9 +286,12 @@ int main (int argc, char *argv[])
|
||||||
{
|
{
|
||||||
vector<Glib::ustring> null_file_list;
|
vector<Glib::ustring> null_file_list;
|
||||||
|
|
||||||
|
cerr << "here we go\n";
|
||||||
|
|
||||||
#ifdef __APPLE__
|
#ifdef __APPLE__
|
||||||
fixup_bundle_environment ();
|
fixup_bundle_environment ();
|
||||||
#endif
|
#endif
|
||||||
|
cerr << "just did it\n";
|
||||||
|
|
||||||
Glib::thread_init();
|
Glib::thread_init();
|
||||||
gtk_set_locale ();
|
gtk_set_locale ();
|
||||||
|
|
@ -339,6 +350,10 @@ int main (int argc, char *argv[])
|
||||||
|
|
||||||
PBD::ID::init ();
|
PBD::ID::init ();
|
||||||
|
|
||||||
|
if (::signal (SIGPIPE, sigpipe_handler)) {
|
||||||
|
cerr << _("Cannot install SIGPIPE error handler") << endl;
|
||||||
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
ui = new ARDOUR_UI (&argc, &argv);
|
ui = new ARDOUR_UI (&argc, &argv);
|
||||||
} catch (failed_constructor& err) {
|
} catch (failed_constructor& err) {
|
||||||
|
|
|
||||||
|
|
@ -245,7 +245,7 @@ Marker::Marker (PublicEditor& ed, ArdourCanvas::Group& parent, guint32 rgba, con
|
||||||
mark->property_outline_color_rgba() = rgba;
|
mark->property_outline_color_rgba() = rgba;
|
||||||
mark->property_width_pixels() = 1;
|
mark->property_width_pixels() = 1;
|
||||||
Pango::FontDescription* font = get_font_for_style (N_("MarkerText"));
|
Pango::FontDescription* font = get_font_for_style (N_("MarkerText"));
|
||||||
|
//cerr << " font->get_size() = " << font->get_size() << " is_absolute = " << pango_font_description_get_size_is_absolute(font->gobj()) << " to_string = " << font->to_string() << endl;
|
||||||
text = new Text (*group);
|
text = new Text (*group);
|
||||||
text->property_font_desc() = *font;
|
text->property_font_desc() = *font;
|
||||||
text->property_text() = annotation.c_str();
|
text->property_text() = annotation.c_str();
|
||||||
|
|
|
||||||
|
|
@ -665,7 +665,9 @@ void
|
||||||
Mixer_UI::track_list_delete (const Gtk::TreeModel::Path& path)
|
Mixer_UI::track_list_delete (const Gtk::TreeModel::Path& path)
|
||||||
{
|
{
|
||||||
session->set_remote_control_ids();
|
session->set_remote_control_ids();
|
||||||
|
ignore_route_reorder = true;
|
||||||
redisplay_track_list ();
|
redisplay_track_list ();
|
||||||
|
ignore_route_reorder = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
|
||||||
|
|
@ -314,7 +314,7 @@ PluginSelector::ladspa_refiller (const std::string& filterstr)
|
||||||
void
|
void
|
||||||
PluginSelector::lv2_refiller (const std::string& filterstr)
|
PluginSelector::lv2_refiller (const std::string& filterstr)
|
||||||
{
|
{
|
||||||
#ifdef HAVE_SLV2
|
#ifdef HAVE_LV2
|
||||||
refiller (manager->lv2_plugin_info(), filterstr, "LV2");
|
refiller (manager->lv2_plugin_info(), filterstr, "LV2");
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
@ -520,7 +520,7 @@ PluginSelector::plugin_menu()
|
||||||
#ifdef HAVE_AUDIOUNITS
|
#ifdef HAVE_AUDIOUNITS
|
||||||
all_plugs.insert (all_plugs.end(), manager->au_plugin_info().begin(), manager->au_plugin_info().end());
|
all_plugs.insert (all_plugs.end(), manager->au_plugin_info().begin(), manager->au_plugin_info().end());
|
||||||
#endif
|
#endif
|
||||||
#ifdef HAVE_SLV2
|
#ifdef HAVE_LV2
|
||||||
all_plugs.insert (all_plugs.end(), manager->lv2_plugin_info().begin(), manager->lv2_plugin_info().end());
|
all_plugs.insert (all_plugs.end(), manager->lv2_plugin_info().begin(), manager->lv2_plugin_info().end());
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -42,6 +42,10 @@
|
||||||
#ifdef VST_SUPPORT
|
#ifdef VST_SUPPORT
|
||||||
#include <ardour/vst_plugin.h>
|
#include <ardour/vst_plugin.h>
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef HAVE_LV2
|
||||||
|
#include <ardour/lv2_plugin.h>
|
||||||
|
#include "lv2_plugin_ui.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <lrdf.h>
|
#include <lrdf.h>
|
||||||
|
|
||||||
|
|
@ -86,6 +90,10 @@ PluginUIWindow::PluginUIWindow (Gtk::Window* win, boost::shared_ptr<PluginInsert
|
||||||
error << _("Eh? LADSPA plugins don't have editors!") << endmsg;
|
error << _("Eh? LADSPA plugins don't have editors!") << endmsg;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case ARDOUR::LV2:
|
||||||
|
have_gui = create_lv2_editor (insert);
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
#ifndef VST_SUPPORT
|
#ifndef VST_SUPPORT
|
||||||
error << _("unknown type of editor-supplying plugin (note: no VST support in this version of ardour)")
|
error << _("unknown type of editor-supplying plugin (note: no VST support in this version of ardour)")
|
||||||
|
|
@ -250,6 +258,30 @@ PluginUIWindow::app_activated (bool yn)
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
PluginUIWindow::create_lv2_editor(boost::shared_ptr<PluginInsert> insert)
|
||||||
|
{
|
||||||
|
#ifndef HAVE_LV2
|
||||||
|
return false;
|
||||||
|
#else
|
||||||
|
|
||||||
|
boost::shared_ptr<LV2Plugin> vp;
|
||||||
|
|
||||||
|
if ((vp = boost::dynamic_pointer_cast<LV2Plugin> (insert->plugin())) == 0) {
|
||||||
|
error << _("create_lv2_editor called on non-LV2 plugin") << endmsg;
|
||||||
|
throw failed_constructor ();
|
||||||
|
} else {
|
||||||
|
LV2PluginUI* lpu = new LV2PluginUI (insert, vp);
|
||||||
|
_pluginui = lpu;
|
||||||
|
add (*lpu);
|
||||||
|
lpu->package (*this);
|
||||||
|
}
|
||||||
|
|
||||||
|
non_gtk_gui = false;
|
||||||
|
return true;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
PluginUIWindow::on_key_press_event (GdkEventKey* event)
|
PluginUIWindow::on_key_press_event (GdkEventKey* event)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -234,6 +234,7 @@ class PluginUIWindow : public Gtk::Window
|
||||||
|
|
||||||
bool create_vst_editor (boost::shared_ptr<ARDOUR::PluginInsert>);
|
bool create_vst_editor (boost::shared_ptr<ARDOUR::PluginInsert>);
|
||||||
bool create_audiounit_editor (boost::shared_ptr<ARDOUR::PluginInsert>);
|
bool create_audiounit_editor (boost::shared_ptr<ARDOUR::PluginInsert>);
|
||||||
|
bool create_lv2_editor (boost::shared_ptr<ARDOUR::PluginInsert>);
|
||||||
};
|
};
|
||||||
|
|
||||||
#ifdef VST_SUPPORT
|
#ifdef VST_SUPPORT
|
||||||
|
|
|
||||||
|
|
@ -336,7 +336,12 @@ class PublicEditor : public Gtk::Window, public PBD::StatefulThingWithGoingAway
|
||||||
static const int vertical_spacing;
|
static const int vertical_spacing;
|
||||||
static const int horizontal_spacing;
|
static const int horizontal_spacing;
|
||||||
|
|
||||||
|
|
||||||
|
virtual gdouble get_trackview_group_vertical_offset () const = 0;
|
||||||
|
virtual ArdourCanvas::Group* get_trackview_group () const = 0;
|
||||||
|
|
||||||
/// Singleton instance, set up by Editor::Editor()
|
/// Singleton instance, set up by Editor::Editor()
|
||||||
|
|
||||||
static PublicEditor* _instance;
|
static PublicEditor* _instance;
|
||||||
|
|
||||||
friend class PluginUIWindow;
|
friend class PluginUIWindow;
|
||||||
|
|
|
||||||
|
|
@ -230,7 +230,8 @@ RegionView::region_changed (Change what_changed)
|
||||||
*/
|
*/
|
||||||
/*
|
/*
|
||||||
if (what_changed & Region::LayerChanged) {
|
if (what_changed & Region::LayerChanged) {
|
||||||
region_layered ();
|
// this is handled by the playlist i believe
|
||||||
|
//region_layered ();
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
if (what_changed & Region::LockChanged) {
|
if (what_changed & Region::LockChanged) {
|
||||||
|
|
@ -285,7 +286,7 @@ RegionView::region_layered ()
|
||||||
{
|
{
|
||||||
RouteTimeAxisView *rtv = dynamic_cast<RouteTimeAxisView*>(&get_time_axis_view());
|
RouteTimeAxisView *rtv = dynamic_cast<RouteTimeAxisView*>(&get_time_axis_view());
|
||||||
assert(rtv);
|
assert(rtv);
|
||||||
rtv->view()->region_layered (this);
|
//rtv->view()->region_layered (this);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
|
||||||
|
|
@ -266,8 +266,10 @@ SoundFileBox::setup_labels (const ustring& filename)
|
||||||
samplerate.set_name ("NewSessionSR2Label");
|
samplerate.set_name ("NewSessionSR2Label");
|
||||||
}
|
}
|
||||||
|
|
||||||
length_clock.set (sf_info.length, true);
|
double src_coef = (double) _session->nominal_frame_rate() / sf_info.samplerate;
|
||||||
timecode_clock.set (sf_info.timecode, true);
|
|
||||||
|
length_clock.set (sf_info.length * src_coef + 0.5, true);
|
||||||
|
timecode_clock.set (sf_info.timecode * src_coef + 0.5, true);
|
||||||
|
|
||||||
// this is a hack that is fixed in trunk, i think (august 26th, 2007)
|
// this is a hack that is fixed in trunk, i think (august 26th, 2007)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -49,7 +49,6 @@ StreamView::StreamView (RouteTimeAxisView& tv, ArdourCanvas::Group* group)
|
||||||
: _trackview (tv)
|
: _trackview (tv)
|
||||||
, owns_canvas_group(group == 0)
|
, owns_canvas_group(group == 0)
|
||||||
, canvas_group(group ? group : new ArdourCanvas::Group(*_trackview.canvas_display))
|
, canvas_group(group ? group : new ArdourCanvas::Group(*_trackview.canvas_display))
|
||||||
, canvas_rect(new ArdourCanvas::SimpleRect (*canvas_group))
|
|
||||||
, _samples_per_unit(_trackview.editor.get_current_zoom())
|
, _samples_per_unit(_trackview.editor.get_current_zoom())
|
||||||
, rec_updating(false)
|
, rec_updating(false)
|
||||||
, rec_active(false)
|
, rec_active(false)
|
||||||
|
|
@ -63,11 +62,15 @@ StreamView::StreamView (RouteTimeAxisView& tv, ArdourCanvas::Group* group)
|
||||||
{
|
{
|
||||||
/* set_position() will position the group */
|
/* set_position() will position the group */
|
||||||
|
|
||||||
|
canvas_rect = new ArdourCanvas::SimpleRect (*canvas_group);
|
||||||
canvas_rect->property_x1() = 0.0;
|
canvas_rect->property_x1() = 0.0;
|
||||||
canvas_rect->property_y1() = 0.0;
|
canvas_rect->property_y1() = 0.0;
|
||||||
canvas_rect->property_x2() = _trackview.editor.frame_to_pixel (max_frames);
|
canvas_rect->property_x2() = _trackview.editor.frame_to_pixel (max_frames - 1);
|
||||||
canvas_rect->property_y2() = (double) tv.current_height();
|
canvas_rect->property_y2() = (double) tv.current_height();
|
||||||
canvas_rect->property_outline_what() = (guint32) (0x2|0x8); // outline RHS and bottom
|
|
||||||
|
// DR-way
|
||||||
|
// canvas_rect->property_outline_what() = (guint32) (0x2|0x8); // outline RHS and bottom
|
||||||
|
canvas_rect->property_outline_what() = (guint32) (0x1|0x2|0x8); // outline ends and bottom
|
||||||
// (Fill/Outline colours set in derived classes)
|
// (Fill/Outline colours set in derived classes)
|
||||||
|
|
||||||
canvas_rect->signal_event().connect (bind (mem_fun (_trackview.editor, &PublicEditor::canvas_stream_view_event), canvas_rect, &_trackview));
|
canvas_rect->signal_event().connect (bind (mem_fun (_trackview.editor, &PublicEditor::canvas_stream_view_event), canvas_rect, &_trackview));
|
||||||
|
|
@ -294,18 +297,12 @@ StreamView::apply_color (Gdk::Color& color, ColorTarget target)
|
||||||
void
|
void
|
||||||
StreamView::region_layered (RegionView* rv)
|
StreamView::region_layered (RegionView* rv)
|
||||||
{
|
{
|
||||||
|
/* don't ever leave it at the bottom, since then it doesn't
|
||||||
/*
|
get events - the parent group does instead ...
|
||||||
Currently 'layer' has nothing to do with the desired canvas layer.
|
we need to raise it above the streamview's
|
||||||
For now, ensure that multiple regionviews passed here in groups are
|
canvas_rect, hence the layer+1 here
|
||||||
ordered by 'layer' (lowest to highest).
|
*/
|
||||||
|
rv->get_canvas_group()->raise (rv->region()->layer() + 1);
|
||||||
(see AudioStreamView::redisplay_diskstream ()).
|
|
||||||
|
|
||||||
We move them to the top layer as they arrive.
|
|
||||||
*/
|
|
||||||
|
|
||||||
rv->get_canvas_group()->raise_to_top();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
|
||||||
|
|
@ -74,7 +74,7 @@ public:
|
||||||
|
|
||||||
void set_layer_display (LayerDisplay);
|
void set_layer_display (LayerDisplay);
|
||||||
|
|
||||||
ArdourCanvas::Item* canvas_item() { return canvas_group; }
|
ArdourCanvas::Group* canvas_item() { return canvas_group; }
|
||||||
|
|
||||||
enum ColorTarget {
|
enum ColorTarget {
|
||||||
RegionColor,
|
RegionColor,
|
||||||
|
|
|
||||||
|
|
@ -83,7 +83,7 @@ TimeAxisView::TimeAxisView (ARDOUR::Session& sess, PublicEditor& ed, TimeAxisVie
|
||||||
need_size_info = false;
|
need_size_info = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
canvas_display = new Group (*canvas.root(), 0.0, 0.0);
|
canvas_display = new Group (*ed.get_trackview_group (), 0.0, 0.0);
|
||||||
|
|
||||||
ghost_group = new Group (*canvas_display);
|
ghost_group = new Group (*canvas_display);
|
||||||
ghost_group->lower_to_bottom();
|
ghost_group->lower_to_bottom();
|
||||||
|
|
@ -240,6 +240,7 @@ TimeAxisView::show_at (double y, int& nth, VBox *parent)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
canvas_display->get_bounds (ix1, iy1, ix2, iy2);
|
canvas_display->get_bounds (ix1, iy1, ix2, iy2);
|
||||||
|
iy1 += editor.get_trackview_group_vertical_offset ();
|
||||||
Group* pg = canvas_display->property_parent();
|
Group* pg = canvas_display->property_parent();
|
||||||
pg->i2w (ix1, iy1);
|
pg->i2w (ix1, iy1);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -150,7 +150,7 @@ TimeAxisViewItem::init (const string& it_name, double spu, Gdk::Color& base_colo
|
||||||
vestigial_frame = new ArdourCanvas::SimpleRect (*group);
|
vestigial_frame = new ArdourCanvas::SimpleRect (*group);
|
||||||
vestigial_frame->property_x1() = (double) 0.0;
|
vestigial_frame->property_x1() = (double) 0.0;
|
||||||
vestigial_frame->property_y1() = (double) 1.0;
|
vestigial_frame->property_y1() = (double) 1.0;
|
||||||
vestigial_frame->property_x2() = 2.0;
|
vestigial_frame->property_x2() = (double) 2.0;
|
||||||
vestigial_frame->property_y2() = (double) trackview.current_height();
|
vestigial_frame->property_y2() = (double) trackview.current_height();
|
||||||
vestigial_frame->property_outline_what() = 0xF;
|
vestigial_frame->property_outline_what() = 0xF;
|
||||||
vestigial_frame->property_outline_color_rgba() = ARDOUR_UI::config()->canvasvar_VestigialFrame.get();
|
vestigial_frame->property_outline_color_rgba() = ARDOUR_UI::config()->canvasvar_VestigialFrame.get();
|
||||||
|
|
@ -644,7 +644,7 @@ TimeAxisViewItem::get_canvas_frame()
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
ArdourCanvas::Item*
|
ArdourCanvas::Group*
|
||||||
TimeAxisViewItem::get_canvas_group()
|
TimeAxisViewItem::get_canvas_group()
|
||||||
{
|
{
|
||||||
return (group) ;
|
return (group) ;
|
||||||
|
|
|
||||||
|
|
@ -216,7 +216,7 @@ class TimeAxisViewItem : public Selectable
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
ArdourCanvas::Item* get_canvas_group();
|
ArdourCanvas::Group* get_canvas_group();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
|
|
|
||||||
|
|
@ -571,23 +571,21 @@ get_xpm (std::string name)
|
||||||
|
|
||||||
sys::path data_file_path;
|
sys::path data_file_path;
|
||||||
|
|
||||||
if (!find_file_in_search_path (spath, name, data_file_path)) {
|
if(!find_file_in_search_path (spath, name, data_file_path)) {
|
||||||
fatal << string_compose (_("cannot find XPM file for %1"), name) << endmsg;
|
fatal << string_compose (_("cannot find XPM file for %1"), name) << endmsg;
|
||||||
/*NOTREACHED*/
|
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
xpm_map[name] = Gdk::Pixbuf::create_from_file (data_file_path.to_string());
|
xpm_map[name] = Gdk::Pixbuf::create_from_file (data_file_path.to_string());
|
||||||
}
|
} catch(const Glib::Error& e) {
|
||||||
|
|
||||||
catch(const Glib::Error& e) {
|
|
||||||
warning << "Caught Glib::Error: " << e.what() << endmsg;
|
warning << "Caught Glib::Error: " << e.what() << endmsg;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return xpm_map[name];
|
return xpm_map[name];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Glib::RefPtr<Gdk::Pixbuf>
|
Glib::RefPtr<Gdk::Pixbuf>
|
||||||
get_icon (const char* cname)
|
get_icon (const char* cname)
|
||||||
{
|
{
|
||||||
|
|
@ -608,15 +606,11 @@ get_icon (const char* cname)
|
||||||
Glib::RefPtr<Gdk::Pixbuf> img;
|
Glib::RefPtr<Gdk::Pixbuf> img;
|
||||||
try {
|
try {
|
||||||
img = Gdk::Pixbuf::create_from_file (data_file_path.to_string());
|
img = Gdk::Pixbuf::create_from_file (data_file_path.to_string());
|
||||||
|
} catch (const Gdk::PixbufError &e) {
|
||||||
|
cerr << "Caught PixbufError: " << e.what() << endl;
|
||||||
|
} catch (...) {
|
||||||
|
g_message("Caught ... ");
|
||||||
}
|
}
|
||||||
catch (const Gdk::PixbufError &e)
|
|
||||||
{
|
|
||||||
cerr << "Caught PixbufError: " << e.what() << endl;
|
|
||||||
}
|
|
||||||
catch (...)
|
|
||||||
{
|
|
||||||
g_message("Caught ... ");
|
|
||||||
}
|
|
||||||
|
|
||||||
return img;
|
return img;
|
||||||
}
|
}
|
||||||
|
|
@ -701,7 +695,7 @@ set_pango_fontsize ()
|
||||||
{
|
{
|
||||||
long val = ARDOUR::Config->get_font_scale();
|
long val = ARDOUR::Config->get_font_scale();
|
||||||
|
|
||||||
/* FT2 rendering */
|
/* FT2 rendering - used by GnomeCanvas, sigh */
|
||||||
|
|
||||||
pango_ft2_font_map_set_resolution ((PangoFT2FontMap*) pango_ft2_font_map_for_display(), val/1024, val/1024);
|
pango_ft2_font_map_set_resolution ((PangoFT2FontMap*) pango_ft2_font_map_for_display(), val/1024, val/1024);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -60,9 +60,14 @@ class LV2Plugin : public ARDOUR::Plugin
|
||||||
int get_parameter_descriptor (uint32_t which, ParameterDescriptor&) const;
|
int get_parameter_descriptor (uint32_t which, ParameterDescriptor&) const;
|
||||||
uint32_t nth_parameter (uint32_t port, bool& ok) const;
|
uint32_t nth_parameter (uint32_t port, bool& ok) const;
|
||||||
|
|
||||||
|
const void* extension_data(const char* uri) { return _instance->lv2_descriptor->extension_data(uri); }
|
||||||
|
|
||||||
SLV2Plugin slv2_plugin() { return _plugin; }
|
SLV2Plugin slv2_plugin() { return _plugin; }
|
||||||
|
SLV2UI slv2_ui() { return _ui; }
|
||||||
SLV2Port slv2_port(uint32_t i) { return slv2_plugin_get_port_by_index(_plugin, i); }
|
SLV2Port slv2_port(uint32_t i) { return slv2_plugin_get_port_by_index(_plugin, i); }
|
||||||
|
|
||||||
|
const LV2_Feature* const* features() { return _features; }
|
||||||
|
|
||||||
std::set<Parameter> automatable() const;
|
std::set<Parameter> automatable() const;
|
||||||
|
|
||||||
void activate () {
|
void activate () {
|
||||||
|
|
@ -104,14 +109,14 @@ class LV2Plugin : public ARDOUR::Plugin
|
||||||
int set_state(const XMLNode& node);
|
int set_state(const XMLNode& node);
|
||||||
bool save_preset(std::string name);
|
bool save_preset(std::string name);
|
||||||
|
|
||||||
bool has_editor() const { return false; }
|
bool has_editor() const;
|
||||||
|
|
||||||
int require_output_streams (uint32_t);
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void* _module;
|
void* _module;
|
||||||
LV2World& _world;
|
LV2World& _world;
|
||||||
|
LV2_Feature** _features;
|
||||||
SLV2Plugin _plugin;
|
SLV2Plugin _plugin;
|
||||||
|
SLV2UI _ui;
|
||||||
SLV2Value _name;
|
SLV2Value _name;
|
||||||
SLV2Value _author;
|
SLV2Value _author;
|
||||||
SLV2Instance _instance;
|
SLV2Instance _instance;
|
||||||
|
|
@ -123,6 +128,11 @@ class LV2Plugin : public ARDOUR::Plugin
|
||||||
bool _was_activated;
|
bool _was_activated;
|
||||||
vector<bool> _port_is_input;
|
vector<bool> _port_is_input;
|
||||||
|
|
||||||
|
typedef struct { const void* (*extension_data)(const char* uri); } LV2_DataAccess;
|
||||||
|
LV2_DataAccess _data_access_extension_data;
|
||||||
|
LV2_Feature _data_access_feature;
|
||||||
|
LV2_Feature _instance_access_feature;
|
||||||
|
|
||||||
void init (LV2World& world, SLV2Plugin plugin, nframes_t rate);
|
void init (LV2World& world, SLV2Plugin plugin, nframes_t rate);
|
||||||
void run (nframes_t nsamples);
|
void run (nframes_t nsamples);
|
||||||
void latency_compute_run ();
|
void latency_compute_run ();
|
||||||
|
|
@ -149,6 +159,7 @@ struct LV2World {
|
||||||
SLV2Value integer;
|
SLV2Value integer;
|
||||||
SLV2Value toggled;
|
SLV2Value toggled;
|
||||||
SLV2Value srate;
|
SLV2Value srate;
|
||||||
|
SLV2Value gtk_gui;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -217,7 +217,7 @@ class Region : public Automatable, public boost::enable_shared_from_this<Region>
|
||||||
const SourceList& master_sources() const { return _master_sources; }
|
const SourceList& master_sources() const { return _master_sources; }
|
||||||
|
|
||||||
std::vector<string> master_source_names();
|
std::vector<string> master_source_names();
|
||||||
void set_master_sources (SourceList&);
|
void set_master_sources (const SourceList&);
|
||||||
|
|
||||||
/* serialization */
|
/* serialization */
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1081,10 +1081,19 @@ AUPluginInfo::cached_io_configuration (const std::string& unique_id,
|
||||||
|
|
||||||
ARDOUR::BootMessage (string_compose (_("Checking AudioUnit: %1"), name));
|
ARDOUR::BootMessage (string_compose (_("Checking AudioUnit: %1"), name));
|
||||||
|
|
||||||
if (CAAudioUnit::Open (comp, unit) != noErr) {
|
try {
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
if (CAAudioUnit::Open (comp, unit) != noErr) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
} catch (...) {
|
||||||
|
|
||||||
|
warning << string_compose (_("Could not load AU plugin %1 - ignored"), name) << endmsg;
|
||||||
|
return false;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
if ((ret = unit.GetChannelInfo (&channel_info, cnt)) < 0) {
|
if ((ret = unit.GetChannelInfo (&channel_info, cnt)) < 0) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -95,6 +95,7 @@ AudioEngine::~AudioEngine ()
|
||||||
|
|
||||||
if (_running) {
|
if (_running) {
|
||||||
jack_client_close (_jack);
|
jack_client_close (_jack);
|
||||||
|
_jack = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
stop_metering_thread ();
|
stop_metering_thread ();
|
||||||
|
|
@ -121,6 +122,11 @@ _thread_init_callback (void *arg)
|
||||||
int
|
int
|
||||||
AudioEngine::start ()
|
AudioEngine::start ()
|
||||||
{
|
{
|
||||||
|
if (!_jack) {
|
||||||
|
error << _("AudioEngine::start() called while disconnected from JACK") << endmsg;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
if (!_running) {
|
if (!_running) {
|
||||||
|
|
||||||
if (session) {
|
if (session) {
|
||||||
|
|
@ -179,17 +185,13 @@ AudioEngine::start ()
|
||||||
int
|
int
|
||||||
AudioEngine::stop (bool forever)
|
AudioEngine::stop (bool forever)
|
||||||
{
|
{
|
||||||
if (_running) {
|
if (_jack) {
|
||||||
_running = false;
|
|
||||||
stop_metering_thread ();
|
|
||||||
if (forever) {
|
if (forever) {
|
||||||
jack_client_t* foo = _jack;
|
disconnect_from_jack ();
|
||||||
_jack = 0;
|
|
||||||
jack_client_close (foo);
|
|
||||||
} else {
|
} else {
|
||||||
jack_deactivate (_jack);
|
jack_deactivate (_jack);
|
||||||
|
Stopped(); /* EMIT SIGNAL */
|
||||||
}
|
}
|
||||||
Stopped(); /* EMIT SIGNAL */
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return _running ? -1 : 0;
|
return _running ? -1 : 0;
|
||||||
|
|
@ -204,11 +206,13 @@ AudioEngine::get_sync_offset (nframes_t& offset) const
|
||||||
|
|
||||||
jack_position_t pos;
|
jack_position_t pos;
|
||||||
|
|
||||||
(void) jack_transport_query (_jack, &pos);
|
if (_jack) {
|
||||||
|
(void) jack_transport_query (_jack, &pos);
|
||||||
if (pos.valid & JackVideoFrameOffset) {
|
|
||||||
offset = pos.video_offset;
|
if (pos.valid & JackVideoFrameOffset) {
|
||||||
return true;
|
offset = pos.video_offset;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
@ -252,7 +256,7 @@ int
|
||||||
AudioEngine::_xrun_callback (void *arg)
|
AudioEngine::_xrun_callback (void *arg)
|
||||||
{
|
{
|
||||||
AudioEngine* ae = static_cast<AudioEngine*> (arg);
|
AudioEngine* ae = static_cast<AudioEngine*> (arg);
|
||||||
if (ae->jack()) {
|
if (ae->connected()) {
|
||||||
ae->Xrun (); /* EMIT SIGNAL */
|
ae->Xrun (); /* EMIT SIGNAL */
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
|
@ -262,7 +266,7 @@ int
|
||||||
AudioEngine::_graph_order_callback (void *arg)
|
AudioEngine::_graph_order_callback (void *arg)
|
||||||
{
|
{
|
||||||
AudioEngine* ae = static_cast<AudioEngine*> (arg);
|
AudioEngine* ae = static_cast<AudioEngine*> (arg);
|
||||||
if (ae->jack()) {
|
if (ae->connected()) {
|
||||||
ae->GraphReordered (); /* EMIT SIGNAL */
|
ae->GraphReordered (); /* EMIT SIGNAL */
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
|
@ -894,7 +898,8 @@ AudioEngine::halted (void *arg)
|
||||||
ae->_running = false;
|
ae->_running = false;
|
||||||
ae->_buffer_size = 0;
|
ae->_buffer_size = 0;
|
||||||
ae->_frame_rate = 0;
|
ae->_frame_rate = 0;
|
||||||
ae->_jack = 0;
|
|
||||||
|
cerr << "!!! HALTED !!!\n";
|
||||||
|
|
||||||
if (was_running) {
|
if (was_running) {
|
||||||
ae->Halted(); /* EMIT SIGNAL */
|
ae->Halted(); /* EMIT SIGNAL */
|
||||||
|
|
@ -1067,7 +1072,6 @@ AudioEngine::update_total_latency (const Port& port)
|
||||||
void
|
void
|
||||||
AudioEngine::transport_stop ()
|
AudioEngine::transport_stop ()
|
||||||
{
|
{
|
||||||
// cerr << "tell JACK to stop\n";
|
|
||||||
if (_jack) {
|
if (_jack) {
|
||||||
jack_transport_stop (_jack);
|
jack_transport_stop (_jack);
|
||||||
}
|
}
|
||||||
|
|
@ -1211,7 +1215,7 @@ AudioEngine::connect_to_jack (string client_name)
|
||||||
{
|
{
|
||||||
jack_client_name = client_name;
|
jack_client_name = client_name;
|
||||||
|
|
||||||
if ((_jack = jack_client_new (client_name.c_str())) == NULL) {
|
if ((_jack = jack_client_new (client_name.c_str())) == 0) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1223,29 +1227,36 @@ AudioEngine::connect_to_jack (string client_name)
|
||||||
int
|
int
|
||||||
AudioEngine::disconnect_from_jack ()
|
AudioEngine::disconnect_from_jack ()
|
||||||
{
|
{
|
||||||
if (_jack == 0) {
|
if (!_jack) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
jack_client_close (_jack);
|
|
||||||
|
if (_running) {
|
||||||
|
stop_metering_thread ();
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
Glib::Mutex::Lock lm (_process_lock);
|
||||||
|
jack_client_close (_jack);
|
||||||
|
_jack = 0;
|
||||||
|
}
|
||||||
|
|
||||||
_buffer_size = 0;
|
_buffer_size = 0;
|
||||||
_frame_rate = 0;
|
_frame_rate = 0;
|
||||||
|
|
||||||
if (_running) {
|
if (_running) {
|
||||||
stop_metering_thread ();
|
|
||||||
_running = false;
|
_running = false;
|
||||||
Stopped(); /* EMIT SIGNAL */
|
Stopped(); /* EMIT SIGNAL */
|
||||||
}
|
}
|
||||||
|
|
||||||
_jack = 0;
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
AudioEngine::reconnect_to_jack ()
|
AudioEngine::reconnect_to_jack ()
|
||||||
{
|
{
|
||||||
if (_jack) {
|
if (_running) {
|
||||||
disconnect_from_jack ();
|
disconnect_from_jack ();
|
||||||
/* XXX give jackd a chance */
|
/* XXX give jackd a chance */
|
||||||
Glib::usleep (250000);
|
Glib::usleep (250000);
|
||||||
|
|
@ -1336,7 +1347,9 @@ void
|
||||||
AudioEngine::update_total_latencies ()
|
AudioEngine::update_total_latencies ()
|
||||||
{
|
{
|
||||||
#ifdef HAVE_JACK_RECOMPUTE_LATENCIES
|
#ifdef HAVE_JACK_RECOMPUTE_LATENCIES
|
||||||
jack_recompute_total_latencies (_jack);
|
if (_jack) {
|
||||||
|
jack_recompute_total_latencies (_jack);
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -43,10 +43,11 @@
|
||||||
using namespace std;
|
using namespace std;
|
||||||
using namespace ARDOUR;
|
using namespace ARDOUR;
|
||||||
using namespace PBD;
|
using namespace PBD;
|
||||||
|
|
||||||
LV2Plugin::LV2Plugin (AudioEngine& e, Session& session, LV2World& world, SLV2Plugin plugin, nframes_t rate)
|
LV2Plugin::LV2Plugin (AudioEngine& e, Session& session, LV2World& world, SLV2Plugin plugin, nframes_t rate)
|
||||||
: Plugin (e, session)
|
: Plugin (e, session)
|
||||||
, _world(world)
|
, _world(world)
|
||||||
|
, _features(NULL)
|
||||||
{
|
{
|
||||||
init (world, plugin, rate);
|
init (world, plugin, rate);
|
||||||
}
|
}
|
||||||
|
|
@ -54,6 +55,7 @@ LV2Plugin::LV2Plugin (AudioEngine& e, Session& session, LV2World& world, SLV2Plu
|
||||||
LV2Plugin::LV2Plugin (const LV2Plugin &other)
|
LV2Plugin::LV2Plugin (const LV2Plugin &other)
|
||||||
: Plugin (other)
|
: Plugin (other)
|
||||||
, _world(other._world)
|
, _world(other._world)
|
||||||
|
, _features(NULL)
|
||||||
{
|
{
|
||||||
init (other._world, other._plugin, other._sample_rate);
|
init (other._world, other._plugin, other._sample_rate);
|
||||||
|
|
||||||
|
|
@ -68,12 +70,13 @@ LV2Plugin::init (LV2World& world, SLV2Plugin plugin, nframes_t rate)
|
||||||
{
|
{
|
||||||
_world = world;
|
_world = world;
|
||||||
_plugin = plugin;
|
_plugin = plugin;
|
||||||
|
_ui = NULL;
|
||||||
_control_data = 0;
|
_control_data = 0;
|
||||||
_shadow_data = 0;
|
_shadow_data = 0;
|
||||||
_latency_control_port = 0;
|
_latency_control_port = 0;
|
||||||
_was_activated = false;
|
_was_activated = false;
|
||||||
|
|
||||||
_instance = slv2_plugin_instantiate(plugin, rate, NULL);
|
_instance = slv2_plugin_instantiate(plugin, rate, _features);
|
||||||
_name = slv2_plugin_get_name(plugin);
|
_name = slv2_plugin_get_name(plugin);
|
||||||
assert(_name);
|
assert(_name);
|
||||||
_author = slv2_plugin_get_author_name(plugin);
|
_author = slv2_plugin_get_author_name(plugin);
|
||||||
|
|
@ -90,6 +93,18 @@ LV2Plugin::init (LV2World& world, SLV2Plugin plugin, nframes_t rate)
|
||||||
slv2_value_free(_author);
|
slv2_value_free(_author);
|
||||||
throw failed_constructor();
|
throw failed_constructor();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_instance_access_feature.URI = "http://lv2plug.in/ns/ext/instance-access";
|
||||||
|
_instance_access_feature.data = (void*)_instance->lv2_handle;
|
||||||
|
|
||||||
|
_data_access_extension_data.extension_data = _instance->lv2_descriptor->extension_data;
|
||||||
|
_data_access_feature.URI = "http://lv2plug.in/ns/ext/data-access";
|
||||||
|
_data_access_feature.data = &_data_access_extension_data;
|
||||||
|
|
||||||
|
_features = (LV2_Feature**)malloc(sizeof(LV2_Feature*) * 3);
|
||||||
|
_features[0] = &_instance_access_feature;
|
||||||
|
_features[1] = &_data_access_feature;
|
||||||
|
_features[2] = NULL;
|
||||||
|
|
||||||
_sample_rate = rate;
|
_sample_rate = rate;
|
||||||
|
|
||||||
|
|
@ -124,6 +139,17 @@ LV2Plugin::init (LV2World& world, SLV2Plugin plugin, nframes_t rate)
|
||||||
_defaults[i] = 0.0f;
|
_defaults[i] = 0.0f;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SLV2UIs uis = slv2_plugin_get_uis(_plugin);
|
||||||
|
if (slv2_uis_size(uis) > 0) {
|
||||||
|
for (unsigned i=0; i < slv2_uis_size(uis); ++i) {
|
||||||
|
SLV2UI ui = slv2_uis_get_at(uis, i);
|
||||||
|
if (slv2_ui_is_a(ui, _world.gtk_gui)) {
|
||||||
|
_ui = ui;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
latency_compute_run ();
|
latency_compute_run ();
|
||||||
}
|
}
|
||||||
|
|
@ -243,6 +269,12 @@ LV2Plugin::save_preset (string name)
|
||||||
{
|
{
|
||||||
return Plugin::save_preset (name, "lv2");
|
return Plugin::save_preset (name, "lv2");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
LV2Plugin::has_editor() const
|
||||||
|
{
|
||||||
|
return (_ui != NULL);
|
||||||
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
LV2Plugin::set_state(const XMLNode& node)
|
LV2Plugin::set_state(const XMLNode& node)
|
||||||
|
|
@ -536,6 +568,7 @@ LV2World::LV2World()
|
||||||
integer = slv2_value_new_uri(world, SLV2_NAMESPACE_LV2 "integer");
|
integer = slv2_value_new_uri(world, SLV2_NAMESPACE_LV2 "integer");
|
||||||
toggled = slv2_value_new_uri(world, SLV2_NAMESPACE_LV2 "toggled");
|
toggled = slv2_value_new_uri(world, SLV2_NAMESPACE_LV2 "toggled");
|
||||||
srate = slv2_value_new_uri(world, SLV2_NAMESPACE_LV2 "sampleRate");
|
srate = slv2_value_new_uri(world, SLV2_NAMESPACE_LV2 "sampleRate");
|
||||||
|
gtk_gui = slv2_value_new_uri(world, "http://lv2plug.in/ns/extensions/ui#GtkUI");
|
||||||
}
|
}
|
||||||
|
|
||||||
LV2World::~LV2World()
|
LV2World::~LV2World()
|
||||||
|
|
|
||||||
|
|
@ -60,8 +60,15 @@ RBEffect::~RBEffect ()
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
RBEffect::run (boost::shared_ptr<AudioRegion> region)
|
RBEffect::run (boost::shared_ptr<Region> r)
|
||||||
{
|
{
|
||||||
|
boost::shared_ptr<AudioRegion> region = boost::dynamic_pointer_cast<AudioRegion> (r);
|
||||||
|
|
||||||
|
if (!region) {
|
||||||
|
error << "RBEffect::run() passed a non-audio region! WTF?" << endmsg;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
SourceList nsrcs;
|
SourceList nsrcs;
|
||||||
nframes_t done;
|
nframes_t done;
|
||||||
int ret = -1;
|
int ret = -1;
|
||||||
|
|
@ -158,9 +165,6 @@ RBEffect::run (boost::shared_ptr<AudioRegion> region)
|
||||||
stretcher.setExpectedInputDuration(read_duration);
|
stretcher.setExpectedInputDuration(read_duration);
|
||||||
stretcher.setDebugLevel(1);
|
stretcher.setDebugLevel(1);
|
||||||
|
|
||||||
stretcher.setExpectedInputDuration(duration);
|
|
||||||
stretcher.setDebugLevel(1);
|
|
||||||
|
|
||||||
/* the name doesn't need to be super-precise, but allow for 2 fractional
|
/* the name doesn't need to be super-precise, but allow for 2 fractional
|
||||||
digits just to disambiguate close but not identical FX
|
digits just to disambiguate close but not identical FX
|
||||||
*/
|
*/
|
||||||
|
|
@ -288,8 +292,12 @@ RBEffect::run (boost::shared_ptr<AudioRegion> region)
|
||||||
|
|
||||||
for (uint32_t i = 0; i < nsrcs.size(); ++i) {
|
for (uint32_t i = 0; i < nsrcs.size(); ++i) {
|
||||||
|
|
||||||
if (nsrcs[i]->write(buffers[i], this_read) !=
|
boost::shared_ptr<AudioSource> asrc = boost::dynamic_pointer_cast<AudioSource>(nsrcs[i]);
|
||||||
this_read) {
|
if (!asrc) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (asrc->write(buffers[i], this_read) != this_read) {
|
||||||
error << string_compose (_("error writing tempo-adjusted data to %1"), nsrcs[i]->name()) << endmsg;
|
error << string_compose (_("error writing tempo-adjusted data to %1"), nsrcs[i]->name()) << endmsg;
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
@ -305,7 +313,12 @@ RBEffect::run (boost::shared_ptr<AudioRegion> region)
|
||||||
|
|
||||||
for (uint32_t i = 0; i < nsrcs.size(); ++i) {
|
for (uint32_t i = 0; i < nsrcs.size(); ++i) {
|
||||||
|
|
||||||
if (nsrcs[i]->write(buffers[i], this_read) !=
|
boost::shared_ptr<AudioSource> asrc = boost::dynamic_pointer_cast<AudioSource>(nsrcs[i]);
|
||||||
|
if (!asrc) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (asrc->write(buffers[i], this_read) !=
|
||||||
this_read) {
|
this_read) {
|
||||||
error << string_compose (_("error writing tempo-adjusted data to %1"), nsrcs[i]->name()) << endmsg;
|
error << string_compose (_("error writing tempo-adjusted data to %1"), nsrcs[i]->name()) << endmsg;
|
||||||
goto out;
|
goto out;
|
||||||
|
|
@ -334,14 +347,13 @@ RBEffect::run (boost::shared_ptr<AudioRegion> region)
|
||||||
|
|
||||||
/* now reset ancestral data for each new region */
|
/* now reset ancestral data for each new region */
|
||||||
|
|
||||||
for (vector<boost::shared_ptr<AudioRegion> >::iterator x = results.begin(); x != results.end(); ++x) {
|
for (vector<boost::shared_ptr<Region> >::iterator x = results.begin(); x != results.end(); ++x) {
|
||||||
|
|
||||||
|
|
||||||
(*x)->set_ancestral_data (read_start,
|
(*x)->set_ancestral_data (read_start,
|
||||||
read_duration,
|
read_duration,
|
||||||
stretch,
|
stretch,
|
||||||
shift);
|
shift);
|
||||||
(*x)->set_master_sources (region->get_master_sources());
|
(*x)->set_master_sources (region->master_sources());
|
||||||
}
|
}
|
||||||
|
|
||||||
out:
|
out:
|
||||||
|
|
|
||||||
|
|
@ -1406,7 +1406,7 @@ Region::master_source_names ()
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
Region::set_master_sources (SourceList& srcs)
|
Region::set_master_sources (const SourceList& srcs)
|
||||||
{
|
{
|
||||||
_master_sources = srcs;
|
_master_sources = srcs;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -160,8 +160,12 @@ SndFileSource::SndFileSource (Session& s, ustring path, SampleFormat sfmt, Heade
|
||||||
memset (_broadcast_info, 0, sizeof (*_broadcast_info));
|
memset (_broadcast_info, 0, sizeof (*_broadcast_info));
|
||||||
|
|
||||||
snprintf_bounded_null_filled (_broadcast_info->description, sizeof (_broadcast_info->description), "BWF %s", _name.c_str());
|
snprintf_bounded_null_filled (_broadcast_info->description, sizeof (_broadcast_info->description), "BWF %s", _name.c_str());
|
||||||
snprintf_bounded_null_filled (_broadcast_info->originator, sizeof (_broadcast_info->originator), "ardour %s)", Glib::get_real_name().c_str());
|
snprintf_bounded_null_filled (_broadcast_info->originator, sizeof (_broadcast_info->originator), "ardour %d.%d.%d %s",
|
||||||
|
libardour3_major_version,
|
||||||
|
libardour3_minor_version,
|
||||||
|
libardour3_micro_version,
|
||||||
|
Glib::get_real_name().c_str());
|
||||||
|
|
||||||
_broadcast_info->version = 1;
|
_broadcast_info->version = 1;
|
||||||
_broadcast_info->time_reference_low = 0;
|
_broadcast_info->time_reference_low = 0;
|
||||||
_broadcast_info->time_reference_high = 0;
|
_broadcast_info->time_reference_high = 0;
|
||||||
|
|
@ -551,14 +555,14 @@ SndFileSource::setup_broadcast_info (nframes_t when, struct tm& now, time_t tnow
|
||||||
|
|
||||||
snprintf_bounded_null_filled (_broadcast_info->origination_date, sizeof (_broadcast_info->origination_date), "%4d-%02d-%02d",
|
snprintf_bounded_null_filled (_broadcast_info->origination_date, sizeof (_broadcast_info->origination_date), "%4d-%02d-%02d",
|
||||||
1900 + now.tm_year,
|
1900 + now.tm_year,
|
||||||
now.tm_mon + 1, // move from 0..11 to 1..12
|
now.tm_mon + 1, // shift range from 0..11 to 1..12
|
||||||
now.tm_mday);
|
now.tm_mday);
|
||||||
|
|
||||||
snprintf_bounded_null_filled (_broadcast_info->origination_time, sizeof (_broadcast_info->origination_time), "%02d:%02d:%02d",
|
snprintf_bounded_null_filled (_broadcast_info->origination_time, sizeof (_broadcast_info->origination_time), "%02d:%02d:%02d",
|
||||||
now.tm_hour,
|
now.tm_hour,
|
||||||
now.tm_min,
|
now.tm_min,
|
||||||
now.tm_sec);
|
now.tm_sec);
|
||||||
|
|
||||||
/* now update header position taking header offset into account */
|
/* now update header position taking header offset into account */
|
||||||
|
|
||||||
set_header_timeline_position ();
|
set_header_timeline_position ();
|
||||||
|
|
|
||||||
|
|
@ -78,6 +78,7 @@ private:
|
||||||
XMLNodeList _children;
|
XMLNodeList _children;
|
||||||
XMLPropertyList _proplist;
|
XMLPropertyList _proplist;
|
||||||
XMLPropertyMap _propmap;
|
XMLPropertyMap _propmap;
|
||||||
|
mutable XMLNodeList _selected_children;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
XMLNode(const string& name);
|
XMLNode(const string& name);
|
||||||
|
|
|
||||||
|
|
@ -278,22 +278,21 @@ XMLNode::children(const string& n) const
|
||||||
{
|
{
|
||||||
/* returns all children matching name */
|
/* returns all children matching name */
|
||||||
|
|
||||||
static XMLNodeList retval;
|
|
||||||
XMLNodeConstIterator cur;
|
XMLNodeConstIterator cur;
|
||||||
|
|
||||||
if (n.empty()) {
|
if (n.empty()) {
|
||||||
return _children;
|
return _children;
|
||||||
}
|
}
|
||||||
|
|
||||||
retval.erase(retval.begin(), retval.end());
|
_selected_children.clear();
|
||||||
|
|
||||||
for (cur = _children.begin(); cur != _children.end(); ++cur) {
|
for (cur = _children.begin(); cur != _children.end(); ++cur) {
|
||||||
if ((*cur)->name() == n) {
|
if ((*cur)->name() == n) {
|
||||||
retval.insert(retval.end(), *cur);
|
_selected_children.insert(_selected_children.end(), *cur);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return retval;
|
return _selected_children;
|
||||||
}
|
}
|
||||||
|
|
||||||
XMLNode *
|
XMLNode *
|
||||||
|
|
|
||||||
|
|
@ -30,6 +30,7 @@ cp.Append(CCFLAGS="-D_REENTRANT -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE")
|
||||||
cp.Append(CXXFLAGS="-DDATA_DIR=\\\""+final_prefix+"/share\\\"")
|
cp.Append(CXXFLAGS="-DDATA_DIR=\\\""+final_prefix+"/share\\\"")
|
||||||
cp.Append(CXXFLAGS="-DCONFIG_DIR=\\\""+final_config_prefix+"\\\"")
|
cp.Append(CXXFLAGS="-DCONFIG_DIR=\\\""+final_config_prefix+"\\\"")
|
||||||
cp.Append(CXXFLAGS="-DLOCALEDIR=\\\""+final_prefix+"/share/locale\\\"")
|
cp.Append(CXXFLAGS="-DLOCALEDIR=\\\""+final_prefix+"/share/locale\\\"")
|
||||||
|
cp.Append(CPPPATH = libraries['jack'].get('CPPPATH', []))
|
||||||
|
|
||||||
cp.Merge ([
|
cp.Merge ([
|
||||||
libraries['ardour'],
|
libraries['ardour'],
|
||||||
|
|
|
||||||
|
|
@ -30,6 +30,7 @@ genericmidi.Append(CCFLAGS="-D_REENTRANT -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOUR
|
||||||
genericmidi.Append(CXXFLAGS="-DDATA_DIR=\\\""+final_prefix+"/share\\\"")
|
genericmidi.Append(CXXFLAGS="-DDATA_DIR=\\\""+final_prefix+"/share\\\"")
|
||||||
genericmidi.Append(CXXFLAGS="-DCONFIG_DIR=\\\""+final_config_prefix+"\\\"")
|
genericmidi.Append(CXXFLAGS="-DCONFIG_DIR=\\\""+final_config_prefix+"\\\"")
|
||||||
genericmidi.Append(CXXFLAGS="-DLOCALEDIR=\\\""+final_prefix+"/share/locale\\\"")
|
genericmidi.Append(CXXFLAGS="-DLOCALEDIR=\\\""+final_prefix+"/share/locale\\\"")
|
||||||
|
genericmidi.Append(CPPPATH = libraries['jack'].get('CPPPATH', []))
|
||||||
|
|
||||||
genericmidi.Merge ([
|
genericmidi.Merge ([
|
||||||
libraries['ardour'],
|
libraries['ardour'],
|
||||||
|
|
|
||||||
|
|
@ -44,6 +44,7 @@ mackie.Append(CCFLAGS="-D_REENTRANT -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE")
|
||||||
mackie.Append(CXXFLAGS="-DDATA_DIR=\\\""+final_prefix+"/share\\\"")
|
mackie.Append(CXXFLAGS="-DDATA_DIR=\\\""+final_prefix+"/share\\\"")
|
||||||
mackie.Append(CXXFLAGS="-DCONFIG_DIR=\\\""+final_config_prefix+"\\\"")
|
mackie.Append(CXXFLAGS="-DCONFIG_DIR=\\\""+final_config_prefix+"\\\"")
|
||||||
mackie.Append(CXXFLAGS="-DLOCALEDIR=\\\""+final_prefix+"/share/locale\\\"")
|
mackie.Append(CXXFLAGS="-DLOCALEDIR=\\\""+final_prefix+"/share/locale\\\"")
|
||||||
|
mackie.Append(CPPPATH = libraries['jack'].get('CPPPATH', []))
|
||||||
|
|
||||||
mackie.Merge ([
|
mackie.Merge ([
|
||||||
libraries['ardour'],
|
libraries['ardour'],
|
||||||
|
|
|
||||||
|
|
@ -52,6 +52,7 @@ tranzport.Append(CXXFLAGS="-DLOCALEDIR=\\\""+final_prefix+"/share/locale\\\"")
|
||||||
# tranzport.Append(CXXFLAGS="-DHAVE_TRANZPORT_KERNEL_DRIVER=1")
|
# tranzport.Append(CXXFLAGS="-DHAVE_TRANZPORT_KERNEL_DRIVER=1")
|
||||||
|
|
||||||
#merge more into tranzport files for the right io lib
|
#merge more into tranzport files for the right io lib
|
||||||
|
tranzport.Append(CPPPATH = libraries['jack'].get('CPPPATH', []))
|
||||||
|
|
||||||
tranzport.Merge ([
|
tranzport.Merge ([
|
||||||
libraries['ardour'],
|
libraries['ardour'],
|
||||||
|
|
|
||||||
|
|
@ -29,6 +29,9 @@ sources = plugin_files
|
||||||
if vampplugs['AUBIO']:
|
if vampplugs['AUBIO']:
|
||||||
sources += aubio_files
|
sources += aubio_files
|
||||||
vampplugs.Merge ([libraries['aubio']])
|
vampplugs.Merge ([libraries['aubio']])
|
||||||
|
vampplugs.Merge ([libraries['fftw3f']])
|
||||||
|
else:
|
||||||
|
print 'WARNING: some VAMP plugins will not be built because this machine has no AUBIO support'
|
||||||
|
|
||||||
libvampplugins = vampplugs.SharedLibrary('ardourvampplugins', sources)
|
libvampplugins = vampplugs.SharedLibrary('ardourvampplugins', sources)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
#ifndef __ardour_svn_revision_h__
|
#ifndef __ardour_svn_revision_h__
|
||||||
#define __ardour_svn_revision_h__
|
#define __ardour_svn_revision_h__
|
||||||
static const char* ardour_svn_revision = "3530";
|
static const char* ardour_svn_revision = "3581";
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
|
|
@ -81,7 +81,7 @@ $stdout.print("Copying libs to #{libdir} ...\n");
|
||||||
results.each do |s|
|
results.each do |s|
|
||||||
s = s.split[0]
|
s = s.split[0]
|
||||||
# exclude frameworks, system libraries, X11 libraries, and libjack.
|
# exclude frameworks, system libraries, X11 libraries, and libjack.
|
||||||
unless s =~ /System|\/usr\/lib|\/usr\/X11R6|libjack|:$/ then
|
unless s =~ /System|\/usr\/lib|\/usr\/X11|Jackmp|libjack|:$/ then
|
||||||
#$stdout.print("Copying #{s}\n")
|
#$stdout.print("Copying #{s}\n")
|
||||||
`cp #{s} #{odir}/#{libdir}/`
|
`cp #{s} #{odir}/#{libdir}/`
|
||||||
end
|
end
|
||||||
|
|
@ -94,7 +94,7 @@ results.uniq!
|
||||||
results.each do |s|
|
results.each do |s|
|
||||||
s = s.split[0]
|
s = s.split[0]
|
||||||
# exclude frameworks, system libraries, X11 libraries, and libjack.
|
# exclude frameworks, system libraries, X11 libraries, and libjack.
|
||||||
unless s =~ /System|\/usr\/lib|\/usr\/X11R6|libjack|:$/ then
|
unless s =~ /System|\/usr\/lib|\/usr\/X11|Jackmp|libjack|:$/ then
|
||||||
sbase = File.basename(s)
|
sbase = File.basename(s)
|
||||||
targfile = "#{odir}/#{libdir}/#{sbase}"
|
targfile = "#{odir}/#{libdir}/#{sbase}"
|
||||||
#$stdout.print("Targ is : " + targfile + "\n")
|
#$stdout.print("Targ is : " + targfile + "\n")
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue