merged with 1697 revision of trunk (which is post-rc1 but pre-rc2

git-svn-id: svn://localhost/ardour2/branches/2.1-staging@1698 d708f5d6-7413-0410-9779-e7cbd77b26cf
This commit is contained in:
Paul Davis 2007-04-11 13:07:51 +00:00
parent 4bf712f501
commit 45d3ec1437
696 changed files with 48513 additions and 22850 deletions

View file

@ -1,4 +1,4 @@
all: scons cscope
all: scons
scons:
scons

View file

@ -16,7 +16,7 @@ import SCons.Node.FS
SConsignFile()
EnsureSConsVersion(0, 96)
ardour_version = '2.0beta11.1'
ardour_version = '2.0rc1'
subst_dict = { }
@ -41,9 +41,11 @@ opts.AddOptions(
PathOption('PREFIX', 'Set the install "prefix"', '/usr/local'),
BoolOption('SURFACES', 'Build support for control surfaces', 1),
BoolOption('SYSLIBS', 'USE AT YOUR OWN RISK: CANCELS ALL SUPPORT FROM ARDOUR AUTHORS: Use existing system versions of various libraries instead of internal ones', 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('VST', 'Compile with support for VST', 0),
BoolOption('TRANZPORT', 'Compile with support for Frontier Designs (if libusb is available)', 0)
BoolOption('GPROFILE', 'Compile with support for gprofile (Developers only)', 0),
BoolOption('TRANZPORT', 'Compile with support for Frontier Designs (if libusb is available)', 1)
)
#----------------------------------------------------------------------
@ -311,7 +313,7 @@ env.Append (BUILDERS = {'VersionBuild' : version_bld})
#
def versioned_builder(target,source,env):
w, r = os.popen2( "svn info | awk '/^Revision:/ { print $2}'")
w, r = os.popen2( "LANG= svn info | awk '/^Revision:/ { print $2}'")
last_revision = r.readline().strip()
w.close()
@ -540,7 +542,10 @@ env = conf.Finish()
#
opt_flags = []
debug_flags = [ '-g' ]
if env['GPROFILE'] == 1:
debug_flags = [ '-g', '-pg' ]
else:
debug_flags = [ '-g' ]
# guess at the platform, used to define compiler flags
@ -606,7 +611,7 @@ elif ((re.search ("i[0-9]86", config[config_cpu]) != None) or (re.search ("x86_6
if env['DIST_TARGET'] != 'i386':
flag_line = os.popen ("cat /proc/cpuinfo | grep '^flags'").read()[:-1]
x86_flags = flag_line.split (": ")[1:][0].split (' ')
x86_flags = flag_line.split (": ")[1:][0].split ()
if "mmx" in x86_flags:
opt_flags.append ("-mmmx")
@ -670,13 +675,19 @@ opt_flags[:0] = [
"-fomit-frame-pointer",
"-ffast-math",
"-fstrength-reduce",
"-fno-strict-aliasing"
"-pipe"
]
if env['DEBUG'] == 1:
env.Append(CCFLAGS=" ".join (debug_flags))
env.Append(LINKFLAGS=" ".join (debug_flags))
else:
env.Append(CCFLAGS=" ".join (opt_flags))
env.Append(LINKFLAGS=" ".join (opt_flags))
if env['UNIVERSAL'] == 1:
env.Append(CCFLAGS="-arch i386 -arch ppc")
env.Append(LINKFLAGS="-arch i386 -arch ppc")
#
# warnings flags
@ -686,8 +697,9 @@ env.Append(CCFLAGS="-Wall")
env.Append(CXXFLAGS="-Woverloaded-virtual")
if env['EXTRA_WARN']:
env.Append(CCFLAGS="-Wextra -pedantic")
env.Append(CCFLAGS="-Wextra -pedantic -ansi")
env.Append(CXXFLAGS="-ansi")
# env.Append(CFLAGS="-iso")
if env['LIBLO']:
env.Append(CCFLAGS="-DHAVE_LIBLO")
@ -726,7 +738,8 @@ prep_libcheck(env, libraries['flac'])
libraries['flac'].Append(CCFLAGS="-I/usr/local/include", LINKFLAGS="-L/usr/local/lib")
conf = Configure (libraries['flac'])
conf.CheckLib ('FLAC', 'FLAC__stream_decoder_new', language='CXX')
if conf.CheckLib ('FLAC', 'FLAC__stream_decoder_new', language='CXX'):
conf.env.Append(CCFLAGS='-DHAVE_FLAC')
libraries['flac'] = conf.Finish ()
# or if that fails...
@ -840,7 +853,7 @@ if env['SYSLIBS']:
libraries['sndfile-ardour'] = LibraryInfo(LIBS='libsndfile-ardour',
LIBPATH='#libs/libsndfile',
CPPPATH=['#libs/libsndfile', '#libs/libsndfile/src'])
CPPPATH=['#libs/libsndfile/src'])
# libraries['flowcanvas'] = LibraryInfo(LIBS='flowcanvas', LIBPATH='#/libs/flowcanvas', CPPPATH='#libs/flowcanvas')
libraries['soundtouch'] = LibraryInfo()
@ -958,11 +971,14 @@ else:
# its included in the tarball
#
surface_subdirs = [ 'libs/surfaces/control_protocol', 'libs/surfaces/generic_midi', 'libs/surfaces/tranzport' ]
surface_subdirs = [ 'libs/surfaces/control_protocol', 'libs/surfaces/generic_midi', 'libs/surfaces/tranzport', 'libs/surfaces/mackie' ]
if env['SURFACES']:
if have_libusb:
env['TRANZPORT'] = 'yes'
env['TRANZPORT'] = 1
else:
env['TRANZPORT'] = 0
print 'Disabled building Tranzport code because libusb could not be found'
if os.access ('libs/surfaces/sony9pin', os.F_OK):
surface_subdirs += [ 'libs/surfaces/sony9pin' ]
@ -1069,6 +1085,13 @@ if not conf.CheckFunc('posix_memalign'):
env = conf.Finish()
rcbuild = env.SubstInFile ('ardour.rc','ardour.rc.in', SUBST_DICT = subst_dict)
subst_dict['%VERSION%'] = ardour_version[0:3]
subst_dict['%EXTRA_VERSION%'] = ardour_version[3:]
subst_dict['%REVISION_STRING%'] = ''
if os.path.exists('.svn'):
subst_dict['%REVISION_STRING%'] = '.' + fetch_svn_revision ('.') + 'svn'
# specbuild = env.SubstInFile ('ardour.spec','ardour.spec.in', SUBST_DICT = subst_dict)
the_revision = env.Command ('frobnicatory_decoy', [], create_stored_revision)

View file

@ -459,7 +459,7 @@ WARN_LOGFILE =
# directories like "/usr/src/myproject". Separate the files or directories
# with spaces.
INPUT = libs/pbd libs/midi++2 libs/ardour libs/gtkmm2ext gtk2_ardour
INPUT = libs/pbd libs/midi++2 libs/ardour libs/surfaces libs/gtkmm2ext gtk2_ardour
# If the value of the INPUT tag contains directories, you can use the
# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
@ -556,7 +556,7 @@ FILTER_SOURCE_FILES = NO
# Note: To get rid of all source code in the generated output, make sure also
# VERBATIM_HEADERS is set to NO.
SOURCE_BROWSER = NO
SOURCE_BROWSER = YES
# Setting the INLINE_SOURCES tag to YES will include the body
# of functions and classes directly in the documentation.
@ -603,7 +603,7 @@ VERBATIM_HEADERS = YES
# of all compounds will be generated. Enable this if the project
# contains a lot of classes, structs, unions or interfaces.
ALPHABETICAL_INDEX = NO
ALPHABETICAL_INDEX = YES
# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then
# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns
@ -766,7 +766,7 @@ COMPACT_LATEX = NO
# by the printer. Possible values are: a4, a4wide, letter, legal and
# executive. If left blank a4wide will be used.
PAPER_TYPE = a4wide
PAPER_TYPE = letter
# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX
# packages that should be included in the LaTeX output.
@ -791,7 +791,7 @@ PDF_HYPERLINKS = NO
# plain latex in the generated Makefile. Set this option to YES to get a
# higher quality PDF documentation.
USE_PDFLATEX = NO
USE_PDFLATEX = YES
# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode.
# command to the generated LaTeX files. This will instruct LaTeX to keep
@ -1005,7 +1005,7 @@ INCLUDE_FILE_PATTERNS =
# undefined via #undef or recursively expanded use the := operator
# instead of the = operator.
PREDEFINED = HAVE_COREAUDIO VST_SUPPORT HAVE_LIBLO FFT_ANALYSIS
PREDEFINED = HAVE_LIBLO FFT_ANALYSIS
# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then
# this tag can be used to specify a list of macro names that should be expanded.

View file

@ -2,6 +2,7 @@
<Ardour>
<MIDI-port tag="%MIDITAG%" device="ardour" type="%MIDITYPE%" mode="duplex"/>
<MIDI-port tag="control" device="ardour" type="%MIDITYPE%" mode="duplex"/>
<MIDI-port tag="mcu" device="ardour" type="%MIDITYPE%" mode="duplex"/>
<Config>
<Option name="minimum-disk-io-bytes" value="262144"/>
<Option name="track-buffer-seconds" value="5.000000"/>

View file

@ -276,6 +276,13 @@ rcu = gtkardour.Program(target = 'rcu', source = rcu_files)
tt = gtkmmtests.Program(target = 'tt', source = tt_files)
my_subst_dict = { }
#
# null substitution just to avoid ardour.bindings being in svn
#
ardourbindings = env.SubstInFile ('ardour.bindings', 'ardour.bindings.in', SUBST_DICT = my_subst_dict);
my_subst_dict['%INSTALL_PREFIX%'] = final_prefix
my_subst_dict['%LIBDIR%'] = env['LIBDIR']
my_subst_dict['%VERSION%'] = ardour_version
@ -286,6 +293,7 @@ env.AddPostAction (ardoursh, Chmod ('$TARGET', 0755))
ardourdev = env.SubstInFile ('ardev_common.sh','ardev_common.sh.in', SUBST_DICT = my_subst_dict);
env.AddPostAction (ardourdev, Chmod ('$TARGET', 0755))
Default(ardourbindings)
Default(ardourdev)
Default(ardoursh)
@ -329,7 +337,7 @@ env.Alias ('tarball', env.Distribute (env['DISTTREE'],
'ardour.sh.in',
'ardev_common.sh.in',
'ardour2_ui.rc', 'splash.png',
'ardour.menus', 'ardour.bindings', 'ardour.colors',
'ardour.menus', 'ardour.bindings.in', 'ardour.colors',
'editor_xpms'
] +
gtkardour_files +

View file

@ -15,7 +15,6 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
$Id$
*/
#include <algorithm>
@ -145,14 +144,19 @@ static const char* authors[] = {
N_("Stefan Kersten"),
N_("Christopher George"),
N_("Robert Jordens"),
N_("Dave Robillard"),
N_("Hans Fugal"),
N_("Brian Ahr"),
N_("Nimal Ratnayake"),
N_("Mike Täht"),
N_("John Anderson"),
N_("Nedko Arnaudov"),
0
};
static const char* translators[] = {
N_("French:\n\tAlain Fréhel <alain.frehel@free.fr>\n\tChristophe Combelles <ccomb@free.fr>\n"),
N_("German:\n\tKarsten Petersen <kapet@kapet.de>\n"),
N_("German:\n\tKarsten Petersen <kapet@kapet.de>\n\tSebastian Arnold <mail@sebastian-arnold.net>\n"),
N_("Italian:\n\tFilippo Pappalardo <filippo@email.it>\n"),
N_("Portuguese:\n\tRui Nuno Capela <rncbc@rncbc.org>\n"),
N_("Brazilian Portuguese:\n\tAlexander da Franca Fernandes <alexander@nautae.eti.br>\
@ -186,7 +190,7 @@ About::About ()
}
set_translator_credits (t);
set_copyright (_("Copyright (C) 1999-2006 Paul Davis\n"));
set_copyright (_("Copyright (C) 1999-2007 Paul Davis\n"));
set_license (_("Ardour comes with ABSOLUTELY NO WARRANTY\n"
"This is free software, and you are welcome to redistribute it\n"
"under certain conditions; see the file COPYING for details.\n"));

View file

@ -15,7 +15,6 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
$Id$
*/
#ifndef __ardour_gtk_about_h__

View file

@ -15,7 +15,6 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
$Id$
*/
#include <vector>

View file

@ -15,7 +15,6 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
$Id$
*/
#include <cstdio>
@ -148,7 +147,7 @@ AddRouteDialog::track_type_chosen ()
if (track_button.get_active()) {
track_mode_combo.set_sensitive (true);
} else {
track_mode_combo.set_sensitive (true);
track_mode_combo.set_sensitive (false);
}
}

View file

@ -16,7 +16,6 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
$Id$
*/
#include <gtkmm2ext/gtk_ui.h>

View file

@ -6,7 +6,7 @@ export ARDOUR_PATH=gtk2_ardour/icons:gtk2_ardour/pixmaps:gtk2_ardour
export GTK_PATH=libs/clearlooks
export LD_LIBRARY_PATH=libs/surfaces/control_protocol:libs/ardour:libs/midi++2:libs/pbd:libs/soundtouch:libs/gtkmm2ext:libs/sigc++2:libs/glibmm2:libs/gtkmm2/atk:libs/gtkmm2/pango:libs/gtkmm2/gdk:libs/gtkmm2/gtk:libs/libgnomecanvasmm:libs/libsndfile:libs/appleutility:$LD_LIBRARY_PATH
export LD_LIBRARY_PATH=libs/surfaces/control_protocol:libs/ardour:libs/midi++2:libs/pbd:libs/soundtouch:libs/gtkmm2ext:libs/sigc++2:libs/glibmm2:libs/gtkmm2/atk:libs/gtkmm2/pango:libs/gtkmm2/gdk:libs/gtkmm2/gtk:libs/libgnomecanvasmm:libs/cairomm:libs/libsndfile:libs/appleutility:$LD_LIBRARY_PATH
# DYLD_LIBRARY_PATH is for darwin.
export DYLD_LIBRARY_PATH=$LD_LIBRARY_PATH

View file

@ -112,7 +112,6 @@
(gtk_accel_path "<Actions>/Editor/extend-range-to-end-of-region" "rightanglebracket")
(gtk_accel_path "<Actions>/Editor/scroll-backward" "leftarrow")
(gtk_accel_path "<Actions>/Editor/start-range" "<Control>KP_Down")
; (gtk_accel_path "<Actions>/Editor/ToggleTranzportSurface" "")
; (gtk_accel_path "<Actions>/ShuttleActions/SetShuttleUnitsSemitones" "")
; (gtk_accel_path "<Actions>/JACK/JACKLatency128" "")
; (gtk_accel_path "<Actions>/Snap/snap-to-beat" "")
@ -152,6 +151,7 @@
(gtk_accel_path "<Actions>/Common/goto-editor" "<Alt>e")
(gtk_accel_path "<Actions>/Editor/select-all" "<Control>a")
(gtk_accel_path "<Actions>/Editor/nudge-next-forward" "<Control>KP_Add")
; (gtk_accel_path "<Actions>/options/ShowSoloMutes" "")
; (gtk_accel_path "<Actions>/Snap/snap-to-eighths" "")
(gtk_accel_path "<Actions>/Editor/select-all-after-playhead" "<Shift><Control>p")
(gtk_accel_path "<Actions>/Common/ToggleMaximalEditor" "F11")

View file

@ -1,4 +1,5 @@
cWaveForm 0.0 0.0 0.0 0.80
cWaveFormClip 1.0 0.0 0.0 0.90
cMutedWaveForm 0.35 0.35 0.35 1.0
cSelectedFrameBase 0.71 0.57 0.66 1.0
cFrameBase 0.75 0.75 0.76 1.0
@ -41,7 +42,7 @@ cLocationRange 0.29 0.48 0.35 1.0
cLocationCDMarker 0.12 0.91 0.77 1.0
cLocationLoop 0.21 0.59 0.31 1.0
cLocationPunch 0.49 0.23 0.23 1.0
cVerboseCanvasCursor 0 0 0 0.74
cVerboseCanvasCursor 0.96 0.95 0.08 0.74
cRangeDragBarRect 0.59 0.59 0.59 0.78
cRangeDragBarRectFill 0.78 0.82 0.70 0.43
cRangeDragRect 0.59 0.59 0.59 0.78
@ -69,6 +70,9 @@ cMeasureLineBeat 0.45 0.45 0.45 0.40
cMeasureLineBar 0.55 0.55 0.60 0.55
cGhostTrackBaseOutline 0.00 0.00 0.00 1.00
cGhostTrackBaseFill 0.27 0.00 0.49 0.50
cGhostTrackWave 0.0 3.00 0.0 0.30
cGhostTrackWaveClip 1.0 0.0 0.0 0.0
cGhostTrackZeroLine 0.9 0.0 0.9 0.40
cImageTrackBase 0.87 0.87 0.85 1.00
cImageTrackOutline 0.00 0.00 0.00 1.00
cMarkerTrackBase 0.87 0.87 0.85 1.00
@ -98,3 +102,6 @@ cTrimHandleLockedStart 0.92 0.06 0.06 0.16
cTrimHandleLockedEnd 0.92 0.06 0.06 0.16
cTrimHandleStart 0.10 0.00 1.00 0.27
cTrimHandleEnd 0.10 0.00 1.00 0.27
cEditCursor 0.00 0.00 1.00 1.00
cPlayHead 1.00 0.00 0.00 1.00

View file

@ -291,8 +291,12 @@
<menuitem action='OutputAutoConnectMaster'/>
<menuitem action='OutputAutoConnectManual'/>
</menu>
<menu action='ControlSurfaces'/>
<menu action='Monitoring'>
<menu action='ControlSurfaces'>
<menuitem action='RemoteUserDefined'/>
<menuitem action='RemoteMixerDefined'/>
<menuitem action='RemoteEditorDefined'/>
</menu>
<menu action='Monitoring'>
<menuitem action='UseHardwareMonitoring'/>
<menuitem action='UseSoftwareMonitoring'/>
<menuitem action='UseExternalMonitoring'/>
@ -318,6 +322,7 @@
<menuitem action='LatchedSolo'/>
<menuitem action='SoloInPlace'/>
<menuitem action='SoloViaBus'/>
<menuitem action='ShowSoloMutes'/>
</menu>
<menu action='Crossfades'>
<menuitem action='toggle-xfades-active'/>
@ -337,6 +342,7 @@
<menuitem action='SendMMC'/>
<menuitem action='UseMMC'/>
<separator/>
<menuitem action='UseOSC'/>
<menuitem action='StopPluginsWithTransport'/>
<menuitem action='DoNotRunPluginsWhileRecording'/>
<menuitem action='LatchedRecordEnable'/>

View file

@ -80,7 +80,7 @@ style "marker_text"
style "time_axis_view_item_name"
{
font_name = "sans 6"
font_name = "sans 9"
}
style "default_base" = "medium_text"
@ -184,24 +184,58 @@ style "small_red_active_and_selected_button" = "small_button"
bg[SELECTED] = { 1.0, 0, 0}
}
style "track_rec_enable_button" = "small_button"
{
fg[SELECTED] = { 0.0, 0.0, 0.0 }
fg[ACTIVE] = { 0.0, 0.0, 0.0 }
fg[PRELIGHT] = { 0.0, 0.0, 0.0 }
bg[SELECTED] = { 1.0, 0.0, 0.0 }
bg[ACTIVE] = { 0.91, 0.68, 0.68}
bg[PRELIGHT] = { 1.0, 0.0, 0.0 }
}
style "gain_fader"
{
bg[NORMAL] = { 0.269, 0.269, 0.300}
bg[ACTIVE] = { 0.152, 0.152, 0.168 }
}
style "mixer_rec_enable_button" = "track_rec_enable_button"
style "track_rec_enable_button" = "small_button"
{
}
style "track_rec_enable_button_active" = "small_button"
{
fg[SELECTED] = { 0.0, 0.0, 0.0 }
fg[ACTIVE] = { 0.0, 0.0, 0.0 }
fg[PRELIGHT] = { 0.0, 0.0, 0.0 }
fg[NORMAL] = { 0.0, 0.0, 0.0 }
bg[NORMAL] = { 1.0, 0.0, 0.0 }
bg[ACTIVE] = { 1.0, 0.0, 0.0 }
bg[SELECTED] = { 1.0, 0.0, 0.0 }
bg[PRELIGHT] = { 1.0, 0.0, 0.0 }
}
style "track_rec_enable_button_alternate" = "small_button"
{
fg[SELECTED] = { 0.0, 0.0, 0.0 }
fg[ACTIVE] = { 0.0, 0.0, 0.0 }
fg[PRELIGHT] = { 0.0, 0.0, 0.0 }
fg[NORMAL] = { 0.0, 0.0, 0.0 }
bg[NORMAL] = { 0.91, 0.68, 0.68}
bg[ACTIVE] = { 0.91, 0.68, 0.68}
bg[SELECTED] = { 0.91, 0.68, 0.68}
bg[PRELIGHT] = { 0.91, 0.68, 0.68}
}
style "mixer_track_rec_enable_button" = "track_rec_enable_button"
{
font_name = "sans 7"
xthickness = 0
ythickness = 0
}
style "mixer_track_rec_enable_button_alternate" = "track_rec_enable_button_alternate"
{
font_name = "sans 7"
xthickness = 0
ythickness = 0
}
style "mixer_track_rec_enable_button_active" = "track_rec_enable_button_active"
{
font_name = "sans 7"
xthickness = 0
@ -210,20 +244,33 @@ style "mixer_rec_enable_button" = "track_rec_enable_button"
style "solo_button" = "small_button"
{
bg[PRELIGHT] = { 0, 1.0, 0 }
bg[ACTIVE] = { 0.66, 0.97, 0.19 }
fg[PRELIGHT] = { 0, 0, 0 }
fg[ACTIVE] = { 0, 0, 0 }
}
style "safe_solo_button" = "small_button"
style "solo_button_alternate" = "small_button"
{
bg[PRELIGHT] = { 0, 1.0, 0 }
bg[ACTIVE] = { 0.19, 0.97, 0.69 }
bg[NORMAL] = { 0.19, 0.97, 0.69 } # solo-safe
bg[ACTIVE] = { 0.19, 0.97, 0.69 } # solo-safe
bg[SELECTED] = { 0.19, 0.97, 0.69 } # solo-safe
bg[PRELIGHT] = { 0.19, 0.97, 0.69 } # solo-safe
fg[PRELIGHT] = { 0, 0, 0 }
fg[ACTIVE] = { 0, 0, 0 }
fg[SELECTED] = { 0, 0, 0 }
fg[NORMAL] = { 0, 0, 0 }
fg[PRELIGHT] = { 0, 0, 0 }
}
style "solo_button_active" = "small_button"
{
bg[NORMAL] = { 0.66, 0.97, 0.19 } # solo
bg[ACTIVE] = { 0.66, 0.97, 0.19 } # solo
bg[SELECTED] = { 0.66, 0.97, 0.19 } # solo
bg[PRELIGHT] = { 0.66, 0.97, 0.19 } # solo
fg[ACTIVE] = { 0, 0, 0 }
fg[SELECTED] = { 0, 0, 0 }
fg[NORMAL] = { 0, 0, 0 }
fg[PRELIGHT] = { 0, 0, 0 }
}
style "mixer_solo_button" = "solo_button"
@ -231,27 +278,72 @@ style "mixer_solo_button" = "solo_button"
font_name = "sans 7"
xthickness = 0
ythickness = 0
}
style "mixer_safe_solo_button" = "safe_solo_button"
style "mixer_solo_button_alternate" = "solo_button_alternate"
{
font_name = "sans 7"
xthickness = 0
ythickness = 0
}
style "mixer_solo_button_active" = "solo_button_active"
{
font_name = "sans 7"
xthickness = 0
ythickness = 0
}
style "mute_button" = "small_button"
{
bg[PRELIGHT] = { 1.0, 0.65, 0.13 }
bg[ACTIVE] = { 1.0, 0.98, 0.53 }
fg[PRELIGHT] = { 0, 0, 0 }
fg[ACTIVE] = { 0, 0, 0 }
}
style "mute_button_alternate" = "small_button"
{
bg[ACTIVE] = { 1.0, 0.98, 0.53 }
bg[NORMAL] = { 1.0, 0.98, 0.53 }
bg[SELECTED] = { 1.0, 0.98, 0.53 }
bg[PRELIGHT] = { 1.0, 0.98, 0.53 }
fg[SELECTED] = { 0, 0, 0 }
fg[ACTIVE] = { 0, 0, 0 }
fg[NORMAL] = { 0, 0, 0 }
fg[PRELIGHT] = { 0, 0, 0 }
}
style "mute_button_active" = "small_button"
{
bg[NORMAL] = { 0.90, 0.89, 0.73 }
bg[ACTIVE] = { 0.90, 0.89, 0.73 }
bg[PRELIGHT] = { 0.90, 0.89, 0.73 }
bg[SELECTED] = { 0.90, 0.89, 0.73 }
fg[SELECTED] = { 0, 0, 0 }
fg[ACTIVE] = { 0, 0, 0 }
fg[NORMAL] = { 0, 0, 0 }
fg[PRELIGHT] = { 0, 0, 0 }
}
style "mixer_mute_button" = "mute_button"
{
font_name = "sans 7"
xthickness = 0
ythickness = 0
}
style "mixer_mute_button_alternate" = "mute_button_alternate"
{
font_name = "sans 7"
xthickness = 0
ythickness = 0
}
style "mixer_mute_button_active" = "mute_button_active"
{
font_name = "sans 7"
xthickness = 0
ythickness = 0
}
style "multiline_combo" = "small_button"
{
@ -290,14 +382,39 @@ style "time_button" = "default_buttons_menus"
style "transport_button"
{
}
style "transport_button_active"
{
bg[NORMAL] = { 0.50, 1.0, 0.50 }
bg[ACTIVE] = { 0.50, 1.0, 0.50 }
bg[SELECTED] = { 0.50, 1.0, 0.50 }
bg[PRELIGHT] = { 0.50, 1.0, 0.50 }
fg[NORMAL] = { 0, 0, 0 }
fg[PRELIGHT] = { 0, 0, 0 }
fg[SELECTED] = { 0, 0, 0 }
fg[ACTIVE] = { 0, 0, 0 }
}
style "transport_rec_button"
{
}
style "transport_rec_button_active"
{
bg[ACTIVE] = { 1.0, 0, 0 }
bg[PRELIGHT] = { 0.91, 0.68, 0.68 } #blinking rec button color
bg[NORMAL] = { 1.0, 0, 0 }
bg[SELECTED] = { 1.0, 0, 0 }
bg[PRELIGHT] = { 1.0, 0, 0 }
}
style "transport_rec_button_alternate"
{
bg[PRELIGHT] = { 0.91, 0.68, 0.68 }
bg[NORMAL] = { 0.91, 0.68, 0.68 }
bg[SELECTED] = { 0.91, 0.68, 0.68 }
bg[ACTIVE] = { 0.91, 0.68, 0.68 }
}
style "shuttle_control" = "very_small_text"
@ -721,11 +838,11 @@ style "track_controls_inactive"
style "edit_controls_base_selected"
{
bg[NORMAL] = { 0.56, 0.56, 0.56 }
bg[ACTIVE] = { 0.56, 0.56, 0.56 }
bg[INSENSITIVE] = { 0.56, 0.56, 0.56 }
bg[SELECTED] = { 0.56, 0.56, 0.56 }
bg[PRELIGHT] = { 0.56, 0.56, 0.56 }
bg[NORMAL] = { 0.60, 0.54, 0.60 }
bg[ACTIVE] = { 0.60, 0.54, 0.60 }
bg[INSENSITIVE] = { 0.60, 0.54, 0.60 }
bg[SELECTED] = { 0.60, 0.54, 0.60 }
bg[PRELIGHT] = { 0.60, 0.54, 0.60 }
}
style "automation_track_controls_base"
@ -1014,355 +1131,365 @@ style "ardour_button" ="default_buttons_menus"
}
#---------------------------------------------------------------
widget "*FirstActionMessage" style "first_action_message"
widget "*VerboseCanvasCursor" style "verbose_canvas_cursor"
widget "*MarkerText" style "marker_text"
widget "*TimeAxisViewItemName*" style "time_axis_view_item_name"
#widget "*ExportProgress" style "default_buttons_menus"
widget "*ExportFileLabel" style "small_bold_text"
widget "*ExportFormatLabel" style "medium_bold_text"
widget "*ExportHeader" style "small_bold_text"
widget "*ExportFileDisplay" style "medium_entry"
widget "*ExportFormatDisplay" style "medium_entry"
widget "*ExportCheckbox" style "small_entry"
widget "*ExportTrackSelector*" style "medium_entry_noselection_bg"
widget "*EditModeSelector" style "medium_bold_entry"
widget "*SnapTypeSelector" style "medium_bold_entry"
widget "*SnapModeSelector" style "medium_bold_entry"
widget "*ZoomFocusSelector" style "medium_bold_entry"
widget "*ArdourContextMenu*" style "default_buttons_menus"
widget "*EditGroupTitleButton*" style "default_buttons_menus"
widget "*MixerGroupTitleButton*" style "default_buttons_menus"
widget "*ErrorLogCloseButton" style "default_buttons_menus"
widget "*EditorGTKButton*" style "default_buttons_menus"
widget "*ToolbarButton" style "default_buttons_menus"
widget "*ToolbarButton*" style "default_buttons_menus"
widget "*CrossfadeEditButton" style "default_buttons_menus"
widget "*CrossfadeEditButton*" style "default_buttons_menus"
widget "*TrackHistoryButton*" style "default_buttons_menus"
widget "*TrackSizeButton*" style "default_buttons_menus"
widget "*TrackPlaylistButton*" style "default_buttons_menus"
widget "*TrackAutomationButton*" style "default_buttons_menus"
widget "*TrackGroupButton*" style "default_buttons_menus"
widget "*TrackMixButton*" style "default_buttons_menus"
widget "*TrackVisualButton*" style "default_buttons_menus"
widget "*TrackRemoveButton*" style "default_buttons_menus"
widget "*BaseButton" style "default_buttons_menus"
widget "*TakeButtonLabel" style "default_buttons_menus"
widget "*MixerWidthButton" style "default_buttons_menus"
widget "*MixerHideButton" style "default_buttons_menus"
widget "*MixerSendButton" style "default_buttons_menus"
widget "*MixerSendButtonLabel" style "default_buttons_menus"
widget "*MixerSendSwitch" style "default_buttons_menus"
widget "*MixerInsertButton" style "default_buttons_menus"
widget "*MixerInsertButtonLabel" style "default_buttons_menus"
widget "*MixerInsertSwitch" style "default_buttons_menus"
widget "*MixerMonitorInputButton*" style "very_small_button"
widget "*MixerMonitorInputButton.*" style "very_small_button"
widget "*MixerIOButton" style "very_small_button"
widget "*MixerIOButtonLabel" style "very_small_button"
widget "*AddRouteDialogSpinner" style "ardour_adjusters"
widget "*AddRouteDialogRadioButton*" style "options_window"
widget "*OptionsNotebook" style "options_window"
widget "*OptionEditorToggleButton*" style "options_window"
widget "*OptionsLabel" style "options_window"
widget "*OptionEditorAuditionerLabel" style "options_window"
widget "*OptionsEntry" style "option_entry"
widget "*InspectorNotebook" style "options_window"
widget "*NewSessionDialog" style "options_window"
widget "*NewSessionDialogButton*" style "options_window"
widget "*MixerSendSwitch*" style "very_small_red_active_and_selected_button"
widget "*OptionEditorToggleButton" style "small_red_active_and_selected_button"
widget "*NewSessionDialogButton" style "small_red_active_and_selected_button"
widget "*MixerRecordEnableButton" style "mixer_rec_enable_button"
widget "*MixerRecordEnableButton*" style "mixer_rec_enable_button"
widget "*TrackRecordEnableButton" style "track_rec_enable_button"
widget "*TrackRecordEnableButton*" style "track_rec_enable_button"
widget "*TrackMuteButton*" style "mute_button"
widget "*TrackLoopButton*" style "track_loop_button"
widget "*PanAutomationLineSelector*" style "multiline_combo"
widget "*EditorTimeButton*" style "time_button"
widget "*EditorMixerButton*" style "default_buttons_menus"
widget "*SoloButton*" style "solo_button"
widget "*SoloButton.*" style "solo_button"
widget "*SafeSoloButton*" style "safe_solo_button"
widget "*SafeSoloButton.*" style "safe_solo_button"
widget "*MixerPhaseInvertButton*" style "very_small_button"
widget "*MixerPhaseInvertButton.*" style "very_small_button"
widget "*MixerAutomationRecordingButton*" style "very_small_button"
widget "*MixerAutomationRecordingButton.*" style "very_small_button"
widget "*MixerAutomationModeButton*" style "very_small_button"
widget "*MixerAutomationModeButton.*" style "very_small_button"
widget "*MixerAutomationPlaybackButton*" style "very_small_button"
widget "*MixerAutomationPlaybackButton.*" style "very_small_button"
widget "*MixerMuteButton*" style "mixer_mute_button"
widget "*MixerMuteButton.*" style "mixer_mute_button"
widget "*MixerSoloButton*" style "mixer_solo_button"
widget "*MixerSoloButton.*" style "mixer_solo_button"
widget "*MixerNameButton" style "very_small_button"
widget "*MixerNameButtonLabel" style "very_small_button"
widget "*MixerGroupButton" style "very_small_button"
widget "*MixerGroupButtonLabel" style "very_small_button"
widget "*MixerCommentButton" style "very_small_button"
widget "*MixerCommentButton*" style "very_small_button"
widget "*EditGroupButton" style "very_small_button"
widget "*EditGroupButtonLabel" style "very_small_button"
widget "*TransportButton" style "transport_button"
widget "*TransportButton*" style "transport_button"
widget "*ShuttleButton" style "transport_button"
widget "*ShuttleButton*" style "transport_button"
widget "*ShuttleDisplay" style "transport_button"
widget "*ShuttleDisplay*" style "transport_button"
widget "*ShuttleControl" style "shuttle_control"
widget "*TransportRecButton" style "transport_rec_button"
widget "*TransportRecButton*" style "transport_rec_button"
widget "*RecordingXrunWarningWindow" style "xrun_warn"
widget "*RecordingXrunWarningWindow*" style "xrun_warn"
widget "*MainMenuBar" style "menu_bar_base"
widget "*ErrorMessage" style "error_message"
widget "*FatalMessage" style "fatal_message"
widget "*InfoMessage" style "info_message"
widget "*WarningMessage" style "warning_message"
widget "*BigClockNonRecording" style "non_recording_big_clock_display"
widget "*BigClockRecording" style "recording_big_clock_display"
widget "*TransportClockDisplay" style "transport_clock_display"
widget "*SecondaryClockDisplay" style "transport_clock_display"
widget "*AudioClockFramesUpperInfo" style "tempo_meter_clock_display"
widget "*AudioClockFramesLowerInfo" style "tempo_meter_clock_display"
widget "*AudioClockSMPTEUpperInfo" style "tempo_meter_clock_display"
widget "*AudioClockSMPTELowerInfo" style "tempo_meter_clock_display"
widget "*AudioClockBBTUpperInfo" style "tempo_meter_clock_display"
widget "*AudioClockBBTLowerInfo" style "tempo_meter_clock_display"
widget "*SelectionStartClock" style "default_clock_display"
widget "*SelectionEndClock" style "default_clock_display"
widget "*EditCursorClock" style "default_clock_display"
widget "*PreRollClock" style "default_clock_display"
widget "*PostRollClock" style "default_clock_display"
widget "*NudgeClock" style "default_clock_display"
widget "*ZoomRangeClock" style "default_clock_display"
widget "*SMPTEOffsetClock" style "default_clock_display"
widget "*TransportLabel" style "small_bold_text"
widget "*TakeLabel" style "small_bold_text"
widget "*LocationLabel" style "small_bold_text"
widget "*WipeLabel" style "small_bold_text"
widget "*TakeTagLabel" style "small_bold_text"
widget "*ToolBarLabel" style "small_bold_text"
widget "*EditorDisplayLabel" style "small_bold_text"
widget "*NewSessionLabel" style "large_text"
widget "*GlobalButtonLabel" style "default_buttons_menus"
widget "*ClickButton" style "medium_entry"
widget "*RegionNameDisplay" style "medium_entry"
widget "*PluginDisplay" style "medium_entry"
widget "*SelectionDisplay" style "medium_entry"
widget "*HistorySelector" style "medium_entry"
widget "*LocationSelector" style "medium_entry"
widget "*TakeSelector" style "medium_entry"
widget "*RegionSelector" style "medium_entry"
widget "*SMPTERuler" style "editor_time_ruler"
widget "*BBTRuler" style "editor_time_ruler"
widget "*FramesRuler" style "editor_time_ruler"
widget "*MinSecRuler" style "editor_time_ruler"
widget "*BaseFrame" style "base_frame"
widget "*AudioTrackStripBase" style "audio_track_base"
widget "*TimeAxisViewControlsBaseUnselected" style "audio_track_base"
widget "*AudioTrackControlsBaseUnselected" style "audio_track_base"
widget "*AudioTrackFader" style "gain_fader"
widget "*AudioBusStripBase" style "audio_bus_base"
widget "*BusControlsBaseUnselected" style "audio_bus_base"
widget "*AudioBusFader" style "gain_fader"
widget "*TrackSeparator" style "track_separator"
widget "*TrackEditIndicator0*" style "edit_group_0"
widget "*TrackEditIndicator1*" style "edit_group_1"
widget "*TrackEditIndicator2*" style "edit_group_2"
widget "*TrackEditIndicator3*" style "edit_group_3"
widget "*TrackEditIndicator4*" style "edit_group_3"
widget "*TrackEditIndicator5*" style "edit_group_3"
widget "*TrackEditIndicator6*" style "edit_group_3"
widget "*TrackEditIndicator7*" style "edit_group_3"
widget "*EditorTrackNameDisplay" style "track_name_display"
widget "*EditorTrackNameDisplay*" style "track_name_display"
widget "*EditorActiveTrackNameDisplay" style "active_track_name_display"
widget "*EditorActiveTrackNameDisplay*" style "active_track_name_display"
widget "*CrossfadeEditAuditionButton" style "red_when_active"
widget "*CrossfadeEditAuditionButton*" style "red_when_active"
widget "*CrossfadeEditCurveButton" style "red_when_active"
widget "*CrossfadeEditCurveButton*" style "red_when_active"
widget "*CrossfadeEditLabel" style "medium_text"
widget "*CrossfadeEditFrame" style "base_frame"
widget "*MouseModeButton" style "default_buttons_menus"
widget "*MouseModeButton*" style "default_buttons_menus"
widget "*EditorMainCanvas" style "main_canvas_area"
widget "*AudioTrackControlsBaseInactiveUnselected" style "track_controls_inactive"
widget "*BusControlsBaseInactiveUnselected" style "track_controls_inactive"
widget "*AutomationTrackControlsBaseInactiveUnselected" style "track_controls_inactive"
widget "*AutomationTrackName" style "automation_track_name"
widget "*AudioTrackControlsBaseInactiveSelected" style "track_controls_inactive"
widget "*BusControlsBaseInactiveSelected" style "track_controls_inactive"
widget "*AutomationTrackControlsBaseInactiveSelected" style "track_controls_inactive"
widget "*AudioTrackStripBaseInactive" style "track_controls_inactive"
widget "*AudioBusStripBaseInactive" style "track_controls_inactive"
widget "*AudioTrackControlsBaseSelected" style "edit_controls_base_selected"
widget "*BusControlsBaseSelected" style "edit_controls_base_selected"
widget "*AutomationTrackControlsBase" style "automation_track_controls_base"
widget "*AutomationTrackControlsBaseSelected" style "edit_controls_base_selected"
widget "*EditorMenuBar*" style "black_mackie_menu_bar"
widget "*MainMenuBar*" style "black_mackie_menu_bar"
widget "*ZoomClickBox" style "medium_bold_entry"
widget "*PluginParameterLabel" style "medium_text"
widget "*PluginNameInfo" style "plugin_name_text"
widget "*PluginMakerInfo" style "plugin_maker_text"
widget "*PluginParameterInfo" style "medium_text"
widget "*MotionControllerValue" style "medium_entry"
widget "*ParameterValueDisplay" style "medium_bold_entry"
widget "*PluginUIClickBox" style "medium_bold_entry"
widget "*PluginUIClickBox*" style "medium_bold_entry"
widget "*PluginSlider" style "plugin_slider"
widget "*RedirectSelector" style "redirect_list_display"
widget "*RedirectSelector.*" style "redirect_list_display"
widget "*EditGroupDisplay" style "treeview_display"
widget "*TrackListDisplay" style "treeview_display"
widget "*RegionListDisplay" style "treeview_display"
widget "*NamedSelectionDisplay" style "treeview_display"
widget "*SnapshotDisplay" style "treeview_display"
widget "*MixerTrackCommentArea" style "option_entry"
widget "*MixerPanZone" style "pan_zone"
widget "*MixerTrackDisplayList" style "treeview_display"
widget "*MixerSnapshotDisplayList" style "treeview_display"
widget "*MixerAuxDisplayList" style "treeview_display"
widget "*MixerGroupList" style "treeview_display"
widget "*RegionEditorLabel" style "medium_text"
widget "*RegionEditorSmallLabel" style "small_text"
widget "*RegionEditorEntry" style "medium_entry"
widget "*RegionEditorClock" style "default_clock_display"
widget "*RegionEditorToggleButton" style "paler_red_when_active"
widget "*RegionEditorToggleButton*" style "paler_red_when_active"
widget "*MixerStripSpeedBase" style "small_entry"
widget "*MixerStripSpeedBase*" style "small_entry"
widget "*MixerStripSpeedBaseNotOne" style "small_red_on_black_entry"
widget "*MixerStripSpeedBaseNotOne*" style "small_red_on_black_entry"
widget "*MixerStripGainDisplay" style "small_entry"
widget "*MixerStripGainDisplay*" style "small_entry"
widget "*MixerStripGainUnitButton" style "very_small_button"
widget "*MixerStripGainUnitButton*" style "very_small_button"
widget "*MixerStripMeterPreButton" style "very_small_button"
widget "*MixerStripMeterPreButton*" style "very_small_button"
widget "*MixerStripPeakDisplay*" style "red_active_small_entry"
widget "*MixerStripPeakDisplayPeak*" style "peak_display_peaked_entry"
widget "*MixerStripSelectedFrame" style "selected_strip_frame"
widget "*MixerStripFrame" style "base_frame"
widget "*HWMonitorButton" style "red_when_active"
widget "*HWMonitorButton*" style "red_when_active"
widget "*BypassButton" style "red_when_active"
widget "*BypassButton*" style "red_when_active"
widget "*TransportSoloAlert" style "flashing_alert"
widget "*TransportSoloAlert.*" style "flashing_alert"
widget "*TransportAuditioningAlert" style "flashing_alert"
widget "*TransportAuditioningAlert.*" style "flashing_alert"
widget "*FadeCurve" style "medium_bold_entry"
widget "*FadeCurve*" style "medium_bold_entry"
widget "*IOSelectorButton" style "default_buttons_menus"
widget "*IOSelectorButton*" style "default_buttons_menus"
widget "*IOSelectorList" style "medium_entry_noselection_fg"
widget "*IOSelectorPortList" style "io_selector_port_list"
widget "*IOSelectorPortList.*" style "io_selector_port_list"
widget "*IOSelectorPortListSelected" style "selected_io_selector_port_list"
widget "*IOSelectorPortListSelected.*" style "selected_io_selector_port_list"
widget "*IOSelectorNotebook" style "io_selector_notebook"
widget "*IOSelectorNotebookTab" style "io_selector_notebook"
widget "*IOSelectorFrame" style "base_frame"
widget "*ConnectionEditorButton" style "default_buttons_menus"
widget "*ConnectionEditorButton*" style "default_buttons_menus"
widget "*ConnectionEditorList" style "medium_entry_noselection_fg"
widget "*ConnectionEditorConnectionList" style "medium_entry"
widget "*ConnectionEditorPortList" style "io_selector_port_list"
widget "*ConnectionEditorPortListSelected" style "selected_io_selector_port_list"
widget "*ConnectionEditorNotebook" style "io_selector_notebook"
widget "*ConnectionEditorNotebookTab" style "io_selector_notebook"
widget "*ConnectionEditorFrame" style "base_frame"
widget "*RouteParamsListDisplay" style "inspector_track_list_display"
widget "*RouteParamsPreListDisplay" style "inspector_redirect_list_display"
widget "*RouteParamsPostListDisplay" style "inspector_redirect_list_display"
widget "*TearOffArrow" style "tearoff_arrow"
widget "*RouteParamsTitleButton" style "medium_text"
widget "*RouteParamsTitleLabel" style "medium_text"
widget "*PluginAutomateRecordButton" style "small_red_active_and_selected_button"
widget "*PluginAutomateRecordButton*" style "small_red_active_and_selected_button"
widget "*PluginAutomatePlayButton" style "small_red_active_and_selected_button"
widget "*PluginAutomatePlayButton*" style "small_red_active_and_selected_button"
widget "*PluginAutomateButton" style "small_button"
widget "*PluginAutomateButton*" style "small_button"
widget "*PluginSaveButton" style "small_button"
widget "*PluginSaveButton*" style "small_button"
widget "*PluginLoadButton" style "small_button"
widget "*PluginLoadButton*" style "small_button"
widget "*FaderMetricsStrip" style "meter_metrics_strip"
widget "*MeterMetricsStrip" style "meter_metrics_strip"
widget "*MetricDialogFrame" style "base_frame"
widget "*MetricEntry" style "medium_bold_entry"
widget "*MetricButton" style "default_buttons_menus"
widget "*MetricButton.*" style "default_buttons_menus"
widget "*MetricLabel" style "medium_text"
widget "*TimeStretchButton" style "default_buttons_menus"
widget "*TimeStretchButton.*" style "default_buttons_menus"
widget "*TimeStretchProgress" style "default_buttons_menus"
widget "*ChoiceWindow" style "default_buttons_menus"
widget "*ChoicePrompt" style "default_buttons_menus"
widget "*ChoiceButton" style "default_buttons_menus"
widget "*ChoiceButton*" style "default_buttons_menus"
widget "*SelectionModeButton" style "default_buttons_menus"
widget "*SelectionModeButton*" style "default_buttons_menus"
widget "*TrackLabel" style "medium_text"
widget "*TrackPlugName" style "medium_text"
widget "*TrackParameterName" style "small_text"
widget "*AddRouteDialog*" style "medium_text"
widget "*AddRouteDialog.GtkLabel" style "medium_text"
widget "*AddRouteDialogChannelChoice" style "medium_bold_entry"
widget "*AddRouteDialogSpinner" style "medium_bold_entry"
widget "*AddRouteDialogSpinner*" style "medium_bold_entry"
widget "*AddRouteDialogRadioButton" style "red_when_active"
widget "*AddRouteDialogButton" style "default_buttons_menus"
widget "*AddRouteDialogNameTemplateEntry" style "medium_bold_entry"
widget "*NewSessionIOLabel" style "larger_bold_text"
widget "*NewSessionSR1Label" style "red_medium_text"
widget "*NewSessionSR2Label" style "medium_text"
widget "*NewSessionChannelChoice" style "medium_bold_entry"
widget "*NewSessionMainButton" style "larger_bold_text"
widget "*NewSessionMainButton*" style "larger_bold_text"
widget "*NewSessionMainLabel" style "larger_bold_text"
widget "*LocationEditRowClock" style "location_rows_clock"
widget "*LocationEditNameLabel" style "medium_text"
widget "*LocationEditSetButton" style "location_row_button"
widget "*LocationEditSetButton*" style "location_row_button"
widget "*LocationEditGoButton" style "location_row_button"
widget "*LocationEditGoButton*" style "location_row_button"
widget "*LocationEditCdButton" style "small_red_active_and_selected_button"
widget "*LocationEditCdButton*" style "small_red_active_and_selected_button"
widget "*LocationEditHideButton" style "small_red_active_and_selected_button"
widget "*LocationEditHideButton*" style "small_red_active_and_selected_button"
widget "*LocationEditNumberLabel" style "small_text"
widget "*LocationLocEditorFrame" style "base_frame"
widget "*LocationRangeEditorFrame" style "base_frame"
widget "*LocationEditNameEntry" style "option_entry"
widget "*LocationAddLocationButton" style "default_buttons_menus"
widget "*LocationAddLocationButton*" style "default_buttons_menus"
widget "*LocationAddRangeButton" style "default_buttons_menus"
widget "*LocationAddRangeButton*" style "default_buttons_menus"
widget "*LocationEditRemoveButton" style "location_row_button"
widget "*LocationEditRemoveButton*" style "location_row_button"
widget "*PanSlider" style "pan_slider"
widget "*PanningLinkButton" style "mixer_red_active_button"
widget "*PanningLinkButton.*" style "mixer_red_active_button"
widget "*PanningLinkDirectionButton" style "very_small_button"
widget "*PanningLinkDirectionButton.*" style "very_small_button"
widget "*ChannelCountSelector" style "medium_bold_entry"
widget "*ChannelCountSelector.GtkArrow" style "default_buttons_menus"
widget "*RegionListWholeFile" style "treeview_parent_node"
widget "*EditorHScrollbar" style "editor_hscrollbar"
class "GtkWidget" style "default_base"
class "GtkScrollbar" style "ardour_adjusters"
class "GtkLabel" style "default_buttons_menus"
class "GtkButton" style "ardour_button"
class "GtkArrow" style "tearoff_arrow"
class "GtkProgressBar" style "ardour_progressbars"
class "GtkWidget" style:highest "default_base"
class "GtkScrollbar" style:highest "ardour_adjusters"
class "GtkLabel" style:highest "default_buttons_menus"
class "GtkButton" style:highest "ardour_button"
class "GtkArrow" style:highest "tearoff_arrow"
class "GtkProgressBar" style:highest "ardour_progressbars"
widget "*FirstActionMessage" style:highest "first_action_message"
widget "*VerboseCanvasCursor" style:highest "verbose_canvas_cursor"
widget "*MarkerText" style:highest "marker_text"
widget "*TimeAxisViewItemName*" style:highest "time_axis_view_item_name"
#widget "*ExportProgress" style:highest "default_buttons_menus"
widget "*ExportFileLabel" style:highest "small_bold_text"
widget "*ExportFormatLabel" style:highest "medium_bold_text"
widget "*ExportHeader" style:highest "small_bold_text"
widget "*ExportFileDisplay" style:highest "medium_entry"
widget "*ExportFormatDisplay" style:highest "medium_entry"
widget "*ExportCheckbox" style:highest "small_entry"
widget "*ExportTrackSelector*" style:highest "medium_entry_noselection_bg"
widget "*EditModeSelector" style:highest "medium_bold_entry"
widget "*SnapTypeSelector" style:highest "medium_bold_entry"
widget "*SnapModeSelector" style:highest "medium_bold_entry"
widget "*ZoomFocusSelector" style:highest "medium_bold_entry"
widget "*ArdourContextMenu*" style:highest "default_buttons_menus"
widget "*EditGroupTitleButton*" style:highest "default_buttons_menus"
widget "*MixerGroupTitleButton*" style:highest "default_buttons_menus"
widget "*ErrorLogCloseButton" style:highest "default_buttons_menus"
widget "*EditorGTKButton*" style:highest "default_buttons_menus"
widget "*ToolbarButton" style:highest "default_buttons_menus"
widget "*ToolbarButton*" style:highest "default_buttons_menus"
widget "*CrossfadeEditButton" style:highest "default_buttons_menus"
widget "*CrossfadeEditButton*" style:highest "default_buttons_menus"
widget "*TrackHistoryButton*" style:highest "default_buttons_menus"
widget "*TrackSizeButton*" style:highest "default_buttons_menus"
widget "*TrackPlaylistButton*" style:highest "default_buttons_menus"
widget "*TrackAutomationButton*" style:highest "default_buttons_menus"
widget "*TrackGroupButton*" style:highest "default_buttons_menus"
widget "*TrackMixButton*" style:highest "default_buttons_menus"
widget "*TrackVisualButton*" style:highest "default_buttons_menus"
widget "*TrackRemoveButton*" style:highest "default_buttons_menus"
widget "*BaseButton" style:highest "default_buttons_menus"
widget "*TakeButtonLabel" style:highest "default_buttons_menus"
widget "*MixerWidthButton" style:highest "default_buttons_menus"
widget "*MixerHideButton" style:highest "default_buttons_menus"
widget "*MixerSendButton" style:highest "default_buttons_menus"
widget "*MixerSendButtonLabel" style:highest "default_buttons_menus"
widget "*MixerSendSwitch" style:highest "default_buttons_menus"
widget "*MixerInsertButton" style:highest "default_buttons_menus"
widget "*MixerInsertButtonLabel" style:highest "default_buttons_menus"
widget "*MixerInsertSwitch" style:highest "default_buttons_menus"
widget "*MixerMonitorInputButton*" style:highest "very_small_button"
widget "*MixerMonitorInputButton.*" style:highest "very_small_button"
widget "*MixerIOButton" style:highest "very_small_button"
widget "*MixerIOButtonLabel" style:highest "very_small_button"
widget "*AddRouteDialogSpinner" style:highest "ardour_adjusters"
widget "*AddRouteDialogRadioButton*" style:highest "options_window"
widget "*OptionsNotebook" style:highest "options_window"
widget "*OptionEditorToggleButton*" style:highest "options_window"
widget "*OptionsLabel" style:highest "options_window"
widget "*OptionEditorAuditionerLabel" style:highest "options_window"
widget "*OptionsEntry" style:highest "option_entry"
widget "*InspectorNotebook" style:highest "options_window"
widget "*NewSessionDialog" style:highest "options_window"
widget "*NewSessionDialogButton*" style:highest "options_window"
widget "*MixerSendSwitch*" style:highest "very_small_red_active_and_selected_button"
widget "*OptionEditorToggleButton" style:highest "small_red_active_and_selected_button"
widget "*NewSessionDialogButton" style:highest "small_red_active_and_selected_button"
widget "*RecordEnableButton" style:highest "track_rec_enable_button"
widget "*RecordEnableButton-active" style:highest "track_rec_enable_button_active"
widget "*RecordEnableButton-alternate" style:highest "track_rec_enable_button_alternate"
widget "*MixerRecordEnableButton" style:highest "mixer_track_rec_enable_button"
widget "*MixerRecordEnableButton-active" style:highest "mixer_track_rec_enable_button_active"
widget "*MixerRecordEnableButton-alternate" style:highest "mixer_track_rec_enable_button_alternate"
widget "*MuteButton" style:highest "mute_button"
widget "*MuteButton-alternate" style:highest "mute_button_alternate"
widget "*MuteButton-active" style:highest "mute_button_active"
widget "*MixerMuteButton" style:highest "mixer_mute_button"
widget "*MixerMuteButton-alternate" style:highest "mixer_mute_button_alternate"
widget "*MixerMuteButton-active" style:highest "mixer_mute_button_active"
widget "*SoloButton" style:highest "solo_button"
widget "*SoloButton-alternate" style:highest "solo_button_alternate"
widget "*SoloButton-active" style:highest "solo_button_active"
widget "*MixerSoloButton" style:highest "mixer_solo_button"
widget "*MixerSoloButton-alternate" style:highest "mixer_solo_button_alternate"
widget "*MixerSoloButton-active" style:highest "mixer_solo_button_active"
widget "*TrackLoopButton*" style:highest "track_loop_button"
widget "*PanAutomationLineSelector*" style:highest "multiline_combo"
widget "*EditorTimeButton*" style:highest "time_button"
widget "*MixerPhaseInvertButton*" style:highest "very_small_button"
widget "*MixerPhaseInvertButton.*" style:highest "very_small_button"
widget "*MixerAutomationRecordingButton*" style:highest "very_small_button"
widget "*MixerAutomationRecordingButton.*" style:highest "very_small_button"
widget "*MixerAutomationModeButton*" style:highest "very_small_button"
widget "*MixerAutomationModeButton.*" style:highest "very_small_button"
widget "*MixerAutomationPlaybackButton*" style:highest "very_small_button"
widget "*MixerAutomationPlaybackButton.*" style:highest "very_small_button"
widget "*MixerNameButton" style:highest "very_small_button"
widget "*MixerNameButtonLabel" style:highest "very_small_button"
widget "*MixerGroupButton" style:highest "very_small_button"
widget "*MixerGroupButtonLabel" style:highest "very_small_button"
widget "*MixerCommentButton" style:highest "very_small_button"
widget "*MixerCommentButton*" style:highest "very_small_button"
widget "*EditGroupButton" style:highest "very_small_button"
widget "*EditGroupButtonLabel" style:highest "very_small_button"
widget "*TransportButton" style:highest "transport_rec_button"
widget "*TransportButton-active" style:highest "transport_button_active"
widget "*ShuttleButton" style:highest "transport_button"
widget "*ShuttleButton*" style:highest "transport_button"
widget "*ShuttleDisplay" style:highest "transport_button"
widget "*ShuttleDisplay*" style:highest "transport_button"
widget "*ShuttleControl" style:highest "shuttle_control"
widget "*TransportRecButton" style:highest "transport_rec_button"
widget "*TransportRecButton*" style:highest "transport_rec_button"
widget "*TransportRecButton-active" style:highest "transport_rec_button_active"
widget "*TransportRecButton-active*" style:highest "transport_rec_button_active"
widget "*TransportRecButton-alternate" style:highest "transport_rec_button_alternate"
widget "*TransportRecButton-alternate*" style:highest "transport_rec_button_alternate"
widget "*TransportRecButton*" style:highest "transport_rec_button"
widget "*RecordingXrunWarningWindow" style:highest "xrun_warn"
widget "*RecordingXrunWarningWindow*" style:highest "xrun_warn"
widget "*MainMenuBar" style:highest "menu_bar_base"
widget "*ErrorMessage" style:highest "error_message"
widget "*FatalMessage" style:highest "fatal_message"
widget "*InfoMessage" style:highest "info_message"
widget "*WarningMessage" style:highest "warning_message"
widget "*BigClockNonRecording" style:highest "non_recording_big_clock_display"
widget "*BigClockRecording" style:highest "recording_big_clock_display"
widget "*TransportClockDisplay" style:highest "transport_clock_display"
widget "*SecondaryClockDisplay" style:highest "transport_clock_display"
widget "*AudioClockFramesUpperInfo" style:highest "tempo_meter_clock_display"
widget "*AudioClockFramesLowerInfo" style:highest "tempo_meter_clock_display"
widget "*AudioClockSMPTEUpperInfo" style:highest "tempo_meter_clock_display"
widget "*AudioClockSMPTELowerInfo" style:highest "tempo_meter_clock_display"
widget "*AudioClockBBTUpperInfo" style:highest "tempo_meter_clock_display"
widget "*AudioClockBBTLowerInfo" style:highest "tempo_meter_clock_display"
widget "*SelectionStartClock" style:highest "default_clock_display"
widget "*SelectionEndClock" style:highest "default_clock_display"
widget "*EditCursorClock" style:highest "default_clock_display"
widget "*PreRollClock" style:highest "default_clock_display"
widget "*PostRollClock" style:highest "default_clock_display"
widget "*NudgeClock" style:highest "default_clock_display"
widget "*ZoomRangeClock" style:highest "default_clock_display"
widget "*SMPTEOffsetClock" style:highest "default_clock_display"
widget "*TransportLabel" style:highest "small_bold_text"
widget "*TakeLabel" style:highest "small_bold_text"
widget "*LocationLabel" style:highest "small_bold_text"
widget "*WipeLabel" style:highest "small_bold_text"
widget "*TakeTagLabel" style:highest "small_bold_text"
widget "*ToolBarLabel" style:highest "small_bold_text"
widget "*EditorDisplayLabel" style:highest "small_bold_text"
widget "*NewSessionLabel" style:highest "large_text"
widget "*GlobalButtonLabel" style:highest "default_buttons_menus"
widget "*ClickButton" style:highest "medium_entry"
widget "*RegionNameDisplay" style:highest "medium_entry"
widget "*PluginDisplay" style:highest "medium_entry"
widget "*SelectionDisplay" style:highest "medium_entry"
widget "*HistorySelector" style:highest "medium_entry"
widget "*LocationSelector" style:highest "medium_entry"
widget "*TakeSelector" style:highest "medium_entry"
widget "*RegionSelector" style:highest "medium_entry"
widget "*SMPTERuler" style:highest "editor_time_ruler"
widget "*BBTRuler" style:highest "editor_time_ruler"
widget "*FramesRuler" style:highest "editor_time_ruler"
widget "*MinSecRuler" style:highest "editor_time_ruler"
widget "*BaseFrame" style:highest "base_frame"
widget "*AudioTrackStripBase" style:highest "audio_track_base"
widget "*TimeAxisViewControlsBaseUnselected" style:highest "audio_track_base"
widget "*AudioTrackControlsBaseUnselected" style:highest "audio_track_base"
widget "*AudioTrackFader" style:highest "gain_fader"
widget "*AudioBusStripBase" style:highest "audio_bus_base"
widget "*BusControlsBaseUnselected" style:highest "audio_bus_base"
widget "*AudioBusFader" style:highest "gain_fader"
widget "*TrackSeparator" style:highest "track_separator"
widget "*TrackEditIndicator0*" style:highest "edit_group_0"
widget "*TrackEditIndicator1*" style:highest "edit_group_1"
widget "*TrackEditIndicator2*" style:highest "edit_group_2"
widget "*TrackEditIndicator3*" style:highest "edit_group_3"
widget "*TrackEditIndicator4*" style:highest "edit_group_3"
widget "*TrackEditIndicator5*" style:highest "edit_group_3"
widget "*TrackEditIndicator6*" style:highest "edit_group_3"
widget "*TrackEditIndicator7*" style:highest "edit_group_3"
widget "*EditorTrackNameDisplay" style:highest "track_name_display"
widget "*EditorTrackNameDisplay*" style:highest "track_name_display"
widget "*EditorActiveTrackNameDisplay" style:highest "active_track_name_display"
widget "*EditorActiveTrackNameDisplay*" style:highest "active_track_name_display"
widget "*CrossfadeEditAuditionButton" style:highest "red_when_active"
widget "*CrossfadeEditAuditionButton*" style:highest "red_when_active"
widget "*CrossfadeEditCurveButton" style:highest "red_when_active"
widget "*CrossfadeEditCurveButton*" style:highest "red_when_active"
widget "*CrossfadeEditLabel" style:highest "medium_text"
widget "*CrossfadeEditFrame" style:highest "base_frame"
widget "*MouseModeButton" style:highest "default_buttons_menus"
widget "*MouseModeButton*" style:highest "default_buttons_menus"
widget "*EditorMainCanvas" style:highest "main_canvas_area"
widget "*AudioTrackControlsBaseInactiveUnselected" style:highest "track_controls_inactive"
widget "*BusControlsBaseInactiveUnselected" style:highest "track_controls_inactive"
widget "*AutomationTrackControlsBaseInactiveUnselected" style:highest "track_controls_inactive"
widget "*AutomationTrackName" style:highest "automation_track_name"
widget "*AudioTrackControlsBaseInactiveSelected" style:highest "track_controls_inactive"
widget "*BusControlsBaseInactiveSelected" style:highest "track_controls_inactive"
widget "*AutomationTrackControlsBaseInactiveSelected" style:highest "track_controls_inactive"
widget "*AudioTrackStripBaseInactive" style:highest "track_controls_inactive"
widget "*AudioBusStripBaseInactive" style:highest "track_controls_inactive"
widget "*AudioTrackControlsBaseSelected" style:highest "edit_controls_base_selected"
widget "*BusControlsBaseSelected" style:highest "edit_controls_base_selected"
widget "*AutomationTrackControlsBase" style:highest "automation_track_controls_base"
widget "*AutomationTrackControlsBaseSelected" style:highest "edit_controls_base_selected"
widget "*EditorMenuBar*" style:highest "black_mackie_menu_bar"
widget "*MainMenuBar*" style:highest "black_mackie_menu_bar"
widget "*ZoomClickBox" style:highest "medium_bold_entry"
widget "*PluginParameterLabel" style:highest "medium_text"
widget "*PluginNameInfo" style:highest "plugin_name_text"
widget "*PluginMakerInfo" style:highest "plugin_maker_text"
widget "*PluginParameterInfo" style:highest "medium_text"
widget "*MotionControllerValue" style:highest "medium_entry"
widget "*ParameterValueDisplay" style:highest "medium_bold_entry"
widget "*PluginUIClickBox" style:highest "medium_bold_entry"
widget "*PluginUIClickBox*" style:highest "medium_bold_entry"
widget "*PluginSlider" style:highest "plugin_slider"
widget "*RedirectSelector" style:highest "redirect_list_display"
widget "*RedirectSelector.*" style:highest "redirect_list_display"
widget "*EditGroupDisplay" style:highest "treeview_display"
widget "*TrackListDisplay" style:highest "treeview_display"
widget "*RegionListDisplay" style:highest "treeview_display"
widget "*NamedSelectionDisplay" style:highest "treeview_display"
widget "*SnapshotDisplay" style:highest "treeview_display"
widget "*MixerTrackCommentArea" style:highest "option_entry"
widget "*MixerPanZone" style:highest "pan_zone"
widget "*MixerTrackDisplayList" style:highest "treeview_display"
widget "*MixerSnapshotDisplayList" style:highest "treeview_display"
widget "*MixerAuxDisplayList" style:highest "treeview_display"
widget "*MixerGroupList" style:highest "treeview_display"
widget "*RegionEditorLabel" style:highest "medium_text"
widget "*RegionEditorSmallLabel" style:highest "small_text"
widget "*RegionEditorEntry" style:highest "medium_entry"
widget "*RegionEditorClock" style:highest "default_clock_display"
widget "*RegionEditorToggleButton" style:highest "paler_red_when_active"
widget "*RegionEditorToggleButton*" style:highest "paler_red_when_active"
widget "*MixerStripSpeedBase" style:highest "small_entry"
widget "*MixerStripSpeedBase*" style:highest "small_entry"
widget "*MixerStripSpeedBaseNotOne" style:highest "small_red_on_black_entry"
widget "*MixerStripSpeedBaseNotOne*" style:highest "small_red_on_black_entry"
widget "*MixerStripGainDisplay" style:highest "small_entry"
widget "*MixerStripGainDisplay*" style:highest "small_entry"
widget "*MixerStripGainUnitButton" style:highest "very_small_button"
widget "*MixerStripGainUnitButton*" style:highest "very_small_button"
widget "*MixerStripMeterPreButton" style:highest "very_small_button"
widget "*MixerStripMeterPreButton*" style:highest "very_small_button"
widget "*MixerStripPeakDisplay*" style:highest "red_active_small_entry"
widget "*MixerStripPeakDisplayPeak*" style:highest "peak_display_peaked_entry"
widget "*MixerStripSelectedFrame" style:highest "selected_strip_frame"
widget "*MixerStripFrame" style:highest "base_frame"
widget "*HWMonitorButton" style:highest "red_when_active"
widget "*HWMonitorButton*" style:highest "red_when_active"
widget "*BypassButton" style:highest "red_when_active"
widget "*BypassButton*" style:highest "red_when_active"
widget "*TransportSoloAlert" style:highest "flashing_alert"
widget "*TransportSoloAlert.*" style:highest "flashing_alert"
widget "*TransportAuditioningAlert" style:highest "flashing_alert"
widget "*TransportAuditioningAlert.*" style:highest "flashing_alert"
widget "*FadeCurve" style:highest "medium_bold_entry"
widget "*FadeCurve*" style:highest "medium_bold_entry"
widget "*IOSelectorButton" style:highest "default_buttons_menus"
widget "*IOSelectorButton*" style:highest "default_buttons_menus"
widget "*IOSelectorList" style:highest "medium_entry_noselection_fg"
widget "*IOSelectorPortList" style:highest "io_selector_port_list"
widget "*IOSelectorPortList.*" style:highest "io_selector_port_list"
widget "*IOSelectorPortListSelected" style:highest "selected_io_selector_port_list"
widget "*IOSelectorPortListSelected.*" style:highest "selected_io_selector_port_list"
widget "*IOSelectorNotebook" style:highest "io_selector_notebook"
widget "*IOSelectorNotebookTab" style:highest "io_selector_notebook"
widget "*IOSelectorFrame" style:highest "base_frame"
widget "*ConnectionEditorButton" style:highest "default_buttons_menus"
widget "*ConnectionEditorButton*" style:highest "default_buttons_menus"
widget "*ConnectionEditorList" style:highest "medium_entry_noselection_fg"
widget "*ConnectionEditorConnectionList" style:highest "medium_entry"
widget "*ConnectionEditorPortList" style:highest "io_selector_port_list"
widget "*ConnectionEditorPortListSelected" style:highest "selected_io_selector_port_list"
widget "*ConnectionEditorNotebook" style:highest "io_selector_notebook"
widget "*ConnectionEditorNotebookTab" style:highest "io_selector_notebook"
widget "*ConnectionEditorFrame" style:highest "base_frame"
widget "*RouteParamsListDisplay" style:highest "inspector_track_list_display"
widget "*RouteParamsPreListDisplay" style:highest "inspector_redirect_list_display"
widget "*RouteParamsPostListDisplay" style:highest "inspector_redirect_list_display"
widget "*TearOffArrow" style:highest "tearoff_arrow"
widget "*RouteParamsTitleButton" style:highest "medium_text"
widget "*RouteParamsTitleLabel" style:highest "medium_text"
widget "*PluginAutomateRecordButton" style:highest "small_red_active_and_selected_button"
widget "*PluginAutomateRecordButton*" style:highest "small_red_active_and_selected_button"
widget "*PluginAutomatePlayButton" style:highest "small_red_active_and_selected_button"
widget "*PluginAutomatePlayButton*" style:highest "small_red_active_and_selected_button"
widget "*PluginAutomateButton" style:highest "small_button"
widget "*PluginAutomateButton*" style:highest "small_button"
widget "*PluginSaveButton" style:highest "small_button"
widget "*PluginSaveButton*" style:highest "small_button"
widget "*PluginLoadButton" style:highest "small_button"
widget "*PluginLoadButton*" style:highest "small_button"
widget "*FaderMetricsStrip" style:highest "meter_metrics_strip"
widget "*MeterMetricsStrip" style:highest "meter_metrics_strip"
widget "*MetricDialogFrame" style:highest "base_frame"
widget "*MetricEntry" style:highest "medium_bold_entry"
widget "*MetricButton" style:highest "default_buttons_menus"
widget "*MetricButton.*" style:highest "default_buttons_menus"
widget "*MetricLabel" style:highest "medium_text"
widget "*TimeStretchButton" style:highest "default_buttons_menus"
widget "*TimeStretchButton.*" style:highest "default_buttons_menus"
widget "*TimeStretchProgress" style:highest "default_buttons_menus"
widget "*ChoiceWindow" style:highest "default_buttons_menus"
widget "*ChoicePrompt" style:highest "default_buttons_menus"
widget "*ChoiceButton" style:highest "default_buttons_menus"
widget "*ChoiceButton*" style:highest "default_buttons_menus"
widget "*SelectionModeButton" style:highest "default_buttons_menus"
widget "*SelectionModeButton*" style:highest "default_buttons_menus"
widget "*TrackLabel" style:highest "medium_text"
widget "*TrackPlugName" style:highest "medium_text"
widget "*TrackParameterName" style:highest "small_text"
widget "*AddRouteDialog*" style:highest "medium_text"
widget "*AddRouteDialog.GtkLabel" style:highest "medium_text"
widget "*AddRouteDialogChannelChoice" style:highest "medium_bold_entry"
widget "*AddRouteDialogSpinner" style:highest "medium_bold_entry"
widget "*AddRouteDialogSpinner*" style:highest "medium_bold_entry"
widget "*AddRouteDialogRadioButton" style:highest "red_when_active"
widget "*AddRouteDialogButton" style:highest "default_buttons_menus"
widget "*AddRouteDialogNameTemplateEntry" style:highest "medium_bold_entry"
widget "*NewSessionIOLabel" style:highest "larger_bold_text"
widget "*NewSessionSR1Label" style:highest "red_medium_text"
widget "*NewSessionSR2Label" style:highest "medium_text"
widget "*NewSessionChannelChoice" style:highest "medium_bold_entry"
widget "*NewSessionMainButton" style:highest "larger_bold_text"
widget "*NewSessionMainButton*" style:highest "larger_bold_text"
widget "*NewSessionMainLabel" style:highest "larger_bold_text"
widget "*LocationEditRowClock" style:highest "location_rows_clock"
widget "*LocationEditNameLabel" style:highest "medium_text"
widget "*LocationEditSetButton" style:highest "location_row_button"
widget "*LocationEditSetButton*" style:highest "location_row_button"
widget "*LocationEditGoButton" style:highest "location_row_button"
widget "*LocationEditGoButton*" style:highest "location_row_button"
widget "*LocationEditCdButton" style:highest "small_red_active_and_selected_button"
widget "*LocationEditCdButton*" style:highest "small_red_active_and_selected_button"
widget "*LocationEditHideButton" style:highest "small_red_active_and_selected_button"
widget "*LocationEditHideButton*" style:highest "small_red_active_and_selected_button"
widget "*LocationEditNumberLabel" style:highest "small_text"
widget "*LocationLocEditorFrame" style:highest "base_frame"
widget "*LocationRangeEditorFrame" style:highest "base_frame"
widget "*LocationEditNameEntry" style:highest "option_entry"
widget "*LocationAddLocationButton" style:highest "default_buttons_menus"
widget "*LocationAddLocationButton*" style:highest "default_buttons_menus"
widget "*LocationAddRangeButton" style:highest "default_buttons_menus"
widget "*LocationAddRangeButton*" style:highest "default_buttons_menus"
widget "*LocationEditRemoveButton" style:highest "location_row_button"
widget "*LocationEditRemoveButton*" style:highest "location_row_button"
widget "*PanSlider" style:highest "pan_slider"
widget "*PanningLinkButton" style:highest "mixer_red_active_button"
widget "*PanningLinkButton.*" style:highest "mixer_red_active_button"
widget "*PanningLinkDirectionButton" style:highest "very_small_button"
widget "*PanningLinkDirectionButton.*" style:highest "very_small_button"
widget "*ChannelCountSelector" style:highest "medium_bold_entry"
widget "*ChannelCountSelector.GtkArrow" style:highest "default_buttons_menus"
widget "*RegionListWholeFile" style:highest "treeview_parent_node"
widget "*EditorHScrollbar" style:highest "editor_hscrollbar"

View file

@ -15,7 +15,6 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
$Id$
*/

View file

@ -15,7 +15,6 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
$Id$
*/
#include <algorithm>
@ -45,11 +44,13 @@
#include <gtkmm2ext/fastmeter.h>
#include <gtkmm2ext/stop_signal.h>
#include <gtkmm2ext/popup.h>
#include <gtkmm2ext/window_title.h>
#include <midi++/port.h>
#include <midi++/mmc.h>
#include <ardour/ardour.h>
#include <ardour/profile.h>
#include <ardour/session_route.h>
#include <ardour/port.h>
#include <ardour/audioengine.h>
@ -69,7 +70,6 @@
#include "mixer_ui.h"
#include "prompter.h"
#include "opts.h"
#include "keyboard_target.h"
#include "add_route_dialog.h"
#include "new_session_dialog.h"
#include "about.h"
@ -89,13 +89,12 @@ ARDOUR_UI *ARDOUR_UI::theArdourUI = 0;
sigc::signal<void,bool> ARDOUR_UI::Blink;
sigc::signal<void> ARDOUR_UI::RapidScreenUpdate;
sigc::signal<void> ARDOUR_UI::MidRapidScreenUpdate;
sigc::signal<void> ARDOUR_UI::SuperRapidScreenUpdate;
sigc::signal<void,nframes_t> ARDOUR_UI::Clock;
ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], string rcfile)
: Gtkmm2ext::UI ("ardour", argcp, argvp, rcfile),
: Gtkmm2ext::UI (X_("Ardour"), argcp, argvp, rcfile),
primary_clock (X_("primary"), false, X_("TransportClockDisplay"), true, false, true),
secondary_clock (X_("secondary"), false, X_("SecondaryClockDisplay"), true, false, true),
@ -117,16 +116,34 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], string rcfile)
/* transport */
time_master_button (_("time\nmaster")),
roll_controllable ("transport roll", *this, TransportControllable::Roll),
stop_controllable ("transport stop", *this, TransportControllable::Stop),
goto_start_controllable ("transport goto start", *this, TransportControllable::GotoStart),
goto_end_controllable ("transport goto end", *this, TransportControllable::GotoEnd),
auto_loop_controllable ("transport auto loop", *this, TransportControllable::AutoLoop),
play_selection_controllable ("transport play selection", *this, TransportControllable::PlaySelection),
rec_controllable ("transport rec-enable", *this, TransportControllable::RecordEnable),
shuttle_controllable ("shuttle", *this, TransportControllable::ShuttleControl),
shuttle_controller_binding_proxy (shuttle_controllable),
roll_button (roll_controllable),
stop_button (stop_controllable),
goto_start_button (goto_start_controllable),
goto_end_button (goto_end_controllable),
auto_loop_button (auto_loop_controllable),
play_selection_button (play_selection_controllable),
rec_button (rec_controllable),
shuttle_units_button (_("% ")),
punch_in_button (_("Punch In")),
punch_out_button (_("Punch Out")),
auto_return_button (_("Auto Return")),
auto_play_button (_("Autuo Play")),
auto_play_button (_("Auto Play")),
auto_input_button (_("Auto Input")),
click_button (_("Click")),
time_master_button (_("time\nmaster")),
auditioning_alert_button (_("AUDITION")),
solo_alert_button (_("SOLO")),
shown_flag (false)
@ -163,15 +180,13 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], string rcfile)
location_ui = 0;
open_session_selector = 0;
have_configure_timeout = false;
have_disk_overrun_displayed = false;
have_disk_underrun_displayed = false;
have_disk_speed_dialog_displayed = false;
_will_create_new_session_automatically = false;
session_loaded = false;
last_speed_displayed = -1.0f;
keybindings_path = ARDOUR::find_config_file ("ardour.bindings");
can_save_keybindings = false;
Glib::signal_idle().connect (mem_fun (*this, &ARDOUR_UI::first_idle));
last_configure_time.tv_sec = 0;
last_configure_time.tv_usec = 0;
@ -248,10 +263,6 @@ ARDOUR_UI::set_engine (AudioEngine& e)
AudioFileSource::set_build_peakfiles (true);
AudioFileSource::set_build_missing_peakfiles (true);
if (AudioSource::start_peak_thread ()) {
throw failed_constructor();
}
/* set default clock modes */
primary_clock.set_mode (AudioClock::SMPTE);
@ -289,8 +300,6 @@ ARDOUR_UI::~ARDOUR_UI ()
if (add_route_dialog) {
delete add_route_dialog;
}
AudioSource::stop_peak_thread ();
}
gint
@ -332,6 +341,63 @@ ARDOUR_UI::configure_handler (GdkEventConfigure* conf)
return FALSE;
}
void
ARDOUR_UI::set_transport_controllable_state (const XMLNode& node)
{
const XMLProperty* prop;
if ((prop = node.property ("roll")) != 0) {
roll_controllable.set_id (prop->value());
}
if ((prop = node.property ("stop")) != 0) {
stop_controllable.set_id (prop->value());
}
if ((prop = node.property ("goto_start")) != 0) {
goto_start_controllable.set_id (prop->value());
}
if ((prop = node.property ("goto_end")) != 0) {
goto_end_controllable.set_id (prop->value());
}
if ((prop = node.property ("auto_loop")) != 0) {
auto_loop_controllable.set_id (prop->value());
}
if ((prop = node.property ("play_selection")) != 0) {
play_selection_controllable.set_id (prop->value());
}
if ((prop = node.property ("rec")) != 0) {
rec_controllable.set_id (prop->value());
}
if ((prop = node.property ("shuttle")) != 0) {
shuttle_controllable.set_id (prop->value());
}
}
XMLNode&
ARDOUR_UI::get_transport_controllable_state ()
{
XMLNode* node = new XMLNode(X_("TransportControllables"));
char buf[64];
roll_controllable.id().print (buf, sizeof (buf));
node->add_property (X_("roll"), buf);
stop_controllable.id().print (buf, sizeof (buf));
node->add_property (X_("stop"), buf);
goto_start_controllable.id().print (buf, sizeof (buf));
node->add_property (X_("goto_start"), buf);
goto_end_controllable.id().print (buf, sizeof (buf));
node->add_property (X_("goto_end"), buf);
auto_loop_controllable.id().print (buf, sizeof (buf));
node->add_property (X_("auto_loop"), buf);
play_selection_controllable.id().print (buf, sizeof (buf));
node->add_property (X_("play_selection"), buf);
rec_controllable.id().print (buf, sizeof (buf));
node->add_property (X_("rec"), buf);
shuttle_controllable.id().print (buf, sizeof (buf));
node->add_property (X_("shuttle"), buf);
return *node;
}
void
ARDOUR_UI::save_ardour_state ()
{
@ -345,6 +411,7 @@ ARDOUR_UI::save_ardour_state ()
XMLNode* node = new XMLNode (keyboard->get_state());
Config->add_extra_xml (*node);
Config->add_extra_xml (get_transport_controllable_state());
Config->save_state();
XMLNode enode(static_cast<Stateful*>(editor)->get_state());
@ -364,26 +431,72 @@ ARDOUR_UI::save_ardour_state ()
void
ARDOUR_UI::startup ()
{
if (engine->is_realtime()) {
check_memory_locking();
}
void
ARDOUR_UI::no_memory_warning ()
{
XMLNode node (X_("no-memory-warning"));
Config->add_instant_xml (node, get_user_ardour_path());
}
void
ARDOUR_UI::check_memory_locking ()
{
#ifdef __APPLE__
/* OS X doesn't support mlockall(2), and so testing for memory locking capability there is pointless */
return;
#else // !__APPLE__
XMLNode* memory_warning_node = Config->instant_xml (X_("no-memory-warning"), get_user_ardour_path());
if (engine->is_realtime() && memory_warning_node == 0) {
struct rlimit limits;
int64_t ram;
long pages, page_size;
if ((page_size = sysconf (_SC_PAGESIZE)) < 0 ||(pages = sysconf (_SC_PHYS_PAGES)) < 0) {
ram = 0;
} else {
ram = (int64_t) pages * (int64_t) page_size;
}
if (getrlimit (RLIMIT_MEMLOCK, &limits)) {
return;
}
if (limits.rlim_cur != RLIM_INFINITY) {
MessageDialog msg (_("WARNING: Your system has a limit for maximum amount of locked memory. "
"This might cause Ardour to run out of memory before your system "
"runs out of memory. \n\n"
"You can view the memory limit with 'ulimit -l', "
"and it is normally controlled by /etc/security/limits.conf"));
msg.run ();
if (ram == 0 || ((double) limits.rlim_cur / ram) < 0.75) {
MessageDialog msg (_("WARNING: Your system has a limit for maximum amount of locked memory. "
"This might cause Ardour to run out of memory before your system "
"runs out of memory. \n\n"
"You can view the memory limit with 'ulimit -l', "
"and it is normally controlled by /etc/security/limits.conf"));
VBox* vbox = msg.get_vbox();
HBox hbox;
CheckButton cb (_("Do not show this window again"));
cb.signal_toggled().connect (mem_fun (*this, &ARDOUR_UI::no_memory_warning));
hbox.pack_start (cb, true, false);
vbox->pack_start (hbox);
hbox.show_all ();
editor->ensure_float (msg);
msg.run ();
}
}
}
#endif // !__APPLE__
}
void
ARDOUR_UI::finish()
{
@ -506,13 +619,6 @@ ARDOUR_UI::every_point_one_seconds ()
return TRUE;
}
gint
ARDOUR_UI::every_point_oh_five_seconds ()
{
MidRapidScreenUpdate(); /* EMIT_SIGNAL */
return true;
}
gint
ARDOUR_UI::every_point_zero_one_seconds ()
{
@ -536,11 +642,11 @@ ARDOUR_UI::update_sample_rate (nframes_t ignored)
nframes_t rate = engine->frame_rate();
if (fmod (rate, 1000.0) != 0.0) {
snprintf (buf, sizeof (buf), _("%.1f kHz / %4.1f msecs"),
snprintf (buf, sizeof (buf), _("%.1f kHz / %4.1f ms"),
(float) rate/1000.0f,
(engine->frames_per_cycle() / (float) rate) * 1000.0f);
} else {
snprintf (buf, sizeof (buf), _("%u kHz / %4.1f msecs"),
snprintf (buf, sizeof (buf), _("%u kHz / %4.1f ms"),
rate/1000,
(engine->frames_per_cycle() / (float) rate) * 1000.0f);
}
@ -553,7 +659,7 @@ void
ARDOUR_UI::update_cpu_load ()
{
char buf[32];
snprintf (buf, sizeof (buf), _("DSP: %.1f%%"), engine->get_cpu_load());
snprintf (buf, sizeof (buf), _("DSP: %5.1f%%"), engine->get_cpu_load());
cpu_load_label.set_text (buf);
}
@ -632,40 +738,6 @@ ARDOUR_UI::update_wall_clock ()
return TRUE;
}
void
ARDOUR_UI::control_methods_adjusted ()
{
int which_method;
which_method = (int) online_control_button->adjustment.get_value();
switch (which_method) {
case 0:
allow_mmc_and_local ();
break;
case 1:
allow_mmc_only ();
break;
case 2:
allow_local_only ();
break;
default:
fatal << _("programming error: impossible control method") << endmsg;
}
}
void
ARDOUR_UI::mmc_device_id_adjusted ()
{
#if 0
if (mmc) {
int dev_id = (int) mmc_id_button->adjustment.get_value();
mmc->set_device_id (dev_id);
}
#endif
}
gint
ARDOUR_UI::session_menu (GdkEventButton *ev)
@ -912,7 +984,8 @@ ARDOUR_UI::session_add_audio_route (bool track, int32_t input_channels, int32_t
if (how_many == 1) {
error << _("could not create a new audio track") << endmsg;
} else {
error << string_compose (_("could not create %1 new audio tracks"), how_many) << endmsg;
error << string_compose (_("could only create %1 of %2 new audio %3"),
tracks.size(), how_many, (track ? _("tracks") : _("busses"))) << endmsg;
}
}
@ -943,6 +1016,7 @@ ARDOUR_UI::session_add_audio_route (bool track, int32_t input_channels, int32_t
}
catch (...) {
cerr << "About to complain about JACK\n";
MessageDialog msg (*editor,
_("There are insufficient JACK ports available\n\
to create a new track or bus.\n\
@ -1090,11 +1164,11 @@ ARDOUR_UI::transport_roll ()
if (session->get_play_loop()) {
session->request_play_loop (false);
auto_loop_button.set_active (false);
roll_button.set_active (true);
auto_loop_button.set_visual_state (1);
roll_button.set_visual_state (1);
} else if (session->get_play_range ()) {
session->request_play_range (false);
play_selection_button.set_active (false);
play_selection_button.set_visual_state (0);
} else if (rolling) {
session->request_locate (session->last_transport_start(), true);
}
@ -1232,24 +1306,6 @@ ARDOUR_UI::map_transport_state ()
}
}
void
ARDOUR_UI::allow_local_only ()
{
}
void
ARDOUR_UI::allow_mmc_only ()
{
}
void
ARDOUR_UI::allow_mmc_and_local ()
{
}
void
ARDOUR_UI::GlobalClickBox::printer (char buf[32], Adjustment &adj, void *arg)
{
@ -1411,7 +1467,7 @@ ARDOUR_UI::_blink (void *arg)
void
ARDOUR_UI::blink ()
{
Blink (blink_on = !blink_on); /* EMIT_SIGNAL */
Blink (blink_on = !blink_on); /* EMIT_SIGNAL */
}
void
@ -1481,6 +1537,8 @@ ARDOUR_UI::name_io_setup (AudioEngine& engine,
}
}
/** Ask the user for the name of a new shapshot and then take it.
*/
void
ARDOUR_UI::snapshot_session ()
{
@ -1604,18 +1662,18 @@ ARDOUR_UI::transport_rec_enable_blink (bool onoff)
switch (session->record_status()) {
case Session::Enabled:
if (onoff) {
rec_button.set_state (1);
rec_button.set_visual_state (2);
} else {
rec_button.set_state (0);
rec_button.set_visual_state (0);
}
break;
case Session::Recording:
rec_button.set_state (2);
rec_button.set_visual_state (1);
break;
default:
rec_button.set_state (0);
rec_button.set_visual_state (0);
break;
}
}
@ -1628,12 +1686,6 @@ ARDOUR_UI::hide_and_quit (GdkEventAny *ev, ArdourDialog *window)
return TRUE;
}
void
ARDOUR_UI::start_keyboard_prefix ()
{
keyboard->start_prefix();
}
void
ARDOUR_UI::save_template ()
@ -1660,12 +1712,18 @@ ARDOUR_UI::save_template ()
}
}
void
bool
ARDOUR_UI::new_session (std::string predetermined_path)
{
string session_name;
string session_path;
if (!engine->connected()) {
MessageDialog msg (_("Ardour is not connected to JACK at this time. Creating new sessions is not possible."));
msg.run ();
return false;
}
int response = Gtk::RESPONSE_NONE;
new_session_dialog->set_modal(true);
@ -1676,6 +1734,13 @@ ARDOUR_UI::new_session (std::string predetermined_path)
do {
response = new_session_dialog->run ();
if (!engine->connected()) {
new_session_dialog->hide ();
MessageDialog msg (_("Ardour is not connected to JACK at this time. Creating new sessions is not possible."));
msg.run ();
return false;
}
_session_is_new = false;
if (response == Gtk::RESPONSE_CANCEL || response == Gtk::RESPONSE_DELETE_EVENT) {
@ -1684,7 +1749,7 @@ ARDOUR_UI::new_session (std::string predetermined_path)
quit();
}
new_session_dialog->hide ();
return;
return false;
} else if (response == Gtk::RESPONSE_NONE) {
@ -1835,15 +1900,20 @@ ARDOUR_UI::new_session (std::string predetermined_path)
uint32_t nphysin = (uint32_t) new_session_dialog->input_limit_count();
uint32_t nphysout = (uint32_t) new_session_dialog->output_limit_count();
build_session (session_path,
session_name,
cchns,
mchns,
iconnect,
oconnect,
nphysin,
nphysout,
engine->frame_rate() * 60 * 5);
if (build_session (session_path,
session_name,
cchns,
mchns,
iconnect,
oconnect,
nphysin,
nphysout,
engine->frame_rate() * 60 * 5)) {
response = Gtk::RESPONSE_NONE;
new_session_dialog->reset ();
continue;
}
}
}
}
@ -1854,6 +1924,7 @@ ARDOUR_UI::new_session (std::string predetermined_path)
show();
new_session_dialog->get_window()->set_cursor();
new_session_dialog->hide();
return true;
}
void
@ -1909,6 +1980,7 @@ ARDOUR_UI::load_session (const string & path, const string & snap_name, string*
session->set_clean ();
}
editor->edit_cursor_position (true);
return 0;
}
@ -1942,7 +2014,8 @@ ARDOUR_UI::build_session (const string & path, const string & snap_name,
catch (...) {
error << string_compose(_("Session \"%1 (snapshot %2)\" did not load successfully"), path, snap_name) << endmsg;
MessageDialog msg (string_compose(_("Could not create session in \"%1\""), path));
msg.run ();
return -1;
}
@ -2128,9 +2201,17 @@ After cleanup, unused audio files will be moved to a \
editor->prepare_for_cleanup ();
/* do not allow flush until a session is reloaded */
Glib::RefPtr<Action> act = ActionManager::get_action (X_("Main"), X_("FlushWastebasket"));
if (act) {
act->set_sensitive (false);
}
if (session->cleanup_sources (rep)) {
return;
}
checker.hide();
display_cleanup_results (rep,
_("cleaned files"),
@ -2142,6 +2223,9 @@ Flushing the wastebasket will \n\
release an additional\n\
%4 %5bytes of disk space.\n"
));
}
void
@ -2166,7 +2250,7 @@ releasing %4 %5bytes of disk space"));
}
void
ARDOUR_UI::add_route ()
ARDOUR_UI::add_route (Gtk::Window* float_window)
{
int count;
@ -2176,7 +2260,9 @@ ARDOUR_UI::add_route ()
if (add_route_dialog == 0) {
add_route_dialog = new AddRouteDialog;
editor->ensure_float (*add_route_dialog);
if (float_window) {
add_route_dialog->set_transient_for (*float_window);
}
}
if (add_route_dialog->is_visible()) {
@ -2283,18 +2369,18 @@ ARDOUR_UI::halt_on_xrun_message ()
void
ARDOUR_UI::disk_overrun_handler ()
{
ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::disk_underrun_handler));
ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::disk_overrun_handler));
if (!have_disk_overrun_displayed) {
have_disk_overrun_displayed = true;
MessageDialog msg (*editor, X_("diskrate dialog"), _("\
if (!have_disk_speed_dialog_displayed) {
have_disk_speed_dialog_displayed = true;
MessageDialog* msg = new MessageDialog (*editor, _("\
The disk system on your computer\n\
was not able to keep up with Ardour.\n\
\n\
Specifically, it failed to write data to disk\n\
quickly enough to keep up with recording.\n"));
msg.run ();
have_disk_overrun_displayed = false;
msg->signal_response().connect (bind (mem_fun (*this, &ARDOUR_UI::disk_speed_dialog_gone), msg));
msg->show_all ();
}
}
@ -2303,29 +2389,24 @@ ARDOUR_UI::disk_underrun_handler ()
{
ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::disk_underrun_handler));
if (!have_disk_underrun_displayed) {
have_disk_underrun_displayed = true;
MessageDialog msg (*editor,
(_("The disk system on your computer\n\
if (!have_disk_speed_dialog_displayed) {
have_disk_speed_dialog_displayed = true;
MessageDialog* msg = new MessageDialog (*editor,
_("The disk system on your computer\n\
was not able to keep up with Ardour.\n\
\n\
Specifically, it failed to read data from disk\n\
quickly enough to keep up with playback.\n")));
msg.run ();
have_disk_underrun_displayed = false;
quickly enough to keep up with playback.\n"));
msg->signal_response().connect (bind (mem_fun (*this, &ARDOUR_UI::disk_speed_dialog_gone), msg));
msg->show_all ();
}
}
void
ARDOUR_UI::disk_underrun_message_gone ()
ARDOUR_UI::disk_speed_dialog_gone (int ignored_response, MessageDialog* msg)
{
have_disk_underrun_displayed = false;
}
void
ARDOUR_UI::disk_overrun_message_gone ()
{
have_disk_underrun_displayed = false;
have_disk_speed_dialog_displayed = false;
delete msg;
}
int
@ -2449,6 +2530,11 @@ ARDOUR_UI::use_config ()
Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
ract->set_active ();
}
XMLNode* node = Config->extra_xml (X_("TransportControllables"));
if (node) {
set_transport_controllable_state (*node);
}
}
void
@ -2499,6 +2585,9 @@ ARDOUR_UI::save_keybindings ()
bool
ARDOUR_UI::first_idle ()
{
if (session) {
session->allow_auto_play (true);
}
can_save_keybindings = true;
return false;
}
@ -2518,3 +2607,115 @@ ARDOUR_UI::store_clock_modes ()
ARDOUR_UI::TransportControllable::TransportControllable (std::string name, ARDOUR_UI& u, ToggleType tp)
: Controllable (name), ui (u), type(tp)
{
}
void
ARDOUR_UI::TransportControllable::set_value (float val)
{
if (type == ShuttleControl) {
double fract;
if (val == 0.5f) {
fract = 0.0;
} else {
if (val < 0.5f) {
fract = -((0.5f - val)/0.5f);
} else {
fract = ((val - 0.5f)/0.5f);
}
}
ui.set_shuttle_fract (fract);
return;
}
if (val < 0.5f) {
/* do nothing: these are radio-style actions */
return;
}
char *action = 0;
switch (type) {
case Roll:
action = X_("Roll");
break;
case Stop:
action = X_("Stop");
break;
case GotoStart:
action = X_("Goto Start");
break;
case GotoEnd:
action = X_("Goto End");
break;
case AutoLoop:
action = X_("Loop");
break;
case PlaySelection:
action = X_("Play Selection");
break;
case RecordEnable:
action = X_("Record");
break;
default:
break;
}
if (action == 0) {
return;
}
Glib::RefPtr<Action> act = ActionManager::get_action ("Transport", action);
if (act) {
act->activate ();
}
}
float
ARDOUR_UI::TransportControllable::get_value (void) const
{
float val = 0.0f;
switch (type) {
case Roll:
break;
case Stop:
break;
case GotoStart:
break;
case GotoEnd:
break;
case AutoLoop:
break;
case PlaySelection:
break;
case RecordEnable:
break;
case ShuttleControl:
break;
default:
break;
}
return val;
}
void
ARDOUR_UI::TransportControllable::set_id (const string& str)
{
_id = str;
}
void
ARDOUR_UI::setup_profile ()
{
if (gdk_screen_width() < 1200) {
Profile->set_small_screen ();
}
}

View file

@ -15,7 +15,6 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
$Id$
*/
#ifndef __ardour_gui_h__
@ -55,6 +54,7 @@
#include <gtkmm2ext/gtk_ui.h>
#include <gtkmm2ext/click_box.h>
#include <gtkmm2ext/stateful_button.h>
#include <gtkmm2ext/bindable_button.h>
#include <ardour/ardour.h>
#include <ardour/session.h>
@ -65,7 +65,6 @@
class AudioClock;
class PublicEditor;
class Keyboard;
class MeterBridge;
class OptionEditor;
class Mixer_UI;
class ConnectionEditor;
@ -128,7 +127,7 @@ class ARDOUR_UI : public Gtkmm2ext::UI
_will_create_new_session_automatically = yn;
}
void new_session(std::string path = string());
bool new_session(std::string path = string());
gint cmdline_new_session (string path);
int unload_session ();
void close_session();
@ -156,7 +155,6 @@ class ARDOUR_UI : public Gtkmm2ext::UI
static sigc::signal<void,bool> Blink;
static sigc::signal<void> RapidScreenUpdate;
static sigc::signal<void> MidRapidScreenUpdate;
static sigc::signal<void> SuperRapidScreenUpdate;
static sigc::signal<void,nframes_t> Clock;
@ -188,7 +186,7 @@ class ARDOUR_UI : public Gtkmm2ext::UI
void store_clock_modes ();
void restore_clock_modes ();
void add_route ();
void add_route (Gtk::Window* float_window);
void session_add_audio_track (int input_channels, int32_t output_channels, ARDOUR::TrackMode mode, uint32_t how_many) {
session_add_audio_route (true, input_channels, output_channels, mode, how_many);
@ -214,6 +212,8 @@ class ARDOUR_UI : public Gtkmm2ext::UI
void set_keybindings_path (std::string path);
void save_keybindings ();
void setup_profile ();
protected:
friend class PublicEditor;
@ -272,9 +272,6 @@ class ARDOUR_UI : public Gtkmm2ext::UI
GlobalClickBox *crossfade_time_button;
vector<string> crossfade_time_strings;
GlobalClickBox *mmc_id_button;
vector<string> mmc_id_strings;
Gtk::ToggleButton preroll_button;
Gtk::ToggleButton postroll_button;
@ -284,7 +281,6 @@ class ARDOUR_UI : public Gtkmm2ext::UI
int setup_windows ();
void setup_transport ();
void setup_clock ();
void setup_adjustables ();
static ARDOUR_UI *theArdourUI;
@ -312,9 +308,6 @@ class ARDOUR_UI : public Gtkmm2ext::UI
void start_blinking ();
void stop_blinking ();
void control_methods_adjusted ();
void mmc_device_id_adjusted ();
void about_signal_response(int response);
private:
@ -355,18 +348,51 @@ class ARDOUR_UI : public Gtkmm2ext::UI
Gtk::HBox primary_clock_hbox;
Gtk::HBox secondary_clock_hbox;
Gtkmm2ext::StatefulButton roll_button;
Gtkmm2ext::StatefulButton stop_button;
Gtkmm2ext::StatefulButton rewind_button;
Gtkmm2ext::StatefulButton forward_button;
Gtkmm2ext::StatefulButton goto_start_button;
Gtkmm2ext::StatefulButton goto_end_button;
Gtkmm2ext::StatefulButton auto_loop_button;
Gtkmm2ext::StatefulButton play_selection_button;
Gtkmm2ext::StatefulButton rec_button;
struct TransportControllable : public PBD::Controllable {
enum ToggleType {
Roll = 0,
Stop,
RecordEnable,
GotoStart,
GotoEnd,
AutoLoop,
PlaySelection,
ShuttleControl
};
TransportControllable (std::string name, ARDOUR_UI&, ToggleType);
void set_value (float);
float get_value (void) const;
void set_id (const std::string&);
ARDOUR_UI& ui;
ToggleType type;
};
TransportControllable roll_controllable;
TransportControllable stop_controllable;
TransportControllable goto_start_controllable;
TransportControllable goto_end_controllable;
TransportControllable auto_loop_controllable;
TransportControllable play_selection_controllable;
TransportControllable rec_controllable;
TransportControllable shuttle_controllable;
BindingProxy shuttle_controller_binding_proxy;
void set_transport_controllable_state (const XMLNode&);
XMLNode& get_transport_controllable_state ();
BindableButton roll_button;
BindableButton stop_button;
BindableButton goto_start_button;
BindableButton goto_end_button;
BindableButton auto_loop_button;
BindableButton play_selection_button;
BindableButton rec_button;
Gtk::ToggleButton time_master_button;
Gtk::ComboBoxText sync_option_combo;
void sync_option_changed ();
@ -398,16 +424,19 @@ class ARDOUR_UI : public Gtkmm2ext::UI
gint shuttle_box_expose (GdkEventExpose*);
gint mouse_shuttle (double x, bool force);
void use_shuttle_fract (bool force);
void set_shuttle_fract (double);
bool shuttle_grabbed;
double shuttle_fract;
Gtk::ToggleButton punch_in_button;
Gtk::ToggleButton punch_out_button;
Gtk::ToggleButton auto_return_button;
Gtk::ToggleButton auto_play_button;
Gtk::ToggleButton auto_input_button;
Gtk::ToggleButton click_button;
Gtkmm2ext::StatefulToggleButton punch_in_button;
Gtkmm2ext::StatefulToggleButton punch_out_button;
Gtkmm2ext::StatefulToggleButton auto_return_button;
Gtkmm2ext::StatefulToggleButton auto_play_button;
Gtkmm2ext::StatefulToggleButton auto_input_button;
Gtkmm2ext::StatefulToggleButton click_button;
Gtkmm2ext::StatefulToggleButton time_master_button;
Gtk::ToggleButton auditioning_alert_button;
Gtk::ToggleButton solo_alert_button;
@ -430,14 +459,6 @@ class ARDOUR_UI : public Gtkmm2ext::UI
void transport_rec_enable_blink (bool onoff);
/* These change where we accept control from:
MMC, X (local) or both.
*/
void allow_mmc_only ();
void allow_mmc_and_local ();
void allow_local_only ();
Gtk::Menu* session_popup_menu;
struct RecentSessionModelColumns : public Gtk::TreeModel::ColumnRecord {
@ -497,7 +518,6 @@ class ARDOUR_UI : public Gtkmm2ext::UI
gint every_second ();
gint every_point_one_seconds ();
gint every_point_oh_five_seconds ();
gint every_point_zero_one_seconds ();
sigc::connection second_connection;
@ -585,7 +605,6 @@ class ARDOUR_UI : public Gtkmm2ext::UI
/* Keymap handling */
void install_actions ();
void start_keyboard_prefix();
void toggle_record_enable (uint32_t);
@ -609,11 +628,8 @@ class ARDOUR_UI : public Gtkmm2ext::UI
struct timeval last_peak_grab;
struct timeval last_shuttle_request;
bool have_disk_overrun_displayed;
bool have_disk_underrun_displayed;
void disk_overrun_message_gone ();
void disk_underrun_message_gone ();
bool have_disk_speed_dialog_displayed;
void disk_speed_dialog_gone (int ignored_response, Gtk::MessageDialog*);
void disk_overrun_handler ();
void disk_underrun_handler ();
@ -639,13 +655,15 @@ class ARDOUR_UI : public Gtkmm2ext::UI
void toggle_send_midi_feedback ();
void toggle_use_mmc ();
void toggle_send_mmc ();
void toggle_use_midi_control();
void toggle_send_mtc ();
void toggle_use_osc ();
void set_input_auto_connect (ARDOUR::AutoConnectOption);
void set_output_auto_connect (ARDOUR::AutoConnectOption);
void set_solo_model (ARDOUR::SoloModel);
void set_monitor_model (ARDOUR::MonitorModel);
void set_remote_model (ARDOUR::RemoteModel);
void toggle_StopPluginsWithTransport();
void toggle_DoNotRunPluginsWhileRecording();
@ -654,12 +672,14 @@ class ARDOUR_UI : public Gtkmm2ext::UI
void toggle_StopTransportAtEndOfSession();
void toggle_GainReduceFastTransport();
void toggle_LatchedSolo();
void toggle_ShowSoloMutes();
void toggle_LatchedRecordEnable ();
void toggle_RegionEquivalentsOverlap ();
void mtc_port_changed ();
void map_solo_model ();
void map_monitor_model ();
void map_remote_model ();
void map_file_header_format ();
void map_file_data_format ();
void map_input_auto_connect ();
@ -676,6 +696,9 @@ class ARDOUR_UI : public Gtkmm2ext::UI
bool can_save_keybindings;
bool first_idle ();
void no_memory_warning ();
void check_memory_locking ();
};
#endif /* __ardour_gui_h__ */

View file

@ -15,7 +15,6 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
$Id$
*/
#include <fcntl.h>
@ -35,13 +34,16 @@
#include <ardour/audioengine.h>
#include <ardour/ardour.h>
#include <ardour/profile.h>
#include <ardour/route.h>
#include "ardour_ui.h"
#include "keyboard.h"
#include "public_editor.h"
#include "audio_clock.h"
#include "actions.h"
#include "utils.h"
#include "color_manager.h"
#include "i18n.h"
@ -72,9 +74,10 @@ ARDOUR_UI::setup_windows ()
setup_clock ();
setup_transport();
setup_adjustables ();
build_menu_bar ();
color_manager->signal_unmap().connect (bind (sigc::ptr_fun(&ActionManager::uncheck_toggleaction), X_("<Actions>/Common/ToggleColorManager")));
top_packer.pack_start (menu_bar_base, false, false);
top_packer.pack_start (transport_frame, false, false);
@ -83,46 +86,14 @@ ARDOUR_UI::setup_windows ()
return 0;
}
void
ARDOUR_UI::setup_adjustables ()
{
adjuster_table.set_homogeneous (true);
online_control_strings.push_back (_("MMC + Local"));
online_control_strings.push_back (_("MMC"));
online_control_strings.push_back (_("Local"));
online_control_button = new GlobalClickBox ("CONTROL",
online_control_strings);
online_control_button->adjustment.signal_value_changed().connect(mem_fun(*this,&ARDOUR_UI::control_methods_adjusted));
mmc_id_strings.push_back ("1");
mmc_id_strings.push_back ("2");
mmc_id_strings.push_back ("3");
mmc_id_strings.push_back ("4");
mmc_id_strings.push_back ("5");
mmc_id_strings.push_back ("6");
mmc_id_strings.push_back ("7");
mmc_id_strings.push_back ("8");
mmc_id_strings.push_back ("9");
mmc_id_button = new GlobalClickBox (_("MMC ID"), mmc_id_strings);
mmc_id_button->adjustment.signal_value_changed().connect (mem_fun(*this,&ARDOUR_UI::mmc_device_id_adjusted));
adjuster_table.attach (*online_control_button, 0, 2, 1, 2, FILL|EXPAND, FILL, 5, 5);
adjuster_table.attach (*mmc_id_button, 2, 3, 1, 2, FILL, FILL, 5, 5);
}
void
ARDOUR_UI::transport_stopped ()
{
stop_button.set_active (true);
stop_button.set_visual_state (1);
roll_button.set_active (false);
play_selection_button.set_active (false);
auto_loop_button.set_active (false);
roll_button.set_visual_state (0);
play_selection_button.set_visual_state (0);
auto_loop_button.set_visual_state (0);
shuttle_fract = 0;
shuttle_box.queue_draw ();
@ -133,22 +104,22 @@ ARDOUR_UI::transport_stopped ()
void
ARDOUR_UI::transport_rolling ()
{
stop_button.set_active (false);
stop_button.set_visual_state (0);
if (session->get_play_range()) {
play_selection_button.set_active (true);
roll_button.set_active (false);
auto_loop_button.set_active (false);
play_selection_button.set_visual_state (1);
roll_button.set_visual_state (0);
auto_loop_button.set_visual_state (0);
} else if (session->get_play_loop ()) {
auto_loop_button.set_active (true);
play_selection_button.set_active (false);
roll_button.set_active (false);
auto_loop_button.set_visual_state (1);
play_selection_button.set_visual_state (0);
roll_button.set_visual_state (0);
} else {
roll_button.set_active (true);
play_selection_button.set_active (false);
auto_loop_button.set_active (false);
roll_button.set_visual_state (1);
play_selection_button.set_visual_state (0);
auto_loop_button.set_visual_state (0);
}
/* reset shuttle controller */
@ -160,19 +131,19 @@ ARDOUR_UI::transport_rolling ()
void
ARDOUR_UI::transport_rewinding ()
{
stop_button.set_active(false);
roll_button.set_active (true);
play_selection_button.set_active (false);
auto_loop_button.set_active (false);
stop_button.set_visual_state (0);
roll_button.set_visual_state (1);
play_selection_button.set_visual_state (0);
auto_loop_button.set_visual_state (0);
}
void
ARDOUR_UI::transport_forwarding ()
{
stop_button.set_active (false);
roll_button.set_active (true);
play_selection_button.set_active (false);
auto_loop_button.set_active (false);
stop_button.set_visual_state (0);
roll_button.set_visual_state (1);
play_selection_button.set_visual_state (0);
auto_loop_button.set_visual_state (0);
}
void
@ -207,6 +178,7 @@ ARDOUR_UI::setup_transport ()
play_selection_button.set_name ("TransportButton");
rec_button.set_name ("TransportRecButton");
auto_loop_button.set_name ("TransportButton");
auto_return_button.set_name ("TransportButton");
auto_play_button.set_name ("TransportButton");
auto_input_button.set_name ("TransportButton");
@ -215,30 +187,6 @@ ARDOUR_UI::setup_transport ()
click_button.set_name ("TransportButton");
time_master_button.set_name ("TransportButton");
vector<Gdk::Color> colors;
Gdk::Color c;
/* record button has 3 color states, so we set 2 extra here */
set_color(c, rgba_from_style ("TransportRecButton", 0xff, 0, 0, 0, "bg", Gtk::STATE_PRELIGHT, false ));
colors.push_back (c);
set_color(c, rgba_from_style ("TransportRecButton", 0xff, 0, 0, 0, "bg", Gtk::STATE_ACTIVE, false ));
colors.push_back (c);
rec_button.set_colors (colors);
colors.clear ();
/* other buttons get 2 color states, so add one here */
set_color(c, rgba_from_style ("TransportButton", 0x7f, 0xff, 0x7f, 0, "bg", Gtk::STATE_ACTIVE, false ));
colors.push_back (c);
stop_button.set_colors (colors);
roll_button.set_colors (colors);
auto_loop_button.set_colors (colors);
play_selection_button.set_colors (colors);
goto_start_button.set_colors (colors);
goto_end_button.set_colors (colors);
stop_button.set_size_request(29, -1);
roll_button.set_size_request(29, -1);
auto_loop_button.set_size_request(29, -1);
@ -249,7 +197,7 @@ ARDOUR_UI::setup_transport ()
Widget* w;
stop_button.set_active (true);
stop_button.set_visual_state (1);
w = manage (new Image (get_icon (X_("transport_start"))));
w->show();
@ -298,6 +246,7 @@ ARDOUR_UI::setup_transport ()
ARDOUR_UI::instance()->tooltips().set_tip (goto_start_button, _("Go to start of session"));
ARDOUR_UI::instance()->tooltips().set_tip (goto_end_button, _("Go to end of session"));
ARDOUR_UI::instance()->tooltips().set_tip (auto_loop_button, _("Play loop range"));
ARDOUR_UI::instance()->tooltips().set_tip (auto_return_button, _("Return to last playback start when stopped"));
ARDOUR_UI::instance()->tooltips().set_tip (auto_play_button, _("Start playback after any locate"));
ARDOUR_UI::instance()->tooltips().set_tip (auto_input_button, _("Be sensible about input monitoring"));
@ -338,12 +287,7 @@ ARDOUR_UI::setup_transport ()
ActionManager::get_action ("Transport", "TogglePunchIn")->connect_proxy (punch_in_button);
ActionManager::get_action ("Transport", "TogglePunchOut")->connect_proxy (punch_out_button);
preroll_button.unset_flags (CAN_FOCUS);
preroll_button.set_events (preroll_button.get_events() & ~(Gdk::ENTER_NOTIFY_MASK|Gdk::LEAVE_NOTIFY_MASK));
preroll_button.set_name ("TransportButton");
postroll_button.unset_flags (CAN_FOCUS);
postroll_button.set_events (postroll_button.get_events() & ~(Gdk::ENTER_NOTIFY_MASK|Gdk::LEAVE_NOTIFY_MASK));
postroll_button.set_name ("TransportButton");
preroll_clock.set_mode (AudioClock::MinSec);
@ -421,7 +365,9 @@ ARDOUR_UI::setup_transport ()
HBox* clock_box = manage (new HBox);
clock_box->pack_start (primary_clock, false, false);
clock_box->pack_start (secondary_clock, false, false);
if (!ARDOUR::Profile->get_small_screen()) {
clock_box->pack_start (secondary_clock, false, false);
}
VBox* time_controls_box = manage (new VBox);
time_controls_box->pack_start (sync_option_combo, false, false);
time_controls_box->pack_start (time_master_button, false, false);
@ -622,6 +568,10 @@ ARDOUR_UI::shuttle_box_button_press (GdkEventButton* ev)
return true;
}
if (shuttle_controller_binding_proxy.button_press_handler (ev)) {
return true;
}
if (Keyboard::is_context_menu_event (ev)) {
show_shuttle_context_menu ();
return true;
@ -656,11 +606,11 @@ ARDOUR_UI::shuttle_box_button_release (GdkEventButton* ev)
shuttle_grabbed = false;
shuttle_box.remove_modal_grab ();
if (Config->get_shuttle_behaviour() == Sprung) {
if (Config->get_auto_play() || roll_button.get_state()) {
if (Config->get_auto_play() || roll_button.get_visual_state()) {
shuttle_fract = SHUTTLE_FRACT_SPEED1;
session->request_transport_speed (1.0);
stop_button.set_active (false);
roll_button.set_active (true);
stop_button.set_visual_state (0);
roll_button.set_visual_state (1);
} else {
shuttle_fract = 0;
session->request_transport_speed (0.0);
@ -673,8 +623,8 @@ ARDOUR_UI::shuttle_box_button_release (GdkEventButton* ev)
if (session->transport_rolling()) {
shuttle_fract = SHUTTLE_FRACT_SPEED1;
session->request_transport_speed (1.0);
stop_button.set_active (false);
roll_button.set_active (true);
stop_button.set_visual_state (0);
roll_button.set_visual_state (1);
} else {
shuttle_fract = 0;
}
@ -682,14 +632,9 @@ ARDOUR_UI::shuttle_box_button_release (GdkEventButton* ev)
return true;
case 3:
default:
return true;
case 4:
shuttle_fract += 0.005;
break;
case 5:
shuttle_fract -= 0.005;
break;
}
use_shuttle_fract (true);
@ -749,6 +694,13 @@ ARDOUR_UI::mouse_shuttle (double x, bool force)
return true;
}
void
ARDOUR_UI::set_shuttle_fract (double f)
{
shuttle_fract = f;
use_shuttle_fract (false);
}
void
ARDOUR_UI::use_shuttle_fract (bool force)
{

View file

@ -15,7 +15,6 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
$Id$
*/
/* this file exists solely to break compilation dependencies that

View file

@ -62,6 +62,20 @@ ARDOUR_UI::connect_to_session (Session *s)
ActionManager::set_sensitive (ActionManager::range_sensitive_actions, false);
}
if (!session->control_out()) {
Glib::RefPtr<Action> act = ActionManager::get_action (X_("options"), X_("SoloViaBus"));
if (act) {
act->set_sensitive (false);
}
}
/* allow wastebasket flush again */
Glib::RefPtr<Action> act = ActionManager::get_action (X_("Main"), X_("FlushWastebasket"));
if (act) {
act->set_sensitive (true);
}
/* there are never any selections on startup */
ActionManager::set_sensitive (ActionManager::region_selection_sensitive_actions, false);
@ -132,6 +146,8 @@ ARDOUR_UI::connect_to_session (Session *s)
AudioClock::ModeChanged.connect (mem_fun (*this, &ARDOUR_UI::store_clock_modes));
Glib::signal_idle().connect (mem_fun (*this, &ARDOUR_UI::first_idle));
start_clocking ();
start_blinking ();
@ -139,7 +155,6 @@ ARDOUR_UI::connect_to_session (Session *s)
second_connection = Glib::signal_timeout().connect (mem_fun(*this, &ARDOUR_UI::every_second), 1000);
point_one_second_connection = Glib::signal_timeout().connect (mem_fun(*this, &ARDOUR_UI::every_point_one_seconds), 100);
// point_oh_five_second_connection = Glib::signal_timeout().connect (mem_fun(*this, &ARDOUR_UI::every_point_oh_five_seconds), 50);
point_zero_one_second_connection = Glib::signal_timeout().connect (mem_fun(*this, &ARDOUR_UI::every_point_zero_one_seconds), 40);
}
@ -324,7 +339,7 @@ int
ARDOUR_UI::create_route_params ()
{
if (route_params == 0) {
route_params = new RouteParams_UI (*engine);
route_params = new RouteParams_UI ();
route_params->set_session (session);
route_params->signal_unmap().connect (sigc::bind(sigc::ptr_fun(&ActionManager::uncheck_toggleaction), X_("<Actions>/Common/ToggleInspector")));
}

View file

@ -15,7 +15,6 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
$Id$
*/
/* This file contains any ARDOUR_UI methods that require knowledge of
@ -26,7 +25,10 @@
#include <pbd/pathscanner.h>
#include <glibmm/miscutils.h>
#include <gtkmm2ext/utils.h>
#include <gtkmm2ext/window_title.h>
#include "ardour_ui.h"
#include "public_editor.h"
@ -35,6 +37,7 @@
#include "actions.h"
#include <ardour/session.h>
#include <ardour/profile.h>
#include <ardour/audioengine.h>
#include <ardour/control_protocol_manager.h>
@ -55,7 +58,7 @@ ARDOUR_UI::create_editor ()
{
try {
editor = new Editor (*engine);
editor = new Editor ();
}
catch (failed_constructor& err) {
@ -93,14 +96,15 @@ ARDOUR_UI::install_actions ()
/* the real actions */
act = ActionManager::register_action (main_actions, X_("New"), _("New"), bind (mem_fun(*this, &ARDOUR_UI::new_session), string ()));
act = ActionManager::register_action (main_actions, X_("New"), _("New"), hide_return (bind (mem_fun(*this, &ARDOUR_UI::new_session), string ())));
ActionManager::register_action (main_actions, X_("Open"), _("Open"), mem_fun(*this, &ARDOUR_UI::open_session));
ActionManager::register_action (main_actions, X_("Recent"), _("Recent"), mem_fun(*this, &ARDOUR_UI::open_recent_session));
act = ActionManager::register_action (main_actions, X_("Close"), _("Close"), mem_fun(*this, &ARDOUR_UI::close_session));
ActionManager::session_sensitive_actions.push_back (act);
act = ActionManager::register_action (main_actions, X_("AddTrackBus"), _("Add Track/Bus"), mem_fun(*this, &ARDOUR_UI::add_route));
act = ActionManager::register_action (main_actions, X_("AddTrackBus"), _("Add Track/Bus"),
bind (mem_fun(*this, &ARDOUR_UI::add_route), (Gtk::Window*) 0));
ActionManager::session_sensitive_actions.push_back (act);
@ -181,7 +185,6 @@ ARDOUR_UI::install_actions ()
common_actions = ActionGroup::create (X_("Common"));
ActionManager::register_action (main_actions, X_("Windows"), _("Windows"));
ActionManager::register_action (common_actions, X_("Start-Prefix"), _("start prefix"), mem_fun(*this, &ARDOUR_UI::start_keyboard_prefix));
ActionManager::register_action (common_actions, X_("Quit"), _("Quit"), (mem_fun(*this, &ARDOUR_UI::finish)));
/* windows visibility actions */
@ -391,8 +394,11 @@ ARDOUR_UI::install_actions ()
ActionManager::session_sensitive_actions.push_back (act);
act = ActionManager::register_toggle_action (option_actions, X_("SendMIDIfeedback"), _("Send MIDI feedback"), mem_fun (*this, &ARDOUR_UI::toggle_send_midi_feedback));
ActionManager::session_sensitive_actions.push_back (act);
act = ActionManager::register_toggle_action (option_actions, X_("UseMIDIcontrol"), _("Use MIDI control"), mem_fun (*this, &ARDOUR_UI::toggle_use_midi_control));
ActionManager::session_sensitive_actions.push_back (act);
act = ActionManager::register_toggle_action (option_actions, X_("UseOSC"), _("Use OSC"), mem_fun (*this, &ARDOUR_UI::toggle_use_osc));
#ifndef HAVE_LIBLO
act->set_sensitive (false);
#endif
ActionManager::register_toggle_action (option_actions, X_("StopPluginsWithTransport"), _("Stop plugins with transport"), mem_fun (*this, &ARDOUR_UI::toggle_StopPluginsWithTransport));
ActionManager::register_toggle_action (option_actions, X_("VerifyRemoveLastCapture"), _("Verify remove last capture"), mem_fun (*this, &ARDOUR_UI::toggle_VerifyRemoveLastCapture));
@ -407,6 +413,8 @@ ARDOUR_UI::install_actions ()
act = ActionManager::register_toggle_action (option_actions, X_("LatchedSolo"), _("Latched solo"), mem_fun (*this, &ARDOUR_UI::toggle_LatchedSolo));
ActionManager::session_sensitive_actions.push_back (act);
act = ActionManager::register_toggle_action (option_actions, X_("ShowSoloMutes"), _("Show solo muting"), mem_fun (*this, &ARDOUR_UI::toggle_ShowSoloMutes));
ActionManager::session_sensitive_actions.push_back (act);
/* !!! REMEMBER THAT RADIO ACTIONS HAVE TO BE HANDLED WITH MORE FINESSE THAN SIMPLE TOGGLES !!! */
@ -469,6 +477,15 @@ ARDOUR_UI::install_actions ()
act = ActionManager::register_radio_action (option_actions, output_auto_connect_group, X_("OutputAutoConnectManual"), _("Manually connect outputs"), hide_return (bind (mem_fun (*this, &ARDOUR_UI::set_output_auto_connect), (AutoConnectOption) 0)));
ActionManager::session_sensitive_actions.push_back (act);
RadioAction::Group remote_group;
act = ActionManager::register_radio_action (option_actions, remote_group, X_("RemoteUserDefined"), _("Remote ID assigned by User"), hide_return (bind (mem_fun (*this, &ARDOUR_UI::set_remote_model), UserOrdered)));
ActionManager::session_sensitive_actions.push_back (act);
act = ActionManager::register_radio_action (option_actions, remote_group, X_("RemoteMixerDefined"), _("Remote ID follows order of Mixer"), hide_return (bind (mem_fun (*this, &ARDOUR_UI::set_remote_model), MixerOrdered)));
ActionManager::session_sensitive_actions.push_back (act);
act = ActionManager::register_radio_action (option_actions, remote_group, X_("RemoteEditorDefined"), _("Remote ID follows order of Editor"), hide_return (bind (mem_fun (*this, &ARDOUR_UI::set_remote_model), EditorOrdered)));
ActionManager::session_sensitive_actions.push_back (act);
ActionManager::add_action_group (shuttle_actions);
ActionManager::add_action_group (option_actions);
ActionManager::add_action_group (jack_actions);
@ -680,11 +697,13 @@ ARDOUR_UI::build_menu_bar ()
sample_rate_label.set_name ("SampleRate");
menu_hbox.pack_start (*menu_bar, true, true);
menu_hbox.pack_end (wall_clock_box, false, false, 10);
menu_hbox.pack_end (disk_space_box, false, false, 10);
menu_hbox.pack_end (cpu_load_box, false, false, 10);
menu_hbox.pack_end (buffer_load_box, false, false, 10);
menu_hbox.pack_end (sample_rate_box, false, false, 10);
if (!Profile->get_small_screen()) {
menu_hbox.pack_end (wall_clock_box, false, false, 2);
menu_hbox.pack_end (disk_space_box, false, false, 4);
}
menu_hbox.pack_end (cpu_load_box, false, false, 4);
menu_hbox.pack_end (buffer_load_box, false, false, 4);
menu_hbox.pack_end (sample_rate_box, false, false, 4);
menu_bar_base.set_name ("MainMenuBar");
menu_bar_base.add (menu_hbox);
@ -699,7 +718,10 @@ ARDOUR_UI::setup_clock ()
big_clock_window->set_border_width (0);
big_clock_window->add (big_clock);
big_clock_window->set_title (_("ardour: clock"));
WindowTitle title(Glib::get_application_name());
title += _("Clock");
big_clock_window->set_title (title.get_string());
big_clock_window->set_type_hint (Gdk::WINDOW_TYPE_HINT_MENU);
big_clock_window->signal_realize().connect (bind (sigc::ptr_fun (set_decoration), big_clock_window, (Gdk::DECOR_BORDER|Gdk::DECOR_RESIZEH)));
big_clock_window->signal_unmap().connect (bind (sigc::ptr_fun(&ActionManager::uncheck_toggleaction), X_("<Actions>/Common/ToggleBigClock")));

View file

@ -15,7 +15,6 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
$Id$
*/
/* This file contains any ARDOUR_UI methods that require knowledge of
@ -35,7 +34,7 @@ ARDOUR_UI::create_mixer ()
{
try {
mixer = new Mixer_UI (*engine);
mixer = new Mixer_UI ();
}
catch (failed_constructor& err) {
@ -44,3 +43,4 @@ ARDOUR_UI::create_mixer ()
return 0;
}

View file

@ -15,7 +15,6 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
$Id$
*/
#include <pbd/convert.h>
@ -25,6 +24,7 @@
#include <ardour/configuration.h>
#include <ardour/session.h>
#include <ardour/osc.h>
#include <ardour/audioengine.h>
#include "ardour_ui.h"
@ -64,9 +64,9 @@ ARDOUR_UI::toggle_use_mmc ()
}
void
ARDOUR_UI::toggle_use_midi_control ()
ARDOUR_UI::toggle_use_osc ()
{
ActionManager::toggle_config_state ("options", "UseMIDIcontrol", &Configuration::set_midi_control, &Configuration::get_midi_control);
ActionManager::toggle_config_state ("options", "UseOSC", &Configuration::set_use_osc, &Configuration::get_use_osc);
}
void
@ -78,7 +78,7 @@ ARDOUR_UI::toggle_send_midi_feedback ()
void
ARDOUR_UI::set_native_file_header_format (HeaderFormat hf)
{
const char *action;
const char *action = 0;
switch (hf) {
case BWF:
@ -120,7 +120,7 @@ ARDOUR_UI::set_native_file_header_format (HeaderFormat hf)
void
ARDOUR_UI::set_native_file_data_format (SampleFormat sf)
{
const char* action;
const char* action = 0;
switch (sf) {
case FormatFloat:
@ -225,6 +225,39 @@ ARDOUR_UI::set_solo_model (SoloModel model)
}
void
ARDOUR_UI::set_remote_model (RemoteModel model)
{
const char* action = 0;
switch (model) {
case UserOrdered:
action = X_("RemoteUserDefined");
break;
case MixerOrdered:
action = X_("RemoteMixerDefined");
break;
case EditorOrdered:
action = X_("RemoteEditorDefined");
break;
default:
fatal << string_compose (_("programming error: unknown remote model in ARDOUR_UI::set_remote_model: %1"), model) << endmsg;
/*NOTREACHED*/
}
Glib::RefPtr<Action> act = ActionManager::get_action ("options", action);
if (act) {
Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
if (ract && ract->get_active() && Config->get_remote_model() != model) {
Config->set_remote_model (model);
}
}
}
void
ARDOUR_UI::set_monitor_model (MonitorModel model)
{
@ -389,6 +422,12 @@ ARDOUR_UI::toggle_LatchedSolo()
ActionManager::toggle_config_state ("options", "LatchedSolo", &Configuration::set_solo_latched, &Configuration::get_solo_latched);
}
void
ARDOUR_UI::toggle_ShowSoloMutes()
{
ActionManager::toggle_config_state ("options", "ShowSoloMutes", &Configuration::set_show_solo_mutes, &Configuration::get_show_solo_mutes);
}
void
ARDOUR_UI::mtc_port_changed ()
{
@ -471,6 +510,33 @@ ARDOUR_UI::map_monitor_model ()
}
}
void
ARDOUR_UI::map_remote_model ()
{
const char* on = 0;
switch (Config->get_remote_model()) {
case UserOrdered:
on = X_("RemoteUserDefined");
break;
case MixerOrdered:
on = X_("RemoteMixerDefined");
break;
case EditorOrdered:
on = X_("RemoteEditorDefined");
break;
}
Glib::RefPtr<Action> act = ActionManager::get_action ("options", on);
if (act) {
Glib::RefPtr<ToggleAction> tact = Glib::RefPtr<ToggleAction>::cast_dynamic(act);
if (tact && !tact->get_active()) {
tact->set_active (true);
}
}
}
void
ARDOUR_UI::map_file_header_format ()
{
@ -758,6 +824,19 @@ ARDOUR_UI::parameter_changed (const char* parameter_name)
sync_option_combo.set_active_text (slave_source_to_string (Config->get_slave_source()));
switch (Config->get_slave_source()) {
case None:
ActionManager::get_action ("Transport", "ToggleAutoPlay")->set_sensitive (true);
ActionManager::get_action ("Transport", "ToggleAutoReturn")->set_sensitive (true);
break;
default:
/* XXX need to make auto-play is off as well as insensitive */
ActionManager::get_action ("Transport", "ToggleAutoPlay")->set_sensitive (false);
ActionManager::get_action ("Transport", "ToggleAutoReturn")->set_sensitive (false);
break;
}
} else if (PARAM_IS ("send-mtc")) {
ActionManager::map_some_state ("options", "SendMTC", &Configuration::get_send_mtc);
@ -766,18 +845,30 @@ ARDOUR_UI::parameter_changed (const char* parameter_name)
ActionManager::map_some_state ("options", "SendMMC", &Configuration::get_send_mmc);
} else if (PARAM_IS ("use-osc")) {
#ifdef HAVE_LIBLO
if (Config->get_use_osc()) {
osc->start ();
} else {
osc->stop ();
}
#endif
ActionManager::map_some_state ("options", "UseOSC", &Configuration::get_use_osc);
} else if (PARAM_IS ("mmc-control")) {
ActionManager::map_some_state ("options", "UseMMC", &Configuration::get_mmc_control);
} else if (PARAM_IS ("midi-feedback")) {
ActionManager::map_some_state ("options", "SendMIDIfeedback", &Configuration::get_midi_feedback);
} else if (PARAM_IS ("midi-control")) {
ActionManager::map_some_state ("options", "UseMIDIcontrol", &Configuration::get_midi_control);
} else if (PARAM_IS ("do-not-record-plugins")) {
ActionManager::map_some_state ("options", "DoNotRunPluginsWhileRecording", &Configuration::get_do_not_record_plugins);
} else if (PARAM_IS ("latched-record-enable")) {
ActionManager::map_some_state ("options", "LatchedRecordEnable", &Configuration::get_latched_record_enable);
} else if (PARAM_IS ("solo-latched")) {
ActionManager::map_some_state ("options", "LatchedSolo", &Configuration::get_solo_latched);
} else if (PARAM_IS ("show-solo-mutes")) {
ActionManager::map_some_state ("options", "ShowSoloMutes", &Configuration::get_show_solo_mutes);
} else if (PARAM_IS ("solo-model")) {
map_solo_model ();
} else if (PARAM_IS ("auto-play")) {
@ -806,6 +897,8 @@ ARDOUR_UI::parameter_changed (const char* parameter_name)
ActionManager::map_some_state ("options", "StopTransportAtEndOfSession", &Configuration::get_stop_at_session_end);
} else if (PARAM_IS ("monitoring-model")) {
map_monitor_model ();
} else if (PARAM_IS ("remote-model")) {
map_remote_model ();
} else if (PARAM_IS ("use-video-sync")) {
ActionManager::map_some_state ("Transport", "ToggleVideoSync", &Configuration::get_use_video_sync);
} else if (PARAM_IS ("quieten-at-speed")) {

View file

@ -15,7 +15,6 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
$Id$
*/
#include <cstdio> // for sprintf
@ -1074,39 +1073,6 @@ AudioClock::field_button_press_event (GdkEventButton *ev, Field field)
return FALSE;
break;
case 4:
if (Keyboard::modifier_state_equals (ev->state, Keyboard::Shift)) {
frames = get_frames (field);
if (frames != 0) {
if (Keyboard::modifier_state_equals (ev->state, Keyboard::Control)) {
frames *= 10;
}
set (current_time() + frames, true);
ValueChanged (); /* EMIT_SIGNAL */
}
}
break;
case 5:
if (Keyboard::modifier_state_equals (ev->state, Keyboard::Shift)) {
frames = get_frames (field);
if (frames != 0) {
if (Keyboard::modifier_state_equals (ev->state, Keyboard::Control)) {
frames *= 10;
}
if ((double)current_time() - (double)frames < 0.0) {
set (0, true);
}
else {
set (current_time() - frames, true);
}
ValueChanged (); /* EMIT_SIGNAL */
}
}
break;
default:
return FALSE;
break;

View file

@ -15,7 +15,6 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
$Id$
*/
#ifndef __audio_clock_h__

View file

@ -15,7 +15,6 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
$Id$
*/
#include <pbd/memento_command.h>
@ -25,6 +24,7 @@
#include <ardour/utils.h>
#include <gtkmm2ext/utils.h>
#include <gtkmm2ext/stop_signal.h>
#include <gtkmm2ext/window_title.h>
#include <cmath>
#include "audio_region_editor.h"
@ -39,6 +39,7 @@ using namespace ARDOUR;
using namespace PBD;
using namespace sigc;
using namespace std;
using namespace Gtkmm2ext;
AudioRegionEditor::AudioRegionEditor (Session& s, boost::shared_ptr<AudioRegion> r, AudioRegionView& rv)
: RegionEditor (s),
@ -119,9 +120,10 @@ AudioRegionEditor::AudioRegionEditor (Session& s, boost::shared_ptr<AudioRegion>
signal_delete_event().connect (bind (sigc::ptr_fun (just_hide_it), static_cast<Window *> (this)));
string title = _("ardour: region ");
title += _region->name();
set_title (title);
WindowTitle title(string_compose (_("Region %1"), _region->name()));
title += Glib::get_application_name();
set_title (title.get_string());
show_all();

View file

@ -15,7 +15,6 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
$Id$
*/
#ifndef __gtk_ardour_audio_region_edit_h__

View file

@ -15,7 +15,6 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
$Id$
*/
#include <cmath>
@ -90,13 +89,36 @@ AudioRegionView::AudioRegionView (ArdourCanvas::Group *parent, RouteTimeAxisView
{
}
AudioRegionView::AudioRegionView (const AudioRegionView& other)
: RegionView (other)
, zero_line(0)
, fade_in_shape(0)
, fade_out_shape(0)
, fade_in_handle(0)
, fade_out_handle(0)
, gain_line(0)
, _amplitude_above_axis(1.0)
, _flags(0)
, fade_color(0)
{
Gdk::Color c;
int r,g,b,a;
UINT_TO_RGBA (other.fill_color, &r, &g, &b, &a);
c.set_rgb_p (r/255.0, g/255.0, b/255.0);
init (c, false);
}
void
AudioRegionView::init (Gdk::Color& basic_color, bool wfd)
{
// FIXME: Some redundancy here with RegionView::init. Need to figure out
// where order is important and where it isn't...
RegionView::init(basic_color, wfd);
RegionView::init(basic_color, false);
XMLNode *node;
@ -607,13 +629,16 @@ AudioRegionView::set_samples_per_unit (gdouble spu)
{
RegionView::set_samples_per_unit (spu);
for (uint32_t n=0; n < waves.size(); ++n) {
waves[n]->property_samples_per_unit() = spu;
if (_flags & WaveformVisible) {
for (uint32_t n=0; n < waves.size(); ++n) {
waves[n]->property_samples_per_unit() = spu;
}
}
if (gain_line) {
gain_line->reset ();
}
reset_fade_shapes ();
}
@ -653,6 +678,9 @@ AudioRegionView::set_colors ()
} else {
waves[n]->property_wave_color() = color_map[cWaveForm];
}
waves[n]->property_clip_color() = color_map[cWaveFormClip];
waves[n]->property_zero_color() = color_map[cZeroLine];
}
}
@ -676,6 +704,10 @@ AudioRegionView::set_waveform_visible (bool yn)
if (((_flags & WaveformVisible) != yn)) {
if (yn) {
for (uint32_t n=0; n < waves.size(); ++n) {
/* make sure the zoom level is correct, since we don't update
this when waveforms are hidden.
*/
waves[n]->property_samples_per_unit() = samples_per_unit;
waves[n]->show();
}
_flags |= WaveformVisible;
@ -723,8 +755,6 @@ AudioRegionView::set_envelope_visible (bool yn)
void
AudioRegionView::create_waves ()
{
bool create_zero_line = true;
RouteTimeAxisView& atv (*(dynamic_cast<RouteTimeAxisView*>(&trackview))); // ick
if (!atv.get_diskstream()) {
@ -750,23 +780,11 @@ AudioRegionView::create_waves ()
if (audio_region()->source(n)->peaks_ready (bind (mem_fun(*this, &AudioRegionView::peaks_ready_handler), n), data_ready_connection)) {
create_one_wave (n, true);
} else {
create_zero_line = false;
}
} else {
create_one_wave (n, true);
}
}
if (create_zero_line) {
if (zero_line) {
delete zero_line;
}
zero_line = new ArdourCanvas::SimpleLine (*group);
zero_line->property_x1() = (gdouble) 1.0;
zero_line->property_x2() = (gdouble) (_region->length() / samples_per_unit) - 1.0;
zero_line->property_color_rgba() = (guint) color_map[cZeroLine];
manage_zero_line ();
}
}
void
@ -801,6 +819,8 @@ AudioRegionView::create_one_wave (uint32_t which, bool direct)
wave->property_samples_per_unit() = samples_per_unit;
wave->property_amplitude_above_axis() = _amplitude_above_axis;
wave->property_wave_color() = _region->muted() ? color_map[cMutedWaveForm] : color_map[cWaveForm];
wave->property_clip_color() = color_map[cWaveFormClip];
wave->property_zero_color() = color_map[cZeroLine];
wave->property_region_start() = _region->start();
wave->property_rectified() = (bool) (_flags & WaveformRectified);
wave->property_logscaled() = (bool) (_flags & WaveformLogScaled);
@ -839,6 +859,7 @@ AudioRegionView::create_one_wave (uint32_t which, bool direct)
/* all waves created, don't hook into peaks ready anymore */
data_ready_connection.disconnect ();
if(0)
if (!zero_line) {
zero_line = new ArdourCanvas::SimpleLine (*group);
zero_line->property_x1() = (gdouble) 1.0;
@ -1046,6 +1067,8 @@ AudioRegionView::add_ghost (AutomationTimeAxisView& atv)
wave->property_samples_per_unit() = samples_per_unit;
wave->property_amplitude_above_axis() = _amplitude_above_axis;
wave->property_wave_color() = color_map[cGhostTrackWave];
wave->property_clip_color() = color_map[cGhostTrackWaveClip];
wave->property_zero_color() = color_map[cGhostTrackZeroLine];
wave->property_region_start() = _region->start();
ghost->waves.push_back(wave);
@ -1130,6 +1153,8 @@ AudioRegionView::color_handler (ColorID id, uint32_t val)
switch (id) {
case cMutedWaveForm:
case cWaveForm:
case cWaveFormClip:
case cZeroLine:
set_colors ();
break;
@ -1138,15 +1163,6 @@ AudioRegionView::color_handler (ColorID id, uint32_t val)
envelope_active_changed();
break;
case cZeroLine:
if (zero_line) {
zero_line->property_color_rgba() = (guint) color_map[cZeroLine];
}
break;
case cGhostTrackWave:
break;
default:
break;
}

View file

@ -55,6 +55,8 @@ class AudioRegionView : public RegionView
double initial_samples_per_unit,
Gdk::Color& basic_color);
AudioRegionView (const AudioRegionView& other);
~AudioRegionView ();
virtual void init (Gdk::Color& base_color, bool wait_for_data = false);
@ -143,7 +145,7 @@ class AudioRegionView : public RegionView
void reset_width_dependent_items (double pixel_width);
void set_waveview_data_src();
void color_handler (ColorID, uint32_t);
void color_handler (ColorID, uint32_t);
vector<GnomeCanvasWaveViewCache*> wave_caches;
vector<ArdourCanvas::WaveView *> waves;

View file

@ -179,6 +179,15 @@ AudioStreamView::add_region_view_internal (boost::shared_ptr<Region> r, bool wai
region_view->set_amplitude_above_axis(_amplitude_above_axis);
region_views.push_front (region_view);
/* if its the special single-sample length that we use for rec-regions, make it
insensitive to events
*/
if (region->length() == 1) {
region_view->set_sensitive (false);
}
/* if this was the first one, then lets query the waveform scale and shape.
otherwise, we set it to the current value */

View file

@ -15,7 +15,6 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
$Id$
*/
#include <cstdlib>
@ -108,21 +107,13 @@ AudioTimeAxisView::AudioTimeAxisView (PublicEditor& ed, Session& sess, boost::sh
_route->panner().Changed.connect (mem_fun(*this, &AudioTimeAxisView::update_pans));
if (is_audio_track()) {
update_control_names ();
controls_ebox.set_name ("AudioTrackControlsBaseUnselected");
controls_base_selected_name = "AudioTrackControlsBaseSelected";
controls_base_unselected_name = "AudioTrackControlsBaseUnselected";
if (is_audio_track()) {
/* ask for notifications of any new RegionViews */
_view->RegionViewAdded.connect (mem_fun(*this, &AudioTimeAxisView::region_view_added));
_view->attach ();
} else { /* bus */
controls_ebox.set_name ("AudioBusControlsBaseUnselected");
controls_base_selected_name = "AudioBusControlsBaseSelected";
controls_base_unselected_name = "AudioBusControlsBaseUnselected";
}
post_construct ();
@ -622,7 +613,19 @@ void
AudioTimeAxisView::route_active_changed ()
{
RouteTimeAxisView::route_active_changed ();
update_control_names ();
}
/**
* Set up the names of the controls so that they are coloured
* correctly depending on whether this route is inactive or
* selected.
*/
void
AudioTimeAxisView::update_control_names ()
{
if (is_audio_track()) {
if (_route->active()) {
controls_ebox.set_name ("AudioTrackControlsBaseUnselected");

View file

@ -15,7 +15,6 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
$Id$
*/
#ifndef __ardour_audio_time_axis_h__
@ -115,6 +114,7 @@ class AudioTimeAxisView : public RouteTimeAxisView
void pan_hidden ();
void update_pans ();
void update_control_names ();
AutomationTimeAxisView* gain_track;
AutomationTimeAxisView* pan_track;

View file

@ -15,7 +15,6 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
$Id$
*/
#include <sigc++/signal.h>

View file

@ -15,7 +15,6 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
$Id$
*/
#include <cmath>
@ -25,6 +24,7 @@
#include <pbd/stl_delete.h>
#include <pbd/memento_command.h>
#include <pbd/stacktrace.h>
#include <ardour/automation_event.h>
#include <ardour/curve.h>
@ -1136,6 +1136,13 @@ AutomationLine::set_selected_points (PointSelection& points)
}
void AutomationLine::set_colors() {
set_line_color( color_map[cAutomationLine] );
for (vector<ControlPoint*>::iterator i = control_points.begin(); i != control_points.end(); ++i) {
(*i)->show_color (false, !points_visible);
}
}
void
AutomationLine::show_selection ()
{

View file

@ -15,7 +15,6 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
$Id$
*/
#ifndef __ardour_automation_line_h__
@ -160,6 +159,7 @@ class AutomationLine : public sigc::trackable, public PBD::StatefulThingWithGoin
XMLNode& get_state (void);
int set_state (const XMLNode&);
void set_colors();
protected:

View file

@ -15,7 +15,6 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
$Id$
*/
#include <sigc++/signal.h>

View file

@ -163,6 +163,7 @@ AutomationTimeAxisView::AutomationTimeAxisView (Session& s, boost::shared_ptr<Ro
/* make sure labels etc. are correct */
automation_state_changed ();
ColorChanged.connect (mem_fun (*this, &AutomationTimeAxisView::color_handler));
}
AutomationTimeAxisView::~AutomationTimeAxisView ()
@ -686,7 +687,7 @@ AutomationTimeAxisView::get_selectables (nframes_t start, nframes_t end, double
y_position is the "origin" or "top" of the track.
*/
double mybot = y_position + height; // XXX need to include Editor::track_spacing;
double mybot = y_position + height;
if (y_position >= top && mybot <= bot) {
@ -787,6 +788,42 @@ AutomationTimeAxisView::exited ()
hide_all_but_selected_control_points ();
}
void
AutomationTimeAxisView::set_colors () {
for( list<GhostRegion *>::iterator i=ghosts.begin(); i != ghosts.end(); i++ ) {
(*i)->set_colors();
}
for( vector<AutomationLine *>::iterator i=lines.begin(); i != lines.end(); i++ ) {
(*i)->set_colors();
}
}
void
AutomationTimeAxisView::color_handler (ColorID id, uint32_t val) {
switch (id) {
case cGhostTrackWave:
case cGhostTrackWaveClip:
case cGhostTrackZeroLine:
case cControlPoint:
case cControlPointFill:
case cControlPointOutline:
case cAutomationLine:
set_colors ();
break;
default:
break;
}
}
void
AutomationTimeAxisView::set_state (const XMLNode& node)
{

View file

@ -122,6 +122,9 @@ class AutomationTimeAxisView : public TimeAxisView {
void entered ();
void exited ();
void set_colors ();
void color_handler (ColorID, uint32_t);
static Pango::FontDescription name_font;
static bool have_name_font;
};

View file

@ -15,7 +15,6 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
$Id$
*/
#include <cstdlib>

View file

@ -15,7 +15,6 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
$Id$
*/
#ifndef __ardour_gtk_axis_view_h__

View file

@ -16,7 +16,15 @@
#include <libgnomecanvas/libgnomecanvas.h>
#include <gtk/gtkenums.h>
#ifdef __cplusplus
extern "C" {
#endif
#include <libart_lgpl/art_misc.h>
#ifdef __cplusplus
}
#endif
#include <libart_lgpl/art_pixbuf.h>

View file

@ -257,13 +257,14 @@ gnome_canvas_simplerect_bounds (GnomeCanvasItem *item, double *x1, double *y1, d
}
static void
gnome_canvas_simplerect_reset_bounds (GnomeCanvasItem *item)
{
GnomeCanvasSimpleRect* simplerect;
double x1, x2, y1, y2;
double old_x1, old_x2, old_y1, old_y2;
double a, b, c, d;
ArtDRect unionrect, old, new;
old_x1 = item->x1;
old_y1 = item->y1;
@ -288,23 +289,73 @@ gnome_canvas_simplerect_reset_bounds (GnomeCanvasItem *item)
/* now queue redraws for changed areas */
a = MIN(item->x1, old_x1);
b = MAX(item->x1, old_x1);
if (item->x1 == old_x1 && item->x2 == old_x2) {
a = MIN(a, item->x2);
a = MIN(a, old_x2);
b = MAX(b, item->x2);
b = MAX(b, old_x2);
/* no change in x-axis position */
c = MIN(item->y1, old_y1);
d = MAX(item->y1, old_y1);
if (item->y1 == old_y1) {
/* top didn't change, so just draw bottom */
c = MIN(c,item->y2);
c = MIN(c, old_y2);
d = MAX(d,item->y2);
d = MAX(d, old_y2);
double start_y = MIN (item->y2, old_y2);
double end_y = MAX (item->y2, old_y2);
gnome_canvas_request_redraw (item->canvas, a, c, b + 0.5, d + 0.5);
gnome_canvas_request_redraw (item->canvas, item->x1, start_y - 0.5, item->x2, end_y + 1.5);
return;
} else if (item->y2 == old_y2) {
/* bottom didn't change, just draw top */
double start_y = MIN (item->y1, old_y1);
double end_y = MAX (item->y1, old_y1);
gnome_canvas_request_redraw (item->canvas, item->x1, start_y - 0.5, item->x2, end_y + 1.5);
return;
}
} else if (item->y1 == old_y1 && item->y2 == old_y2) {
/* no change in y-axis position */
if (item->x1 == old_x1) {
/* start didn't change, so just draw at the end */
double start_x = MIN (item->x2, old_x2);
double end_x = MAX (item->x2, old_x2);
gnome_canvas_request_redraw (item->canvas, start_x - 0.5, item->y1, end_x + 1.5, item->y2);
return;
} else if (item->x2 == old_x2) {
/* end didn't change, so just draw at the start */
double start_x = MIN (item->x1, old_x1);
double end_x = MAX (item->x1, old_x1);
gnome_canvas_request_redraw (item->canvas, start_x - 0.5, item->y1, end_x + 1.5, item->y2 + 0.5);
return;
}
}
new.x0 = x1;
new.y0 = y1;
new.x1 = x2;
new.y1 = y2;
old.x0 = old_x1;
old.y0 = old_y1;
old.x1 = old_x2;
old.y1 = old_y2;
art_drect_union (&unionrect, &old, &new);
gnome_canvas_request_redraw (item->canvas,
unionrect.x0 - 0.5,
unionrect.y0 - 0.5,
unionrect.x1 + 1.5,
unionrect.y1 + 1.5);
}
/*

View file

@ -30,6 +30,7 @@
#include "canvas-waveview.h"
#include "rgb_macros.h"
extern void c_stacktrace();
enum {
@ -49,6 +50,8 @@ enum {
PROP_Y,
PROP_HEIGHT,
PROP_WAVE_COLOR,
PROP_CLIP_COLOR,
PROP_ZERO_COLOR,
PROP_RECTIFIED,
PROP_REGION_START,
PROP_LOGSCALED,
@ -249,6 +252,20 @@ gnome_canvas_waveview_class_init (GnomeCanvasWaveViewClass *class)
0, G_MAXUINT, 0,
(G_PARAM_READABLE | G_PARAM_WRITABLE)));
g_object_class_install_property
(gobject_class,
PROP_CLIP_COLOR,
g_param_spec_uint ("clip_color", NULL, NULL,
0, G_MAXUINT, 0,
(G_PARAM_READABLE | G_PARAM_WRITABLE)));
g_object_class_install_property
(gobject_class,
PROP_ZERO_COLOR,
g_param_spec_uint ("zero_color", NULL, NULL,
0, G_MAXUINT, 0,
(G_PARAM_READABLE | G_PARAM_WRITABLE)));
g_object_class_install_property
(gobject_class,
PROP_RECTIFIED,
@ -326,6 +343,8 @@ gnome_canvas_waveview_init (GnomeCanvasWaveView *waveview)
waveview->reload_cache_in_render = FALSE;
waveview->wave_color = RGBA_TO_UINT(44,35,126,255);
waveview->clip_color = RGBA_TO_UINT(44,0,0,100);
waveview->zero_color = RGBA_TO_UINT(44,0,128,100);
}
static void
@ -369,7 +388,8 @@ gnome_canvas_waveview_ensure_cache (GnomeCanvasWaveView *waveview, gulong start_
end_sample = end_sample + waveview->region_start;
#if DEBUG_CACHE
// printf("waveview->region_start == %lu\n",waveview->region_start);
printf ("=> 0x%x cache @ 0x%x range: %lu - %lu request: %lu - %lu (%lu frames)\n",
// c_stacktrace ();
printf ("\n\n=> 0x%x cache @ 0x%x range: %lu - %lu request: %lu - %lu (%lu frames)\n",
waveview, cache,
cache->start, cache->end,
start_sample, end_sample, end_sample - start_sample);
@ -413,7 +433,7 @@ gnome_canvas_waveview_ensure_cache (GnomeCanvasWaveView *waveview, gulong start_
}
#if DEBUG_CACHE
fprintf (stderr, "\n\nAVAILABLE FRAMES = %lu of %lu, start = %lu, sstart = %lu, cstart = %lu\n",
fprintf (stderr, "AVAILABLE FRAMES = %lu of %lu, start = %lu, sstart = %lu, cstart = %lu\n",
rf3, waveview->sourcefile_length_function (waveview->data_src, waveview->samples_per_unit),
waveview->region_start, start_sample, new_cache_start);
#endif
@ -796,6 +816,20 @@ gnome_canvas_waveview_set_property (GObject *object,
}
break;
case PROP_CLIP_COLOR:
if (waveview->clip_color != g_value_get_uint(value)) {
waveview->clip_color = g_value_get_uint(value);
redraw = TRUE;
}
break;
case PROP_ZERO_COLOR:
if (waveview->zero_color != g_value_get_uint(value)) {
waveview->zero_color = g_value_get_uint(value);
redraw = TRUE;
}
break;
case PROP_RECTIFIED:
if (waveview->rectified != g_value_get_boolean(value)) {
waveview->rectified = g_value_get_boolean(value);
@ -908,6 +942,14 @@ gnome_canvas_waveview_get_property (GObject *object,
g_value_set_uint (value, waveview->wave_color);
break;
case PROP_CLIP_COLOR:
g_value_set_uint (value, waveview->clip_color);
break;
case PROP_ZERO_COLOR:
g_value_set_uint (value, waveview->zero_color);
break;
case PROP_RECTIFIED:
g_value_set_boolean (value, waveview->rectified);
break;
@ -968,6 +1010,8 @@ gnome_canvas_waveview_update (GnomeCanvasItem *item, double *affine, ArtSVP *cli
UINT_TO_RGBA (waveview->wave_color, &waveview->wave_r, &waveview->wave_g, &waveview->wave_b,
&waveview->wave_a);
UINT_TO_RGBA (waveview->clip_color, &waveview->clip_r, &waveview->clip_g, &waveview->clip_b,
&waveview->clip_a);
// check_cache (waveview, "end of update");
}
@ -983,6 +1027,7 @@ gnome_canvas_waveview_render (GnomeCanvasItem *item,
int cache_index;
double half_height;
int x, end, begin;
int zbegin, zend;
waveview = GNOME_CANVAS_WAVEVIEW (item);
@ -997,7 +1042,13 @@ gnome_canvas_waveview_render (GnomeCanvasItem *item,
buf->is_bg = FALSE;
}
begin = MAX(waveview->bbox_ulx,buf->rect.x0);
begin = MAX(waveview->bbox_ulx, buf->rect.x0);
if (begin == waveview->bbox_ulx) {
zbegin = begin + 1;
} else {
zbegin = begin;
}
if (waveview->bbox_lrx >= 0) {
end = MIN(waveview->bbox_lrx,buf->rect.x1);
@ -1005,6 +1056,12 @@ gnome_canvas_waveview_render (GnomeCanvasItem *item,
end = buf->rect.x1;
}
if (end == waveview->bbox_lrx) {
zend = end - 1;
} else {
zend = end;
}
if (begin == end) {
return;
}
@ -1065,6 +1122,7 @@ gnome_canvas_waveview_render (GnomeCanvasItem *item,
#define origin half_height
for (x = begin; x < end; x++) {
double max, min;
@ -1125,11 +1183,11 @@ gnome_canvas_waveview_render (GnomeCanvasItem *item,
}
if (clip_max) {
PAINT_VERT(buf, 255, 0, 0, x, pymax, pymax+clip_length);
PAINT_VERTA(buf, waveview->clip_r, waveview->clip_g, waveview->clip_b, waveview->clip_a, x, pymax, pymax+clip_length);
}
if (clip_min) {
PAINT_VERT(buf, 255, 0, 0, x, pymin-clip_length, pymin);
PAINT_VERTA(buf, waveview->clip_r, waveview->clip_g, waveview->clip_b, waveview->clip_a, x, pymin-clip_length, pymin);
}
/* presto, we're done */
@ -1137,6 +1195,15 @@ gnome_canvas_waveview_render (GnomeCanvasItem *item,
cache_index++;
}
if (!waveview->rectified) {
// Paint zeroline.
//PAINT_HORIZA(buf, waveview->zero_r, waveview->zero_g, waveview->zero_b, waveview->zero_a, begin, endi-1, origin );
unsigned char zero_r, zero_g, zero_b, zero_a;
UINT_TO_RGBA( waveview->zero_color, &zero_r, &zero_g, &zero_b, &zero_a );
int zeroline_y = (int) rint ((item->y1 + origin) * item->canvas->pixels_per_unit);
PAINT_HORIZA(buf, zero_r, zero_g, zero_b, zero_a, zbegin, end, zeroline_y);
}
#undef origin
}

View file

@ -99,6 +99,8 @@ struct _GnomeCanvasWaveView
double height;
double half_height;
uint32_t wave_color;
uint32_t clip_color;
uint32_t zero_color;
char rectified;
char logscaled;
@ -113,6 +115,7 @@ struct _GnomeCanvasWaveView
int32_t bbox_lrx;
int32_t bbox_lry;
unsigned char wave_r, wave_g, wave_b, wave_a;
unsigned char clip_r, clip_g, clip_b, clip_a;
uint32_t samples;
uint32_t region_start;
int32_t reload_cache_in_render;

View file

@ -1,6 +1,7 @@
/* no guard clauses here */
COLORID(cWaveForm)
COLORID(cWaveFormClip)
COLORID(cMutedWaveForm)
COLORID(cSelectedFrameBase)
COLORID(cFrameBase)
@ -72,6 +73,8 @@ COLORID(cMeasureLineBar)
COLORID(cGhostTrackBaseOutline)
COLORID(cGhostTrackBaseFill)
COLORID(cGhostTrackWave)
COLORID(cGhostTrackWaveClip)
COLORID(cGhostTrackZeroLine)
COLORID(cImageTrackBase)
COLORID(cImageTrackOutline)
COLORID(cMarkerTrackBase)
@ -101,3 +104,6 @@ COLORID(cTrimHandleLockedStart)
COLORID(cTrimHandleLockedEnd)
COLORID(cTrimHandleStart)
COLORID(cTrimHandleEnd)
COLORID(cEditCursor)
COLORID(cPlayHead)

View file

@ -15,7 +15,6 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
$Id$
*/
#include <map>

View file

@ -15,7 +15,6 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
$Id$
*/
#ifndef __ardour_gtk_connection_editor_h__

View file

@ -15,7 +15,6 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
$Id$
*/
#include <cmath>
@ -194,7 +193,7 @@ CrossfadeEditor::CrossfadeEditor (Session& s, boost::shared_ptr<Crossfade> xf, d
for (list<Preset*>::iterator i = fade_in_presets->begin(); i != fade_in_presets->end(); ++i) {
pxmap = manage (new Image (get_xpm((*i)->xpm)));
pxmap = manage (new Image (::get_icon ((*i)->image_name)));
pbutton = manage (new Button);
pbutton->add (*pxmap);
pbutton->set_name ("CrossfadeEditButton");
@ -215,7 +214,7 @@ CrossfadeEditor::CrossfadeEditor (Session& s, boost::shared_ptr<Crossfade> xf, d
for (list<Preset*>::iterator i = fade_out_presets->begin(); i != fade_out_presets->end(); ++i) {
pxmap = manage (new Image (get_xpm((*i)->xpm)));
pxmap = manage (new Image (::get_icon ((*i)->image_name)));
pbutton = manage (new Button);
pbutton->add (*pxmap);
pbutton->set_name ("CrossfadeEditButton");
@ -832,7 +831,8 @@ CrossfadeEditor::build_presets ()
fade_out_presets = new Presets;
/* FADE OUT */
p = new Preset ("hiin.xpm");
// p = new Preset ("hiin.xpm");
p = new Preset ("crossfade_in_fast-cut");
p->push_back (PresetPoint (0, 0));
p->push_back (PresetPoint (0.0207373, 0.197222));
p->push_back (PresetPoint (0.0645161, 0.525));
@ -843,7 +843,8 @@ CrossfadeEditor::build_presets ()
p->push_back (PresetPoint (1, 1));
fade_in_presets->push_back (p);
p = new Preset ("loin.xpm");
// p = new Preset ("loin.xpm");
p = new Preset ("crossfade_in_transition");
p->push_back (PresetPoint (0, 0));
p->push_back (PresetPoint (0.389401, 0.0333333));
p->push_back (PresetPoint (0.629032, 0.0861111));
@ -853,7 +854,8 @@ CrossfadeEditor::build_presets ()
p->push_back (PresetPoint (1, 1));
fade_in_presets->push_back (p);
p = new Preset ("regin.xpm");
// p = new Preset ("regin.xpm");
p = new Preset ("crossfade_in_constant");
p->push_back (PresetPoint (0, 0));
p->push_back (PresetPoint (0.0737327, 0.308333));
p->push_back (PresetPoint (0.246544, 0.658333));
@ -863,7 +865,8 @@ CrossfadeEditor::build_presets ()
p->push_back (PresetPoint (1, 1));
fade_in_presets->push_back (p);
p = new Preset ("regin2.xpm");
// p = new Preset ("regin2.xpm");
p = new Preset ("crossfade_in_slow-cut");
p->push_back (PresetPoint (0, 0));
p->push_back (PresetPoint (0.304147, 0.0694444));
p->push_back (PresetPoint (0.529954, 0.152778));
@ -873,14 +876,16 @@ CrossfadeEditor::build_presets ()
p->push_back (PresetPoint (1, 1));
fade_in_presets->push_back (p);
p = new Preset ("linin.xpm");
// p = new Preset ("linin.xpm");
p = new Preset ("crossfade_in_dipped");
p->push_back (PresetPoint (0, 0));
p->push_back (PresetPoint (1, 1));
fade_in_presets->push_back (p);
/* FADE OUT */
p = new Preset ("hiout.xpm");
// p = new Preset ("hiout.xpm");
p = new Preset ("crossfade_out_fast-cut");
p->push_back (PresetPoint (0, 1));
p->push_back (PresetPoint (0.305556, 1));
p->push_back (PresetPoint (0.548611, 0.991736));
@ -890,7 +895,8 @@ CrossfadeEditor::build_presets ()
p->push_back (PresetPoint (1, 0));
fade_out_presets->push_back (p);
p = new Preset ("regout.xpm");
// p = new Preset ("regout.xpm");
p = new Preset ("crossfade_out_constant");
p->push_back (PresetPoint (0, 1));
p->push_back (PresetPoint (0.228111, 0.988889));
p->push_back (PresetPoint (0.347926, 0.972222));
@ -900,7 +906,8 @@ CrossfadeEditor::build_presets ()
p->push_back (PresetPoint (1, 0));
fade_out_presets->push_back (p);
p = new Preset ("loout.xpm");
// p = new Preset ("loout.xpm");
p = new Preset ("crossfade_out_transition");
p->push_back (PresetPoint (0, 1));
p->push_back (PresetPoint (0.023041, 0.697222));
p->push_back (PresetPoint (0.0553, 0.483333));
@ -910,7 +917,8 @@ CrossfadeEditor::build_presets ()
p->push_back (PresetPoint (1, 0));
fade_out_presets->push_back (p);
p = new Preset ("regout2.xpm");
// p = new Preset ("regout2.xpm");
p = new Preset ("crossfade_out_slow-fade");
p->push_back (PresetPoint (0, 1));
p->push_back (PresetPoint (0.080645, 0.730556));
p->push_back (PresetPoint (0.277778, 0.289256));
@ -919,7 +927,8 @@ CrossfadeEditor::build_presets ()
p->push_back (PresetPoint (1, 0));
fade_out_presets->push_back (p);
p = new Preset ("linout.xpm");
// p = new Preset ("linout.xpm");
p = new Preset ("crossfade_out_dipped");
p->push_back (PresetPoint (0, 1));
p->push_back (PresetPoint (1, 0));
fade_out_presets->push_back (p);

View file

@ -43,10 +43,9 @@ class CrossfadeEditor : public ArdourDialog
};
struct Preset : public list<PresetPoint> {
string xpm;
const char* image_name;
Preset (string x)
: xpm (x) {}
Preset (const char* x) : image_name (x) {}
};
typedef list<Preset*> Presets;

View file

@ -15,7 +15,6 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
$Id$
*/
#include <algorithm>

View file

@ -15,7 +15,6 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
$Id$
*/
#ifndef __gtk_ardour_crossfade_view_h__

View file

@ -15,7 +15,6 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
$Id$
*/
#include <unistd.h>
@ -31,6 +30,7 @@
#include <pbd/stacktrace.h>
#include <pbd/memento_command.h>
#include <glibmm/miscutils.h>
#include <gtkmm/image.h>
#include <gdkmm/color.h>
#include <gdkmm/bitmap.h>
@ -39,6 +39,8 @@
#include <gtkmm2ext/gtk_ui.h>
#include <gtkmm2ext/tearoff.h>
#include <gtkmm2ext/utils.h>
#include <gtkmm2ext/window_title.h>
#include <gtkmm2ext/choice.h>
#include <ardour/audio_track.h>
#include <ardour/audio_diskstream.h>
@ -170,9 +172,8 @@ check_adjustment (Gtk::Adjustment* adj)
}
Editor::Editor (AudioEngine& eng)
: engine (eng),
Editor::Editor ()
:
/* time display buttons */
minsec_label (_("Mins:Secs")),
@ -271,7 +272,6 @@ Editor::Editor (AudioEngine& eng)
no_route_list_redisplay = false;
verbose_cursor_on = true;
route_removal = false;
track_spacing = 0;
show_automatic_regions_in_region_list = true;
region_list_sort_type = (Editing::RegionListSortType) 0;
have_pending_keyboard_selection = false;
@ -366,12 +366,13 @@ Editor::Editor (AudioEngine& eng)
edit_cursor_clock.ValueChanged.connect (mem_fun(*this, &Editor::edit_cursor_clock_changed));
time_canvas_vbox.pack_start (*_ruler_separator, false, false);
time_canvas_vbox.pack_start (*minsec_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 (*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));
time_canvas_vbox.set_size_request (-1, (int)(timebar_height * visible_timebars) + 2);
bbt_label.set_name ("EditorTimeButton");
bbt_label.set_size_request (-1, (int)timebar_height);
@ -424,6 +425,9 @@ Editor::Editor (AudioEngine& eng)
time_button_event_box.set_name ("TimebarLabelBase");
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.property_shadow_type() = Gtk::SHADOW_OUT;
/* these enable us to have a dedicated window (for cursor setting, etc.)
for the canvas areas.
*/
@ -441,7 +445,7 @@ Editor::Editor (AudioEngine& eng)
edit_packer.attach (edit_vscrollbar, 0, 1, 1, 3, FILL, FILL|EXPAND, 0, 0);
edit_packer.attach (time_button_event_box, 1, 2, 0, 1, FILL, FILL, 0, 0);
edit_packer.attach (time_button_frame, 0, 2, 0, 1, FILL, FILL, 0, 0);
edit_packer.attach (time_canvas_event_box, 2, 3, 0, 1, FILL|EXPAND, FILL, 0, 0);
edit_packer.attach (controls_layout, 1, 2, 1, 2, FILL, FILL|EXPAND, 0, 0);
@ -510,7 +514,7 @@ Editor::Editor (AudioEngine& eng)
edit_group_display.set_name ("EditGroupList");
edit_group_display.get_selection()->set_mode (SELECTION_SINGLE);
edit_group_display.set_headers_visible (false);
edit_group_display.set_headers_visible (true);
edit_group_display.set_reorderable (false);
edit_group_display.set_rules_hint (true);
edit_group_display.set_size_request (75, -1);
@ -710,7 +714,10 @@ Editor::Editor (AudioEngine& eng)
set_icon_list (window_icons);
set_default_icon_list (window_icons);
}
set_title (_("ardour: editor"));
WindowTitle title(Glib::get_application_name());
title += _("Editor");
set_title (title.get_string());
set_wmclass (X_("ardour_editor"), "Ardour");
add (vpacker);
@ -1008,24 +1015,21 @@ Editor::update_title ()
if (session) {
bool dirty = session->dirty();
string wintitle = _("ardour: editor: ");
if (dirty) {
wintitle += '[';
}
wintitle += session->name();
string session_name;
if (session->snap_name() != session->name()) {
wintitle += ':';
wintitle += session->snap_name();
session_name = session->snap_name();
} else {
session_name = session->name();
}
if (dirty) {
wintitle += ']';
session_name = "*" + session_name;
}
set_title (wintitle);
WindowTitle title(session_name);
title += Glib::get_application_name();
set_title (title.get_string());
}
}
@ -1072,7 +1076,7 @@ Editor::connect_to_session (Session *t)
session_connections.push_back (session->SMPTEOffsetChanged.connect (mem_fun(*this, &Editor::update_just_smpte)));
session_connections.push_back (session->tempo_map().StateChanged.connect (bind (mem_fun(*this, &Editor::tempo_map_changed), false)));
session_connections.push_back (session->tempo_map().StateChanged.connect (mem_fun(*this, &Editor::tempo_map_changed)));
edit_groups_changed ();
@ -1094,8 +1098,7 @@ Editor::connect_to_session (Session *t)
}
session->locations()->add (loc, false);
session->set_auto_loop_location (loc);
}
else {
} else {
// force name
loc->set_name (_("Loop"));
}
@ -1108,8 +1111,7 @@ Editor::connect_to_session (Session *t)
}
session->locations()->add (loc, false);
session->set_auto_punch_location (loc);
}
else {
} else {
// force name
loc->set_name (_("Punch"));
}
@ -1241,8 +1243,8 @@ Editor::popup_fade_context_menu (int button, int32_t time, ArdourCanvas::Item* i
items.push_back (SeparatorElem());
items.push_back (MenuElem (_("Linear"), bind (mem_fun (*this, &Editor::set_fade_in_shape), AudioRegion::Linear)));
items.push_back (MenuElem (_("Slowest"), bind (mem_fun (*this, &Editor::set_fade_in_shape), AudioRegion::LogB)));
items.push_back (MenuElem (_("Slow"), bind (mem_fun (*this, &Editor::set_fade_in_shape), AudioRegion::Fast)));
items.push_back (MenuElem (_("Slowest"), bind (mem_fun (*this, &Editor::set_fade_in_shape), AudioRegion::Fast)));
items.push_back (MenuElem (_("Slow"), bind (mem_fun (*this, &Editor::set_fade_in_shape), AudioRegion::LogB)));
items.push_back (MenuElem (_("Fast"), bind (mem_fun (*this, &Editor::set_fade_in_shape), AudioRegion::LogA)));
items.push_back (MenuElem (_("Fastest"), bind (mem_fun (*this, &Editor::set_fade_in_shape), AudioRegion::Slow)));
break;
@ -1258,10 +1260,10 @@ Editor::popup_fade_context_menu (int button, int32_t time, ArdourCanvas::Item* i
items.push_back (SeparatorElem());
items.push_back (MenuElem (_("Linear"), bind (mem_fun (*this, &Editor::set_fade_out_shape), AudioRegion::Linear)));
items.push_back (MenuElem (_("Slowest"), bind (mem_fun (*this, &Editor::set_fade_out_shape), AudioRegion::Fast)));
items.push_back (MenuElem (_("Slow"), bind (mem_fun (*this, &Editor::set_fade_out_shape), AudioRegion::LogB)));
items.push_back (MenuElem (_("Fast"), bind (mem_fun (*this, &Editor::set_fade_out_shape), AudioRegion::LogA)));
items.push_back (MenuElem (_("Fastest"), bind (mem_fun (*this, &Editor::set_fade_out_shape), AudioRegion::Slow)));
items.push_back (MenuElem (_("Slowest"), bind (mem_fun (*this, &Editor::set_fade_out_shape), AudioRegion::Slow)));
items.push_back (MenuElem (_("Slow"), bind (mem_fun (*this, &Editor::set_fade_out_shape), AudioRegion::LogA)));
items.push_back (MenuElem (_("Fast"), bind (mem_fun (*this, &Editor::set_fade_out_shape), AudioRegion::LogB)));
items.push_back (MenuElem (_("Fastest"), bind (mem_fun (*this, &Editor::set_fade_out_shape), AudioRegion::Fast)));
break;
@ -1629,20 +1631,32 @@ Editor::add_region_context_items (AudioStreamView* sv, boost::shared_ptr<Region>
items.push_back (SeparatorElem());
items.push_back (CheckMenuElem (_("Lock"), mem_fun(*this, &Editor::toggle_region_lock)));
sigc::connection fooc;
items.push_back (CheckMenuElem (_("Lock")));
region_lock_item = static_cast<CheckMenuItem*>(&items.back());
fooc = region_lock_item->signal_activate().connect (mem_fun(*this, &Editor::toggle_region_lock));
if (region->locked()) {
fooc.block (true);
region_lock_item->set_active();
fooc.block (false);
}
items.push_back (CheckMenuElem (_("Mute"), mem_fun(*this, &Editor::toggle_region_mute)));
items.push_back (CheckMenuElem (_("Mute")));
region_mute_item = static_cast<CheckMenuItem*>(&items.back());
fooc = region_mute_item->signal_activate().connect (mem_fun(*this, &Editor::toggle_region_mute));
if (region->muted()) {
fooc.block (true);
region_mute_item->set_active();
fooc.block (false);
}
items.push_back (CheckMenuElem (_("Opaque"), mem_fun(*this, &Editor::toggle_region_opaque)));
items.push_back (CheckMenuElem (_("Opaque")));
region_opaque_item = static_cast<CheckMenuItem*>(&items.back());
fooc = region_opaque_item->signal_activate().connect (mem_fun(*this, &Editor::toggle_region_opaque));
if (region->opaque()) {
fooc.block (true);
region_opaque_item->set_active();
fooc.block (false);
}
items.push_back (CheckMenuElem (_("Original position"), mem_fun(*this, &Editor::naturalize)));
@ -1659,18 +1673,23 @@ Editor::add_region_context_items (AudioStreamView* sv, boost::shared_ptr<Region>
items.push_back (MenuElem (_("Reset Envelope"), mem_fun(*this, &Editor::reset_region_gain_envelopes)));
items.push_back (CheckMenuElem (_("Envelope Visible"), mem_fun(*this, &Editor::toggle_gain_envelope_visibility)));
items.push_back (CheckMenuElem (_("Envelope Visible")));
region_envelope_visible_item = static_cast<CheckMenuItem*> (&items.back());
fooc = region_envelope_visible_item->signal_activate().connect (mem_fun(*this, &Editor::toggle_gain_envelope_visibility));
if (arv->envelope_visible()) {
fooc.block (true);
region_envelope_visible_item->set_active (true);
fooc.block (false);
}
items.push_back (CheckMenuElem (_("Envelope Active"), mem_fun(*this, &Editor::toggle_gain_envelope_active)));
items.push_back (CheckMenuElem (_("Envelope Active")));
region_envelope_active_item = static_cast<CheckMenuItem*> (&items.back());
fooc = region_envelope_active_item->signal_activate().connect (mem_fun(*this, &Editor::toggle_gain_envelope_active));
if (ar->envelope_active()) {
fooc.block (true);
region_envelope_active_item->set_active (true);
fooc.block (false);
}
items.push_back (SeparatorElem());
@ -2720,6 +2739,8 @@ Editor::map_transport_state ()
if (session->transport_stopped()) {
have_pending_keyboard_selection = false;
}
update_loop_range_view (true);
}
/* UNDO/REDO */
@ -2831,32 +2852,34 @@ Editor::history_changed ()
void
Editor::duplicate_dialog (bool dup_region)
{
if (dup_region) {
if (clicked_regionview == 0) {
return;
}
} else {
if (selection->time.length() == 0) {
return;
}
if (selection->regions.empty() && (selection->time.length() == 0)) {
return;
}
ArdourDialog win ("duplicate dialog");
Entry entry;
Label label (_("Duplicate how many times?"));
Adjustment adjustment (1.0, 1.0, 1000000.0, 1.0, 5.0);
SpinButton spinner (adjustment);
win.get_vbox()->set_spacing (12);
win.get_vbox()->pack_start (label);
win.add_action_widget (entry, RESPONSE_ACCEPT);
/* dialogs have ::add_action_widget() but that puts the spinner in the wrong
place, visually. so do this by hand.
*/
win.get_vbox()->pack_start (spinner);
spinner.signal_activate().connect (sigc::bind (mem_fun (win, &ArdourDialog::response), RESPONSE_ACCEPT));
label.show ();
spinner.show ();
win.add_button (Stock::OK, RESPONSE_ACCEPT);
win.add_button (Stock::CANCEL, RESPONSE_CANCEL);
win.set_position (WIN_POS_MOUSE);
entry.set_text ("1");
set_size_request_to_display_given_text (entry, X_("12345678"), 20, 15);
entry.select_region (0, -1);
entry.grab_focus ();
spinner.grab_focus ();
switch (win.run ()) {
case RESPONSE_ACCEPT:
@ -2865,17 +2888,12 @@ Editor::duplicate_dialog (bool dup_region)
return;
}
string text = entry.get_text();
float times;
float times = adjustment.get_value();
if (sscanf (text.c_str(), "%f", &times) == 1) {
if (dup_region) {
RegionSelection regions;
regions.add (clicked_regionview);
duplicate_some_regions (regions, times);
} else {
duplicate_selection (times);
}
if (!selection->regions.empty()) {
duplicate_some_regions (selection->regions, times);
} else {
duplicate_selection (times);
}
}
@ -3032,7 +3050,7 @@ gint
Editor::edit_controls_button_release (GdkEventButton* ev)
{
if (Keyboard::is_context_menu_event (ev)) {
ARDOUR_UI::instance()->add_route ();
ARDOUR_UI::instance()->add_route (this);
}
return TRUE;
}
@ -3181,7 +3199,6 @@ Editor::set_show_measures (bool yn)
if ((_show_measures = yn) == true) {
draw_measures ();
}
DisplayControlChanged (ShowMeasures);
instant_save ();
}
}
@ -3204,7 +3221,6 @@ Editor::set_follow_playhead (bool yn)
/* catch up */
update_current_screen ();
}
DisplayControlChanged (FollowPlayhead);
instant_save ();
}
}
@ -3290,7 +3306,7 @@ Editor::playlist_deletion_dialog (boost::shared_ptr<Playlist> pl)
label.show ();
dialog.add_button (_("Delete playlist"), RESPONSE_ACCEPT);
dialog.add_button (_("Keep playlist"), RESPONSE_CANCEL);
dialog.add_button (_("Keep playlist"), RESPONSE_REJECT);
dialog.add_button (_("Cancel"), RESPONSE_CANCEL);
switch (dialog.run ()) {
@ -3374,6 +3390,9 @@ Editor::control_layout_scroll (GdkEventScroll* ev)
return false;
}
/** A new snapshot has been selected.
*/
void
Editor::snapshot_display_selection_changed ()
{
@ -3398,7 +3417,93 @@ Editor::snapshot_display_selection_changed ()
bool
Editor::snapshot_display_button_press (GdkEventButton* ev)
{
return false;
if (ev->button == 3) {
/* Right-click on the snapshot list. Work out which snapshot it
was over. */
Gtk::TreeModel::Path path;
Gtk::TreeViewColumn* col;
int cx;
int cy;
snapshot_display.get_path_at_pos ((int) ev->x, (int) ev->y, path, col, cx, cy);
Gtk::TreeModel::iterator iter = snapshot_display_model->get_iter (path);
if (iter) {
Gtk::TreeModel::Row row = *iter;
popup_snapshot_context_menu (ev->button, ev->time, row[snapshot_display_columns.real_name]);
}
return true;
}
return false;
}
/** Pop up the snapshot display context menu.
* @param button Button used to open the menu.
* @param time Menu open time.
* @snapshot_name Name of the snapshot that the menu click was over.
*/
void
Editor::popup_snapshot_context_menu (int button, int32_t time, Glib::ustring snapshot_name)
{
using namespace Menu_Helpers;
MenuList& items (snapshot_context_menu.items());
items.clear ();
const bool modification_allowed = (session->snap_name() != snapshot_name && session->name() != snapshot_name);
items.push_back (MenuElem (_("Remove"), bind (mem_fun (*this, &Editor::remove_snapshot), snapshot_name)));
if (!modification_allowed) {
items.back().set_sensitive (false);
}
items.push_back (MenuElem (_("Rename"), bind (mem_fun (*this, &Editor::rename_snapshot), snapshot_name)));
if (!modification_allowed) {
items.back().set_sensitive (false);
}
snapshot_context_menu.popup (button, time);
}
void
Editor::rename_snapshot (Glib::ustring old_name)
{
ArdourPrompter prompter(true);
string new_name;
prompter.set_name ("Prompter");
prompter.add_button (Gtk::Stock::SAVE, Gtk::RESPONSE_ACCEPT);
prompter.set_prompt (_("New name of snapshot"));
prompter.set_initial_text (old_name);
if (prompter.run() == RESPONSE_ACCEPT) {
prompter.get_result (new_name);
if (new_name.length()) {
session->rename_state (old_name, new_name);
redisplay_snapshots ();
}
}
}
void
Editor::remove_snapshot (Glib::ustring name)
{
vector<string> choices;
std::string prompt = string_compose (_("Do you really want to remove snapshot \"%1\" ?\n(cannot be undone)"), name);
choices.push_back (_("No, do nothing."));
choices.push_back (_("Yes, remove it."));
Gtkmm2ext::Choice prompter (prompt, choices);
if (prompter.run () == 1) {
session->remove_state (name);
redisplay_snapshots ();
}
}
void
@ -3667,7 +3772,7 @@ Editor::idle_visual_changer ()
/* the signal handler will do the rest */
} else {
update_fixed_rulers();
tempo_map_changed (Change (0), true);
redisplay_tempo (true);
}
}
@ -3687,3 +3792,12 @@ Editor::sort_track_selection ()
selection->tracks.sort (cmp);
}
nframes_t
Editor::edit_cursor_position(bool sync)
{
if (sync && edit_cursor->current_frame != edit_cursor_clock.current_time()) {
edit_cursor_clock.set(edit_cursor->current_frame, true);
}
return edit_cursor->current_frame;
}

View file

@ -15,7 +15,6 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
$Id$
*/
#ifndef __ardour_editor_h__
@ -61,10 +60,6 @@ namespace Gtkmm2ext {
class TearOff;
}
namespace LinuxAudioSystems {
class AudioEngine;
}
namespace ARDOUR {
class AudioDiskstream;
class RouteGroup;
@ -122,7 +117,7 @@ class TimeAxisViewItem ;
class Editor : public PublicEditor
{
public:
Editor (ARDOUR::AudioEngine&);
Editor ();
~Editor ();
void connect_to_session (ARDOUR::Session *);
@ -147,11 +142,11 @@ class Editor : public PublicEditor
void step_mouse_mode (bool next);
Editing::MouseMode current_mouse_mode () { return mouse_mode; }
void add_imageframe_time_axis(const string & track_name, void*) ;
void add_imageframe_marker_time_axis(const string & track_name, TimeAxisView* marked_track, void*) ;
void add_imageframe_time_axis(const std::string & track_name, void*) ;
void add_imageframe_marker_time_axis(const std::string & track_name, TimeAxisView* marked_track, void*) ;
void connect_to_image_compositor() ;
void scroll_timeaxis_to_imageframe_item(const TimeAxisViewItem* item) ;
TimeAxisView* get_named_time_axis(const string & name) ;
TimeAxisView* get_named_time_axis(const std::string & name) ;
void consider_auditioning (boost::shared_ptr<ARDOUR::Region>);
void hide_a_region (boost::shared_ptr<ARDOUR::Region>);
@ -340,6 +335,8 @@ class Editor : public PublicEditor
void reset_zoom (double);
void reposition_and_zoom (nframes_t, double);
nframes_t edit_cursor_position(bool);
protected:
void map_transport_state ();
void map_position_change (nframes_t);
@ -349,7 +346,6 @@ class Editor : public PublicEditor
private:
ARDOUR::Session *session;
ARDOUR::AudioEngine& engine;
bool constructed;
PlaylistSelector* _playlist_selector;
@ -441,6 +437,7 @@ class Editor : public PublicEditor
void catch_vanishing_regionview (RegionView *);
bool set_selected_track (TimeAxisView&, Selection::Operation op = Selection::Set, bool no_remove=false);
void select_all_tracks ();
bool set_selected_control_point_from_click (Selection::Operation op = Selection::Set, bool no_remove=false);
bool set_selected_track_from_click (bool press, Selection::Operation op = Selection::Set, bool no_remove=false);
@ -504,6 +501,7 @@ class Editor : public PublicEditor
Gtk::EventBox time_canvas_event_box;
Gtk::EventBox track_canvas_event_box;
Gtk::EventBox time_button_event_box;
Gtk::Frame time_button_frame;
ArdourCanvas::Group *minsec_group;
ArdourCanvas::Group *bbt_group;
@ -560,6 +558,7 @@ class Editor : public PublicEditor
gint metric_get_frames (GtkCustomRulerMark **, gdouble, gdouble, gint);
gint metric_get_minsec (GtkCustomRulerMark **, gdouble, gdouble, gint);
Gtk::Widget *_ruler_separator;
GtkWidget *_smpte_ruler;
GtkWidget *_bbt_ruler;
GtkWidget *_frames_ruler;
@ -608,7 +607,7 @@ class Editor : public PublicEditor
nframes_t current_frame;
double length;
Cursor (Editor&, const string& color, bool (Editor::*)(GdkEvent*,ArdourCanvas::Item*));
Cursor (Editor&, bool (Editor::*)(GdkEvent*,ArdourCanvas::Item*));
~Cursor ();
void set_position (nframes_t);
@ -771,10 +770,12 @@ class Editor : public PublicEditor
SnapshotDisplayModelColumns snapshot_display_columns;
Glib::RefPtr<Gtk::ListStore> snapshot_display_model;
Gtk::TreeView snapshot_display;
Gtk::Menu snapshot_context_menu;
bool snapshot_display_button_press (GdkEventButton*);
void snapshot_display_selection_changed ();
void redisplay_snapshots();
void popup_snapshot_context_menu (int, int32_t, Glib::ustring);
/* named selections */
@ -796,6 +797,8 @@ class Editor : public PublicEditor
void create_named_selection ();
void paste_named_selection (float times);
void remove_selected_named_selections ();
void remove_snapshot (Glib::ustring);
void rename_snapshot (Glib::ustring);
void handle_new_named_selection ();
void add_named_selection_to_named_selection_display (ARDOUR::NamedSelection&);
@ -806,7 +809,6 @@ class Editor : public PublicEditor
void named_selection_display_selection_changed ();
/* track views */
int track_spacing;
TrackViewList track_views;
TimeAxisView *trackview_by_y_position (double ypos);
@ -1169,9 +1171,13 @@ class Editor : public PublicEditor
bool canvas_playhead_cursor_event (GdkEvent* event, ArdourCanvas::Item*);
bool canvas_edit_cursor_event (GdkEvent* event, ArdourCanvas::Item*);
bool track_canvas_event (GdkEvent* event, ArdourCanvas::Item*);
bool track_canvas_scroll (GdkEventScroll* event);
bool track_canvas_scroll_event (GdkEventScroll* event);
bool track_canvas_button_press_event (GdkEventButton* event);
bool track_canvas_button_release_event (GdkEventButton* event);
bool track_canvas_motion_notify_event (GdkEventMotion* event);
Gtk::Allocation canvas_allocation;
bool canvas_idle_queued;
void track_canvas_allocate (Gtk::Allocation alloc);
@ -1242,6 +1248,7 @@ class Editor : public PublicEditor
void marker_menu_hide ();
void marker_menu_loop_range ();
void marker_menu_select_all_selectables_using_range ();
void marker_menu_select_using_range ();
void marker_menu_separate_regions_using_location ();
void marker_menu_play_from ();
void marker_menu_play_range ();
@ -1276,8 +1283,8 @@ class Editor : public PublicEditor
void remove_metric_marks ();
void draw_metric_marks (const ARDOUR::Metrics& metrics);
void tempo_map_changed (ARDOUR::Change, bool immediate_redraw);
void redisplay_tempo ();
void tempo_map_changed (ARDOUR::Change);
void redisplay_tempo (bool immediate_redraw);
void snap_to (nframes_t& first, int32_t direction = 0, bool for_mark = false);
uint32_t bbt_beat_subdivision;

View file

@ -430,7 +430,7 @@ Editor::toggle_waveform_visibility ()
void
Editor::toggle_waveforms_while_recording ()
{
Glib::RefPtr<Action> act = ActionManager::get_action (X_("Editor"), X_("ToggleWaveformVisibility"));
Glib::RefPtr<Action> act = ActionManager::get_action (X_("Editor"), X_("ToggleWaveformsWhileRecording"));
if (act) {
Glib::RefPtr<ToggleAction> tact = Glib::RefPtr<ToggleAction>::cast_dynamic(act);
set_show_waveforms_recording (tact->get_active());

View file

@ -15,13 +15,19 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
$Id$
*/
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
#include <unistd.h>
#include <pbd/pthread_utils.h>
#include <pbd/basename.h>
#include <pbd/shortpath.h>
#include <gtkmm2ext/choice.h>
#include <gtkmm2ext/window_title.h>
#include <ardour/session.h>
#include <ardour/audioplaylist.h>
@ -49,6 +55,7 @@ using namespace ARDOUR;
using namespace PBD;
using namespace sigc;
using namespace Gtk;
using namespace Gtkmm2ext;
using namespace Editing;
using Glib::ustring;
@ -170,7 +177,7 @@ Editor::do_embed (vector<ustring> paths, bool split, ImportMode mode, AudioTrack
to_embed.size() > 2 ? _("multichannel") : _("stereo")));
choices.push_back (_("Import as multiple regions"));
Gtkmm2ext::Choice chooser (string_compose (_("Paired files detected (%1, %2 ...).\nDo you want to:"),
Choice chooser (string_compose (_("Paired files detected (%1, %2 ...).\nDo you want to:"),
to_embed[0],
to_embed[1]),
choices);
@ -216,7 +223,9 @@ Editor::do_embed (vector<ustring> paths, bool split, ImportMode mode, AudioTrack
int
Editor::import_sndfile (vector<ustring> paths, ImportMode mode, AudioTrack* track, nframes_t& pos)
{
interthread_progress_window->set_title (string_compose (_("ardour: importing %1"), paths.front()));
WindowTitle title = string_compose (_("importing %1"), paths.front());
interthread_progress_window->set_title (title.get_string());
interthread_progress_window->set_position (Gtk::WIN_POS_MOUSE);
interthread_progress_window->show_all ();
interthread_progress_bar.set_fraction (0.0f);
@ -246,6 +255,8 @@ Editor::import_sndfile (vector<ustring> paths, ImportMode mode, AudioTrack* trac
gtk_main_iteration ();
}
interthread_progress_window->hide ();
import_status.done = true;
interthread_progress_connection.disconnect ();
@ -296,6 +307,21 @@ Editor::embed_sndfile (vector<Glib::ustring> paths, bool split, bool multiple_fi
*/
path = linked_path;
} else {
/* one possible reason is that its already linked */
if (errno == EEXIST) {
struct stat sb;
if (stat (linked_path.c_str(), &sb) == 0) {
if (sb.st_nlink > 1) { // its a hard link, assume its the one we want
path = linked_path;
}
}
}
}
/* note that we temporarily truncated _id at the colon */
@ -369,11 +395,20 @@ Editor::embed_sndfile (vector<Glib::ustring> paths, bool split, bool multiple_fi
for (int n = 0; n < finfo.channels; ++n)
{
try {
source = boost::dynamic_pointer_cast<AudioFileSource> (SourceFactory::createReadable
(*session, path, n,
(mode == ImportAsTapeTrack ?
AudioFileSource::Destructive :
AudioFileSource::Flag (0))));
/* check if we have this thing embedded already */
boost::shared_ptr<Source> s;
if ((s = session->source_by_path_and_channel (path, n)) == 0) {
source = boost::dynamic_pointer_cast<AudioFileSource> (SourceFactory::createReadable
(*session, path, n,
(mode == ImportAsTapeTrack ?
AudioFileSource::Destructive :
AudioFileSource::Flag (0))));
} else {
source = boost::dynamic_pointer_cast<AudioFileSource> (s);
}
sources.push_back(source);
}

View file

@ -45,7 +45,6 @@ Editor::set_show_waveforms (bool yn)
atv->set_show_waveforms (yn);
}
}
DisplayControlChanged (Editing::ShowWaveforms);
}
}
@ -61,6 +60,5 @@ Editor::set_show_waveforms_recording (bool yn)
atv->set_show_waveforms_recording (yn);
}
}
DisplayControlChanged (Editing::ShowWaveformsRecording);
}
}

View file

@ -15,7 +15,6 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
$Id$
*/
#include <libgnomecanvasmm/init.h>
@ -94,7 +93,13 @@ Editor::initialize_canvas ()
track_canvas.set_center_scroll_region (false);
track_canvas.set_dither (Gdk::RGB_DITHER_NONE);
track_canvas.signal_event().connect (bind (mem_fun (*this, &Editor::track_canvas_event), (ArdourCanvas::Item*) 0));
/* need to handle 4 specific types of events as catch-alls */
track_canvas.signal_scroll_event().connect (mem_fun (*this, &Editor::track_canvas_scroll_event));
track_canvas.signal_motion_notify_event().connect (mem_fun (*this, &Editor::track_canvas_motion_notify_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.set_name ("EditorMainCanvas");
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));
@ -142,33 +147,33 @@ Editor::initialize_canvas ()
range_marker_group = new ArdourCanvas::Group (*time_canvas.root(), 0.0, timebar_height * 3.0);
transport_marker_group = new ArdourCanvas::Group (*time_canvas.root(), 0.0, timebar_height * 4.0);
tempo_bar = new ArdourCanvas::SimpleRect (*tempo_group, 0.0, 0.0, max_canvas_coordinate, timebar_height);
tempo_bar = new ArdourCanvas::SimpleRect (*tempo_group, 0.0, 0.0, max_canvas_coordinate, timebar_height-1.0);
tempo_bar->property_fill_color_rgba() = color_map[cTempoBar];
tempo_bar->property_outline_pixels() = 0;
meter_bar = new ArdourCanvas::SimpleRect (*meter_group, 0.0, 0.0, max_canvas_coordinate, timebar_height);
meter_bar = new ArdourCanvas::SimpleRect (*meter_group, 0.0, 0.0, max_canvas_coordinate, timebar_height-1.0);
meter_bar->property_fill_color_rgba() = color_map[cMeterBar];
meter_bar->property_outline_pixels() = 0;
marker_bar = new ArdourCanvas::SimpleRect (*marker_group, 0.0, 0.0, max_canvas_coordinate, timebar_height);
marker_bar = new ArdourCanvas::SimpleRect (*marker_group, 0.0, 0.0, max_canvas_coordinate, timebar_height-1.0);
marker_bar->property_fill_color_rgba() = color_map[cMarkerBar];
marker_bar->property_outline_pixels() = 0;
range_marker_bar = new ArdourCanvas::SimpleRect (*range_marker_group, 0.0, 0.0, max_canvas_coordinate, timebar_height);
range_marker_bar = new ArdourCanvas::SimpleRect (*range_marker_group, 0.0, 0.0, max_canvas_coordinate, timebar_height-1.0);
range_marker_bar->property_fill_color_rgba() = color_map[cRangeMarkerBar];
range_marker_bar->property_outline_pixels() = 0;
transport_marker_bar = new ArdourCanvas::SimpleRect (*transport_marker_group, 0.0, 0.0, max_canvas_coordinate, timebar_height);
transport_marker_bar = new ArdourCanvas::SimpleRect (*transport_marker_group, 0.0, 0.0, max_canvas_coordinate, timebar_height-1.0);
transport_marker_bar->property_fill_color_rgba() = color_map[cTransportMarkerBar];
transport_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);
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_fill_color_rgba() = color_map[cRangeDragBarRectFill];
range_bar_drag_rect->property_outline_color_rgba() = color_map[cRangeDragBarRect];
range_bar_drag_rect->property_outline_pixels() = 0;
range_bar_drag_rect->hide ();
transport_bar_drag_rect = new ArdourCanvas::SimpleRect (*transport_marker_group, 0.0, 0.0, max_canvas_coordinate, timebar_height);
transport_bar_drag_rect = new ArdourCanvas::SimpleRect (*transport_marker_group, 0.0, 0.0, max_canvas_coordinate, timebar_height-1.0);
transport_bar_drag_rect ->property_fill_color_rgba() = color_map[cTransportDragRectFill];
transport_bar_drag_rect->property_outline_color_rgba() = color_map[cTransportDragRect];
transport_bar_drag_rect->property_outline_pixels() = 0;
@ -264,8 +269,20 @@ Editor::initialize_canvas ()
double time_width = FLT_MAX/frames_per_unit;
time_canvas.set_scroll_region(0.0, 0.0, time_width, time_height);
edit_cursor = new Cursor (*this, "blue", &Editor::canvas_edit_cursor_event);
playhead_cursor = new Cursor (*this, "red", &Editor::canvas_playhead_cursor_event);
if (!color_map[cEditCursor]) {
warning << _("edit cursor color not defined, check your ardour.colors file!") << endmsg;
color_map[cEditCursor] = RGBA_TO_UINT (30,30,30,255);
}
if (!color_map[cPlayHead]) {
warning << _("playhead color not defined, check your ardour.colors file!") << endmsg;
color_map[cPlayHead] = RGBA_TO_UINT (0,0,0,255);
}
edit_cursor = new Cursor (*this, &Editor::canvas_edit_cursor_event);
edit_cursor->canvas_item.property_fill_color_rgba() = color_map[cEditCursor];
playhead_cursor = new Cursor (*this, &Editor::canvas_playhead_cursor_event);
playhead_cursor->canvas_item.property_fill_color_rgba() = color_map[cPlayHead];
initial_ruler_update_required = true;
track_canvas.signal_size_allocate().connect (mem_fun(*this, &Editor::track_canvas_allocate));
@ -310,14 +327,9 @@ Editor::track_canvas_size_allocated ()
for (i = track_views.begin(); i != track_views.end(); ++i) {
if ((*i)->control_parent) {
height += (*i)->effective_height;
height += track_spacing;
}
}
if (height) {
height -= track_spacing;
}
full_canvas_height = height;
}
@ -362,7 +374,7 @@ Editor::track_canvas_size_allocated ()
}
update_fixed_rulers();
tempo_map_changed (Change (0), true);
redisplay_tempo (true);
Resized (); /* EMIT_SIGNAL */
@ -380,7 +392,6 @@ Editor::reset_scrolling_region (Gtk::Allocation* alloc)
TimeAxisView *tv = (*i)[route_display_columns.tv];
if (tv != 0 && !tv->hidden()) {
pos += tv->effective_height;
pos += track_spacing;
}
}
@ -405,7 +416,6 @@ Editor::controls_layout_size_request (Requisition* req)
TimeAxisView *tv = (*i)[route_display_columns.tv];
if (tv != 0) {
pos += tv->effective_height;
pos += track_spacing;
}
}
@ -719,6 +729,6 @@ Editor::canvas_horizontally_scrolled ()
update_fixed_rulers ();
tempo_map_changed (Change (0), !_dragging_hscrollbar);
redisplay_tempo (!_dragging_hscrollbar);
}

View file

@ -15,16 +15,18 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
$Id$
*/
#include <cstdlib>
#include <cmath>
#include <pbd/stacktrace.h>
#include <ardour/audio_diskstream.h>
#include <ardour/audioplaylist.h>
#include "editor.h"
#include "keyboard.h"
#include "public_editor.h"
#include "audio_region_view.h"
#include "audio_streamview.h"
@ -71,7 +73,7 @@ Editor::track_canvas_scroll (GdkEventScroll* ev)
event.button.y = wy;
nframes_t where = event_frame (&event, 0, 0);
temporal_zoom_to_frame (true, where);
temporal_zoom_to_frame (false, where);
return true;
} else if (Keyboard::modifier_state_equals (ev->state, Keyboard::Shift)) {
if (!current_stepping_trackview) {
@ -102,7 +104,7 @@ Editor::track_canvas_scroll (GdkEventScroll* ev)
event.button.y = wy;
nframes_t where = event_frame (&event, 0, 0);
temporal_zoom_to_frame (false, where);
temporal_zoom_to_frame (true, where);
return true;
} else if (Keyboard::modifier_state_equals (ev->state, Keyboard::Shift)) {
if (!current_stepping_trackview) {
@ -129,43 +131,36 @@ Editor::track_canvas_scroll (GdkEventScroll* ev)
}
bool
Editor::track_canvas_event (GdkEvent *event, ArdourCanvas::Item* item)
Editor::track_canvas_scroll_event (GdkEventScroll *event)
{
gint x, y;
track_canvas.grab_focus();
track_canvas_scroll (event);
return false;
}
/* this is the handler for events that are not handled by
items.
*/
bool
Editor::track_canvas_button_press_event (GdkEventButton *event)
{
track_canvas.grab_focus();
return false;
}
switch (event->type) {
case GDK_MOTION_NOTIFY:
/* keep those motion events coming */
track_canvas.get_pointer (x, y);
return track_canvas_motion (event);
case GDK_BUTTON_PRESS:
track_canvas.grab_focus();
break;
case GDK_BUTTON_RELEASE:
switch (event->button.button) {
case 4:
case 5:
button_release_handler (item, event, NoItem);
break;
}
break;
case GDK_SCROLL:
track_canvas.grab_focus();
track_canvas_scroll (&event->scroll);
break;
default:
break;
bool
Editor::track_canvas_button_release_event (GdkEventButton *event)
{
if (drag_info.item) {
end_grab (drag_info.item, (GdkEvent*) event);
}
return false;
}
return FALSE;
bool
Editor::track_canvas_motion_notify_event (GdkEventMotion *event)
{
int x, y;
/* keep those motion events coming */
track_canvas.get_pointer (x, y);
return false;
}
bool
@ -214,7 +209,12 @@ Editor::typed_event (ArdourCanvas::Item* item, GdkEvent *event, ItemType type)
bool
Editor::canvas_region_view_event (GdkEvent *event, ArdourCanvas::Item* item, RegionView *rv)
{
gint ret = FALSE;
bool ret = false;
if (!rv->sensitive ()) {
return false;
}
switch (event->type) {
case GDK_BUTTON_PRESS:
@ -291,6 +291,7 @@ Editor::canvas_automation_track_event (GdkEvent *event, ArdourCanvas::Item* item
{
bool ret = false;
switch (event->type) {
case GDK_BUTTON_PRESS:
case GDK_2BUTTON_PRESS:
@ -330,6 +331,10 @@ Editor::canvas_fade_in_event (GdkEvent *event, ArdourCanvas::Item* item, AudioRe
{
/* we handle only button 3 press/release events */
if (!rv->sensitive()) {
return false;
}
switch (event->type) {
case GDK_BUTTON_PRESS:
clicked_regionview = rv;
@ -362,6 +367,10 @@ Editor::canvas_fade_in_handle_event (GdkEvent *event, ArdourCanvas::Item* item,
{
bool ret = false;
if (!rv->sensitive()) {
return false;
}
switch (event->type) {
case GDK_BUTTON_PRESS:
case GDK_2BUTTON_PRESS:
@ -401,6 +410,10 @@ Editor::canvas_fade_out_event (GdkEvent *event, ArdourCanvas::Item* item, AudioR
{
/* we handle only button 3 press/release events */
if (!rv->sensitive()) {
return false;
}
switch (event->type) {
case GDK_BUTTON_PRESS:
clicked_regionview = rv;
@ -433,6 +446,10 @@ Editor::canvas_fade_out_handle_event (GdkEvent *event, ArdourCanvas::Item* item,
{
bool ret = false;
if (!rv->sensitive()) {
return false;
}
switch (event->type) {
case GDK_BUTTON_PRESS:
case GDK_2BUTTON_PRESS:
@ -499,6 +516,11 @@ Editor::canvas_crossfade_view_event (GdkEvent* event, ArdourCanvas::Item* item,
}
/* XXX do not forward double clicks */
if (event->type == GDK_2BUTTON_PRESS) {
return false;
}
/* proxy for the upper most regionview */
@ -524,10 +546,10 @@ Editor::canvas_crossfade_view_event (GdkEvent* event, ArdourCanvas::Item* item,
RegionView* rv = atv->view()->find_view (rl->front());
/* proxy */
delete rl;
/* proxy */
return canvas_region_view_event (event, rv->get_canvas_group(), rv);
}
}
@ -703,6 +725,10 @@ Editor::canvas_region_view_name_highlight_event (GdkEvent* event, ArdourCanvas::
{
bool ret = false;
if (!rv->sensitive()) {
return false;
}
switch (event->type) {
case GDK_BUTTON_PRESS:
case GDK_2BUTTON_PRESS:
@ -739,6 +765,10 @@ Editor::canvas_region_view_name_event (GdkEvent *event, ArdourCanvas::Item* item
{
bool ret = false;
if (!rv->sensitive()) {
return false;
}
switch (event->type) {
case GDK_BUTTON_PRESS:
case GDK_2BUTTON_PRESS:

View file

@ -15,7 +15,6 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
$Id$
*/
#include <cstdlib>
@ -31,7 +30,7 @@ using namespace ARDOUR;
using namespace PBD;
using namespace Gtk;
Editor::Cursor::Cursor (Editor& ed, const string& color, bool (Editor::*callbck)(GdkEvent*,ArdourCanvas::Item*))
Editor::Cursor::Cursor (Editor& ed, bool (Editor::*callbck)(GdkEvent*,ArdourCanvas::Item*))
: editor (ed),
canvas_item (*editor.cursor_group),
length(1.0)
@ -43,7 +42,6 @@ Editor::Cursor::Cursor (Editor& ed, const string& color, bool (Editor::*callbck)
points.push_back(Gnome::Art::Point(1.0, 0.0));
canvas_item.property_points() = points;
canvas_item.property_fill_color() = color; //.c_str());
canvas_item.property_width_pixels() = 1;
canvas_item.property_first_arrowhead() = TRUE;
canvas_item.property_last_arrowhead() = TRUE;

View file

@ -15,7 +15,6 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
$Id$
*/
#include <cstdlib>

View file

@ -15,7 +15,6 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
$Id$
*/
#include <unistd.h>

View file

@ -15,7 +15,6 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
$Id$
*/
#include "editor.h"

View file

@ -16,7 +16,6 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
$Id$
*/
#include "imageframe_view.h"

View file

@ -15,7 +15,6 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
$Id$
*/
#include <ardour/audioregion.h>

View file

@ -15,7 +15,6 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
$Id$
*/
#include <cstdlib>
@ -70,7 +69,7 @@ Editor::keyboard_duplicate_region ()
return;
}
float prefix;
float prefix = 0;
bool was_floating;
if (get_prefix (prefix, was_floating) == 0) {
@ -83,7 +82,7 @@ Editor::keyboard_duplicate_region ()
void
Editor::keyboard_duplicate_selection ()
{
float prefix;
float prefix = 0;
bool was_floating;
if (get_prefix (prefix, was_floating) == 0) {
@ -96,7 +95,7 @@ Editor::keyboard_duplicate_selection ()
void
Editor::keyboard_paste ()
{
float prefix;
float prefix = 0;
bool was_floating;
if (get_prefix (prefix, was_floating) == 0) {
@ -109,7 +108,7 @@ Editor::keyboard_paste ()
void
Editor::keyboard_insert_region_list_selection ()
{
float prefix;
float prefix = 0;
bool was_floating;
if (get_prefix (prefix, was_floating) == 0) {
@ -122,6 +121,7 @@ Editor::keyboard_insert_region_list_selection ()
int
Editor::get_prefix (float& val, bool& was_floating)
{
return Keyboard::the_keyboard().get_prefix (val, was_floating);
was_floating = false;
return 1;
}

View file

@ -15,7 +15,6 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
$Id$
*/
#include <sigc++/retype.h>
@ -24,6 +23,7 @@
#include <libgnomecanvas/libgnomecanvas.h>
#include <gtkmm2ext/gtk_ui.h>
#include <gtkmm2ext/window_title.h>
#include <ardour/location.h>
#include <pbd/memento_command.h>
@ -44,6 +44,7 @@ using namespace sigc;
using namespace ARDOUR;
using namespace PBD;
using namespace Gtk;
using namespace Gtkmm2ext;
void
Editor::clear_marker_display ()
@ -511,6 +512,7 @@ Editor::build_range_marker_menu (bool loop_or_punch)
items.push_back (MenuElem (_("Separate Regions in Range"), mem_fun(*this, &Editor::marker_menu_separate_regions_using_location)));
items.push_back (MenuElem (_("Select All in Range"), mem_fun(*this, &Editor::marker_menu_select_all_selectables_using_range)));
items.push_back (MenuElem (_("Select Range"), mem_fun(*this, &Editor::marker_menu_select_using_range)));
}
@ -560,6 +562,24 @@ Editor::marker_menu_hide ()
}
}
void
Editor::marker_menu_select_using_range ()
{
Marker* marker;
if ((marker = reinterpret_cast<Marker *> (marker_menu_item->get_data ("marker"))) == 0) {
fatal << _("programming error: marker canvas item has no marker object pointer!") << endmsg;
/*NOTREACHED*/
}
Location* l;
bool is_start;
if (((l = find_location_from_marker (marker, is_start)) != 0) && (l->end() > l->start())) {
set_selection_from_range (*l);
}
}
void
Editor::marker_menu_select_all_selectables_using_range ()
{
@ -839,12 +859,15 @@ Editor::marker_menu_rename ()
dialog.set_prompt (_("New Name:"));
WindowTitle title(Glib::get_application_name());
if (loc->is_mark()) {
dialog.set_title (_("ardour: rename mark"));
title += _("Rename Mark");
} else {
dialog.set_title (_("ardour: rename range"));
title += _("Rename Range");
}
dialog.set_title(title.get_string());
dialog.set_name ("MarkRenameWindow");
dialog.set_size_request (250, -1);
dialog.set_position (Gtk::WIN_POS_MOUSE);
@ -958,8 +981,8 @@ Editor::update_loop_range_view (bool visibility)
if (visibility) {
transport_loop_range_rect->show();
}
}
else if (visibility) {
} else if (visibility) {
transport_loop_range_rect->hide();
}
}

View file

@ -15,10 +15,11 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
$Id$
*/
#include <glibmm/miscutils.h>
#include <gtkmm2ext/utils.h>
#include <gtkmm2ext/window_title.h>
#include <ardour/audioengine.h>
#include "editor.h"
@ -30,6 +31,8 @@
#include "i18n.h"
using namespace Gtkmm2ext;
void
Editor::editor_mixer_button_toggled ()
{
@ -158,10 +161,13 @@ Editor::set_selected_mixer_strip (TimeAxisView& view)
}
}
double current = 0.0;
bool currentInitialized = 0;
void
Editor::update_current_screen ()
{
if (session && engine.running()) {
if (session && session->engine().running()) {
nframes_t frame;
@ -179,6 +185,9 @@ Editor::update_current_screen ()
if (frame != last_update_frame) {
#undef CONTINUOUS_SCROLL
#ifndef CONTINUOUS_SCROLL
if (frame < leftmost_frame || frame > leftmost_frame + current_page_frames()) {
if (session->transport_speed() < 0) {
@ -194,27 +203,26 @@ Editor::update_current_screen ()
playhead_cursor->set_position (frame);
#undef CONTINUOUS_SCROLL
#ifdef CONTINUOUS_SCROLL
#else // CONTINUOUS_SCROLL
/* don't do continuous scroll till the new position is in the rightmost quarter of the
editor canvas
*/
#if 0
if (frame > leftmost_frame + (3 * current_page_frames() / 4)) {
if (frame > playhead_cursor->current_frame) {
nframes_t delta = frame - playhead_cursor->current_frame;
horizontal_adjustment.set_value (horizontal_adjustment.get_value() + (delta/frames_per_unit));
if (session->transport_speed()) {
double target = ((double)frame - (double)current_page_frames()/2.0) / frames_per_unit;
if (target <= 0.0) target = 0.0;
if ( fabs(target - current) < current_page_frames()/frames_per_unit ) {
target = (target * 0.15) + (current * 0.85);
} else {
nframes_t delta = playhead_cursor->current_frame - frame;
horizontal_adjustment.set_value (horizontal_adjustment.get_value() - (delta/frames_per_unit));
/* relax */
}
//printf("frame: %d, cpf: %d, fpu: %6.6f, current: %6.6f, target : %6.6f\n", frame, current_page_frames(), frames_per_unit, current, target );
current = target;
horizontal_adjustment.set_value ( current );
}
#else
horizontal_adjustment.set_value (frame / frames_per_unit);
#endif
playhead_cursor->set_position (frame);
#endif // CONTINUOUS_SCROLL
@ -340,7 +348,10 @@ Editor::session_going_away ()
current_mixer_strip = 0;
set_title (_("ardour: editor"));
WindowTitle title(Glib::get_application_name());
title += _("Editor");
set_title (title.get_string());
session = 0;
}

View file

@ -15,7 +15,6 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
$Id$
*/
#include <cassert>
@ -47,6 +46,7 @@
#include "rgb_macros.h"
#include <ardour/types.h>
#include <ardour/profile.h>
#include <ardour/route.h>
#include <ardour/audio_track.h>
#include <ardour/audio_diskstream.h>
@ -301,7 +301,9 @@ Editor::button_selection (ArdourCanvas::Item* item, GdkEvent* event, ItemType it
if (((mouse_mode != MouseObject) &&
(mouse_mode != MouseAudition || item_type != RegionItem) &&
(mouse_mode != MouseTimeFX || item_type != RegionItem)) ||
(mouse_mode != MouseTimeFX || item_type != RegionItem) &&
(mouse_mode != MouseRange)) ||
(event->type != GDK_BUTTON_PRESS && event->type != GDK_BUTTON_RELEASE || event->button.button > 3)) {
return;
@ -311,44 +313,63 @@ Editor::button_selection (ArdourCanvas::Item* item, GdkEvent* event, ItemType it
if ((event->button.state & Keyboard::RelevantModifierKeyMask) && event->button.button != 1) {
/* no selection action on modified button-2 or button-3 events */
/* almost no selection action on modified button-2 or button-3 events */
return;
if (item_type != RegionItem && event->button.button != 2) {
return;
}
}
}
Selection::Operation op = Keyboard::selection_type (event->button.state);
bool press = (event->type == GDK_BUTTON_PRESS);
begin_reversible_command (_("select on click"));
// begin_reversible_command (_("select on click"));
switch (item_type) {
case RegionItem:
commit = set_selected_regionview_from_click (press, op, true);
if (mouse_mode != MouseRange) {
commit = set_selected_regionview_from_click (press, op, true);
} else if (event->type == GDK_BUTTON_PRESS) {
commit = set_selected_track_from_click (press, op, false);
}
break;
case RegionViewNameHighlight:
case RegionViewName:
commit = set_selected_regionview_from_click (press, op, true);
if (mouse_mode != MouseRange) {
commit = set_selected_regionview_from_click (press, op, true);
} else if (event->type == GDK_BUTTON_PRESS) {
commit = set_selected_track_from_click (press, op, false);
}
break;
case FadeInHandleItem:
case FadeInItem:
case FadeOutHandleItem:
case FadeOutItem:
commit = set_selected_regionview_from_click (press, op, true);
if (mouse_mode != MouseRange) {
commit = set_selected_regionview_from_click (press, op, true);
} else if (event->type == GDK_BUTTON_PRESS) {
commit = set_selected_track_from_click (press, op, false);
}
break;
case GainAutomationControlPointItem:
case PanAutomationControlPointItem:
case RedirectAutomationControlPointItem:
commit = set_selected_control_point_from_click (op, false);
commit = set_selected_track_from_click (press, op, true);
if (mouse_mode != MouseRange) {
commit |= set_selected_control_point_from_click (op, false);
}
break;
case StreamItem:
/* for context click or range selection, select track */
if (event->button.button == 3) {
/* for context click, select track */
commit = set_selected_track_from_click (press, op, true);
} else if (event->type == GDK_BUTTON_PRESS && mouse_mode == MouseRange) {
commit = set_selected_track_from_click (press, op, false);
}
break;
@ -360,36 +381,14 @@ Editor::button_selection (ArdourCanvas::Item* item, GdkEvent* event, ItemType it
break;
}
#define SELECT_TRACK_FROM_CANVAS_IN_RANGE_MODE
#ifdef SELECT_TRACK_FROM_CANVAS_IN_RANGE_MODE
/* in range mode, button 1/2/3 press potentially selects a track */
if (mouse_mode == MouseRange &&
event->type == GDK_BUTTON_PRESS &&
event->button.button <= 3) {
switch (item_type) {
case StreamItem:
case RegionItem:
case AutomationTrackItem:
commit = set_selected_track_from_click (true, op, true);
break;
default:
break;
}
}
#endif
if (commit) {
commit_reversible_command ();
}
// if (commit) {
// commit_reversible_command ();
// }
}
bool
Editor::button_press_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType item_type)
{
nframes_t where = event_frame (event, 0, 0);
track_canvas.grab_focus();
if (session && session->actively_recording()) {
@ -747,79 +746,6 @@ Editor::button_press_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemTyp
case 3:
break;
case 4:
switch (mouse_mode) {
case MouseZoom:
//temporal_zoom_to_frame (true, where);
if (Keyboard::modifier_state_equals (event->button.state, Keyboard::Control)) {
temporal_zoom_to_frame (true, where);
}
else {
temporal_zoom_step (true);
}
break;
default:
if (Keyboard::modifier_state_contains (event->button.state, Keyboard::ModifierMask(Keyboard::Alt))) {
scroll_backward (0.6f);
return true;
}
else if (Keyboard::no_modifier_keys_pressed (&event->button)) {
scroll_tracks_up_line ();
} else {
if (Keyboard::modifier_state_equals (event->button.state, Keyboard::Shift)) {
if (clicked_trackview) {
if (!current_stepping_trackview) {
step_timeout = Glib::signal_timeout().connect (mem_fun(*this, &Editor::track_height_step_timeout), 500);
current_stepping_trackview = clicked_trackview;
}
gettimeofday (&last_track_height_step_timestamp, 0);
current_stepping_trackview->step_height (true);
}
}
else if (Keyboard::modifier_state_equals (event->button.state, Keyboard::Control)) {
temporal_zoom_to_frame (true, where);
}
}
}
break;
case 5:
switch (mouse_mode) {
case MouseZoom:
// temporal_zoom_to_frame (false, where);
if (Keyboard::modifier_state_equals (event->button.state, Keyboard::Control)) {
temporal_zoom_to_frame (false, where);
}
else {
temporal_zoom_step (false);
}
break;
default:
if (Keyboard::modifier_state_contains (event->button.state, Keyboard::ModifierMask(Keyboard::Alt))) {
scroll_forward (0.6f);
return true;
}
else if (Keyboard::no_modifier_keys_pressed (&event->button)) {
scroll_tracks_down_line ();
} else {
if (Keyboard::modifier_state_equals (event->button.state, Keyboard::Shift)) {
if (clicked_trackview) {
if (!current_stepping_trackview) {
step_timeout = Glib::signal_timeout().connect (mem_fun(*this, &Editor::track_height_step_timeout), 500);
current_stepping_trackview = clicked_trackview;
}
gettimeofday (&last_track_height_step_timestamp, 0);
current_stepping_trackview->step_height (false);
}
} else if (Keyboard::modifier_state_equals (event->button.state, Keyboard::Control)) {
temporal_zoom_to_frame (false, where);
}
}
}
break;
default:
break;
@ -1061,8 +987,10 @@ Editor::button_release_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemT
case MouseGain:
// Gain only makes sense for audio regions
if ( ! dynamic_cast<AudioRegionView*>(clicked_regionview))
if (!dynamic_cast<AudioRegionView*>(clicked_regionview)) {
break;
}
switch (item_type) {
case RegionItem:
@ -1176,23 +1104,25 @@ Editor::enter_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType item_
case GainAutomationControlPointItem:
case PanAutomationControlPointItem:
case RedirectAutomationControlPointItem:
cp = static_cast<ControlPoint*>(item->get_data ("control_point"));
cp->set_visible (true);
if (mouse_mode == MouseGain || mouse_mode == MouseObject) {
cp = static_cast<ControlPoint*>(item->get_data ("control_point"));
cp->set_visible (true);
double at_x, at_y;
at_x = cp->get_x();
at_y = cp->get_y ();
cp->item->i2w (at_x, at_y);
at_x += 20.0;
at_y += 20.0;
double at_x, at_y;
at_x = cp->get_x();
at_y = cp->get_y ();
cp->item->i2w (at_x, at_y);
at_x += 20.0;
at_y += 20.0;
fraction = 1.0 - (cp->get_y() / cp->line.height());
fraction = 1.0 - (cp->get_y() / cp->line.height());
set_verbose_canvas_cursor (cp->line.get_verbose_cursor_string (fraction), at_x, at_y);
show_verbose_canvas_cursor ();
set_verbose_canvas_cursor (cp->line.get_verbose_cursor_string (fraction), at_x, at_y);
show_verbose_canvas_cursor ();
if (is_drawable()) {
track_canvas.get_window()->set_cursor (*fader_cursor);
if (is_drawable()) {
track_canvas.get_window()->set_cursor (*fader_cursor);
}
}
break;
@ -1210,13 +1140,15 @@ Editor::enter_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType item_
case GainAutomationLineItem:
case RedirectAutomationLineItem:
case PanAutomationLineItem:
{
ArdourCanvas::Line *line = dynamic_cast<ArdourCanvas::Line *> (item);
if (line)
line->property_fill_color_rgba() = color_map[cEnteredAutomationLine];
}
if (is_drawable()) {
track_canvas.get_window()->set_cursor (*fader_cursor);
if (mouse_mode == MouseGain || mouse_mode == MouseObject) {
{
ArdourCanvas::Line *line = dynamic_cast<ArdourCanvas::Line *> (item);
if (line)
line->property_fill_color_rgba() = color_map[cEnteredAutomationLine];
}
if (is_drawable()) {
track_canvas.get_window()->set_cursor (*fader_cursor);
}
}
break;
@ -1517,7 +1449,10 @@ Editor::motion_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType item
*/
if (!drag_info.move_threshold_passed) {
drag_info.move_threshold_passed = (abs ((int) (drag_info.current_pointer_x - drag_info.grab_x)) > 4);
bool x_threshold_passed = (abs ((int) (drag_info.current_pointer_x - drag_info.grab_x)) > 4);
bool y_threshold_passed = (abs ((int) (drag_info.current_pointer_y - drag_info.grab_y)) > 4);
drag_info.move_threshold_passed = (x_threshold_passed || y_threshold_passed);
// and change the initial grab loc/frame if this drag info wants us to
@ -1685,6 +1620,7 @@ Editor::end_grab (ArdourCanvas::Item* item, GdkEvent* event)
stop_canvas_autoscroll ();
if (drag_info.item == 0) {
cerr << "end grab with no item\n";
return false;
}
@ -1992,6 +1928,10 @@ Editor::start_cursor_grab (ArdourCanvas::Item* item, GdkEvent* event)
if (session && drag_info.was_rolling) {
session->request_stop ();
}
if (session && session->is_auditioning()) {
session->cancel_audition ();
}
}
drag_info.pointer_frame_offset = drag_info.grab_frame - cursor->current_frame;
@ -2827,61 +2767,29 @@ Editor::region_drag_motion_callback (ArdourCanvas::Item* item, GdkEvent* event)
drag_info.want_move_threshold = false; // don't copy again
/* this is committed in the grab finished callback. */
begin_reversible_command (_("Drag region copy"));
/* duplicate the region(s) */
vector<RegionView*> new_regionviews;
set<boost::shared_ptr<Playlist> > affected_playlists;
pair<set<boost::shared_ptr<Playlist> >::iterator,bool> insert_result;
for (list<RegionView*>::const_iterator i = selection->regions.by_layer().begin(); i != selection->regions.by_layer().end(); ++i) {
RegionView* rv;
RegionView* nrv;
AudioRegionView* arv;
rv = (*i);
boost::shared_ptr<Playlist> to_playlist = rv->region()->playlist();
RouteTimeAxisView* atv = dynamic_cast<RouteTimeAxisView*>(&rv->get_time_axis_view());
insert_result = affected_playlists.insert (to_playlist);
if (insert_result.second) {
session->add_command (new MementoCommand<Playlist>(*to_playlist, &to_playlist->get_state(), 0));
if ((arv = dynamic_cast<AudioRegionView*>(rv)) == 0) {
/* XXX handle MIDI here */
continue;
}
latest_regionview = 0;
nrv = new AudioRegionView (*arv);
nrv->get_canvas_group()->show ();
sigc::connection c = atv->view()->RegionViewAdded.connect (mem_fun(*this, &Editor::collect_new_region_view));
/* create a new region with the same name. */
// FIXME: ew. need a (virtual) Region::duplicate() or something?
boost::shared_ptr<Region> newregion;
boost::shared_ptr<Region> ar;
if ((ar = boost::dynamic_pointer_cast<AudioRegion>(rv->region())) != 0) {
newregion = RegionFactory::create (ar);
}
assert(newregion != 0);
/* if the original region was locked, we don't care */
newregion->set_locked (false);
to_playlist->add_region (newregion, (nframes_t) (rv->region()->position() * atv->get_diskstream()->speed()));
c.disconnect ();
if (latest_regionview) {
new_regionviews.push_back (latest_regionview);
}
new_regionviews.push_back (nrv);
}
if (new_regionviews.empty()) {
return;
}
@ -2893,6 +2801,7 @@ Editor::region_drag_motion_callback (ArdourCanvas::Item* item, GdkEvent* event)
/* reset drag_info data to reflect the fact that we are dragging the copies */
drag_info.data = new_regionviews.front();
swap_grab (new_regionviews.front()->get_canvas_group (), 0, event->motion.time);
}
@ -3171,149 +3080,147 @@ Editor::region_drag_motion_callback (ArdourCanvas::Item* item, GdkEvent* event)
MOTION
************************************************************/
pair<set<boost::shared_ptr<Playlist> >::iterator,bool> insert_result;
const list<RegionView*>& layered_regions = selection->regions.by_layer();
for (list<RegionView*>::const_iterator i = layered_regions.begin(); i != layered_regions.end(); ++i) {
RegionView* rv = (*i);
double ix1, ix2, iy1, iy2;
int32_t temp_pointer_y_span = pointer_y_span;
/* get item BBox, which will be relative to parent. so we have
to query on a child, then convert to world coordinates using
the parent.
*/
rv->get_canvas_frame()->get_bounds (ix1, iy1, ix2, iy2);
rv->get_canvas_group()->i2w (ix1, iy1);
TimeAxisView* tvp2 = trackview_by_y_position (iy1);
AudioTimeAxisView* canvas_atv = dynamic_cast<AudioTimeAxisView*>(tvp2);
AudioTimeAxisView* temp_atv;
if ((pointer_y_span != 0) && !clamp_y_axis) {
y_delta = 0;
int32_t x = 0;
for (j = height_list.begin(); j!= height_list.end(); j++) {
if (x == canvas_atv->order) {
/* we found the track the region is on */
if (x != original_pointer_order) {
/*this isn't from the same track we're dragging from */
temp_pointer_y_span = canvas_pointer_y_span;
}
while (temp_pointer_y_span > 0) {
/* we're moving up canvas-wise,
so we need to find the next track height
*/
if (j != height_list.begin()) {
j--;
}
if (x != original_pointer_order) {
/* we're not from the dragged track, so ignore hidden tracks. */
if ((*j) == 0) {
temp_pointer_y_span++;
}
}
y_delta -= (*j);
temp_pointer_y_span--;
}
while (temp_pointer_y_span < 0) {
y_delta += (*j);
if (x != original_pointer_order) {
if ((*j) == 0) {
temp_pointer_y_span--;
}
}
if (j != height_list.end()) {
j++;
}
temp_pointer_y_span++;
}
/* find out where we'll be when we move and set height accordingly */
tvp2 = trackview_by_y_position (iy1 + y_delta);
temp_atv = dynamic_cast<AudioTimeAxisView*>(tvp2);
rv->set_height (temp_atv->height);
/* if you un-comment the following, the region colours will follow the track colours whilst dragging,
personally, i think this can confuse things, but never mind.
*/
//const GdkColor& col (temp_atv->view->get_region_color());
//rv->set_color (const_cast<GdkColor&>(col));
break;
}
x++;
}
}
/* prevent the regionview from being moved to before
the zero position on the canvas.
*/
/* clamp */
if (x_delta < 0) {
if (-x_delta > ix1) {
x_delta = -ix1;
}
} else if ((x_delta > 0) &&(rv->region()->last_frame() > max_frames - x_delta)) {
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();
/* freeze the playlists from notifying till
the motion is done.
*/
AudioTimeAxisView* atv = dynamic_cast<AudioTimeAxisView*> (&rv->get_time_axis_view());
if (atv && atv->is_audio_track()) {
boost::shared_ptr<AudioPlaylist> pl = boost::dynamic_pointer_cast<AudioPlaylist>(atv->get_diskstream()->playlist());
if (pl) {
/* only freeze and capture state once */
insert_result = motion_frozen_playlists.insert (pl);
if (insert_result.second) {
pl->freeze();
session->add_command(new MementoCommand<Playlist>(*pl, &pl->get_state(), 0));
}
}
}
rv->region()->set_opaque(false);
}
if (drag_info.brushing) {
mouse_brush_insert_region (rv, pending_region_position);
} else {
rv->move (x_delta, y_delta);
}
}
bool do_move;
if (drag_info.first_move) {
cursor_group->raise_to_top();
if (drag_info.move_threshold_passed) {
do_move = true;
} else {
do_move = false;
}
} else {
do_move = true;
}
drag_info.first_move = false;
if (do_move) {
pair<set<boost::shared_ptr<Playlist> >::iterator,bool> insert_result;
const list<RegionView*>& layered_regions = selection->regions.by_layer();
for (list<RegionView*>::const_iterator i = layered_regions.begin(); i != layered_regions.end(); ++i) {
RegionView* rv = (*i);
double ix1, ix2, iy1, iy2;
int32_t temp_pointer_y_span = pointer_y_span;
/* get item BBox, which will be relative to parent. so we have
to query on a child, then convert to world coordinates using
the parent.
*/
rv->get_canvas_frame()->get_bounds (ix1, iy1, ix2, iy2);
rv->get_canvas_group()->i2w (ix1, iy1);
TimeAxisView* tvp2 = trackview_by_y_position (iy1);
AudioTimeAxisView* canvas_atv = dynamic_cast<AudioTimeAxisView*>(tvp2);
AudioTimeAxisView* temp_atv;
if ((pointer_y_span != 0) && !clamp_y_axis) {
y_delta = 0;
int32_t x = 0;
for (j = height_list.begin(); j!= height_list.end(); j++) {
if (x == canvas_atv->order) {
/* we found the track the region is on */
if (x != original_pointer_order) {
/*this isn't from the same track we're dragging from */
temp_pointer_y_span = canvas_pointer_y_span;
}
while (temp_pointer_y_span > 0) {
/* we're moving up canvas-wise,
so we need to find the next track height
*/
if (j != height_list.begin()) {
j--;
}
if (x != original_pointer_order) {
/* we're not from the dragged track, so ignore hidden tracks. */
if ((*j) == 0) {
temp_pointer_y_span++;
}
}
y_delta -= (*j);
temp_pointer_y_span--;
}
while (temp_pointer_y_span < 0) {
y_delta += (*j);
if (x != original_pointer_order) {
if ((*j) == 0) {
temp_pointer_y_span--;
}
}
if (j != height_list.end()) {
j++;
}
temp_pointer_y_span++;
}
/* find out where we'll be when we move and set height accordingly */
tvp2 = trackview_by_y_position (iy1 + y_delta);
temp_atv = dynamic_cast<AudioTimeAxisView*>(tvp2);
rv->set_height (temp_atv->height);
/* if you un-comment the following, the region colours will follow the track colours whilst dragging,
personally, i think this can confuse things, but never mind.
*/
//const GdkColor& col (temp_atv->view->get_region_color());
//rv->set_color (const_cast<GdkColor&>(col));
break;
}
x++;
}
}
/* prevent the regionview from being moved to before
the zero position on the canvas.
*/
/* clamp */
if (x_delta < 0) {
if (-x_delta > ix1) {
x_delta = -ix1;
}
} else if ((x_delta > 0) &&(rv->region()->last_frame() > max_frames - x_delta)) {
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) {
mouse_brush_insert_region (rv, pending_region_position);
} else {
rv->move (x_delta, y_delta);
}
} /* foreach region */
} /* if do_move */
if (drag_info.first_move && drag_info.move_threshold_passed) {
cursor_group->raise_to_top();
drag_info.first_move = false;
}
if (x_delta != 0 && !drag_info.brushing) {
show_verbose_time_cursor (drag_info.last_frame_position, 10);
}
}
void
@ -3364,106 +3271,120 @@ Editor::region_drag_finished_callback (ArdourCanvas::Item* item, GdkEvent* event
//printf ("last_frame: %s position is %lu %g\n", rv->get_time_axis_view().name().c_str(), drag_info.last_frame_position, speed);
//printf ("last_rackview: %s \n", drag_info.last_trackview->name().c_str());
char* op_string;
if (drag_info.copy) {
if (drag_info.x_constrained) {
op_string = _("fixed time region copy");
} else {
op_string = _("region copy");
}
} else {
if (drag_info.x_constrained) {
op_string = _("fixed time region drag");
} else {
op_string = _("region drag");
}
}
begin_reversible_command (op_string);
if (regionview_y_movement) {
/* motion between tracks */
list<RegionView*> new_selection;
/* moved to a different audio track. */
vector<RegionView*> new_selection;
for (list<RegionView*>::const_iterator i = selection->regions.by_layer().begin(); i != selection->regions.by_layer().end(); ) {
RegionView* rv2 = (*i);
RegionView* rv = (*i);
/* the region that used to be in the old playlist is not
moved to the new one - we make a copy of it. as a result,
any existing editor for the region should no longer be
visible.
double ix1, ix2, iy1, iy2;
rv->get_canvas_frame()->get_bounds (ix1, iy1, ix2, iy2);
rv->get_canvas_group()->i2w (ix1, iy1);
TimeAxisView* tvp2 = trackview_by_y_position (iy1);
AudioTimeAxisView* atv2 = dynamic_cast<AudioTimeAxisView*>(tvp2);
boost::shared_ptr<Playlist> from_playlist = rv->region()->playlist();
boost::shared_ptr<Playlist> to_playlist = atv2->playlist();
where = (nframes_t) (unit_to_frame (ix1) * speed);
boost::shared_ptr<Region> new_region (RegionFactory::create (rv->region()));
/* undo the previous hide_dependent_views so that xfades don't
disappear on copying regions
*/
rv->get_time_axis_view().reveal_dependent_views (*rv);
if (!drag_info.copy) {
rv2->hide_region_editor();
/* the region that used to be in the old playlist is not
moved to the new one - we make a copy of it. as a result,
any existing editor for the region should no longer be
visible.
*/
rv->hide_region_editor();
rv->fake_set_opaque (false);
session->add_command (new MementoCommand<Playlist>(*from_playlist, &from_playlist->get_state(), 0));
from_playlist->remove_region ((rv->region()));
session->add_command (new MementoCommand<Playlist>(*from_playlist, 0, &from_playlist->get_state()));
}
new_selection.push_back (rv2);
i++;
}
/* first, freeze the target tracks */
for (list<RegionView*>::const_iterator i = new_selection.begin(); i != new_selection.end();i++ ) {
boost::shared_ptr<Playlist> from_playlist;
boost::shared_ptr<Playlist> to_playlist;
double ix1, ix2, iy1, iy2;
(*i)->get_canvas_frame()->get_bounds (ix1, iy1, ix2, iy2);
(*i)->get_canvas_group()->i2w (ix1, iy1);
TimeAxisView* tvp2 = trackview_by_y_position (iy1);
AudioTimeAxisView* atv2 = dynamic_cast<AudioTimeAxisView*>(tvp2);
(*i)->region()->set_opaque (true);
from_playlist = (*i)->region()->playlist();
to_playlist = atv2->playlist();
/* the from_playlist was frozen in the "first_move" case
of the motion handler. the insert can fail,
but that doesn't matter. it just means
we already have the playlist in the list.
*/
motion_frozen_playlists.insert (from_playlist);
/* only freeze the to_playlist once */
insert_result = motion_frozen_playlists.insert(to_playlist);
if (insert_result.second) {
to_playlist->freeze();
session->add_command(new MementoCommand<Playlist>(*to_playlist, &to_playlist->get_state(), 0));
}
}
/* now do it again with the actual operations */
for (list<RegionView*>::const_iterator i = new_selection.begin(); i != new_selection.end();i++ ) {
boost::shared_ptr<Playlist> from_playlist;
boost::shared_ptr<Playlist> to_playlist;
double ix1, ix2, iy1, iy2;
(*i)->get_canvas_frame()->get_bounds (ix1, iy1, ix2, iy2);
(*i)->get_canvas_group()->i2w (ix1, iy1);
TimeAxisView* tvp2 = trackview_by_y_position (iy1);
AudioTimeAxisView* atv2 = dynamic_cast<AudioTimeAxisView*>(tvp2);
from_playlist = (*i)->region()->playlist();
to_playlist = atv2->playlist();
latest_regionview = 0;
where = (nframes_t) (unit_to_frame (ix1) * speed);
boost::shared_ptr<Region> new_region (RegionFactory::create ((*i)->region()));
from_playlist->remove_region (((*i)->region()));
sigc::connection c = atv2->view()->RegionViewAdded.connect (mem_fun(*this, &Editor::collect_new_region_view));
session->add_command (new MementoCommand<Playlist>(*to_playlist, &to_playlist->get_state(), 0));
to_playlist->add_region (new_region, where);
session->add_command (new MementoCommand<Playlist>(*to_playlist, 0, &to_playlist->get_state()));
c.disconnect ();
if (latest_regionview) {
selection->add (latest_regionview);
new_selection.push_back (latest_regionview);
}
if (drag_info.copy) {
// get rid of the copy
delete rv;
}
/* OK, this is where it gets tricky. If the playlist was being used by >1 tracks, and the region
was selected in all of them, then removing it from the playlist will have removed all
trace of it from the selection (i.e. there were N regions selected, we removed 1,
but since its the same playlist for N tracks, all N tracks updated themselves, removed the
corresponding regionview, and the selection is now empty).
this could have invalidated any and all iterators into the region selection.
the heuristic we use here is: if the region selection is empty, break out of the loop
here. if the region selection is not empty, then restart the loop because we know that
we must have removed at least the region(view) we've just been working on as well as any
that we processed on previous iterations.
*/
if (selection->regions.empty()) {
break;
} else {
i = selection->regions.by_layer().begin();
}
}
selection->set (new_selection);
} else {
/* motion within a single track */
for (list<RegionView*>::const_iterator i = selection->regions.by_layer().begin(); i != selection->regions.by_layer().end(); ++i) {
list<RegionView*> regions = selection->regions.by_layer();
if (drag_info.copy) {
selection->clear_regions();
}
for (list<RegionView*>::iterator i = regions.begin(); i != regions.end(); ++i) {
rv = (*i);
@ -3471,9 +3392,10 @@ Editor::region_drag_finished_callback (ArdourCanvas::Item* item, GdkEvent* event
continue;
}
if (regionview_x_movement) {
double ownspeed = 1.0;
AudioTimeAxisView* atv = dynamic_cast<AudioTimeAxisView*> (&(rv->get_time_axis_view()));
atv = dynamic_cast<AudioTimeAxisView*> (&(rv->get_time_axis_view()));
if (atv && atv->get_diskstream()) {
ownspeed = atv->get_diskstream()->speed();
@ -3492,22 +3414,63 @@ Editor::region_drag_finished_callback (ArdourCanvas::Item* item, GdkEvent* event
where = rv->region()->position();
}
rv->get_time_axis_view().reveal_dependent_views (*rv);
boost::shared_ptr<Playlist> to_playlist = rv->region()->playlist();
/* no need to add an undo here, we did that when we added this playlist to motion_frozen playlists */
assert (to_playlist);
rv->region()->set_position (where, (void *) this);
rv->region()->set_opaque (true);
/* add the undo */
session->add_command (new MementoCommand<Playlist>(*to_playlist, &to_playlist->get_state(), 0));
if (drag_info.copy) {
boost::shared_ptr<Region> newregion;
boost::shared_ptr<Region> ar;
if ((ar = boost::dynamic_pointer_cast<AudioRegion>(rv->region())) != 0) {
newregion = RegionFactory::create (ar);
} else {
/* XXX MIDI HERE drobilla */
continue;
}
/* add it */
latest_regionview = 0;
sigc::connection c = atv->view()->RegionViewAdded.connect (mem_fun(*this, &Editor::collect_new_region_view));
to_playlist->add_region (newregion, (nframes_t) (where * atv->get_diskstream()->speed()));
c.disconnect ();
if (latest_regionview) {
atv->reveal_dependent_views (*latest_regionview);
selection->add (latest_regionview);
}
/* if the original region was locked, we don't care for the new one */
newregion->set_locked (false);
} else {
/* just change the model */
rv->region()->set_position (where, (void*) this);
}
/* add the redo */
session->add_command (new MementoCommand<Playlist>(*to_playlist, 0, &to_playlist->get_state()));
/* get rid of the copy */
if (drag_info.copy) {
delete rv;
}
}
}
out:
for (set<boost::shared_ptr<Playlist> >::iterator p = motion_frozen_playlists.begin(); p != motion_frozen_playlists.end(); ++p) {
(*p)->thaw ();
session->add_command (new MementoCommand<Playlist>(*((*p).get()), 0, & (*p)->get_state()));
}
motion_frozen_playlists.clear ();
if (!nocommit) {
commit_reversible_command ();
@ -3558,7 +3521,7 @@ Editor::show_verbose_time_cursor (nframes_t frame, double offset, double xpos, d
return;
}
switch (ARDOUR_UI::instance()->secondary_clock.mode ()) {
switch (Profile->get_small_screen() ? ARDOUR_UI::instance()->primary_clock.mode () : ARDOUR_UI::instance()->secondary_clock.mode ()) {
case AudioClock::BBT:
session->bbt_time (frame, bbt);
snprintf (buf, sizeof (buf), "%02" PRIu32 "|%02" PRIu32 "|%02" PRIu32, bbt.bars, bbt.beats, bbt.ticks);
@ -3983,8 +3946,6 @@ Editor::start_trim (ArdourCanvas::Item* item, GdkEvent* event)
nframes_t region_end = (nframes_t) (clicked_regionview->region()->last_frame() / speed);
nframes_t region_length = (nframes_t) (clicked_regionview->region()->length() / speed);
motion_frozen_playlists.clear();
//drag_info.item = clicked_regionview->get_name_highlight();
drag_info.item = item;
drag_info.motion_callback = &Editor::trim_motion_callback;
@ -4073,7 +4034,7 @@ Editor::trim_motion_callback (ArdourCanvas::Item* item, GdkEvent* event)
begin_reversible_command (trim_type);
for (list<RegionView*>::const_iterator i = selection->regions.by_layer().begin(); i != selection->regions.by_layer().end(); ++i) {
(*i)->region()->set_opaque(false);
(*i)->fake_set_opaque(false);
(*i)->region()->freeze ();
AudioRegionView* const arv = dynamic_cast<AudioRegionView*>(*i);
@ -4268,7 +4229,7 @@ Editor::trim_finished_callback (ArdourCanvas::Item* item, GdkEvent* event)
i != selection->regions.by_layer().end(); ++i)
{
thaw_region_after_trim (**i);
(*i)->region()->set_opaque(true);
(*i)->fake_set_opaque (true);
}
}
@ -4560,7 +4521,6 @@ Editor::end_range_markerbar_op (ArdourCanvas::Item* item, GdkEvent* event)
switch (mouse_mode) {
case MouseObject:
/* find the two markers on either side and then make the selection from it */
cerr << "select between " << start << " .. " << end << endl;
select_all_within (start, end, 0.0f, FLT_MAX, Selection::Set);
break;

View file

@ -15,7 +15,6 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
$Id$
*/
#include <cstdlib>

View file

@ -15,7 +15,6 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
$Id$
*/
#include <unistd.h>
@ -32,6 +31,7 @@
#include <gtkmm2ext/utils.h>
#include <gtkmm2ext/choice.h>
#include <gtkmm2ext/window_title.h>
#include <ardour/audioengine.h>
#include <ardour/session.h>
@ -68,6 +68,7 @@ using namespace ARDOUR;
using namespace PBD;
using namespace sigc;
using namespace Gtk;
using namespace Gtkmm2ext;
using namespace Editing;
/***********************************************************************
@ -499,15 +500,6 @@ Editor::build_region_boundary_cache ()
break;
}
} else if (clicked_trackview) {
TrackViewList t;
t.push_back (clicked_trackview);
if ((r = find_next_region (pos, point, 1, t, &ontrack)) == 0) {
break;
}
} else {
if ((r = find_next_region (pos, point, 1, track_views, &ontrack)) == 0) {
@ -1507,19 +1499,13 @@ Editor::insert_region_list_drag (boost::shared_ptr<AudioRegion> region, int x, i
return;
}
cerr << "drop target playlist, UC = " << playlist.use_count() << endl;
snap_to (where);
begin_reversible_command (_("insert dragged region"));
XMLNode &before = playlist->get_state();
cerr << "pre add target playlist, UC = " << playlist.use_count() << endl;
playlist->add_region (RegionFactory::create (region), where, 1.0);
cerr << "post add target playlist, UC = " << playlist.use_count() << endl;
session->add_command(new MementoCommand<Playlist>(*playlist, &before, &playlist->get_state()));
commit_reversible_command ();
cerr << "post drop target playlist, UC = " << playlist.use_count() << endl;
}
void
@ -1764,7 +1750,10 @@ Editor::rename_region ()
return;
}
dialog.set_title (_("ardour: rename region"));
WindowTitle title(Glib::get_application_name());
title += _("Rename Region");
dialog.set_title (title.get_string());
dialog.set_name ("RegionRenameWindow");
dialog.set_size_request (300, -1);
dialog.set_position (Gtk::WIN_POS_MOUSE);
@ -1996,6 +1985,12 @@ Editor::separate_region_from_selection ()
if (atv->is_audio_track()) {
/* no edits to destructive tracks */
if (atv->audio_track()->audio_diskstream()->destructive()) {
continue;
}
if ((playlist = atv->playlist()) != 0) {
if (!doing_undo) {
begin_reversible_command (_("separate"));
@ -2048,6 +2043,12 @@ Editor::separate_regions_using_location (Location& loc)
if (atv->is_audio_track()) {
/* no edits to destructive tracks */
if (atv->audio_track()->audio_diskstream()->destructive()) {
continue;
}
if ((playlist = atv->playlist()) != 0) {
XMLNode *before;
if (!doing_undo) {
@ -2077,75 +2078,76 @@ Editor::separate_regions_using_location (Location& loc)
void
Editor::crop_region_to_selection ()
{
if (selection->time.empty()) {
if (selection->time.empty() || selection->tracks.empty()) {
return;
}
vector<boost::shared_ptr<Playlist> > playlists;
boost::shared_ptr<Playlist> playlist;
if (clicked_trackview != 0) {
sort_track_selection ();
if ((playlist = clicked_trackview->playlist()) == 0) {
return;
}
for (TrackSelection::iterator i = selection->tracks.begin(); i != selection->tracks.end(); ++i) {
playlists.push_back (playlist);
AudioTimeAxisView* atv;
} else {
if ((atv = dynamic_cast<AudioTimeAxisView*> ((*i))) != 0) {
sort_track_selection ();
if (atv->is_audio_track()) {
for (TrackSelection::iterator i = selection->tracks.begin(); i != selection->tracks.end(); ++i) {
/* no edits to destructive tracks */
AudioTimeAxisView* atv;
if (atv->audio_track()->audio_diskstream()->destructive()) {
continue;
}
if ((atv = dynamic_cast<AudioTimeAxisView*> ((*i))) != 0) {
if (atv->is_audio_track()) {
if ((playlist = atv->playlist()) != 0) {
playlists.push_back (playlist);
}
if ((playlist = atv->playlist()) != 0) {
playlists.push_back (playlist);
}
}
}
}
if (!playlists.empty()) {
if (playlists.empty()) {
return;
}
nframes_t start;
nframes_t end;
nframes_t cnt;
nframes_t start;
nframes_t end;
nframes_t cnt;
begin_reversible_command (_("trim to selection"));
begin_reversible_command (_("trim to selection"));
for (vector<boost::shared_ptr<Playlist> >::iterator i = playlists.begin(); i != playlists.end(); ++i) {
for (vector<boost::shared_ptr<Playlist> >::iterator i = playlists.begin(); i != playlists.end(); ++i) {
boost::shared_ptr<Region> region;
boost::shared_ptr<Region> region;
start = selection->time.start();
start = selection->time.start();
if ((region = (*i)->top_region_at(start)) == 0) {
continue;
}
/* now adjust lengths to that we do the right thing
if the selection extends beyond the region
*/
start = max (start, region->position());
end = min (selection->time.end_frame(), start + region->length() - 1);
cnt = end - start + 1;
XMLNode &before = (*i)->get_state();
region->trim_to (start, cnt, this);
XMLNode &after = (*i)->get_state();
session->add_command (new MementoCommand<Playlist>(*(*i), &before, &after));
if ((region = (*i)->top_region_at(start)) == 0) {
continue;
}
commit_reversible_command ();
/* now adjust lengths to that we do the right thing
if the selection extends beyond the region
*/
start = max (start, region->position());
if (max_frames - start < region->length()) {
end = start + region->length() - 1;
} else {
end = max_frames;
}
end = min (selection->time.end_frame(), end);
cnt = end - start + 1;
XMLNode &before = (*i)->get_state();
region->trim_to (start, cnt, this);
XMLNode &after = (*i)->get_state();
session->add_command (new MementoCommand<Playlist>(*(*i), &before, &after));
}
commit_reversible_command ();
}
void
@ -2528,7 +2530,9 @@ Editor::freeze_route ()
build_interthread_progress_window ();
}
interthread_progress_window->set_title (_("ardour: freeze"));
WindowTitle title(Glib::get_application_name());
title += _("Freeze");
interthread_progress_window->set_title (title.get_string());
interthread_progress_window->set_position (Gtk::WIN_POS_MOUSE);
interthread_progress_window->show_all ();
interthread_progress_bar.set_fraction (0.0f);
@ -2570,7 +2574,7 @@ Editor::bounce_range_selection ()
return;
}
TrackViewList *views = get_valid_views (selection->time.track, selection->time.group);
TrackSelection views = selection->tracks;
nframes_t start = selection->time[clicked_selection].start;
nframes_t end = selection->time[clicked_selection].end;
@ -2578,7 +2582,7 @@ Editor::bounce_range_selection ()
begin_reversible_command (_("bounce range"));
for (TrackViewList::iterator i = views->begin(); i != views->end(); ++i) {
for (TrackViewList::iterator i = views.begin(); i != views.end(); ++i) {
AudioTimeAxisView* atv;
@ -2605,8 +2609,6 @@ Editor::bounce_range_selection ()
}
commit_reversible_command ();
delete views;
}
void
@ -2807,19 +2809,22 @@ Editor::cut_copy_regions (CutCopyOp op)
}
boost::shared_ptr<AudioRegion> ar = boost::dynamic_pointer_cast<AudioRegion>((*x)->region());
boost::shared_ptr<Region> _xx;
switch (op) {
case Cut:
if (!ar) break;
npl->add_region (RegionFactory::create (ar), (*x)->region()->position() - first_position);
_xx = RegionFactory::create ((*x)->region());
npl->add_region (_xx, (*x)->region()->position() - first_position);
pl->remove_region (((*x)->region()));
break;
case Copy:
if (!ar) break;
npl->add_region (RegionFactory::create (ar), (*x)->region()->position() - first_position);
/* copy region before adding, so we're not putting same object into two different playlists */
npl->add_region (RegionFactory::create ((*x)->region()), (*x)->region()->position() - first_position);
break;
case Clear:
@ -2839,6 +2844,7 @@ Editor::cut_copy_regions (CutCopyOp op)
foo.push_back ((*i).pl);
}
if (!foo.empty()) {
cut_buffer->set (foo);
}

View file

@ -15,24 +15,26 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
$Id$
*/
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <string>
#include <sstream>
#include <pbd/basename.h>
#include <ardour/audioregion.h>
#include <ardour/audiofilesource.h>
#include <ardour/silentfilesource.h>
#include <ardour/session_region.h>
#include <gtkmm2ext/stop_signal.h>
#include "editor.h"
#include "editing.h"
#include "keyboard.h"
#include "ardour_ui.h"
#include "gui_thread.h"
#include "actions.h"
@ -85,6 +87,9 @@ Editor::add_audio_region_to_region_display (boost::shared_ptr<AudioRegion> regio
string str;
TreeModel::Row row;
Gdk::Color c;
bool missing_source;
missing_source = boost::dynamic_pointer_cast<SilentFileSource>(region->source());
if (!show_automatic_regions_in_region_list && region->automatic()) {
return;
@ -124,18 +129,23 @@ Editor::add_audio_region_to_region_display (boost::shared_ptr<AudioRegion> regio
} else if (region->whole_file()) {
row = *(region_list_model->append());
set_color(c, rgba_from_style ("RegionListWholeFile", 0xff, 0, 0, 0, "fg", Gtk::STATE_NORMAL, false ));
if (missing_source) {
c.set_rgb(65535,0,0); // FIXME: error color from style
} else {
set_color(c, rgba_from_style ("RegionListWholeFile", 0xff, 0, 0, 0, "fg", Gtk::STATE_NORMAL, false ));
}
row[region_list_columns.color_] = c;
if (region->source()->name()[0] == '/') { // external file
if (region->whole_file()) {
str = ".../";
boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(region->source());
str = ".../";
if (afs) {
str += region_name_from_path (afs->path(), region->n_channels() > 1);
str = region_name_from_path (afs->path(), region->n_channels() > 1);
} else {
str += region->source()->name();
}
@ -150,6 +160,18 @@ Editor::add_audio_region_to_region_display (boost::shared_ptr<AudioRegion> regio
}
if (region->n_channels() > 1) {
std::stringstream foo;
foo << region->n_channels ();
str += " [";
str += foo.str();
str += ']';
}
if (missing_source) {
str += _(" (MISSING)");
}
row[region_list_columns.name] = str;
row[region_list_columns.region] = region;

View file

@ -15,7 +15,6 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
$Id$
*/
#include <algorithm>
@ -23,10 +22,12 @@
#include <cmath>
#include "editor.h"
#include "keyboard.h"
#include "ardour_ui.h"
#include "audio_time_axis.h"
#include "mixer_strip.h"
#include "gui_thread.h"
#include "actions.h"
#include <ardour/route.h>
#include <ardour/audio_track.h>
@ -52,7 +53,7 @@ Editor::handle_new_route (Session::RouteList& routes)
boost::shared_ptr<Route> route = (*x);
if (route->hidden()) {
return;
continue;
}
tv = new AudioTimeAxisView (*this, *session, route, track_canvas);
@ -148,9 +149,10 @@ Editor::remove_route (TimeAxisView *tv)
}
}
/* since the editor mixer goes away when you remove a route, set the
* button to inacttive
* button to inactive and untick the menu option
*/
editor_mixer_button.set_active(false);
ActionManager::uncheck_toggleaction ("<Actions>/Editor/show-editor-mixer");
/* and disable if all tracks and/or routes are gone */
@ -257,7 +259,6 @@ Editor::redisplay_route_list ()
if (visible) {
tv->set_marked_for_display (true);
position += tv->show_at (position, n, &edit_controls_vbox);
position += track_spacing;
} else {
tv->hide ();
}
@ -266,6 +267,8 @@ Editor::redisplay_route_list ()
}
full_canvas_height = position;
/* make sure the cursors stay on top of every newly added track */
cursor_group->raise_to_top ();
@ -509,11 +512,13 @@ Editor::initial_route_list_display ()
void
Editor::route_list_change (const Gtk::TreeModel::Path& path,const Gtk::TreeModel::iterator& iter)
{
session->set_remote_control_ids();
redisplay_route_list ();
}
void
Editor::route_list_delete (const Gtk::TreeModel::Path& path)
{
session->set_remote_control_ids();
redisplay_route_list ();
}

View file

@ -15,7 +15,6 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
$Id$
*/
#include <cstdio> // for sprintf, grrr
@ -56,6 +55,10 @@ Editor::initialize_rulers ()
ruler_editor = this;
ruler_grabbed_widget = 0;
_ruler_separator = new Gtk::HSeparator();
_ruler_separator->set_size_request(-1, 2);
_ruler_separator->show();
_smpte_ruler = gtk_custom_hruler_new ();
smpte_ruler = Glib::wrap (_smpte_ruler);
smpte_ruler->set_name ("SMPTERuler");
@ -148,6 +151,11 @@ Editor::ruler_button_press (GdkEventButton* ev)
switch (ev->button) {
case 1:
// Since we are about to move the playhead, cancel any running
// auditions.
if (session->is_auditioning()) {
session->cancel_audition ();
}
/* transport playhead */
snap_to (where);
session->request_locate (where);
@ -252,12 +260,12 @@ Editor::ruler_mouse_motion (GdkEventMotion* ev)
/* need to use the correct x,y, the event lies */
time_canvas_event_box.get_window()->get_pointer (x, y, state);
time_canvas.c2w (x, y, wcx, wcy);
time_canvas.w2c (wcx, wcy, cx, cy);
track_canvas.c2w (x, y, wcx, wcy);
track_canvas.w2c (wcx, wcy, cx, cy);
nframes_t where = leftmost_frame + pixel_to_frame (x);
wcx = x;
nframes_t where = event_frame ((GdkEvent*) ev, &wcx, (double *) 0);
cx = wcx;
/// ripped from maybe_autoscroll, and adapted to work here
nframes_t one_page = (nframes_t) rint (canvas_width * frames_per_unit);
@ -299,8 +307,7 @@ Editor::ruler_mouse_motion (GdkEventMotion* ev)
break;
}
if (cursor)
{
if (cursor) {
cursor->set_position (where);
if (cursor == edit_cursor) {
@ -373,7 +380,7 @@ Editor::popup_ruler_menu (nframes_t where, ItemType t)
mitem->set_active(true);
}
ruler_items.push_back (CheckMenuElem (X_("Timecode"), bind (mem_fun(*this, &Editor::ruler_toggled), (int)ruler_metric_smpte)));
ruler_items.push_back (CheckMenuElem (_("Timecode"), bind (mem_fun(*this, &Editor::ruler_toggled), (int)ruler_metric_smpte)));
mitem = (CheckMenuItem *) &ruler_items.back();
if (ruler_shown[ruler_metric_smpte]) {
mitem->set_active(true);
@ -601,6 +608,7 @@ Editor::update_ruler_visibility ()
frames_ruler->signal_motion_notify_event().connect (mem_fun(*this, &Editor::ruler_mouse_motion));
minsec_ruler->signal_motion_notify_event().connect (mem_fun(*this, &Editor::ruler_mouse_motion));
ruler_children.insert (canvaspos, Element(*_ruler_separator, PACK_SHRINK, PACK_START));
if (ruler_shown[ruler_metric_minsec]) {
lab_children.push_back (Element(minsec_label, PACK_SHRINK, PACK_START));
@ -626,7 +634,7 @@ Editor::update_ruler_visibility ()
visible_timebars++;
}
double tbpos = 0.0;
double tbpos = 1.0;
double old_unit_pos ;
if (ruler_shown[ruler_time_meter]) {
@ -705,10 +713,10 @@ Editor::update_ruler_visibility ()
update_fixed_rulers();
//update_tempo_based_rulers();
tempo_map_changed(Change (0), false);
redisplay_tempo (false);
time_canvas_event_box.show_all();
time_button_event_box.show_all();
time_button_frame.show_all();
}
void

View file

@ -15,7 +15,6 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
$Id: editor.cc 1353 2007-01-18 03:06:15Z paul $
*/
#include <pbd/stacktrace.h>
@ -154,6 +153,11 @@ Editor::extend_selection_to_track (TimeAxisView& view)
return false;
}
void
Editor::select_all_tracks ()
{
selection->set (track_views);
}
bool
Editor::set_selected_track (TimeAxisView& view, Selection::Operation op, bool no_remove)
@ -772,7 +776,7 @@ Editor::select_all_within (nframes_t start, nframes_t end, double top, double bo
list<Selectable*>::size_type n = 0;
TrackViewList touched_tracks;
for (TrackViewList::iterator iter = track_views.begin(); iter != track_views.end(); ++iter) {
for (TrackViewList::iterator iter = selection->tracks.begin(); iter != selection->tracks.end(); ++iter) {
if ((*iter)->hidden()) {
continue;
}
@ -786,7 +790,12 @@ Editor::select_all_within (nframes_t start, nframes_t end, double top, double bo
}
}
if (touched.empty()) {
return false;
}
if (!touched_tracks.empty()) {
switch (op) {
case Selection::Add:
selection->add (touched_tracks);
@ -820,6 +829,7 @@ Editor::select_all_within (nframes_t start, nframes_t end, double top, double bo
}
commit_reversible_command ();
return !touched.empty();
}

View file

@ -15,7 +15,6 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
$Id$
*/
#include <cstdlib>
@ -31,6 +30,7 @@
#include <gtkmm2ext/stop_signal.h>
#include "editor.h"
#include "keyboard.h"
#include "selection.h"
#include "time_axis_view.h"
#include "ardour_ui.h"

View file

@ -15,7 +15,6 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
$Id$
*/
#include <cstdio> // for sprintf, grrr
@ -94,13 +93,28 @@ Editor::draw_metric_marks (const Metrics& metrics)
}
void
Editor::tempo_map_changed (Change ignored, bool immediate_redraw)
Editor::tempo_map_changed (Change ignored)
{
if (!session) {
return;
}
ENSURE_GUI_THREAD(bind (mem_fun (*this, &Editor::tempo_map_changed), ignored, immediate_redraw));
ENSURE_GUI_THREAD(bind (mem_fun (*this, &Editor::tempo_map_changed), ignored));
redisplay_tempo (false); // redraw rulers and measures
session->tempo_map().apply_with_metrics (*this, &Editor::draw_metric_marks); // redraw metric markers
}
/**
* This code was originally in tempo_map_changed, but this is called every time the canvas scrolls horizontally.
* That's why this is moved in here. The new tempo_map_changed is called when the ARDOUR::TempoMap actually changed.
*/
void
Editor::redisplay_tempo (bool immediate_redraw)
{
if (!session) {
return;
}
BBT_Time previous_beat, next_beat; // the beats previous to the leftmost frame and after the rightmost frame
@ -153,11 +167,6 @@ Editor::tempo_map_changed (Change ignored, bool immediate_redraw)
}
}
void
Editor::redisplay_tempo ()
{
}
void
Editor::hide_measures ()
{
@ -308,8 +317,6 @@ Editor::mouse_add_new_tempo_event (nframes_t frame)
commit_reversible_command ();
map.dump (cerr);
session->tempo_map().apply_with_metrics (*this, &Editor::draw_metric_marks);
}
void
@ -350,8 +357,6 @@ Editor::mouse_add_new_meter_event (nframes_t frame)
commit_reversible_command ();
map.dump (cerr);
session->tempo_map().apply_with_metrics (*this, &Editor::draw_metric_marks);
}
void
@ -402,8 +407,6 @@ Editor::edit_meter_section (MeterSection* section)
XMLNode &after = session->tempo_map().get_state();
session->add_command(new MementoCommand<TempoMap>(session->tempo_map(), &before, &after));
commit_reversible_command ();
session->tempo_map().apply_with_metrics (*this, &Editor::draw_metric_marks);
}
void
@ -434,8 +437,6 @@ Editor::edit_tempo_section (TempoSection* section)
XMLNode &after = session->tempo_map().get_state();
session->add_command (new MementoCommand<TempoMap>(session->tempo_map(), &before, &after));
commit_reversible_command ();
session->tempo_map().apply_with_metrics (*this, &Editor::draw_metric_marks);
}
void
@ -486,8 +487,6 @@ Editor::real_remove_tempo_marker (TempoSection *section)
session->add_command(new MementoCommand<TempoMap>(session->tempo_map(), &before, &after));
commit_reversible_command ();
session->tempo_map().apply_with_metrics (*this, &Editor::draw_metric_marks);
return FALSE;
}
@ -522,7 +521,5 @@ Editor::real_remove_meter_marker (MeterSection *section)
session->add_command(new MementoCommand<TempoMap>(session->tempo_map(), &before, &after));
commit_reversible_command ();
session->tempo_map().apply_with_metrics (*this, &Editor::draw_metric_marks);
return FALSE;
}

View file

@ -15,7 +15,6 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
$Id$
*/
#include <cstdlib>
@ -27,6 +26,8 @@
#include <pbd/pthread_utils.h>
#include <pbd/memento_command.h>
#include <gtkmm2ext/window_title.h>
#include "editor.h"
#include "audio_time_axis.h"
#include "audio_region_view.h"
@ -45,6 +46,7 @@ using namespace ARDOUR;
using namespace PBD;
using namespace sigc;
using namespace Gtk;
using namespace Gtkmm2ext;
Editor::TimeStretchDialog::TimeStretchDialog (Editor& e)
: ArdourDialog ("time stretch dialog"),
@ -54,9 +56,12 @@ Editor::TimeStretchDialog::TimeStretchDialog (Editor& e)
{
set_modal (true);
set_position (Gtk::WIN_POS_MOUSE);
set_title (_("ardour: timestretch"));
set_name (N_("TimeStretchDialog"));
WindowTitle title(Glib::get_application_name());
title += _("Timestretch");
set_title(title.get_string());
get_vbox()->set_spacing (5);
get_vbox()->set_border_width (5);
get_vbox()->pack_start (upper_button_box);

View file

@ -15,7 +15,6 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
$Id$
*/
@ -30,6 +29,8 @@
#include <pbd/xml++.h>
#include <gtkmm2ext/utils.h>
#include <gtkmm2ext/window_title.h>
#include <ardour/export.h>
#include <ardour/sndfile_helpers.h>
#include <ardour/audio_track.h>
@ -52,6 +53,7 @@ using namespace ARDOUR;
using namespace PBD;
using namespace sigc;
using namespace Gtk;
using namespace Gtkmm2ext;
static const gchar *sample_rates[] = {
N_("22.05kHz"),
@ -107,7 +109,6 @@ ExportDialog::ExportDialog(PublicEditor& e)
src_quality_label (_("Conversion Quality"), 1.0, 0.5),
dither_type_label (_("Dither Type"), 1.0, 0.5),
cuefile_only_checkbox (_("Export CD Marker File Only")),
file_frame (_("Export to File")),
file_browse_button (_("Browse")),
track_selector_button (_("Specific tracks ..."))
{
@ -120,7 +121,10 @@ ExportDialog::ExportDialog(PublicEditor& e)
channel_count_selection_allowed = true;
export_cd_markers_allowed = true;
set_title (_("ardour: export"));
WindowTitle title(Glib::get_application_name());
title += _("Export");
set_title (title.get_string());
set_wmclass (X_("ardour_export"), "Ardour");
set_name ("ExportWindow");
add_events (Gdk::KEY_PRESS_MASK|Gdk::KEY_RELEASE_MASK);
@ -569,7 +573,7 @@ ExportDialog::save_state()
row = *ri;
track->add_property(X_("channel1"), row[exp_cols.left] ? X_("on") : X_("off"));
track->add_property(X_("channel1"), row[exp_cols.right] ? X_("on") : X_("off"));
track->add_property(X_("channel2"), row[exp_cols.right] ? X_("on") : X_("off"));
tracks->add_child_nocopy(*track);
}
@ -918,7 +922,6 @@ ExportDialog::do_export ()
void
ExportDialog::end_dialog ()
{
if (spec.running) {
spec.stop = true;
@ -931,7 +934,7 @@ ExportDialog::end_dialog ()
}
}
session->engine().freewheel (false);
session->finalize_audio_export ();
hide_all ();
@ -947,12 +950,12 @@ ExportDialog::start_export ()
}
/* If the filename hasn't been set before, use the
directory above the current session as a default
current session's export directory as a default
location for the export.
*/
if (file_entry.get_text().length() == 0) {
string dir = session->path();
string dir = session->export_dir();
string::size_type last_slash;
if ((last_slash = dir.find_last_of ('/')) != string::npos && last_slash != 0) {
@ -1306,7 +1309,7 @@ ExportDialog::window_closed (GdkEventAny *ignored)
void
ExportDialog::browse ()
{
FileChooserDialog dialog("Export to file", FILE_CHOOSER_ACTION_SAVE);
FileChooserDialog dialog("Export to file", browse_action());
dialog.set_transient_for(*this);
dialog.set_filename (file_entry.get_text());

View file

@ -29,6 +29,7 @@
#include <gtkmm/progressbar.h>
#include <gtkmm/scrolledwindow.h>
#include <gtkmm/fileselection.h>
#include <gtkmm/filechooser.h>
#include <gtkmm/comboboxtext.h>
#include <gtkmm/treeview.h>
#include <gtkmm/liststore.h>
@ -56,8 +57,11 @@ class ExportDialog : public ArdourDialog
virtual void set_range (nframes_t start, nframes_t end);
void start_export ();
virtual Gtk::FileChooserAction browse_action() const { return Gtk::FILE_CHOOSER_ACTION_SAVE; }
protected:
ARDOUR::AudioExportSpecification spec;
Gtk::Frame file_frame;
struct ExportModelColumns : public Gtk::TreeModel::ColumnRecord
{
@ -140,7 +144,6 @@ class ExportDialog : public ArdourDialog
Gtk::CheckButton cuefile_only_checkbox;
Gtk::Frame file_frame;
Gtk::Entry file_entry;
Gtk::HBox file_hbox;
Gtk::Button file_browse_button;

View file

@ -38,12 +38,20 @@ using namespace std;
ExportRangeMarkersDialog::ExportRangeMarkersDialog (PublicEditor& editor)
: ExportDialog(editor)
{
set_title (_("ardour: export ranges"));
file_frame.set_label (_("Export to Directory"));
do_not_allow_export_cd_markers();
total_duration = 0;
current_range_marker_index = 0;
}
Gtk::FileChooserAction
ExportRangeMarkersDialog::browse_action () const
{
return Gtk::FILE_CHOOSER_ACTION_CREATE_FOLDER;
}
void
ExportRangeMarkersDialog::export_audio_data ()
@ -82,7 +90,8 @@ ExportRangeMarkersDialog::process_range_markers_export(Locations::LocationList&
// wait until export of this range finished
gtk_main_iteration();
while(spec.running){
while (spec.running){
if(gtk_events_pending()){
gtk_main_iteration();
}else {
@ -171,13 +180,11 @@ ExportRangeMarkersDialog::init_progress_computing(Locations::LocationList& locat
Location *currentLocation = (*locationIter);
if(currentLocation->is_range_marker()){
range_markers_durations_aggregated.push_back(
duration_before_current_location);
range_markers_durations_aggregated.push_back (duration_before_current_location);
nframes_t duration =
currentLocation->end() - currentLocation->start();
nframes_t duration = currentLocation->end() - currentLocation->start();
range_markers_durations.push_back(duration);
range_markers_durations.push_back (duration);
duration_before_current_location += duration;
}
}
@ -191,13 +198,11 @@ ExportRangeMarkersDialog::progress_timeout ()
{
double progress = 0.0;
if(current_range_marker_index >= range_markers_durations.size()){
if (current_range_marker_index >= range_markers_durations.size()){
progress = 1.0;
}
else{
progress =
((double) range_markers_durations_aggregated[current_range_marker_index] +
(spec.progress * (double) range_markers_durations[current_range_marker_index])) /
} else{
progress = ((double) range_markers_durations_aggregated[current_range_marker_index] +
(spec.progress * (double) range_markers_durations[current_range_marker_index])) /
(double) total_duration;
}

View file

@ -30,6 +30,8 @@ class ExportRangeMarkersDialog : public ExportDialog
public:
ExportRangeMarkersDialog (PublicEditor&);
Gtk::FileChooserAction browse_action() const;
protected:
virtual bool is_filepath_valid(string &filepath);

View file

@ -31,6 +31,9 @@
ExportRegionDialog::ExportRegionDialog (PublicEditor& editor, boost::shared_ptr<ARDOUR::Region> region)
: ExportDialog(editor)
{
set_title (_("ardour: export region"));
file_frame.set_label (_("Export to File")),
audio_region = boost::dynamic_pointer_cast<ARDOUR::AudioRegion>(region);
assert(audio_region);

View file

@ -21,13 +21,14 @@
#include "ardour_ui.h"
#include "export_session_dialog.h"
#include "i18n.h"
ExportSessionDialog::ExportSessionDialog (PublicEditor& editor)
: ExportDialog(editor)
{
file_frame.set_label (_("Export to File"));
}
void
ExportSessionDialog::export_audio_data ()
{

View file

@ -15,7 +15,6 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
$Id$
*/
#include <ardour/curve.h>

View file

@ -15,7 +15,6 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
$Id$
*/
#include <limits.h>
@ -106,11 +105,11 @@ GainMeter::GainMeter (boost::shared_ptr<IO> io, Session& s)
gain_display_box.pack_start (gain_display, true, true);
peak_display.set_name ("MixerStripPeakDisplay");
peak_display.set_has_frame (false);
peak_display.set_editable (false);
// peak_display.set_has_frame (false);
// peak_display.set_editable (false);
set_size_request_to_display_given_text (peak_display, "-80.g", 2, 6); /* note the descender */
max_peak = minus_infinity();
peak_display.set_text (_("-inf"));
peak_display.set_label (_("-inf"));
peak_display.unset_flags (Gtk::CAN_FOCUS);
meter_metric_area.set_name ("MeterMetricsStrip");
@ -157,7 +156,7 @@ GainMeter::GainMeter (boost::shared_ptr<IO> io, Session& s)
using namespace Menu_Helpers;
gain_astate_menu.items().push_back (MenuElem (_("Off"),
gain_astate_menu.items().push_back (MenuElem (_("Manual"),
bind (mem_fun (*_io, &IO::set_gain_automation_state), (AutoState) Off)));
gain_astate_menu.items().push_back (MenuElem (_("Play"),
bind (mem_fun (*_io, &IO::set_gain_automation_state), (AutoState) Play)));
@ -227,11 +226,11 @@ GainMeter::render_metrics (Gtk::Widget& w)
Glib::RefPtr<Gdk::Window> win (w.get_window());
Glib::RefPtr<Gdk::GC> fg_gc (w.get_style()->get_fg_gc (Gtk::STATE_NORMAL));
Glib::RefPtr<Gdk::GC> bg_gc (w.get_style()->get_bg_gc (Gtk::STATE_NORMAL));
gint x, y, width, height, depth;
gint width, height;
int db_points[] = { -50, -40, -20, -30, -10, -3, 0, 4 };
char buf[32];
win->get_geometry (x, y, width, height, depth);
win->get_size (width, height);
Glib::RefPtr<Gdk::Pixmap> pixmap = Gdk::Pixmap::create (win, width, height);
@ -270,9 +269,9 @@ GainMeter::meter_metrics_expose (GdkEventExpose *ev)
Glib::RefPtr<Gdk::GC> bg_gc (meter_metric_area.get_style()->get_bg_gc (Gtk::STATE_NORMAL));
GdkRectangle base_rect;
GdkRectangle draw_rect;
gint x, y, width, height, depth;
gint width, height;
win->get_geometry (x, y, width, height, depth);
win->get_size (width, height);
base_rect.width = width;
base_rect.height = height;
@ -320,7 +319,7 @@ GainMeter::update_meters ()
if ((*i).packed) {
peak = _io->peak_input_power (n);
(*i).meter->set (log_meter (peak), peak);
(*i).meter->set (log_meter (peak));
mpeak = _io->max_peak_power(n);
@ -328,10 +327,10 @@ GainMeter::update_meters ()
max_peak = mpeak;
/* set peak display */
if (max_peak <= -200.0f) {
peak_display.set_text (_("-inf"));
peak_display.set_label (_("-inf"));
} else {
snprintf (buf, sizeof(buf), "%.1f", max_peak);
peak_display.set_text (buf);
peak_display.set_label (buf);
}
if (max_peak >= 0.0f) {
@ -448,6 +447,13 @@ GainMeter::setup_meters ()
}
}
int
GainMeter::get_gm_width ()
{
Gtk::Requisition sz = hbox.size_request ();
return sz.width;
}
bool
GainMeter::gain_key_press (GdkEventKey* ev)
{
@ -487,7 +493,7 @@ GainMeter::reset_peak_display ()
}
max_peak = -INFINITY;
peak_display.set_text (_("-Inf"));
peak_display.set_label (_("-Inf"));
peak_display.set_name ("MixerStripPeakDisplay");
}
@ -509,7 +515,7 @@ GainMeter::meter_button_release (GdkEventButton* ev, uint32_t which)
case 1:
meters[which].meter->clear();
max_peak = minus_infinity();
peak_display.set_text (_("-inf"));
peak_display.set_label (_("-inf"));
peak_display.set_name ("MixerStripPeakDisplay");
break;
@ -838,7 +844,7 @@ GainMeter::_astate_string (AutoState state, bool shrt)
switch (state) {
case Off:
sstr = (shrt ? "O" : _("O"));
sstr = (shrt ? "M" : _("M"));
break;
case Play:
sstr = (shrt ? "P" : _("P"));

View file

@ -15,7 +15,6 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
$Id$
*/
#ifndef __ardour_gtk_gain_meter_h__
@ -70,6 +69,8 @@ class GainMeter : public Gtk::VBox
void set_width (Width);
void setup_meters ();
int get_gm_width ();
void set_meter_strip_name (const char * name);
void set_fader_name (const char * name);
@ -85,7 +86,7 @@ class GainMeter : public Gtk::VBox
Gtkmm2ext::VSliderController *gain_slider;
Gtk::Adjustment gain_adjustment;
Gtkmm2ext::FocusEntry gain_display;
Gtk::Entry peak_display;
Gtk::Button peak_display;
Gtk::HBox gain_display_box;
Gtk::HBox fader_box;
Gtk::DrawingArea meter_metric_area;

View file

@ -69,3 +69,13 @@ GhostRegion::set_height ()
}
}
void
GhostRegion::set_colors ()
{
for (uint32_t n=0; n < waves.size(); ++n) {
waves[n]->property_wave_color() = color_map[cGhostTrackWave];
waves[n]->property_clip_color() = color_map[cGhostTrackWaveClip];
waves[n]->property_zero_color() = color_map[cGhostTrackZeroLine];
}
}

View file

@ -15,7 +15,6 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
$Id$
*/
#ifndef __ardour_gtk_ghost_region_h__
@ -42,6 +41,7 @@ struct GhostRegion : public sigc::trackable
void set_samples_per_unit (double spu);
void set_duration (double units);
void set_height ();
void set_colors ();
sigc::signal<void,GhostRegion*> GoingAway;
};

Binary file not shown.

After

Width:  |  Height:  |  Size: 693 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 667 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 686 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 723 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 730 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 692 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 720 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 831 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 737 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 770 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 798 B

Some files were not shown because too many files have changed in this diff Show more